--- a/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
589f4fdc584e373a47cde0162e9eceec9165c381 jdk8-b105
514b0b69fb9683ef52062fd962a3e0644431f64d jdk8-b106
892889f445755790ae90e61775bfb59ddc6182b5 jdk8-b107
+74049f7a28b48c14910106a75d9f2504169c352e jdk8-b108
+af9a674e12a16da1a4bd53e4990ddb1121a21ef1 jdk8-b109
+b5d2bf482a3ea1cca08c994512804ffbc73de0a1 jdk8-b110
--- a/.hgtags-top-repo Sat Sep 14 20:43:34 2013 +0100
+++ b/.hgtags-top-repo Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
5166118c59178b5d31001bc4058e92486ee07d9b jdk8-b105
8e7b4d9fb00fdf1334376aeac050c9bca6d1b383 jdk8-b106
0874bb4707b723d5bb108d379c557cf41529d1a7 jdk8-b107
+9286a6e61291246d88af713f1ef79adeea30fe2e jdk8-b108
+91f47e8da5c60de58ed195e9b57f3bf192a18f83 jdk8-b109
+4faa09c7fe555de086dd9048d3c5cc92317d6f45 jdk8-b110
--- a/NewMakefile.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/NewMakefile.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -66,7 +66,7 @@
else
# We are building multiple configurations.
# First, find out the valid targets
- # Run the makefile with an arbitraty SPEC using -p -q (quiet dry-run and dump rules) to find
+ # Run the makefile with an arbitrary SPEC using -p -q (quiet dry-run and dump rules) to find
# available PHONY targets. Use this list as valid targets to pass on to the repeated calls.
all_phony_targets=$(filter-out $(global_targets) bundles-only, $(strip $(shell \
$(MAKE) -p -q -f common/makefiles/Main.gmk FRC SPEC=$(firstword $(SPEC)) | \
--- a/common/autoconf/generated-configure.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/common/autoconf/generated-configure.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1016,8 +1016,8 @@
enable_unlimited_crypto
with_milestone
with_update_version
+with_user_release_suffix
with_build_number
-with_user_release_suffix
with_boot_jdk
with_boot_jdk_jvmargs
with_add_source_root
@@ -1755,10 +1755,10 @@
--with-cacerts-file specify alternative cacerts file
--with-milestone Set milestone value for build [internal]
--with-update-version Set update version value for build [b00]
- --with-build-number Set build number value for build [b00]
--with-user-release-suffix
Add a custom string to the version string if build
number isn't set.[username_builddateb00]
+ --with-build-number Set build number value for build [b00]
--with-boot-jdk path to Boot JDK (used to bootstrap build) [probed]
--with-boot-jdk-jvmargs specify JVM arguments to be passed to all
invocations of the Boot JDK, overriding the default
@@ -3818,7 +3818,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1379504921
+DATE_WHEN_GENERATED=1381162713
###############################################################################
#
@@ -10935,7 +10935,7 @@
if test "x$SUPPORT_HEADFUL" = xyes; then
# We are building both headful and headless.
- headful_msg="inlude support for both headful and headless"
+ headful_msg="include support for both headful and headless"
fi
if test "x$SUPPORT_HEADFUL" = xno; then
@@ -11048,6 +11048,18 @@
fi
+# Check whether --with-user-release-suffix was given.
+if test "${with_user_release_suffix+set}" = set; then :
+ withval=$with_user_release_suffix;
+fi
+
+if test "x$with_user_release_suffix" = xyes; then
+ as_fn_error $? "Release suffix must have a value" "$LINENO" 5
+elif test "x$with_user_release_suffix" != x; then
+ USER_RELEASE_SUFFIX="$with_user_release_suffix"
+fi
+
+
# Check whether --with-build-number was given.
if test "${with_build_number+set}" = set; then :
withval=$with_build_number;
@@ -11058,27 +11070,16 @@
elif test "x$with_build_number" != x; then
JDK_BUILD_NUMBER="$with_build_number"
fi
+# Define default USER_RELEASE_SUFFIX if BUILD_NUMBER and USER_RELEASE_SUFFIX are not set
if test "x$JDK_BUILD_NUMBER" = x; then
JDK_BUILD_NUMBER=b00
-fi
-
-
-# Check whether --with-user-release-suffix was given.
-if test "${with_user_release_suffix+set}" = set; then :
- withval=$with_user_release_suffix;
-fi
-
-if test "x$with_user_release_suffix" = xyes; then
- as_fn_error $? "Release suffix must have a value" "$LINENO" 5
-elif test "x$with_user_release_suffix" != x; then
- USER_RELEASE_SUFFIX="$with_user_release_suffix"
-else
- BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
- # Avoid [:alnum:] since it depends on the locale.
- CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'`
- USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-fi
-
+ if test "x$USER_RELEASE_SUFFIX" = x; then
+ BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
+ # Avoid [:alnum:] since it depends on the locale.
+ CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'`
+ USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ fi
+fi
# Now set the JDK version, milestone, build number etc.
@@ -11095,6 +11096,7 @@
+
COPYRIGHT_YEAR=`date +'%Y'`
--- a/common/autoconf/jdk-options.m4 Sat Sep 14 20:43:34 2013 +0100
+++ b/common/autoconf/jdk-options.m4 Thu Oct 03 19:18:54 2013 +0100
@@ -316,7 +316,7 @@
if test "x$SUPPORT_HEADFUL" = xyes; then
# We are building both headful and headless.
- headful_msg="inlude support for both headful and headless"
+ headful_msg="include support for both headful and headless"
fi
if test "x$SUPPORT_HEADFUL" = xno; then
@@ -426,6 +426,14 @@
JDK_UPDATE_VERSION="$with_update_version"
fi
+AC_ARG_WITH(user-release-suffix, [AS_HELP_STRING([--with-user-release-suffix],
+ [Add a custom string to the version string if build number isn't set.@<:@username_builddateb00@:>@])])
+if test "x$with_user_release_suffix" = xyes; then
+ AC_MSG_ERROR([Release suffix must have a value])
+elif test "x$with_user_release_suffix" != x; then
+ USER_RELEASE_SUFFIX="$with_user_release_suffix"
+fi
+
AC_ARG_WITH(build-number, [AS_HELP_STRING([--with-build-number],
[Set build number value for build @<:@b00@:>@])])
if test "x$with_build_number" = xyes; then
@@ -433,25 +441,19 @@
elif test "x$with_build_number" != x; then
JDK_BUILD_NUMBER="$with_build_number"
fi
+# Define default USER_RELEASE_SUFFIX if BUILD_NUMBER and USER_RELEASE_SUFFIX are not set
if test "x$JDK_BUILD_NUMBER" = x; then
JDK_BUILD_NUMBER=b00
+ if test "x$USER_RELEASE_SUFFIX" = x; then
+ BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
+ # Avoid [:alnum:] since it depends on the locale.
+ CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'`
+ USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ fi
fi
-AC_ARG_WITH(user-release-suffix, [AS_HELP_STRING([--with-user-release-suffix],
- [Add a custom string to the version string if build number isn't set.@<:@username_builddateb00@:>@])])
-if test "x$with_user_release_suffix" = xyes; then
- AC_MSG_ERROR([Release suffix must have a value])
-elif test "x$with_user_release_suffix" != x; then
- USER_RELEASE_SUFFIX="$with_user_release_suffix"
-else
- BUILD_DATE=`date '+%Y_%m_%d_%H_%M'`
- # Avoid [:alnum:] since it depends on the locale.
- CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'`
- USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-fi
+# Now set the JDK version, milestone, build number etc.
AC_SUBST(USER_RELEASE_SUFFIX)
-
-# Now set the JDK version, milestone, build number etc.
AC_SUBST(JDK_MAJOR_VERSION)
AC_SUBST(JDK_MINOR_VERSION)
AC_SUBST(JDK_MICRO_VERSION)
--- a/common/autoconf/spec.gmk.in Sat Sep 14 20:43:34 2013 +0100
+++ b/common/autoconf/spec.gmk.in Thu Oct 03 19:18:54 2013 +0100
@@ -161,6 +161,7 @@
COMPANY_NAME:=@COMPANY_NAME@
MACOSX_BUNDLE_NAME_BASE=@MACOSX_BUNDLE_NAME_BASE@
MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@
+USER_RELEASE_SUFFIX=@USER_RELEASE_SUFFIX@
# Different version strings generated from the above information.
JDK_VERSION:=@JDK_VERSION@
@@ -173,8 +174,8 @@
else
RELEASE=$(JDK_VERSION)-$(MILESTONE)$(BUILD_VARIANT_RELEASE)
endif
-ifeq ($(JDK_BUILD_NUMBER),b00)
- USER_RELEASE_SUFFIX=@USER_RELEASE_SUFFIX@
+
+ifneq ($(USER_RELEASE_SUFFIX),)
FULL_VERSION=$(RELEASE)-$(USER_RELEASE_SUFFIX)-$(JDK_BUILD_NUMBER)
else
FULL_VERSION=$(RELEASE)-$(JDK_BUILD_NUMBER)
--- a/common/bin/compare.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/common/bin/compare.sh Thu Oct 03 19:18:54 2013 +0100
@@ -76,13 +76,13 @@
TMP=1
if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then
- TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \
+ TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
$GREP '^[<>]' | \
$SED -e '/[<>] Ant-Version: Apache Ant .*/d' \
-e '/[<>] Created-By: .* (Oracle Corporation).*/d')
fi
if test "x$SUFFIX" = "xjava"; then
- TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \
+ TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
$GREP '^[<>]' | \
$SED -e '/[<>] \* from.*\.idl/d' \
-e '/[<>] \*.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
@@ -121,8 +121,8 @@
# | $SED -e '/^#/d' -e '/^$/d' \
# -e :a -e '/\\$/N; s/\\\n//; ta' \
# -e 's/^[ \t]*//;s/[ \t]*$//' \
-# -e 's/\\=/=/' | LANG=C $SORT > $OTHER_FILE.cleaned
- TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE)
+# -e 's/\\=/=/' | LC_ALL=C $SORT > $OTHER_FILE.cleaned
+ TMP=$(LC_ALL=C $DIFF $OTHER_FILE.cleaned $THIS_FILE)
fi
if test -n "$TMP"; then
echo Files $OTHER_FILE and $THIS_FILE differ
@@ -410,11 +410,11 @@
CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
# On solaris, there is no -q option.
if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
- LANG=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
+ LC_ALL=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
| $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \
> $CONTENTS_DIFF_FILE
else
- LANG=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
+ LC_ALL=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
fi
ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
@@ -459,11 +459,11 @@
if [ -n "$SHOW_DIFFS" ]; then
for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do
if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then
- LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap
+ LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap
elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then
- LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i
+ LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i
else
- LANG=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i
+ LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i
fi
done
fi
@@ -703,7 +703,7 @@
$NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
fi
- LANG=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
+ LC_ALL=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
if [ -s $WORK_FILE_BASE.symbols.diff ]; then
SYM_MSG=" diff "
if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then
@@ -732,8 +732,8 @@
(cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
(cd $FILE_WORK_DIR && $RM -f $NAME)
- LANG=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff
- LANG=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq
+ LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff
+ LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq
if [ -s $WORK_FILE_BASE.deps.diff ]; then
if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then
@@ -768,7 +768,7 @@
if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then
$FULLDUMP_CMD $OTHER_FILE > $WORK_FILE_BASE.fulldump.other 2>&1
$FULLDUMP_CMD $THIS_FILE > $WORK_FILE_BASE.fulldump.this 2>&1
- LANG=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this > $WORK_FILE_BASE.fulldump.diff
+ LC_ALL=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this > $WORK_FILE_BASE.fulldump.diff
if [ -s $WORK_FILE_BASE.fulldump.diff ]; then
ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}')
@@ -802,7 +802,7 @@
$DIS_CMD $OTHER_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.other 2>&1
$DIS_CMD $THIS_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.this 2>&1
- LANG=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff
+ LC_ALL=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff
if [ -s $WORK_FILE_BASE.dis.diff ]; then
DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}')
--- a/common/makefiles/JavaCompilation.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/common/makefiles/JavaCompilation.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -159,7 +159,7 @@
endif
endif
- # Utility macros, to make the shell script receipt somewhat easier to dechipher.
+ # Utility macros, to make the shell script receipt somewhat easier to decipher.
# The capture contents macro finds all files (matching the patterns, typically
# .class and .prp) that are newer than the jar-file, ie the new content to be put into the jar.
@@ -520,7 +520,7 @@
# Using plain javac to batch compile everything.
$1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/_the.batch
- # When buliding in batch, put headers in a temp dir to filter out those that actually
+ # When building in batch, put headers in a temp dir to filter out those that actually
# changed before copying them to the real header dir.
ifneq (,$$($1_HEADERS))
$1_HEADERS_ARG := -h $$($1_HEADERS).tmp
--- a/common/makefiles/Jprt.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/common/makefiles/Jprt.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -200,13 +200,8 @@
$(RM) $@
$(CP) $(BUILD_OUTPUT)/bundles/$(JDK_IMAGE_SUBDIR).zip $@
-ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_BITS),solaris-64)
- SRC_JDK_IMAGE_DIR := $(JDK_OVERLAY_IMAGE_DIR)
- SRC_JRE_IMAGE_DIR := $(JRE_OVERLAY_IMAGE_DIR)
-else
- SRC_JDK_IMAGE_DIR := $(JDK_IMAGE_DIR)
- SRC_JRE_IMAGE_DIR := $(JRE_IMAGE_DIR)
-endif
+SRC_JDK_IMAGE_DIR := $(JDK_IMAGE_DIR)
+SRC_JRE_IMAGE_DIR := $(JRE_IMAGE_DIR)
SRC_JDK_BUNDLE_DIR := $(JDK_BUNDLE_DIR)
SRC_JRE_BUNDLE_DIR := $(JRE_BUNDLE_DIR)
@@ -215,10 +210,10 @@
bundles-only: start-make
@$(call TargetEnter)
$(MKDIR) -p $(BUILD_OUTPUT)/bundles
- $(CD) $(SRC_JDK_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/$(JDK_IMAGE_SUBDIR).zip .
- $(CD) $(SRC_JRE_IMAGE_DIR) && $(ZIP) -q -r $(BUILD_OUTPUT)/bundles/$(JRE_IMAGE_SUBDIR).zip .
+ $(CD) $(SRC_JDK_IMAGE_DIR) && $(ZIP) -y -q -r $(BUILD_OUTPUT)/bundles/$(JDK_IMAGE_SUBDIR).zip .
+ $(CD) $(SRC_JRE_IMAGE_DIR) && $(ZIP) -y -q -r $(BUILD_OUTPUT)/bundles/$(JRE_IMAGE_SUBDIR).zip .
if [ -d $(BUILD_OUTPUT)/install/bundles ] ; then \
- $(CD) $(BUILD_OUTPUT)/install/bundles && $(ZIP) -q -r $(JPRT_ARCHIVE_INSTALL_BUNDLE) . ; \
+ $(CD) $(BUILD_OUTPUT)/install/bundles && $(ZIP) -y -q -r $(JPRT_ARCHIVE_INSTALL_BUNDLE) . ; \
fi
@$(call TargetExit)
--- a/common/makefiles/Main.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/common/makefiles/Main.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -68,10 +68,6 @@
all: images docs
@$(call CheckIfMakeAtEnd)
-ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_BITS),solaris-64)
- all: overlay-images
-endif
-
# Setup a rule for SPEC file that fails if executed. This check makes sure the configuration
# is up to date after changes to configure
$(SPEC): $(wildcard $(SRC_ROOT)/common/autoconf/*)
--- a/corba/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/corba/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
4e38de7c767e34104fa147b5b346d9fe6b731279 jdk8-b105
2e3a056c84a71eba78945c18b05397858ffd7ad0 jdk8-b106
23fc34133152692b725db4bd617b4c8dfd6ccb05 jdk8-b107
+a4bb3b4500164748a9c33b2283cfda76d89f25ab jdk8-b108
+428428cf5e06163322144cfb5367e1faa86acf20 jdk8-b109
+3d2b7ce93c5c2e3db748f29c3d29620a8b3b748a jdk8-b110
--- a/corba/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/corba/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -39,8 +39,8 @@
solaris_x64_5.10-{product|fastdebug}, \
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev
--- a/hotspot/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -377,3 +377,9 @@
50794d8ac11c9579b41dec4de23b808fef9f34a1 hs25-b49
5b7f90aab3ad25a25b75b7b2bb18d5ae23d8231c jdk8-b107
a09fe9d1e016c285307507a5793bc4fa6215e9c9 hs25-b50
+85072013aad46050a362d10ab78e963121c8014c jdk8-b108
+566db1b0e6efca31f181456e54c8911d0192410d hs25-b51
+c81dd5393a5e333df7cb1f6621f5897ada6522b5 jdk8-b109
+58043478c26d4e8bf48700acea5f97aba8b417d4 hs25-b52
+6209b0ed51c086d4127bac0e086c8f326d1764d7 jdk8-b110
+562a3d356de67670b4172b82aca2d30743449e04 hs25-b53
--- a/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c Thu Oct 03 19:18:54 2013 +0100
@@ -29,6 +29,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <stdlib.h>
#include <string.h>
#include <limits.h>
@@ -80,7 +81,7 @@
(JNIEnv *env, jclass cls) {
jclass listClass;
- if (init_libproc(getenv("LIBSAPROC_DEBUG")) != true) {
+ if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) {
THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc");
}
--- a/hotspot/agent/src/os/linux/ps_core.c Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/os/linux/ps_core.c Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -698,29 +698,58 @@
// read segments of a shared object
static bool read_lib_segments(struct ps_prochandle* ph, int lib_fd, ELF_EHDR* lib_ehdr, uintptr_t lib_base) {
- int i = 0;
- ELF_PHDR* phbuf;
- ELF_PHDR* lib_php = NULL;
+ int i = 0;
+ ELF_PHDR* phbuf;
+ ELF_PHDR* lib_php = NULL;
+
+ int page_size=sysconf(_SC_PAGE_SIZE);
- if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL)
- return false;
+ if ((phbuf = read_program_header_table(lib_fd, lib_ehdr)) == NULL) {
+ return false;
+ }
+
+ // we want to process only PT_LOAD segments that are not writable.
+ // i.e., text segments. The read/write/exec (data) segments would
+ // have been already added from core file segments.
+ for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
+ if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
+
+ uintptr_t target_vaddr = lib_php->p_vaddr + lib_base;
+ map_info *existing_map = core_lookup(ph, target_vaddr);
- // we want to process only PT_LOAD segments that are not writable.
- // i.e., text segments. The read/write/exec (data) segments would
- // have been already added from core file segments.
- for (lib_php = phbuf, i = 0; i < lib_ehdr->e_phnum; i++) {
- if ((lib_php->p_type == PT_LOAD) && !(lib_php->p_flags & PF_W) && (lib_php->p_filesz != 0)) {
- if (add_map_info(ph, lib_fd, lib_php->p_offset, lib_php->p_vaddr + lib_base, lib_php->p_filesz) == NULL)
- goto err;
+ if (existing_map == NULL){
+ if (add_map_info(ph, lib_fd, lib_php->p_offset,
+ target_vaddr, lib_php->p_filesz) == NULL) {
+ goto err;
+ }
+ } else {
+ if ((existing_map->memsz != page_size) &&
+ (existing_map->fd != lib_fd) &&
+ (existing_map->memsz != lib_php->p_filesz)){
+
+ print_debug("address conflict @ 0x%lx (size = %ld, flags = %d\n)",
+ target_vaddr, lib_php->p_filesz, lib_php->p_flags);
+ goto err;
+ }
+
+ /* replace PT_LOAD segment with library segment */
+ print_debug("overwrote with new address mapping (memsz %ld -> %ld)\n",
+ existing_map->memsz, lib_php->p_filesz);
+
+ existing_map->fd = lib_fd;
+ existing_map->offset = lib_php->p_offset;
+ existing_map->memsz = lib_php->p_filesz;
}
- lib_php++;
- }
+ }
+
+ lib_php++;
+ }
- free(phbuf);
- return true;
+ free(phbuf);
+ return true;
err:
- free(phbuf);
- return false;
+ free(phbuf);
+ return false;
}
// process segments from interpreter (ld.so or ld-linux.so)
--- a/hotspot/agent/src/os/linux/ps_proc.c Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/os/linux/ps_proc.c Thu Oct 03 19:18:54 2013 +0100
@@ -27,6 +27,8 @@
#include <string.h>
#include <signal.h>
#include <errno.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include <sys/ptrace.h>
#include "libproc_impl.h"
--- a/hotspot/agent/src/os/linux/salibelf.c Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/os/linux/salibelf.c Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,7 @@
#include "salibelf.h"
#include <stdlib.h>
#include <unistd.h>
+#include <string.h>
extern void print_debug(const char*,...);
--- a/hotspot/agent/src/os/linux/symtab.c Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/os/linux/symtab.c Thu Oct 03 19:18:54 2013 +0100
@@ -305,7 +305,7 @@
unsigned char *bytes
= (unsigned char*)(note+1) + note->n_namesz;
- unsigned char *filename
+ char *filename
= (build_id_to_debug_filename (note->n_descsz, bytes));
fd = pathmap_open(filename);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java Thu Oct 03 19:18:54 2013 +0100
@@ -1213,6 +1213,7 @@
}
HotSpotTypeDataBase db = (HotSpotTypeDataBase)agent.getTypeDataBase();
if (t.countTokens() == 1) {
+ String name = t.nextToken();
out.println("intConstant " + name + " " + db.lookupIntConstant(name));
} else if (t.countTokens() == 0) {
Iterator i = db.getIntConstants();
@@ -1235,6 +1236,7 @@
}
HotSpotTypeDataBase db = (HotSpotTypeDataBase)agent.getTypeDataBase();
if (t.countTokens() == 1) {
+ String name = t.nextToken();
out.println("longConstant " + name + " " + db.lookupLongConstant(name));
} else if (t.countTokens() == 0) {
Iterator i = db.getLongConstants();
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdAddress.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdAddress.java Thu Oct 03 19:18:54 2013 +0100
@@ -81,7 +81,7 @@
public Address getCompKlassAddressAt(long offset)
throws UnalignedAddressException, UnmappedAddressException {
- return debugger.readCompOopAddress(addr + offset);
+ return debugger.readCompKlassAddress(addr + offset);
}
//
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,15 +134,13 @@
private String type;
private String name;
private Address addr;
- private String kind;
- private int origin;
+ private int flags;
- private Flag(String type, String name, Address addr, String kind, int origin) {
+ private Flag(String type, String name, Address addr, int flags) {
this.type = type;
this.name = name;
this.addr = addr;
- this.kind = kind;
- this.origin = origin;
+ this.flags = flags;
}
public String getType() {
@@ -157,12 +155,8 @@
return addr;
}
- public String getKind() {
- return kind;
- }
-
public int getOrigin() {
- return origin;
+ return flags & 0xF; // XXX can we get the mask bits from somewhere?
}
public boolean isBool() {
@@ -173,8 +167,7 @@
if (Assert.ASSERTS_ENABLED) {
Assert.that(isBool(), "not a bool flag!");
}
- return addr.getCIntegerAt(0, boolType.getSize(), boolType.isUnsigned())
- != 0;
+ return addr.getCIntegerAt(0, boolType.getSize(), boolType.isUnsigned()) != 0;
}
public boolean isIntx() {
@@ -792,7 +785,7 @@
public boolean isCompressedKlassPointersEnabled() {
if (compressedKlassPointersEnabled == null) {
- Flag flag = getCommandLineFlag("UseCompressedKlassPointers");
+ Flag flag = getCommandLineFlag("UseCompressedClassPointers");
compressedKlassPointersEnabled = (flag == null) ? Boolean.FALSE:
(flag.getBool()? Boolean.TRUE: Boolean.FALSE);
}
@@ -843,11 +836,10 @@
Address flagAddr = flagType.getAddressField("flags").getValue();
- AddressField typeFld = flagType.getAddressField("type");
- AddressField nameFld = flagType.getAddressField("name");
- AddressField addrFld = flagType.getAddressField("addr");
- AddressField kindFld = flagType.getAddressField("kind");
- CIntField originFld = new CIntField(flagType.getCIntegerField("origin"), 0);
+ AddressField typeFld = flagType.getAddressField("_type");
+ AddressField nameFld = flagType.getAddressField("_name");
+ AddressField addrFld = flagType.getAddressField("_addr");
+ CIntField flagsFld = new CIntField(flagType.getCIntegerField("_flags"), 0);
long flagSize = flagType.getSize(); // sizeof(Flag)
@@ -856,9 +848,8 @@
String type = CStringUtilities.getString(typeFld.getValue(flagAddr));
String name = CStringUtilities.getString(nameFld.getValue(flagAddr));
Address addr = addrFld.getValue(flagAddr);
- String kind = CStringUtilities.getString(kindFld.getValue(flagAddr));
- int origin = (int)originFld.getValue(flagAddr);
- commandLineFlags[f] = new Flag(type, name, addr, kind, origin);
+ int flags = (int)flagsFld.getValue(flagAddr);
+ commandLineFlags[f] = new Flag(type, name, addr, flags);
flagAddr = flagAddr.addOffsetTo(flagSize);
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,18 +66,18 @@
printGCAlgorithm(flagMap);
System.out.println();
System.out.println("Heap Configuration:");
- printValue("MinHeapFreeRatio = ", getFlagValue("MinHeapFreeRatio", flagMap));
- printValue("MaxHeapFreeRatio = ", getFlagValue("MaxHeapFreeRatio", flagMap));
- printValMB("MaxHeapSize = ", getFlagValue("MaxHeapSize", flagMap));
- printValMB("NewSize = ", getFlagValue("NewSize", flagMap));
- printValMB("MaxNewSize = ", getFlagValue("MaxNewSize", flagMap));
- printValMB("OldSize = ", getFlagValue("OldSize", flagMap));
- printValue("NewRatio = ", getFlagValue("NewRatio", flagMap));
- printValue("SurvivorRatio = ", getFlagValue("SurvivorRatio", flagMap));
- printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap));
- printValMB("ClassMetaspaceSize = ", getFlagValue("ClassMetaspaceSize", flagMap));
- printValMB("MaxMetaspaceSize = ", getFlagValue("MaxMetaspaceSize", flagMap));
- printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes());
+ printValue("MinHeapFreeRatio = ", getFlagValue("MinHeapFreeRatio", flagMap));
+ printValue("MaxHeapFreeRatio = ", getFlagValue("MaxHeapFreeRatio", flagMap));
+ printValMB("MaxHeapSize = ", getFlagValue("MaxHeapSize", flagMap));
+ printValMB("NewSize = ", getFlagValue("NewSize", flagMap));
+ printValMB("MaxNewSize = ", getFlagValue("MaxNewSize", flagMap));
+ printValMB("OldSize = ", getFlagValue("OldSize", flagMap));
+ printValue("NewRatio = ", getFlagValue("NewRatio", flagMap));
+ printValue("SurvivorRatio = ", getFlagValue("SurvivorRatio", flagMap));
+ printValMB("MetaspaceSize = ", getFlagValue("MetaspaceSize", flagMap));
+ printValMB("CompressedClassSpaceSize = ", getFlagValue("CompressedClassSpaceSize", flagMap));
+ printValMB("MaxMetaspaceSize = ", getFlagValue("MaxMetaspaceSize", flagMap));
+ printValMB("G1HeapRegionSize = ", HeapRegion.grainBytes());
System.out.println();
System.out.println("Heap Usage:");
--- a/hotspot/make/bsd/makefiles/fastdebug.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/bsd/makefiles/fastdebug.make Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -59,5 +59,5 @@
MAPFILE = $(GAMMADIR)/make/bsd/makefiles/mapfile-vers-debug
VERSION = fastdebug
-SYSDEFS += -DASSERT
+SYSDEFS += -DASSERT -DCHECK_UNHANDLED_OOPS
PICFLAGS = DEFAULT
--- a/hotspot/make/bsd/makefiles/gcc.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/bsd/makefiles/gcc.make Thu Oct 03 19:18:54 2013 +0100
@@ -80,7 +80,7 @@
HOSTCC = $(CC)
endif
- AS = $(CC) -c -x assembler-with-cpp
+ AS = $(CC) -c
endif
@@ -247,7 +247,7 @@
ifeq ($(USE_CLANG), true)
# However we need to clean the code up before we can unrestrictedly enable this option with Clang
- WARNINGS_ARE_ERRORS += -Wno-unused-value -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
+ WARNINGS_ARE_ERRORS += -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-compare
# Not yet supported by clang in Xcode 4.6.2
# WARNINGS_ARE_ERRORS += -Wno-tautological-constant-out-of-range-compare
@@ -262,7 +262,7 @@
# conversions which might affect the values. Only enable it in earlier versions.
WARNING_FLAGS = -Wunused-function
ifeq ($(USE_CLANG),)
- WARNINGS_FLAGS += -Wconversion
+ WARNING_FLAGS += -Wconversion
endif
endif
@@ -347,6 +347,13 @@
LDFLAGS += -mmacosx-version-min=$(MACOSX_VERSION_MIN)
endif
+
+#------------------------------------------------------------------------
+# Assembler flags
+
+# Enforce prerpocessing of .s files
+ASFLAGS += -x assembler-with-cpp
+
#------------------------------------------------------------------------
# Linker flags
--- a/hotspot/make/excludeSrc.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/excludeSrc.make Thu Oct 03 19:18:54 2013 +0100
@@ -88,7 +88,7 @@
g1ErgoVerbose.cpp g1GCPhaseTimes.cpp g1HRPrinter.cpp g1HotCardCache.cpp g1Log.cpp \
g1MMUTracker.cpp g1MarkSweep.cpp g1MemoryPool.cpp g1MonitoringSupport.cpp \
g1RemSet.cpp g1RemSetSummary.cpp g1SATBCardTableModRefBS.cpp g1_globals.cpp heapRegion.cpp \
- heapRegionRemSet.cpp heapRegionSeq.cpp heapRegionSet.cpp heapRegionSets.cpp \
+ g1BiasedArray.cpp heapRegionRemSet.cpp heapRegionSeq.cpp heapRegionSet.cpp heapRegionSets.cpp \
ptrQueue.cpp satbQueue.cpp sparsePRT.cpp survRateGroup.cpp vm_operations_g1.cpp \
adjoiningGenerations.cpp adjoiningVirtualSpaces.cpp asPSOldGen.cpp asPSYoungGen.cpp \
cardTableExtension.cpp gcTaskManager.cpp gcTaskThread.cpp objectStartArray.cpp \
@@ -99,7 +99,7 @@
psTasks.cpp psVirtualspace.cpp psYoungGen.cpp vmPSOperations.cpp asParNewGeneration.cpp \
parCardTableModRefBS.cpp parGCAllocBuffer.cpp parNewGeneration.cpp mutableSpace.cpp \
gSpaceCounters.cpp allocationStats.cpp spaceCounters.cpp gcAdaptivePolicyCounters.cpp \
- mutableNUMASpace.cpp immutableSpace.cpp yieldingWorkGroup.cpp
+ mutableNUMASpace.cpp immutableSpace.cpp yieldingWorkGroup.cpp hSpaceCounters.cpp
endif
ifeq ($(INCLUDE_NMT), false)
--- a/hotspot/make/hotspot_version Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/hotspot_version Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=50
+HS_BUILD_NUMBER=53
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
--- a/hotspot/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -120,13 +120,13 @@
jprt.my.macosx.x64.jdk7u8=${jprt.my.macosx.x64.jdk7}
jprt.my.macosx.x64=${jprt.my.macosx.x64.${jprt.tools.default.release}}
-jprt.my.windows.i586.jdk8=windows_i586_5.1
-jprt.my.windows.i586.jdk7=windows_i586_5.1
+jprt.my.windows.i586.jdk8=windows_i586_6.1
+jprt.my.windows.i586.jdk7=windows_i586_6.1
jprt.my.windows.i586.jdk7u8=${jprt.my.windows.i586.jdk7}
jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}}
-jprt.my.windows.x64.jdk8=windows_x64_5.2
-jprt.my.windows.x64.jdk7=windows_x64_5.2
+jprt.my.windows.x64.jdk8=windows_x64_6.1
+jprt.my.windows.x64.jdk7=windows_x64_6.1
jprt.my.windows.x64.jdk7u8=${jprt.my.windows.x64.jdk7}
jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}}
--- a/hotspot/make/linux/makefiles/fastdebug.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/linux/makefiles/fastdebug.make Thu Oct 03 19:18:54 2013 +0100
@@ -59,5 +59,5 @@
MAPFILE = $(GAMMADIR)/make/linux/makefiles/mapfile-vers-debug
VERSION = optimized
-SYSDEFS += -DASSERT
+SYSDEFS += -DASSERT -DCHECK_UNHANDLED_OOPS
PICFLAGS = DEFAULT
--- a/hotspot/make/linux/makefiles/gcc.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/linux/makefiles/gcc.make Thu Oct 03 19:18:54 2013 +0100
@@ -208,7 +208,7 @@
ifeq ($(USE_CLANG), true)
# However we need to clean the code up before we can unrestrictedly enable this option with Clang
- WARNINGS_ARE_ERRORS += -Wno-unused-value -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
+ WARNINGS_ARE_ERRORS += -Wno-logical-op-parentheses -Wno-parentheses-equality -Wno-parentheses
WARNINGS_ARE_ERRORS += -Wno-switch -Wno-tautological-constant-out-of-range-compare -Wno-tautological-compare
WARNINGS_ARE_ERRORS += -Wno-delete-non-virtual-dtor -Wno-deprecated -Wno-format -Wno-dynamic-class-memaccess
WARNINGS_ARE_ERRORS += -Wno-return-type -Wno-empty-body
--- a/hotspot/make/windows/makefiles/fastdebug.make Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/make/windows/makefiles/fastdebug.make Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@
!include ../local.make
!include compile.make
-CXX_FLAGS=$(CXX_FLAGS) $(FASTDEBUG_OPT_OPTION)
+CXX_FLAGS=$(CXX_FLAGS) $(FASTDEBUG_OPT_OPTION) /D "CHECK_UNHANDLED_OOPS"
!include $(WorkSpace)/make/windows/makefiles/vm.make
!include local.make
--- a/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -105,7 +105,7 @@
if (src->is_address() && !src->is_stack() && (src->type() == T_OBJECT || src->type() == T_ARRAY)) return false;
}
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
if (src->is_address() && !src->is_stack() && src->type() == T_ADDRESS &&
src->as_address_ptr()->disp() == oopDesc::klass_offset_in_bytes()) return false;
}
@@ -963,7 +963,7 @@
case T_METADATA: __ ld_ptr(base, offset, to_reg->as_register()); break;
case T_ADDRESS:
#ifdef _LP64
- if (offset == oopDesc::klass_offset_in_bytes() && UseCompressedKlassPointers) {
+ if (offset == oopDesc::klass_offset_in_bytes() && UseCompressedClassPointers) {
__ lduw(base, offset, to_reg->as_register());
__ decode_klass_not_null(to_reg->as_register());
} else
@@ -2208,7 +2208,7 @@
// We don't know the array types are compatible
if (basic_type != T_OBJECT) {
// Simple test for basic type arrays
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// We don't need decode because we just need to compare
__ lduw(src, oopDesc::klass_offset_in_bytes(), tmp);
__ lduw(dst, oopDesc::klass_offset_in_bytes(), tmp2);
@@ -2342,7 +2342,7 @@
// but not necessarily exactly of type default_type.
Label known_ok, halt;
metadata2reg(op->expected_type()->constant_encoding(), tmp);
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// tmp holds the default type. It currently comes uncompressed after the
// load of a constant, so encode it.
__ encode_klass_not_null(tmp);
--- a/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -186,7 +186,7 @@
set((intx)markOopDesc::prototype(), t1);
}
st_ptr(t1, obj, oopDesc::mark_offset_in_bytes());
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// Save klass
mov(klass, t1);
encode_klass_not_null(t1);
@@ -196,7 +196,7 @@
}
if (len->is_valid()) {
st(len, obj, arrayOopDesc::length_offset_in_bytes());
- } else if (UseCompressedKlassPointers) {
+ } else if (UseCompressedClassPointers) {
// otherwise length is in the class gap
store_klass_gap(G0, obj);
}
--- a/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -764,7 +764,7 @@
#ifdef CC_INTERP
*oop_result = istate->_oop_temp;
#else
- oop obj = (oop) at(interpreter_frame_oop_temp_offset);
+ oop obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
*oop_result = obj;
#endif // CC_INTERP
@@ -788,7 +788,7 @@
switch(type) {
case T_OBJECT:
case T_ARRAY: {
- oop obj = (oop)*tos_addr;
+ oop obj = cast_to_oop(*tos_addr);
assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
*oop_result = obj;
break;
--- a/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/macroAssembler_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -3911,7 +3911,7 @@
// The number of bytes in this code is used by
// MachCallDynamicJavaNode::ret_addr_offset()
// if this changes, change that.
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
lduw(src_oop, oopDesc::klass_offset_in_bytes(), klass);
decode_klass_not_null(klass);
} else {
@@ -3920,7 +3920,7 @@
}
void MacroAssembler::store_klass(Register klass, Register dst_oop) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
assert(dst_oop != klass, "not enough registers");
encode_klass_not_null(klass);
st(klass, dst_oop, oopDesc::klass_offset_in_bytes());
@@ -3930,7 +3930,7 @@
}
void MacroAssembler::store_klass_gap(Register s, Register d) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
assert(s != d, "not enough registers");
st(s, d, oopDesc::klass_gap_offset_in_bytes());
}
@@ -4089,7 +4089,7 @@
}
void MacroAssembler::encode_klass_not_null(Register r) {
- assert (UseCompressedKlassPointers, "must be compressed");
+ assert (UseCompressedClassPointers, "must be compressed");
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
assert(r != G6_heapbase, "bad register choice");
set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
@@ -4105,7 +4105,7 @@
if (src == dst) {
encode_klass_not_null(src);
} else {
- assert (UseCompressedKlassPointers, "must be compressed");
+ assert (UseCompressedClassPointers, "must be compressed");
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
set((intptr_t)Universe::narrow_klass_base(), dst);
sub(src, dst, dst);
@@ -4119,7 +4119,7 @@
// generated by decode_klass_not_null() and reinit_heapbase(). Hence, if
// the instructions they generate change, then this method needs to be updated.
int MacroAssembler::instr_size_for_decode_klass_not_null() {
- assert (UseCompressedKlassPointers, "only for compressed klass ptrs");
+ assert (UseCompressedClassPointers, "only for compressed klass ptrs");
// set + add + set
int num_instrs = insts_for_internal_set((intptr_t)Universe::narrow_klass_base()) + 1 +
insts_for_internal_set((intptr_t)Universe::narrow_ptrs_base());
@@ -4135,7 +4135,7 @@
void MacroAssembler::decode_klass_not_null(Register r) {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit.
- assert (UseCompressedKlassPointers, "must be compressed");
+ assert (UseCompressedClassPointers, "must be compressed");
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
assert(r != G6_heapbase, "bad register choice");
set((intptr_t)Universe::narrow_klass_base(), G6_heapbase);
@@ -4151,7 +4151,7 @@
} else {
// Do not add assert code to this unless you change vtableStubs_sparc.cpp
// pd_code_size_limit.
- assert (UseCompressedKlassPointers, "must be compressed");
+ assert (UseCompressedClassPointers, "must be compressed");
assert(Universe::narrow_klass_base() != NULL, "narrow_klass_base should be initialized");
if (Universe::narrow_klass_shift() != 0) {
assert((src != G6_heapbase) && (dst != G6_heapbase), "bad register choice");
@@ -4167,7 +4167,7 @@
}
void MacroAssembler::reinit_heapbase() {
- if (UseCompressedOops || UseCompressedKlassPointers) {
+ if (UseCompressedOops || UseCompressedClassPointers) {
if (Universe::heap() != NULL) {
set((intptr_t)Universe::narrow_ptrs_base(), G6_heapbase);
} else {
--- a/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -121,6 +121,7 @@
void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register target, Register temp,
bool for_compiler_entry) {
+ Label L_no_such_method;
assert(method == G5_method, "interpreter calling convention");
assert_different_registers(method, target, temp);
@@ -133,6 +134,9 @@
const Address interp_only(G2_thread, JavaThread::interp_only_mode_offset());
__ ld(interp_only, temp);
__ cmp_and_br_short(temp, 0, Assembler::zero, Assembler::pt, run_compiled_code);
+ // Null method test is replicated below in compiled case,
+ // it might be able to address across the verify_thread()
+ __ br_null_short(G5_method, Assembler::pn, L_no_such_method);
__ ld_ptr(G5_method, in_bytes(Method::interpreter_entry_offset()), target);
__ jmp(target, 0);
__ delayed()->nop();
@@ -141,11 +145,19 @@
// it doesn't matter, since this is interpreter code.
}
+ // Compiled case, either static or fall-through from runtime conditional
+ __ br_null_short(G5_method, Assembler::pn, L_no_such_method);
+
const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() :
Method::from_interpreted_offset();
__ ld_ptr(G5_method, in_bytes(entry_offset), target);
__ jmp(target, 0);
__ delayed()->nop();
+
+ __ bind(L_no_such_method);
+ AddressLiteral ame(StubRoutines::throw_AbstractMethodError_entry());
+ __ jump_to(ame, temp);
+ __ delayed()->nop();
}
void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm,
--- a/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -358,7 +358,7 @@
oop_Relocation *r = iter.oop_reloc();
if (oop_addr == NULL) {
oop_addr = r->oop_addr();
- *oop_addr = (oop)x;
+ *oop_addr = cast_to_oop(x);
} else {
assert(oop_addr == r->oop_addr(), "must be only one set-oop here");
}
@@ -478,7 +478,7 @@
oop_Relocation *r = iter.oop_reloc();
if (oop_addr == NULL) {
oop_addr = r->oop_addr();
- *oop_addr = (oop)x;
+ *oop_addr = cast_to_oop(x);
} else {
assert(oop_addr == r->oop_addr(), "must be only one set-oop here");
}
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Thu Oct 03 19:18:54 2013 +0100
@@ -557,7 +557,7 @@
int entry_offset = InstanceKlass::vtable_start_offset() + vtable_index*vtableEntry::size();
int v_off = entry_offset*wordSize + vtableEntry::method_offset_in_bytes();
int klass_load_size;
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
assert(Universe::heap() != NULL, "java heap should be initialized");
klass_load_size = MacroAssembler::instr_size_for_decode_klass_not_null() + 1*BytesPerInstWord;
} else {
@@ -1657,7 +1657,7 @@
void MachUEPNode::format( PhaseRegAlloc *ra_, outputStream *st ) const {
st->print_cr("\nUEP:");
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
assert(Universe::heap() != NULL, "java heap should be initialized");
st->print_cr("\tLDUW [R_O0 + oopDesc::klass_offset_in_bytes],R_G5\t! Inline cache check - compressed klass");
st->print_cr("\tSET Universe::narrow_klass_base,R_G6_heap_base");
@@ -1897,7 +1897,7 @@
bool Matcher::narrow_klass_use_complex_address() {
NOT_LP64(ShouldNotCallThis());
- assert(UseCompressedKlassPointers, "only for compressed klass code");
+ assert(UseCompressedClassPointers, "only for compressed klass code");
return false;
}
@@ -2018,6 +2018,15 @@
return L7_REGP_mask();
}
+const RegMask Matcher::mathExactI_result_proj_mask() {
+ return G1_REGI_mask();
+}
+
+const RegMask Matcher::mathExactI_flags_proj_mask() {
+ return INT_FLAGS_mask();
+}
+
+
%}
@@ -2561,7 +2570,7 @@
int off = __ offset();
__ load_klass(O0, G3_scratch);
int klass_load_size;
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
assert(Universe::heap() != NULL, "java heap should be initialized");
klass_load_size = MacroAssembler::instr_size_for_decode_klass_not_null() + 1*BytesPerInstWord;
} else {
@@ -4245,12 +4254,16 @@
greater_equal(0xB);
less_equal(0x2);
greater(0xA);
+ overflow(0x7);
+ no_overflow(0xF);
%}
%}
// Comparison Op, unsigned
operand cmpOpU() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "u" %}
interface(COND_INTER) %{
@@ -4260,12 +4273,16 @@
greater_equal(0xD);
less_equal(0x4);
greater(0xC);
+ overflow(0x7);
+ no_overflow(0xF);
%}
%}
// Comparison Op, pointer (same as unsigned)
operand cmpOpP() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "p" %}
interface(COND_INTER) %{
@@ -4275,12 +4292,16 @@
greater_equal(0xD);
less_equal(0x4);
greater(0xC);
+ overflow(0x7);
+ no_overflow(0xF);
%}
%}
// Comparison Op, branch-register encoding
operand cmpOp_reg() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "" %}
interface(COND_INTER) %{
@@ -4290,12 +4311,16 @@
greater_equal(0x7);
less_equal (0x2);
greater (0x6);
+ overflow(0x7); // not supported
+ no_overflow(0xF); // not supported
%}
%}
// Comparison Code, floating, unordered same as less
operand cmpOpF() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "fl" %}
interface(COND_INTER) %{
@@ -4305,12 +4330,17 @@
greater_equal(0xB);
less_equal(0xE);
greater(0x6);
+
+ overflow(0x7); // not supported
+ no_overflow(0xF); // not supported
%}
%}
// Used by long compare
operand cmpOp_commute() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "" %}
interface(COND_INTER) %{
@@ -4320,6 +4350,8 @@
greater_equal(0x2);
less_equal(0xB);
greater(0x3);
+ overflow(0x7);
+ no_overflow(0xF);
%}
%}
--- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -2945,7 +2945,7 @@
BLOCK_COMMENT("arraycopy argument klass checks");
// get src->klass()
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ delayed()->nop(); // ??? not good
__ load_klass(src, G3_src_klass);
} else {
@@ -2980,7 +2980,7 @@
// Load 32-bits signed value. Use br() instruction with it to check icc.
__ lduw(G3_src_klass, lh_offset, G5_lh);
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ load_klass(dst, G4_dst_klass);
}
// Handle objArrays completely differently...
@@ -2988,7 +2988,7 @@
__ set(objArray_lh, O5_temp);
__ cmp(G5_lh, O5_temp);
__ br(Assembler::equal, false, Assembler::pt, L_objArray);
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ delayed()->nop();
} else {
__ delayed()->ld_ptr(dst, oopDesc::klass_offset_in_bytes(), G4_dst_klass);
--- a/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -52,6 +52,11 @@
VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
const int sparc_code_length = VtableStub::pd_code_size_limit(true);
VtableStub* s = new(sparc_code_length) VtableStub(true, vtable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), sparc_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
@@ -125,6 +130,11 @@
VtableStub* VtableStubs::create_itable_stub(int itable_index) {
const int sparc_code_length = VtableStub::pd_code_size_limit(false);
VtableStub* s = new(sparc_code_length) VtableStub(false, itable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), sparc_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
@@ -218,13 +228,13 @@
// ld;ld;ld,jmp,nop
const int basic = 5*BytesPerInstWord +
// shift;add for load_klass (only shift with zero heap based)
- (UseCompressedKlassPointers ?
+ (UseCompressedClassPointers ?
MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
return basic + slop;
} else {
const int basic = (28 LP64_ONLY(+ 6)) * BytesPerInstWord +
// shift;add for load_klass (only shift with zero heap based)
- (UseCompressedKlassPointers ?
+ (UseCompressedClassPointers ?
MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
return (basic + slop);
}
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -4769,7 +4769,7 @@
}
void Assembler::adcq(Register dst, Register src) {
- (int) prefixq_and_encode(dst->encoding(), src->encoding());
+ (void) prefixq_and_encode(dst->encoding(), src->encoding());
emit_arith(0x13, 0xC0, dst, src);
}
@@ -4824,7 +4824,7 @@
}
void Assembler::andq(Register dst, Register src) {
- (int) prefixq_and_encode(dst->encoding(), src->encoding());
+ (void) prefixq_and_encode(dst->encoding(), src->encoding());
emit_arith(0x23, 0xC0, dst, src);
}
--- a/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_FrameMap_x86.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -148,7 +148,7 @@
static int adjust_reg_range(int range) {
// Reduce the number of available regs (to free r12) in case of compressed oops
- if (UseCompressedOops || UseCompressedKlassPointers) return range - 1;
+ if (UseCompressedOops || UseCompressedClassPointers) return range - 1;
return range;
}
--- a/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -341,7 +341,7 @@
Register receiver = FrameMap::receiver_opr->as_register();
Register ic_klass = IC_Klass;
const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
- const bool do_post_padding = VerifyOops || UseCompressedKlassPointers;
+ const bool do_post_padding = VerifyOops || UseCompressedClassPointers;
if (!do_post_padding) {
// insert some nops so that the verified entry point is aligned on CodeEntryAlignment
while ((__ offset() + ic_cmp_size) % CodeEntryAlignment != 0) {
@@ -1263,7 +1263,7 @@
break;
case T_ADDRESS:
- if (UseCompressedKlassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
+ if (UseCompressedClassPointers && addr->disp() == oopDesc::klass_offset_in_bytes()) {
__ movl(dest->as_register(), from_addr);
} else {
__ movptr(dest->as_register(), from_addr);
@@ -1371,7 +1371,7 @@
__ verify_oop(dest->as_register());
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ decode_klass_not_null(dest->as_register());
}
#endif
@@ -1716,7 +1716,7 @@
} else if (obj == klass_RInfo) {
klass_RInfo = dst;
}
- if (k->is_loaded() && !UseCompressedKlassPointers) {
+ if (k->is_loaded() && !UseCompressedClassPointers) {
select_different_registers(obj, dst, k_RInfo, klass_RInfo);
} else {
Rtmp1 = op->tmp3()->as_register();
@@ -1724,14 +1724,6 @@
}
assert_different_registers(obj, k_RInfo, klass_RInfo);
- if (!k->is_loaded()) {
- klass2reg_with_patching(k_RInfo, op->info_for_patch());
- } else {
-#ifdef _LP64
- __ mov_metadata(k_RInfo, k->constant_encoding());
-#endif // _LP64
- }
- assert(obj != k_RInfo, "must be different");
__ cmpptr(obj, (int32_t)NULL_WORD);
if (op->should_profile()) {
@@ -1748,13 +1740,21 @@
} else {
__ jcc(Assembler::equal, *obj_is_null);
}
+
+ if (!k->is_loaded()) {
+ klass2reg_with_patching(k_RInfo, op->info_for_patch());
+ } else {
+#ifdef _LP64
+ __ mov_metadata(k_RInfo, k->constant_encoding());
+#endif // _LP64
+ }
__ verify_oop(obj);
if (op->fast_check()) {
// get object class
// not a safepoint as obj null check happens earlier
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ load_klass(Rtmp1, obj);
__ cmpptr(k_RInfo, Rtmp1);
} else {
@@ -3294,7 +3294,7 @@
// We don't know the array types are compatible
if (basic_type != T_OBJECT) {
// Simple test for basic type arrays
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ movl(tmp, src_klass_addr);
__ cmpl(tmp, dst_klass_addr);
} else {
@@ -3456,21 +3456,21 @@
Label known_ok, halt;
__ mov_metadata(tmp, default_type->constant_encoding());
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
__ encode_klass_not_null(tmp);
}
#endif
if (basic_type != T_OBJECT) {
- if (UseCompressedKlassPointers) __ cmpl(tmp, dst_klass_addr);
+ if (UseCompressedClassPointers) __ cmpl(tmp, dst_klass_addr);
else __ cmpptr(tmp, dst_klass_addr);
__ jcc(Assembler::notEqual, halt);
- if (UseCompressedKlassPointers) __ cmpl(tmp, src_klass_addr);
+ if (UseCompressedClassPointers) __ cmpl(tmp, src_klass_addr);
else __ cmpptr(tmp, src_klass_addr);
__ jcc(Assembler::equal, known_ok);
} else {
- if (UseCompressedKlassPointers) __ cmpl(tmp, dst_klass_addr);
+ if (UseCompressedClassPointers) __ cmpl(tmp, dst_klass_addr);
else __ cmpptr(tmp, dst_klass_addr);
__ jcc(Assembler::equal, known_ok);
__ cmpptr(src, dst);
--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1239,7 +1239,7 @@
}
LIR_Opr reg = rlock_result(x);
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
- if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
+ if (!x->klass()->is_loaded() || UseCompressedClassPointers) {
tmp3 = new_register(objectType);
}
__ checkcast(reg, obj.result(), x->klass(),
@@ -1261,7 +1261,7 @@
}
obj.load_item();
LIR_Opr tmp3 = LIR_OprFact::illegalOpr;
- if (!x->klass()->is_loaded() || UseCompressedKlassPointers) {
+ if (!x->klass()->is_loaded() || UseCompressedClassPointers) {
tmp3 = new_register(objectType);
}
__ instanceof(reg, obj.result(), x->klass(),
--- a/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/c1_MacroAssembler_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -157,7 +157,7 @@
movptr(Address(obj, oopDesc::mark_offset_in_bytes ()), (int32_t)(intptr_t)markOopDesc::prototype());
}
#ifdef _LP64
- if (UseCompressedKlassPointers) { // Take care not to kill klass
+ if (UseCompressedClassPointers) { // Take care not to kill klass
movptr(t1, klass);
encode_klass_not_null(t1);
movl(Address(obj, oopDesc::klass_offset_in_bytes()), t1);
@@ -171,7 +171,7 @@
movl(Address(obj, arrayOopDesc::length_offset_in_bytes()), len);
}
#ifdef _LP64
- else if (UseCompressedKlassPointers) {
+ else if (UseCompressedClassPointers) {
xorptr(t1, t1);
store_klass_gap(obj, t1);
}
@@ -334,7 +334,7 @@
assert(!MacroAssembler::needs_explicit_null_check(oopDesc::klass_offset_in_bytes()), "must add explicit null check");
int start_offset = offset();
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
load_klass(rscratch1, receiver);
cmpptr(rscratch1, iCache);
} else {
@@ -345,7 +345,7 @@
jump_cc(Assembler::notEqual,
RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
const int ic_cmp_size = LP64_ONLY(10) NOT_LP64(9);
- assert(UseCompressedKlassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
+ assert(UseCompressedClassPointers || offset() - start_offset == ic_cmp_size, "check alignment in emit_method_entry");
}
--- a/hotspot/src/cpu/x86/vm/frame_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -639,7 +639,7 @@
#ifdef CC_INTERP
obj = istate->_oop_temp;
#else
- obj = (oop) at(interpreter_frame_oop_temp_offset);
+ obj = cast_to_oop(at(interpreter_frame_oop_temp_offset));
#endif // CC_INTERP
} else {
oop* obj_p = (oop*)tos_addr;
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1635,7 +1635,7 @@
#ifdef ASSERT
// TraceBytecodes does not use r12 but saves it over the call, so don't verify
// r12 is the heapbase.
- LP64_ONLY(if ((UseCompressedOops || UseCompressedKlassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");)
+ LP64_ONLY(if ((UseCompressedOops || UseCompressedClassPointers) && !TraceBytecodes) verify_heapbase("call_VM_base: heap base corrupted?");)
#endif // ASSERT
assert(java_thread != oop_result , "cannot use the same register for java_thread & oop_result");
@@ -4802,7 +4802,7 @@
void MacroAssembler::load_klass(Register dst, Register src) {
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
decode_klass_not_null(dst);
} else
@@ -4817,7 +4817,7 @@
void MacroAssembler::store_klass(Register dst, Register src) {
#ifdef _LP64
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
encode_klass_not_null(src);
movl(Address(dst, oopDesc::klass_offset_in_bytes()), src);
} else
@@ -4892,7 +4892,7 @@
#ifdef _LP64
void MacroAssembler::store_klass_gap(Register dst, Register src) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// Store to klass gap in destination
movl(Address(dst, oopDesc::klass_gap_offset_in_bytes()), src);
}
@@ -5075,7 +5075,7 @@
// when (Universe::heap() != NULL). Hence, if the instructions they
// generate change, then this method needs to be updated.
int MacroAssembler::instr_size_for_decode_klass_not_null() {
- assert (UseCompressedKlassPointers, "only for compressed klass ptrs");
+ assert (UseCompressedClassPointers, "only for compressed klass ptrs");
// mov64 + addq + shlq? + mov64 (for reinit_heapbase()).
return (Universe::narrow_klass_shift() == 0 ? 20 : 24);
}
@@ -5085,7 +5085,7 @@
void MacroAssembler::decode_klass_not_null(Register r) {
// Note: it will change flags
assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert(r != r12_heapbase, "Decoding a klass in r12");
// Cannot assert, unverified entry point counts instructions (see .ad file)
// vtableStubs also counts instructions in pd_code_size_limit.
@@ -5103,7 +5103,7 @@
void MacroAssembler::decode_klass_not_null(Register dst, Register src) {
// Note: it will change flags
assert(Universe::narrow_klass_base() != NULL, "Base should be initialized");
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
if (dst == src) {
decode_klass_not_null(dst);
} else {
@@ -5141,7 +5141,7 @@
}
void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
int klass_index = oop_recorder()->find_index(k);
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
@@ -5149,7 +5149,7 @@
}
void MacroAssembler::set_narrow_klass(Address dst, Klass* k) {
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
int klass_index = oop_recorder()->find_index(k);
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
@@ -5175,7 +5175,7 @@
}
void MacroAssembler::cmp_narrow_klass(Register dst, Klass* k) {
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
int klass_index = oop_recorder()->find_index(k);
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
@@ -5183,7 +5183,7 @@
}
void MacroAssembler::cmp_narrow_klass(Address dst, Klass* k) {
- assert (UseCompressedKlassPointers, "should only be used for compressed headers");
+ assert (UseCompressedClassPointers, "should only be used for compressed headers");
assert (oop_recorder() != NULL, "this assembler needs an OopRecorder");
int klass_index = oop_recorder()->find_index(k);
RelocationHolder rspec = metadata_Relocation::spec(klass_index);
@@ -5191,7 +5191,7 @@
}
void MacroAssembler::reinit_heapbase() {
- if (UseCompressedOops || UseCompressedKlassPointers) {
+ if (UseCompressedOops || UseCompressedClassPointers) {
if (Universe::heap() != NULL) {
if (Universe::narrow_oop_base() == NULL) {
MacroAssembler::xorptr(r12_heapbase, r12_heapbase);
--- a/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -114,6 +114,11 @@
void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp,
bool for_compiler_entry) {
assert(method == rbx, "interpreter calling convention");
+
+ Label L_no_such_method;
+ __ testptr(rbx, rbx);
+ __ jcc(Assembler::zero, L_no_such_method);
+
__ verify_method_ptr(method);
if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) {
@@ -138,6 +143,9 @@
const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() :
Method::from_interpreted_offset();
__ jmp(Address(method, entry_offset));
+
+ __ bind(L_no_such_method);
+ __ jump(RuntimeAddress(StubRoutines::throw_AbstractMethodError_entry()));
}
void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm,
@@ -475,7 +483,7 @@
const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx";
tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT,
adaptername, mh_reg_name,
- mh, entry_sp);
+ (void *)mh, entry_sp);
if (Verbose) {
tty->print_cr("Registers:");
--- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -34,9 +34,9 @@
// Run with +PrintInterpreter to get the VM to print out the size.
// Max size with JVMTI
#ifdef AMD64
- const static int InterpreterCodeSize = 200 * 1024;
+ const static int InterpreterCodeSize = 208 * 1024;
#else
- const static int InterpreterCodeSize = 168 * 1024;
+ const static int InterpreterCodeSize = 176 * 1024;
#endif // AMD64
#endif // CPU_X86_VM_TEMPLATEINTERPRETER_X86_HPP
--- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -58,6 +58,11 @@
VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
const int i486_code_length = VtableStub::pd_code_size_limit(true);
VtableStub* s = new(i486_code_length) VtableStub(true, vtable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), i486_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
@@ -132,6 +137,11 @@
// add code here, bump the code stub size returned by pd_code_size_limit!
const int i486_code_length = VtableStub::pd_code_size_limit(false);
VtableStub* s = new(i486_code_length) VtableStub(false, itable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), i486_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
--- a/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -49,6 +49,11 @@
VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
const int amd64_code_length = VtableStub::pd_code_size_limit(true);
VtableStub* s = new(amd64_code_length) VtableStub(true, vtable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), amd64_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
@@ -126,6 +131,11 @@
// returned by pd_code_size_limit!
const int amd64_code_length = VtableStub::pd_code_size_limit(false);
VtableStub* s = new(amd64_code_length) VtableStub(false, itable_index);
+ // Can be NULL if there is no free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
ResourceMark rm;
CodeBuffer cb(s->entry_point(), amd64_code_length);
MacroAssembler* masm = new MacroAssembler(&cb);
@@ -211,11 +221,11 @@
if (is_vtable_stub) {
// Vtable stub size
return (DebugVtables ? 512 : 24) + (CountCompiledCalls ? 13 : 0) +
- (UseCompressedKlassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
+ (UseCompressedClassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
} else {
// Itable stub size
return (DebugVtables ? 512 : 74) + (CountCompiledCalls ? 13 : 0) +
- (UseCompressedKlassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
+ (UseCompressedClassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
}
// In order to tune these parameters, run the JVM with VM options
// +PrintMiscellaneous and +WizardMode to see information about
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Thu Oct 03 19:18:54 2013 +0100
@@ -351,7 +351,7 @@
int format) {
#ifdef ASSERT
if (rspec.reloc()->type() == relocInfo::oop_type && d32 != 0 && d32 != (int)Universe::non_oop_word()) {
- assert(oop(d32)->is_oop() && (ScavengeRootsInCode || !oop(d32)->is_scavengable()), "cannot embed scavengable oops in code");
+ assert(cast_to_oop(d32)->is_oop() && (ScavengeRootsInCode || !cast_to_oop(d32)->is_scavengable()), "cannot embed scavengable oops in code");
}
#endif
cbuf.relocate(cbuf.insts_mark(), rspec, format);
@@ -1534,6 +1534,14 @@
return EBP_REG_mask();
}
+const RegMask Matcher::mathExactI_result_proj_mask() {
+ return EAX_REG_mask();
+}
+
+const RegMask Matcher::mathExactI_flags_proj_mask() {
+ return INT_FLAGS_mask();
+}
+
// Returns true if the high 32 bits of the value is known to be zero.
bool is_operand_hi32_zero(Node* n) {
int opc = n->Opcode();
@@ -4922,6 +4930,8 @@
greater_equal(0xD, "ge");
less_equal(0xE, "le");
greater(0xF, "g");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4939,6 +4949,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4957,6 +4969,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4974,6 +4988,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4981,6 +4997,8 @@
operand cmpOp_fcmov() %{
match(Bool);
+ predicate(n->as_Bool()->_test._test != BoolTest::overflow &&
+ n->as_Bool()->_test._test != BoolTest::no_overflow);
format %{ "" %}
interface(COND_INTER) %{
equal (0x0C8);
@@ -4989,6 +5007,8 @@
greater_equal(0x1C0);
less_equal (0x0D0);
greater (0x1D0);
+ overflow(0x0, "o"); // not really supported by the instruction
+ no_overflow(0x1, "no"); // not really supported by the instruction
%}
%}
@@ -5004,6 +5024,8 @@
greater_equal(0xE, "le");
less_equal(0xD, "ge");
greater(0xC, "l");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -7496,6 +7518,31 @@
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
+
+instruct addExactI_rReg(eAXRegI dst, rRegI src, eFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "ADD $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactI_rReg_imm(eAXRegI dst, immI src, eFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "ADD $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
// Integer Addition Instructions
instruct addI_eReg(rRegI dst, rRegI src, eFlagsReg cr) %{
match(Set dst (AddI dst src));
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Thu Oct 03 19:18:54 2013 +0100
@@ -529,7 +529,7 @@
if (rspec.reloc()->type() == relocInfo::oop_type &&
d32 != 0 && d32 != (intptr_t) Universe::non_oop_word()) {
assert(Universe::heap()->is_in_reserved((address)(intptr_t)d32), "should be real oop");
- assert(oop((intptr_t)d32)->is_oop() && (ScavengeRootsInCode || !oop((intptr_t)d32)->is_scavengable()), "cannot embed scavengable oops in code");
+ assert(cast_to_oop((intptr_t)d32)->is_oop() && (ScavengeRootsInCode || !cast_to_oop((intptr_t)d32)->is_scavengable()), "cannot embed scavengable oops in code");
}
#endif
cbuf.relocate(cbuf.insts_mark(), rspec, format);
@@ -556,7 +556,7 @@
if (rspec.reloc()->type() == relocInfo::oop_type &&
d64 != 0 && d64 != (int64_t) Universe::non_oop_word()) {
assert(Universe::heap()->is_in_reserved((address)d64), "should be real oop");
- assert(oop(d64)->is_oop() && (ScavengeRootsInCode || !oop(d64)->is_scavengable()),
+ assert(cast_to_oop(d64)->is_oop() && (ScavengeRootsInCode || !cast_to_oop(d64)->is_scavengable()),
"cannot embed scavengable oops in code");
}
#endif
@@ -1391,7 +1391,7 @@
#ifndef PRODUCT
void MachUEPNode::format(PhaseRegAlloc* ra_, outputStream* st) const
{
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
st->print_cr("movl rscratch1, [j_rarg0 + oopDesc::klass_offset_in_bytes()]\t# compressed klass");
st->print_cr("\tdecode_klass_not_null rscratch1, rscratch1");
st->print_cr("\tcmpq rax, rscratch1\t # Inline cache check");
@@ -1408,7 +1408,7 @@
{
MacroAssembler masm(&cbuf);
uint insts_size = cbuf.insts_size();
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
masm.load_klass(rscratch1, j_rarg0);
masm.cmpptr(rax, rscratch1);
} else {
@@ -1557,7 +1557,7 @@
}
bool Matcher::narrow_klass_use_complex_address() {
- assert(UseCompressedKlassPointers, "only for compressed klass code");
+ assert(UseCompressedClassPointers, "only for compressed klass code");
return (LogKlassAlignmentInBytes <= 3);
}
@@ -1649,6 +1649,14 @@
return PTR_RBP_REG_mask();
}
+const RegMask Matcher::mathExactI_result_proj_mask() {
+ return INT_RAX_REG_mask();
+}
+
+const RegMask Matcher::mathExactI_flags_proj_mask() {
+ return INT_FLAGS_mask();
+}
+
%}
//----------ENCODING BLOCK-----------------------------------------------------
@@ -4133,6 +4141,8 @@
greater_equal(0xD, "ge");
less_equal(0xE, "le");
greater(0xF, "g");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4151,6 +4161,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4170,6 +4182,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -4187,6 +4201,8 @@
greater_equal(0x3, "nb");
less_equal(0x6, "be");
greater(0x7, "nbe");
+ overflow(0x0, "o");
+ no_overflow(0x1, "no");
%}
%}
@@ -6922,6 +6938,30 @@
//----------Arithmetic Instructions--------------------------------------------
//----------Addition Instructions----------------------------------------------
+instruct addExactI_rReg(rax_RegI dst, rRegI src, rFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "addl $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$Register);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
+instruct addExactI_rReg_imm(rax_RegI dst, immI src, rFlagsReg cr)
+%{
+ match(AddExactI dst src);
+ effect(DEF cr);
+
+ format %{ "addl $dst, $src\t# addExact int" %}
+ ins_encode %{
+ __ addl($dst$$Register, $src$$constant);
+ %}
+ ins_pipe(ialu_reg_reg);
+%}
+
instruct addI_rReg(rRegI dst, rRegI src, rFlagsReg cr)
%{
match(Set dst (AddI dst src));
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -3589,8 +3589,6 @@
#endif
}
- os::large_page_init();
-
// initialize suspend/resume support - must do this before signal_sets_init()
if (SR_initialize() != 0) {
perror("SR_initialize failed");
--- a/hotspot/src/os/linux/vm/os_linux.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -131,6 +131,7 @@
bool os::Linux::_supports_fast_thread_cpu_time = false;
const char * os::Linux::_glibc_version = NULL;
const char * os::Linux::_libpthread_version = NULL;
+pthread_condattr_t os::Linux::_condattr[1];
static jlong initial_time_count=0;
@@ -1399,12 +1400,15 @@
clock_gettime_func(CLOCK_MONOTONIC, &tp) == 0) {
// yes, monotonic clock is supported
_clock_gettime = clock_gettime_func;
+ return;
} else {
// close librt if there is no monotonic clock
dlclose(handle);
}
}
}
+ warning("No monotonic clock was available - timed services may " \
+ "be adversely affected if the time-of-day clock changes");
}
#ifndef SYS_clock_getres
@@ -2165,23 +2169,49 @@
}
// Try to identify popular distros.
-// Most Linux distributions have /etc/XXX-release file, which contains
-// the OS version string. Some have more than one /etc/XXX-release file
-// (e.g. Mandrake has both /etc/mandrake-release and /etc/redhat-release.),
-// so the order is important.
+// Most Linux distributions have a /etc/XXX-release file, which contains
+// the OS version string. Newer Linux distributions have a /etc/lsb-release
+// file that also contains the OS version string. Some have more than one
+// /etc/XXX-release file (e.g. Mandrake has both /etc/mandrake-release and
+// /etc/redhat-release.), so the order is important.
+// Any Linux that is based on Redhat (i.e. Oracle, Mandrake, Sun JDS...) have
+// their own specific XXX-release file as well as a redhat-release file.
+// Because of this the XXX-release file needs to be searched for before the
+// redhat-release file.
+// Since Red Hat has a lsb-release file that is not very descriptive the
+// search for redhat-release needs to be before lsb-release.
+// Since the lsb-release file is the new standard it needs to be searched
+// before the older style release files.
+// Searching system-release (Red Hat) and os-release (other Linuxes) are a
+// next to last resort. The os-release file is a new standard that contains
+// distribution information and the system-release file seems to be an old
+// standard that has been replaced by the lsb-release and os-release files.
+// Searching for the debian_version file is the last resort. It contains
+// an informative string like "6.0.6" or "wheezy/sid". Because of this
+// "Debian " is printed before the contents of the debian_version file.
void os::Linux::print_distro_info(outputStream* st) {
- if (!_print_ascii_file("/etc/mandrake-release", st) &&
- !_print_ascii_file("/etc/sun-release", st) &&
- !_print_ascii_file("/etc/redhat-release", st) &&
- !_print_ascii_file("/etc/SuSE-release", st) &&
- !_print_ascii_file("/etc/turbolinux-release", st) &&
- !_print_ascii_file("/etc/gentoo-release", st) &&
- !_print_ascii_file("/etc/debian_version", st) &&
- !_print_ascii_file("/etc/ltib-release", st) &&
- !_print_ascii_file("/etc/angstrom-version", st)) {
- st->print("Linux");
- }
- st->cr();
+ if (!_print_ascii_file("/etc/oracle-release", st) &&
+ !_print_ascii_file("/etc/mandriva-release", st) &&
+ !_print_ascii_file("/etc/mandrake-release", st) &&
+ !_print_ascii_file("/etc/sun-release", st) &&
+ !_print_ascii_file("/etc/redhat-release", st) &&
+ !_print_ascii_file("/etc/lsb-release", st) &&
+ !_print_ascii_file("/etc/SuSE-release", st) &&
+ !_print_ascii_file("/etc/turbolinux-release", st) &&
+ !_print_ascii_file("/etc/gentoo-release", st) &&
+ !_print_ascii_file("/etc/ltib-release", st) &&
+ !_print_ascii_file("/etc/angstrom-version", st) &&
+ !_print_ascii_file("/etc/system-release", st) &&
+ !_print_ascii_file("/etc/os-release", st)) {
+
+ if (file_exists("/etc/debian_version")) {
+ st->print("Debian ");
+ _print_ascii_file("/etc/debian_version", st);
+ } else {
+ st->print("Linux");
+ }
+ }
+ st->cr();
}
void os::Linux::print_libversion_info(outputStream* st) {
@@ -4709,6 +4739,26 @@
Linux::clock_init();
initial_time_count = os::elapsed_counter();
+
+ // pthread_condattr initialization for monotonic clock
+ int status;
+ pthread_condattr_t* _condattr = os::Linux::condAttr();
+ if ((status = pthread_condattr_init(_condattr)) != 0) {
+ fatal(err_msg("pthread_condattr_init: %s", strerror(status)));
+ }
+ // Only set the clock if CLOCK_MONOTONIC is available
+ if (Linux::supports_monotonic_clock()) {
+ if ((status = pthread_condattr_setclock(_condattr, CLOCK_MONOTONIC)) != 0) {
+ if (status == EINVAL) {
+ warning("Unable to use monotonic clock with relative timed-waits" \
+ " - changes to the time-of-day clock may have adverse affects");
+ } else {
+ fatal(err_msg("pthread_condattr_setclock: %s", strerror(status)));
+ }
+ }
+ }
+ // else it defaults to CLOCK_REALTIME
+
pthread_mutex_init(&dl_mutex, NULL);
// If the pagesize of the VM is greater than 8K determine the appropriate
@@ -4755,8 +4805,6 @@
#endif
}
- os::large_page_init();
-
// initialize suspend/resume support - must do this before signal_sets_init()
if (SR_initialize() != 0) {
perror("SR_initialize failed");
@@ -4791,6 +4839,10 @@
Linux::capture_initial_stack(JavaThread::stack_size_at_create());
+#if defined(IA32)
+ workaround_expand_exec_shield_cs_limit();
+#endif
+
Linux::libpthread_init();
if (PrintMiscellaneous && (Verbose || WizardMode)) {
tty->print_cr("[HotSpot is running with %s, %s(%s)]\n",
@@ -5519,21 +5571,36 @@
static struct timespec* compute_abstime(timespec* abstime, jlong millis) {
if (millis < 0) millis = 0;
- struct timeval now;
- int status = gettimeofday(&now, NULL);
- assert(status == 0, "gettimeofday");
+
jlong seconds = millis / 1000;
millis %= 1000;
if (seconds > 50000000) { // see man cond_timedwait(3T)
seconds = 50000000;
}
- abstime->tv_sec = now.tv_sec + seconds;
- long usec = now.tv_usec + millis * 1000;
- if (usec >= 1000000) {
- abstime->tv_sec += 1;
- usec -= 1000000;
- }
- abstime->tv_nsec = usec * 1000;
+
+ if (os::Linux::supports_monotonic_clock()) {
+ struct timespec now;
+ int status = os::Linux::clock_gettime(CLOCK_MONOTONIC, &now);
+ assert_status(status == 0, status, "clock_gettime");
+ abstime->tv_sec = now.tv_sec + seconds;
+ long nanos = now.tv_nsec + millis * NANOSECS_PER_MILLISEC;
+ if (nanos >= NANOSECS_PER_SEC) {
+ abstime->tv_sec += 1;
+ nanos -= NANOSECS_PER_SEC;
+ }
+ abstime->tv_nsec = nanos;
+ } else {
+ struct timeval now;
+ int status = gettimeofday(&now, NULL);
+ assert(status == 0, "gettimeofday");
+ abstime->tv_sec = now.tv_sec + seconds;
+ long usec = now.tv_usec + millis * 1000;
+ if (usec >= 1000000) {
+ abstime->tv_sec += 1;
+ usec -= 1000000;
+ }
+ abstime->tv_nsec = usec * 1000;
+ }
return abstime;
}
@@ -5625,7 +5692,7 @@
status = os::Linux::safe_cond_timedwait(_cond, _mutex, &abst);
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
pthread_cond_destroy (_cond);
- pthread_cond_init (_cond, NULL) ;
+ pthread_cond_init (_cond, os::Linux::condAttr()) ;
}
assert_status(status == 0 || status == EINTR ||
status == ETIME || status == ETIMEDOUT,
@@ -5726,32 +5793,50 @@
static void unpackTime(timespec* absTime, bool isAbsolute, jlong time) {
assert (time > 0, "convertTime");
-
- struct timeval now;
- int status = gettimeofday(&now, NULL);
- assert(status == 0, "gettimeofday");
-
- time_t max_secs = now.tv_sec + MAX_SECS;
-
- if (isAbsolute) {
- jlong secs = time / 1000;
- if (secs > max_secs) {
- absTime->tv_sec = max_secs;
+ time_t max_secs = 0;
+
+ if (!os::Linux::supports_monotonic_clock() || isAbsolute) {
+ struct timeval now;
+ int status = gettimeofday(&now, NULL);
+ assert(status == 0, "gettimeofday");
+
+ max_secs = now.tv_sec + MAX_SECS;
+
+ if (isAbsolute) {
+ jlong secs = time / 1000;
+ if (secs > max_secs) {
+ absTime->tv_sec = max_secs;
+ } else {
+ absTime->tv_sec = secs;
+ }
+ absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
+ } else {
+ jlong secs = time / NANOSECS_PER_SEC;
+ if (secs >= MAX_SECS) {
+ absTime->tv_sec = max_secs;
+ absTime->tv_nsec = 0;
+ } else {
+ absTime->tv_sec = now.tv_sec + secs;
+ absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
+ if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
+ absTime->tv_nsec -= NANOSECS_PER_SEC;
+ ++absTime->tv_sec; // note: this must be <= max_secs
+ }
+ }
}
- else {
- absTime->tv_sec = secs;
- }
- absTime->tv_nsec = (time % 1000) * NANOSECS_PER_MILLISEC;
- }
- else {
+ } else {
+ // must be relative using monotonic clock
+ struct timespec now;
+ int status = os::Linux::clock_gettime(CLOCK_MONOTONIC, &now);
+ assert_status(status == 0, status, "clock_gettime");
+ max_secs = now.tv_sec + MAX_SECS;
jlong secs = time / NANOSECS_PER_SEC;
if (secs >= MAX_SECS) {
absTime->tv_sec = max_secs;
absTime->tv_nsec = 0;
- }
- else {
+ } else {
absTime->tv_sec = now.tv_sec + secs;
- absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_usec*1000;
+ absTime->tv_nsec = (time % NANOSECS_PER_SEC) + now.tv_nsec;
if (absTime->tv_nsec >= NANOSECS_PER_SEC) {
absTime->tv_nsec -= NANOSECS_PER_SEC;
++absTime->tv_sec; // note: this must be <= max_secs
@@ -5831,15 +5916,19 @@
jt->set_suspend_equivalent();
// cleared by handle_special_suspend_equivalent_condition() or java_suspend_self()
+ assert(_cur_index == -1, "invariant");
if (time == 0) {
- status = pthread_cond_wait (_cond, _mutex) ;
+ _cur_index = REL_INDEX; // arbitrary choice when not timed
+ status = pthread_cond_wait (&_cond[_cur_index], _mutex) ;
} else {
- status = os::Linux::safe_cond_timedwait (_cond, _mutex, &absTime) ;
+ _cur_index = isAbsolute ? ABS_INDEX : REL_INDEX;
+ status = os::Linux::safe_cond_timedwait (&_cond[_cur_index], _mutex, &absTime) ;
if (status != 0 && WorkAroundNPTLTimedWaitHang) {
- pthread_cond_destroy (_cond) ;
- pthread_cond_init (_cond, NULL);
+ pthread_cond_destroy (&_cond[_cur_index]) ;
+ pthread_cond_init (&_cond[_cur_index], isAbsolute ? NULL : os::Linux::condAttr());
}
}
+ _cur_index = -1;
assert_status(status == 0 || status == EINTR ||
status == ETIME || status == ETIMEDOUT,
status, "cond_timedwait");
@@ -5868,17 +5957,24 @@
s = _counter;
_counter = 1;
if (s < 1) {
- if (WorkAroundNPTLTimedWaitHang) {
- status = pthread_cond_signal (_cond) ;
- assert (status == 0, "invariant") ;
+ // thread might be parked
+ if (_cur_index != -1) {
+ // thread is definitely parked
+ if (WorkAroundNPTLTimedWaitHang) {
+ status = pthread_cond_signal (&_cond[_cur_index]);
+ assert (status == 0, "invariant");
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
- } else {
+ assert (status == 0, "invariant");
+ } else {
status = pthread_mutex_unlock(_mutex);
- assert (status == 0, "invariant") ;
- status = pthread_cond_signal (_cond) ;
- assert (status == 0, "invariant") ;
- }
+ assert (status == 0, "invariant");
+ status = pthread_cond_signal (&_cond[_cur_index]);
+ assert (status == 0, "invariant");
+ }
+ } else {
+ pthread_mutex_unlock(_mutex);
+ assert (status == 0, "invariant") ;
+ }
} else {
pthread_mutex_unlock(_mutex);
assert (status == 0, "invariant") ;
--- a/hotspot/src/os/linux/vm/os_linux.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/linux/vm/os_linux.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -221,6 +221,13 @@
static jlong fast_thread_cpu_time(clockid_t clockid);
+ // pthread_cond clock suppport
+ private:
+ static pthread_condattr_t _condattr[1];
+
+ public:
+ static pthread_condattr_t* condAttr() { return _condattr; }
+
// Stack repair handling
// none present
@@ -295,7 +302,7 @@
public:
PlatformEvent() {
int status;
- status = pthread_cond_init (_cond, NULL);
+ status = pthread_cond_init (_cond, os::Linux::condAttr());
assert_status(status == 0, status, "cond_init");
status = pthread_mutex_init (_mutex, NULL);
assert_status(status == 0, status, "mutex_init");
@@ -310,14 +317,19 @@
void park () ;
void unpark () ;
int TryPark () ;
- int park (jlong millis) ;
+ int park (jlong millis) ; // relative timed-wait only
void SetAssociation (Thread * a) { _Assoc = a ; }
} ;
class PlatformParker : public CHeapObj<mtInternal> {
protected:
+ enum {
+ REL_INDEX = 0,
+ ABS_INDEX = 1
+ };
+ int _cur_index; // which cond is in use: -1, 0, 1
pthread_mutex_t _mutex [1] ;
- pthread_cond_t _cond [1] ;
+ pthread_cond_t _cond [2] ; // one for relative times and one for abs.
public: // TODO-FIXME: make dtor private
~PlatformParker() { guarantee (0, "invariant") ; }
@@ -325,10 +337,13 @@
public:
PlatformParker() {
int status;
- status = pthread_cond_init (_cond, NULL);
- assert_status(status == 0, status, "cond_init");
+ status = pthread_cond_init (&_cond[REL_INDEX], os::Linux::condAttr());
+ assert_status(status == 0, status, "cond_init rel");
+ status = pthread_cond_init (&_cond[ABS_INDEX], NULL);
+ assert_status(status == 0, status, "cond_init abs");
status = pthread_mutex_init (_mutex, NULL);
assert_status(status == 0, status, "mutex_init");
+ _cur_index = -1; // mark as unused
}
};
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -5178,9 +5178,7 @@
if(Verbose && PrintMiscellaneous)
tty->print("[Memory Serialize Page address: " INTPTR_FORMAT "]\n", (intptr_t)mem_serialize_page);
#endif
-}
-
- os::large_page_init();
+ }
// Check minimum allowable stack size for thread creation and to initialize
// the java system classes, including StackOverflowError - depends on page
--- a/hotspot/src/os/windows/vm/decoder_windows.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/windows/vm/decoder_windows.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,11 @@
_can_decode_in_vm = false;
_pfnSymGetSymFromAddr64 = NULL;
_pfnUndecorateSymbolName = NULL;
-
+#ifdef AMD64
+ _pfnStackWalk64 = NULL;
+ _pfnSymFunctionTableAccess64 = NULL;
+ _pfnSymGetModuleBase64 = NULL;
+#endif
_decoder_status = no_error;
initialize();
}
@@ -53,14 +57,24 @@
_pfnUndecorateSymbolName = (pfn_UndecorateSymbolName)::GetProcAddress(handle, "UnDecorateSymbolName");
if (_pfnSymSetOptions == NULL || _pfnSymInitialize == NULL || _pfnSymGetSymFromAddr64 == NULL) {
- _pfnSymGetSymFromAddr64 = NULL;
- _pfnUndecorateSymbolName = NULL;
- ::FreeLibrary(handle);
- _dbghelp_handle = NULL;
+ uninitialize();
_decoder_status = helper_func_error;
return;
}
+#ifdef AMD64
+ _pfnStackWalk64 = (pfn_StackWalk64)::GetProcAddress(handle, "StackWalk64");
+ _pfnSymFunctionTableAccess64 = (pfn_SymFunctionTableAccess64)::GetProcAddress(handle, "SymFunctionTableAccess64");
+ _pfnSymGetModuleBase64 = (pfn_SymGetModuleBase64)::GetProcAddress(handle, "SymGetModuleBase64");
+ if (_pfnStackWalk64 == NULL || _pfnSymFunctionTableAccess64 == NULL || _pfnSymGetModuleBase64 == NULL) {
+ // We can't call StackWalk64 to walk the stack, but we are still
+ // able to decode the symbols. Let's limp on.
+ _pfnStackWalk64 = NULL;
+ _pfnSymFunctionTableAccess64 = NULL;
+ _pfnSymGetModuleBase64 = NULL;
+ }
+#endif
+
HANDLE hProcess = ::GetCurrentProcess();
_pfnSymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS | SYMOPT_EXACT_SYMBOLS);
if (!_pfnSymInitialize(hProcess, NULL, TRUE)) {
@@ -156,6 +170,11 @@
void WindowsDecoder::uninitialize() {
_pfnSymGetSymFromAddr64 = NULL;
_pfnUndecorateSymbolName = NULL;
+#ifdef AMD64
+ _pfnStackWalk64 = NULL;
+ _pfnSymFunctionTableAccess64 = NULL;
+ _pfnSymGetModuleBase64 = NULL;
+#endif
if (_dbghelp_handle != NULL) {
::FreeLibrary(_dbghelp_handle);
}
@@ -195,3 +214,65 @@
_pfnUndecorateSymbolName(symbol, buf, buflen, UNDNAME_COMPLETE);
}
+#ifdef AMD64
+BOOL WindowsDbgHelp::StackWalk64(DWORD MachineType,
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPSTACKFRAME64 StackFrame,
+ PVOID ContextRecord,
+ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
+ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
+ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
+ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress) {
+ DecoderLocker locker;
+ WindowsDecoder* wd = (WindowsDecoder*)locker.decoder();
+
+ if (!wd->has_error() && wd->_pfnStackWalk64) {
+ return wd->_pfnStackWalk64(MachineType,
+ hProcess,
+ hThread,
+ StackFrame,
+ ContextRecord,
+ ReadMemoryRoutine,
+ FunctionTableAccessRoutine,
+ GetModuleBaseRoutine,
+ TranslateAddress);
+ } else {
+ return false;
+ }
+}
+
+PVOID WindowsDbgHelp::SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) {
+ DecoderLocker locker;
+ WindowsDecoder* wd = (WindowsDecoder*)locker.decoder();
+
+ if (!wd->has_error() && wd->_pfnSymFunctionTableAccess64) {
+ return wd->_pfnSymFunctionTableAccess64(hProcess, AddrBase);
+ } else {
+ return NULL;
+ }
+}
+
+pfn_SymFunctionTableAccess64 WindowsDbgHelp::pfnSymFunctionTableAccess64() {
+ DecoderLocker locker;
+ WindowsDecoder* wd = (WindowsDecoder*)locker.decoder();
+
+ if (!wd->has_error()) {
+ return wd->_pfnSymFunctionTableAccess64;
+ } else {
+ return NULL;
+ }
+}
+
+pfn_SymGetModuleBase64 WindowsDbgHelp::pfnSymGetModuleBase64() {
+ DecoderLocker locker;
+ WindowsDecoder* wd = (WindowsDecoder*)locker.decoder();
+
+ if (!wd->has_error()) {
+ return wd->_pfnSymGetModuleBase64;
+ } else {
+ return NULL;
+ }
+}
+
+#endif // AMD64
--- a/hotspot/src/os/windows/vm/decoder_windows.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/windows/vm/decoder_windows.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -38,6 +38,20 @@
typedef BOOL (WINAPI *pfn_SymSetSearchPath)(HANDLE, PCTSTR);
typedef BOOL (WINAPI *pfn_SymGetSearchPath)(HANDLE, PTSTR, int);
+#ifdef AMD64
+typedef BOOL (WINAPI *pfn_StackWalk64)(DWORD MachineType,
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPSTACKFRAME64 StackFrame,
+ PVOID ContextRecord,
+ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
+ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
+ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
+ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
+typedef PVOID (WINAPI *pfn_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);
+typedef DWORD64 (WINAPI *pfn_SymGetModuleBase64)(HANDLE hProcess, DWORD64 dwAddr);
+#endif
+
class WindowsDecoder : public AbstractDecoder {
public:
@@ -61,7 +75,34 @@
bool _can_decode_in_vm;
pfn_SymGetSymFromAddr64 _pfnSymGetSymFromAddr64;
pfn_UndecorateSymbolName _pfnUndecorateSymbolName;
+#ifdef AMD64
+ pfn_StackWalk64 _pfnStackWalk64;
+ pfn_SymFunctionTableAccess64 _pfnSymFunctionTableAccess64;
+ pfn_SymGetModuleBase64 _pfnSymGetModuleBase64;
+
+ friend class WindowsDbgHelp;
+#endif
};
+#ifdef AMD64
+// TODO: refactor and move the handling of dbghelp.dll outside of Decoder
+class WindowsDbgHelp : public Decoder {
+public:
+ static BOOL StackWalk64(DWORD MachineType,
+ HANDLE hProcess,
+ HANDLE hThread,
+ LPSTACKFRAME64 StackFrame,
+ PVOID ContextRecord,
+ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
+ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
+ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
+ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
+ static PVOID SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase);
+
+ static pfn_SymFunctionTableAccess64 pfnSymFunctionTableAccess64();
+ static pfn_SymGetModuleBase64 pfnSymGetModuleBase64();
+};
+#endif
+
#endif // OS_WINDOWS_VM_DECODER_WINDOWS_HPP
--- a/hotspot/src/os/windows/vm/os_windows.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -3189,9 +3189,12 @@
return p_buf;
} else {
+ if (TracePageSizes && Verbose) {
+ tty->print_cr("Reserving large pages in a single large chunk.");
+ }
// normal policy just allocate it all at once
DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
- char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
+ char * res = (char *)VirtualAlloc(addr, bytes, flag, prot);
if (res != NULL) {
address pc = CALLER_PC;
MemTracker::record_virtual_memory_reserve_and_commit((address)res, bytes, mtNone, pc);
@@ -3917,8 +3920,6 @@
#endif
}
- os::large_page_init();
-
// Setup Windows Exceptions
// for debugging float code generation bugs
@@ -5429,7 +5430,7 @@
if ((start = strrchr(lib_name, *os::file_separator())) != NULL) {
lib_name = ++start;
} else {
- // Need to check for C:
+ // Need to check for drive prefix
if ((start = strchr(lib_name, ':')) != NULL) {
lib_name = ++start;
}
@@ -5714,7 +5715,66 @@
#endif
#ifndef PRODUCT
+
+// test the code path in reserve_memory_special() that tries to allocate memory in a single
+// contiguous memory block at a particular address.
+// The test first tries to find a good approximate address to allocate at by using the same
+// method to allocate some memory at any address. The test then tries to allocate memory in
+// the vicinity (not directly after it to avoid possible by-chance use of that location)
+// This is of course only some dodgy assumption, there is no guarantee that the vicinity of
+// the previously allocated memory is available for allocation. The only actual failure
+// that is reported is when the test tries to allocate at a particular location but gets a
+// different valid one. A NULL return value at this point is not considered an error but may
+// be legitimate.
+// If -XX:+VerboseInternalVMTests is enabled, print some explanatory messages.
void TestReserveMemorySpecial_test() {
- // No tests available for this platform
-}
-#endif
+ if (!UseLargePages) {
+ if (VerboseInternalVMTests) {
+ gclog_or_tty->print("Skipping test because large pages are disabled");
+ }
+ return;
+ }
+ // save current value of globals
+ bool old_use_large_pages_individual_allocation = UseLargePagesIndividualAllocation;
+ bool old_use_numa_interleaving = UseNUMAInterleaving;
+
+ // set globals to make sure we hit the correct code path
+ UseLargePagesIndividualAllocation = UseNUMAInterleaving = false;
+
+ // do an allocation at an address selected by the OS to get a good one.
+ const size_t large_allocation_size = os::large_page_size() * 4;
+ char* result = os::reserve_memory_special(large_allocation_size, os::large_page_size(), NULL, false);
+ if (result == NULL) {
+ if (VerboseInternalVMTests) {
+ gclog_or_tty->print("Failed to allocate control block with size "SIZE_FORMAT". Skipping remainder of test.",
+ large_allocation_size);
+ }
+ } else {
+ os::release_memory_special(result, large_allocation_size);
+
+ // allocate another page within the recently allocated memory area which seems to be a good location. At least
+ // we managed to get it once.
+ const size_t expected_allocation_size = os::large_page_size();
+ char* expected_location = result + os::large_page_size();
+ char* actual_location = os::reserve_memory_special(expected_allocation_size, os::large_page_size(), expected_location, false);
+ if (actual_location == NULL) {
+ if (VerboseInternalVMTests) {
+ gclog_or_tty->print("Failed to allocate any memory at "PTR_FORMAT" size "SIZE_FORMAT". Skipping remainder of test.",
+ expected_location, large_allocation_size);
+ }
+ } else {
+ // release memory
+ os::release_memory_special(actual_location, expected_allocation_size);
+ // only now check, after releasing any memory to avoid any leaks.
+ assert(actual_location == expected_location,
+ err_msg("Failed to allocate memory at requested location "PTR_FORMAT" of size "SIZE_FORMAT", is "PTR_FORMAT" instead",
+ expected_location, expected_allocation_size, actual_location));
+ }
+ }
+
+ // restore globals
+ UseLargePagesIndividualAllocation = old_use_large_pages_individual_allocation;
+ UseNUMAInterleaving = old_use_numa_interleaving;
+}
+#endif // PRODUCT
+
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -876,3 +876,46 @@
#endif
}
#endif
+
+
+/*
+ * IA32 only: execute code at a high address in case buggy NX emulation is present. I.e. avoid CS limit
+ * updates (JDK-8023956).
+ */
+void os::workaround_expand_exec_shield_cs_limit() {
+#if defined(IA32)
+ size_t page_size = os::vm_page_size();
+ /*
+ * Take the highest VA the OS will give us and exec
+ *
+ * Although using -(pagesz) as mmap hint works on newer kernel as you would
+ * think, older variants affected by this work-around don't (search forward only).
+ *
+ * On the affected distributions, we understand the memory layout to be:
+ *
+ * TASK_LIMIT= 3G, main stack base close to TASK_LIMT.
+ *
+ * A few pages south main stack will do it.
+ *
+ * If we are embedded in an app other than launcher (initial != main stack),
+ * we don't have much control or understanding of the address space, just let it slide.
+ */
+ char* hint = (char*) (Linux::initial_thread_stack_bottom() -
+ ((StackYellowPages + StackRedPages + 1) * page_size));
+ char* codebuf = os::reserve_memory(page_size, hint);
+ if ( (codebuf == NULL) || (!os::commit_memory(codebuf, page_size, true)) ) {
+ return; // No matter, we tried, best effort.
+ }
+ if (PrintMiscellaneous && (Verbose || WizardMode)) {
+ tty->print_cr("[CS limit NX emulation work-around, exec code at: %p]", codebuf);
+ }
+
+ // Some code to exec: the 'ret' instruction
+ codebuf[0] = 0xC3;
+
+ // Call the code in the codebuf
+ __asm__ volatile("call *%0" : : "r"(codebuf));
+
+ // keep the page mapped so CS limit isn't reduced.
+#endif
+}
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -36,4 +36,17 @@
// Note: Currently only used in 64 bit Windows implementations
static bool register_code_area(char *low, char *high) { return true; }
+ /*
+ * Work-around for broken NX emulation using CS limit, Red Hat patch "Exec-Shield"
+ * (IA32 only).
+ *
+ * Map and execute at a high VA to prevent CS lazy updates race with SMP MM
+ * invalidation.Further code generation by the JVM will no longer cause CS limit
+ * updates.
+ *
+ * Affects IA32: RHEL 5 & 6, Ubuntu 10.04 (LTS), 10.10, 11.04, 11.10, 12.04.
+ * @see JDK-8023956
+ */
+ static void workaround_expand_exec_shield_cs_limit();
+
#endif // OS_CPU_LINUX_X86_VM_OS_LINUX_X86_HPP
--- a/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,9 @@
// Used on 64 bit platforms for UseCompressedOops base address
#ifdef _LP64
-define_pd_global(uintx, HeapBaseMinAddress, CONST64(4)*G);
+// use 6G as default base address because by default the OS maps the application
+// to 4G on Solaris-Sparc. This leaves at least 2G for the native heap.
+define_pd_global(uintx, HeapBaseMinAddress, CONST64(6)*G);
#else
define_pd_global(uintx, HeapBaseMinAddress, 2*G);
#endif
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -29,6 +29,7 @@
#include "classfile/vmSymbols.hpp"
#include "code/icBuffer.hpp"
#include "code/vtableStubs.hpp"
+#include "decoder_windows.hpp"
#include "interpreter/interpreter.hpp"
#include "jvm_windows.h"
#include "memory/allocation.inline.hpp"
@@ -327,6 +328,94 @@
cmpxchg_long_func_t* os::atomic_cmpxchg_long_func = os::atomic_cmpxchg_long_bootstrap;
+#ifdef AMD64
+/*
+ * Windows/x64 does not use stack frames the way expected by Java:
+ * [1] in most cases, there is no frame pointer. All locals are addressed via RSP
+ * [2] in rare cases, when alloca() is used, a frame pointer is used, but this may
+ * not be RBP.
+ * See http://msdn.microsoft.com/en-us/library/ew5tede7.aspx
+ *
+ * So it's not possible to print the native stack using the
+ * while (...) {... fr = os::get_sender_for_C_frame(&fr); }
+ * loop in vmError.cpp. We need to roll our own loop.
+ */
+bool os::platform_print_native_stack(outputStream* st, void* context,
+ char *buf, int buf_size)
+{
+ CONTEXT ctx;
+ if (context != NULL) {
+ memcpy(&ctx, context, sizeof(ctx));
+ } else {
+ RtlCaptureContext(&ctx);
+ }
+
+ st->print_cr("Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)");
+
+ STACKFRAME stk;
+ memset(&stk, 0, sizeof(stk));
+ stk.AddrStack.Offset = ctx.Rsp;
+ stk.AddrStack.Mode = AddrModeFlat;
+ stk.AddrFrame.Offset = ctx.Rbp;
+ stk.AddrFrame.Mode = AddrModeFlat;
+ stk.AddrPC.Offset = ctx.Rip;
+ stk.AddrPC.Mode = AddrModeFlat;
+
+ int count = 0;
+ address lastpc = 0;
+ while (count++ < StackPrintLimit) {
+ intptr_t* sp = (intptr_t*)stk.AddrStack.Offset;
+ intptr_t* fp = (intptr_t*)stk.AddrFrame.Offset; // NOT necessarily the same as ctx.Rbp!
+ address pc = (address)stk.AddrPC.Offset;
+
+ if (pc != NULL && sp != NULL && fp != NULL) {
+ if (count == 2 && lastpc == pc) {
+ // Skip it -- StackWalk64() may return the same PC
+ // (but different SP) on the first try.
+ } else {
+ // Don't try to create a frame(sp, fp, pc) -- on WinX64, stk.AddrFrame
+ // may not contain what Java expects, and may cause the frame() constructor
+ // to crash. Let's just print out the symbolic address.
+ frame::print_C_frame(st, buf, buf_size, pc);
+ st->cr();
+ }
+ lastpc = pc;
+ } else {
+ break;
+ }
+
+ PVOID p = WindowsDbgHelp::SymFunctionTableAccess64(GetCurrentProcess(), stk.AddrPC.Offset);
+ if (!p) {
+ // StackWalk64() can't handle this PC. Calling StackWalk64 again may cause crash.
+ break;
+ }
+
+ BOOL result = WindowsDbgHelp::StackWalk64(
+ IMAGE_FILE_MACHINE_AMD64, // __in DWORD MachineType,
+ GetCurrentProcess(), // __in HANDLE hProcess,
+ GetCurrentThread(), // __in HANDLE hThread,
+ &stk, // __inout LP STACKFRAME64 StackFrame,
+ &ctx, // __inout PVOID ContextRecord,
+ NULL, // __in_opt PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
+ WindowsDbgHelp::pfnSymFunctionTableAccess64(),
+ // __in_opt PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
+ WindowsDbgHelp::pfnSymGetModuleBase64(),
+ // __in_opt PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
+ NULL); // __in_opt PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress
+
+ if (!result) {
+ break;
+ }
+ }
+ if (count > StackPrintLimit) {
+ st->print_cr("...<more frames>...");
+ }
+ st->cr();
+
+ return true;
+}
+#endif // AMD64
+
ExtendedPC os::fetch_frame_from_context(void* ucVoid,
intptr_t** ret_sp, intptr_t** ret_fp) {
@@ -401,6 +490,9 @@
StubRoutines::x86::get_previous_fp_entry());
if (func == NULL) return frame();
intptr_t* fp = (*func)();
+ if (fp == NULL) {
+ return frame();
+ }
#else
intptr_t* fp = _get_previous_fp();
#endif // AMD64
--- a/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/os_cpu/windows_x86/vm/os_windows_x86.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -62,4 +62,10 @@
static bool register_code_area(char *low, char *high);
+#ifdef AMD64
+#define PLATFORM_PRINT_NATIVE_STACK 1
+static bool platform_print_native_stack(outputStream* st, void* context,
+ char *buf, int buf_size);
+#endif
+
#endif // OS_CPU_WINDOWS_X86_VM_OS_WINDOWS_X86_HPP
--- a/hotspot/src/share/tools/LogCompilation/README Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/tools/LogCompilation/README Thu Oct 03 19:18:54 2013 +0100
@@ -4,14 +4,14 @@
requires a 1.5 JDK to build and simply typing make should build it.
It produces a jar file, logc.jar, that can be run on the
-hotspot.log from LogCompilation output like this:
+HotSpot log (by default, hotspot_pid{pid}.log) from LogCompilation output like this:
- java -jar logc.jar hotspot.log
+ java -jar logc.jar hotspot_pid1234.log
This will produce something like the normal PrintCompilation output.
Adding the -i option with also report inlining like PrintInlining.
-More information about the LogCompilation output can be found at
+More information about the LogCompilation output can be found at
https://wikis.oracle.com/display/HotSpotInternals/LogCompilation+overview
https://wikis.oracle.com/display/HotSpotInternals/PrintCompilation
--- a/hotspot/src/share/vm/adlc/adlparse.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/adlc/adlparse.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -3395,12 +3395,16 @@
char *greater_equal;
char *less_equal;
char *greater;
+ char *overflow;
+ char *no_overflow;
const char *equal_format = "eq";
const char *not_equal_format = "ne";
const char *less_format = "lt";
const char *greater_equal_format = "ge";
const char *less_equal_format = "le";
const char *greater_format = "gt";
+ const char *overflow_format = "o";
+ const char *no_overflow_format = "no";
if (_curchar != '%') {
parse_err(SYNERR, "Missing '%%{' for 'cond_interface' block.\n");
@@ -3437,6 +3441,12 @@
else if ( strcmp(field,"greater") == 0 ) {
greater = interface_field_parse(&greater_format);
}
+ else if ( strcmp(field,"overflow") == 0 ) {
+ overflow = interface_field_parse(&overflow_format);
+ }
+ else if ( strcmp(field,"no_overflow") == 0 ) {
+ no_overflow = interface_field_parse(&no_overflow_format);
+ }
else {
parse_err(SYNERR, "Expected keyword, base|index|scale|disp, or '%%}' ending interface.\n");
return NULL;
@@ -3455,7 +3465,9 @@
less, less_format,
greater_equal, greater_equal_format,
less_equal, less_equal_format,
- greater, greater_format);
+ greater, greater_format,
+ overflow, overflow_format,
+ no_overflow, no_overflow_format);
return inter;
}
--- a/hotspot/src/share/vm/adlc/archDesc.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/adlc/archDesc.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1192,6 +1192,8 @@
|| strcmp(idealName,"CmpF") == 0
|| strcmp(idealName,"FastLock") == 0
|| strcmp(idealName,"FastUnlock") == 0
+ || strcmp(idealName,"AddExactI") == 0
+ || strcmp(idealName,"FlagsProj") == 0
|| strcmp(idealName,"Bool") == 0
|| strcmp(idealName,"Binary") == 0 ) {
// Removed ConI from the must_clone list. CPUs that cannot use
--- a/hotspot/src/share/vm/adlc/formssel.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -2757,14 +2757,18 @@
const char* less, const char* less_format,
const char* greater_equal, const char* greater_equal_format,
const char* less_equal, const char* less_equal_format,
- const char* greater, const char* greater_format)
+ const char* greater, const char* greater_format,
+ const char* overflow, const char* overflow_format,
+ const char* no_overflow, const char* no_overflow_format)
: Interface("COND_INTER"),
_equal(equal), _equal_format(equal_format),
_not_equal(not_equal), _not_equal_format(not_equal_format),
_less(less), _less_format(less_format),
_greater_equal(greater_equal), _greater_equal_format(greater_equal_format),
_less_equal(less_equal), _less_equal_format(less_equal_format),
- _greater(greater), _greater_format(greater_format) {
+ _greater(greater), _greater_format(greater_format),
+ _overflow(overflow), _overflow_format(overflow_format),
+ _no_overflow(no_overflow), _no_overflow_format(no_overflow_format) {
}
CondInterface::~CondInterface() {
// not owner of any character arrays
@@ -2777,12 +2781,14 @@
// Write info to output files
void CondInterface::output(FILE *fp) {
Interface::output(fp);
- if ( _equal != NULL ) fprintf(fp," equal == %s\n", _equal);
- if ( _not_equal != NULL ) fprintf(fp," not_equal == %s\n", _not_equal);
- if ( _less != NULL ) fprintf(fp," less == %s\n", _less);
- if ( _greater_equal != NULL ) fprintf(fp," greater_equal == %s\n", _greater_equal);
- if ( _less_equal != NULL ) fprintf(fp," less_equal == %s\n", _less_equal);
- if ( _greater != NULL ) fprintf(fp," greater == %s\n", _greater);
+ if ( _equal != NULL ) fprintf(fp," equal == %s\n", _equal);
+ if ( _not_equal != NULL ) fprintf(fp," not_equal == %s\n", _not_equal);
+ if ( _less != NULL ) fprintf(fp," less == %s\n", _less);
+ if ( _greater_equal != NULL ) fprintf(fp," greater_equal == %s\n", _greater_equal);
+ if ( _less_equal != NULL ) fprintf(fp," less_equal == %s\n", _less_equal);
+ if ( _greater != NULL ) fprintf(fp," greater == %s\n", _greater);
+ if ( _overflow != NULL ) fprintf(fp," overflow == %s\n", _overflow);
+ if ( _no_overflow != NULL ) fprintf(fp," no_overflow == %s\n", _no_overflow);
// fprintf(fp,"\n");
}
--- a/hotspot/src/share/vm/adlc/formssel.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/adlc/formssel.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -798,12 +798,16 @@
const char *_greater_equal;
const char *_less_equal;
const char *_greater;
+ const char *_overflow;
+ const char *_no_overflow;
const char *_equal_format;
const char *_not_equal_format;
const char *_less_format;
const char *_greater_equal_format;
const char *_less_equal_format;
const char *_greater_format;
+ const char *_overflow_format;
+ const char *_no_overflow_format;
// Public Methods
CondInterface(const char* equal, const char* equal_format,
@@ -811,7 +815,9 @@
const char* less, const char* less_format,
const char* greater_equal, const char* greater_equal_format,
const char* less_equal, const char* less_equal_format,
- const char* greater, const char* greater_format);
+ const char* greater, const char* greater_format,
+ const char* overflow, const char* overflow_format,
+ const char* no_overflow, const char* no_overflow_format);
~CondInterface();
void dump();
--- a/hotspot/src/share/vm/adlc/output_h.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/adlc/output_h.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -388,6 +388,8 @@
fprintf(fp, " else if( _c%d == BoolTest::ge ) st->print(\"%s\");\n",i,cond->_greater_equal_format);
fprintf(fp, " else if( _c%d == BoolTest::lt ) st->print(\"%s\");\n",i,cond->_less_format);
fprintf(fp, " else if( _c%d == BoolTest::gt ) st->print(\"%s\");\n",i,cond->_greater_format);
+ fprintf(fp, " else if( _c%d == BoolTest::overflow ) st->print(\"%s\");\n",i,cond->_overflow_format);
+ fprintf(fp, " else if( _c%d == BoolTest::no_overflow ) st->print(\"%s\");\n",i,cond->_no_overflow_format);
}
// Output code that dumps constant values, increment "i" if type is constant
@@ -1208,6 +1210,8 @@
fprintf(fp," case BoolTest::ne : return not_equal();\n");
fprintf(fp," case BoolTest::le : return less_equal();\n");
fprintf(fp," case BoolTest::ge : return greater_equal();\n");
+ fprintf(fp," case BoolTest::overflow : return overflow();\n");
+ fprintf(fp," case BoolTest::no_overflow: return no_overflow();\n");
fprintf(fp," default : ShouldNotReachHere(); return 0;\n");
fprintf(fp," }\n");
fprintf(fp," };\n");
@@ -1373,6 +1377,14 @@
if( greater != NULL ) {
define_oper_interface(fp, *oper, _globalNames, "greater", greater);
}
+ const char *overflow = cInterface->_overflow;
+ if( overflow != NULL ) {
+ define_oper_interface(fp, *oper, _globalNames, "overflow", overflow);
+ }
+ const char *no_overflow = cInterface->_no_overflow;
+ if( no_overflow != NULL ) {
+ define_oper_interface(fp, *oper, _globalNames, "no_overflow", no_overflow);
+ }
} // end Conditional Interface
// Check if it is a Constant Interface
else if (oper->_interface->is_ConstInterface() != NULL ) {
--- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -4219,7 +4219,9 @@
}
}
- if (!PrintInlining) return;
+ if (!PrintInlining && !compilation()->method()->has_option("PrintInlining")) {
+ return;
+ }
CompileTask::print_inlining(callee, scope()->level(), bci(), msg);
if (success && CIPrintMethodCodes) {
callee->print_codes();
--- a/hotspot/src/share/vm/c1/c1_Runtime1.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -709,10 +709,10 @@
Bytecodes::Code code = field_access.code();
// We must load class, initialize class and resolvethe field
- FieldAccessInfo result; // initialize class if needed
+ fieldDescriptor result; // initialize class if needed
constantPoolHandle constants(THREAD, caller->constants());
- LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK_NULL);
- return result.klass()();
+ LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK_NULL);
+ return result.field_holder();
}
@@ -826,11 +826,11 @@
if (stub_id == Runtime1::access_field_patching_id) {
Bytecode_field field_access(caller_method, bci);
- FieldAccessInfo result; // initialize class if needed
+ fieldDescriptor result; // initialize class if needed
Bytecodes::Code code = field_access.code();
constantPoolHandle constants(THREAD, caller_method->constants());
- LinkResolver::resolve_field(result, constants, field_access.index(), Bytecodes::java_code(code), false, CHECK);
- patch_field_offset = result.field_offset();
+ LinkResolver::resolve_field_access(result, constants, field_access.index(), Bytecodes::java_code(code), CHECK);
+ patch_field_offset = result.offset();
// If we're patching a field which is volatile then at compile it
// must not have been know to be volatile, so the generated code
@@ -1019,7 +1019,7 @@
n_copy->set_data((intx) (load_klass()));
} else {
assert(mirror() != NULL, "klass not set");
- n_copy->set_data((intx) (mirror()));
+ n_copy->set_data(cast_from_oop<intx>(mirror()));
}
if (TracePatching) {
@@ -1031,7 +1031,7 @@
assert(n_copy->data() == 0 ||
n_copy->data() == (intptr_t)Universe::non_oop_word(),
"illegal init value");
- n_copy->set_data((intx) (appendix()));
+ n_copy->set_data(cast_from_oop<intx>(appendix()));
if (TracePatching) {
Disassembler::decode(copy_buff, copy_buff + *byte_count, tty);
@@ -1078,14 +1078,17 @@
// replace instructions
// first replace the tail, then the call
#ifdef ARM
- if(load_klass_or_mirror_patch_id && !VM_Version::supports_movw()) {
+ if((load_klass_or_mirror_patch_id ||
+ stub_id == Runtime1::load_appendix_patching_id) &&
+ !VM_Version::supports_movw()) {
nmethod* nm = CodeCache::find_nmethod(instr_pc);
address addr = NULL;
assert(nm != NULL, "invalid nmethod_pc");
RelocIterator mds(nm, copy_buff, copy_buff + 1);
while (mds.next()) {
if (mds.type() == relocInfo::oop_type) {
- assert(stub_id == Runtime1::load_mirror_patching_id, "wrong stub id");
+ assert(stub_id == Runtime1::load_mirror_patching_id ||
+ stub_id == Runtime1::load_appendix_patching_id, "wrong stub id");
oop_Relocation* r = mds.oop_reloc();
addr = (address)r->oop_addr();
break;
--- a/hotspot/src/share/vm/ci/ciField.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/ci/ciField.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -75,7 +75,6 @@
assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constan-pool");
- _cp_index = index;
constantPoolHandle cpool(thread, klass->get_instanceKlass()->constants());
// Get the field's name, signature, and type.
@@ -116,7 +115,7 @@
// The declared holder of this field may not have been loaded.
// Bail out with partial field information.
if (!holder_is_accessible) {
- // _cp_index and _type have already been set.
+ // _type has already been set.
// The default values for _flags and _constant_value will suffice.
// We need values for _holder, _offset, and _is_constant,
_holder = declared_holder;
@@ -146,8 +145,6 @@
ciField::ciField(fieldDescriptor *fd): _known_to_link_with_put(NULL), _known_to_link_with_get(NULL) {
ASSERT_IN_VM;
- _cp_index = -1;
-
// Get the field's name, signature, and type.
ciEnv* env = CURRENT_ENV;
_name = env->get_symbol(fd->name());
@@ -351,12 +348,11 @@
}
}
- FieldAccessInfo result;
- constantPoolHandle c_pool(THREAD,
- accessing_klass->get_instanceKlass()->constants());
- LinkResolver::resolve_field(result, c_pool, _cp_index,
- Bytecodes::java_code(bc),
- true, false, KILL_COMPILE_ON_FATAL_(false));
+ fieldDescriptor result;
+ LinkResolver::resolve_field(result, _holder->get_instanceKlass(),
+ _name->get_symbol(), _signature->get_symbol(),
+ accessing_klass->get_Klass(), bc, true, false,
+ KILL_COMPILE_ON_FATAL_(false));
// update the hit-cache, unless there is a problem with memory scoping:
if (accessing_klass->is_shared() || !is_shared()) {
--- a/hotspot/src/share/vm/ci/ciField.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/ci/ciField.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,9 +53,6 @@
ciInstanceKlass* _known_to_link_with_get;
ciConstant _constant_value;
- // Used for will_link
- int _cp_index;
-
ciType* compute_type();
ciType* compute_type_impl();
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -522,8 +522,7 @@
for (JavaFieldStream fs(k); !fs.done(); fs.next()) {
if (fs.access_flags().is_static()) continue;
- fieldDescriptor fd;
- fd.initialize(k, fs.index());
+ fieldDescriptor& fd = fs.field_descriptor();
ciField* field = new (arena) ciField(&fd);
fields->append(field);
}
--- a/hotspot/src/share/vm/ci/ciMethod.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -286,7 +286,10 @@
check_is_loaded();
assert(holder()->is_linked(), "must be linked");
VM_ENTRY_MARK;
- return klassItable::compute_itable_index(get_Method());
+ Method* m = get_Method();
+ if (!m->has_itable_index())
+ return Method::nonvirtual_vtable_index;
+ return m->itable_index();
}
#endif // SHARK
@@ -1137,6 +1140,10 @@
// ------------------------------------------------------------------
// ciMethod::check_call
bool ciMethod::check_call(int refinfo_index, bool is_static) const {
+ // This method is used only in C2 from InlineTree::ok_to_inline,
+ // and is only used under -Xcomp or -XX:CompileTheWorld.
+ // It appears to fail when applied to an invokeinterface call site.
+ // FIXME: Remove this method and resolve_method_statically; refactor to use the other LinkResolver entry points.
VM_ENTRY_MARK;
{
EXCEPTION_MARK;
--- a/hotspot/src/share/vm/ci/ciSymbol.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/ci/ciSymbol.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,6 +44,7 @@
friend class ciInstanceKlass;
friend class ciSignature;
friend class ciMethod;
+ friend class ciField;
friend class ciObjArrayKlass;
private:
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -888,6 +888,7 @@
int runtime_visible_type_annotations_length = 0;
u1* runtime_invisible_type_annotations = NULL;
int runtime_invisible_type_annotations_length = 0;
+ bool runtime_invisible_type_annotations_exists = false;
while (attributes_count--) {
cfs->guarantee_more(6, CHECK); // attribute_name_index, attribute_length
u2 attribute_name_index = cfs->get_u2_fast();
@@ -946,15 +947,27 @@
assert(runtime_invisible_annotations != NULL, "null invisible annotations");
cfs->skip_u1(runtime_invisible_annotations_length, CHECK);
} else if (attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) {
+ if (runtime_visible_type_annotations != NULL) {
+ classfile_parse_error(
+ "Multiple RuntimeVisibleTypeAnnotations attributes for field in class file %s", CHECK);
+ }
runtime_visible_type_annotations_length = attribute_length;
runtime_visible_type_annotations = cfs->get_u1_buffer();
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK);
- } else if (PreserveAllAnnotations && attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
- runtime_invisible_type_annotations_length = attribute_length;
- runtime_invisible_type_annotations = cfs->get_u1_buffer();
- assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
- cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK);
+ } else if (attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
+ if (runtime_invisible_type_annotations_exists) {
+ classfile_parse_error(
+ "Multiple RuntimeInvisibleTypeAnnotations attributes for field in class file %s", CHECK);
+ } else {
+ runtime_invisible_type_annotations_exists = true;
+ }
+ if (PreserveAllAnnotations) {
+ runtime_invisible_type_annotations_length = attribute_length;
+ runtime_invisible_type_annotations = cfs->get_u1_buffer();
+ assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
+ }
+ cfs->skip_u1(attribute_length, CHECK);
} else {
cfs->skip_u1(attribute_length, CHECK); // Skip unknown attributes
}
@@ -1774,7 +1787,7 @@
if (_location != _in_method) break; // only allow for methods
if (!privileged) break; // only allow in privileged code
return _method_LambdaForm_Hidden;
- case vmSymbols::VM_SYMBOL_ENUM_NAME(sun_invoke_Stable_signature):
+ case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_Stable_signature):
if (_location != _in_field) break; // only allow for fields
if (!privileged) break; // only allow in privileged code
return _field_Stable;
@@ -2066,6 +2079,7 @@
int runtime_visible_type_annotations_length = 0;
u1* runtime_invisible_type_annotations = NULL;
int runtime_invisible_type_annotations_length = 0;
+ bool runtime_invisible_type_annotations_exists = false;
u1* annotation_default = NULL;
int annotation_default_length = 0;
@@ -2322,16 +2336,30 @@
assert(annotation_default != NULL, "null annotation default");
cfs->skip_u1(annotation_default_length, CHECK_(nullHandle));
} else if (method_attribute_name == vmSymbols::tag_runtime_visible_type_annotations()) {
+ if (runtime_visible_type_annotations != NULL) {
+ classfile_parse_error(
+ "Multiple RuntimeVisibleTypeAnnotations attributes for method in class file %s",
+ CHECK_(nullHandle));
+ }
runtime_visible_type_annotations_length = method_attribute_length;
runtime_visible_type_annotations = cfs->get_u1_buffer();
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
// No need for the VM to parse Type annotations
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK_(nullHandle));
- } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
- runtime_invisible_type_annotations_length = method_attribute_length;
- runtime_invisible_type_annotations = cfs->get_u1_buffer();
- assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
- cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK_(nullHandle));
+ } else if (method_attribute_name == vmSymbols::tag_runtime_invisible_type_annotations()) {
+ if (runtime_invisible_type_annotations_exists) {
+ classfile_parse_error(
+ "Multiple RuntimeInvisibleTypeAnnotations attributes for method in class file %s",
+ CHECK_(nullHandle));
+ } else {
+ runtime_invisible_type_annotations_exists = true;
+ }
+ if (PreserveAllAnnotations) {
+ runtime_invisible_type_annotations_length = method_attribute_length;
+ runtime_invisible_type_annotations = cfs->get_u1_buffer();
+ assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
+ }
+ cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
} else {
// Skip unknown attributes
cfs->skip_u1(method_attribute_length, CHECK_(nullHandle));
@@ -2517,7 +2545,9 @@
if (method->is_final()) {
*has_final_method = true;
}
- if (is_interface && !method->is_abstract() && !method->is_static()) {
+ if (is_interface && !(*has_default_methods)
+ && !method->is_abstract() && !method->is_static()
+ && !method->is_private()) {
// default method
*has_default_methods = true;
}
@@ -2824,6 +2854,7 @@
int runtime_visible_type_annotations_length = 0;
u1* runtime_invisible_type_annotations = NULL;
int runtime_invisible_type_annotations_length = 0;
+ bool runtime_invisible_type_annotations_exists = false;
u1* inner_classes_attribute_start = NULL;
u4 inner_classes_attribute_length = 0;
u2 enclosing_method_class_index = 0;
@@ -2927,16 +2958,28 @@
parsed_bootstrap_methods_attribute = true;
parse_classfile_bootstrap_methods_attribute(attribute_length, CHECK);
} else if (tag == vmSymbols::tag_runtime_visible_type_annotations()) {
+ if (runtime_visible_type_annotations != NULL) {
+ classfile_parse_error(
+ "Multiple RuntimeVisibleTypeAnnotations attributes in class file %s", CHECK);
+ }
runtime_visible_type_annotations_length = attribute_length;
runtime_visible_type_annotations = cfs->get_u1_buffer();
assert(runtime_visible_type_annotations != NULL, "null visible type annotations");
// No need for the VM to parse Type annotations
cfs->skip_u1(runtime_visible_type_annotations_length, CHECK);
- } else if (PreserveAllAnnotations && tag == vmSymbols::tag_runtime_invisible_type_annotations()) {
- runtime_invisible_type_annotations_length = attribute_length;
- runtime_invisible_type_annotations = cfs->get_u1_buffer();
- assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
- cfs->skip_u1(runtime_invisible_type_annotations_length, CHECK);
+ } else if (tag == vmSymbols::tag_runtime_invisible_type_annotations()) {
+ if (runtime_invisible_type_annotations_exists) {
+ classfile_parse_error(
+ "Multiple RuntimeInvisibleTypeAnnotations attributes in class file %s", CHECK);
+ } else {
+ runtime_invisible_type_annotations_exists = true;
+ }
+ if (PreserveAllAnnotations) {
+ runtime_invisible_type_annotations_length = attribute_length;
+ runtime_invisible_type_annotations = cfs->get_u1_buffer();
+ assert(runtime_invisible_type_annotations != NULL, "null invisible type annotations");
+ }
+ cfs->skip_u1(attribute_length, CHECK);
} else {
// Unknown attribute
cfs->skip_u1(attribute_length, CHECK);
@@ -3954,9 +3997,8 @@
this_klass->set_has_final_method();
}
this_klass->copy_method_ordering(method_ordering, CHECK_NULL);
- // The InstanceKlass::_methods_jmethod_ids cache and the
- // InstanceKlass::_methods_cached_itable_indices cache are
- // both managed on the assumption that the initial cache
+ // The InstanceKlass::_methods_jmethod_ids cache
+ // is managed on the assumption that the initial cache
// size is equal to the number of methods in the class. If
// that changes, then InstanceKlass::idnum_can_increment()
// has to be changed accordingly.
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1319,6 +1319,25 @@
// The CHECK at the caller will propagate the exception out
}
+/**
+ * Returns if the given method should be compiled when doing compile-the-world.
+ *
+ * TODO: This should be a private method in a CompileTheWorld class.
+ */
+static bool can_be_compiled(methodHandle m, int comp_level) {
+ assert(CompileTheWorld, "must be");
+
+ // It's not valid to compile a native wrapper for MethodHandle methods
+ // that take a MemberName appendix since the bytecode signature is not
+ // correct.
+ vmIntrinsics::ID iid = m->intrinsic_id();
+ if (MethodHandles::is_signature_polymorphic(iid) && MethodHandles::has_member_arg(iid)) {
+ return false;
+ }
+
+ return CompilationPolicy::can_be_compiled(m, comp_level);
+}
+
void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
int len = (int)strlen(name);
if (len > 6 && strcmp(".class", name + len - 6) == 0) {
@@ -1362,8 +1381,7 @@
int comp_level = CompilationPolicy::policy()->initial_compile_level();
for (int n = 0; n < k->methods()->length(); n++) {
methodHandle m (THREAD, k->methods()->at(n));
- if (CompilationPolicy::can_be_compiled(m, comp_level)) {
-
+ if (can_be_compiled(m, comp_level)) {
if (++_codecache_sweep_counter == CompileTheWorldSafepointInterval) {
// Give sweeper a chance to keep up with CTW
VM_ForceSafepoint op;
@@ -1375,7 +1393,7 @@
methodHandle(), 0, "CTW", THREAD);
if (HAS_PENDING_EXCEPTION) {
clear_pending_exception_if_not_oom(CHECK);
- tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string());
+ tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
} else {
_compile_the_world_method_counter++;
}
@@ -1391,11 +1409,13 @@
methodHandle(), 0, "CTW", THREAD);
if (HAS_PENDING_EXCEPTION) {
clear_pending_exception_if_not_oom(CHECK);
- tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name()->as_C_string());
+ tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
} else {
_compile_the_world_method_counter++;
}
}
+ } else {
+ tty->print_cr("CompileTheWorld (%d) : Skipping method: %s", _compile_the_world_class_counter, m->name_and_sig_as_C_string());
}
nmethod* nm = m->code();
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -261,7 +261,7 @@
k,
k->external_name(),
k->class_loader_data(),
- k->class_loader(),
+ (void *)k->class_loader(),
loader_name());
}
}
@@ -297,7 +297,7 @@
if (TraceClassLoaderData) {
ResourceMark rm;
tty->print("[ClassLoaderData: unload loader data "PTR_FORMAT, this);
- tty->print(" for instance "PTR_FORMAT" of %s", class_loader(),
+ tty->print(" for instance "PTR_FORMAT" of %s", (void *)class_loader(),
loader_name());
if (is_anonymous()) {
tty->print(" for anonymous class "PTR_FORMAT " ", _klasses);
@@ -458,7 +458,7 @@
void ClassLoaderData::dump(outputStream * const out) {
ResourceMark rm;
out->print("ClassLoaderData CLD: "PTR_FORMAT", loader: "PTR_FORMAT", loader_klass: "PTR_FORMAT" %s {",
- this, class_loader(),
+ this, (void *)class_loader(),
class_loader() != NULL ? class_loader()->klass() : NULL, loader_name());
if (claimed()) out->print(" claimed ");
if (is_unloading()) out->print(" unloading ");
@@ -553,7 +553,7 @@
ResourceMark rm;
tty->print("[ClassLoaderData: ");
tty->print("create class loader data "PTR_FORMAT, cld);
- tty->print(" for instance "PTR_FORMAT" of %s", cld->class_loader(),
+ tty->print(" for instance "PTR_FORMAT" of %s", (void *)cld->class_loader(),
cld->loader_name());
tty->print_cr("]");
}
--- a/hotspot/src/share/vm/classfile/defaultMethods.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/defaultMethods.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -325,6 +325,7 @@
Method* _selected_target; // Filled in later, if a unique target exists
Symbol* _exception_message; // If no unique target is found
+ Symbol* _exception_name; // If no unique target is found
bool contains_method(Method* method) {
int* lookup = _member_index.get(method);
@@ -350,7 +351,7 @@
public:
MethodFamily()
- : _selected_target(NULL), _exception_message(NULL) {}
+ : _selected_target(NULL), _exception_message(NULL), _exception_name(NULL) {}
void set_target_if_empty(Method* m) {
if (_selected_target == NULL && !m->is_overpass()) {
@@ -383,6 +384,7 @@
Method* get_selected_target() { return _selected_target; }
Symbol* get_exception_message() { return _exception_message; }
+ Symbol* get_exception_name() { return _exception_name; }
// Either sets the target or the exception error message
void determine_target(InstanceKlass* root, TRAPS) {
@@ -400,15 +402,18 @@
if (qualified_methods.length() == 0) {
_exception_message = generate_no_defaults_message(CHECK);
+ _exception_name = vmSymbols::java_lang_AbstractMethodError();
} else if (qualified_methods.length() == 1) {
Method* method = qualified_methods.at(0);
if (method->is_abstract()) {
_exception_message = generate_abstract_method_message(method, CHECK);
+ _exception_name = vmSymbols::java_lang_AbstractMethodError();
} else {
_selected_target = qualified_methods.at(0);
}
} else {
_exception_message = generate_conflicts_message(&qualified_methods,CHECK);
+ _exception_name = vmSymbols::java_lang_IncompatibleClassChangeError();
}
assert((has_target() ^ throws_exception()) == 1,
@@ -450,13 +455,18 @@
streamIndentor si(str, indent * 2);
str->indent().print("Selected method: ");
print_method(str, _selected_target);
+ Klass* method_holder = _selected_target->method_holder();
+ if (!method_holder->is_interface()) {
+ tty->print(" : in superclass");
+ }
str->print_cr("");
}
void print_exception(outputStream* str, int indent) {
assert(throws_exception(), "Should be called otherwise");
+ assert(_exception_name != NULL, "exception_name should be set");
streamIndentor si(str, indent * 2);
- str->indent().print_cr("%s", _exception_message->as_C_string());
+ str->indent().print_cr("%s: %s", _exception_name->as_C_string(), _exception_message->as_C_string());
}
#endif // ndef PRODUCT
};
@@ -666,7 +676,10 @@
InstanceKlass* iklass = current_class();
Method* m = iklass->find_method(_method_name, _method_signature);
- if (m != NULL) {
+ // private interface methods are not candidates for default methods
+ // invokespecial to private interface methods doesn't use default method logic
+ // future: take access controls into account for superclass methods
+ if (m != NULL && (!iklass->is_interface() || m->is_public())) {
if (_family == NULL) {
_family = new StatefulMethodFamily();
}
@@ -778,202 +791,9 @@
#endif // ndef PRODUCT
}
-/**
- * Interface inheritance rules were used to find a unique default method
- * candidate for the resolved class. This
- * method is only viable if it would also be in the set of default method
- * candidates if we ran a full analysis on the current class.
- *
- * The only reason that the method would not be in the set of candidates for
- * the current class is if that there's another matching method
- * which is "more specific" than the found method -- i.e., one could find a
- * path in the interface hierarchy in which the matching method appears
- * before we get to '_target'.
- *
- * In order to determine this, we examine all of the implemented
- * interfaces. If we find path that leads to the '_target' interface, then
- * we examine that path to see if there are any methods that would shadow
- * the selected method along that path.
- */
-class ShadowChecker : public HierarchyVisitor<ShadowChecker> {
- protected:
- Thread* THREAD;
-
- InstanceKlass* _target;
-
- Symbol* _method_name;
- InstanceKlass* _method_holder;
- bool _found_shadow;
- public:
-
- ShadowChecker(Thread* thread, Symbol* name, InstanceKlass* holder,
- InstanceKlass* target)
- : THREAD(thread), _method_name(name), _method_holder(holder),
- _target(target), _found_shadow(false) {}
-
- void* new_node_data(InstanceKlass* cls) { return NULL; }
- void free_node_data(void* data) { return; }
-
- bool visit() {
- InstanceKlass* ik = current_class();
- if (ik == _target && current_depth() == 1) {
- return false; // This was the specified super -- no need to search it
- }
- if (ik == _method_holder || ik == _target) {
- // We found a path that should be examined to see if it shadows _method
- if (path_has_shadow()) {
- _found_shadow = true;
- cancel_iteration();
- }
- return false; // no need to continue up hierarchy
- }
- return true;
- }
-
- virtual bool path_has_shadow() = 0;
- bool found_shadow() { return _found_shadow; }
-};
-
-// Used for Invokespecial.
-// Invokespecial is allowed to invoke a concrete interface method
-// and can be used to disambuiguate among qualified candidates,
-// which are methods in immediate superinterfaces,
-// but may not be used to invoke a candidate that would be shadowed
-// from the perspective of the caller.
-// Invokespecial is also used in the overpass generation today
-// We re-run the shadowchecker because we can't distinguish this case,
-// but it should return the same answer, since the overpass target
-// is now the invokespecial caller.
-class ErasedShadowChecker : public ShadowChecker {
- private:
- bool path_has_shadow() {
-
- for (int i = current_depth() - 1; i > 0; --i) {
- InstanceKlass* ik = class_at_depth(i);
-
- if (ik->is_interface()) {
- int end;
- int start = ik->find_method_by_name(_method_name, &end);
- if (start != -1) {
- return true;
- }
- }
- }
- return false;
- }
- public:
-
- ErasedShadowChecker(Thread* thread, Symbol* name, InstanceKlass* holder,
- InstanceKlass* target)
- : ShadowChecker(thread, name, holder, target) {}
-};
-
-// Find the unique qualified candidate from the perspective of the super_class
-// which is the resolved_klass, which must be an immediate superinterface
-// of klass
-Method* find_erased_super_default(InstanceKlass* current_class, InstanceKlass* super_class, Symbol* method_name, Symbol* sig, TRAPS) {
-
- FindMethodsByErasedSig visitor(method_name, sig);
- visitor.run(super_class); // find candidates from resolved_klass
-
- MethodFamily* family;
- visitor.get_discovered_family(&family);
-
- if (family != NULL) {
- family->determine_target(current_class, CHECK_NULL); // get target from current_class
-
- if (family->has_target()) {
- Method* target = family->get_selected_target();
- InstanceKlass* holder = InstanceKlass::cast(target->method_holder());
-
- // Verify that the identified method is valid from the context of
- // the current class, which is the caller class for invokespecial
- // link resolution, i.e. ensure there it is not shadowed.
- // You can use invokespecial to disambiguate interface methods, but
- // you can not use it to skip over an interface method that would shadow it.
- ErasedShadowChecker checker(THREAD, target->name(), holder, super_class);
- checker.run(current_class);
-
- if (checker.found_shadow()) {
-#ifndef PRODUCT
- if (TraceDefaultMethods) {
- tty->print_cr(" Only candidate found was shadowed.");
- }
-#endif // ndef PRODUCT
- THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(),
- "Accessible default method not found", NULL);
- } else {
-#ifndef PRODUCT
- if (TraceDefaultMethods) {
- family->print_sig_on(tty, target->signature(), 1);
- }
-#endif // ndef PRODUCT
- return target;
- }
- } else {
- assert(family->throws_exception(), "must have target or throw");
- THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(),
- family->get_exception_message()->as_C_string(), NULL);
- }
- } else {
- // no method found
- ResourceMark rm(THREAD);
- THROW_MSG_(vmSymbols::java_lang_NoSuchMethodError(),
- Method::name_and_sig_as_C_string(current_class,
- method_name, sig), NULL);
- }
-}
-// This is called during linktime when we find an invokespecial call that
-// refers to a direct superinterface. It indicates that we should find the
-// default method in the hierarchy of that superinterface, and if that method
-// would have been a candidate from the point of view of 'this' class, then we
-// return that method.
-// This logic assumes that the super is a direct superclass of the caller
-Method* DefaultMethods::find_super_default(
- Klass* cls, Klass* super, Symbol* method_name, Symbol* sig, TRAPS) {
-
- ResourceMark rm(THREAD);
-
- assert(cls != NULL && super != NULL, "Need real classes");
-
- InstanceKlass* current_class = InstanceKlass::cast(cls);
- InstanceKlass* super_class = InstanceKlass::cast(super);
-
- // Keep entire hierarchy alive for the duration of the computation
- KeepAliveRegistrar keepAlive(THREAD);
- KeepAliveVisitor loadKeepAlive(&keepAlive);
- loadKeepAlive.run(current_class); // get hierarchy from current class
-
-#ifndef PRODUCT
- if (TraceDefaultMethods) {
- tty->print_cr("Finding super default method %s.%s%s from %s",
- super_class->name()->as_C_string(),
- method_name->as_C_string(), sig->as_C_string(),
- current_class->name()->as_C_string());
- }
-#endif // ndef PRODUCT
-
- assert(super_class->is_interface(), "only call for default methods");
-
- Method* target = NULL;
- target = find_erased_super_default(current_class, super_class,
- method_name, sig, CHECK_NULL);
-
-#ifndef PRODUCT
- if (target != NULL) {
- if (TraceDefaultMethods) {
- tty->print(" Returning ");
- print_method(tty, target, true);
- tty->print_cr("");
- }
- }
-#endif // ndef PRODUCT
- return target;
-}
-
-#ifndef PRODUCT
+#ifdef ASSERT
// Return true is broad type is a covariant return of narrow type
static bool covariant_return_type(BasicType narrow, BasicType broad) {
if (narrow == broad) {
@@ -984,7 +804,7 @@
}
return false;
}
-#endif // ndef PRODUCT
+#endif
static int assemble_redirect(
BytecodeConstantPool* cp, BytecodeBuffer* buffer,
@@ -1031,10 +851,9 @@
return parameter_count;
}
-static int assemble_abstract_method_error(
- BytecodeConstantPool* cp, BytecodeBuffer* buffer, Symbol* message, TRAPS) {
+static int assemble_method_error(
+ BytecodeConstantPool* cp, BytecodeBuffer* buffer, Symbol* errorName, Symbol* message, TRAPS) {
- Symbol* errorName = vmSymbols::java_lang_AbstractMethodError();
Symbol* init = vmSymbols::object_initializer_name();
Symbol* sig = vmSymbols::string_void_signature();
@@ -1141,19 +960,22 @@
#endif // ndef PRODUCT
if (method->has_target()) {
Method* selected = method->get_selected_target();
- max_stack = assemble_redirect(
+ if (selected->method_holder()->is_interface()) {
+ max_stack = assemble_redirect(
&bpool, &buffer, slot->signature(), selected, CHECK);
+ }
} else if (method->throws_exception()) {
- max_stack = assemble_abstract_method_error(
- &bpool, &buffer, method->get_exception_message(), CHECK);
+ max_stack = assemble_method_error(&bpool, &buffer, method->get_exception_name(), method->get_exception_message(), CHECK);
}
- AccessFlags flags = accessFlags_from(
+ if (max_stack != 0) {
+ AccessFlags flags = accessFlags_from(
JVM_ACC_PUBLIC | JVM_ACC_SYNTHETIC | JVM_ACC_BRIDGE);
- Method* m = new_method(&bpool, &buffer, slot->name(), slot->signature(),
+ Method* m = new_method(&bpool, &buffer, slot->name(), slot->signature(),
flags, max_stack, slot->size_of_parameters(),
ConstMethod::OVERPASS, CHECK);
- if (m != NULL) {
- overpasses.push(m);
+ if (m != NULL) {
+ overpasses.push(m);
+ }
}
}
}
@@ -1273,4 +1095,3 @@
MetadataFactory::free_array(cld, original_ordering);
}
}
-
--- a/hotspot/src/share/vm/classfile/defaultMethods.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/defaultMethods.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,15 +44,5 @@
// the class.
static void generate_default_methods(
InstanceKlass* klass, GrowableArray<Method*>* mirandas, TRAPS);
-
-
- // Called during linking when an invokespecial to an direct interface
- // method is found. Selects and returns a method if there is a unique
- // default method in the 'super_iface' part of the hierarchy which is
- // also a candidate default for 'this_klass'. Otherwise throws an AME.
- static Method* find_super_default(
- Klass* this_klass, Klass* super_iface,
- Symbol* method_name, Symbol* method_sig, TRAPS);
};
-
#endif // SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP
--- a/hotspot/src/share/vm/classfile/dictionary.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/dictionary.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -264,7 +264,7 @@
}
if (method_type() != NULL) {
if (printed) st->print(" and ");
- st->print(INTPTR_FORMAT, method_type());
+ st->print(INTPTR_FORMAT, (void *)method_type());
printed = true;
}
st->print_cr(printed ? "" : "(empty)");
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -438,6 +438,29 @@
return true;
}
+bool java_lang_String::equals(oop str1, oop str2) {
+ assert(str1->klass() == SystemDictionary::String_klass(),
+ "must be java String");
+ assert(str2->klass() == SystemDictionary::String_klass(),
+ "must be java String");
+ typeArrayOop value1 = java_lang_String::value(str1);
+ int offset1 = java_lang_String::offset(str1);
+ int length1 = java_lang_String::length(str1);
+ typeArrayOop value2 = java_lang_String::value(str2);
+ int offset2 = java_lang_String::offset(str2);
+ int length2 = java_lang_String::length(str2);
+
+ if (length1 != length2) {
+ return false;
+ }
+ for (int i = 0; i < length1; i++) {
+ if (value1->char_at(i + offset1) != value2->char_at(i + offset2)) {
+ return false;
+ }
+ }
+ return true;
+}
+
void java_lang_String::print(Handle java_string, outputStream* st) {
oop obj = java_string();
assert(obj->klass() == SystemDictionary::String_klass(), "must be java_string");
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -182,6 +182,7 @@
static unsigned int hash_string(oop java_string);
static bool equals(oop java_string, jchar* chars, int len);
+ static bool equals(oop str1, oop str2);
// Conversion between '.' and '/' formats
static Handle externalize_classname(Handle java_string, TRAPS) { return char_converter(java_string, '/', '.', THREAD); }
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -341,7 +341,7 @@
Symbol* SymbolTable::basic_add(int index_arg, u1 *name, int len,
unsigned int hashValue_arg, bool c_heap, TRAPS) {
- assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
+ assert(!Universe::heap()->is_in_reserved(name),
"proposed name of symbol must be stable");
// Don't allow symbols to be created which cannot fit in a Symbol*.
@@ -685,7 +685,7 @@
if (found_string != NULL) return found_string;
debug_only(StableMemoryChecker smc(name, len * sizeof(name[0])));
- assert(!Universe::heap()->is_in_reserved(name) || GC_locker::is_active(),
+ assert(!Universe::heap()->is_in_reserved(name),
"proposed name of symbol must be stable");
Handle string;
@@ -807,6 +807,8 @@
}
}
+// This verification is part of Universe::verify() and needs to be quick.
+// See StringTable::verify_and_compare() below for exhaustive verification.
void StringTable::verify() {
for (int i = 0; i < the_table()->table_size(); ++i) {
HashtableEntry<oop, mtSymbol>* p = the_table()->bucket(i);
@@ -825,6 +827,162 @@
the_table()->dump_table(st, "StringTable");
}
+StringTable::VerifyRetTypes StringTable::compare_entries(
+ int bkt1, int e_cnt1,
+ HashtableEntry<oop, mtSymbol>* e_ptr1,
+ int bkt2, int e_cnt2,
+ HashtableEntry<oop, mtSymbol>* e_ptr2) {
+ // These entries are sanity checked by verify_and_compare_entries()
+ // before this function is called.
+ oop str1 = e_ptr1->literal();
+ oop str2 = e_ptr2->literal();
+
+ if (str1 == str2) {
+ tty->print_cr("ERROR: identical oop values (0x" PTR_FORMAT ") "
+ "in entry @ bucket[%d][%d] and entry @ bucket[%d][%d]",
+ (void *)str1, bkt1, e_cnt1, bkt2, e_cnt2);
+ return _verify_fail_continue;
+ }
+
+ if (java_lang_String::equals(str1, str2)) {
+ tty->print_cr("ERROR: identical String values in entry @ "
+ "bucket[%d][%d] and entry @ bucket[%d][%d]",
+ bkt1, e_cnt1, bkt2, e_cnt2);
+ return _verify_fail_continue;
+ }
+
+ return _verify_pass;
+}
+
+StringTable::VerifyRetTypes StringTable::verify_entry(int bkt, int e_cnt,
+ HashtableEntry<oop, mtSymbol>* e_ptr,
+ StringTable::VerifyMesgModes mesg_mode) {
+
+ VerifyRetTypes ret = _verify_pass; // be optimistic
+
+ oop str = e_ptr->literal();
+ if (str == NULL) {
+ if (mesg_mode == _verify_with_mesgs) {
+ tty->print_cr("ERROR: NULL oop value in entry @ bucket[%d][%d]", bkt,
+ e_cnt);
+ }
+ // NULL oop means no more verifications are possible
+ return _verify_fail_done;
+ }
+
+ if (str->klass() != SystemDictionary::String_klass()) {
+ if (mesg_mode == _verify_with_mesgs) {
+ tty->print_cr("ERROR: oop is not a String in entry @ bucket[%d][%d]",
+ bkt, e_cnt);
+ }
+ // not a String means no more verifications are possible
+ return _verify_fail_done;
+ }
+
+ unsigned int h = java_lang_String::hash_string(str);
+ if (e_ptr->hash() != h) {
+ if (mesg_mode == _verify_with_mesgs) {
+ tty->print_cr("ERROR: broken hash value in entry @ bucket[%d][%d], "
+ "bkt_hash=%d, str_hash=%d", bkt, e_cnt, e_ptr->hash(), h);
+ }
+ ret = _verify_fail_continue;
+ }
+
+ if (the_table()->hash_to_index(h) != bkt) {
+ if (mesg_mode == _verify_with_mesgs) {
+ tty->print_cr("ERROR: wrong index value for entry @ bucket[%d][%d], "
+ "str_hash=%d, hash_to_index=%d", bkt, e_cnt, h,
+ the_table()->hash_to_index(h));
+ }
+ ret = _verify_fail_continue;
+ }
+
+ return ret;
+}
+
+// See StringTable::verify() above for the quick verification that is
+// part of Universe::verify(). This verification is exhaustive and
+// reports on every issue that is found. StringTable::verify() only
+// reports on the first issue that is found.
+//
+// StringTable::verify_entry() checks:
+// - oop value != NULL (same as verify())
+// - oop value is a String
+// - hash(String) == hash in entry (same as verify())
+// - index for hash == index of entry (same as verify())
+//
+// StringTable::compare_entries() checks:
+// - oops are unique across all entries
+// - String values are unique across all entries
+//
+int StringTable::verify_and_compare_entries() {
+ assert(StringTable_lock->is_locked(), "sanity check");
+
+ int fail_cnt = 0;
+
+ // first, verify all the entries individually:
+ for (int bkt = 0; bkt < the_table()->table_size(); bkt++) {
+ HashtableEntry<oop, mtSymbol>* e_ptr = the_table()->bucket(bkt);
+ for (int e_cnt = 0; e_ptr != NULL; e_ptr = e_ptr->next(), e_cnt++) {
+ VerifyRetTypes ret = verify_entry(bkt, e_cnt, e_ptr, _verify_with_mesgs);
+ if (ret != _verify_pass) {
+ fail_cnt++;
+ }
+ }
+ }
+
+ // Optimization: if the above check did not find any failures, then
+ // the comparison loop below does not need to call verify_entry()
+ // before calling compare_entries(). If there were failures, then we
+ // have to call verify_entry() to see if the entry can be passed to
+ // compare_entries() safely. When we call verify_entry() in the loop
+ // below, we do so quietly to void duplicate messages and we don't
+ // increment fail_cnt because the failures have already been counted.
+ bool need_entry_verify = (fail_cnt != 0);
+
+ // second, verify all entries relative to each other:
+ for (int bkt1 = 0; bkt1 < the_table()->table_size(); bkt1++) {
+ HashtableEntry<oop, mtSymbol>* e_ptr1 = the_table()->bucket(bkt1);
+ for (int e_cnt1 = 0; e_ptr1 != NULL; e_ptr1 = e_ptr1->next(), e_cnt1++) {
+ if (need_entry_verify) {
+ VerifyRetTypes ret = verify_entry(bkt1, e_cnt1, e_ptr1,
+ _verify_quietly);
+ if (ret == _verify_fail_done) {
+ // cannot use the current entry to compare against other entries
+ continue;
+ }
+ }
+
+ for (int bkt2 = bkt1; bkt2 < the_table()->table_size(); bkt2++) {
+ HashtableEntry<oop, mtSymbol>* e_ptr2 = the_table()->bucket(bkt2);
+ int e_cnt2;
+ for (e_cnt2 = 0; e_ptr2 != NULL; e_ptr2 = e_ptr2->next(), e_cnt2++) {
+ if (bkt1 == bkt2 && e_cnt2 <= e_cnt1) {
+ // skip the entries up to and including the one that
+ // we're comparing against
+ continue;
+ }
+
+ if (need_entry_verify) {
+ VerifyRetTypes ret = verify_entry(bkt2, e_cnt2, e_ptr2,
+ _verify_quietly);
+ if (ret == _verify_fail_done) {
+ // cannot compare against this entry
+ continue;
+ }
+ }
+
+ // compare two entries, report and count any failures:
+ if (compare_entries(bkt1, e_cnt1, e_ptr1, bkt2, e_cnt2, e_ptr2)
+ != _verify_pass) {
+ fail_cnt++;
+ }
+ }
+ }
+ }
+ }
+ return fail_cnt;
+}
// Create a new table and using alternate hash code, populate the new table
// with the existing strings. Set flag to use the alternate hash code afterwards.
--- a/hotspot/src/share/vm/classfile/symbolTable.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -311,6 +311,26 @@
static void verify();
static void dump(outputStream* st);
+ enum VerifyMesgModes {
+ _verify_quietly = 0,
+ _verify_with_mesgs = 1
+ };
+
+ enum VerifyRetTypes {
+ _verify_pass = 0,
+ _verify_fail_continue = 1,
+ _verify_fail_done = 2
+ };
+
+ static VerifyRetTypes compare_entries(int bkt1, int e_cnt1,
+ HashtableEntry<oop, mtSymbol>* e_ptr1,
+ int bkt2, int e_cnt2,
+ HashtableEntry<oop, mtSymbol>* e_ptr2);
+ static VerifyRetTypes verify_entry(int bkt, int e_cnt,
+ HashtableEntry<oop, mtSymbol>* e_ptr,
+ VerifyMesgModes mesg_mode);
+ static int verify_and_compare_entries();
+
// Sharing
static void copy_buckets(char** top, char*end) {
the_table()->Hashtable<oop, mtSymbol>::copy_buckets(top, end);
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -270,7 +270,7 @@
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
- template(sun_invoke_Stable_signature, "Lsun/invoke/Stable;") \
+ template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
template(java_lang_invoke_MagicLambdaImpl, "java/lang/invoke/MagicLambdaImpl") \
@@ -631,6 +631,10 @@
do_name(log_name,"log") do_name(log10_name,"log10") do_name(pow_name,"pow") \
do_name(exp_name,"exp") do_name(min_name,"min") do_name(max_name,"max") \
\
+ do_name(addExact_name,"addExact") \
+ do_name(subtractExact_name,"subtractExact") \
+ do_name(multiplyExact_name,"multiplyExact") \
+ \
do_intrinsic(_dabs, java_lang_Math, abs_name, double_double_signature, F_S) \
do_intrinsic(_dsin, java_lang_Math, sin_name, double_double_signature, F_S) \
do_intrinsic(_dcos, java_lang_Math, cos_name, double_double_signature, F_S) \
@@ -643,6 +647,7 @@
do_intrinsic(_dexp, java_lang_Math, exp_name, double_double_signature, F_S) \
do_intrinsic(_min, java_lang_Math, min_name, int2_int_signature, F_S) \
do_intrinsic(_max, java_lang_Math, max_name, int2_int_signature, F_S) \
+ do_intrinsic(_addExact, java_lang_Math, addExact_name, int2_int_signature, F_S) \
\
do_intrinsic(_floatToRawIntBits, java_lang_Float, floatToRawIntBits_name, float_int_signature, F_S) \
do_name( floatToRawIntBits_name, "floatToRawIntBits") \
--- a/hotspot/src/share/vm/code/codeCache.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/codeCache.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -124,7 +124,6 @@
int CodeCache::_number_of_nmethods_with_dependencies = 0;
bool CodeCache::_needs_cache_clean = false;
nmethod* CodeCache::_scavenge_root_nmethods = NULL;
-nmethod* CodeCache::_saved_nmethods = NULL;
int CodeCache::_codemem_full_count = 0;
@@ -464,96 +463,11 @@
}
#endif //PRODUCT
-/**
- * Remove and return nmethod from the saved code list in order to reanimate it.
- */
-nmethod* CodeCache::reanimate_saved_code(Method* m) {
- MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
- nmethod* saved = _saved_nmethods;
- nmethod* prev = NULL;
- while (saved != NULL) {
- if (saved->is_in_use() && saved->method() == m) {
- if (prev != NULL) {
- prev->set_saved_nmethod_link(saved->saved_nmethod_link());
- } else {
- _saved_nmethods = saved->saved_nmethod_link();
- }
- assert(saved->is_speculatively_disconnected(), "shouldn't call for other nmethods");
- saved->set_speculatively_disconnected(false);
- saved->set_saved_nmethod_link(NULL);
- if (PrintMethodFlushing) {
- saved->print_on(tty, " ### nmethod is reconnected");
- }
- if (LogCompilation && (xtty != NULL)) {
- ttyLocker ttyl;
- xtty->begin_elem("nmethod_reconnected compile_id='%3d'", saved->compile_id());
- xtty->method(m);
- xtty->stamp();
- xtty->end_elem();
- }
- return saved;
- }
- prev = saved;
- saved = saved->saved_nmethod_link();
- }
- return NULL;
-}
-
-/**
- * Remove nmethod from the saved code list in order to discard it permanently
- */
-void CodeCache::remove_saved_code(nmethod* nm) {
- // For conc swpr this will be called with CodeCache_lock taken by caller
- assert_locked_or_safepoint(CodeCache_lock);
- assert(nm->is_speculatively_disconnected(), "shouldn't call for other nmethods");
- nmethod* saved = _saved_nmethods;
- nmethod* prev = NULL;
- while (saved != NULL) {
- if (saved == nm) {
- if (prev != NULL) {
- prev->set_saved_nmethod_link(saved->saved_nmethod_link());
- } else {
- _saved_nmethods = saved->saved_nmethod_link();
- }
- if (LogCompilation && (xtty != NULL)) {
- ttyLocker ttyl;
- xtty->begin_elem("nmethod_removed compile_id='%3d'", nm->compile_id());
- xtty->stamp();
- xtty->end_elem();
- }
- return;
- }
- prev = saved;
- saved = saved->saved_nmethod_link();
- }
- ShouldNotReachHere();
-}
-
-void CodeCache::speculatively_disconnect(nmethod* nm) {
- assert_locked_or_safepoint(CodeCache_lock);
- assert(nm->is_in_use() && !nm->is_speculatively_disconnected(), "should only disconnect live nmethods");
- nm->set_saved_nmethod_link(_saved_nmethods);
- _saved_nmethods = nm;
- if (PrintMethodFlushing) {
- nm->print_on(tty, " ### nmethod is speculatively disconnected");
- }
- if (LogCompilation && (xtty != NULL)) {
- ttyLocker ttyl;
- xtty->begin_elem("nmethod_disconnected compile_id='%3d'", nm->compile_id());
- xtty->method(nm->method());
- xtty->stamp();
- xtty->end_elem();
- }
- nm->method()->clear_code();
- nm->set_speculatively_disconnected(true);
-}
-
void CodeCache::gc_prologue() {
assert(!nmethod::oops_do_marking_is_active(), "oops_do_marking_epilogue must be called");
}
-
void CodeCache::gc_epilogue() {
assert_locked_or_safepoint(CodeCache_lock);
FOR_ALL_ALIVE_BLOBS(cb) {
--- a/hotspot/src/share/vm/code/codeCache.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/codeCache.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -57,7 +57,6 @@
static int _number_of_nmethods_with_dependencies;
static bool _needs_cache_clean;
static nmethod* _scavenge_root_nmethods; // linked via nm->scavenge_root_link()
- static nmethod* _saved_nmethods; // Linked list of speculatively disconnected nmethods.
static void verify_if_often() PRODUCT_RETURN;
@@ -167,17 +166,12 @@
static size_t capacity() { return _heap->capacity(); }
static size_t max_capacity() { return _heap->max_capacity(); }
static size_t unallocated_capacity() { return _heap->unallocated_capacity(); }
- static bool needs_flushing() { return unallocated_capacity() < CodeCacheFlushingMinimumFreeSpace; }
static double reverse_free_ratio();
static bool needs_cache_clean() { return _needs_cache_clean; }
static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
static void clear_inline_caches(); // clear all inline caches
- static nmethod* reanimate_saved_code(Method* m);
- static void remove_saved_code(nmethod* nm);
- static void speculatively_disconnect(nmethod* nm);
-
// Deoptimization
static int mark_for_deoptimization(DepChange& changes);
#ifdef HOTSWAP
--- a/hotspot/src/share/vm/code/compiledIC.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -160,32 +160,42 @@
// High-level access to an inline cache. Guaranteed to be MT-safe.
-void CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
- methodHandle method = call_info->selected_method();
- bool is_invoke_interface = (bytecode == Bytecodes::_invokeinterface && !call_info->has_vtable_index());
+bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
assert(CompiledIC_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "");
assert(!is_optimized(), "cannot set an optimized virtual call to megamorphic");
assert(is_call_to_compiled() || is_call_to_interpreted(), "going directly to megamorphic?");
address entry;
- if (is_invoke_interface) {
- int index = klassItable::compute_itable_index(call_info->resolved_method()());
- entry = VtableStubs::create_stub(false, index, method());
- assert(entry != NULL, "entry not computed");
+ if (call_info->call_kind() == CallInfo::itable_call) {
+ assert(bytecode == Bytecodes::_invokeinterface, "");
+ int itable_index = call_info->itable_index();
+ entry = VtableStubs::find_itable_stub(itable_index);
+ if (entry == false) {
+ return false;
+ }
+#ifdef ASSERT
+ int index = call_info->resolved_method()->itable_index();
+ assert(index == itable_index, "CallInfo pre-computes this");
+#endif //ASSERT
InstanceKlass* k = call_info->resolved_method()->method_holder();
- assert(k->is_interface(), "sanity check");
+ assert(k->verify_itable_index(itable_index), "sanity check");
InlineCacheBuffer::create_transition_stub(this, k, entry);
} else {
- // Can be different than method->vtable_index(), due to package-private etc.
+ assert(call_info->call_kind() == CallInfo::vtable_call, "either itable or vtable");
+ // Can be different than selected_method->vtable_index(), due to package-private etc.
int vtable_index = call_info->vtable_index();
- entry = VtableStubs::create_stub(true, vtable_index, method());
- InlineCacheBuffer::create_transition_stub(this, method(), entry);
+ assert(call_info->resolved_klass()->verify_vtable_index(vtable_index), "sanity check");
+ entry = VtableStubs::find_vtable_stub(vtable_index);
+ if (entry == NULL) {
+ return false;
+ }
+ InlineCacheBuffer::create_transition_stub(this, NULL, entry);
}
if (TraceICs) {
ResourceMark rm;
tty->print_cr ("IC@" INTPTR_FORMAT ": to megamorphic %s entry: " INTPTR_FORMAT,
- instruction_address(), method->print_value_string(), entry);
+ instruction_address(), call_info->selected_method()->print_value_string(), entry);
}
// We can't check this anymore. With lazy deopt we could have already
@@ -195,6 +205,7 @@
// race because the IC entry was complete when we safepointed so
// cleaning it immediately is harmless.
// assert(is_megamorphic(), "sanity check");
+ return true;
}
--- a/hotspot/src/share/vm/code/compiledIC.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -226,7 +226,10 @@
//
void set_to_clean(); // Can only be called during a safepoint operation
void set_to_monomorphic(CompiledICInfo& info);
- void set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS);
+
+ // Returns true if successful and false otherwise. The call can fail if memory
+ // allocation in the code cache fails.
+ bool set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS);
static void compute_monomorphic_entry(methodHandle method, KlassHandle receiver_klass,
bool is_optimized, bool static_bound, CompiledICInfo& info, TRAPS);
--- a/hotspot/src/share/vm/code/nmethod.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/nmethod.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -462,7 +462,6 @@
_state = alive;
_marked_for_reclamation = 0;
_has_flushed_dependencies = 0;
- _speculatively_disconnected = 0;
_has_unsafe_access = 0;
_has_method_handle_invokes = 0;
_lazy_critical_native = 0;
@@ -481,7 +480,6 @@
_osr_link = NULL;
_scavenge_root_link = NULL;
_scavenge_root_state = 0;
- _saved_nmethod_link = NULL;
_compiler = NULL;
#ifdef HAVE_DTRACE_H
@@ -686,6 +684,7 @@
_osr_entry_point = NULL;
_exception_cache = NULL;
_pc_desc_cache.reset_to(NULL);
+ _hotness_counter = NMethodSweeper::hotness_counter_reset_val();
code_buffer->copy_values_to(this);
if (ScavengeRootsInCode && detect_scavenge_root_oops()) {
@@ -770,6 +769,7 @@
_osr_entry_point = NULL;
_exception_cache = NULL;
_pc_desc_cache.reset_to(NULL);
+ _hotness_counter = NMethodSweeper::hotness_counter_reset_val();
code_buffer->copy_values_to(this);
debug_only(verify_scavenge_root_oops());
@@ -842,6 +842,7 @@
_comp_level = comp_level;
_compiler = compiler;
_orig_pc_offset = orig_pc_offset;
+ _hotness_counter = NMethodSweeper::hotness_counter_reset_val();
// Section offsets
_consts_offset = content_offset() + code_buffer->total_offset_of(code_buffer->consts());
@@ -1176,7 +1177,7 @@
// This is a private interface with the sweeper.
void nmethod::mark_as_seen_on_stack() {
- assert(is_not_entrant(), "must be a non-entrant method");
+ assert(is_alive(), "Must be an alive method");
// Set the traversal mark to ensure that the sweeper does 2
// cleaning passes before moving to zombie.
set_stack_traversal_mark(NMethodSweeper::traversal_count());
@@ -1261,7 +1262,7 @@
set_osr_link(NULL);
//set_scavenge_root_link(NULL); // done by prune_scavenge_root_nmethods
- NMethodSweeper::notify(this);
+ NMethodSweeper::notify();
}
void nmethod::invalidate_osr_method() {
@@ -1351,6 +1352,15 @@
nmethod_needs_unregister = true;
}
+ // Must happen before state change. Otherwise we have a race condition in
+ // nmethod::can_not_entrant_be_converted(). I.e., a method can immediately
+ // transition its state from 'not_entrant' to 'zombie' without having to wait
+ // for stack scanning.
+ if (state == not_entrant) {
+ mark_as_seen_on_stack();
+ OrderAccess::storestore();
+ }
+
// Change state
_state = state;
@@ -1369,11 +1379,6 @@
HandleMark hm;
method()->clear_code();
}
-
- if (state == not_entrant) {
- mark_as_seen_on_stack();
- }
-
} // leave critical region under Patching_lock
// When the nmethod becomes zombie it is no longer alive so the
@@ -1416,7 +1421,7 @@
}
// Make sweeper aware that there is a zombie method that needs to be removed
- NMethodSweeper::notify(this);
+ NMethodSweeper::notify();
return true;
}
@@ -1451,10 +1456,6 @@
CodeCache::drop_scavenge_root_nmethod(this);
}
- if (is_speculatively_disconnected()) {
- CodeCache::remove_saved_code(this);
- }
-
#ifdef SHARK
((SharkCompiler *) compiler())->free_compiled_method(insts_begin());
#endif // SHARK
@@ -1965,7 +1966,7 @@
if (!_detected_scavenge_root) _print_nm->print_on(tty, "new scavenge root");
tty->print_cr(""PTR_FORMAT"[offset=%d] detected scavengable oop "PTR_FORMAT" (found at "PTR_FORMAT")",
_print_nm, (int)((intptr_t)p - (intptr_t)_print_nm),
- (intptr_t)(*p), (intptr_t)p);
+ (void *)(*p), (intptr_t)p);
(*p)->print();
}
#endif //PRODUCT
@@ -2345,7 +2346,7 @@
_ok = false;
}
tty->print_cr("*** non-oop "PTR_FORMAT" found at "PTR_FORMAT" (offset %d)",
- (intptr_t)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
+ (void *)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
}
virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
};
@@ -2466,7 +2467,7 @@
_ok = false;
}
tty->print_cr("*** scavengable oop "PTR_FORMAT" found at "PTR_FORMAT" (offset %d)",
- (intptr_t)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
+ (void *)(*p), (intptr_t)p, (int)((intptr_t)p - (intptr_t)_nm));
(*p)->print();
}
virtual void do_oop(narrowOop* p) { ShouldNotReachHere(); }
--- a/hotspot/src/share/vm/code/nmethod.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/nmethod.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -119,7 +119,6 @@
// To support simple linked-list chaining of nmethods:
nmethod* _osr_link; // from InstanceKlass::osr_nmethods_head
nmethod* _scavenge_root_link; // from CodeCache::scavenge_root_nmethods
- nmethod* _saved_nmethod_link; // from CodeCache::speculatively_disconnect
static nmethod* volatile _oops_do_mark_nmethods;
nmethod* volatile _oops_do_mark_link;
@@ -165,7 +164,6 @@
// protected by CodeCache_lock
bool _has_flushed_dependencies; // Used for maintenance of dependencies (CodeCache_lock)
- bool _speculatively_disconnected; // Marked for potential unload
bool _marked_for_reclamation; // Used by NMethodSweeper (set only by sweeper)
bool _marked_for_deoptimization; // Used for stack deoptimization
@@ -180,7 +178,7 @@
unsigned int _has_wide_vectors:1; // Preserve wide vectors at safepoints
// Protected by Patching_lock
- unsigned char _state; // {alive, not_entrant, zombie, unloaded}
+ volatile unsigned char _state; // {alive, not_entrant, zombie, unloaded}
#ifdef ASSERT
bool _oops_are_stale; // indicates that it's no longer safe to access oops section
@@ -202,11 +200,18 @@
// not_entrant method removal. Each mark_sweep pass will update
// this mark to current sweep invocation count if it is seen on the
- // stack. An not_entrant method can be removed when there is no
+ // stack. An not_entrant method can be removed when there are no
// more activations, i.e., when the _stack_traversal_mark is less than
// current sweep traversal index.
long _stack_traversal_mark;
+ // The _hotness_counter indicates the hotness of a method. The higher
+ // the value the hotter the method. The hotness counter of a nmethod is
+ // set to [(ReservedCodeCacheSize / (1024 * 1024)) * 2] each time the method
+ // is active while stack scanning (mark_active_nmethods()). The hotness
+ // counter is decreased (by 1) while sweeping.
+ int _hotness_counter;
+
ExceptionCache *_exception_cache;
PcDescCache _pc_desc_cache;
@@ -382,6 +387,10 @@
int total_size () const;
+ void dec_hotness_counter() { _hotness_counter--; }
+ void set_hotness_counter(int val) { _hotness_counter = val; }
+ int hotness_counter() const { return _hotness_counter; }
+
// Containment
bool consts_contains (address addr) const { return consts_begin () <= addr && addr < consts_end (); }
bool insts_contains (address addr) const { return insts_begin () <= addr && addr < insts_end (); }
@@ -408,8 +417,8 @@
// alive. It is used when an uncommon trap happens. Returns true
// if this thread changed the state of the nmethod or false if
// another thread performed the transition.
- bool make_not_entrant() { return make_not_entrant_or_zombie(not_entrant); }
- bool make_zombie() { return make_not_entrant_or_zombie(zombie); }
+ bool make_not_entrant() { return make_not_entrant_or_zombie(not_entrant); }
+ bool make_zombie() { return make_not_entrant_or_zombie(zombie); }
// used by jvmti to track if the unload event has been reported
bool unload_reported() { return _unload_reported; }
@@ -437,9 +446,6 @@
bool has_method_handle_invokes() const { return _has_method_handle_invokes; }
void set_has_method_handle_invokes(bool z) { _has_method_handle_invokes = z; }
- bool is_speculatively_disconnected() const { return _speculatively_disconnected; }
- void set_speculatively_disconnected(bool z) { _speculatively_disconnected = z; }
-
bool is_lazy_critical_native() const { return _lazy_critical_native; }
void set_lazy_critical_native(bool z) { _lazy_critical_native = z; }
@@ -499,9 +505,6 @@
nmethod* scavenge_root_link() const { return _scavenge_root_link; }
void set_scavenge_root_link(nmethod *n) { _scavenge_root_link = n; }
- nmethod* saved_nmethod_link() const { return _saved_nmethod_link; }
- void set_saved_nmethod_link(nmethod *n) { _saved_nmethod_link = n; }
-
public:
// Sweeper support
--- a/hotspot/src/share/vm/code/vtableStubs.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/vtableStubs.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -46,12 +46,9 @@
address VtableStub::_chunk_end = NULL;
VMReg VtableStub::_receiver_location = VMRegImpl::Bad();
-static int num_vtable_chunks = 0;
-
void* VtableStub::operator new(size_t size, int code_size) throw() {
assert(size == sizeof(VtableStub), "mismatched size");
- num_vtable_chunks++;
// compute real VtableStub size (rounded to nearest word)
const int real_size = round_to(code_size + sizeof(VtableStub), wordSize);
// malloc them in chunks to minimize header overhead
@@ -60,7 +57,7 @@
const int bytes = chunk_factor * real_size + pd_code_alignment();
BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
if (blob == NULL) {
- vm_exit_out_of_memory(bytes, OOM_MALLOC_ERROR, "CodeCache: no room for vtable chunks");
+ return NULL;
}
_chunk = blob->content_begin();
_chunk_end = _chunk + bytes;
@@ -111,7 +108,7 @@
}
-address VtableStubs::create_stub(bool is_vtable_stub, int vtable_index, Method* method) {
+address VtableStubs::find_stub(bool is_vtable_stub, int vtable_index) {
assert(vtable_index >= 0, "must be positive");
VtableStub* s = ShareVtableStubs ? lookup(is_vtable_stub, vtable_index) : NULL;
@@ -121,6 +118,12 @@
} else {
s = create_itable_stub(vtable_index);
}
+
+ // Creation of vtable or itable can fail if there is not enough free space in the code cache.
+ if (s == NULL) {
+ return NULL;
+ }
+
enter(is_vtable_stub, vtable_index, s);
if (PrintAdapterHandlers) {
tty->print_cr("Decoding VtableStub %s[%d]@%d",
--- a/hotspot/src/share/vm/code/vtableStubs.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/code/vtableStubs.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -121,9 +121,11 @@
static VtableStub* lookup (bool is_vtable_stub, int vtable_index);
static void enter (bool is_vtable_stub, int vtable_index, VtableStub* s);
static inline uint hash (bool is_vtable_stub, int vtable_index);
+ static address find_stub (bool is_vtable_stub, int vtable_index);
public:
- static address create_stub(bool is_vtable_stub, int vtable_index, Method* method); // return the entry point of a stub for this call
+ static address find_vtable_stub(int vtable_index) { return find_stub(true, vtable_index); }
+ static address find_itable_stub(int itable_index) { return find_stub(false, itable_index); }
static bool is_entry_point(address pc); // is pc a vtable stub entry point?
static bool contains(address pc); // is pc within any stub?
static VtableStub* stub_containing(address pc); // stub containing pc or NULL
--- a/hotspot/src/share/vm/compiler/compileBroker.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -634,19 +634,36 @@
NMethodSweeper::possibly_sweep();
MutexLocker locker(lock());
- // Wait for an available CompileTask.
+ // If _first is NULL we have no more compile jobs. There are two reasons for
+ // having no compile jobs: First, we compiled everything we wanted. Second,
+ // we ran out of code cache so compilation has been disabled. In the latter
+ // case we perform code cache sweeps to free memory such that we can re-enable
+ // compilation.
while (_first == NULL) {
- // There is no work to be done right now. Wait.
- if (UseCodeCacheFlushing && (!CompileBroker::should_compile_new_jobs() || CodeCache::needs_flushing())) {
- // During the emergency sweeping periods, wake up and sweep occasionally
- bool timedout = lock()->wait(!Mutex::_no_safepoint_check_flag, NmethodSweepCheckInterval*1000);
- if (timedout) {
+ if (UseCodeCacheFlushing && !CompileBroker::should_compile_new_jobs()) {
+ // Wait a certain amount of time to possibly do another sweep.
+ // We must wait until stack scanning has happened so that we can
+ // transition a method's state from 'not_entrant' to 'zombie'.
+ long wait_time = NmethodSweepCheckInterval * 1000;
+ if (FLAG_IS_DEFAULT(NmethodSweepCheckInterval)) {
+ // Only one thread at a time can do sweeping. Scale the
+ // wait time according to the number of compiler threads.
+ // As a result, the next sweep is likely to happen every 100ms
+ // with an arbitrary number of threads that do sweeping.
+ wait_time = 100 * CICompilerCount;
+ }
+ bool timeout = lock()->wait(!Mutex::_no_safepoint_check_flag, wait_time);
+ if (timeout) {
MutexUnlocker ul(lock());
- // When otherwise not busy, run nmethod sweeping
NMethodSweeper::possibly_sweep();
}
} else {
- // During normal operation no need to wake up on timer
+ // If there are no compilation tasks and we can compile new jobs
+ // (i.e., there is enough free space in the code cache) there is
+ // no need to invoke the sweeper. As a result, the hotness of methods
+ // remains unchanged. This behavior is desired, since we want to keep
+ // the stable state, i.e., we do not want to evict methods from the
+ // code cache if it is unnecessary.
lock()->wait();
}
}
@@ -1227,16 +1244,9 @@
return method_code;
}
}
- if (method->is_not_compilable(comp_level)) return NULL;
-
- if (UseCodeCacheFlushing) {
- nmethod* saved = CodeCache::reanimate_saved_code(method());
- if (saved != NULL) {
- method->set_code(method, saved);
- return saved;
- }
+ if (method->is_not_compilable(comp_level)) {
+ return NULL;
}
-
} else {
// osr compilation
#ifndef TIERED
@@ -1585,9 +1595,6 @@
if (CodeCache::unallocated_capacity() < CodeCacheMinimumFreeSpace) {
// the code cache is really full
handle_full_code_cache();
- } else if (UseCodeCacheFlushing && CodeCache::needs_flushing()) {
- // Attempt to start cleaning the code cache while there is still a little headroom
- NMethodSweeper::handle_full_code_cache(false);
}
CompileTask* task = queue->get();
@@ -1943,7 +1950,11 @@
}
#endif
if (UseCodeCacheFlushing) {
- NMethodSweeper::handle_full_code_cache(true);
+ // Since code cache is full, immediately stop new compiles
+ if (CompileBroker::set_should_compile_new_jobs(CompileBroker::stop_compilation)) {
+ NMethodSweeper::log_sweep("disable_compiler");
+ NMethodSweeper::possibly_sweep();
+ }
} else {
UseCompiler = false;
AlwaysCompileLoopMethods = false;
--- a/hotspot/src/share/vm/compiler/oopMap.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/compiler/oopMap.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -628,7 +628,7 @@
// Returns value of location as an int
-intptr_t value_of_loc(oop *pointer) { return (intptr_t)(*pointer); }
+intptr_t value_of_loc(oop *pointer) { return cast_from_oop<intptr_t>((*pointer)); }
void DerivedPointerTable::add(oop *derived_loc, oop *base_loc) {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -230,7 +230,7 @@
// depends on this property.
debug_only(
FreeChunk* junk = NULL;
- assert(UseCompressedKlassPointers ||
+ assert(UseCompressedClassPointers ||
junk->prev_addr() == (void*)(oop(junk)->klass_addr()),
"Offset of FreeChunk::_prev within FreeChunk must match"
" that of OopDesc::_klass within OopDesc");
@@ -1407,7 +1407,7 @@
assert(!((FreeChunk*)obj_ptr)->is_free(), "Error, block will look free but show wrong size");
OrderAccess::storestore();
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
// Copy gap missed by (aligned) header size calculation below
obj->set_klass_gap(old->klass_gap());
}
@@ -9065,7 +9065,7 @@
return !stack->isEmpty();
}
-#define BUSY (oop(0x1aff1aff))
+#define BUSY (cast_to_oop<intptr_t>(0x1aff1aff))
// (MT-safe) Get a prefix of at most "num" from the list.
// The overflow list is chained through the mark word of
// each object in the list. We fetch the entire list,
@@ -9098,7 +9098,7 @@
return false;
}
// Grab the entire list; we'll put back a suffix
- oop prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list);
+ oop prefix = cast_to_oop(Atomic::xchg_ptr(BUSY, &_overflow_list));
Thread* tid = Thread::current();
// Before "no_of_gc_threads" was introduced CMSOverflowSpinCount was
// set to ParallelGCThreads.
@@ -9113,7 +9113,7 @@
return false;
} else if (_overflow_list != BUSY) {
// Try and grab the prefix
- prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list);
+ prefix = cast_to_oop(Atomic::xchg_ptr(BUSY, &_overflow_list));
}
}
// If the list was found to be empty, or we spun long
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -481,9 +481,8 @@
ConcurrentMark::ConcurrentMark(G1CollectedHeap* g1h, ReservedSpace heap_rs) :
_g1h(g1h),
- _markBitMap1(MinObjAlignment - 1),
- _markBitMap2(MinObjAlignment - 1),
-
+ _markBitMap1(log2_intptr(MinObjAlignment)),
+ _markBitMap2(log2_intptr(MinObjAlignment)),
_parallel_marking_threads(0),
_max_parallel_marking_threads(0),
_sleep_factor(0.0),
@@ -2695,7 +2694,7 @@
if (print_it) {
_out->print_cr(" "PTR_FORMAT"%s",
- o, (over_tams) ? " >" : (marked) ? " M" : "");
+ (void *)o, (over_tams) ? " >" : (marked) ? " M" : "");
PrintReachableOopClosure oopCl(_out, _vo, _all);
o->oop_iterate_no_header(&oopCl);
}
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -81,7 +81,7 @@
size_t* marked_bytes_array,
BitMap* task_card_bm) {
G1CollectedHeap* g1h = _g1h;
- CardTableModRefBS* ct_bs = (CardTableModRefBS*) (g1h->barrier_set());
+ CardTableModRefBS* ct_bs = g1h->g1_barrier_set();
HeapWord* start = mr.start();
HeapWord* end = mr.end();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "gc_implementation/g1/g1BiasedArray.hpp"
+
+#ifndef PRODUCT
+void G1BiasedMappedArrayBase::verify_index(idx_t index) const {
+ guarantee(_base != NULL, "Array not initialized");
+ guarantee(index < length(), err_msg("Index out of bounds index: "SIZE_FORMAT" length: "SIZE_FORMAT, index, length()));
+}
+
+void G1BiasedMappedArrayBase::verify_biased_index(idx_t biased_index) const {
+ guarantee(_biased_base != NULL, "Array not initialized");
+ guarantee(biased_index >= bias() && biased_index < (bias() + length()),
+ err_msg("Biased index out of bounds, index: "SIZE_FORMAT" bias: "SIZE_FORMAT" length: "SIZE_FORMAT, biased_index, bias(), length()));
+}
+
+void G1BiasedMappedArrayBase::verify_biased_index_inclusive_end(idx_t biased_index) const {
+ guarantee(_biased_base != NULL, "Array not initialized");
+ guarantee(biased_index >= bias() && biased_index <= (bias() + length()),
+ err_msg("Biased index out of inclusive bounds, index: "SIZE_FORMAT" bias: "SIZE_FORMAT" length: "SIZE_FORMAT, biased_index, bias(), length()));
+}
+
+class TestMappedArray : public G1BiasedMappedArray<int> {
+protected:
+ virtual int default_value() const { return 0xBAADBABE; }
+public:
+ static void test_biasedarray() {
+ const size_t REGION_SIZE_IN_WORDS = 512;
+ const size_t NUM_REGIONS = 20;
+ HeapWord* fake_heap = (HeapWord*)LP64_ONLY(0xBAAA00000) NOT_LP64(0xBA000000); // Any value that is non-zero
+
+ TestMappedArray array;
+ array.initialize(fake_heap, fake_heap + REGION_SIZE_IN_WORDS * NUM_REGIONS,
+ REGION_SIZE_IN_WORDS * HeapWordSize);
+ // Check address calculation (bounds)
+ assert(array.bottom_address_mapped() == fake_heap,
+ err_msg("bottom mapped address should be "PTR_FORMAT", but is "PTR_FORMAT, fake_heap, array.bottom_address_mapped()));
+ assert(array.end_address_mapped() == (fake_heap + REGION_SIZE_IN_WORDS * NUM_REGIONS), "must be");
+
+ int* bottom = array.address_mapped_to(fake_heap);
+ assert((void*)bottom == (void*) array.base(), "must be");
+ int* end = array.address_mapped_to(fake_heap + REGION_SIZE_IN_WORDS * NUM_REGIONS);
+ assert((void*)end == (void*)(array.base() + array.length()), "must be");
+ // The entire array should contain default value elements
+ for (int* current = bottom; current < end; current++) {
+ assert(*current == array.default_value(), "must be");
+ }
+
+ // Test setting values in the table
+
+ HeapWord* region_start_address = fake_heap + REGION_SIZE_IN_WORDS * (NUM_REGIONS / 2);
+ HeapWord* region_end_address = fake_heap + (REGION_SIZE_IN_WORDS * (NUM_REGIONS / 2) + REGION_SIZE_IN_WORDS - 1);
+
+ // Set/get by address tests: invert some value; first retrieve one
+ int actual_value = array.get_by_index(NUM_REGIONS / 2);
+ array.set_by_index(NUM_REGIONS / 2, ~actual_value);
+ // Get the same value by address, should correspond to the start of the "region"
+ int value = array.get_by_address(region_start_address);
+ assert(value == ~actual_value, "must be");
+ // Get the same value by address, at one HeapWord before the start
+ value = array.get_by_address(region_start_address - 1);
+ assert(value == array.default_value(), "must be");
+ // Get the same value by address, at the end of the "region"
+ value = array.get_by_address(region_end_address);
+ assert(value == ~actual_value, "must be");
+ // Make sure the next value maps to another index
+ value = array.get_by_address(region_end_address + 1);
+ assert(value == array.default_value(), "must be");
+
+ // Reset the value in the array
+ array.set_by_address(region_start_address + (region_end_address - region_start_address) / 2, actual_value);
+
+ // The entire array should have the default value again
+ for (int* current = bottom; current < end; current++) {
+ assert(*current == array.default_value(), "must be");
+ }
+
+ // Set/get by index tests: invert some value
+ idx_t index = NUM_REGIONS / 2;
+ actual_value = array.get_by_index(index);
+ array.set_by_index(index, ~actual_value);
+
+ value = array.get_by_index(index);
+ assert(value == ~actual_value, "must be");
+
+ value = array.get_by_index(index - 1);
+ assert(value == array.default_value(), "must be");
+
+ value = array.get_by_index(index + 1);
+ assert(value == array.default_value(), "must be");
+
+ array.set_by_index(0, 0);
+ value = array.get_by_index(0);
+ assert(value == 0, "must be");
+
+ array.set_by_index(array.length() - 1, 0);
+ value = array.get_by_index(array.length() - 1);
+ assert(value == 0, "must be");
+
+ array.set_by_index(index, 0);
+
+ // The array should have three zeros, and default values otherwise
+ size_t num_zeros = 0;
+ for (int* current = bottom; current < end; current++) {
+ assert(*current == array.default_value() || *current == 0, "must be");
+ if (*current == 0) {
+ num_zeros++;
+ }
+ }
+ assert(num_zeros == 3, "must be");
+ }
+};
+
+void TestG1BiasedArray_test() {
+ TestMappedArray::test_biasedarray();
+}
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1BiasedArray.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP
+#define SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP
+
+#include "utilities/debug.hpp"
+#include "memory/allocation.inline.hpp"
+
+// Implements the common base functionality for arrays that contain provisions
+// for accessing its elements using a biased index.
+// The element type is defined by the instantiating the template.
+class G1BiasedMappedArrayBase VALUE_OBJ_CLASS_SPEC {
+ friend class VMStructs;
+public:
+ typedef size_t idx_t;
+protected:
+ address _base; // the real base address
+ size_t _length; // the length of the array
+ address _biased_base; // base address biased by "bias" elements
+ size_t _bias; // the bias, i.e. the offset biased_base is located to the right in elements
+ uint _shift_by; // the amount of bits to shift right when mapping to an index of the array.
+
+protected:
+
+ G1BiasedMappedArrayBase() : _base(NULL), _length(0), _biased_base(NULL),
+ _bias(0), _shift_by(0) { }
+
+ // Allocate a new array, generic version.
+ static address create_new_base_array(size_t length, size_t elem_size) {
+ assert(length > 0, "just checking");
+ assert(elem_size > 0, "just checking");
+ return NEW_C_HEAP_ARRAY(u_char, length * elem_size, mtGC);
+ }
+
+ // Initialize the members of this class. The biased start address of this array
+ // is the bias (in elements) multiplied by the element size.
+ void initialize_base(address base, size_t length, size_t bias, size_t elem_size, uint shift_by) {
+ assert(base != NULL, "just checking");
+ assert(length > 0, "just checking");
+ assert(shift_by < sizeof(uintptr_t) * 8, err_msg("Shifting by %zd, larger than word size?", shift_by));
+ _base = base;
+ _length = length;
+ _biased_base = base - (bias * elem_size);
+ _bias = bias;
+ _shift_by = shift_by;
+ }
+
+ // Allocate and initialize this array to cover the heap addresses in the range
+ // of [bottom, end).
+ void initialize(HeapWord* bottom, HeapWord* end, size_t target_elem_size_in_bytes, size_t mapping_granularity_in_bytes) {
+ assert(mapping_granularity_in_bytes > 0, "just checking");
+ assert(is_power_of_2(mapping_granularity_in_bytes),
+ err_msg("mapping granularity must be power of 2, is %zd", mapping_granularity_in_bytes));
+ assert((uintptr_t)bottom % mapping_granularity_in_bytes == 0,
+ err_msg("bottom mapping area address must be a multiple of mapping granularity %zd, is "PTR_FORMAT,
+ mapping_granularity_in_bytes, bottom));
+ assert((uintptr_t)end % mapping_granularity_in_bytes == 0,
+ err_msg("end mapping area address must be a multiple of mapping granularity %zd, is "PTR_FORMAT,
+ mapping_granularity_in_bytes, end));
+ size_t num_target_elems = (end - bottom) / (mapping_granularity_in_bytes / HeapWordSize);
+ idx_t bias = (uintptr_t)bottom / mapping_granularity_in_bytes;
+ address base = create_new_base_array(num_target_elems, target_elem_size_in_bytes);
+ initialize_base(base, num_target_elems, bias, target_elem_size_in_bytes, log2_intptr(mapping_granularity_in_bytes));
+ }
+
+ size_t bias() const { return _bias; }
+ uint shift_by() const { return _shift_by; }
+
+ void verify_index(idx_t index) const PRODUCT_RETURN;
+ void verify_biased_index(idx_t biased_index) const PRODUCT_RETURN;
+ void verify_biased_index_inclusive_end(idx_t biased_index) const PRODUCT_RETURN;
+
+public:
+ // Return the length of the array in elements.
+ size_t length() const { return _length; }
+};
+
+// Array that provides biased access and mapping from (valid) addresses in the
+// heap into this array.
+template<class T>
+class G1BiasedMappedArray : public G1BiasedMappedArrayBase {
+public:
+ typedef G1BiasedMappedArrayBase::idx_t idx_t;
+
+ T* base() const { return (T*)G1BiasedMappedArrayBase::_base; }
+ // Return the element of the given array at the given index. Assume
+ // the index is valid. This is a convenience method that does sanity
+ // checking on the index.
+ T get_by_index(idx_t index) const {
+ verify_index(index);
+ return this->base()[index];
+ }
+
+ // Set the element of the given array at the given index to the
+ // given value. Assume the index is valid. This is a convenience
+ // method that does sanity checking on the index.
+ void set_by_index(idx_t index, T value) {
+ verify_index(index);
+ this->base()[index] = value;
+ }
+
+ // The raw biased base pointer.
+ T* biased_base() const { return (T*)G1BiasedMappedArrayBase::_biased_base; }
+
+ // Return the element of the given array that covers the given word in the
+ // heap. Assumes the index is valid.
+ T get_by_address(HeapWord* value) const {
+ idx_t biased_index = ((uintptr_t)value) >> this->shift_by();
+ this->verify_biased_index(biased_index);
+ return biased_base()[biased_index];
+ }
+
+ // Set the value of the array entry that corresponds to the given array.
+ void set_by_address(HeapWord * address, T value) {
+ idx_t biased_index = ((uintptr_t)address) >> this->shift_by();
+ this->verify_biased_index(biased_index);
+ biased_base()[biased_index] = value;
+ }
+
+protected:
+ // Returns the address of the element the given address maps to
+ T* address_mapped_to(HeapWord* address) {
+ idx_t biased_index = ((uintptr_t)address) >> this->shift_by();
+ this->verify_biased_index_inclusive_end(biased_index);
+ return biased_base() + biased_index;
+ }
+
+public:
+ // Return the smallest address (inclusive) in the heap that this array covers.
+ HeapWord* bottom_address_mapped() const {
+ return (HeapWord*) ((uintptr_t)this->bias() << this->shift_by());
+ }
+
+ // Return the highest address (exclusive) in the heap that this array covers.
+ HeapWord* end_address_mapped() const {
+ return (HeapWord*) ((uintptr_t)(this->bias() + this->length()) << this->shift_by());
+ }
+
+protected:
+ virtual T default_value() const = 0;
+ // Set all elements of the given array to the given value.
+ void clear() {
+ T value = default_value();
+ for (idx_t i = 0; i < length(); i++) {
+ set_by_index(i, value);
+ }
+ }
+public:
+ G1BiasedMappedArray() {}
+
+ // Allocate and initialize this array to cover the heap addresses in the range
+ // of [bottom, end).
+ void initialize(HeapWord* bottom, HeapWord* end, size_t mapping_granularity) {
+ G1BiasedMappedArrayBase::initialize(bottom, end, sizeof(T), mapping_granularity);
+ this->clear();
+ }
+};
+
+#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1BIASEDARRAY_HPP
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -33,8 +33,8 @@
void G1CardCounts::clear_range(size_t from_card_num, size_t to_card_num) {
if (has_count_table()) {
- check_card_num(from_card_num,
- err_msg("from card num out of range: "SIZE_FORMAT, from_card_num));
+ assert(from_card_num >= 0 && from_card_num < _committed_max_card_num,
+ err_msg("from card num out of range: "SIZE_FORMAT, from_card_num));
assert(from_card_num < to_card_num,
err_msg("Wrong order? from: " SIZE_FORMAT ", to: "SIZE_FORMAT,
from_card_num, to_card_num));
@@ -65,9 +65,7 @@
// threshold limit is no more than this.
guarantee(G1ConcRSHotCardLimit <= max_jubyte, "sanity");
- ModRefBarrierSet* bs = _g1h->mr_bs();
- guarantee(bs->is_a(BarrierSet::CardTableModRef), "Precondition");
- _ct_bs = (CardTableModRefBS*)bs;
+ _ct_bs = _g1h->g1_barrier_set();
_ct_bot = _ct_bs->byte_for_const(_g1h->reserved_region().start());
// Allocate/Reserve the counts table
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -72,25 +72,21 @@
return has_reserved_count_table() && _committed_max_card_num > 0;
}
- void check_card_num(size_t card_num, const char* msg) {
- assert(card_num >= 0 && card_num < _committed_max_card_num, msg);
- }
-
size_t ptr_2_card_num(const jbyte* card_ptr) {
assert(card_ptr >= _ct_bot,
- err_msg("Inavalied card pointer: "
+ err_msg("Invalid card pointer: "
"card_ptr: " PTR_FORMAT ", "
"_ct_bot: " PTR_FORMAT,
card_ptr, _ct_bot));
size_t card_num = pointer_delta(card_ptr, _ct_bot, sizeof(jbyte));
- check_card_num(card_num,
- err_msg("card pointer out of range: " PTR_FORMAT, card_ptr));
+ assert(card_num >= 0 && card_num < _committed_max_card_num,
+ err_msg("card pointer out of range: " PTR_FORMAT, card_ptr));
return card_num;
}
jbyte* card_num_2_ptr(size_t card_num) {
- check_card_num(card_num,
- err_msg("card num out of range: "SIZE_FORMAT, card_num));
+ assert(card_num >= 0 && card_num < _committed_max_card_num,
+ err_msg("card num out of range: "SIZE_FORMAT, card_num));
return (jbyte*) (_ct_bot + card_num);
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -125,10 +125,8 @@
int _histo[256];
public:
ClearLoggedCardTableEntryClosure() :
- _calls(0)
+ _calls(0), _g1h(G1CollectedHeap::heap()), _ctbs(_g1h->g1_barrier_set())
{
- _g1h = G1CollectedHeap::heap();
- _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
for (int i = 0; i < 256; i++) _histo[i] = 0;
}
bool do_card_ptr(jbyte* card_ptr, int worker_i) {
@@ -158,11 +156,8 @@
CardTableModRefBS* _ctbs;
public:
RedirtyLoggedCardTableEntryClosure() :
- _calls(0)
- {
- _g1h = G1CollectedHeap::heap();
- _ctbs = (CardTableModRefBS*)_g1h->barrier_set();
- }
+ _calls(0), _g1h(G1CollectedHeap::heap()), _ctbs(_g1h->g1_barrier_set()) {}
+
bool do_card_ptr(jbyte* card_ptr, int worker_i) {
if (_g1h->is_in_reserved(_ctbs->addr_for(card_ptr))) {
_calls++;
@@ -478,7 +473,7 @@
void G1CollectedHeap::check_ct_logs_at_safepoint() {
DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
- CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
+ CardTableModRefBS* ct_bs = g1_barrier_set();
// Count the dirty cards at the start.
CountNonCleanMemRegionClosure count1(this);
@@ -1205,7 +1200,7 @@
};
void G1CollectedHeap::clear_rsets_post_compaction() {
- PostMCRemSetClearClosure rs_clear(this, mr_bs());
+ PostMCRemSetClearClosure rs_clear(this, g1_barrier_set());
heap_region_iterate(&rs_clear);
}
@@ -1777,7 +1772,6 @@
}
bool G1CollectedHeap::expand(size_t expand_bytes) {
- size_t old_mem_size = _g1_storage.committed_size();
size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
aligned_expand_bytes = align_size_up(aligned_expand_bytes,
HeapRegion::GrainBytes);
@@ -1787,6 +1781,13 @@
ergo_format_byte("attempted expansion amount"),
expand_bytes, aligned_expand_bytes);
+ if (_g1_storage.uncommitted_size() == 0) {
+ ergo_verbose0(ErgoHeapSizing,
+ "did not expand the heap",
+ ergo_format_reason("heap already fully expanded"));
+ return false;
+ }
+
// First commit the memory.
HeapWord* old_end = (HeapWord*) _g1_storage.high();
bool successful = _g1_storage.expand_by(aligned_expand_bytes);
@@ -1845,7 +1846,6 @@
}
void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
- size_t old_mem_size = _g1_storage.committed_size();
size_t aligned_shrink_bytes =
ReservedSpace::page_align_size_down(shrink_bytes);
aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
@@ -2045,20 +2045,13 @@
// Create the gen rem set (and barrier set) for the entire reserved region.
_rem_set = collector_policy()->create_rem_set(_reserved, 2);
set_barrier_set(rem_set()->bs());
- if (barrier_set()->is_a(BarrierSet::ModRef)) {
- _mr_bs = (ModRefBarrierSet*)_barrier_set;
- } else {
- vm_exit_during_initialization("G1 requires a mod ref bs.");
+ if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) {
+ vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS");
return JNI_ENOMEM;
}
// Also create a G1 rem set.
- if (mr_bs()->is_a(BarrierSet::CardTableModRef)) {
- _g1_rem_set = new G1RemSet(this, (CardTableModRefBS*)mr_bs());
- } else {
- vm_exit_during_initialization("G1 requires a cardtable mod ref bs.");
- return JNI_ENOMEM;
- }
+ _g1_rem_set = new G1RemSet(this, g1_barrier_set());
// Carve out the G1 part of the heap.
@@ -2069,8 +2062,10 @@
_g1_storage.initialize(g1_rs, 0);
_g1_committed = MemRegion((HeapWord*)_g1_storage.low(), (size_t) 0);
_hrs.initialize((HeapWord*) _g1_reserved.start(),
- (HeapWord*) _g1_reserved.end(),
- _expansion_regions);
+ (HeapWord*) _g1_reserved.end());
+ assert(_hrs.max_length() == _expansion_regions,
+ err_msg("max length: %u expansion regions: %u",
+ _hrs.max_length(), _expansion_regions));
// Do later initialization work for concurrent refinement.
_cg1r->init();
@@ -2191,6 +2186,10 @@
return JNI_OK;
}
+size_t G1CollectedHeap::conservative_max_heap_alignment() {
+ return HeapRegion::max_region_size();
+}
+
void G1CollectedHeap::ref_processing_init() {
// Reference processing in G1 currently works as follows:
//
@@ -3675,6 +3674,11 @@
assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
// Fill TLAB's and such
ensure_parsability(true);
+
+ if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) &&
+ (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
+ g1_rem_set()->print_periodic_summary_info("Before GC RS summary");
+ }
}
void G1CollectedHeap::gc_epilogue(bool full /* Ignored */) {
@@ -3683,7 +3687,7 @@
(G1SummarizeRSetStatsPeriod > 0) &&
// we are at the end of the GC. Total collections has already been increased.
((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) {
- g1_rem_set()->print_periodic_summary_info();
+ g1_rem_set()->print_periodic_summary_info("After GC RS summary");
}
// FIXME: what is this about?
@@ -4544,7 +4548,7 @@
: _g1h(g1h),
_refs(g1h->task_queue(queue_num)),
_dcq(&g1h->dirty_card_queue_set()),
- _ct_bs((CardTableModRefBS*)_g1h->barrier_set()),
+ _ct_bs(g1h->g1_barrier_set()),
_g1_rem(g1h->g1_rem_set()),
_hash_seed(17), _queue_num(queue_num),
_term_attempts(0),
@@ -4611,7 +4615,7 @@
assert(!has_partial_array_mask(ref), err_msg("ref=" PTR_FORMAT, ref));
oop p = oopDesc::load_decode_heap_oop(ref);
assert(_g1h->is_in_g1_reserved(p),
- err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
+ err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, (void *)p));
return true;
}
@@ -4621,11 +4625,11 @@
// Must be in the collection set--it's already been copied.
oop p = clear_partial_array_mask(ref);
assert(_g1h->obj_in_cs(p),
- err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
+ err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, (void *)p));
} else {
oop p = oopDesc::load_decode_heap_oop(ref);
assert(_g1h->is_in_g1_reserved(p),
- err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, intptr_t(p)));
+ err_msg("ref=" PTR_FORMAT " p=" PTR_FORMAT, ref, (void *)p));
}
return true;
}
@@ -5973,11 +5977,11 @@
}
class G1ParCleanupCTTask : public AbstractGangTask {
- CardTableModRefBS* _ct_bs;
+ G1SATBCardTableModRefBS* _ct_bs;
G1CollectedHeap* _g1h;
HeapRegion* volatile _su_head;
public:
- G1ParCleanupCTTask(CardTableModRefBS* ct_bs,
+ G1ParCleanupCTTask(G1SATBCardTableModRefBS* ct_bs,
G1CollectedHeap* g1h) :
AbstractGangTask("G1 Par Cleanup CT Task"),
_ct_bs(ct_bs), _g1h(g1h) { }
@@ -6000,9 +6004,9 @@
#ifndef PRODUCT
class G1VerifyCardTableCleanup: public HeapRegionClosure {
G1CollectedHeap* _g1h;
- CardTableModRefBS* _ct_bs;
+ G1SATBCardTableModRefBS* _ct_bs;
public:
- G1VerifyCardTableCleanup(G1CollectedHeap* g1h, CardTableModRefBS* ct_bs)
+ G1VerifyCardTableCleanup(G1CollectedHeap* g1h, G1SATBCardTableModRefBS* ct_bs)
: _g1h(g1h), _ct_bs(ct_bs) { }
virtual bool doHeapRegion(HeapRegion* r) {
if (r->is_survivor()) {
@@ -6016,7 +6020,7 @@
void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
// All of the region should be clean.
- CardTableModRefBS* ct_bs = (CardTableModRefBS*)barrier_set();
+ G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
MemRegion mr(hr->bottom(), hr->end());
ct_bs->verify_not_dirty_region(mr);
}
@@ -6029,13 +6033,13 @@
// not dirty that area (one less thing to have to do while holding
// a lock). So we can only verify that [bottom(),pre_dummy_top()]
// is dirty.
- CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
+ G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
MemRegion mr(hr->bottom(), hr->pre_dummy_top());
ct_bs->verify_dirty_region(mr);
}
void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
- CardTableModRefBS* ct_bs = (CardTableModRefBS*) barrier_set();
+ G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
verify_dirty_region(hr);
}
@@ -6047,7 +6051,7 @@
#endif
void G1CollectedHeap::cleanUpCardTable() {
- CardTableModRefBS* ct_bs = (CardTableModRefBS*) (barrier_set());
+ G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
double start = os::elapsedTime();
{
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -31,6 +31,7 @@
#include "gc_implementation/g1/g1HRPrinter.hpp"
#include "gc_implementation/g1/g1MonitoringSupport.hpp"
#include "gc_implementation/g1/g1RemSet.hpp"
+#include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp"
#include "gc_implementation/g1/g1YCTypes.hpp"
#include "gc_implementation/g1/heapRegionSeq.hpp"
#include "gc_implementation/g1/heapRegionSets.hpp"
@@ -703,7 +704,7 @@
if (_g1_committed.contains((HeapWord*) obj)) {
// no need to subtract the bottom of the heap from obj,
// _in_cset_fast_test is biased
- uintx index = (uintx) obj >> HeapRegion::LogOfHRGrainBytes;
+ uintx index = cast_from_oop<uintx>(obj) >> HeapRegion::LogOfHRGrainBytes;
bool ret = _in_cset_fast_test[index];
// let's make sure the result is consistent with what the slower
// test returns
@@ -791,8 +792,6 @@
// The g1 remembered set of the heap.
G1RemSet* _g1_rem_set;
- // And it's mod ref barrier set, used to track updates for the above.
- ModRefBarrierSet* _mr_bs;
// A set of cards that cover the objects for which the Rsets should be updated
// concurrently after the collection.
@@ -1092,6 +1091,9 @@
// specified by the policy object.
jint initialize();
+ // Return the (conservative) maximum heap alignment for any G1 heap
+ static size_t conservative_max_heap_alignment();
+
// Initialize weak reference processing.
virtual void ref_processing_init();
@@ -1124,7 +1126,6 @@
// The rem set and barrier set.
G1RemSet* g1_rem_set() const { return _g1_rem_set; }
- ModRefBarrierSet* mr_bs() const { return _mr_bs; }
unsigned get_gc_time_stamp() {
return _gc_time_stamp;
@@ -1343,6 +1344,10 @@
virtual bool is_in_closed_subset(const void* p) const;
+ G1SATBCardTableModRefBS* g1_barrier_set() {
+ return (G1SATBCardTableModRefBS*) barrier_set();
+ }
+
// This resets the card table to all zeros. It is used after
// a collection pause which used the card table to claim cards.
void cleanUpCardTable();
@@ -1872,7 +1877,7 @@
G1CollectedHeap* _g1h;
RefToScanQueue* _refs;
DirtyCardQueue _dcq;
- CardTableModRefBS* _ct_bs;
+ G1SATBCardTableModRefBS* _ct_bs;
G1RemSet* _g1_rem;
G1ParGCAllocBufferContainer _surviving_alloc_buffer;
@@ -1911,7 +1916,7 @@
void add_to_undo_waste(size_t waste) { _undo_waste += waste; }
DirtyCardQueue& dirty_card_queue() { return _dcq; }
- CardTableModRefBS* ctbs() { return _ct_bs; }
+ G1SATBCardTableModRefBS* ctbs() { return _ct_bs; }
template <class T> void immediate_rs_update(HeapRegion* from, T* p, int tid) {
if (!from->is_survivor()) {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -134,7 +134,7 @@
assert(containing_hr->is_in(end - 1), "it should also contain end - 1");
MemRegion mr(start, end);
- ((CardTableModRefBS*)_g1h->barrier_set())->dirty(mr);
+ g1_barrier_set()->dirty(mr);
}
inline RefToScanQueue* G1CollectedHeap::task_queue(int i) const {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1EvacFailure.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1EvacFailure.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -41,11 +41,11 @@
private:
G1CollectedHeap* _g1;
DirtyCardQueue *_dcq;
- CardTableModRefBS* _ct_bs;
+ G1SATBCardTableModRefBS* _ct_bs;
public:
UpdateRSetDeferred(G1CollectedHeap* g1, DirtyCardQueue* dcq) :
- _g1(g1), _ct_bs((CardTableModRefBS*)_g1->barrier_set()), _dcq(dcq) {}
+ _g1(g1), _ct_bs(_g1->g1_barrier_set()), _dcq(dcq) {}
virtual void do_oop(narrowOop* p) { do_oop_work(p); }
virtual void do_oop( oop* p) { do_oop_work(p); }
--- a/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -220,7 +220,7 @@
public:
G1PrepareCompactClosure(CompactibleSpace* cs)
: _g1h(G1CollectedHeap::heap()),
- _mrbs(G1CollectedHeap::heap()->mr_bs()),
+ _mrbs(_g1h->g1_barrier_set()),
_cp(NULL, cs, cs->initialize_threshold()),
_humongous_proxy_set("G1MarkSweep Humongous Proxy Set") { }
--- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -91,12 +91,12 @@
}
template <class T> inline T* set_partial_array_mask(T obj) {
- assert(((uintptr_t)obj & G1_PARTIAL_ARRAY_MASK) == 0, "Information loss!");
- return (T*) ((uintptr_t)obj | G1_PARTIAL_ARRAY_MASK);
+ assert(((uintptr_t)(void *)obj & G1_PARTIAL_ARRAY_MASK) == 0, "Information loss!");
+ return (T*) ((uintptr_t)(void *)obj | G1_PARTIAL_ARRAY_MASK);
}
template <class T> inline oop clear_partial_array_mask(T* ref) {
- return oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK);
+ return cast_to_oop((intptr_t)ref & ~G1_PARTIAL_ARRAY_MASK);
}
class G1ParScanPartialArrayClosure : public G1ParClosureSuper {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -83,7 +83,9 @@
for (uint i = 0; i < n_workers(); i++) {
_cset_rs_update_cl[i] = NULL;
}
- _prev_period_summary.initialize(this, n_workers());
+ if (G1SummarizeRSetStats) {
+ _prev_period_summary.initialize(this);
+ }
}
G1RemSet::~G1RemSet() {
@@ -109,7 +111,7 @@
CodeBlobToOopClosure* _code_root_cl;
G1BlockOffsetSharedArray* _bot_shared;
- CardTableModRefBS *_ct_bs;
+ G1SATBCardTableModRefBS *_ct_bs;
double _strong_code_root_scan_time_sec;
int _worker_i;
@@ -130,7 +132,7 @@
{
_g1h = G1CollectedHeap::heap();
_bot_shared = _g1h->bot_shared();
- _ct_bs = (CardTableModRefBS*) (_g1h->barrier_set());
+ _ct_bs = _g1h->g1_barrier_set();
_block_size = MAX2<int>(G1RSetScanBlockSize, 1);
}
@@ -505,12 +507,7 @@
ScrubRSClosure(BitMap* region_bm, BitMap* card_bm) :
_g1h(G1CollectedHeap::heap()),
_region_bm(region_bm), _card_bm(card_bm),
- _ctbs(NULL)
- {
- ModRefBarrierSet* bs = _g1h->mr_bs();
- guarantee(bs->is_a(BarrierSet::CardTableModRef), "Precondition");
- _ctbs = (CardTableModRefBS*)bs;
- }
+ _ctbs(_g1h->g1_barrier_set()) {}
bool doHeapRegion(HeapRegion* r) {
if (!r->continuesHumongous()) {
@@ -731,19 +728,19 @@
return has_refs_into_cset;
}
-void G1RemSet::print_periodic_summary_info() {
+void G1RemSet::print_periodic_summary_info(const char* header) {
G1RemSetSummary current;
- current.initialize(this, n_workers());
+ current.initialize(this);
_prev_period_summary.subtract_from(¤t);
- print_summary_info(&_prev_period_summary);
+ print_summary_info(&_prev_period_summary, header);
_prev_period_summary.set(¤t);
}
void G1RemSet::print_summary_info() {
G1RemSetSummary current;
- current.initialize(this, n_workers());
+ current.initialize(this);
print_summary_info(¤t, " Cumulative RS summary");
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -145,7 +145,7 @@
virtual void print_summary_info();
// Print accumulated summary info from the last time called.
- virtual void print_periodic_summary_info();
+ virtual void print_periodic_summary_info(const char* header);
// Prepare remembered set for verification.
virtual void prepare_for_verify();
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -77,12 +77,12 @@
return _rs_threads_vtimes[thread];
}
-void G1RemSetSummary::initialize(G1RemSet* remset, uint num_workers) {
+void G1RemSetSummary::initialize(G1RemSet* remset) {
assert(_rs_threads_vtimes == NULL, "just checking");
assert(remset != NULL, "just checking");
_remset = remset;
- _num_vtimes = num_workers;
+ _num_vtimes = ConcurrentG1Refine::thread_num();
_rs_threads_vtimes = NEW_C_HEAP_ARRAY(double, _num_vtimes, mtGC);
memset(_rs_threads_vtimes, 0, sizeof(double) * _num_vtimes);
@@ -125,25 +125,115 @@
_sampling_thread_vtime = other->sampling_thread_vtime() - _sampling_thread_vtime;
}
+static double percent_of(size_t numerator, size_t denominator) {
+ if (denominator != 0) {
+ return (double)numerator / denominator * 100.0f;
+ } else {
+ return 0.0f;
+ }
+}
+
+static size_t round_to_K(size_t value) {
+ return value / K;
+}
+
+class RegionTypeCounter VALUE_OBJ_CLASS_SPEC {
+private:
+ const char* _name;
+
+ size_t _rs_mem_size;
+ size_t _cards_occupied;
+ size_t _amount;
+
+ size_t _code_root_mem_size;
+ size_t _code_root_elems;
+
+ double rs_mem_size_percent_of(size_t total) {
+ return percent_of(_rs_mem_size, total);
+ }
+
+ double cards_occupied_percent_of(size_t total) {
+ return percent_of(_cards_occupied, total);
+ }
+
+ double code_root_mem_size_percent_of(size_t total) {
+ return percent_of(_code_root_mem_size, total);
+ }
+
+ double code_root_elems_percent_of(size_t total) {
+ return percent_of(_code_root_elems, total);
+ }
+
+ size_t amount() const { return _amount; }
+
+public:
+
+ RegionTypeCounter(const char* name) : _name(name), _rs_mem_size(0), _cards_occupied(0),
+ _amount(0), _code_root_mem_size(0), _code_root_elems(0) { }
+
+ void add(size_t rs_mem_size, size_t cards_occupied, size_t code_root_mem_size,
+ size_t code_root_elems) {
+ _rs_mem_size += rs_mem_size;
+ _cards_occupied += cards_occupied;
+ _code_root_mem_size += code_root_mem_size;
+ _code_root_elems += code_root_elems;
+ _amount++;
+ }
+
+ size_t rs_mem_size() const { return _rs_mem_size; }
+ size_t cards_occupied() const { return _cards_occupied; }
+
+ size_t code_root_mem_size() const { return _code_root_mem_size; }
+ size_t code_root_elems() const { return _code_root_elems; }
+
+ void print_rs_mem_info_on(outputStream * out, size_t total) {
+ out->print_cr(" %8dK (%5.1f%%) by %zd %s regions", round_to_K(rs_mem_size()), rs_mem_size_percent_of(total), amount(), _name);
+ }
+
+ void print_cards_occupied_info_on(outputStream * out, size_t total) {
+ out->print_cr(" %8d (%5.1f%%) entries by %zd %s regions", cards_occupied(), cards_occupied_percent_of(total), amount(), _name);
+ }
+
+ void print_code_root_mem_info_on(outputStream * out, size_t total) {
+ out->print_cr(" %8dK (%5.1f%%) by %zd %s regions", round_to_K(code_root_mem_size()), code_root_mem_size_percent_of(total), amount(), _name);
+ }
+
+ void print_code_root_elems_info_on(outputStream * out, size_t total) {
+ out->print_cr(" %8d (%5.1f%%) elements by %zd %s regions", code_root_elems(), code_root_elems_percent_of(total), amount(), _name);
+ }
+};
+
+
class HRRSStatsIter: public HeapRegionClosure {
- size_t _occupied;
+private:
+ RegionTypeCounter _young;
+ RegionTypeCounter _humonguous;
+ RegionTypeCounter _free;
+ RegionTypeCounter _old;
+ RegionTypeCounter _all;
- size_t _total_rs_mem_sz;
size_t _max_rs_mem_sz;
HeapRegion* _max_rs_mem_sz_region;
- size_t _total_code_root_mem_sz;
+ size_t total_rs_mem_sz() const { return _all.rs_mem_size(); }
+ size_t total_cards_occupied() const { return _all.cards_occupied(); }
+
+ size_t max_rs_mem_sz() const { return _max_rs_mem_sz; }
+ HeapRegion* max_rs_mem_sz_region() const { return _max_rs_mem_sz_region; }
+
size_t _max_code_root_mem_sz;
HeapRegion* _max_code_root_mem_sz_region;
+
+ size_t total_code_root_mem_sz() const { return _all.code_root_mem_size(); }
+ size_t total_code_root_elems() const { return _all.code_root_elems(); }
+
+ size_t max_code_root_mem_sz() const { return _max_code_root_mem_sz; }
+ HeapRegion* max_code_root_mem_sz_region() const { return _max_code_root_mem_sz_region; }
+
public:
- HRRSStatsIter() :
- _occupied(0),
- _total_rs_mem_sz(0),
- _max_rs_mem_sz(0),
- _max_rs_mem_sz_region(NULL),
- _total_code_root_mem_sz(0),
- _max_code_root_mem_sz(0),
- _max_code_root_mem_sz_region(NULL)
+ HRRSStatsIter() : _all("All"), _young("Young"), _humonguous("Humonguous"),
+ _free("Free"), _old("Old"), _max_code_root_mem_sz_region(NULL), _max_rs_mem_sz_region(NULL),
+ _max_rs_mem_sz(0), _max_code_root_mem_sz(0)
{}
bool doHeapRegion(HeapRegion* r) {
@@ -156,46 +246,95 @@
_max_rs_mem_sz = rs_mem_sz;
_max_rs_mem_sz_region = r;
}
- _total_rs_mem_sz += rs_mem_sz;
-
+ size_t occupied_cards = hrrs->occupied();
size_t code_root_mem_sz = hrrs->strong_code_roots_mem_size();
- if (code_root_mem_sz > _max_code_root_mem_sz) {
- _max_code_root_mem_sz = code_root_mem_sz;
+ if (code_root_mem_sz > max_code_root_mem_sz()) {
_max_code_root_mem_sz_region = r;
}
- _total_code_root_mem_sz += code_root_mem_sz;
+ size_t code_root_elems = hrrs->strong_code_roots_list_length();
- size_t occ = hrrs->occupied();
- _occupied += occ;
+ RegionTypeCounter* current = NULL;
+ if (r->is_young()) {
+ current = &_young;
+ } else if (r->isHumongous()) {
+ current = &_humonguous;
+ } else if (r->is_empty()) {
+ current = &_free;
+ } else {
+ current = &_old;
+ }
+ current->add(rs_mem_sz, occupied_cards, code_root_mem_sz, code_root_elems);
+ _all.add(rs_mem_sz, occupied_cards, code_root_mem_sz, code_root_elems);
+
return false;
}
- size_t total_rs_mem_sz() { return _total_rs_mem_sz; }
- size_t max_rs_mem_sz() { return _max_rs_mem_sz; }
- HeapRegion* max_rs_mem_sz_region() { return _max_rs_mem_sz_region; }
- size_t total_code_root_mem_sz() { return _total_code_root_mem_sz; }
- size_t max_code_root_mem_sz() { return _max_code_root_mem_sz; }
- HeapRegion* max_code_root_mem_sz_region() { return _max_code_root_mem_sz_region; }
- size_t occupied() { return _occupied; }
+
+ void print_summary_on(outputStream* out) {
+ RegionTypeCounter* counters[] = { &_young, &_humonguous, &_free, &_old, NULL };
+
+ out->print_cr("\n Current rem set statistics");
+ out->print_cr(" Total per region rem sets sizes = "SIZE_FORMAT"K."
+ " Max = "SIZE_FORMAT"K.",
+ round_to_K(total_rs_mem_sz()), round_to_K(max_rs_mem_sz()));
+ for (RegionTypeCounter** current = &counters[0]; *current != NULL; current++) {
+ (*current)->print_rs_mem_info_on(out, total_rs_mem_sz());
+ }
+
+ out->print_cr(" Static structures = "SIZE_FORMAT"K,"
+ " free_lists = "SIZE_FORMAT"K.",
+ round_to_K(HeapRegionRemSet::static_mem_size()),
+ round_to_K(HeapRegionRemSet::fl_mem_size()));
+
+ out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
+ total_cards_occupied());
+ for (RegionTypeCounter** current = &counters[0]; *current != NULL; current++) {
+ (*current)->print_cards_occupied_info_on(out, total_cards_occupied());
+ }
+
+ // Largest sized rem set region statistics
+ HeapRegionRemSet* rem_set = max_rs_mem_sz_region()->rem_set();
+ out->print_cr(" Region with largest rem set = "HR_FORMAT", "
+ "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
+ HR_FORMAT_PARAMS(max_rs_mem_sz_region()),
+ round_to_K(rem_set->mem_size()),
+ round_to_K(rem_set->occupied()));
+
+ // Strong code root statistics
+ HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region()->rem_set();
+ out->print_cr(" Total heap region code root sets sizes = "SIZE_FORMAT"K."
+ " Max = "SIZE_FORMAT"K.",
+ round_to_K(total_code_root_mem_sz()),
+ round_to_K(max_code_root_rem_set->strong_code_roots_mem_size()));
+ for (RegionTypeCounter** current = &counters[0]; *current != NULL; current++) {
+ (*current)->print_code_root_mem_info_on(out, total_code_root_mem_sz());
+ }
+
+ out->print_cr(" "SIZE_FORMAT" code roots represented.",
+ total_code_root_elems());
+ for (RegionTypeCounter** current = &counters[0]; *current != NULL; current++) {
+ (*current)->print_code_root_elems_info_on(out, total_code_root_elems());
+ }
+
+ out->print_cr(" Region with largest amount of code roots = "HR_FORMAT", "
+ "size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".",
+ HR_FORMAT_PARAMS(max_code_root_mem_sz_region()),
+ round_to_K(max_code_root_rem_set->strong_code_roots_mem_size()),
+ round_to_K(max_code_root_rem_set->strong_code_roots_list_length()));
+ }
};
-double calc_percentage(size_t numerator, size_t denominator) {
- if (denominator != 0) {
- return (double)numerator / denominator * 100.0;
- } else {
- return 0.0f;
- }
-}
-
void G1RemSetSummary::print_on(outputStream* out) {
- out->print_cr("\n Concurrent RS processed "SIZE_FORMAT" cards",
+ out->print_cr("\n Recent concurrent refinement statistics");
+ out->print_cr(" Processed "SIZE_FORMAT" cards",
num_concurrent_refined_cards());
out->print_cr(" Of %d completed buffers:", num_processed_buf_total());
out->print_cr(" %8d (%5.1f%%) by concurrent RS threads.",
num_processed_buf_total(),
- calc_percentage(num_processed_buf_rs_threads(), num_processed_buf_total()));
+ percent_of(num_processed_buf_rs_threads(), num_processed_buf_total()));
out->print_cr(" %8d (%5.1f%%) by mutator threads.",
num_processed_buf_mutator(),
- calc_percentage(num_processed_buf_mutator(), num_processed_buf_total()));
+ percent_of(num_processed_buf_mutator(), num_processed_buf_total()));
+ out->print_cr(" Did %d coarsenings.", num_coarsenings());
out->print_cr(" Concurrent RS threads times (s)");
out->print(" ");
for (uint i = 0; i < _num_vtimes; i++) {
@@ -207,33 +346,5 @@
HRRSStatsIter blk;
G1CollectedHeap::heap()->heap_region_iterate(&blk);
- // RemSet stats
- out->print_cr(" Total heap region rem set sizes = "SIZE_FORMAT"K."
- " Max = "SIZE_FORMAT"K.",
- blk.total_rs_mem_sz()/K, blk.max_rs_mem_sz()/K);
- out->print_cr(" Static structures = "SIZE_FORMAT"K,"
- " free_lists = "SIZE_FORMAT"K.",
- HeapRegionRemSet::static_mem_size() / K,
- HeapRegionRemSet::fl_mem_size() / K);
- out->print_cr(" "SIZE_FORMAT" occupied cards represented.",
- blk.occupied());
- HeapRegion* max_rs_mem_sz_region = blk.max_rs_mem_sz_region();
- HeapRegionRemSet* max_rs_rem_set = max_rs_mem_sz_region->rem_set();
- out->print_cr(" Max size region = "HR_FORMAT", "
- "size = "SIZE_FORMAT "K, occupied = "SIZE_FORMAT"K.",
- HR_FORMAT_PARAMS(max_rs_mem_sz_region),
- (max_rs_rem_set->mem_size() + K - 1)/K,
- (max_rs_rem_set->occupied() + K - 1)/K);
- out->print_cr(" Did %d coarsenings.", num_coarsenings());
- // Strong code root stats
- out->print_cr(" Total heap region code-root set sizes = "SIZE_FORMAT"K."
- " Max = "SIZE_FORMAT"K.",
- blk.total_code_root_mem_sz()/K, blk.max_code_root_mem_sz()/K);
- HeapRegion* max_code_root_mem_sz_region = blk.max_code_root_mem_sz_region();
- HeapRegionRemSet* max_code_root_rem_set = max_code_root_mem_sz_region->rem_set();
- out->print_cr(" Max size region = "HR_FORMAT", "
- "size = "SIZE_FORMAT "K, num_elems = "SIZE_FORMAT".",
- HR_FORMAT_PARAMS(max_code_root_mem_sz_region),
- (max_code_root_rem_set->strong_code_roots_mem_size() + K - 1)/K,
- (max_code_root_rem_set->strong_code_roots_list_length()));
+ blk.print_summary_on(out);
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -84,7 +84,7 @@
void subtract_from(G1RemSetSummary* other);
// initialize and get the first sampling
- void initialize(G1RemSet* remset, uint num_workers);
+ void initialize(G1RemSet* remset);
void print_on(outputStream* out);
--- a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -64,6 +64,27 @@
}
}
+bool G1SATBCardTableModRefBS::mark_card_deferred(size_t card_index) {
+ jbyte val = _byte_map[card_index];
+ // It's already processed
+ if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) {
+ return false;
+ }
+ // Cached bit can be installed either on a clean card or on a claimed card.
+ jbyte new_val = val;
+ if (val == clean_card_val()) {
+ new_val = (jbyte)deferred_card_val();
+ } else {
+ if (val & claimed_card_val()) {
+ new_val = val | (jbyte)deferred_card_val();
+ }
+ }
+ if (new_val != val) {
+ Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
+ }
+ return true;
+}
+
G1SATBCardTableLoggingModRefBS::
G1SATBCardTableLoggingModRefBS(MemRegion whole_heap,
int max_covered_regions) :
@@ -95,7 +116,7 @@
G1SATBCardTableLoggingModRefBS::write_ref_field_static(void* field,
oop new_val) {
uintptr_t field_uint = (uintptr_t)field;
- uintptr_t new_val_uint = (uintptr_t)new_val;
+ uintptr_t new_val_uint = cast_from_oop<uintptr_t>(new_val);
uintptr_t comb = field_uint ^ new_val_uint;
comb = comb >> HeapRegion::LogOfHRGrainBytes;
if (comb == 0) return;
--- a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -89,6 +89,42 @@
write_ref_array_pre_work(dst, count);
}
}
+
+/*
+ Claimed and deferred bits are used together in G1 during the evacuation
+ pause. These bits can have the following state transitions:
+ 1. The claimed bit can be put over any other card state. Except that
+ the "dirty -> dirty and claimed" transition is checked for in
+ G1 code and is not used.
+ 2. Deferred bit can be set only if the previous state of the card
+ was either clean or claimed. mark_card_deferred() is wait-free.
+ We do not care if the operation is be successful because if
+ it does not it will only result in duplicate entry in the update
+ buffer because of the "cache-miss". So it's not worth spinning.
+ */
+
+ bool is_card_claimed(size_t card_index) {
+ jbyte val = _byte_map[card_index];
+ return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val();
+ }
+
+ void set_card_claimed(size_t card_index) {
+ jbyte val = _byte_map[card_index];
+ if (val == clean_card_val()) {
+ val = (jbyte)claimed_card_val();
+ } else {
+ val |= (jbyte)claimed_card_val();
+ }
+ _byte_map[card_index] = val;
+ }
+
+ bool mark_card_deferred(size_t card_index);
+
+ bool is_card_deferred(size_t card_index) {
+ jbyte val = _byte_map[card_index];
+ return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val();
+ }
+
};
// Adds card-table logging to the post-barrier.
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -149,6 +149,10 @@
// many regions in the heap (based on the min heap size).
#define TARGET_REGION_NUMBER 2048
+size_t HeapRegion::max_region_size() {
+ return (size_t)MAX_REGION_SIZE;
+}
+
void HeapRegion::setup_heap_region_size(size_t initial_heap_size, size_t max_heap_size) {
uintx region_size = G1HeapRegionSize;
if (FLAG_IS_DEFAULT(G1HeapRegionSize)) {
@@ -633,7 +637,7 @@
gclog_or_tty->print_cr("Object "PTR_FORMAT" in region "
"["PTR_FORMAT", "PTR_FORMAT") is above "
"top "PTR_FORMAT,
- obj, _hr->bottom(), _hr->end(), _hr->top());
+ (void *)obj, _hr->bottom(), _hr->end(), _hr->top());
_failures = true;
return;
}
@@ -947,12 +951,12 @@
Klass* klass = obj->klass();
if (!klass->is_metaspace_object()) {
gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
- "not metadata", klass, obj);
+ "not metadata", klass, (void *)obj);
*failures = true;
return;
} else if (!klass->is_klass()) {
gclog_or_tty->print_cr("klass "PTR_FORMAT" of object "PTR_FORMAT" "
- "not a klass", klass, obj);
+ "not a klass", klass, (void *)obj);
*failures = true;
return;
} else {
@@ -967,7 +971,7 @@
}
}
} else {
- gclog_or_tty->print_cr(PTR_FORMAT" no an oop", obj);
+ gclog_or_tty->print_cr(PTR_FORMAT" no an oop", (void *)obj);
*failures = true;
return;
}
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -355,6 +355,8 @@
~((1 << (size_t) LogOfHRGrainBytes) - 1);
}
+ static size_t max_region_size();
+
// It sets up the heap region size (GrainBytes / GrainWords), as
// well as other related fields that are based on the heap region
// size (LogOfHRGrainBytes / LogOfHRGrainWords /
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -91,8 +91,8 @@
gclog_or_tty->print_cr(" PRT::Add_reference_work(" PTR_FORMAT "->" PTR_FORMAT").",
from,
UseCompressedOops
- ? oopDesc::load_decode_heap_oop((narrowOop*)from)
- : oopDesc::load_decode_heap_oop((oop*)from));
+ ? (void *)oopDesc::load_decode_heap_oop((narrowOop*)from)
+ : (void *)oopDesc::load_decode_heap_oop((oop*)from));
}
HeapRegion* loc_hr = hr();
@@ -403,8 +403,8 @@
gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").",
from,
UseCompressedOops
- ? oopDesc::load_decode_heap_oop((narrowOop*)from)
- : oopDesc::load_decode_heap_oop((oop*)from));
+ ? (void *)oopDesc::load_decode_heap_oop((narrowOop*)from)
+ : (void *)oopDesc::load_decode_heap_oop((oop*)from));
}
int from_card = (int)(uintptr_t(from) >> CardTableModRefBS::card_shift);
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -71,27 +71,16 @@
// Public
-void HeapRegionSeq::initialize(HeapWord* bottom, HeapWord* end,
- uint max_length) {
+void HeapRegionSeq::initialize(HeapWord* bottom, HeapWord* end) {
assert((uintptr_t) bottom % HeapRegion::GrainBytes == 0,
"bottom should be heap region aligned");
assert((uintptr_t) end % HeapRegion::GrainBytes == 0,
"end should be heap region aligned");
- _length = 0;
- _heap_bottom = bottom;
- _heap_end = end;
- _region_shift = HeapRegion::LogOfHRGrainBytes;
_next_search_index = 0;
_allocated_length = 0;
- _max_length = max_length;
- _regions = NEW_C_HEAP_ARRAY(HeapRegion*, max_length, mtGC);
- memset(_regions, 0, (size_t) max_length * sizeof(HeapRegion*));
- _regions_biased = _regions - ((uintx) bottom >> _region_shift);
-
- assert(&_regions[0] == &_regions_biased[addr_to_index_biased(bottom)],
- "bottom should be included in the region with index 0");
+ _regions.initialize(bottom, end, HeapRegion::GrainBytes);
}
MemRegion HeapRegionSeq::expand_by(HeapWord* old_end,
@@ -101,15 +90,15 @@
G1CollectedHeap* g1h = G1CollectedHeap::heap();
HeapWord* next_bottom = old_end;
- assert(_heap_bottom <= next_bottom, "invariant");
+ assert(heap_bottom() <= next_bottom, "invariant");
while (next_bottom < new_end) {
- assert(next_bottom < _heap_end, "invariant");
+ assert(next_bottom < heap_end(), "invariant");
uint index = length();
- assert(index < _max_length, "otherwise we cannot expand further");
+ assert(index < max_length(), "otherwise we cannot expand further");
if (index == 0) {
// We have not allocated any regions so far
- assert(next_bottom == _heap_bottom, "invariant");
+ assert(next_bottom == heap_bottom(), "invariant");
} else {
// next_bottom should match the end of the last/previous region
assert(next_bottom == at(index - 1)->end(), "invariant");
@@ -122,8 +111,8 @@
// allocation failed, we bail out and return what we have done so far
return MemRegion(old_end, next_bottom);
}
- assert(_regions[index] == NULL, "invariant");
- _regions[index] = new_hr;
+ assert(_regions.get_by_index(index) == NULL, "invariant");
+ _regions.set_by_index(index, new_hr);
increment_allocated_length();
}
// Have to increment the length first, otherwise we will get an
@@ -228,26 +217,26 @@
#ifndef PRODUCT
void HeapRegionSeq::verify_optional() {
- guarantee(_length <= _allocated_length,
+ guarantee(length() <= _allocated_length,
err_msg("invariant: _length: %u _allocated_length: %u",
- _length, _allocated_length));
- guarantee(_allocated_length <= _max_length,
+ length(), _allocated_length));
+ guarantee(_allocated_length <= max_length(),
err_msg("invariant: _allocated_length: %u _max_length: %u",
- _allocated_length, _max_length));
- guarantee(_next_search_index <= _length,
+ _allocated_length, max_length()));
+ guarantee(_next_search_index <= length(),
err_msg("invariant: _next_search_index: %u _length: %u",
- _next_search_index, _length));
+ _next_search_index, length()));
- HeapWord* prev_end = _heap_bottom;
+ HeapWord* prev_end = heap_bottom();
for (uint i = 0; i < _allocated_length; i += 1) {
- HeapRegion* hr = _regions[i];
+ HeapRegion* hr = _regions.get_by_index(i);
guarantee(hr != NULL, err_msg("invariant: i: %u", i));
guarantee(hr->bottom() == prev_end,
err_msg("invariant i: %u "HR_FORMAT" prev_end: "PTR_FORMAT,
i, HR_FORMAT_PARAMS(hr), prev_end));
guarantee(hr->hrs_index() == i,
err_msg("invariant: i: %u hrs_index(): %u", i, hr->hrs_index()));
- if (i < _length) {
+ if (i < length()) {
// Asserts will fire if i is >= _length
HeapWord* addr = hr->bottom();
guarantee(addr_to_region(addr) == hr, "sanity");
@@ -265,8 +254,8 @@
prev_end = hr->end();
}
}
- for (uint i = _allocated_length; i < _max_length; i += 1) {
- guarantee(_regions[i] == NULL, err_msg("invariant i: %u", i));
+ for (uint i = _allocated_length; i < max_length(); i += 1) {
+ guarantee(_regions.get_by_index(i) == NULL, err_msg("invariant i: %u", i));
}
}
#endif // PRODUCT
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -25,10 +25,17 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
#define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSEQ_HPP
+#include "gc_implementation/g1/g1BiasedArray.hpp"
+
class HeapRegion;
class HeapRegionClosure;
class FreeRegionList;
+class G1HeapRegionTable : public G1BiasedMappedArray<HeapRegion*> {
+ protected:
+ virtual HeapRegion* default_value() const { return NULL; }
+};
+
// This class keeps track of the region metadata (i.e., HeapRegion
// instances). They are kept in the _regions array in address
// order. A region's index in the array corresponds to its index in
@@ -44,35 +51,21 @@
//
// We keep track of three lengths:
//
-// * _length (returned by length()) is the number of currently
+// * _committed_length (returned by length()) is the number of currently
// committed regions.
// * _allocated_length (not exposed outside this class) is the
// number of regions for which we have HeapRegions.
-// * _max_length (returned by max_length()) is the maximum number of
-// regions the heap can have.
+// * max_length() returns the maximum number of regions the heap can have.
//
-// and maintain that: _length <= _allocated_length <= _max_length
+// and maintain that: _committed_length <= _allocated_length <= max_length()
class HeapRegionSeq: public CHeapObj<mtGC> {
friend class VMStructs;
- // The array that holds the HeapRegions.
- HeapRegion** _regions;
-
- // Version of _regions biased to address 0
- HeapRegion** _regions_biased;
+ G1HeapRegionTable _regions;
// The number of regions committed in the heap.
- uint _length;
-
- // The address of the first reserved word in the heap.
- HeapWord* _heap_bottom;
-
- // The address of the last reserved word in the heap - 1.
- HeapWord* _heap_end;
-
- // The log of the region byte size.
- uint _region_shift;
+ uint _committed_length;
// A hint for which index to start searching from for humongous
// allocations.
@@ -81,37 +74,33 @@
// The number of regions for which we have allocated HeapRegions for.
uint _allocated_length;
- // The maximum number of regions in the heap.
- uint _max_length;
-
// Find a contiguous set of empty regions of length num, starting
// from the given index.
uint find_contiguous_from(uint from, uint num);
- // Map a heap address to a biased region index. Assume that the
- // address is valid.
- inline uintx addr_to_index_biased(HeapWord* addr) const;
-
void increment_allocated_length() {
- assert(_allocated_length < _max_length, "pre-condition");
+ assert(_allocated_length < max_length(), "pre-condition");
_allocated_length++;
}
void increment_length() {
- assert(_length < _max_length, "pre-condition");
- _length++;
+ assert(length() < max_length(), "pre-condition");
+ _committed_length++;
}
void decrement_length() {
- assert(_length > 0, "pre-condition");
- _length--;
+ assert(length() > 0, "pre-condition");
+ _committed_length--;
}
+ HeapWord* heap_bottom() const { return _regions.bottom_address_mapped(); }
+ HeapWord* heap_end() const {return _regions.end_address_mapped(); }
+
public:
// Empty contructor, we'll initialize it with the initialize() method.
- HeapRegionSeq() { }
+ HeapRegionSeq() : _regions(), _committed_length(0), _next_search_index(0), _allocated_length(0) { }
- void initialize(HeapWord* bottom, HeapWord* end, uint max_length);
+ void initialize(HeapWord* bottom, HeapWord* end);
// Return the HeapRegion at the given index. Assume that the index
// is valid.
@@ -126,10 +115,10 @@
inline HeapRegion* addr_to_region_unsafe(HeapWord* addr) const;
// Return the number of regions that have been committed in the heap.
- uint length() const { return _length; }
+ uint length() const { return _committed_length; }
// Return the maximum number of regions in the heap.
- uint max_length() const { return _max_length; }
+ uint max_length() const { return (uint)_regions.length(); }
// Expand the sequence to reflect that the heap has grown from
// old_end to new_end. Either create new HeapRegions, or re-use
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -28,28 +28,16 @@
#include "gc_implementation/g1/heapRegion.hpp"
#include "gc_implementation/g1/heapRegionSeq.hpp"
-inline uintx HeapRegionSeq::addr_to_index_biased(HeapWord* addr) const {
- assert(_heap_bottom <= addr && addr < _heap_end,
- err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT" end: "PTR_FORMAT,
- addr, _heap_bottom, _heap_end));
- uintx index = (uintx) addr >> _region_shift;
- return index;
-}
-
inline HeapRegion* HeapRegionSeq::addr_to_region_unsafe(HeapWord* addr) const {
- assert(_heap_bottom <= addr && addr < _heap_end,
- err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT" end: "PTR_FORMAT,
- addr, _heap_bottom, _heap_end));
- uintx index_biased = addr_to_index_biased(addr);
- HeapRegion* hr = _regions_biased[index_biased];
+ HeapRegion* hr = _regions.get_by_address(addr);
assert(hr != NULL, "invariant");
return hr;
}
inline HeapRegion* HeapRegionSeq::addr_to_region(HeapWord* addr) const {
- if (addr != NULL && addr < _heap_end) {
- assert(addr >= _heap_bottom,
- err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT, addr, _heap_bottom));
+ if (addr != NULL && addr < heap_end()) {
+ assert(addr >= heap_bottom(),
+ err_msg("addr: "PTR_FORMAT" bottom: "PTR_FORMAT, addr, heap_bottom()));
return addr_to_region_unsafe(addr);
}
return NULL;
@@ -57,7 +45,7 @@
inline HeapRegion* HeapRegionSeq::at(uint index) const {
assert(index < length(), "pre-condition");
- HeapRegion* hr = _regions[index];
+ HeapRegion* hr = _regions.get_by_index(index);
assert(hr != NULL, "sanity");
assert(hr->hrs_index() == index, "sanity");
return hr;
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -38,6 +38,7 @@
class PtrQueueSet;
class PtrQueue VALUE_OBJ_CLASS_SPEC {
+ friend class VMStructs;
protected:
// The ptr queue set to which this queue belongs.
--- a/hotspot/src/share/vm/gc_implementation/g1/vmStructs_g1.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/vmStructs_g1.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -31,10 +31,17 @@
#define VM_STRUCTS_G1(nonstatic_field, static_field) \
\
- static_field(HeapRegion, GrainBytes, size_t) \
+ static_field(HeapRegion, GrainBytes, size_t) \
+ static_field(HeapRegion, LogOfHRGrainBytes, int) \
\
- nonstatic_field(HeapRegionSeq, _regions, HeapRegion**) \
- nonstatic_field(HeapRegionSeq, _length, uint) \
+ nonstatic_field(G1HeapRegionTable, _base, address) \
+ nonstatic_field(G1HeapRegionTable, _length, size_t) \
+ nonstatic_field(G1HeapRegionTable, _biased_base, address) \
+ nonstatic_field(G1HeapRegionTable, _bias, size_t) \
+ nonstatic_field(G1HeapRegionTable, _shift_by, uint) \
+ \
+ nonstatic_field(HeapRegionSeq, _regions, G1HeapRegionTable) \
+ nonstatic_field(HeapRegionSeq, _committed_length, uint) \
\
nonstatic_field(G1CollectedHeap, _hrs, HeapRegionSeq) \
nonstatic_field(G1CollectedHeap, _g1_committed, MemRegion) \
@@ -57,6 +64,8 @@
#define VM_TYPES_G1(declare_type, declare_toplevel_type) \
\
+ declare_toplevel_type(G1HeapRegionTable) \
+ \
declare_type(G1CollectedHeap, SharedHeap) \
\
declare_type(HeapRegion, ContiguousSpace) \
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1103,7 +1103,7 @@
}
}
-static const oop ClaimedForwardPtr = oop(0x4);
+static const oop ClaimedForwardPtr = cast_to_oop<intptr_t>(0x4);
// Because of concurrency, there are times where an object for which
// "is_forwarded()" is true contains an "interim" forwarding pointer
@@ -1226,7 +1226,7 @@
if (TraceScavenge) {
gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
is_in_reserved(new_obj) ? "copying" : "tenuring",
- new_obj->klass()->internal_name(), old, new_obj, new_obj->size());
+ new_obj->klass()->internal_name(), (void *)old, (void *)new_obj, new_obj->size());
}
#endif
@@ -1347,7 +1347,7 @@
if (TraceScavenge) {
gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
is_in_reserved(new_obj) ? "copying" : "tenuring",
- new_obj->klass()->internal_name(), old, new_obj, new_obj->size());
+ new_obj->klass()->internal_name(), (void *)old, (void *)new_obj, new_obj->size());
}
#endif
@@ -1436,7 +1436,7 @@
// (although some performance comparisons would be useful since
// single global lists have their own performance disadvantages
// as we were made painfully aware not long ago, see 6786503).
-#define BUSY (oop(0x1aff1aff))
+#define BUSY (cast_to_oop<intptr_t>(0x1aff1aff))
void ParNewGeneration::push_on_overflow_list(oop from_space_obj, ParScanThreadState* par_scan_state) {
assert(is_in_reserved(from_space_obj), "Should be from this generation");
if (ParGCUseLocalOverflow) {
@@ -1512,7 +1512,7 @@
if (_overflow_list == NULL) return false;
// Otherwise, there was something there; try claiming the list.
- oop prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list);
+ oop prefix = cast_to_oop(Atomic::xchg_ptr(BUSY, &_overflow_list));
// Trim off a prefix of at most objsFromOverflow items
Thread* tid = Thread::current();
size_t spin_count = (size_t)ParallelGCThreads;
@@ -1526,7 +1526,7 @@
return false;
} else if (_overflow_list != BUSY) {
// try and grab the prefix
- prefix = (oop)Atomic::xchg_ptr(BUSY, &_overflow_list);
+ prefix = cast_to_oop(Atomic::xchg_ptr(BUSY, &_overflow_list));
}
}
if (prefix == NULL || prefix == BUSY) {
--- a/hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -84,7 +84,7 @@
Space* sp = gch->space_containing(p);
oop obj = oop(sp->block_start(p));
assert((HeapWord*)obj < (HeapWord*)p, "Error");
- tty->print_cr("Object: " PTR_FORMAT, obj);
+ tty->print_cr("Object: " PTR_FORMAT, (void *)obj);
tty->print_cr("-------");
obj->print();
tty->print_cr("-----");
@@ -110,7 +110,7 @@
if (TraceScavenge) {
gclog_or_tty->print_cr("{%s %s ( " PTR_FORMAT " ) " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
"forwarded ",
- new_obj->klass()->internal_name(), p, obj, new_obj, new_obj->size());
+ new_obj->klass()->internal_name(), p, (void *)obj, (void *)new_obj, new_obj->size());
}
#endif
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,10 +40,8 @@
void initialize_flags() {
// Do basic sizing work
- this->TwoGenerationCollectorPolicy::initialize_flags();
+ TwoGenerationCollectorPolicy::initialize_flags();
- // If the user hasn't explicitly set the number of worker
- // threads, set the count.
assert(UseSerialGC ||
!FLAG_IS_DEFAULT(ParallelGCThreads) ||
(ParallelGCThreads > 0),
@@ -68,9 +66,6 @@
size_t min_old_gen_size() { return _min_gen1_size; }
size_t old_gen_size() { return _initial_gen1_size; }
size_t max_old_gen_size() { return _max_gen1_size; }
-
- size_t metaspace_size() { return MetaspaceSize; }
- size_t max_metaspace_size() { return MaxMetaspaceSize; }
};
#endif // SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_GENERATIONSIZER_HPP
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -86,6 +86,11 @@
set_alignment(_old_gen_alignment, intra_heap_alignment());
}
+ // Return the (conservative) maximum heap alignment
+ static size_t conservative_max_heap_alignment() {
+ return intra_heap_alignment();
+ }
+
// For use by VM operations
enum CollectionType {
Scavenge,
@@ -122,7 +127,7 @@
// The alignment used for eden and survivors within the young gen
// and for boundary between young gen and old gen.
- size_t intra_heap_alignment() const { return 64 * K * HeapWordSize; }
+ static size_t intra_heap_alignment() { return 64 * K * HeapWordSize; }
size_t capacity() const;
size_t used() const;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,6 @@
*/
#include "precompiled.hpp"
-#include "gc_implementation/parallelScavenge/generationSizer.hpp"
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
#include "gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp"
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -53,7 +53,6 @@
// Forward decls
class elapsedTimer;
-class GenerationSizer;
class PSAdaptiveSizePolicy : public AdaptiveSizePolicy {
friend class PSGCAdaptivePolicyCounters;
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -26,7 +26,6 @@
#include "classfile/symbolTable.hpp"
#include "classfile/systemDictionary.hpp"
#include "code/codeCache.hpp"
-#include "gc_implementation/parallelScavenge/generationSizer.hpp"
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
#include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -27,7 +27,6 @@
#include "classfile/systemDictionary.hpp"
#include "code/codeCache.hpp"
#include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
-#include "gc_implementation/parallelScavenge/generationSizer.hpp"
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp"
#include "gc_implementation/parallelScavenge/pcTasks.hpp"
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -333,7 +333,7 @@
gclog_or_tty->print_cr("{%s %s 0x%x (%d)}",
"promotion-failure",
obj->klass()->internal_name(),
- obj, obj->size());
+ (void *)obj, obj->size());
}
#endif
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -126,7 +126,7 @@
oop* mask_chunked_array_oop(oop obj) {
assert(!is_oop_masked((oop*) obj), "invariant");
- oop* ret = (oop*) ((uintptr_t)obj | PS_CHUNKED_ARRAY_OOP_MASK);
+ oop* ret = (oop*) (cast_from_oop<uintptr_t>(obj) | PS_CHUNKED_ARRAY_OOP_MASK);
assert(is_oop_masked(ret), "invariant");
return ret;
}
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -225,7 +225,7 @@
if (TraceScavenge) {
gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
PSScavenge::should_scavenge(&new_obj) ? "copying" : "tenuring",
- new_obj->klass()->internal_name(), o, new_obj, new_obj->size());
+ new_obj->klass()->internal_name(), (void *)o, (void *)new_obj, new_obj->size());
}
#endif
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -27,7 +27,6 @@
#include "code/codeCache.hpp"
#include "gc_implementation/parallelScavenge/cardTableExtension.hpp"
#include "gc_implementation/parallelScavenge/gcTaskManager.hpp"
-#include "gc_implementation/parallelScavenge/generationSizer.hpp"
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
#include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
#include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -81,7 +81,7 @@
if (TraceScavenge && o->is_forwarded()) {
gclog_or_tty->print_cr("{%s %s " PTR_FORMAT " -> " PTR_FORMAT " (%d)}",
"forwarding",
- new_obj->klass()->internal_name(), o, new_obj, new_obj->size());
+ new_obj->klass()->internal_name(), (void *)o, (void *)new_obj, new_obj->size());
}
#endif
--- a/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/shared/allocationStats.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,9 @@
#define SHARE_VM_GC_IMPLEMENTATION_SHARED_ALLOCATIONSTATS_HPP
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
-#include "gc_implementation/shared/gcUtil.hpp"
#include "memory/allocation.hpp"
#include "utilities/globalDefinitions.hpp"
-#endif // INCLUDE_ALL_GCS
+#include "gc_implementation/shared/gcUtil.hpp"
class AllocationStats VALUE_OBJ_CLASS_SPEC {
// A duration threshold (in ms) used to filter
--- a/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/shared/hSpaceCounters.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,11 +26,9 @@
#define SHARE_VM_GC_IMPLEMENTATION_SHARED_HSPACECOUNTERS_HPP
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
#include "gc_implementation/shared/generationCounters.hpp"
#include "memory/generation.hpp"
#include "runtime/perfData.hpp"
-#endif // INCLUDE_ALL_GCS
// A HSpaceCounter is a holder class for performance counters
// that track a collections (logical spaces) in a heap;
--- a/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/gc_interface/collectedHeap.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -87,15 +87,15 @@
const MetaspaceSizes meta_space(
MetaspaceAux::allocated_capacity_bytes(),
MetaspaceAux::allocated_used_bytes(),
- MetaspaceAux::reserved_in_bytes());
+ MetaspaceAux::reserved_bytes());
const MetaspaceSizes data_space(
MetaspaceAux::allocated_capacity_bytes(Metaspace::NonClassType),
MetaspaceAux::allocated_used_bytes(Metaspace::NonClassType),
- MetaspaceAux::reserved_in_bytes(Metaspace::NonClassType));
+ MetaspaceAux::reserved_bytes(Metaspace::NonClassType));
const MetaspaceSizes class_space(
MetaspaceAux::allocated_capacity_bytes(Metaspace::ClassType),
MetaspaceAux::allocated_used_bytes(Metaspace::ClassType),
- MetaspaceAux::reserved_in_bytes(Metaspace::ClassType));
+ MetaspaceAux::reserved_bytes(Metaspace::ClassType));
return MetaspaceSummary(meta_space, data_space, class_space);
}
--- a/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -215,7 +215,7 @@
st->print_cr(" %s", buf);
}
} else {
- st->print_cr(" " PTR_FORMAT, (intptr_t) value);
+ st->print_cr(" " PTR_FORMAT, (void *)value);
}
}
--- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -496,15 +496,15 @@
IRT_ENTRY(void, InterpreterRuntime::resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode))
// resolve field
- FieldAccessInfo info;
+ fieldDescriptor info;
constantPoolHandle pool(thread, method(thread)->constants());
bool is_put = (bytecode == Bytecodes::_putfield || bytecode == Bytecodes::_putstatic);
bool is_static = (bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic);
{
JvmtiHideSingleStepping jhss(thread);
- LinkResolver::resolve_field(info, pool, get_index_u2_cpcache(thread, bytecode),
- bytecode, false, CHECK);
+ LinkResolver::resolve_field_access(info, pool, get_index_u2_cpcache(thread, bytecode),
+ bytecode, CHECK);
} // end JvmtiHideSingleStepping
// check if link resolution caused cpCache to be updated
@@ -524,7 +524,7 @@
// class is intitialized. This is required so that access to the static
// field will call the initialization function every time until the class
// is completely initialized ala. in 2.17.5 in JVM Specification.
- InstanceKlass *klass = InstanceKlass::cast(info.klass()());
+ InstanceKlass* klass = InstanceKlass::cast(info.field_holder());
bool uninitialized_static = ((bytecode == Bytecodes::_getstatic || bytecode == Bytecodes::_putstatic) &&
!klass->is_initialized());
Bytecodes::Code get_code = (Bytecodes::Code)0;
@@ -539,9 +539,9 @@
cache_entry(thread)->set_field(
get_code,
put_code,
- info.klass(),
- info.field_index(),
- info.field_offset(),
+ info.field_holder(),
+ info.index(),
+ info.offset(),
state,
info.access_flags().is_final(),
info.access_flags().is_volatile(),
@@ -686,29 +686,55 @@
if (already_resolved(thread)) return;
if (bytecode == Bytecodes::_invokeinterface) {
-
if (TraceItables && Verbose) {
ResourceMark rm(thread);
tty->print_cr("Resolving: klass: %s to method: %s", info.resolved_klass()->name()->as_C_string(), info.resolved_method()->name()->as_C_string());
}
+ }
+#ifdef ASSERT
+ if (bytecode == Bytecodes::_invokeinterface) {
if (info.resolved_method()->method_holder() ==
SystemDictionary::Object_klass()) {
// NOTE: THIS IS A FIX FOR A CORNER CASE in the JVM spec
- // (see also cpCacheOop.cpp for details)
+ // (see also CallInfo::set_interface for details)
+ assert(info.call_kind() == CallInfo::vtable_call ||
+ info.call_kind() == CallInfo::direct_call, "");
methodHandle rm = info.resolved_method();
assert(rm->is_final() || info.has_vtable_index(),
"should have been set already");
- cache_entry(thread)->set_method(bytecode, rm, info.vtable_index());
+ } else if (!info.resolved_method()->has_itable_index()) {
+ // Resolved something like CharSequence.toString. Use vtable not itable.
+ assert(info.call_kind() != CallInfo::itable_call, "");
} else {
// Setup itable entry
- int index = klassItable::compute_itable_index(info.resolved_method()());
- cache_entry(thread)->set_interface_call(info.resolved_method(), index);
+ assert(info.call_kind() == CallInfo::itable_call, "");
+ int index = info.resolved_method()->itable_index();
+ assert(info.itable_index() == index, "");
}
} else {
- cache_entry(thread)->set_method(
+ assert(info.call_kind() == CallInfo::direct_call ||
+ info.call_kind() == CallInfo::vtable_call, "");
+ }
+#endif
+ switch (info.call_kind()) {
+ case CallInfo::direct_call:
+ cache_entry(thread)->set_direct_call(
+ bytecode,
+ info.resolved_method());
+ break;
+ case CallInfo::vtable_call:
+ cache_entry(thread)->set_vtable_call(
bytecode,
info.resolved_method(),
info.vtable_index());
+ break;
+ case CallInfo::itable_call:
+ cache_entry(thread)->set_itable_call(
+ bytecode,
+ info.resolved_method(),
+ info.itable_index());
+ break;
+ default: ShouldNotReachHere();
}
}
IRT_END
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,4 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -46,19 +45,6 @@
#include "runtime/thread.inline.hpp"
#include "runtime/vmThread.hpp"
-//------------------------------------------------------------------------------------------------------------------------
-// Implementation of FieldAccessInfo
-
-void FieldAccessInfo::set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
-BasicType field_type, AccessFlags access_flags) {
- _klass = klass;
- _name = name;
- _field_index = field_index;
- _field_offset = field_offset;
- _field_type = field_type;
- _access_flags = access_flags;
-}
-
//------------------------------------------------------------------------------------------------------------------------
// Implementation of CallInfo
@@ -66,26 +52,25 @@
void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
int vtable_index = Method::nonvirtual_vtable_index;
- set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
+ set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
}
-void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, TRAPS) {
+void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index, TRAPS) {
// This is only called for interface methods. If the resolved_method
// comes from java/lang/Object, it can be the subject of a virtual call, so
// we should pick the vtable index from the resolved method.
- // Other than that case, there is no valid vtable index to specify.
- int vtable_index = Method::invalid_vtable_index;
- if (resolved_method->method_holder() == SystemDictionary::Object_klass()) {
- assert(resolved_method->vtable_index() == selected_method->vtable_index(), "sanity check");
- vtable_index = resolved_method->vtable_index();
- }
- set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
+ // In that case, the caller must call set_virtual instead of set_interface.
+ assert(resolved_method->method_holder()->is_interface(), "");
+ assert(itable_index == resolved_method()->itable_index(), "");
+ set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
}
void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
- set_common(resolved_klass, selected_klass, resolved_method, selected_method, vtable_index, CHECK);
+ assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
+ CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
+ set_common(resolved_klass, selected_klass, resolved_method, selected_method, kind, vtable_index, CHECK);
assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
}
@@ -98,20 +83,29 @@
resolved_method->is_compiled_lambda_form(),
"linkMethod must return one of these");
int vtable_index = Method::nonvirtual_vtable_index;
- assert(resolved_method->vtable_index() == vtable_index, "");
- set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, vtable_index, CHECK);
+ assert(!resolved_method->has_vtable_index(), "");
+ set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
_resolved_appendix = resolved_appendix;
_resolved_method_type = resolved_method_type;
}
-void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
+void CallInfo::set_common(KlassHandle resolved_klass,
+ KlassHandle selected_klass,
+ methodHandle resolved_method,
+ methodHandle selected_method,
+ CallKind kind,
+ int index,
+ TRAPS) {
assert(resolved_method->signature() == selected_method->signature(), "signatures must correspond");
_resolved_klass = resolved_klass;
_selected_klass = selected_klass;
_resolved_method = resolved_method;
_selected_method = selected_method;
- _vtable_index = vtable_index;
+ _call_kind = kind;
+ _call_index = index;
_resolved_appendix = Handle();
+ DEBUG_ONLY(verify()); // verify before making side effects
+
if (CompilationPolicy::must_be_compiled(selected_method)) {
// This path is unusual, mostly used by the '-Xcomp' stress test mode.
@@ -138,6 +132,65 @@
}
}
+// utility query for unreflecting a method
+CallInfo::CallInfo(Method* resolved_method, Klass* resolved_klass) {
+ Klass* resolved_method_holder = resolved_method->method_holder();
+ if (resolved_klass == NULL) { // 2nd argument defaults to holder of 1st
+ resolved_klass = resolved_method_holder;
+ }
+ _resolved_klass = resolved_klass;
+ _selected_klass = resolved_klass;
+ _resolved_method = resolved_method;
+ _selected_method = resolved_method;
+ // classify:
+ CallKind kind = CallInfo::unknown_kind;
+ int index = resolved_method->vtable_index();
+ if (resolved_method->can_be_statically_bound()) {
+ kind = CallInfo::direct_call;
+ } else if (!resolved_method_holder->is_interface()) {
+ // Could be an Object method inherited into an interface, but still a vtable call.
+ kind = CallInfo::vtable_call;
+ } else if (!resolved_klass->is_interface()) {
+ // A miranda method. Compute the vtable index.
+ ResourceMark rm;
+ klassVtable* vt = InstanceKlass::cast(resolved_klass)->vtable();
+ index = vt->index_of_miranda(resolved_method->name(),
+ resolved_method->signature());
+ kind = CallInfo::vtable_call;
+ } else {
+ // A regular interface call.
+ kind = CallInfo::itable_call;
+ index = resolved_method->itable_index();
+ }
+ assert(index == Method::nonvirtual_vtable_index || index >= 0, err_msg("bad index %d", index));
+ _call_kind = kind;
+ _call_index = index;
+ _resolved_appendix = Handle();
+ DEBUG_ONLY(verify());
+}
+
+#ifdef ASSERT
+void CallInfo::verify() {
+ switch (call_kind()) { // the meaning and allowed value of index depends on kind
+ case CallInfo::direct_call:
+ if (_call_index == Method::nonvirtual_vtable_index) break;
+ // else fall through to check vtable index:
+ case CallInfo::vtable_call:
+ assert(resolved_klass()->verify_vtable_index(_call_index), "");
+ break;
+ case CallInfo::itable_call:
+ assert(resolved_method()->method_holder()->verify_itable_index(_call_index), "");
+ break;
+ case CallInfo::unknown_kind:
+ assert(call_kind() != CallInfo::unknown_kind, "CallInfo must be set");
+ break;
+ default:
+ fatal(err_msg_res("Unexpected call kind %d", call_kind()));
+ }
+}
+#endif //ASSERT
+
+
//------------------------------------------------------------------------------------------------------------------------
// Klass resolution
@@ -163,13 +216,6 @@
result = KlassHandle(THREAD, result_oop);
}
-void LinkResolver::resolve_klass_no_update(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
- Klass* result_oop =
- ConstantPool::klass_ref_at_if_loaded_check(pool, index, CHECK);
- result = KlassHandle(THREAD, result_oop);
-}
-
-
//------------------------------------------------------------------------------------------------------------------------
// Method resolution
//
@@ -360,7 +406,12 @@
void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
-
+ // This method is used only
+ // (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
+ // and
+ // (2) in Bytecode_invoke::static_target
+ // It appears to fail when applied to an invokeinterface call site.
+ // FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
// resolve klass
if (code == Bytecodes::_invokedynamic) {
resolved_klass = SystemDictionary::MethodHandle_klass();
@@ -521,6 +572,16 @@
}
if (check_access) {
+ // JDK8 adds non-public interface methods, and accessability check requirement
+ assert(current_klass.not_null() , "current_klass should not be null");
+
+ // check if method can be accessed by the referring class
+ check_method_accessability(current_klass,
+ resolved_klass,
+ KlassHandle(THREAD, resolved_method->method_holder()),
+ resolved_method,
+ CHECK);
+
HandleMark hm(THREAD);
Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
@@ -552,6 +613,20 @@
}
}
}
+
+ if (TraceItables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
+ (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ resolved_method->method_holder()->internal_name()
+ );
+ resolved_method->access_flags().print_on(tty);
+ tty->cr();
+ }
}
//------------------------------------------------------------------------------------------------------------------------
@@ -580,45 +655,49 @@
}
}
-void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS) {
- resolve_field(result, pool, index, byte, check_only, true, CHECK);
+void LinkResolver::resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
+ // Load these early in case the resolve of the containing klass fails
+ Symbol* field = pool->name_ref_at(index);
+ Symbol* sig = pool->signature_ref_at(index);
+
+ // resolve specified klass
+ KlassHandle resolved_klass;
+ resolve_klass(resolved_klass, pool, index, CHECK);
+
+ KlassHandle current_klass(THREAD, pool->pool_holder());
+ resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
}
-void LinkResolver::resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS) {
+void LinkResolver::resolve_field(fieldDescriptor& fd, KlassHandle resolved_klass, Symbol* field, Symbol* sig,
+ KlassHandle current_klass, Bytecodes::Code byte, bool check_access, bool initialize_class,
+ TRAPS) {
assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
- byte == Bytecodes::_getfield || byte == Bytecodes::_putfield, "bad bytecode");
+ byte == Bytecodes::_getfield || byte == Bytecodes::_putfield ||
+ (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
bool is_put = (byte == Bytecodes::_putfield || byte == Bytecodes::_putstatic);
- // resolve specified klass
- KlassHandle resolved_klass;
- if (update_pool) {
- resolve_klass(resolved_klass, pool, index, CHECK);
- } else {
- resolve_klass_no_update(resolved_klass, pool, index, CHECK);
- }
- // Load these early in case the resolve of the containing klass fails
- Symbol* field = pool->name_ref_at(index);
- Symbol* sig = pool->signature_ref_at(index);
// Check if there's a resolved klass containing the field
- if( resolved_klass.is_null() ) {
+ if (resolved_klass.is_null()) {
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
}
// Resolve instance field
- fieldDescriptor fd; // find_field initializes fd if found
KlassHandle sel_klass(THREAD, InstanceKlass::cast(resolved_klass())->find_field(field, sig, &fd));
// check if field exists; i.e., if a klass containing the field def has been selected
- if (sel_klass.is_null()){
+ if (sel_klass.is_null()) {
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
}
+ if (!check_access)
+ // Access checking may be turned off when calling from within the VM.
+ return;
+
// check access
- KlassHandle ref_klass(THREAD, pool->pool_holder());
- check_field_accessability(ref_klass, resolved_klass, sel_klass, fd, CHECK);
+ check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
// check for errors
if (is_static != fd.is_static()) {
@@ -629,7 +708,7 @@
}
// Final fields can only be accessed from its own class.
- if (is_put && fd.access_flags().is_final() && sel_klass() != pool->pool_holder()) {
+ if (is_put && fd.access_flags().is_final() && sel_klass() != current_klass()) {
THROW(vmSymbols::java_lang_IllegalAccessError());
}
@@ -639,19 +718,18 @@
//
// note 2: we don't want to force initialization if we are just checking
// if the field access is legal; e.g., during compilation
- if (is_static && !check_only) {
+ if (is_static && initialize_class) {
sel_klass->initialize(CHECK);
}
- {
+ if (sel_klass() != current_klass()) {
HandleMark hm(THREAD);
- Handle ref_loader (THREAD, InstanceKlass::cast(ref_klass())->class_loader());
+ Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
- Symbol* signature_ref = pool->signature_ref_at(index);
{
ResourceMark rm(THREAD);
Symbol* failed_type_symbol =
- SystemDictionary::check_signature_loaders(signature_ref,
+ SystemDictionary::check_signature_loaders(sig,
ref_loader, sel_loader,
false,
CHECK);
@@ -677,9 +755,6 @@
// return information. note that the klass is set to the actual klass containing the
// field, otherwise access of static fields in superclasses will not work.
- KlassHandle holder (THREAD, fd.field_holder());
- Symbol* name = fd.name();
- result.set(holder, name, fd.index(), fd.offset(), fd.field_type(), fd.access_flags());
}
@@ -743,26 +818,12 @@
Symbol* method_name, Symbol* method_signature,
KlassHandle current_klass, bool check_access, TRAPS) {
- if (resolved_klass->is_interface() && current_klass() != NULL) {
- // If the target class is a direct interface, treat this as a "super"
- // default call.
- //
- // If the current method is an overpass that happens to call a direct
- // super-interface's method, then we'll end up rerunning the default method
- // analysis even though we don't need to, but that's ok since it will end
- // up with the same answer.
- InstanceKlass* ik = InstanceKlass::cast(current_klass());
- Array<Klass*>* interfaces = ik->local_interfaces();
- int num_interfaces = interfaces->length();
- for (int index = 0; index < num_interfaces; index++) {
- if (interfaces->at(index) == resolved_klass()) {
- Method* method = DefaultMethods::find_super_default(current_klass(),
- resolved_klass(), method_name, method_signature, CHECK);
- resolved_method = methodHandle(THREAD, method);
- return;
- }
- }
- }
+ // Invokespecial is called for multiple special reasons:
+ // <init>
+ // local private method invocation, for classes and interfaces
+ // superclass.method, which can also resolve to a default method
+ // and the selected method is recalculated relative to the direct superclass
+ // superinterface.method, which explicitly does not check shadowing
resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
@@ -792,6 +853,26 @@
resolved_method->signature()));
THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
+ if (TraceItables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokespecial resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
+ (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ resolved_method->method_holder()->internal_name()
+ );
+ resolved_method->access_flags().print_on(tty);
+ if (resolved_method->method_holder()->is_interface() &&
+ !resolved_method->is_abstract()) {
+ tty->print("default");
+ }
+ if (resolved_method->is_overpass()) {
+ tty->print("overpass");
+ }
+ tty->cr();
+ }
}
// throws runtime exceptions
@@ -799,23 +880,24 @@
KlassHandle current_klass, bool check_access, TRAPS) {
// resolved method is selected method unless we have an old-style lookup
+ // for a superclass method
+ // Invokespecial for a superinterface, resolved method is selected method,
+ // no checks for shadowing
methodHandle sel_method(THREAD, resolved_method());
// check if this is an old-style super call and do a new lookup if so
{ KlassHandle method_klass = KlassHandle(THREAD,
resolved_method->method_holder());
- const bool direct_calling_default_method =
- resolved_klass() != NULL && resolved_method() != NULL &&
- resolved_klass->is_interface() && !resolved_method->is_abstract();
-
- if (!direct_calling_default_method &&
- check_access &&
+ if (check_access &&
// a) check if ACC_SUPER flag is set for the current class
(current_klass->is_super() || !AllowNonVirtualCalls) &&
- // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!)
- current_klass->is_subtype_of(method_klass()) &&
- current_klass() != method_klass() &&
+ // b) check if the class of the resolved_klass is a superclass
+ // (not supertype in order to exclude interface classes) of the current class.
+ // This check is not performed for super.invoke for interface methods
+ // in super interfaces.
+ current_klass->is_subclass_of(resolved_klass()) &&
+ current_klass() != resolved_klass() &&
// c) check if the method is not <init>
resolved_method->name() != vmSymbols::object_initializer_name()) {
// Lookup super method
@@ -853,6 +935,23 @@
sel_method->signature()));
}
+ if (TraceItables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokespecial selected method: resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ sel_method->name(),
+ sel_method->signature()),
+ sel_method->method_holder()->internal_name()
+ );
+ sel_method->access_flags().print_on(tty);
+ if (sel_method->method_holder()->is_interface() &&
+ !sel_method->is_abstract()) {
+ tty->print("default");
+ }
+ tty->cr();
+ }
+
// setup result
result.set_static(resolved_klass, sel_method, CHECK);
}
@@ -875,6 +974,18 @@
assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
+ // check if private interface method
+ if (resolved_klass->is_interface() && resolved_method->is_private()) {
+ ResourceMark rm(THREAD);
+ char buf[200];
+ jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokevirtual: method %s, caller-class:%s",
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
+ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ }
+
// check if not static
if (resolved_method->is_static()) {
ResourceMark rm(THREAD);
@@ -884,6 +995,27 @@
resolved_method->signature()));
THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
+
+ if (PrintVtables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokevirtual resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
+ (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ resolved_method->method_holder()->internal_name()
+ );
+ resolved_method->access_flags().print_on(tty);
+ if (resolved_method->method_holder()->is_interface() &&
+ !resolved_method->is_abstract()) {
+ tty->print("default");
+ }
+ if (resolved_method->is_overpass()) {
+ tty->print("overpass");
+ }
+ tty->cr();
+ }
}
// throws runtime exceptions
@@ -907,10 +1039,6 @@
}
// Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
- // has not been rewritten, and the vtable initialized.
- assert(resolved_method->method_holder()->is_linked(), "must be linked");
-
- // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s
// has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since
// a missing receiver might result in a bogus lookup.
assert(resolved_method->method_holder()->is_linked(), "must be linked");
@@ -920,6 +1048,7 @@
vtable_index = vtable_index_of_miranda_method(resolved_klass,
resolved_method->name(),
resolved_method->signature(), CHECK);
+
assert(vtable_index >= 0 , "we should have valid vtable index at this point");
InstanceKlass* inst = InstanceKlass::cast(recv_klass());
@@ -927,6 +1056,7 @@
} else {
// at this point we are sure that resolved_method is virtual and not
// a miranda method; therefore, it must have a valid vtable index.
+ assert(!resolved_method->has_itable_index(), "");
vtable_index = resolved_method->vtable_index();
// We could get a negative vtable_index for final methods,
// because as an optimization they are they are never put in the vtable,
@@ -962,6 +1092,27 @@
selected_method->signature()));
}
+ if (PrintVtables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokevirtual selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, vtable_index:%d, access_flags: ",
+ (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ selected_method->method_holder()->internal_name(),
+ vtable_index
+ );
+ selected_method->access_flags().print_on(tty);
+ if (selected_method->method_holder()->is_interface() &&
+ !selected_method->is_abstract()) {
+ tty->print("default");
+ }
+ if (resolved_method->is_overpass()) {
+ tty->print("overpass");
+ }
+ tty->cr();
+ }
// setup result
result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
}
@@ -992,6 +1143,17 @@
THROW(vmSymbols::java_lang_NullPointerException());
}
+ // check if private interface method
+ if (resolved_klass->is_interface() && resolved_method->is_private()) {
+ ResourceMark rm(THREAD);
+ char buf[200];
+ jio_snprintf(buf, sizeof(buf), "private interface method requires invokespecial, not invokeinterface: method %s",
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()));
+ THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ }
+
// check if receiver klass implements the resolved interface
if (!recv_klass->is_subtype_of(resolved_klass())) {
ResourceMark rm(THREAD);
@@ -1006,6 +1168,12 @@
lookup_instance_method_in_klasses(sel_method, recv_klass,
resolved_method->name(),
resolved_method->signature(), CHECK);
+ if (sel_method.is_null() && !check_null_and_abstract) {
+ // In theory this is a harmless placeholder value, but
+ // in practice leaving in null affects the nsk default method tests.
+ // This needs further study.
+ sel_method = resolved_method;
+ }
// check if method exists
if (sel_method.is_null()) {
ResourceMark rm(THREAD);
@@ -1015,28 +1183,15 @@
resolved_method->signature()));
}
// check access
- if (sel_method->method_holder()->is_interface()) {
- // Method holder is an interface. Throw Illegal Access Error if sel_method
- // is neither public nor private.
- if (!(sel_method->is_public() || sel_method->is_private())) {
- ResourceMark rm(THREAD);
- THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
- Method::name_and_sig_as_C_string(recv_klass(),
- sel_method->name(),
- sel_method->signature()));
- }
+ // Throw Illegal Access Error if sel_method is not public.
+ if (!sel_method->is_public()) {
+ ResourceMark rm(THREAD);
+ THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
+ Method::name_and_sig_as_C_string(recv_klass(),
+ sel_method->name(),
+ sel_method->signature()));
}
- else {
- // Method holder is a class. Throw Illegal Access Error if sel_method
- // is not public.
- if (!sel_method->is_public()) {
- ResourceMark rm(THREAD);
- THROW_MSG(vmSymbols::java_lang_IllegalAccessError(),
- Method::name_and_sig_as_C_string(recv_klass(),
- sel_method->name(),
- sel_method->signature()));
- }
- }
+
// check if abstract
if (check_null_and_abstract && sel_method->is_abstract()) {
ResourceMark rm(THREAD);
@@ -1046,7 +1201,35 @@
sel_method->signature()));
}
// setup result
- result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, CHECK);
+ if (!resolved_method->has_itable_index()) {
+ int vtable_index = resolved_method->vtable_index();
+ assert(vtable_index == sel_method->vtable_index(), "sanity check");
+ result.set_virtual(resolved_klass, recv_klass, resolved_method, sel_method, vtable_index, CHECK);
+ return;
+ }
+ int itable_index = resolved_method()->itable_index();
+
+ if (TraceItables && Verbose) {
+ ResourceMark rm(THREAD);
+ tty->print("invokeinterface selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
+ (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ resolved_method->name(),
+ resolved_method->signature()),
+ sel_method->method_holder()->internal_name()
+ );
+ sel_method->access_flags().print_on(tty);
+ if (sel_method->method_holder()->is_interface() &&
+ !sel_method->is_abstract()) {
+ tty->print("default");
+ }
+ if (resolved_method->is_overpass()) {
+ tty->print("overpass");
+ }
+ tty->cr();
+ }
+ result.set_interface(resolved_klass, recv_klass, resolved_method, sel_method, itable_index, CHECK);
}
@@ -1293,7 +1476,8 @@
}
if (TraceMethodHandles) {
- tty->print_cr("resolve_invokedynamic #%d %s %s",
+ ResourceMark rm(THREAD);
+ tty->print_cr("resolve_invokedynamic #%d %s %s",
ConstantPool::decode_invokedynamic_index(index),
method_name->as_C_string(), method_signature->as_C_string());
tty->print(" BSM info: "); bootstrap_specifier->print();
@@ -1320,7 +1504,7 @@
THREAD);
if (HAS_PENDING_EXCEPTION) {
if (TraceMethodHandles) {
- tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, PENDING_EXCEPTION);
+ tty->print_cr("invokedynamic throws BSME for "INTPTR_FORMAT, (void *)PENDING_EXCEPTION);
PENDING_EXCEPTION->print();
}
if (PENDING_EXCEPTION->is_a(SystemDictionary::BootstrapMethodError_klass())) {
@@ -1342,9 +1526,16 @@
//------------------------------------------------------------------------------------------------------------------------
#ifndef PRODUCT
-void FieldAccessInfo::print() {
+void CallInfo::print() {
ResourceMark rm;
- tty->print_cr("Field %s@%d", name()->as_C_string(), field_offset());
+ const char* kindstr = "unknown";
+ switch (_call_kind) {
+ case direct_call: kindstr = "direct"; break;
+ case vtable_call: kindstr = "vtable"; break;
+ case itable_call: kindstr = "itable"; break;
+ }
+ tty->print_cr("Call %s@%d %s", kindstr, _call_index,
+ _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
}
#endif
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,63 +30,54 @@
// All the necessary definitions for run-time link resolution.
-// LinkInfo & its subclasses provide all the information gathered
-// for a particular link after resolving it. A link is any reference
+// CallInfo provides all the information gathered for a particular
+// linked call site after resolving it. A link is any reference
// made from within the bytecodes of a method to an object outside of
// that method. If the info is invalid, the link has not been resolved
// successfully.
-class LinkInfo VALUE_OBJ_CLASS_SPEC {
-};
-
-
-// Link information for getfield/putfield & getstatic/putstatic bytecodes.
-
-class FieldAccessInfo: public LinkInfo {
- protected:
- KlassHandle _klass;
- Symbol* _name;
- AccessFlags _access_flags;
- int _field_index; // original index in the klass
- int _field_offset;
- BasicType _field_type;
-
+class CallInfo VALUE_OBJ_CLASS_SPEC {
public:
- void set(KlassHandle klass, Symbol* name, int field_index, int field_offset,
- BasicType field_type, AccessFlags access_flags);
- KlassHandle klass() const { return _klass; }
- Symbol* name() const { return _name; }
- int field_index() const { return _field_index; }
- int field_offset() const { return _field_offset; }
- BasicType field_type() const { return _field_type; }
- AccessFlags access_flags() const { return _access_flags; }
-
- // debugging
- void print() PRODUCT_RETURN;
-};
-
-
-// Link information for all calls.
-
-class CallInfo: public LinkInfo {
+ // Ways that a method call might be selected (or not) based on receiver type.
+ // Note that an invokevirtual instruction might be linked with no_dispatch,
+ // and an invokeinterface instruction might be linked with any of the three options
+ enum CallKind {
+ direct_call, // jump into resolved_method (must be concrete)
+ vtable_call, // select recv.klass.method_at_vtable(index)
+ itable_call, // select recv.klass.method_at_itable(resolved_method.holder, index)
+ unknown_kind = -1
+ };
private:
- KlassHandle _resolved_klass; // static receiver klass
+ KlassHandle _resolved_klass; // static receiver klass, resolved from a symbolic reference
KlassHandle _selected_klass; // dynamic receiver class (same as static, or subklass)
methodHandle _resolved_method; // static target method
methodHandle _selected_method; // dynamic (actual) target method
- int _vtable_index; // vtable index of selected method
+ CallKind _call_kind; // kind of call (static(=bytecode static/special +
+ // others inferred), vtable, itable)
+ int _call_index; // vtable or itable index of selected class method (if any)
Handle _resolved_appendix; // extra argument in constant pool (if CPCE::has_appendix)
Handle _resolved_method_type; // MethodType (for invokedynamic and invokehandle call sites)
void set_static( KlassHandle resolved_klass, methodHandle resolved_method , TRAPS);
- void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method , TRAPS);
+ void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index , TRAPS);
void set_virtual( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index , TRAPS);
void set_handle( methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS);
- void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index , TRAPS);
+ void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, CallKind kind, int index, TRAPS);
friend class LinkResolver;
public:
+ CallInfo() {
+#ifndef PRODUCT
+ _call_kind = CallInfo::unknown_kind;
+ _call_index = Method::garbage_vtable_index;
+#endif //PRODUCT
+ }
+
+ // utility to extract an effective CallInfo from a method and an optional receiver limit
+ // does not queue the method for compilation
+ CallInfo(Method* resolved_method, Klass* resolved_klass = NULL);
+
KlassHandle resolved_klass() const { return _resolved_klass; }
KlassHandle selected_klass() const { return _selected_klass; }
methodHandle resolved_method() const { return _resolved_method; }
@@ -95,21 +86,43 @@
Handle resolved_method_type() const { return _resolved_method_type; }
BasicType result_type() const { return selected_method()->result_type(); }
- bool has_vtable_index() const { return _vtable_index >= 0; }
- bool is_statically_bound() const { return _vtable_index == Method::nonvirtual_vtable_index; }
+ CallKind call_kind() const { return _call_kind; }
+ int call_index() const { return _call_index; }
int vtable_index() const {
// Even for interface calls the vtable index could be non-negative.
// See CallInfo::set_interface.
assert(has_vtable_index() || is_statically_bound(), "");
- return _vtable_index;
+ assert(call_kind() == vtable_call || call_kind() == direct_call, "");
+ // The returned value is < 0 if the call is statically bound.
+ // But, the returned value may be >= 0 even if the kind is direct_call.
+ // It is up to the caller to decide which way to go.
+ return _call_index;
}
+ int itable_index() const {
+ assert(call_kind() == itable_call, "");
+ // The returned value is always >= 0, a valid itable index.
+ return _call_index;
+ }
+
+ // debugging
+#ifdef ASSERT
+ bool has_vtable_index() const { return _call_index >= 0 && _call_kind != CallInfo::itable_call; }
+ bool is_statically_bound() const { return _call_index == Method::nonvirtual_vtable_index; }
+#endif //ASSERT
+ void verify() PRODUCT_RETURN;
+ void print() PRODUCT_RETURN;
};
+// Link information for getfield/putfield & getstatic/putstatic bytecodes
+// is represented using a fieldDescriptor.
// The LinkResolver is used to resolve constant-pool references at run-time.
// It does all necessary link-time checks & throws exceptions if necessary.
class LinkResolver: AllStatic {
+ friend class klassVtable;
+ friend class klassItable;
+
private:
static void lookup_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
@@ -120,7 +133,6 @@
static int vtable_index_of_miranda_method(KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
static void resolve_klass (KlassHandle& result, constantPoolHandle pool, int index, TRAPS);
- static void resolve_klass_no_update (KlassHandle& result, constantPoolHandle pool, int index, TRAPS); // no update of constantPool entry
static void resolve_pool (KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature, KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS);
@@ -148,9 +160,16 @@
Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS);
// runtime/static resolving for fields
- static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, TRAPS);
- // takes an extra bool argument "update_pool" to decide whether to update the constantPool during klass resolution.
- static void resolve_field(FieldAccessInfo& result, constantPoolHandle pool, int index, Bytecodes::Code byte, bool check_only, bool update_pool, TRAPS);
+ static void resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
+ static void resolve_field(fieldDescriptor& result, KlassHandle resolved_klass, Symbol* field_name, Symbol* field_signature,
+ KlassHandle current_klass, Bytecodes::Code access_kind, bool check_access, bool initialize_class, TRAPS);
+
+ // source of access_kind codes:
+ static Bytecodes::Code field_access_kind(bool is_static, bool is_put) {
+ return (is_static
+ ? (is_put ? Bytecodes::_putstatic : Bytecodes::_getstatic)
+ : (is_put ? Bytecodes::_putfield : Bytecodes::_getfield ));
+ }
// runtime resolving:
// resolved_klass = specified class (i.e., static receiver class)
--- a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,10 +33,10 @@
#include "runtime/globals.hpp"
#include "utilities/ostream.hpp"
#include "utilities/macros.hpp"
+#include "gc_implementation/shared/spaceDecorator.hpp"
#if INCLUDE_ALL_GCS
#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp"
#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp"
-#include "gc_implementation/shared/spaceDecorator.hpp"
#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp"
#endif // INCLUDE_ALL_GCS
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -423,60 +423,6 @@
inline_write_ref_field(field, newVal);
}
-/*
- Claimed and deferred bits are used together in G1 during the evacuation
- pause. These bits can have the following state transitions:
- 1. The claimed bit can be put over any other card state. Except that
- the "dirty -> dirty and claimed" transition is checked for in
- G1 code and is not used.
- 2. Deferred bit can be set only if the previous state of the card
- was either clean or claimed. mark_card_deferred() is wait-free.
- We do not care if the operation is be successful because if
- it does not it will only result in duplicate entry in the update
- buffer because of the "cache-miss". So it's not worth spinning.
- */
-
-
-bool CardTableModRefBS::claim_card(size_t card_index) {
- jbyte val = _byte_map[card_index];
- assert(val != dirty_card_val(), "Shouldn't claim a dirty card");
- while (val == clean_card_val() ||
- (val & (clean_card_mask_val() | claimed_card_val())) != claimed_card_val()) {
- jbyte new_val = val;
- if (val == clean_card_val()) {
- new_val = (jbyte)claimed_card_val();
- } else {
- new_val = val | (jbyte)claimed_card_val();
- }
- jbyte res = Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
- if (res == val) {
- return true;
- }
- val = res;
- }
- return false;
-}
-
-bool CardTableModRefBS::mark_card_deferred(size_t card_index) {
- jbyte val = _byte_map[card_index];
- // It's already processed
- if ((val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val()) {
- return false;
- }
- // Cached bit can be installed either on a clean card or on a claimed card.
- jbyte new_val = val;
- if (val == clean_card_val()) {
- new_val = (jbyte)deferred_card_val();
- } else {
- if (val & claimed_card_val()) {
- new_val = val | (jbyte)deferred_card_val();
- }
- }
- if (new_val != val) {
- Atomic::cmpxchg(new_val, &_byte_map[card_index], val);
- }
- return true;
-}
void CardTableModRefBS::non_clean_card_iterate_possibly_parallel(Space* sp,
MemRegion mr,
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -339,34 +339,10 @@
_byte_map[card_index] = dirty_card_val();
}
- bool is_card_claimed(size_t card_index) {
- jbyte val = _byte_map[card_index];
- return (val & (clean_card_mask_val() | claimed_card_val())) == claimed_card_val();
- }
-
- void set_card_claimed(size_t card_index) {
- jbyte val = _byte_map[card_index];
- if (val == clean_card_val()) {
- val = (jbyte)claimed_card_val();
- } else {
- val |= (jbyte)claimed_card_val();
- }
- _byte_map[card_index] = val;
- }
-
- bool claim_card(size_t card_index);
-
bool is_card_clean(size_t card_index) {
return _byte_map[card_index] == clean_card_val();
}
- bool is_card_deferred(size_t card_index) {
- jbyte val = _byte_map[card_index];
- return (val & (clean_card_mask_val() | deferred_card_val())) == deferred_card_val();
- }
-
- bool mark_card_deferred(size_t card_index);
-
// Card marking array base (adjusted for heap low boundary)
// This would be the 0th element of _byte_map, if the heap started at 0x0.
// But since the heap starts at some higher address, this points to somewhere
--- a/hotspot/src/share/vm/memory/collectorPolicy.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -47,6 +47,11 @@
// CollectorPolicy methods.
+// Align down. If the aligning result in 0, return 'alignment'.
+static size_t restricted_align_down(size_t size, size_t alignment) {
+ return MAX2(alignment, align_size_down_(size, alignment));
+}
+
void CollectorPolicy::initialize_flags() {
assert(max_alignment() >= min_alignment(),
err_msg("max_alignment: " SIZE_FORMAT " less than min_alignment: " SIZE_FORMAT,
@@ -59,18 +64,26 @@
vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
}
- if (MetaspaceSize > MaxMetaspaceSize) {
- MaxMetaspaceSize = MetaspaceSize;
- }
- MetaspaceSize = MAX2(min_alignment(), align_size_down_(MetaspaceSize, min_alignment()));
- // Don't increase Metaspace size limit above specified.
- MaxMetaspaceSize = align_size_down(MaxMetaspaceSize, max_alignment());
+ // Do not use FLAG_SET_ERGO to update MaxMetaspaceSize, since this will
+ // override if MaxMetaspaceSize was set on the command line or not.
+ // This information is needed later to conform to the specification of the
+ // java.lang.management.MemoryUsage API.
+ //
+ // Ideally, we would be able to set the default value of MaxMetaspaceSize in
+ // globals.hpp to the aligned value, but this is not possible, since the
+ // alignment depends on other flags being parsed.
+ MaxMetaspaceSize = restricted_align_down(MaxMetaspaceSize, max_alignment());
+
if (MetaspaceSize > MaxMetaspaceSize) {
MetaspaceSize = MaxMetaspaceSize;
}
- MinMetaspaceExpansion = MAX2(min_alignment(), align_size_down_(MinMetaspaceExpansion, min_alignment()));
- MaxMetaspaceExpansion = MAX2(min_alignment(), align_size_down_(MaxMetaspaceExpansion, min_alignment()));
+ MetaspaceSize = restricted_align_down(MetaspaceSize, min_alignment());
+
+ assert(MetaspaceSize <= MaxMetaspaceSize, "Must be");
+
+ MinMetaspaceExpansion = restricted_align_down(MinMetaspaceExpansion, min_alignment());
+ MaxMetaspaceExpansion = restricted_align_down(MaxMetaspaceExpansion, min_alignment());
MinHeapDeltaBytes = align_size_up(MinHeapDeltaBytes, min_alignment());
@@ -124,15 +137,8 @@
GenRemSet* CollectorPolicy::create_rem_set(MemRegion whole_heap,
int max_covered_regions) {
- switch (rem_set_name()) {
- case GenRemSet::CardTable: {
- CardTableRS* res = new CardTableRS(whole_heap, max_covered_regions);
- return res;
- }
- default:
- guarantee(false, "unrecognized GenRemSet::Name");
- return NULL;
- }
+ assert(rem_set_name() == GenRemSet::CardTable, "unrecognized GenRemSet::Name");
+ return new CardTableRS(whole_heap, max_covered_regions);
}
void CollectorPolicy::cleared_all_soft_refs() {
@@ -145,6 +151,30 @@
_all_soft_refs_clear = true;
}
+size_t CollectorPolicy::compute_max_alignment() {
+ // The card marking array and the offset arrays for old generations are
+ // committed in os pages as well. Make sure they are entirely full (to
+ // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
+ // byte entry and the os page size is 4096, the maximum heap size should
+ // be 512*4096 = 2MB aligned.
+
+ // There is only the GenRemSet in Hotspot and only the GenRemSet::CardTable
+ // is supported.
+ // Requirements of any new remembered set implementations must be added here.
+ size_t alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
+
+ // Parallel GC does its own alignment of the generations to avoid requiring a
+ // large page (256M on some platforms) for the permanent generation. The
+ // other collectors should also be updated to do their own alignment and then
+ // this use of lcm() should be removed.
+ if (UseLargePages && !UseParallelGC) {
+ // in presence of large pages we have to make sure that our
+ // alignment is large page aware
+ alignment = lcm(os::large_page_size(), alignment);
+ }
+
+ return alignment;
+}
// GenCollectorPolicy methods.
@@ -175,29 +205,6 @@
GCTimeRatio);
}
-size_t GenCollectorPolicy::compute_max_alignment() {
- // The card marking array and the offset arrays for old generations are
- // committed in os pages as well. Make sure they are entirely full (to
- // avoid partial page problems), e.g. if 512 bytes heap corresponds to 1
- // byte entry and the os page size is 4096, the maximum heap size should
- // be 512*4096 = 2MB aligned.
- size_t alignment = GenRemSet::max_alignment_constraint(rem_set_name());
-
- // Parallel GC does its own alignment of the generations to avoid requiring a
- // large page (256M on some platforms) for the permanent generation. The
- // other collectors should also be updated to do their own alignment and then
- // this use of lcm() should be removed.
- if (UseLargePages && !UseParallelGC) {
- // in presence of large pages we have to make sure that our
- // alignment is large page aware
- alignment = lcm(os::large_page_size(), alignment);
- }
-
- assert(alignment >= min_alignment(), "Must be");
-
- return alignment;
-}
-
void GenCollectorPolicy::initialize_flags() {
// All sizes must be multiples of the generation granularity.
set_min_alignment((uintx) Generation::GenGrain);
--- a/hotspot/src/share/vm/memory/collectorPolicy.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -98,6 +98,9 @@
{}
public:
+ // Return maximum heap alignment that may be imposed by the policy
+ static size_t compute_max_alignment();
+
void set_min_alignment(size_t align) { _min_alignment = align; }
size_t min_alignment() { return _min_alignment; }
void set_max_alignment(size_t align) { _max_alignment = align; }
@@ -234,9 +237,6 @@
// Try to allocate space by expanding the heap.
virtual HeapWord* expand_heap_and_allocate(size_t size, bool is_tlab);
- // compute max heap alignment
- size_t compute_max_alignment();
-
// Scale the base_size by NewRation according to
// result = base_size / (NewRatio + 1)
// and align by min_alignment()
--- a/hotspot/src/share/vm/memory/gcLocker.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/gcLocker.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -122,7 +122,7 @@
// strictly needed. It's added here to make it clear that
// the GC will NOT be performed if any other caller
// of GC_locker::lock() still needs GC locked.
- if (!is_active()) {
+ if (!is_active_internal()) {
_doing_gc = true;
{
// Must give up the lock while at a safepoint
--- a/hotspot/src/share/vm/memory/gcLocker.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/gcLocker.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -88,7 +88,7 @@
public:
// Accessors
static bool is_active() {
- assert(_needs_gc || SafepointSynchronize::is_at_safepoint(), "only read at safepoint");
+ assert(SafepointSynchronize::is_at_safepoint(), "only read at safepoint");
return is_active_internal();
}
static bool needs_gc() { return _needs_gc; }
--- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -148,6 +148,11 @@
return gen_policy()->size_policy();
}
+ // Return the (conservative) maximum heap alignment
+ static size_t conservative_max_heap_alignment() {
+ return Generation::GenGrain;
+ }
+
size_t capacity() const;
size_t used() const;
--- a/hotspot/src/share/vm/memory/genRemSet.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/genRemSet.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -32,13 +32,8 @@
// enumeration.)
uintx GenRemSet::max_alignment_constraint(Name nm) {
- switch (nm) {
- case GenRemSet::CardTable:
- return CardTableRS::ct_max_alignment_constraint();
- default:
- guarantee(false, "Unrecognized GenRemSet type.");
- return (0); // Make Windows compiler happy
- }
+ assert(nm == GenRemSet::CardTable, "Unrecognized GenRemSet type.");
+ return CardTableRS::ct_max_alignment_constraint();
}
class HasAccumulatedModifiedOopsClosure : public KlassClosure {
--- a/hotspot/src/share/vm/memory/heapInspection.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -150,11 +150,11 @@
HEAP_INSPECTION_COLUMNS_DO(DECLARE_KLASS_SIZE_STATS_FIELD)
static int count(oop x) {
- return (HeapWordSize * ((x) ? (x)->size() : 0));
+ return (HeapWordSize * (((x) != NULL) ? (x)->size() : 0));
}
static int count_array(objArrayOop x) {
- return (HeapWordSize * ((x) ? (x)->size() : 0));
+ return (HeapWordSize * (((x) != NULL) ? (x)->size() : 0));
}
template <class T> static int count(T* x) {
--- a/hotspot/src/share/vm/memory/metablock.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metablock.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -50,13 +50,6 @@
// Chunks, change Chunks so that they can be allocated out of a VirtualSpace.
size_t Metablock::_min_block_byte_size = sizeof(Metablock);
-#ifdef ASSERT
-size_t Metablock::_overhead =
- Chunk::aligned_overhead_size(sizeof(Metablock)) / BytesPerWord;
-#else
-size_t Metablock::_overhead = 0;
-#endif
-
// New blocks returned by the Metaspace are zero initialized.
// We should fix the constructors to not assume this instead.
Metablock* Metablock::initialize(MetaWord* p, size_t word_size) {
--- a/hotspot/src/share/vm/memory/metablock.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metablock.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -48,7 +48,6 @@
} _header;
} _block;
static size_t _min_block_byte_size;
- static size_t _overhead;
typedef union block_t Block;
typedef struct header_t Header;
@@ -73,7 +72,6 @@
void set_prev(Metablock* v) { _block._header._prev = v; }
static size_t min_block_byte_size() { return _min_block_byte_size; }
- static size_t overhead() { return _overhead; }
bool is_free() { return header()->_word_size != 0; }
void clear_next() { set_next(NULL); }
--- a/hotspot/src/share/vm/memory/metaspace.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
#include "gc_interface/collectedHeap.hpp"
+#include "memory/allocation.hpp"
#include "memory/binaryTreeDictionary.hpp"
#include "memory/freeList.hpp"
#include "memory/collectorPolicy.hpp"
@@ -51,7 +52,7 @@
// Parameters for stress mode testing
const uint metadata_deallocate_a_lot_block = 10;
const uint metadata_deallocate_a_lock_chunk = 3;
-size_t const allocation_from_dictionary_limit = 64 * K;
+size_t const allocation_from_dictionary_limit = 4 * K;
MetaWord* last_allocated = 0;
@@ -111,7 +112,7 @@
// Has three lists of free chunks, and a total size and
// count that includes all three
-class ChunkManager VALUE_OBJ_CLASS_SPEC {
+class ChunkManager : public CHeapObj<mtInternal> {
// Free list of chunks of different sizes.
// SpecializedChunk
@@ -158,7 +159,12 @@
public:
- ChunkManager() : _free_chunks_total(0), _free_chunks_count(0) {}
+ ChunkManager(size_t specialized_size, size_t small_size, size_t medium_size)
+ : _free_chunks_total(0), _free_chunks_count(0) {
+ _free_chunks[SpecializedIndex].set_size(specialized_size);
+ _free_chunks[SmallIndex].set_size(small_size);
+ _free_chunks[MediumIndex].set_size(medium_size);
+ }
// add or delete (return) a chunk to the global freelist.
Metachunk* chunk_freelist_allocate(size_t word_size);
@@ -177,8 +183,8 @@
void return_chunks(ChunkIndex index, Metachunk* chunks);
// Total of the space in the free chunks list
- size_t free_chunks_total();
- size_t free_chunks_total_in_bytes();
+ size_t free_chunks_total_words();
+ size_t free_chunks_total_bytes();
// Number of chunks in the free chunks list
size_t free_chunks_count();
@@ -219,7 +225,7 @@
void locked_print_free_chunks(outputStream* st);
void locked_print_sum_free_chunks(outputStream* st);
- void print_on(outputStream* st);
+ void print_on(outputStream* st) const;
};
// Used to manage the free list of Metablocks (a block corresponds
@@ -228,6 +234,10 @@
BlockTreeDictionary* _dictionary;
static Metablock* initialize_free_chunk(MetaWord* p, size_t word_size);
+ // Only allocate and split from freelist if the size of the allocation
+ // is at least 1/4th the size of the available block.
+ const static int WasteMultiplier = 4;
+
// Accessors
BlockTreeDictionary* dictionary() const { return _dictionary; }
@@ -272,11 +282,6 @@
// VirtualSpace
Metachunk* first_chunk() { return (Metachunk*) bottom(); }
- void inc_container_count();
-#ifdef ASSERT
- uint container_count_slow();
-#endif
-
public:
VirtualSpaceNode(size_t byte_size);
@@ -287,6 +292,10 @@
MetaWord* bottom() const { return (MetaWord*) _virtual_space.low(); }
MetaWord* end() const { return (MetaWord*) _virtual_space.high(); }
+ size_t reserved_words() const { return _virtual_space.reserved_size() / BytesPerWord; }
+ size_t expanded_words() const { return _virtual_space.committed_size() / BytesPerWord; }
+ size_t committed_words() const { return _virtual_space.actual_committed_size() / BytesPerWord; }
+
// address of next available space in _virtual_space;
// Accessors
VirtualSpaceNode* next() { return _next; }
@@ -306,8 +315,10 @@
void inc_top(size_t word_size) { _top += word_size; }
uintx container_count() { return _container_count; }
+ void inc_container_count();
void dec_container_count();
#ifdef ASSERT
+ uint container_count_slow();
void verify_container_count();
#endif
@@ -323,12 +334,10 @@
// Allocate a chunk from the virtual space and return it.
Metachunk* get_chunk_vs(size_t chunk_word_size);
- Metachunk* get_chunk_vs_with_expand(size_t chunk_word_size);
// Expands/shrinks the committed space in a virtual space. Delegates
// to Virtualspace
bool expand_by(size_t words, bool pre_touch = false);
- bool shrink_by(size_t words);
// In preparation for deleting this node, remove all the chunks
// in the node from any freelist.
@@ -336,8 +345,6 @@
#ifdef ASSERT
// Debug support
- static void verify_virtual_space_total();
- static void verify_virtual_space_count();
void mangle();
#endif
@@ -417,16 +424,17 @@
VirtualSpaceNode* _virtual_space_list;
// virtual space currently being used for allocations
VirtualSpaceNode* _current_virtual_space;
- // Free chunk list for all other metadata
- ChunkManager _chunk_manager;
// Can this virtual list allocate >1 spaces? Also, used to determine
// whether to allocate unlimited small chunks in this virtual space
bool _is_class;
- bool can_grow() const { return !is_class() || !UseCompressedKlassPointers; }
-
- // Sum of space in all virtual spaces and number of virtual spaces
- size_t _virtual_space_total;
+ bool can_grow() const { return !is_class() || !UseCompressedClassPointers; }
+
+ // Sum of reserved and committed memory in the virtual spaces
+ size_t _reserved_words;
+ size_t _committed_words;
+
+ // Number of virtual spaces
size_t _virtual_space_count;
~VirtualSpaceList();
@@ -440,7 +448,7 @@
_current_virtual_space = v;
}
- void link_vs(VirtualSpaceNode* new_entry, size_t vs_word_size);
+ void link_vs(VirtualSpaceNode* new_entry);
// Get another virtual space and add it to the list. This
// is typically prompted by a failed attempt to allocate a chunk
@@ -457,6 +465,8 @@
size_t grow_chunks_by_words,
size_t medium_chunk_bunch);
+ bool expand_by(VirtualSpaceNode* node, size_t word_size, bool pre_touch = false);
+
// Get the first chunk for a Metaspace. Used for
// special cases such as the boot class loader, reflection
// class loader and anonymous class loader.
@@ -466,28 +476,25 @@
return _current_virtual_space;
}
- ChunkManager* chunk_manager() { return &_chunk_manager; }
bool is_class() const { return _is_class; }
// Allocate the first virtualspace.
void initialize(size_t word_size);
- size_t virtual_space_total() { return _virtual_space_total; }
-
- void inc_virtual_space_total(size_t v);
- void dec_virtual_space_total(size_t v);
+ size_t reserved_words() { return _reserved_words; }
+ size_t reserved_bytes() { return reserved_words() * BytesPerWord; }
+ size_t committed_words() { return _committed_words; }
+ size_t committed_bytes() { return committed_words() * BytesPerWord; }
+
+ void inc_reserved_words(size_t v);
+ void dec_reserved_words(size_t v);
+ void inc_committed_words(size_t v);
+ void dec_committed_words(size_t v);
void inc_virtual_space_count();
void dec_virtual_space_count();
// Unlink empty VirtualSpaceNodes and free it.
- void purge();
-
- // Used and capacity in the entire list of virtual spaces.
- // These are global values shared by all Metaspaces
- size_t capacity_words_sum();
- size_t capacity_bytes_sum() { return capacity_words_sum() * BytesPerWord; }
- size_t used_words_sum();
- size_t used_bytes_sum() { return used_words_sum() * BytesPerWord; }
+ void purge(ChunkManager* chunk_manager);
bool contains(const void *ptr);
@@ -568,18 +575,12 @@
// Type of metadata allocated.
Metaspace::MetadataType _mdtype;
- // Chunk related size
- size_t _medium_chunk_bunch;
-
// List of chunks in use by this SpaceManager. Allocations
// are done from the current chunk. The list is used for deallocating
// chunks when the SpaceManager is freed.
Metachunk* _chunks_in_use[NumberOfInUseLists];
Metachunk* _current_chunk;
- // Virtual space where allocation comes from.
- VirtualSpaceList* _vs_list;
-
// Number of small chunks to allocate to a manager
// If class space manager, small chunks are unlimited
static uint const _small_chunk_limit;
@@ -612,7 +613,9 @@
}
Metaspace::MetadataType mdtype() { return _mdtype; }
- VirtualSpaceList* vs_list() const { return _vs_list; }
+
+ VirtualSpaceList* vs_list() const { return Metaspace::get_space_list(_mdtype); }
+ ChunkManager* chunk_manager() const { return Metaspace::get_chunk_manager(_mdtype); }
Metachunk* current_chunk() const { return _current_chunk; }
void set_current_chunk(Metachunk* v) {
@@ -623,6 +626,7 @@
// Add chunk to the list of chunks in use
void add_chunk(Metachunk* v, bool make_current);
+ void retire_current_chunk();
Mutex* lock() const { return _lock; }
@@ -633,18 +637,19 @@
public:
SpaceManager(Metaspace::MetadataType mdtype,
- Mutex* lock,
- VirtualSpaceList* vs_list);
+ Mutex* lock);
~SpaceManager();
enum ChunkMultiples {
MediumChunkMultiple = 4
};
+ bool is_class() { return _mdtype == Metaspace::ClassType; }
+
// Accessors
size_t specialized_chunk_size() { return SpecializedChunk; }
- size_t small_chunk_size() { return (size_t) vs_list()->is_class() ? ClassSmallChunk : SmallChunk; }
- size_t medium_chunk_size() { return (size_t) vs_list()->is_class() ? ClassMediumChunk : MediumChunk; }
+ size_t small_chunk_size() { return (size_t) is_class() ? ClassSmallChunk : SmallChunk; }
+ size_t medium_chunk_size() { return (size_t) is_class() ? ClassMediumChunk : MediumChunk; }
size_t medium_chunk_bunch() { return medium_chunk_size() * MediumChunkMultiple; }
size_t allocated_blocks_words() const { return _allocated_blocks_words; }
@@ -722,9 +727,7 @@
// MinChunkSize is a placeholder for the real minimum size JJJ
size_t byte_size = word_size * BytesPerWord;
- size_t byte_size_with_overhead = byte_size + Metablock::overhead();
-
- size_t raw_bytes_size = MAX2(byte_size_with_overhead,
+ size_t raw_bytes_size = MAX2(byte_size,
Metablock::min_block_byte_size());
raw_bytes_size = ARENA_ALIGN(raw_bytes_size);
size_t raw_word_size = raw_bytes_size / BytesPerWord;
@@ -749,7 +752,7 @@
_container_count++;
assert(_container_count == container_count_slow(),
err_msg("Inconsistency in countainer_count _container_count " SIZE_FORMAT
- "container_count_slow() " SIZE_FORMAT,
+ " container_count_slow() " SIZE_FORMAT,
_container_count, container_count_slow()));
}
@@ -762,7 +765,7 @@
void VirtualSpaceNode::verify_container_count() {
assert(_container_count == container_count_slow(),
err_msg("Inconsistency in countainer_count _container_count " SIZE_FORMAT
- "container_count_slow() " SIZE_FORMAT, _container_count, container_count_slow()));
+ " container_count_slow() " SIZE_FORMAT, _container_count, container_count_slow()));
}
#endif
@@ -807,12 +810,25 @@
}
Metablock* free_block =
- dictionary()->get_chunk(word_size, FreeBlockDictionary<Metablock>::exactly);
+ dictionary()->get_chunk(word_size, FreeBlockDictionary<Metablock>::atLeast);
if (free_block == NULL) {
return NULL;
}
- return (MetaWord*) free_block;
+ const size_t block_size = free_block->size();
+ if (block_size > WasteMultiplier * word_size) {
+ return_block((MetaWord*)free_block, block_size);
+ return NULL;
+ }
+
+ MetaWord* new_block = (MetaWord*)free_block;
+ assert(block_size >= word_size, "Incorrect size of block from freelist");
+ const size_t unused = block_size - word_size;
+ if (unused >= TreeChunk<Metablock, FreeList>::min_size()) {
+ return_block(new_block + word_size, unused);
+ }
+
+ return new_block;
}
void BlockFreelist::print_on(outputStream* st) const {
@@ -855,9 +871,9 @@
if (!is_available(chunk_word_size)) {
if (TraceMetadataChunkAllocation) {
- tty->print("VirtualSpaceNode::take_from_committed() not available %d words ", chunk_word_size);
+ gclog_or_tty->print("VirtualSpaceNode::take_from_committed() not available %d words ", chunk_word_size);
// Dump some information about the virtual space that is nearly full
- print_on(tty);
+ print_on(gclog_or_tty);
}
return NULL;
}
@@ -878,20 +894,11 @@
if (TraceMetavirtualspaceAllocation && !result) {
gclog_or_tty->print_cr("VirtualSpaceNode::expand_by() failed "
"for byte size " SIZE_FORMAT, bytes);
- virtual_space()->print();
+ virtual_space()->print_on(gclog_or_tty);
}
return result;
}
-// Shrink the virtual space (commit more of the reserved space)
-bool VirtualSpaceNode::shrink_by(size_t words) {
- size_t bytes = words * BytesPerWord;
- virtual_space()->shrink_by(bytes);
- return true;
-}
-
-// Add another chunk to the chunk list.
-
Metachunk* VirtualSpaceNode::get_chunk_vs(size_t chunk_word_size) {
assert_lock_strong(SpaceManager::expand_lock());
Metachunk* result = take_from_committed(chunk_word_size);
@@ -901,23 +908,6 @@
return result;
}
-Metachunk* VirtualSpaceNode::get_chunk_vs_with_expand(size_t chunk_word_size) {
- assert_lock_strong(SpaceManager::expand_lock());
-
- Metachunk* new_chunk = get_chunk_vs(chunk_word_size);
-
- if (new_chunk == NULL) {
- // Only a small part of the virtualspace is committed when first
- // allocated so committing more here can be expected.
- size_t page_size_words = os::vm_page_size() / BytesPerWord;
- size_t aligned_expand_vs_by_words = align_size_up(chunk_word_size,
- page_size_words);
- expand_by(aligned_expand_vs_by_words, false);
- new_chunk = get_chunk_vs(chunk_word_size);
- }
- return new_chunk;
-}
-
bool VirtualSpaceNode::initialize() {
if (!_rs.is_reserved()) {
@@ -977,13 +967,22 @@
}
}
-void VirtualSpaceList::inc_virtual_space_total(size_t v) {
+void VirtualSpaceList::inc_reserved_words(size_t v) {
assert_lock_strong(SpaceManager::expand_lock());
- _virtual_space_total = _virtual_space_total + v;
+ _reserved_words = _reserved_words + v;
+}
+void VirtualSpaceList::dec_reserved_words(size_t v) {
+ assert_lock_strong(SpaceManager::expand_lock());
+ _reserved_words = _reserved_words - v;
}
-void VirtualSpaceList::dec_virtual_space_total(size_t v) {
+
+void VirtualSpaceList::inc_committed_words(size_t v) {
assert_lock_strong(SpaceManager::expand_lock());
- _virtual_space_total = _virtual_space_total - v;
+ _committed_words = _committed_words + v;
+}
+void VirtualSpaceList::dec_committed_words(size_t v) {
+ assert_lock_strong(SpaceManager::expand_lock());
+ _committed_words = _committed_words - v;
}
void VirtualSpaceList::inc_virtual_space_count() {
@@ -1011,7 +1010,7 @@
// Walk the list of VirtualSpaceNodes and delete
// nodes with a 0 container_count. Remove Metachunks in
// the node from their respective freelists.
-void VirtualSpaceList::purge() {
+void VirtualSpaceList::purge(ChunkManager* chunk_manager) {
assert_lock_strong(SpaceManager::expand_lock());
// Don't use a VirtualSpaceListIterator because this
// list is being changed and a straightforward use of an iterator is not safe.
@@ -1033,8 +1032,9 @@
prev_vsl->set_next(vsl->next());
}
- vsl->purge(chunk_manager());
- dec_virtual_space_total(vsl->reserved()->word_size());
+ vsl->purge(chunk_manager);
+ dec_reserved_words(vsl->reserved_words());
+ dec_committed_words(vsl->committed_words());
dec_virtual_space_count();
purged_vsl = vsl;
delete vsl;
@@ -1054,49 +1054,16 @@
#endif
}
-size_t VirtualSpaceList::used_words_sum() {
- size_t allocated_by_vs = 0;
- VirtualSpaceListIterator iter(virtual_space_list());
- while (iter.repeat()) {
- VirtualSpaceNode* vsl = iter.get_next();
- // Sum used region [bottom, top) in each virtualspace
- allocated_by_vs += vsl->used_words_in_vs();
- }
- assert(allocated_by_vs >= chunk_manager()->free_chunks_total(),
- err_msg("Total in free chunks " SIZE_FORMAT
- " greater than total from virtual_spaces " SIZE_FORMAT,
- allocated_by_vs, chunk_manager()->free_chunks_total()));
- size_t used =
- allocated_by_vs - chunk_manager()->free_chunks_total();
- return used;
-}
-
-// Space available in all MetadataVirtualspaces allocated
-// for metadata. This is the upper limit on the capacity
-// of chunks allocated out of all the MetadataVirtualspaces.
-size_t VirtualSpaceList::capacity_words_sum() {
- size_t capacity = 0;
- VirtualSpaceListIterator iter(virtual_space_list());
- while (iter.repeat()) {
- VirtualSpaceNode* vsl = iter.get_next();
- capacity += vsl->capacity_words_in_vs();
- }
- return capacity;
-}
-
VirtualSpaceList::VirtualSpaceList(size_t word_size ) :
_is_class(false),
_virtual_space_list(NULL),
_current_virtual_space(NULL),
- _virtual_space_total(0),
+ _reserved_words(0),
+ _committed_words(0),
_virtual_space_count(0) {
MutexLockerEx cl(SpaceManager::expand_lock(),
Mutex::_no_safepoint_check_flag);
bool initialization_succeeded = grow_vs(word_size);
-
- _chunk_manager.free_chunks(SpecializedIndex)->set_size(SpecializedChunk);
- _chunk_manager.free_chunks(SmallIndex)->set_size(SmallChunk);
- _chunk_manager.free_chunks(MediumIndex)->set_size(MediumChunk);
assert(initialization_succeeded,
" VirtualSpaceList initialization should not fail");
}
@@ -1105,17 +1072,15 @@
_is_class(true),
_virtual_space_list(NULL),
_current_virtual_space(NULL),
- _virtual_space_total(0),
+ _reserved_words(0),
+ _committed_words(0),
_virtual_space_count(0) {
MutexLockerEx cl(SpaceManager::expand_lock(),
Mutex::_no_safepoint_check_flag);
VirtualSpaceNode* class_entry = new VirtualSpaceNode(rs);
bool succeeded = class_entry->initialize();
- _chunk_manager.free_chunks(SpecializedIndex)->set_size(SpecializedChunk);
- _chunk_manager.free_chunks(SmallIndex)->set_size(ClassSmallChunk);
- _chunk_manager.free_chunks(MediumIndex)->set_size(ClassMediumChunk);
assert(succeeded, " VirtualSpaceList initialization should not fail");
- link_vs(class_entry, rs.size()/BytesPerWord);
+ link_vs(class_entry);
}
size_t VirtualSpaceList::free_bytes() {
@@ -1130,7 +1095,7 @@
}
// Reserve the space
size_t vs_byte_size = vs_word_size * BytesPerWord;
- assert(vs_byte_size % os::vm_page_size() == 0, "Not aligned");
+ assert(vs_byte_size % os::vm_allocation_granularity() == 0, "Not aligned");
// Allocate the meta virtual space and initialize it.
VirtualSpaceNode* new_entry = new VirtualSpaceNode(vs_byte_size);
@@ -1138,44 +1103,53 @@
delete new_entry;
return false;
} else {
+ assert(new_entry->reserved_words() == vs_word_size, "Must be");
// ensure lock-free iteration sees fully initialized node
OrderAccess::storestore();
- link_vs(new_entry, vs_word_size);
+ link_vs(new_entry);
return true;
}
}
-void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry, size_t vs_word_size) {
+void VirtualSpaceList::link_vs(VirtualSpaceNode* new_entry) {
if (virtual_space_list() == NULL) {
set_virtual_space_list(new_entry);
} else {
current_virtual_space()->set_next(new_entry);
}
set_current_virtual_space(new_entry);
- inc_virtual_space_total(vs_word_size);
+ inc_reserved_words(new_entry->reserved_words());
+ inc_committed_words(new_entry->committed_words());
inc_virtual_space_count();
#ifdef ASSERT
new_entry->mangle();
#endif
if (TraceMetavirtualspaceAllocation && Verbose) {
VirtualSpaceNode* vsl = current_virtual_space();
- vsl->print_on(tty);
+ vsl->print_on(gclog_or_tty);
}
}
+bool VirtualSpaceList::expand_by(VirtualSpaceNode* node, size_t word_size, bool pre_touch) {
+ size_t before = node->committed_words();
+
+ bool result = node->expand_by(word_size, pre_touch);
+
+ size_t after = node->committed_words();
+
+ // after and before can be the same if the memory was pre-committed.
+ assert(after >= before, "Must be");
+ inc_committed_words(after - before);
+
+ return result;
+}
+
Metachunk* VirtualSpaceList::get_new_chunk(size_t word_size,
size_t grow_chunks_by_words,
size_t medium_chunk_bunch) {
- // Get a chunk from the chunk freelist
- Metachunk* next = chunk_manager()->chunk_freelist_allocate(grow_chunks_by_words);
-
- if (next != NULL) {
- next->container()->inc_container_count();
- } else {
- // Allocate a chunk out of the current virtual space.
- next = current_virtual_space()->get_chunk_vs(grow_chunks_by_words);
- }
+ // Allocate a chunk out of the current virtual space.
+ Metachunk* next = current_virtual_space()->get_chunk_vs(grow_chunks_by_words);
if (next == NULL) {
// Not enough room in current virtual space. Try to commit
@@ -1186,18 +1160,27 @@
size_t aligned_expand_vs_by_words = align_size_up(expand_vs_by_words,
page_size_words);
bool vs_expanded =
- current_virtual_space()->expand_by(aligned_expand_vs_by_words, false);
+ expand_by(current_virtual_space(), aligned_expand_vs_by_words);
if (!vs_expanded) {
// Should the capacity of the metaspaces be expanded for
// this allocation? If it's the virtual space for classes and is
// being used for CompressedHeaders, don't allocate a new virtualspace.
if (can_grow() && MetaspaceGC::should_expand(this, word_size)) {
// Get another virtual space.
- size_t grow_vs_words =
- MAX2((size_t)VirtualSpaceSize, aligned_expand_vs_by_words);
+ size_t allocation_aligned_expand_words =
+ align_size_up(aligned_expand_vs_by_words, os::vm_allocation_granularity() / BytesPerWord);
+ size_t grow_vs_words =
+ MAX2((size_t)VirtualSpaceSize, allocation_aligned_expand_words);
if (grow_vs(grow_vs_words)) {
// Got it. It's on the list now. Get a chunk from it.
- next = current_virtual_space()->get_chunk_vs_with_expand(grow_chunks_by_words);
+ assert(current_virtual_space()->expanded_words() == 0,
+ "New virtual space nodes should not have expanded");
+
+ size_t grow_chunks_by_words_aligned = align_size_up(grow_chunks_by_words,
+ page_size_words);
+ // We probably want to expand by aligned_expand_vs_by_words here.
+ expand_by(current_virtual_space(), grow_chunks_by_words_aligned);
+ next = current_virtual_space()->get_chunk_vs(grow_chunks_by_words);
}
} else {
// Allocation will fail and induce a GC
@@ -1307,8 +1290,9 @@
// reserved space, because this is a larger space prereserved for compressed
// class pointers.
if (!FLAG_IS_DEFAULT(MaxMetaspaceSize)) {
- size_t real_allocated = Metaspace::space_list()->virtual_space_total() +
- MetaspaceAux::allocated_capacity_bytes(Metaspace::ClassType);
+ size_t nonclass_allocated = MetaspaceAux::reserved_bytes(Metaspace::NonClassType);
+ size_t class_allocated = MetaspaceAux::allocated_capacity_bytes(Metaspace::ClassType);
+ size_t real_allocated = nonclass_allocated + class_allocated;
if (real_allocated >= MaxMetaspaceSize) {
return false;
}
@@ -1501,15 +1485,15 @@
if (dummy_chunk == NULL) {
break;
}
- vsl->chunk_manager()->chunk_freelist_deallocate(dummy_chunk);
+ sm->chunk_manager()->chunk_freelist_deallocate(dummy_chunk);
if (TraceMetadataChunkAllocation && Verbose) {
gclog_or_tty->print("Metadebug::deallocate_chunk_a_lot: %d) ",
sm->sum_count_in_chunks_in_use());
dummy_chunk->print_on(gclog_or_tty);
gclog_or_tty->print_cr(" Free chunks total %d count %d",
- vsl->chunk_manager()->free_chunks_total(),
- vsl->chunk_manager()->free_chunks_count());
+ sm->chunk_manager()->free_chunks_total_words(),
+ sm->chunk_manager()->free_chunks_count());
}
}
} else {
@@ -1565,12 +1549,12 @@
// ChunkManager methods
-size_t ChunkManager::free_chunks_total() {
+size_t ChunkManager::free_chunks_total_words() {
return _free_chunks_total;
}
-size_t ChunkManager::free_chunks_total_in_bytes() {
- return free_chunks_total() * BytesPerWord;
+size_t ChunkManager::free_chunks_total_bytes() {
+ return free_chunks_total_words() * BytesPerWord;
}
size_t ChunkManager::free_chunks_count() {
@@ -1698,9 +1682,9 @@
assert_lock_strong(SpaceManager::expand_lock());
slow_locked_verify();
if (TraceMetadataChunkAllocation) {
- tty->print_cr("ChunkManager::chunk_freelist_deallocate: chunk "
- PTR_FORMAT " size " SIZE_FORMAT,
- chunk, chunk->word_size());
+ gclog_or_tty->print_cr("ChunkManager::chunk_freelist_deallocate: chunk "
+ PTR_FORMAT " size " SIZE_FORMAT,
+ chunk, chunk->word_size());
}
free_chunks_put(chunk);
}
@@ -1729,9 +1713,9 @@
dec_free_chunks_total(chunk->capacity_word_size());
if (TraceMetadataChunkAllocation && Verbose) {
- tty->print_cr("ChunkManager::free_chunks_get: free_list "
- PTR_FORMAT " head " PTR_FORMAT " size " SIZE_FORMAT,
- free_list, chunk, chunk->word_size());
+ gclog_or_tty->print_cr("ChunkManager::free_chunks_get: free_list "
+ PTR_FORMAT " head " PTR_FORMAT " size " SIZE_FORMAT,
+ free_list, chunk, chunk->word_size());
}
} else {
chunk = humongous_dictionary()->get_chunk(
@@ -1741,10 +1725,10 @@
if (chunk != NULL) {
if (TraceMetadataHumongousAllocation) {
size_t waste = chunk->word_size() - word_size;
- tty->print_cr("Free list allocate humongous chunk size " SIZE_FORMAT
- " for requested size " SIZE_FORMAT
- " waste " SIZE_FORMAT,
- chunk->word_size(), word_size, waste);
+ gclog_or_tty->print_cr("Free list allocate humongous chunk size "
+ SIZE_FORMAT " for requested size " SIZE_FORMAT
+ " waste " SIZE_FORMAT,
+ chunk->word_size(), word_size, waste);
}
// Chunk is being removed from the chunks free list.
dec_free_chunks_total(chunk->capacity_word_size());
@@ -1761,6 +1745,8 @@
// work.
chunk->set_is_free(false);
#endif
+ chunk->container()->inc_container_count();
+
slow_locked_verify();
return chunk;
}
@@ -1786,18 +1772,18 @@
} else {
list_count = humongous_dictionary()->total_count();
}
- tty->print("ChunkManager::chunk_freelist_allocate: " PTR_FORMAT " chunk "
- PTR_FORMAT " size " SIZE_FORMAT " count " SIZE_FORMAT " ",
- this, chunk, chunk->word_size(), list_count);
- locked_print_free_chunks(tty);
+ gclog_or_tty->print("ChunkManager::chunk_freelist_allocate: " PTR_FORMAT " chunk "
+ PTR_FORMAT " size " SIZE_FORMAT " count " SIZE_FORMAT " ",
+ this, chunk, chunk->word_size(), list_count);
+ locked_print_free_chunks(gclog_or_tty);
}
return chunk;
}
-void ChunkManager::print_on(outputStream* out) {
+void ChunkManager::print_on(outputStream* out) const {
if (PrintFLSStatistics != 0) {
- humongous_dictionary()->report_statistics();
+ const_cast<ChunkManager *>(this)->humongous_dictionary()->report_statistics();
}
}
@@ -1944,8 +1930,8 @@
}
}
- vs_list()->chunk_manager()->locked_print_free_chunks(st);
- vs_list()->chunk_manager()->locked_print_sum_free_chunks(st);
+ chunk_manager()->locked_print_free_chunks(st);
+ chunk_manager()->locked_print_sum_free_chunks(st);
}
size_t SpaceManager::calc_chunk_size(size_t word_size) {
@@ -2049,9 +2035,7 @@
}
SpaceManager::SpaceManager(Metaspace::MetadataType mdtype,
- Mutex* lock,
- VirtualSpaceList* vs_list) :
- _vs_list(vs_list),
+ Mutex* lock) :
_mdtype(mdtype),
_allocated_blocks_words(0),
_allocated_chunks_words(0),
@@ -2137,9 +2121,7 @@
MutexLockerEx fcl(SpaceManager::expand_lock(),
Mutex::_no_safepoint_check_flag);
- ChunkManager* chunk_manager = vs_list()->chunk_manager();
-
- chunk_manager->slow_locked_verify();
+ chunk_manager()->slow_locked_verify();
dec_total_from_size_metrics();
@@ -2153,8 +2135,8 @@
// Have to update before the chunks_in_use lists are emptied
// below.
- chunk_manager->inc_free_chunks_total(allocated_chunks_words(),
- sum_count_in_chunks_in_use());
+ chunk_manager()->inc_free_chunks_total(allocated_chunks_words(),
+ sum_count_in_chunks_in_use());
// Add all the chunks in use by this space manager
// to the global list of free chunks.
@@ -2169,11 +2151,11 @@
chunk_size_name(i));
}
Metachunk* chunks = chunks_in_use(i);
- chunk_manager->return_chunks(i, chunks);
+ chunk_manager()->return_chunks(i, chunks);
set_chunks_in_use(i, NULL);
if (TraceMetadataChunkAllocation && Verbose) {
gclog_or_tty->print_cr("updated freelist count %d %s",
- chunk_manager->free_chunks(i)->count(),
+ chunk_manager()->free_chunks(i)->count(),
chunk_size_name(i));
}
assert(i != HumongousIndex, "Humongous chunks are handled explicitly later");
@@ -2210,16 +2192,16 @@
humongous_chunks->word_size(), HumongousChunkGranularity));
Metachunk* next_humongous_chunks = humongous_chunks->next();
humongous_chunks->container()->dec_container_count();
- chunk_manager->humongous_dictionary()->return_chunk(humongous_chunks);
+ chunk_manager()->humongous_dictionary()->return_chunk(humongous_chunks);
humongous_chunks = next_humongous_chunks;
}
if (TraceMetadataChunkAllocation && Verbose) {
gclog_or_tty->print_cr("");
gclog_or_tty->print_cr("updated dictionary count %d %s",
- chunk_manager->humongous_dictionary()->total_count(),
+ chunk_manager()->humongous_dictionary()->total_count(),
chunk_size_name(HumongousIndex));
}
- chunk_manager->slow_locked_verify();
+ chunk_manager()->slow_locked_verify();
}
const char* SpaceManager::chunk_size_name(ChunkIndex index) const {
@@ -2278,6 +2260,7 @@
ChunkIndex index = ChunkManager::list_index(new_chunk->word_size());
if (index != HumongousIndex) {
+ retire_current_chunk();
set_current_chunk(new_chunk);
new_chunk->set_next(chunks_in_use(index));
set_chunks_in_use(index, new_chunk);
@@ -2307,23 +2290,35 @@
gclog_or_tty->print("SpaceManager::add_chunk: %d) ",
sum_count_in_chunks_in_use());
new_chunk->print_on(gclog_or_tty);
- if (vs_list() != NULL) {
- vs_list()->chunk_manager()->locked_print_free_chunks(tty);
+ chunk_manager()->locked_print_free_chunks(gclog_or_tty);
+ }
+}
+
+void SpaceManager::retire_current_chunk() {
+ if (current_chunk() != NULL) {
+ size_t remaining_words = current_chunk()->free_word_size();
+ if (remaining_words >= TreeChunk<Metablock, FreeList>::min_size()) {
+ block_freelists()->return_block(current_chunk()->allocate(remaining_words), remaining_words);
+ inc_used_metrics(remaining_words);
}
}
}
Metachunk* SpaceManager::get_new_chunk(size_t word_size,
size_t grow_chunks_by_words) {
-
- Metachunk* next = vs_list()->get_new_chunk(word_size,
- grow_chunks_by_words,
- medium_chunk_bunch());
-
- if (TraceMetadataHumongousAllocation &&
+ // Get a chunk from the chunk freelist
+ Metachunk* next = chunk_manager()->chunk_freelist_allocate(grow_chunks_by_words);
+
+ if (next == NULL) {
+ next = vs_list()->get_new_chunk(word_size,
+ grow_chunks_by_words,
+ medium_chunk_bunch());
+ }
+
+ if (TraceMetadataHumongousAllocation && next != NULL &&
SpaceManager::is_humongous(next->word_size())) {
- gclog_or_tty->print_cr(" new humongous chunk word size " PTR_FORMAT,
- next->word_size());
+ gclog_or_tty->print_cr(" new humongous chunk word size "
+ PTR_FORMAT, next->word_size());
}
return next;
@@ -2441,9 +2436,6 @@
curr = curr->next()) {
out->print("%d) ", i++);
curr->print_on(out);
- if (TraceMetadataChunkAllocation && Verbose) {
- block_freelists()->print_on(out);
- }
curr_total += curr->word_size();
used += curr->used_word_size();
capacity += curr->capacity_word_size();
@@ -2451,6 +2443,10 @@
}
}
+ if (TraceMetadataChunkAllocation && Verbose) {
+ block_freelists()->print_on(out);
+ }
+
size_t free = current_chunk() == NULL ? 0 : current_chunk()->free_word_size();
// Free space isn't wasted.
waste -= free;
@@ -2538,13 +2534,13 @@
return used * BytesPerWord;
}
-size_t MetaspaceAux::free_in_bytes(Metaspace::MetadataType mdtype) {
+size_t MetaspaceAux::free_bytes_slow(Metaspace::MetadataType mdtype) {
size_t free = 0;
ClassLoaderDataGraphMetaspaceIterator iter;
while (iter.repeat()) {
Metaspace* msp = iter.get_next();
if (msp != NULL) {
- free += msp->free_words(mdtype);
+ free += msp->free_words_slow(mdtype);
}
}
return free * BytesPerWord;
@@ -2567,34 +2563,55 @@
return capacity * BytesPerWord;
}
-size_t MetaspaceAux::reserved_in_bytes(Metaspace::MetadataType mdtype) {
- VirtualSpaceList* list = Metaspace::get_space_list(mdtype);
- return list == NULL ? 0 : list->virtual_space_total();
+size_t MetaspaceAux::capacity_bytes_slow() {
+#ifdef PRODUCT
+ // Use allocated_capacity_bytes() in PRODUCT instead of this function.
+ guarantee(false, "Should not call capacity_bytes_slow() in the PRODUCT");
+#endif
+ size_t class_capacity = capacity_bytes_slow(Metaspace::ClassType);
+ size_t non_class_capacity = capacity_bytes_slow(Metaspace::NonClassType);
+ assert(allocated_capacity_bytes() == class_capacity + non_class_capacity,
+ err_msg("bad accounting: allocated_capacity_bytes() " SIZE_FORMAT
+ " class_capacity + non_class_capacity " SIZE_FORMAT
+ " class_capacity " SIZE_FORMAT " non_class_capacity " SIZE_FORMAT,
+ allocated_capacity_bytes(), class_capacity + non_class_capacity,
+ class_capacity, non_class_capacity));
+
+ return class_capacity + non_class_capacity;
}
-size_t MetaspaceAux::min_chunk_size() { return Metaspace::first_chunk_word_size(); }
-
-size_t MetaspaceAux::free_chunks_total(Metaspace::MetadataType mdtype) {
+size_t MetaspaceAux::reserved_bytes(Metaspace::MetadataType mdtype) {
+ VirtualSpaceList* list = Metaspace::get_space_list(mdtype);
+ return list == NULL ? 0 : list->reserved_bytes();
+}
+
+size_t MetaspaceAux::committed_bytes(Metaspace::MetadataType mdtype) {
VirtualSpaceList* list = Metaspace::get_space_list(mdtype);
- if (list == NULL) {
+ return list == NULL ? 0 : list->committed_bytes();
+}
+
+size_t MetaspaceAux::min_chunk_size_words() { return Metaspace::first_chunk_word_size(); }
+
+size_t MetaspaceAux::free_chunks_total_words(Metaspace::MetadataType mdtype) {
+ ChunkManager* chunk_manager = Metaspace::get_chunk_manager(mdtype);
+ if (chunk_manager == NULL) {
return 0;
}
- ChunkManager* chunk = list->chunk_manager();
- chunk->slow_verify();
- return chunk->free_chunks_total();
+ chunk_manager->slow_verify();
+ return chunk_manager->free_chunks_total_words();
}
-size_t MetaspaceAux::free_chunks_total_in_bytes(Metaspace::MetadataType mdtype) {
- return free_chunks_total(mdtype) * BytesPerWord;
+size_t MetaspaceAux::free_chunks_total_bytes(Metaspace::MetadataType mdtype) {
+ return free_chunks_total_words(mdtype) * BytesPerWord;
}
-size_t MetaspaceAux::free_chunks_total() {
- return free_chunks_total(Metaspace::ClassType) +
- free_chunks_total(Metaspace::NonClassType);
+size_t MetaspaceAux::free_chunks_total_words() {
+ return free_chunks_total_words(Metaspace::ClassType) +
+ free_chunks_total_words(Metaspace::NonClassType);
}
-size_t MetaspaceAux::free_chunks_total_in_bytes() {
- return free_chunks_total() * BytesPerWord;
+size_t MetaspaceAux::free_chunks_total_bytes() {
+ return free_chunks_total_words() * BytesPerWord;
}
void MetaspaceAux::print_metaspace_change(size_t prev_metadata_used) {
@@ -2605,14 +2622,14 @@
"(" SIZE_FORMAT ")",
prev_metadata_used,
allocated_used_bytes(),
- reserved_in_bytes());
+ reserved_bytes());
} else {
gclog_or_tty->print(" " SIZE_FORMAT "K"
"->" SIZE_FORMAT "K"
"(" SIZE_FORMAT "K)",
- prev_metadata_used / K,
- allocated_used_bytes() / K,
- reserved_in_bytes()/ K);
+ prev_metadata_used/K,
+ allocated_used_bytes()/K,
+ reserved_bytes()/K);
}
gclog_or_tty->print("]");
@@ -2625,14 +2642,14 @@
out->print_cr(" Metaspace total "
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
" reserved " SIZE_FORMAT "K",
- allocated_capacity_bytes()/K, allocated_used_bytes()/K, reserved_in_bytes()/K);
+ allocated_capacity_bytes()/K, allocated_used_bytes()/K, reserved_bytes()/K);
out->print_cr(" data space "
SIZE_FORMAT "K, used " SIZE_FORMAT "K,"
" reserved " SIZE_FORMAT "K",
allocated_capacity_bytes(nct)/K,
allocated_used_bytes(nct)/K,
- reserved_in_bytes(nct)/K);
+ reserved_bytes(nct)/K);
if (Metaspace::using_class_space()) {
Metaspace::MetadataType ct = Metaspace::ClassType;
out->print_cr(" class space "
@@ -2640,17 +2657,17 @@
" reserved " SIZE_FORMAT "K",
allocated_capacity_bytes(ct)/K,
allocated_used_bytes(ct)/K,
- reserved_in_bytes(ct)/K);
+ reserved_bytes(ct)/K);
}
}
// Print information for class space and data space separately.
// This is almost the same as above.
void MetaspaceAux::print_on(outputStream* out, Metaspace::MetadataType mdtype) {
- size_t free_chunks_capacity_bytes = free_chunks_total_in_bytes(mdtype);
+ size_t free_chunks_capacity_bytes = free_chunks_total_bytes(mdtype);
size_t capacity_bytes = capacity_bytes_slow(mdtype);
size_t used_bytes = used_bytes_slow(mdtype);
- size_t free_bytes = free_in_bytes(mdtype);
+ size_t free_bytes = free_bytes_slow(mdtype);
size_t used_and_free = used_bytes + free_bytes +
free_chunks_capacity_bytes;
out->print_cr(" Chunk accounting: used in chunks " SIZE_FORMAT
@@ -2732,9 +2749,9 @@
}
void MetaspaceAux::verify_free_chunks() {
- Metaspace::space_list()->chunk_manager()->verify();
+ Metaspace::chunk_manager_metadata()->verify();
if (Metaspace::using_class_space()) {
- Metaspace::class_space_list()->chunk_manager()->verify();
+ Metaspace::chunk_manager_class()->verify();
}
}
@@ -2805,6 +2822,9 @@
VirtualSpaceList* Metaspace::_space_list = NULL;
VirtualSpaceList* Metaspace::_class_space_list = NULL;
+ChunkManager* Metaspace::_chunk_manager_metadata = NULL;
+ChunkManager* Metaspace::_chunk_manager_class = NULL;
+
#define VIRTUALSPACEMULTIPLIER 2
#ifdef _LP64
@@ -2836,7 +2856,7 @@
// to work with compressed klass pointers.
bool Metaspace::can_use_cds_with_metaspace_addr(char* metaspace_base, address cds_base) {
assert(cds_base != 0 && UseSharedSpaces, "Only use with CDS");
- assert(UseCompressedKlassPointers, "Only use with CompressedKlassPtrs");
+ assert(UseCompressedClassPointers, "Only use with CompressedKlassPtrs");
address lower_base = MIN2((address)metaspace_base, cds_base);
address higher_address = MAX2((address)(cds_base + FileMapInfo::shared_spaces_size()),
(address)(metaspace_base + class_metaspace_size()));
@@ -2846,7 +2866,7 @@
// Try to allocate the metaspace at the requested addr.
void Metaspace::allocate_metaspace_compressed_klass_ptrs(char* requested_addr, address cds_base) {
assert(using_class_space(), "called improperly");
- assert(UseCompressedKlassPointers, "Only use with CompressedKlassPtrs");
+ assert(UseCompressedClassPointers, "Only use with CompressedKlassPtrs");
assert(class_metaspace_size() < KlassEncodingMetaspaceMax,
"Metaspace size is too big");
@@ -2869,9 +2889,9 @@
// If no successful allocation then try to allocate the space anywhere. If
// that fails then OOM doom. At this point we cannot try allocating the
- // metaspace as if UseCompressedKlassPointers is off because too much
- // initialization has happened that depends on UseCompressedKlassPointers.
- // So, UseCompressedKlassPointers cannot be turned off at this point.
+ // metaspace as if UseCompressedClassPointers is off because too much
+ // initialization has happened that depends on UseCompressedClassPointers.
+ // So, UseCompressedClassPointers cannot be turned off at this point.
if (!metaspace_rs.is_reserved()) {
metaspace_rs = ReservedSpace(class_metaspace_size(),
os::vm_allocation_granularity(), false);
@@ -2904,14 +2924,15 @@
}
}
-// For UseCompressedKlassPointers the class space is reserved above the top of
+// For UseCompressedClassPointers the class space is reserved above the top of
// the Java heap. The argument passed in is at the base of the compressed space.
void Metaspace::initialize_class_space(ReservedSpace rs) {
// The reserved space size may be bigger because of alignment, esp with UseLargePages
- assert(rs.size() >= ClassMetaspaceSize,
- err_msg(SIZE_FORMAT " != " UINTX_FORMAT, rs.size(), ClassMetaspaceSize));
+ assert(rs.size() >= CompressedClassSpaceSize,
+ err_msg(SIZE_FORMAT " != " UINTX_FORMAT, rs.size(), CompressedClassSpaceSize));
assert(using_class_space(), "Must be using class space");
_class_space_list = new VirtualSpaceList(rs);
+ _chunk_manager_class = new ChunkManager(SpecializedChunk, ClassSmallChunk, ClassMediumChunk);
}
#endif
@@ -2921,7 +2942,7 @@
int max_alignment = os::vm_page_size();
size_t cds_total = 0;
- set_class_metaspace_size(align_size_up(ClassMetaspaceSize,
+ set_class_metaspace_size(align_size_up(CompressedClassSpaceSize,
os::vm_allocation_granularity()));
MetaspaceShared::set_max_alignment(max_alignment);
@@ -2937,12 +2958,13 @@
// remainder is the misc code and data chunks.
cds_total = FileMapInfo::shared_spaces_size();
_space_list = new VirtualSpaceList(cds_total/wordSize);
+ _chunk_manager_metadata = new ChunkManager(SpecializedChunk, SmallChunk, MediumChunk);
#ifdef _LP64
// Set the compressed klass pointer base so that decoding of these pointers works
// properly when creating the shared archive.
- assert(UseCompressedOops && UseCompressedKlassPointers,
- "UseCompressedOops and UseCompressedKlassPointers must be set");
+ assert(UseCompressedOops && UseCompressedClassPointers,
+ "UseCompressedOops and UseCompressedClassPointers must be set");
Universe::set_narrow_klass_base((address)_space_list->current_virtual_space()->bottom());
if (TraceMetavirtualspaceAllocation && Verbose) {
gclog_or_tty->print_cr("Setting_narrow_klass_base to Address: " PTR_FORMAT,
@@ -2979,7 +3001,7 @@
}
#ifdef _LP64
- // If UseCompressedKlassPointers is set then allocate the metaspace area
+ // If UseCompressedClassPointers is set then allocate the metaspace area
// above the heap and above the CDS area (if it exists).
if (using_class_space()) {
if (UseSharedSpaces) {
@@ -2997,22 +3019,37 @@
// on the medium chunk list. The next chunk will be small and progress
// from there. This size calculated by -version.
_first_class_chunk_word_size = MIN2((size_t)MediumChunk*6,
- (ClassMetaspaceSize/BytesPerWord)*2);
+ (CompressedClassSpaceSize/BytesPerWord)*2);
_first_class_chunk_word_size = align_word_size_up(_first_class_chunk_word_size);
// Arbitrarily set the initial virtual space to a multiple
// of the boot class loader size.
size_t word_size = VIRTUALSPACEMULTIPLIER * first_chunk_word_size();
// Initialize the list of virtual spaces.
_space_list = new VirtualSpaceList(word_size);
+ _chunk_manager_metadata = new ChunkManager(SpecializedChunk, SmallChunk, MediumChunk);
}
}
+Metachunk* Metaspace::get_initialization_chunk(MetadataType mdtype,
+ size_t chunk_word_size,
+ size_t chunk_bunch) {
+ // Get a chunk from the chunk freelist
+ Metachunk* chunk = get_chunk_manager(mdtype)->chunk_freelist_allocate(chunk_word_size);
+ if (chunk != NULL) {
+ return chunk;
+ }
+
+ return get_space_list(mdtype)->get_initialization_chunk(chunk_word_size, chunk_bunch);
+}
+
void Metaspace::initialize(Mutex* lock, MetaspaceType type) {
assert(space_list() != NULL,
"Metadata VirtualSpaceList has not been initialized");
-
- _vsm = new SpaceManager(NonClassType, lock, space_list());
+ assert(chunk_manager_metadata() != NULL,
+ "Metadata ChunkManager has not been initialized");
+
+ _vsm = new SpaceManager(NonClassType, lock);
if (_vsm == NULL) {
return;
}
@@ -3021,11 +3058,13 @@
vsm()->get_initial_chunk_sizes(type, &word_size, &class_word_size);
if (using_class_space()) {
- assert(class_space_list() != NULL,
- "Class VirtualSpaceList has not been initialized");
+ assert(class_space_list() != NULL,
+ "Class VirtualSpaceList has not been initialized");
+ assert(chunk_manager_class() != NULL,
+ "Class ChunkManager has not been initialized");
// Allocate SpaceManager for classes.
- _class_vsm = new SpaceManager(ClassType, lock, class_space_list());
+ _class_vsm = new SpaceManager(ClassType, lock);
if (_class_vsm == NULL) {
return;
}
@@ -3034,9 +3073,9 @@
MutexLockerEx cl(SpaceManager::expand_lock(), Mutex::_no_safepoint_check_flag);
// Allocate chunk for metadata objects
- Metachunk* new_chunk =
- space_list()->get_initialization_chunk(word_size,
- vsm()->medium_chunk_bunch());
+ Metachunk* new_chunk = get_initialization_chunk(NonClassType,
+ word_size,
+ vsm()->medium_chunk_bunch());
assert(!DumpSharedSpaces || new_chunk != NULL, "should have enough space for both chunks");
if (new_chunk != NULL) {
// Add to this manager's list of chunks in use and current_chunk().
@@ -3045,9 +3084,9 @@
// Allocate chunk for class metadata objects
if (using_class_space()) {
- Metachunk* class_chunk =
- class_space_list()->get_initialization_chunk(class_word_size,
- class_vsm()->medium_chunk_bunch());
+ Metachunk* class_chunk = get_initialization_chunk(ClassType,
+ class_word_size,
+ class_vsm()->medium_chunk_bunch());
if (class_chunk != NULL) {
class_vsm()->add_chunk(class_chunk, true);
}
@@ -3064,8 +3103,8 @@
MetaWord* Metaspace::allocate(size_t word_size, MetadataType mdtype) {
// DumpSharedSpaces doesn't use class metadata area (yet)
- // Also, don't use class_vsm() unless UseCompressedKlassPointers is true.
- if (mdtype == ClassType && using_class_space()) {
+ // Also, don't use class_vsm() unless UseCompressedClassPointers is true.
+ if (is_class_space_allocation(mdtype)) {
return class_vsm()->allocate(word_size);
} else {
return vsm()->allocate(word_size);
@@ -3103,7 +3142,7 @@
}
}
-size_t Metaspace::free_words(MetadataType mdtype) const {
+size_t Metaspace::free_words_slow(MetadataType mdtype) const {
if (mdtype == ClassType) {
return using_class_space() ? class_vsm()->sum_free_in_chunks_in_use() : 0;
} else {
@@ -3213,8 +3252,8 @@
MetaspaceAux::dump(gclog_or_tty);
}
// -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
- const char* space_string = (mdtype == ClassType) ? "Class Metadata space" :
- "Metadata space";
+ const char* space_string = is_class_space_allocation(mdtype) ? "Compressed class space" :
+ "Metadata space";
report_java_out_of_memory(space_string);
if (JvmtiExport::should_post_resource_exhausted()) {
@@ -3222,7 +3261,7 @@
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR,
space_string);
}
- if (mdtype == ClassType) {
+ if (is_class_space_allocation(mdtype)) {
THROW_OOP_0(Universe::out_of_memory_error_class_metaspace());
} else {
THROW_OOP_0(Universe::out_of_memory_error_metaspace());
@@ -3264,12 +3303,16 @@
}
}
+void Metaspace::purge(MetadataType mdtype) {
+ get_space_list(mdtype)->purge(get_chunk_manager(mdtype));
+}
+
void Metaspace::purge() {
MutexLockerEx cl(SpaceManager::expand_lock(),
Mutex::_no_safepoint_check_flag);
- space_list()->purge();
+ purge(NonClassType);
if (using_class_space()) {
- class_space_list()->purge();
+ purge(ClassType);
}
}
@@ -3311,3 +3354,70 @@
class_vsm()->dump(out);
}
}
+
+/////////////// Unit tests ///////////////
+
+#ifndef PRODUCT
+
+class TestMetaspaceAuxTest : AllStatic {
+ public:
+ static void test_reserved() {
+ size_t reserved = MetaspaceAux::reserved_bytes();
+
+ assert(reserved > 0, "assert");
+
+ size_t committed = MetaspaceAux::committed_bytes();
+ assert(committed <= reserved, "assert");
+
+ size_t reserved_metadata = MetaspaceAux::reserved_bytes(Metaspace::NonClassType);
+ assert(reserved_metadata > 0, "assert");
+ assert(reserved_metadata <= reserved, "assert");
+
+ if (UseCompressedClassPointers) {
+ size_t reserved_class = MetaspaceAux::reserved_bytes(Metaspace::ClassType);
+ assert(reserved_class > 0, "assert");
+ assert(reserved_class < reserved, "assert");
+ }
+ }
+
+ static void test_committed() {
+ size_t committed = MetaspaceAux::committed_bytes();
+
+ assert(committed > 0, "assert");
+
+ size_t reserved = MetaspaceAux::reserved_bytes();
+ assert(committed <= reserved, "assert");
+
+ size_t committed_metadata = MetaspaceAux::committed_bytes(Metaspace::NonClassType);
+ assert(committed_metadata > 0, "assert");
+ assert(committed_metadata <= committed, "assert");
+
+ if (UseCompressedClassPointers) {
+ size_t committed_class = MetaspaceAux::committed_bytes(Metaspace::ClassType);
+ assert(committed_class > 0, "assert");
+ assert(committed_class < committed, "assert");
+ }
+ }
+
+ static void test_virtual_space_list_large_chunk() {
+ VirtualSpaceList* vs_list = new VirtualSpaceList(os::vm_allocation_granularity());
+ MutexLockerEx cl(SpaceManager::expand_lock(), Mutex::_no_safepoint_check_flag);
+ // A size larger than VirtualSpaceSize (256k) and add one page to make it _not_ be
+ // vm_allocation_granularity aligned on Windows.
+ size_t large_size = (size_t)(2*256*K + (os::vm_page_size()/BytesPerWord));
+ large_size += (os::vm_page_size()/BytesPerWord);
+ vs_list->get_new_chunk(large_size, large_size, 0);
+ }
+
+ static void test() {
+ test_reserved();
+ test_committed();
+ test_virtual_space_list_large_chunk();
+ }
+};
+
+void TestMetaspaceAux_test() {
+ TestMetaspaceAuxTest::test();
+}
+
+#endif
--- a/hotspot/src/share/vm/memory/metaspace.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspace.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -56,12 +56,15 @@
// +-------------------+
//
+class ChunkManager;
class ClassLoaderData;
class Metablock;
+class Metachunk;
class MetaWord;
class Mutex;
class outputStream;
class SpaceManager;
+class VirtualSpaceList;
// Metaspaces each have a SpaceManager and allocations
// are done by the SpaceManager. Allocations are done
@@ -76,8 +79,6 @@
// allocate() method returns a block for use as a
// quantum of metadata.
-class VirtualSpaceList;
-
class Metaspace : public CHeapObj<mtClass> {
friend class VMStructs;
friend class SpaceManager;
@@ -102,6 +103,10 @@
private:
void initialize(Mutex* lock, MetaspaceType type);
+ Metachunk* get_initialization_chunk(MetadataType mdtype,
+ size_t chunk_word_size,
+ size_t chunk_bunch);
+
// Align up the word size to the allocation word size
static size_t align_word_size_up(size_t);
@@ -134,6 +139,10 @@
static VirtualSpaceList* _space_list;
static VirtualSpaceList* _class_space_list;
+ static ChunkManager* _chunk_manager_metadata;
+ static ChunkManager* _chunk_manager_class;
+
+ public:
static VirtualSpaceList* space_list() { return _space_list; }
static VirtualSpaceList* class_space_list() { return _class_space_list; }
static VirtualSpaceList* get_space_list(MetadataType mdtype) {
@@ -141,6 +150,14 @@
return mdtype == ClassType ? class_space_list() : space_list();
}
+ static ChunkManager* chunk_manager_metadata() { return _chunk_manager_metadata; }
+ static ChunkManager* chunk_manager_class() { return _chunk_manager_class; }
+ static ChunkManager* get_chunk_manager(MetadataType mdtype) {
+ assert(mdtype != MetadataTypeCount, "MetadaTypeCount can't be used as mdtype");
+ return mdtype == ClassType ? chunk_manager_class() : chunk_manager_metadata();
+ }
+
+ private:
// This is used by DumpSharedSpaces only, where only _vsm is used. So we will
// maintain a single list for now.
void record_allocation(void* ptr, MetaspaceObj::Type type, size_t word_size);
@@ -182,9 +199,8 @@
char* bottom() const;
size_t used_words_slow(MetadataType mdtype) const;
- size_t free_words(MetadataType mdtype) const;
+ size_t free_words_slow(MetadataType mdtype) const;
size_t capacity_words_slow(MetadataType mdtype) const;
- size_t waste_words(MetadataType mdtype) const;
size_t used_bytes_slow(MetadataType mdtype) const;
size_t capacity_bytes_slow(MetadataType mdtype) const;
@@ -200,6 +216,7 @@
void dump(outputStream* const out) const;
// Free empty virtualspaces
+ static void purge(MetadataType mdtype);
static void purge();
void print_on(outputStream* st) const;
@@ -213,27 +230,25 @@
void iterate(AllocRecordClosure *closure);
- // Return TRUE only if UseCompressedKlassPointers is True and DumpSharedSpaces is False.
+ // Return TRUE only if UseCompressedClassPointers is True and DumpSharedSpaces is False.
static bool using_class_space() {
- return NOT_LP64(false) LP64_ONLY(UseCompressedKlassPointers && !DumpSharedSpaces);
+ return NOT_LP64(false) LP64_ONLY(UseCompressedClassPointers && !DumpSharedSpaces);
}
+ static bool is_class_space_allocation(MetadataType mdType) {
+ return mdType == ClassType && using_class_space();
+ }
};
class MetaspaceAux : AllStatic {
- static size_t free_chunks_total(Metaspace::MetadataType mdtype);
-
- public:
- // Statistics for class space and data space in metaspace.
+ static size_t free_chunks_total_words(Metaspace::MetadataType mdtype);
// These methods iterate over the classloader data graph
// for the given Metaspace type. These are slow.
static size_t used_bytes_slow(Metaspace::MetadataType mdtype);
- static size_t free_in_bytes(Metaspace::MetadataType mdtype);
+ static size_t free_bytes_slow(Metaspace::MetadataType mdtype);
static size_t capacity_bytes_slow(Metaspace::MetadataType mdtype);
-
- // Iterates over the virtual space list.
- static size_t reserved_in_bytes(Metaspace::MetadataType mdtype);
+ static size_t capacity_bytes_slow();
// Running sum of space in all Metachunks that has been
// allocated to a Metaspace. This is used instead of
@@ -263,17 +278,16 @@
}
// Used by MetaspaceCounters
- static size_t free_chunks_total();
- static size_t free_chunks_total_in_bytes();
- static size_t free_chunks_total_in_bytes(Metaspace::MetadataType mdtype);
+ static size_t free_chunks_total_words();
+ static size_t free_chunks_total_bytes();
+ static size_t free_chunks_total_bytes(Metaspace::MetadataType mdtype);
static size_t allocated_capacity_words(Metaspace::MetadataType mdtype) {
return _allocated_capacity_words[mdtype];
}
static size_t allocated_capacity_words() {
- return _allocated_capacity_words[Metaspace::NonClassType] +
- (Metaspace::using_class_space() ?
- _allocated_capacity_words[Metaspace::ClassType] : 0);
+ return allocated_capacity_words(Metaspace::NonClassType) +
+ allocated_capacity_words(Metaspace::ClassType);
}
static size_t allocated_capacity_bytes(Metaspace::MetadataType mdtype) {
return allocated_capacity_words(mdtype) * BytesPerWord;
@@ -286,9 +300,8 @@
return _allocated_used_words[mdtype];
}
static size_t allocated_used_words() {
- return _allocated_used_words[Metaspace::NonClassType] +
- (Metaspace::using_class_space() ?
- _allocated_used_words[Metaspace::ClassType] : 0);
+ return allocated_used_words(Metaspace::NonClassType) +
+ allocated_used_words(Metaspace::ClassType);
}
static size_t allocated_used_bytes(Metaspace::MetadataType mdtype) {
return allocated_used_words(mdtype) * BytesPerWord;
@@ -300,31 +313,22 @@
static size_t free_bytes();
static size_t free_bytes(Metaspace::MetadataType mdtype);
- // Total capacity in all Metaspaces
- static size_t capacity_bytes_slow() {
-#ifdef PRODUCT
- // Use allocated_capacity_bytes() in PRODUCT instead of this function.
- guarantee(false, "Should not call capacity_bytes_slow() in the PRODUCT");
-#endif
- size_t class_capacity = capacity_bytes_slow(Metaspace::ClassType);
- size_t non_class_capacity = capacity_bytes_slow(Metaspace::NonClassType);
- assert(allocated_capacity_bytes() == class_capacity + non_class_capacity,
- err_msg("bad accounting: allocated_capacity_bytes() " SIZE_FORMAT
- " class_capacity + non_class_capacity " SIZE_FORMAT
- " class_capacity " SIZE_FORMAT " non_class_capacity " SIZE_FORMAT,
- allocated_capacity_bytes(), class_capacity + non_class_capacity,
- class_capacity, non_class_capacity));
-
- return class_capacity + non_class_capacity;
+ static size_t reserved_bytes(Metaspace::MetadataType mdtype);
+ static size_t reserved_bytes() {
+ return reserved_bytes(Metaspace::ClassType) +
+ reserved_bytes(Metaspace::NonClassType);
}
- // Total space reserved in all Metaspaces
- static size_t reserved_in_bytes() {
- return reserved_in_bytes(Metaspace::ClassType) +
- reserved_in_bytes(Metaspace::NonClassType);
+ static size_t committed_bytes(Metaspace::MetadataType mdtype);
+ static size_t committed_bytes() {
+ return committed_bytes(Metaspace::ClassType) +
+ committed_bytes(Metaspace::NonClassType);
}
- static size_t min_chunk_size();
+ static size_t min_chunk_size_words();
+ static size_t min_chunk_size_bytes() {
+ return min_chunk_size_words() * BytesPerWord;
+ }
// Print change in used metadata.
static void print_metaspace_change(size_t prev_metadata_used);
--- a/hotspot/src/share/vm/memory/metaspaceCounters.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspaceCounters.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -65,26 +65,25 @@
MetaspacePerfCounters* MetaspaceCounters::_perf_counters = NULL;
-size_t MetaspaceCounters::calculate_capacity() {
- // The total capacity is the sum of
- // 1) capacity of Metachunks in use by all Metaspaces
- // 2) unused space at the end of each Metachunk
- // 3) space in the freelist
- size_t total_capacity = MetaspaceAux::allocated_capacity_bytes()
- + MetaspaceAux::free_bytes() + MetaspaceAux::free_chunks_total_in_bytes();
- return total_capacity;
+size_t MetaspaceCounters::used() {
+ return MetaspaceAux::allocated_used_bytes();
+}
+
+size_t MetaspaceCounters::capacity() {
+ return MetaspaceAux::committed_bytes();
+}
+
+size_t MetaspaceCounters::max_capacity() {
+ return MetaspaceAux::reserved_bytes();
}
void MetaspaceCounters::initialize_performance_counters() {
if (UsePerfData) {
assert(_perf_counters == NULL, "Should only be initialized once");
- size_t min_capacity = MetaspaceAux::min_chunk_size();
- size_t capacity = calculate_capacity();
- size_t max_capacity = MetaspaceAux::reserved_in_bytes();
- size_t used = MetaspaceAux::allocated_used_bytes();
-
- _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity, capacity, max_capacity, used);
+ size_t min_capacity = 0;
+ _perf_counters = new MetaspacePerfCounters("metaspace", min_capacity,
+ capacity(), max_capacity(), used());
}
}
@@ -92,31 +91,29 @@
if (UsePerfData) {
assert(_perf_counters != NULL, "Should be initialized");
- size_t capacity = calculate_capacity();
- size_t max_capacity = MetaspaceAux::reserved_in_bytes();
- size_t used = MetaspaceAux::allocated_used_bytes();
-
- _perf_counters->update(capacity, max_capacity, used);
+ _perf_counters->update(capacity(), max_capacity(), used());
}
}
MetaspacePerfCounters* CompressedClassSpaceCounters::_perf_counters = NULL;
-size_t CompressedClassSpaceCounters::calculate_capacity() {
- return MetaspaceAux::allocated_capacity_bytes(_class_type) +
- MetaspaceAux::free_bytes(_class_type) +
- MetaspaceAux::free_chunks_total_in_bytes(_class_type);
+size_t CompressedClassSpaceCounters::used() {
+ return MetaspaceAux::allocated_used_bytes(Metaspace::ClassType);
+}
+
+size_t CompressedClassSpaceCounters::capacity() {
+ return MetaspaceAux::committed_bytes(Metaspace::ClassType);
+}
+
+size_t CompressedClassSpaceCounters::max_capacity() {
+ return MetaspaceAux::reserved_bytes(Metaspace::ClassType);
}
void CompressedClassSpaceCounters::update_performance_counters() {
- if (UsePerfData && UseCompressedKlassPointers) {
+ if (UsePerfData && UseCompressedClassPointers) {
assert(_perf_counters != NULL, "Should be initialized");
- size_t capacity = calculate_capacity();
- size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
- size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
-
- _perf_counters->update(capacity, max_capacity, used);
+ _perf_counters->update(capacity(), max_capacity(), used());
}
}
@@ -125,13 +122,10 @@
assert(_perf_counters == NULL, "Should only be initialized once");
const char* ns = "compressedclassspace";
- if (UseCompressedKlassPointers) {
- size_t min_capacity = MetaspaceAux::min_chunk_size();
- size_t capacity = calculate_capacity();
- size_t max_capacity = MetaspaceAux::reserved_in_bytes(_class_type);
- size_t used = MetaspaceAux::allocated_used_bytes(_class_type);
-
- _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity, max_capacity, used);
+ if (UseCompressedClassPointers) {
+ size_t min_capacity = 0;
+ _perf_counters = new MetaspacePerfCounters(ns, min_capacity, capacity(),
+ max_capacity(), used());
} else {
_perf_counters = new MetaspacePerfCounters(ns, 0, 0, 0, 0);
}
--- a/hotspot/src/share/vm/memory/metaspaceCounters.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspaceCounters.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -25,13 +25,15 @@
#ifndef SHARE_VM_MEMORY_METASPACECOUNTERS_HPP
#define SHARE_VM_MEMORY_METASPACECOUNTERS_HPP
-#include "memory/metaspace.hpp"
+#include "memory/allocation.hpp"
class MetaspacePerfCounters;
class MetaspaceCounters: public AllStatic {
static MetaspacePerfCounters* _perf_counters;
- static size_t calculate_capacity();
+ static size_t used();
+ static size_t capacity();
+ static size_t max_capacity();
public:
static void initialize_performance_counters();
@@ -40,8 +42,9 @@
class CompressedClassSpaceCounters: public AllStatic {
static MetaspacePerfCounters* _perf_counters;
- static size_t calculate_capacity();
- static const Metaspace::MetadataType _class_type = Metaspace::ClassType;
+ static size_t used();
+ static size_t capacity();
+ static size_t max_capacity();
public:
static void initialize_performance_counters();
--- a/hotspot/src/share/vm/memory/metaspaceShared.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -103,9 +103,10 @@
if (k->oop_is_instance()) {
InstanceKlass* ik = InstanceKlass::cast(k);
for (int i = 0; i < ik->methods()->length(); i++) {
- ResourceMark rm;
Method* m = ik->methods()->at(i);
- (new Fingerprinter(m))->fingerprint();
+ Fingerprinter fp(m);
+ // The side effect of this call sets method's fingerprint field.
+ fp.fingerprint();
}
}
}
--- a/hotspot/src/share/vm/memory/referenceProcessor.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -367,7 +367,7 @@
next_d = java_lang_ref_Reference::discovered(obj);
if (TraceReferenceGC && PrintGCDetails) {
gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT,
- obj, next_d);
+ (void *)obj, (void *)next_d);
}
assert(java_lang_ref_Reference::next(obj) == NULL,
"Reference not active; should not be discovered");
@@ -392,7 +392,7 @@
next_d = java_lang_ref_Reference::discovered(obj);
if (TraceReferenceGC && PrintGCDetails) {
gclog_or_tty->print_cr(" obj " INTPTR_FORMAT "/next_d " INTPTR_FORMAT,
- obj, next_d);
+ (void *)obj, (void *)next_d);
}
assert(java_lang_ref_Reference::next(obj) == NULL,
"The reference should not be enqueued");
@@ -562,7 +562,7 @@
!policy->should_clear_reference(iter.obj(), _soft_ref_timestamp_clock)) {
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Dropping reference (" INTPTR_FORMAT ": %s" ") by policy",
- iter.obj(), iter.obj()->klass()->internal_name());
+ (void *)iter.obj(), iter.obj()->klass()->internal_name());
}
// Remove Reference object from list
iter.remove();
@@ -601,7 +601,7 @@
if (iter.is_referent_alive()) {
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Dropping strongly reachable reference (" INTPTR_FORMAT ": %s)",
- iter.obj(), iter.obj()->klass()->internal_name());
+ (void *)iter.obj(), iter.obj()->klass()->internal_name());
}
// The referent is reachable after all.
// Remove Reference object from list.
@@ -687,7 +687,7 @@
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Adding %sreference (" INTPTR_FORMAT ": %s) as pending",
clear_referent ? "cleared " : "",
- iter.obj(), iter.obj()->klass()->internal_name());
+ (void *)iter.obj(), iter.obj()->klass()->internal_name());
}
assert(iter.obj()->is_oop(UseConcMarkSweepGC), "Adding a bad reference");
iter.next();
@@ -1003,7 +1003,7 @@
gclog_or_tty->print_cr("clean_up_discovered_list: Dropping Reference: "
INTPTR_FORMAT " with next field: " INTPTR_FORMAT
" and referent: " INTPTR_FORMAT,
- iter.obj(), next, iter.referent());
+ (void *)iter.obj(), (void *)next, (void *)iter.referent());
}
)
// Remove Reference object from list
@@ -1103,14 +1103,14 @@
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Discovered reference (mt) (" INTPTR_FORMAT ": %s)",
- obj, obj->klass()->internal_name());
+ (void *)obj, obj->klass()->internal_name());
}
} else {
// If retest was non NULL, another thread beat us to it:
// The reference has already been discovered...
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
- obj, obj->klass()->internal_name());
+ (void *)obj, obj->klass()->internal_name());
}
}
}
@@ -1125,7 +1125,7 @@
assert(da ? referent->is_oop() : referent->is_oop_or_null(),
err_msg("Bad referent " INTPTR_FORMAT " found in Reference "
INTPTR_FORMAT " during %satomic discovery ",
- (intptr_t)referent, (intptr_t)obj, da ? "" : "non-"));
+ (void *)referent, (void *)obj, da ? "" : "non-"));
}
#endif
@@ -1205,7 +1205,7 @@
// The reference has already been discovered...
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Already discovered reference (" INTPTR_FORMAT ": %s)",
- obj, obj->klass()->internal_name());
+ (void *)obj, obj->klass()->internal_name());
}
if (RefDiscoveryPolicy == ReferentBasedDiscovery) {
// assumes that an object is not processed twice;
@@ -1273,7 +1273,7 @@
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Discovered reference (" INTPTR_FORMAT ": %s)",
- obj, obj->klass()->internal_name());
+ (void *)obj, obj->klass()->internal_name());
}
}
assert(obj->is_oop(), "Discovered a bad reference");
@@ -1372,7 +1372,7 @@
// active; we need to trace and mark its cohort.
if (TraceReferenceGC) {
gclog_or_tty->print_cr("Precleaning Reference (" INTPTR_FORMAT ": %s)",
- iter.obj(), iter.obj()->klass()->internal_name());
+ (void *)iter.obj(), iter.obj()->klass()->internal_name());
}
// Remove Reference object from list
iter.remove();
--- a/hotspot/src/share/vm/memory/universe.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/universe.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -602,7 +602,7 @@
}
}
-static intptr_t non_oop_bits = 0;
+intptr_t Universe::_non_oop_bits = 0;
void* Universe::non_oop_word() {
// Neither the high bits nor the low bits of this value is allowed
@@ -616,11 +616,11 @@
// Using the OS-supplied non-memory-address word (usually 0 or -1)
// will take care of the high bits, however many there are.
- if (non_oop_bits == 0) {
- non_oop_bits = (intptr_t)os::non_memory_address_word() | 1;
+ if (_non_oop_bits == 0) {
+ _non_oop_bits = (intptr_t)os::non_memory_address_word() | 1;
}
- return (void*)non_oop_bits;
+ return (void*)_non_oop_bits;
}
jint universe_init() {
@@ -872,13 +872,16 @@
// Reserve the Java heap, which is now the same for all GCs.
ReservedSpace Universe::reserve_heap(size_t heap_size, size_t alignment) {
+ assert(alignment <= Arguments::conservative_max_heap_alignment(),
+ err_msg("actual alignment "SIZE_FORMAT" must be within maximum heap alignment "SIZE_FORMAT,
+ alignment, Arguments::conservative_max_heap_alignment()));
size_t total_reserved = align_size_up(heap_size, alignment);
assert(!UseCompressedOops || (total_reserved <= (OopEncodingHeapMax - os::vm_page_size())),
"heap size is too big for compressed oops");
bool use_large_pages = UseLargePages && is_size_aligned(alignment, os::large_page_size());
assert(!UseLargePages
- || UseParallelOldGC
+ || UseParallelGC
|| use_large_pages, "Wrong alignment to use large pages");
char* addr = Universe::preferred_heap_base(total_reserved, alignment, Universe::UnscaledNarrowOop);
@@ -1028,7 +1031,7 @@
msg = java_lang_String::create_from_str("Metadata space", CHECK_false);
java_lang_Throwable::set_message(Universe::_out_of_memory_error_metaspace, msg());
- msg = java_lang_String::create_from_str("Class Metadata space", CHECK_false);
+ msg = java_lang_String::create_from_str("Compressed class space", CHECK_false);
java_lang_Throwable::set_message(Universe::_out_of_memory_error_class_metaspace, msg());
msg = java_lang_String::create_from_str("Requested array size exceeds VM limit", CHECK_false);
--- a/hotspot/src/share/vm/memory/universe.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/memory/universe.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -179,9 +179,11 @@
// The particular choice of collected heap.
static CollectedHeap* _collectedHeap;
+ static intptr_t _non_oop_bits;
+
// For UseCompressedOops.
static struct NarrowPtrStruct _narrow_oop;
- // For UseCompressedKlassPointers.
+ // For UseCompressedClassPointers.
static struct NarrowPtrStruct _narrow_klass;
static address _narrow_ptrs_base;
@@ -229,7 +231,7 @@
_narrow_oop._base = base;
}
static void set_narrow_klass_base(address base) {
- assert(UseCompressedKlassPointers, "no compressed klass ptrs?");
+ assert(UseCompressedClassPointers, "no compressed klass ptrs?");
_narrow_klass._base = base;
}
static void set_narrow_oop_use_implicit_null_checks(bool use) {
@@ -353,7 +355,7 @@
static int narrow_oop_shift() { return _narrow_oop._shift; }
static bool narrow_oop_use_implicit_null_checks() { return _narrow_oop._use_implicit_null_checks; }
- // For UseCompressedKlassPointers
+ // For UseCompressedClassPointers
static address narrow_klass_base() { return _narrow_klass._base; }
static bool is_narrow_klass_base(void* addr) { return (narrow_klass_base() == (address)addr); }
static int narrow_klass_shift() { return _narrow_klass._shift; }
--- a/hotspot/src/share/vm/oops/arrayOop.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/arrayOop.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -65,7 +65,7 @@
// declared nonstatic fields in arrayOopDesc if not compressed, otherwise
// it occupies the second half of the _klass field in oopDesc.
static int length_offset_in_bytes() {
- return UseCompressedKlassPointers ? klass_gap_offset_in_bytes() :
+ return UseCompressedClassPointers ? klass_gap_offset_in_bytes() :
sizeof(arrayOopDesc);
}
--- a/hotspot/src/share/vm/oops/constantPool.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -108,16 +108,16 @@
void ConstantPool::initialize_resolved_references(ClassLoaderData* loader_data,
intStack reference_map,
int constant_pool_map_length,
- TRAPS) {
+ TRAPS) {
// Initialized the resolved object cache.
int map_length = reference_map.length();
if (map_length > 0) {
// Only need mapping back to constant pool entries. The map isn't used for
- // invokedynamic resolved_reference entries. The constant pool cache index
- // has the mapping back to both the constant pool and to the resolved
- // reference index.
+ // invokedynamic resolved_reference entries. For invokedynamic entries,
+ // the constant pool cache index has the mapping back to both the constant
+ // pool and to the resolved reference index.
if (constant_pool_map_length > 0) {
- Array<u2>* om = MetadataFactory::new_array<u2>(loader_data, map_length, CHECK);
+ Array<u2>* om = MetadataFactory::new_array<u2>(loader_data, constant_pool_map_length, CHECK);
for (int i = 0; i < constant_pool_map_length; i++) {
int x = reference_map.at(i);
@@ -182,16 +182,9 @@
int ConstantPool::cp_to_object_index(int cp_index) {
// this is harder don't do this so much.
- for (int i = 0; i< reference_map()->length(); i++) {
- if (reference_map()->at(i) == cp_index) return i;
- // Zero entry is divider between constant pool indices for strings,
- // method handles and method types. After that the index is a constant
- // pool cache index for invokedynamic. Stop when zero (which can never
- // be a constant pool index)
- if (reference_map()->at(i) == 0) break;
- }
- // We might not find the index.
- return _no_index_sentinel;
+ int i = reference_map()->find(cp_index);
+ // We might not find the index for jsr292 call.
+ return (i < 0) ? _no_index_sentinel : i;
}
Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS) {
@@ -396,32 +389,6 @@
}
-// This is an interface for the compiler that allows accessing non-resolved entries
-// in the constant pool - but still performs the validations tests. Must be used
-// in a pre-parse of the compiler - to determine what it can do and not do.
-// Note: We cannot update the ConstantPool from the vm_thread.
-Klass* ConstantPool::klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int index, TRAPS) {
- int which = this_oop->klass_ref_index_at(index);
- CPSlot entry = this_oop->slot_at(which);
- if (entry.is_resolved()) {
- assert(entry.get_klass()->is_klass(), "must be");
- return entry.get_klass();
- } else {
- assert(entry.is_unresolved(), "must be either symbol or klass");
- Symbol* name = entry.get_symbol();
- oop loader = this_oop->pool_holder()->class_loader();
- oop protection_domain = this_oop->pool_holder()->protection_domain();
- Handle h_loader(THREAD, loader);
- Handle h_prot (THREAD, protection_domain);
- KlassHandle k(THREAD, SystemDictionary::find(name, h_loader, h_prot, THREAD));
-
- // Do access check for klasses
- if( k.not_null() ) verify_constant_pool_resolve(this_oop, k, CHECK_NULL);
- return k();
- }
-}
-
-
Method* ConstantPool::method_at_if_loaded(constantPoolHandle cpool,
int which) {
if (cpool->cache() == NULL) return NULL; // nothing to load yet
@@ -866,8 +833,7 @@
// If the string has already been interned, this entry will be non-null
oop str = this_oop->resolved_references()->obj_at(obj_index);
if (str != NULL) return str;
-
- Symbol* sym = this_oop->unresolved_string_at(which);
+ Symbol* sym = this_oop->unresolved_string_at(which);
str = StringTable::intern(sym, CHECK_(NULL));
this_oop->string_at_put(which, obj_index, str);
assert(java_lang_String::is_instance(str), "must be string");
@@ -1645,9 +1611,11 @@
case JVM_CONSTANT_UnresolvedClassInError:
case JVM_CONSTANT_StringIndex:
case JVM_CONSTANT_MethodType:
+ case JVM_CONSTANT_MethodTypeInError:
return 3;
case JVM_CONSTANT_MethodHandle:
+ case JVM_CONSTANT_MethodHandleInError:
return 4; //tag, ref_kind, ref_index
case JVM_CONSTANT_Integer:
@@ -1828,8 +1796,8 @@
case JVM_CONSTANT_MethodHandle:
case JVM_CONSTANT_MethodHandleInError: {
*bytes = JVM_CONSTANT_MethodHandle;
- int kind = method_handle_ref_kind_at(idx);
- idx1 = method_handle_index_at(idx);
+ int kind = method_handle_ref_kind_at_error_ok(idx);
+ idx1 = method_handle_index_at_error_ok(idx);
*(bytes+1) = (unsigned char) kind;
Bytes::put_Java_u2((address) (bytes+2), idx1);
DBG(printf("JVM_CONSTANT_MethodHandle: %d %hd", kind, idx1));
@@ -1838,7 +1806,7 @@
case JVM_CONSTANT_MethodType:
case JVM_CONSTANT_MethodTypeInError: {
*bytes = JVM_CONSTANT_MethodType;
- idx1 = method_type_index_at(idx);
+ idx1 = method_type_index_at_error_ok(idx);
Bytes::put_Java_u2((address) (bytes+1), idx1);
DBG(printf("JVM_CONSTANT_MethodType: %hd", idx1));
break;
@@ -1950,7 +1918,7 @@
st->print_cr(" - holder: " INTPTR_FORMAT, pool_holder());
}
st->print_cr(" - cache: " INTPTR_FORMAT, cache());
- st->print_cr(" - resolved_references: " INTPTR_FORMAT, resolved_references());
+ st->print_cr(" - resolved_references: " INTPTR_FORMAT, (void *)resolved_references());
st->print_cr(" - reference_map: " INTPTR_FORMAT, reference_map());
for (int index = 1; index < length(); index++) { // Index 0 is unused
@@ -2026,12 +1994,12 @@
break;
case JVM_CONSTANT_MethodHandle :
case JVM_CONSTANT_MethodHandleInError :
- st->print("ref_kind=%d", method_handle_ref_kind_at(index));
- st->print(" ref_index=%d", method_handle_index_at(index));
+ st->print("ref_kind=%d", method_handle_ref_kind_at_error_ok(index));
+ st->print(" ref_index=%d", method_handle_index_at_error_ok(index));
break;
case JVM_CONSTANT_MethodType :
case JVM_CONSTANT_MethodTypeInError :
- st->print("signature_index=%d", method_type_index_at(index));
+ st->print("signature_index=%d", method_type_index_at_error_ok(index));
break;
case JVM_CONSTANT_InvokeDynamic :
{
--- a/hotspot/src/share/vm/oops/constantPool.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -231,7 +231,6 @@
static int cache_offset_in_bytes() { return offset_of(ConstantPool, _cache); }
static int pool_holder_offset_in_bytes() { return offset_of(ConstantPool, _pool_holder); }
static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
- static int reference_map_offset_in_bytes() { return offset_of(ConstantPool, _reference_map); }
// Storing constants
@@ -475,18 +474,42 @@
return *int_at_addr(which);
}
+ private:
+ int method_handle_ref_kind_at(int which, bool error_ok) {
+ assert(tag_at(which).is_method_handle() ||
+ (error_ok && tag_at(which).is_method_handle_in_error()), "Corrupted constant pool");
+ return extract_low_short_from_int(*int_at_addr(which)); // mask out unwanted ref_index bits
+ }
+ int method_handle_index_at(int which, bool error_ok) {
+ assert(tag_at(which).is_method_handle() ||
+ (error_ok && tag_at(which).is_method_handle_in_error()), "Corrupted constant pool");
+ return extract_high_short_from_int(*int_at_addr(which)); // shift out unwanted ref_kind bits
+ }
+ int method_type_index_at(int which, bool error_ok) {
+ assert(tag_at(which).is_method_type() ||
+ (error_ok && tag_at(which).is_method_type_in_error()), "Corrupted constant pool");
+ return *int_at_addr(which);
+ }
+ public:
int method_handle_ref_kind_at(int which) {
- assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
- return extract_low_short_from_int(*int_at_addr(which)); // mask out unwanted ref_index bits
+ return method_handle_ref_kind_at(which, false);
+ }
+ int method_handle_ref_kind_at_error_ok(int which) {
+ return method_handle_ref_kind_at(which, true);
}
int method_handle_index_at(int which) {
- assert(tag_at(which).is_method_handle(), "Corrupted constant pool");
- return extract_high_short_from_int(*int_at_addr(which)); // shift out unwanted ref_kind bits
+ return method_handle_index_at(which, false);
+ }
+ int method_handle_index_at_error_ok(int which) {
+ return method_handle_index_at(which, true);
}
int method_type_index_at(int which) {
- assert(tag_at(which).is_method_type(), "Corrupted constant pool");
- return *int_at_addr(which);
+ return method_type_index_at(which, false);
}
+ int method_type_index_at_error_ok(int which) {
+ return method_type_index_at(which, true);
+ }
+
// Derived queries:
Symbol* method_handle_name_ref_at(int which) {
int member = method_handle_index_at(which);
@@ -730,8 +753,6 @@
static oop method_type_at_if_loaded (constantPoolHandle this_oop, int which);
static Klass* klass_at_if_loaded (constantPoolHandle this_oop, int which);
static Klass* klass_ref_at_if_loaded (constantPoolHandle this_oop, int which);
- // Same as above - but does LinkResolving.
- static Klass* klass_ref_at_if_loaded_check(constantPoolHandle this_oop, int which, TRAPS);
// Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
// future by other Java code. These take constant pool indices rather than
--- a/hotspot/src/share/vm/oops/cpCache.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/cpCache.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -140,9 +140,10 @@
err_msg("size must not change: parameter_size=%d, value=%d", parameter_size(), value));
}
-void ConstantPoolCacheEntry::set_method(Bytecodes::Code invoke_code,
- methodHandle method,
- int vtable_index) {
+void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_code,
+ methodHandle method,
+ int vtable_index) {
+ bool is_vtable_call = (vtable_index >= 0); // FIXME: split this method on this boolean
assert(method->interpreter_entry() != NULL, "should have been set at this point");
assert(!method->is_obsolete(), "attempt to write obsolete method to cpCache");
@@ -160,7 +161,8 @@
// ...and fall through as if we were handling invokevirtual:
case Bytecodes::_invokevirtual:
{
- if (method->can_be_statically_bound()) {
+ if (!is_vtable_call) {
+ assert(method->can_be_statically_bound(), "");
// set_f2_as_vfinal_method checks if is_vfinal flag is true.
set_method_flags(as_TosState(method->result_type()),
( 1 << is_vfinal_shift) |
@@ -169,6 +171,7 @@
method()->size_of_parameters());
set_f2_as_vfinal_method(method());
} else {
+ assert(!method->can_be_statically_bound(), "");
assert(vtable_index >= 0, "valid index");
assert(!method->is_final_method(), "sanity");
set_method_flags(as_TosState(method->result_type()),
@@ -182,6 +185,7 @@
case Bytecodes::_invokespecial:
case Bytecodes::_invokestatic:
+ assert(!is_vtable_call, "");
// Note: Read and preserve the value of the is_vfinal flag on any
// invokevirtual bytecode shared with this constant pool cache entry.
// It is cheap and safe to consult is_vfinal() at all times.
@@ -232,8 +236,22 @@
NOT_PRODUCT(verify(tty));
}
+void ConstantPoolCacheEntry::set_direct_call(Bytecodes::Code invoke_code, methodHandle method) {
+ int index = Method::nonvirtual_vtable_index;
+ // index < 0; FIXME: inline and customize set_direct_or_vtable_call
+ set_direct_or_vtable_call(invoke_code, method, index);
+}
-void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index) {
+void ConstantPoolCacheEntry::set_vtable_call(Bytecodes::Code invoke_code, methodHandle method, int index) {
+ // either the method is a miranda or its holder should accept the given index
+ assert(method->method_holder()->is_interface() || method->method_holder()->verify_vtable_index(index), "");
+ // index >= 0; FIXME: inline and customize set_direct_or_vtable_call
+ set_direct_or_vtable_call(invoke_code, method, index);
+}
+
+void ConstantPoolCacheEntry::set_itable_call(Bytecodes::Code invoke_code, methodHandle method, int index) {
+ assert(method->method_holder()->verify_itable_index(index), "");
+ assert(invoke_code == Bytecodes::_invokeinterface, "");
InstanceKlass* interf = method->method_holder();
assert(interf->is_interface(), "must be an interface");
assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here");
@@ -288,8 +306,8 @@
if (TraceInvokeDynamic) {
tty->print_cr("set_method_handle bc=%d appendix="PTR_FORMAT"%s method_type="PTR_FORMAT"%s method="PTR_FORMAT" ",
invoke_code,
- (intptr_t)appendix(), (has_appendix ? "" : " (unused)"),
- (intptr_t)method_type(), (has_method_type ? "" : " (unused)"),
+ (void *)appendix(), (has_appendix ? "" : " (unused)"),
+ (void *)method_type(), (has_method_type ? "" : " (unused)"),
(intptr_t)adapter());
adapter->print();
if (has_appendix) appendix()->print();
--- a/hotspot/src/share/vm/oops/cpCache.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/cpCache.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -219,15 +219,29 @@
Klass* root_klass // needed by the GC to dirty the klass
);
- void set_method( // sets entry to resolved method entry
+ private:
+ void set_direct_or_vtable_call(
Bytecodes::Code invoke_code, // the bytecode used for invoking the method
methodHandle method, // the method/prototype if any (NULL, otherwise)
int vtable_index // the vtable index if any, else negative
);
- void set_interface_call(
- methodHandle method, // Resolved method
- int index // Method index into interface
+ public:
+ void set_direct_call( // sets entry to exact concrete method entry
+ Bytecodes::Code invoke_code, // the bytecode used for invoking the method
+ methodHandle method // the method to call
+ );
+
+ void set_vtable_call( // sets entry to vtable index
+ Bytecodes::Code invoke_code, // the bytecode used for invoking the method
+ methodHandle method, // resolved method which declares the vtable index
+ int vtable_index // the vtable index
+ );
+
+ void set_itable_call(
+ Bytecodes::Code invoke_code, // the bytecode used; must be invokeinterface
+ methodHandle method, // the resolved interface method
+ int itable_index // index into itable for the method
);
void set_method_handle(
--- a/hotspot/src/share/vm/oops/fieldStreams.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/fieldStreams.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
#include "oops/instanceKlass.hpp"
#include "oops/fieldInfo.hpp"
+#include "runtime/fieldDescriptor.hpp"
// The is the base class for iteration over the fields array
// describing the declared fields in the class. Several subclasses
@@ -43,8 +44,10 @@
int _index;
int _limit;
int _generic_signature_slot;
+ fieldDescriptor _fd_buf;
FieldInfo* field() const { return FieldInfo::from_field_array(_fields, _index); }
+ InstanceKlass* field_holder() const { return _constants->pool_holder(); }
int init_generic_signature_start_slot() {
int length = _fields->length();
@@ -102,6 +105,7 @@
_index = 0;
_limit = klass->java_fields_count();
init_generic_signature_start_slot();
+ assert(klass == field_holder(), "");
}
FieldStreamBase(instanceKlassHandle klass) {
_fields = klass->fields();
@@ -109,6 +113,7 @@
_index = 0;
_limit = klass->java_fields_count();
init_generic_signature_start_slot();
+ assert(klass == field_holder(), "");
}
// accessors
@@ -180,6 +185,12 @@
return field()->contended_group();
}
+ // bridge to a heavier API:
+ fieldDescriptor& field_descriptor() const {
+ fieldDescriptor& field = const_cast<fieldDescriptor&>(_fd_buf);
+ field.reinitialize(field_holder(), _index);
+ return field;
+ }
};
// Iterate over only the internal fields
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -106,7 +106,7 @@
len = name->utf8_length(); \
} \
HS_DTRACE_PROBE4(hotspot, class__initialization__##type, \
- data, len, (clss)->class_loader(), thread_type); \
+ data, len, SOLARIS_ONLY((void *))(clss)->class_loader(), thread_type); \
}
#define DTRACE_CLASSINIT_PROBE_WAIT(type, clss, thread_type, wait) \
@@ -119,7 +119,7 @@
len = name->utf8_length(); \
} \
HS_DTRACE_PROBE5(hotspot, class__initialization__##type, \
- data, len, (clss)->class_loader(), thread_type, wait); \
+ data, len, SOLARIS_ONLY((void *))(clss)->class_loader(), thread_type, wait); \
}
#else /* USDT2 */
@@ -286,7 +286,6 @@
init_previous_versions();
set_generic_signature_index(0);
release_set_methods_jmethod_ids(NULL);
- release_set_methods_cached_itable_indices(NULL);
set_annotations(NULL);
set_jvmti_cached_class_field_map(NULL);
set_initial_method_idnum(0);
@@ -1149,7 +1148,7 @@
Symbol* f_name = fs.name();
Symbol* f_sig = fs.signature();
if (f_name == name && f_sig == sig) {
- fd->initialize(const_cast<InstanceKlass*>(this), fs.index());
+ fd->reinitialize(const_cast<InstanceKlass*>(this), fs.index());
return true;
}
}
@@ -1218,7 +1217,7 @@
bool InstanceKlass::find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const {
for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
if (fs.offset() == offset) {
- fd->initialize(const_cast<InstanceKlass*>(this), fs.index());
+ fd->reinitialize(const_cast<InstanceKlass*>(this), fs.index());
if (fd->is_static() == is_static) return true;
}
}
@@ -1251,8 +1250,7 @@
void InstanceKlass::do_local_static_fields(FieldClosure* cl) {
for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
if (fs.access_flags().is_static()) {
- fieldDescriptor fd;
- fd.initialize(this, fs.index());
+ fieldDescriptor& fd = fs.field_descriptor();
cl->do_field(&fd);
}
}
@@ -1268,8 +1266,7 @@
void InstanceKlass::do_local_static_fields_impl(instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS) {
for (JavaFieldStream fs(this_oop()); !fs.done(); fs.next()) {
if (fs.access_flags().is_static()) {
- fieldDescriptor fd;
- fd.initialize(this_oop(), fs.index());
+ fieldDescriptor& fd = fs.field_descriptor();
f(&fd, CHECK);
}
}
@@ -1291,7 +1288,7 @@
int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1), mtClass);
int j = 0;
for (int i = 0; i < length; i += 1) {
- fd.initialize(this, i);
+ fd.reinitialize(this, i);
if (!fd.is_static()) {
fields_sorted[j + 0] = fd.offset();
fields_sorted[j + 1] = i;
@@ -1303,7 +1300,7 @@
// _sort_Fn is defined in growableArray.hpp.
qsort(fields_sorted, length/2, 2*sizeof(int), (_sort_Fn)compare_fields_by_offset);
for (int i = 0; i < length; i += 2) {
- fd.initialize(this, fields_sorted[i + 1]);
+ fd.reinitialize(this, fields_sorted[i + 1]);
assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields");
cl->do_field(&fd);
}
@@ -1422,6 +1419,8 @@
}
// lookup a method in all the interfaces that this class implements
+// Do NOT return private or static methods, new in JDK8 which are not externally visible
+// They should only be found in the initial InterfaceMethodRef
Method* InstanceKlass::lookup_method_in_all_interfaces(Symbol* name,
Symbol* signature) const {
Array<Klass*>* all_ifs = transitive_interfaces();
@@ -1430,7 +1429,7 @@
for (int i = 0; i < num_ifs; i++) {
ik = InstanceKlass::cast(all_ifs->at(i));
Method* m = ik->lookup_method(name, signature);
- if (m != NULL) {
+ if (m != NULL && m->is_public() && !m->is_static()) {
return m;
}
}
@@ -1686,87 +1685,6 @@
}
-// Cache an itable index
-void InstanceKlass::set_cached_itable_index(size_t idnum, int index) {
- int* indices = methods_cached_itable_indices_acquire();
- int* to_dealloc_indices = NULL;
-
- // We use a double-check locking idiom here because this cache is
- // performance sensitive. In the normal system, this cache only
- // transitions from NULL to non-NULL which is safe because we use
- // release_set_methods_cached_itable_indices() to advertise the
- // new cache. A partially constructed cache should never be seen
- // by a racing thread. Cache reads and writes proceed without a
- // lock, but creation of the cache itself requires no leaks so a
- // lock is generally acquired in that case.
- //
- // If the RedefineClasses() API has been used, then this cache can
- // grow and we'll have transitions from non-NULL to bigger non-NULL.
- // Cache creation requires no leaks and we require safety between all
- // cache accesses and freeing of the old cache so a lock is generally
- // acquired when the RedefineClasses() API has been used.
-
- if (indices == NULL || idnum_can_increment()) {
- // we need a cache or the cache can grow
- MutexLocker ml(JNICachedItableIndex_lock);
- // reacquire the cache to see if another thread already did the work
- indices = methods_cached_itable_indices_acquire();
- size_t length = 0;
- // cache size is stored in element[0], other elements offset by one
- if (indices == NULL || (length = (size_t)indices[0]) <= idnum) {
- size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count());
- int* new_indices = NEW_C_HEAP_ARRAY(int, size+1, mtClass);
- new_indices[0] = (int)size;
- // copy any existing entries
- size_t i;
- for (i = 0; i < length; i++) {
- new_indices[i+1] = indices[i+1];
- }
- // Set all the rest to -1
- for (i = length; i < size; i++) {
- new_indices[i+1] = -1;
- }
- if (indices != NULL) {
- // We have an old cache to delete so save it for after we
- // drop the lock.
- to_dealloc_indices = indices;
- }
- release_set_methods_cached_itable_indices(indices = new_indices);
- }
-
- if (idnum_can_increment()) {
- // this cache can grow so we have to write to it safely
- indices[idnum+1] = index;
- }
- } else {
- CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
- }
-
- if (!idnum_can_increment()) {
- // The cache cannot grow and this JNI itable index value does not
- // have to be unique like a jmethodID. If there is a race to set it,
- // it doesn't matter.
- indices[idnum+1] = index;
- }
-
- if (to_dealloc_indices != NULL) {
- // we allocated a new cache so free the old one
- FreeHeap(to_dealloc_indices);
- }
-}
-
-
-// Retrieve a cached itable index
-int InstanceKlass::cached_itable_index(size_t idnum) {
- int* indices = methods_cached_itable_indices_acquire();
- if (indices != NULL && ((size_t)indices[0]) > idnum) {
- // indices exist and are long enough, retrieve possible cached
- return indices[idnum+1];
- }
- return -1;
-}
-
-
//
// Walk the list of dependent nmethods searching for nmethods which
// are dependent on the changes that were passed in and mark them for
@@ -2326,12 +2244,6 @@
}
}
- int* indices = methods_cached_itable_indices_acquire();
- if (indices != (int*)NULL) {
- release_set_methods_cached_itable_indices(NULL);
- FreeHeap(indices);
- }
-
// release dependencies
nmethodBucket* b = _dependencies;
_dependencies = NULL;
@@ -2393,7 +2305,7 @@
}
address InstanceKlass::static_field_addr(int offset) {
- return (address)(offset + InstanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror());
+ return (address)(offset + InstanceMirrorKlass::offset_of_static_fields() + cast_from_oop<intptr_t>(java_mirror()));
}
@@ -2782,6 +2694,18 @@
"allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error"
};
+static void print_vtable(intptr_t* start, int len, outputStream* st) {
+ for (int i = 0; i < len; i++) {
+ intptr_t e = start[i];
+ st->print("%d : " INTPTR_FORMAT, i, e);
+ if (e != 0 && ((Metadata*)e)->is_metaspace_object()) {
+ st->print(" ");
+ ((Metadata*)e)->print_value_on(st);
+ }
+ st->cr();
+ }
+}
+
void InstanceKlass::print_on(outputStream* st) const {
assert(is_klass(), "must be klass");
Klass::print_on(st);
@@ -2816,7 +2740,7 @@
st->print(BULLET"arrays: "); array_klasses()->print_value_on_maybe_null(st); st->cr();
st->print(BULLET"methods: "); methods()->print_value_on(st); st->cr();
- if (Verbose) {
+ if (Verbose || WizardMode) {
Array<Method*>* method_array = methods();
for(int i = 0; i < method_array->length(); i++) {
st->print("%d : ", i); method_array->at(i)->print_value(); st->cr();
@@ -2847,24 +2771,17 @@
st->print(BULLET"field annotations: "); fields_annotations()->print_value_on(st); st->cr();
st->print(BULLET"field type annotations: "); fields_type_annotations()->print_value_on(st); st->cr();
{
- ResourceMark rm;
- // PreviousVersionInfo objects returned via PreviousVersionWalker
- // contain a GrowableArray of handles. We have to clean up the
- // GrowableArray _after_ the PreviousVersionWalker destructor
- // has destroyed the handles.
- {
- bool have_pv = false;
- PreviousVersionWalker pvw((InstanceKlass*)this);
- for (PreviousVersionInfo * pv_info = pvw.next_previous_version();
- pv_info != NULL; pv_info = pvw.next_previous_version()) {
- if (!have_pv)
- st->print(BULLET"previous version: ");
- have_pv = true;
- pv_info->prev_constant_pool_handle()()->print_value_on(st);
- }
- if (have_pv) st->cr();
- } // pvw is cleaned up
- } // rm is cleaned up
+ bool have_pv = false;
+ PreviousVersionWalker pvw(Thread::current(), (InstanceKlass*)this);
+ for (PreviousVersionNode * pv_node = pvw.next_previous_version();
+ pv_node != NULL; pv_node = pvw.next_previous_version()) {
+ if (!have_pv)
+ st->print(BULLET"previous version: ");
+ have_pv = true;
+ pv_node->prev_constant_pool()->print_value_on(st);
+ }
+ if (have_pv) st->cr();
+ } // pvw is cleaned up
if (generic_signature() != NULL) {
st->print(BULLET"generic signature: ");
@@ -2874,7 +2791,9 @@
st->print(BULLET"inner classes: "); inner_classes()->print_value_on(st); st->cr();
st->print(BULLET"java mirror: "); java_mirror()->print_value_on(st); st->cr();
st->print(BULLET"vtable length %d (start addr: " INTPTR_FORMAT ")", vtable_length(), start_of_vtable()); st->cr();
+ if (vtable_length() > 0 && (Verbose || WizardMode)) print_vtable(start_of_vtable(), vtable_length(), st);
st->print(BULLET"itable length %d (start addr: " INTPTR_FORMAT ")", itable_length(), start_of_itable()); st->cr();
+ if (itable_length() > 0 && (Verbose || WizardMode)) print_vtable(start_of_itable(), itable_length(), st);
st->print_cr(BULLET"---- static fields (%d words):", static_field_size());
FieldPrinter print_static_field(st);
((InstanceKlass*)this)->do_local_static_fields(&print_static_field);
@@ -2896,6 +2815,7 @@
void InstanceKlass::print_value_on(outputStream* st) const {
assert(is_klass(), "must be klass");
+ if (Verbose || WizardMode) access_flags().print_on(st);
name()->print_value_on(st);
}
@@ -3392,34 +3312,34 @@
Array<Method*>* old_methods = ikh->methods();
if (cp_ref->on_stack()) {
- PreviousVersionNode * pv_node = NULL;
- if (emcp_method_count == 0) {
+ PreviousVersionNode * pv_node = NULL;
+ if (emcp_method_count == 0) {
// non-shared ConstantPool gets a reference
- pv_node = new PreviousVersionNode(cp_ref, !cp_ref->is_shared(), NULL);
- RC_TRACE(0x00000400,
- ("add: all methods are obsolete; flushing any EMCP refs"));
- } else {
- int local_count = 0;
+ pv_node = new PreviousVersionNode(cp_ref, NULL);
+ RC_TRACE(0x00000400,
+ ("add: all methods are obsolete; flushing any EMCP refs"));
+ } else {
+ int local_count = 0;
GrowableArray<Method*>* method_refs = new (ResourceObj::C_HEAP, mtClass)
- GrowableArray<Method*>(emcp_method_count, true);
- for (int i = 0; i < old_methods->length(); i++) {
- if (emcp_methods->at(i)) {
- // this old method is EMCP. Save it only if it's on the stack
- Method* old_method = old_methods->at(i);
- if (old_method->on_stack()) {
- method_refs->append(old_method);
+ GrowableArray<Method*>(emcp_method_count, true);
+ for (int i = 0; i < old_methods->length(); i++) {
+ if (emcp_methods->at(i)) {
+ // this old method is EMCP. Save it only if it's on the stack
+ Method* old_method = old_methods->at(i);
+ if (old_method->on_stack()) {
+ method_refs->append(old_method);
+ }
+ if (++local_count >= emcp_method_count) {
+ // no more EMCP methods so bail out now
+ break;
}
- if (++local_count >= emcp_method_count) {
- // no more EMCP methods so bail out now
- break;
}
}
- }
// non-shared ConstantPool gets a reference
- pv_node = new PreviousVersionNode(cp_ref, !cp_ref->is_shared(), method_refs);
+ pv_node = new PreviousVersionNode(cp_ref, method_refs);
}
// append new previous version.
- _previous_versions->append(pv_node);
+ _previous_versions->append(pv_node);
}
// Since the caller is the VMThread and we are at a safepoint, this
@@ -3520,6 +3440,8 @@
return m;
}
}
+ // None found, return null for the caller to handle.
+ return NULL;
}
return m;
}
@@ -3536,10 +3458,9 @@
// Construct a PreviousVersionNode entry for the array hung off
// the InstanceKlass.
PreviousVersionNode::PreviousVersionNode(ConstantPool* prev_constant_pool,
- bool prev_cp_is_weak, GrowableArray<Method*>* prev_EMCP_methods) {
+ GrowableArray<Method*>* prev_EMCP_methods) {
_prev_constant_pool = prev_constant_pool;
- _prev_cp_is_weak = prev_cp_is_weak;
_prev_EMCP_methods = prev_EMCP_methods;
}
@@ -3555,99 +3476,38 @@
}
}
-
-// Construct a PreviousVersionInfo entry
-PreviousVersionInfo::PreviousVersionInfo(PreviousVersionNode *pv_node) {
- _prev_constant_pool_handle = constantPoolHandle(); // NULL handle
- _prev_EMCP_method_handles = NULL;
-
- ConstantPool* cp = pv_node->prev_constant_pool();
- assert(cp != NULL, "constant pool ref was unexpectedly cleared");
- if (cp == NULL) {
- return; // robustness
- }
-
- // make the ConstantPool* safe to return
- _prev_constant_pool_handle = constantPoolHandle(cp);
-
- GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
- if (method_refs == NULL) {
- // the InstanceKlass did not have any EMCP methods
- return;
- }
-
- _prev_EMCP_method_handles = new GrowableArray<methodHandle>(10);
-
- int n_methods = method_refs->length();
- for (int i = 0; i < n_methods; i++) {
- Method* method = method_refs->at(i);
- assert (method != NULL, "method has been cleared");
- if (method == NULL) {
- continue; // robustness
- }
- // make the Method* safe to return
- _prev_EMCP_method_handles->append(methodHandle(method));
- }
-}
-
-
-// Destroy a PreviousVersionInfo
-PreviousVersionInfo::~PreviousVersionInfo() {
- // Since _prev_EMCP_method_handles is not C-heap allocated, we
- // don't have to delete it.
-}
-
-
// Construct a helper for walking the previous versions array
-PreviousVersionWalker::PreviousVersionWalker(InstanceKlass *ik) {
+PreviousVersionWalker::PreviousVersionWalker(Thread* thread, InstanceKlass *ik) {
+ _thread = thread;
_previous_versions = ik->previous_versions();
_current_index = 0;
- // _hm needs no initialization
_current_p = NULL;
-}
-
-
-// Destroy a PreviousVersionWalker
-PreviousVersionWalker::~PreviousVersionWalker() {
- // Delete the current info just in case the caller didn't walk to
- // the end of the previous versions list. No harm if _current_p is
- // already NULL.
- delete _current_p;
-
- // When _hm is destroyed, all the Handles returned in
- // PreviousVersionInfo objects will be destroyed.
- // Also, after this destructor is finished it will be
- // safe to delete the GrowableArray allocated in the
- // PreviousVersionInfo objects.
+ _current_constant_pool_handle = constantPoolHandle(thread, ik->constants());
}
// Return the interesting information for the next previous version
// of the klass. Returns NULL if there are no more previous versions.
-PreviousVersionInfo* PreviousVersionWalker::next_previous_version() {
+PreviousVersionNode* PreviousVersionWalker::next_previous_version() {
if (_previous_versions == NULL) {
// no previous versions so nothing to return
return NULL;
}
- delete _current_p; // cleanup the previous info for the caller
- _current_p = NULL; // reset to NULL so we don't delete same object twice
+ _current_p = NULL; // reset to NULL
+ _current_constant_pool_handle = NULL;
int length = _previous_versions->length();
while (_current_index < length) {
PreviousVersionNode * pv_node = _previous_versions->at(_current_index++);
- PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP, mtClass)
- PreviousVersionInfo(pv_node);
-
- constantPoolHandle cp_h = pv_info->prev_constant_pool_handle();
- assert (!cp_h.is_null(), "null cp found in previous version");
-
- // The caller will need to delete pv_info when they are done with it.
- _current_p = pv_info;
- return pv_info;
+
+ // Save a handle to the constant pool for this previous version,
+ // which keeps all the methods from being deallocated.
+ _current_constant_pool_handle = constantPoolHandle(_thread, pv_node->prev_constant_pool());
+ _current_p = pv_node;
+ return pv_node;
}
- // all of the underlying nodes' info has been deleted
return NULL;
} // end next_previous_version()
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -245,7 +245,6 @@
MemberNameTable* _member_names; // Member names
JNIid* _jni_ids; // First JNI identifier for static fields in this class
jmethodID* _methods_jmethod_ids; // jmethodIDs corresponding to method_idnum, or NULL if none
- int* _methods_cached_itable_indices; // itable_index cache for JNI invoke corresponding to methods idnum, or NULL
nmethodBucket* _dependencies; // list of dependent nmethods
nmethod* _osr_nmethods_head; // Head of list of on-stack replacement nmethods for this class
BreakpointInfo* _breakpoints; // bpt lists, managed by Method*
@@ -690,10 +689,6 @@
size_t *length_p, jmethodID* id_p);
jmethodID jmethod_id_or_null(Method* method);
- // cached itable index support
- void set_cached_itable_index(size_t idnum, int index);
- int cached_itable_index(size_t idnum);
-
// annotations support
Annotations* annotations() const { return _annotations; }
void set_annotations(Annotations* anno) { _annotations = anno; }
@@ -994,11 +989,6 @@
void release_set_methods_jmethod_ids(jmethodID* jmeths)
{ OrderAccess::release_store_ptr(&_methods_jmethod_ids, jmeths); }
- int* methods_cached_itable_indices_acquire() const
- { return (int*)OrderAccess::load_ptr_acquire(&_methods_cached_itable_indices); }
- void release_set_methods_cached_itable_indices(int* indices)
- { OrderAccess::release_store_ptr(&_methods_cached_itable_indices, indices); }
-
// Lock during initialization
public:
// Lock for (1) initialization; (2) access to the ConstantPool of this class.
@@ -1136,21 +1126,11 @@
// A collection point for interesting information about the previous
-// version(s) of an InstanceKlass. This class uses weak references to
-// the information so that the information may be collected as needed
-// by the system. If the information is shared, then a regular
-// reference must be used because a weak reference would be seen as
-// collectible. A GrowableArray of PreviousVersionNodes is attached
-// to the InstanceKlass as needed. See PreviousVersionWalker below.
+// version(s) of an InstanceKlass. A GrowableArray of PreviousVersionNodes
+// is attached to the InstanceKlass as needed. See PreviousVersionWalker below.
class PreviousVersionNode : public CHeapObj<mtClass> {
private:
- // A shared ConstantPool is never collected so we'll always have
- // a reference to it so we can update items in the cache. We'll
- // have a weak reference to a non-shared ConstantPool until all
- // of the methods (EMCP or obsolete) have been collected; the
- // non-shared ConstantPool becomes collectible at that point.
- ConstantPool* _prev_constant_pool; // regular or weak reference
- bool _prev_cp_is_weak; // true if not a shared ConstantPool
+ ConstantPool* _prev_constant_pool;
// If the previous version of the InstanceKlass doesn't have any
// EMCP methods, then _prev_EMCP_methods will be NULL. If all the
@@ -1159,8 +1139,8 @@
GrowableArray<Method*>* _prev_EMCP_methods;
public:
- PreviousVersionNode(ConstantPool* prev_constant_pool, bool prev_cp_is_weak,
- GrowableArray<Method*>* prev_EMCP_methods);
+ PreviousVersionNode(ConstantPool* prev_constant_pool,
+ GrowableArray<Method*>* prev_EMCP_methods);
~PreviousVersionNode();
ConstantPool* prev_constant_pool() const {
return _prev_constant_pool;
@@ -1171,59 +1151,26 @@
};
-// A Handle-ized version of PreviousVersionNode.
-class PreviousVersionInfo : public ResourceObj {
- private:
- constantPoolHandle _prev_constant_pool_handle;
- // If the previous version of the InstanceKlass doesn't have any
- // EMCP methods, then _prev_EMCP_methods will be NULL. Since the
- // methods cannot be collected while we hold a handle,
- // _prev_EMCP_methods should never have a length of zero.
- GrowableArray<methodHandle>* _prev_EMCP_method_handles;
-
-public:
- PreviousVersionInfo(PreviousVersionNode *pv_node);
- ~PreviousVersionInfo();
- constantPoolHandle prev_constant_pool_handle() const {
- return _prev_constant_pool_handle;
- }
- GrowableArray<methodHandle>* prev_EMCP_method_handles() const {
- return _prev_EMCP_method_handles;
- }
-};
-
-
-// Helper object for walking previous versions. This helper cleans up
-// the Handles that it allocates when the helper object is destroyed.
-// The PreviousVersionInfo object returned by next_previous_version()
-// is only valid until a subsequent call to next_previous_version() or
-// the helper object is destroyed.
+// Helper object for walking previous versions.
class PreviousVersionWalker : public StackObj {
private:
+ Thread* _thread;
GrowableArray<PreviousVersionNode *>* _previous_versions;
int _current_index;
- // Fields for cleaning up when we are done walking the previous versions:
- // A HandleMark for the PreviousVersionInfo handles:
- HandleMark _hm;
+
+ // A pointer to the current node object so we can handle the deletes.
+ PreviousVersionNode* _current_p;
- // It would be nice to have a ResourceMark field in this helper also,
- // but the ResourceMark code says to be careful to delete handles held
- // in GrowableArrays _before_ deleting the GrowableArray. Since we
- // can't guarantee the order in which the fields are destroyed, we
- // have to let the creator of the PreviousVersionWalker object do
- // the right thing. Also, adding a ResourceMark here causes an
- // include loop.
-
- // A pointer to the current info object so we can handle the deletes.
- PreviousVersionInfo * _current_p;
+ // The constant pool handle keeps all the methods in this class from being
+ // deallocated from the metaspace during class unloading.
+ constantPoolHandle _current_constant_pool_handle;
public:
- PreviousVersionWalker(InstanceKlass *ik);
- ~PreviousVersionWalker();
+ PreviousVersionWalker(Thread* thread, InstanceKlass *ik);
// Return the interesting information for the next previous version
// of the klass. Returns NULL if there are no more previous versions.
- PreviousVersionInfo* next_previous_version();
+ PreviousVersionNode* next_previous_version();
};
--- a/hotspot/src/share/vm/oops/instanceMirrorKlass.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceMirrorKlass.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -66,7 +66,7 @@
// Static field offset is an offset into the Heap, should be converted by
// based on UseCompressedOop for traversal
static HeapWord* start_of_static_fields(oop obj) {
- return (HeapWord*)((intptr_t)obj + offset_of_static_fields());
+ return (HeapWord*)(cast_from_oop<intptr_t>(obj) + offset_of_static_fields());
}
static void init_offset_of_static_fields() {
--- a/hotspot/src/share/vm/oops/instanceOop.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceOop.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -37,9 +37,9 @@
// If compressed, the offset of the fields of the instance may not be aligned.
static int base_offset_in_bytes() {
- // offset computation code breaks if UseCompressedKlassPointers
+ // offset computation code breaks if UseCompressedClassPointers
// only is true
- return (UseCompressedOops && UseCompressedKlassPointers) ?
+ return (UseCompressedOops && UseCompressedClassPointers) ?
klass_gap_offset_in_bytes() :
sizeof(instanceOopDesc);
}
--- a/hotspot/src/share/vm/oops/instanceRefKlass.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceRefKlass.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,7 +51,7 @@
T heap_oop = oopDesc::load_heap_oop(referent_addr);
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, (void *)obj);
}
)
if (!oopDesc::is_null(heap_oop)) {
@@ -62,7 +62,7 @@
ref->InstanceKlass::oop_follow_contents(obj);
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, (void *)obj);
}
)
return;
@@ -70,7 +70,7 @@
// treat referent as normal oop
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, (void *)obj);
}
)
MarkSweep::mark_and_push(referent_addr);
@@ -130,7 +130,7 @@
T heap_oop = oopDesc::load_heap_oop(referent_addr);
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr("InstanceRefKlass::oop_follow_contents " INTPTR_FORMAT, (void *)obj);
}
)
if (!oopDesc::is_null(heap_oop)) {
@@ -142,7 +142,7 @@
ref->InstanceKlass::oop_follow_contents(cm, obj);
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr(" Non NULL enqueued " INTPTR_FORMAT, (void *)obj);
}
)
return;
@@ -150,7 +150,7 @@
// treat referent as normal oop
debug_only(
if(TraceReferenceGC && PrintGCDetails) {
- gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, obj);
+ gclog_or_tty->print_cr(" Non NULL normal " INTPTR_FORMAT, (void *)obj);
}
)
PSParallelCompact::mark_and_push(cm, referent_addr);
--- a/hotspot/src/share/vm/oops/klass.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/klass.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -674,13 +674,23 @@
#ifndef PRODUCT
-void Klass::verify_vtable_index(int i) {
+bool Klass::verify_vtable_index(int i) {
if (oop_is_instance()) {
- assert(i>=0 && i<((InstanceKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds");
+ int limit = ((InstanceKlass*)this)->vtable_length()/vtableEntry::size();
+ assert(i >= 0 && i < limit, err_msg("index %d out of bounds %d", i, limit));
} else {
assert(oop_is_array(), "Must be");
- assert(i>=0 && i<((ArrayKlass*)this)->vtable_length()/vtableEntry::size(), "index out of bounds");
+ int limit = ((ArrayKlass*)this)->vtable_length()/vtableEntry::size();
+ assert(i >= 0 && i < limit, err_msg("index %d out of bounds %d", i, limit));
}
+ return true;
+}
+
+bool Klass::verify_itable_index(int i) {
+ assert(oop_is_instance(), "");
+ int method_count = klassItable::method_count_for_interface(this);
+ assert(i >= 0 && i < method_count, "index out of bounds");
+ return true;
}
#endif
--- a/hotspot/src/share/vm/oops/klass.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/klass.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -699,7 +699,8 @@
void verify(bool check_dictionary = true) { verify_on(tty, check_dictionary); }
#ifndef PRODUCT
- void verify_vtable_index(int index);
+ bool verify_vtable_index(int index);
+ bool verify_itable_index(int index);
#endif
virtual void oop_verify_on(oop obj, outputStream* st);
--- a/hotspot/src/share/vm/oops/klassVtable.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -47,11 +47,12 @@
// this function computes the vtable size (including the size needed for miranda
-// methods) and the number of miranda methods in this class
+// methods) and the number of miranda methods in this class.
// Note on Miranda methods: Let's say there is a class C that implements
-// interface I. Let's say there is a method m in I that neither C nor any
-// of its super classes implement (i.e there is no method of any access, with
-// the same name and signature as m), then m is a Miranda method which is
+// interface I, and none of C's superclasses implements I.
+// Let's say there is an abstract method m in I that neither C
+// nor any of its super classes implement (i.e there is no method of any access,
+// with the same name and signature as m), then m is a Miranda method which is
// entered as a public abstract method in C's vtable. From then on it should
// treated as any other public method in C for method over-ride purposes.
void klassVtable::compute_vtable_size_and_num_mirandas(
@@ -111,10 +112,13 @@
}
int klassVtable::index_of(Method* m, int len) const {
- assert(m->vtable_index() >= 0, "do not ask this of non-vtable methods");
+ assert(m->has_vtable_index(), "do not ask this of non-vtable methods");
return m->vtable_index();
}
+// Copy super class's vtable to the first part (prefix) of this class's vtable,
+// and return the number of entries copied. Expects that 'super' is the Java
+// super class (arrays can have "array" super classes that must be skipped).
int klassVtable::initialize_from_super(KlassHandle super) {
if (super.is_null()) {
return 0;
@@ -139,14 +143,14 @@
}
}
-// Revised lookup semantics introduced 1.3 (Kestral beta)
+//
+// Revised lookup semantics introduced 1.3 (Kestrel beta)
void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) {
// Note: Arrays can have intermediate array supers. Use java_super to skip them.
KlassHandle super (THREAD, klass()->java_super());
int nofNewEntries = 0;
-
if (PrintVtables && !klass()->oop_is_array()) {
ResourceMark rm(THREAD);
tty->print_cr("Initializing: %s", _klass->name()->as_C_string());
@@ -174,8 +178,10 @@
int len = methods->length();
int initialized = super_vtable_len;
- // update_inherited_vtable can stop for gc - ensure using handles
+ // Check each of this class's methods against super;
+ // if override, replace in copy of super vtable, otherwise append to end
for (int i = 0; i < len; i++) {
+ // update_inherited_vtable can stop for gc - ensure using handles
HandleMark hm(THREAD);
assert(methods->at(i)->is_method(), "must be a Method*");
methodHandle mh(THREAD, methods->at(i));
@@ -189,11 +195,11 @@
}
}
- // add miranda methods; it will also update the value of initialized
- fill_in_mirandas(&initialized);
+ // add miranda methods to end of vtable.
+ initialized = fill_in_mirandas(initialized);
// In class hierarchies where the accessibility is not increasing (i.e., going from private ->
- // package_private -> publicprotected), the vtable might actually be smaller than our initial
+ // package_private -> public/protected), the vtable might actually be smaller than our initial
// calculation.
assert(initialized <= _length, "vtable initialization failed");
for(;initialized < _length; initialized++) {
@@ -248,14 +254,8 @@
return superk;
}
-// Methods that are "effectively" final don't need vtable entries.
-bool method_is_effectively_final(
- AccessFlags klass_flags, methodHandle target) {
- return target->is_final() || klass_flags.is_final() && !target->is_overpass();
-}
-
// Update child's copy of super vtable for overrides
-// OR return true if a new vtable entry is required
+// OR return true if a new vtable entry is required.
// Only called for InstanceKlass's, i.e. not for arrays
// If that changed, could not use _klass as handle for klass
bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle target_method, int super_vtable_len,
@@ -263,6 +263,7 @@
ResourceMark rm;
bool allocate_new = true;
assert(klass->oop_is_instance(), "must be InstanceKlass");
+ assert(klass == target_method()->method_holder(), "caller resp.");
// Initialize the method's vtable index to "nonvirtual".
// If we allocate a vtable entry, we will update it to a non-negative number.
@@ -273,11 +274,17 @@
return false;
}
- if (method_is_effectively_final(klass->access_flags(), target_method)) {
+ if (target_method->is_final_method(klass->access_flags())) {
// a final method never needs a new entry; final methods can be statically
// resolved and they have to be present in the vtable only if they override
// a super's method, in which case they re-use its entry
allocate_new = false;
+ } else if (klass->is_interface()) {
+ allocate_new = false; // see note below in needs_new_vtable_entry
+ // An interface never allocates new vtable slots, only inherits old ones.
+ // This method will either be assigned its own itable index later,
+ // or be assigned an inherited vtable index in the loop below.
+ target_method()->set_vtable_index(Method::pending_itable_index);
}
// we need a new entry if there is no superclass
@@ -285,9 +292,10 @@
return allocate_new;
}
- // private methods always have a new entry in the vtable
+ // private methods in classes always have a new entry in the vtable
// specification interpretation since classic has
// private methods not overriding
+ // JDK8 adds private methods in interfaces which require invokespecial
if (target_method()->is_private()) {
return allocate_new;
}
@@ -411,8 +419,14 @@
Symbol* classname,
AccessFlags class_flags,
TRAPS) {
+ if (class_flags.is_interface()) {
+ // Interfaces do not use vtables, so there is no point to assigning
+ // a vtable index to any of their methods. If we refrain from doing this,
+ // we can use Method::_vtable_index to hold the itable index
+ return false;
+ }
- if (method_is_effectively_final(class_flags, target_method) ||
+ if (target_method->is_final_method(class_flags) ||
// a final method never needs a new entry; final methods can be statically
// resolved and they have to be present in the vtable only if they override
// a super's method, in which case they re-use its entry
@@ -429,9 +443,10 @@
return true;
}
- // private methods always have a new entry in the vtable
+ // private methods in classes always have a new entry in the vtable
// specification interpretation since classic has
// private methods not overriding
+ // JDK8 adds private methods in interfaces which require invokespecial
if (target_method()->is_private()) {
return true;
}
@@ -500,13 +515,14 @@
return Method::invalid_vtable_index;
}
-// check if an entry is miranda
+// check if an entry at an index is miranda
+// requires that method m at entry be declared ("held") by an interface.
bool klassVtable::is_miranda_entry_at(int i) {
Method* m = method_at(i);
Klass* method_holder = m->method_holder();
InstanceKlass *mhk = InstanceKlass::cast(method_holder);
- // miranda methods are interface methods in a class's vtable
+ // miranda methods are public abstract instance interface methods in a class's vtable
if (mhk->is_interface()) {
assert(m->is_public(), "should be public");
assert(ik()->implements_interface(method_holder) , "this class should implement the interface");
@@ -516,8 +532,12 @@
return false;
}
-// check if a method is a miranda method, given a class's methods table and it's super
+// check if a method is a miranda method, given a class's methods table and its super
+// "miranda" means not static, not defined by this class, and not defined
+// in super unless it is private and therefore inaccessible to this class.
// the caller must make sure that the method belongs to an interface implemented by the class
+// Miranda methods only include public interface instance methods
+// Not private methods, not static methods, not default = concrete abstract
bool klassVtable::is_miranda(Method* m, Array<Method*>* class_methods, Klass* super) {
if (m->is_static()) {
return false;
@@ -541,6 +561,14 @@
return false;
}
+// Scans current_interface_methods for miranda methods that do not
+// already appear in new_mirandas and are also not defined-and-non-private
+// in super (superclass). These mirandas are added to all_mirandas if it is
+// not null; in addition, those that are not duplicates of miranda methods
+// inherited by super from its interfaces are added to new_mirandas.
+// Thus, new_mirandas will be the set of mirandas that this class introduces,
+// all_mirandas will be the set of all mirandas applicable to this class
+// including all defined in superclasses.
void klassVtable::add_new_mirandas_to_lists(
GrowableArray<Method*>* new_mirandas, GrowableArray<Method*>* all_mirandas,
Array<Method*>* current_interface_methods, Array<Method*>* class_methods,
@@ -599,17 +627,22 @@
}
}
-// fill in mirandas
-void klassVtable::fill_in_mirandas(int* initialized) {
+// Discover miranda methods ("miranda" = "interface abstract, no binding"),
+// and append them into the vtable starting at index initialized,
+// return the new value of initialized.
+int klassVtable::fill_in_mirandas(int initialized) {
GrowableArray<Method*> mirandas(20);
get_mirandas(&mirandas, NULL, ik()->super(), ik()->methods(),
ik()->local_interfaces());
for (int i = 0; i < mirandas.length(); i++) {
- put_method_at(mirandas.at(i), *initialized);
- ++(*initialized);
+ put_method_at(mirandas.at(i), initialized);
+ ++initialized;
}
+ return initialized;
}
+// Copy this class's vtable to the vtable beginning at start.
+// Used to copy superclass vtable to prefix of subclass's vtable.
void klassVtable::copy_vtable_to(vtableEntry* start) {
Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size());
}
@@ -723,6 +756,12 @@
// Initialization
void klassItable::initialize_itable(bool checkconstraints, TRAPS) {
+ if (_klass->is_interface()) {
+ // This needs to go after vtable indexes are assigned but
+ // before implementors need to know the number of itable indexes.
+ assign_itable_indexes_for_interface(_klass());
+ }
+
// Cannot be setup doing bootstrapping, interfaces don't have
// itables, and klass with only ones entry have empty itables
if (Universe::is_bootstrapping() ||
@@ -754,45 +793,89 @@
}
+inline bool interface_method_needs_itable_index(Method* m) {
+ if (m->is_static()) return false; // e.g., Stream.empty
+ if (m->is_initializer()) return false; // <init> or <clinit>
+ // If an interface redeclares a method from java.lang.Object,
+ // it should already have a vtable index, don't touch it.
+ // e.g., CharSequence.toString (from initialize_vtable)
+ // if (m->has_vtable_index()) return false; // NO!
+ return true;
+}
+
+int klassItable::assign_itable_indexes_for_interface(Klass* klass) {
+ // an interface does not have an itable, but its methods need to be numbered
+ if (TraceItables) tty->print_cr("%3d: Initializing itable for interface %s", ++initialize_count,
+ klass->name()->as_C_string());
+ Array<Method*>* methods = InstanceKlass::cast(klass)->methods();
+ int nof_methods = methods->length();
+ int ime_num = 0;
+ for (int i = 0; i < nof_methods; i++) {
+ Method* m = methods->at(i);
+ if (interface_method_needs_itable_index(m)) {
+ assert(!m->is_final_method(), "no final interface methods");
+ // If m is already assigned a vtable index, do not disturb it.
+ if (!m->has_vtable_index()) {
+ assert(m->vtable_index() == Method::pending_itable_index, "set by initialize_vtable");
+ m->set_itable_index(ime_num);
+ // Progress to next itable entry
+ ime_num++;
+ }
+ }
+ }
+ assert(ime_num == method_count_for_interface(klass), "proper sizing");
+ return ime_num;
+}
+
+int klassItable::method_count_for_interface(Klass* interf) {
+ assert(interf->oop_is_instance(), "must be");
+ assert(interf->is_interface(), "must be");
+ Array<Method*>* methods = InstanceKlass::cast(interf)->methods();
+ int nof_methods = methods->length();
+ while (nof_methods > 0) {
+ Method* m = methods->at(nof_methods-1);
+ if (m->has_itable_index()) {
+ int length = m->itable_index() + 1;
+#ifdef ASSERT
+ while (nof_methods = 0) {
+ m = methods->at(--nof_methods);
+ assert(!m->has_itable_index() || m->itable_index() < length, "");
+ }
+#endif //ASSERT
+ return length; // return the rightmost itable index, plus one
+ }
+ nof_methods -= 1;
+ }
+ // no methods have itable indexes
+ return 0;
+}
+
+
void klassItable::initialize_itable_for_interface(int method_table_offset, KlassHandle interf_h, bool checkconstraints, TRAPS) {
Array<Method*>* methods = InstanceKlass::cast(interf_h())->methods();
int nof_methods = methods->length();
HandleMark hm;
- KlassHandle klass = _klass;
assert(nof_methods > 0, "at least one method must exist for interface to be in vtable");
Handle interface_loader (THREAD, InstanceKlass::cast(interf_h())->class_loader());
- int ime_num = 0;
- // Skip first Method* if it is a class initializer
- int i = methods->at(0)->is_static_initializer() ? 1 : 0;
-
- // m, method_name, method_signature, klass reset each loop so they
- // don't need preserving across check_signature_loaders call
- // methods needs a handle in case of gc from check_signature_loaders
- for(; i < nof_methods; i++) {
+ int ime_count = method_count_for_interface(interf_h());
+ for (int i = 0; i < nof_methods; i++) {
Method* m = methods->at(i);
- Symbol* method_name = m->name();
- Symbol* method_signature = m->signature();
-
- // This is same code as in Linkresolver::lookup_instance_method_in_klasses
- Method* target = klass->uncached_lookup_method(method_name, method_signature);
- while (target != NULL && target->is_static()) {
- // continue with recursive lookup through the superclass
- Klass* super = target->method_holder()->super();
- target = (super == NULL) ? (Method*)NULL : super->uncached_lookup_method(method_name, method_signature);
+ methodHandle target;
+ if (m->has_itable_index()) {
+ LinkResolver::lookup_instance_method_in_klasses(target, _klass, m->name(), m->signature(), CHECK);
}
if (target == NULL || !target->is_public() || target->is_abstract()) {
// Entry do not resolve. Leave it empty
} else {
// Entry did resolve, check loader constraints before initializing
// if checkconstraints requested
- methodHandle target_h (THREAD, target); // preserve across gc
if (checkconstraints) {
Handle method_holder_loader (THREAD, target->method_holder()->class_loader());
if (method_holder_loader() != interface_loader()) {
ResourceMark rm(THREAD);
Symbol* failed_type_symbol =
- SystemDictionary::check_signature_loaders(method_signature,
+ SystemDictionary::check_signature_loaders(m->signature(),
method_holder_loader,
interface_loader,
true, CHECK);
@@ -803,9 +886,9 @@
"and the class loader (instance of %s) for interface "
"%s have different Class objects for the type %s "
"used in the signature";
- char* sig = target_h()->name_and_sig_as_C_string();
+ char* sig = target()->name_and_sig_as_C_string();
const char* loader1 = SystemDictionary::loader_name(method_holder_loader());
- char* current = klass->name()->as_C_string();
+ char* current = _klass->name()->as_C_string();
const char* loader2 = SystemDictionary::loader_name(interface_loader());
char* iface = InstanceKlass::cast(interf_h())->name()->as_C_string();
char* failed_type_name = failed_type_symbol->as_C_string();
@@ -821,10 +904,10 @@
}
// ime may have moved during GC so recalculate address
- itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target_h());
+ int ime_num = m->itable_index();
+ assert(ime_num < ime_count, "oob");
+ itableOffsetEntry::method_entry(_klass(), method_table_offset)[ime_num].initialize(target());
}
- // Progress to next entry
- ime_num++;
}
}
@@ -913,20 +996,22 @@
virtual void doit(Klass* intf, int method_count) = 0;
};
-// Visit all interfaces with at-least one method (excluding <clinit>)
+// Visit all interfaces with at least one itable method
void visit_all_interfaces(Array<Klass*>* transitive_intf, InterfaceVisiterClosure *blk) {
// Handle array argument
for(int i = 0; i < transitive_intf->length(); i++) {
Klass* intf = transitive_intf->at(i);
assert(intf->is_interface(), "sanity check");
- // Find no. of methods excluding a <clinit>
- int method_count = InstanceKlass::cast(intf)->methods()->length();
- if (method_count > 0) {
- Method* m = InstanceKlass::cast(intf)->methods()->at(0);
- assert(m != NULL && m->is_method(), "sanity check");
- if (m->name() == vmSymbols::object_initializer_name()) {
- method_count--;
+ // Find no. of itable methods
+ int method_count = 0;
+ // method_count = klassItable::method_count_for_interface(intf);
+ Array<Method*>* methods = InstanceKlass::cast(intf)->methods();
+ if (methods->length() > 0) {
+ for (int i = methods->length(); --i >= 0; ) {
+ if (interface_method_needs_itable_index(methods->at(i))) {
+ method_count++;
+ }
}
}
@@ -1024,40 +1109,26 @@
}
-// m must be a method in an interface
-int klassItable::compute_itable_index(Method* m) {
- InstanceKlass* intf = m->method_holder();
- assert(intf->is_interface(), "sanity check");
- Array<Method*>* methods = intf->methods();
- int index = 0;
- while(methods->at(index) != m) {
- index++;
- assert(index < methods->length(), "should find index for resolve_invoke");
- }
- // Adjust for <clinit>, which is left out of table if first method
- if (methods->length() > 0 && methods->at(0)->is_static_initializer()) {
- index--;
- }
- return index;
-}
-
-
-// inverse to compute_itable_index
+// inverse to itable_index
Method* klassItable::method_for_itable_index(Klass* intf, int itable_index) {
assert(InstanceKlass::cast(intf)->is_interface(), "sanity check");
+ assert(intf->verify_itable_index(itable_index), "");
Array<Method*>* methods = InstanceKlass::cast(intf)->methods();
+ if (itable_index < 0 || itable_index >= method_count_for_interface(intf))
+ return NULL; // help caller defend against bad indexes
+
int index = itable_index;
- // Adjust for <clinit>, which is left out of table if first method
- if (methods->length() > 0 && methods->at(0)->is_static_initializer()) {
- index++;
+ Method* m = methods->at(index);
+ int index2 = -1;
+ while (!m->has_itable_index() ||
+ (index2 = m->itable_index()) != itable_index) {
+ assert(index2 < itable_index, "monotonic");
+ if (++index == methods->length())
+ return NULL;
+ m = methods->at(index);
}
-
- if (itable_index < 0 || index >= methods->length())
- return NULL; // help caller defend against bad indexes
-
- Method* m = methods->at(index);
- assert(compute_itable_index(m) == itable_index, "correct inverse");
+ assert(m->itable_index() == itable_index, "correct inverse");
return m;
}
--- a/hotspot/src/share/vm/oops/klassVtable.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -124,7 +124,7 @@
// support for miranda methods
bool is_miranda_entry_at(int i);
- void fill_in_mirandas(int* initialized);
+ int fill_in_mirandas(int initialized);
static bool is_miranda(Method* m, Array<Method*>* class_methods, Klass* super);
static void add_new_mirandas_to_lists(
GrowableArray<Method*>* new_mirandas,
@@ -150,6 +150,8 @@
// from_compiled_code_entry_point -> nmethod entry point
// from_interpreter_entry_point -> i2cadapter
class vtableEntry VALUE_OBJ_CLASS_SPEC {
+ friend class VMStructs;
+
public:
// size in words
static int size() {
@@ -288,12 +290,12 @@
#endif // INCLUDE_JVMTI
// Setup of itable
+ static int assign_itable_indexes_for_interface(Klass* klass);
+ static int method_count_for_interface(Klass* klass);
static int compute_itable_size(Array<Klass*>* transitive_interfaces);
static void setup_itable_offset_table(instanceKlassHandle klass);
// Resolving of method to index
- static int compute_itable_index(Method* m);
- // ...and back again:
static Method* method_for_itable_index(Klass* klass, int itable_index);
// Debugging/Statistics
--- a/hotspot/src/share/vm/oops/method.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/method.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -509,24 +509,31 @@
return _access_flags.has_loops();
}
-
-bool Method::is_final_method() const {
- // %%% Should return true for private methods also,
- // since there is no way to override them.
- return is_final() || method_holder()->is_final();
+bool Method::is_final_method(AccessFlags class_access_flags) const {
+ // or "does_not_require_vtable_entry"
+ // overpass can occur, is not final (reuses vtable entry)
+ // private methods get vtable entries for backward class compatibility.
+ if (is_overpass()) return false;
+ return is_final() || class_access_flags.is_final();
}
-
-bool Method::is_strict_method() const {
- return is_strict();
+bool Method::is_final_method() const {
+ return is_final_method(method_holder()->access_flags());
}
-
-bool Method::can_be_statically_bound() const {
- if (is_final_method()) return true;
+bool Method::can_be_statically_bound(AccessFlags class_access_flags) const {
+ if (is_final_method(class_access_flags)) return true;
+#ifdef ASSERT
+ bool is_nonv = (vtable_index() == nonvirtual_vtable_index);
+ if (class_access_flags.is_interface()) assert(is_nonv == is_static(), err_msg("is_nonv=%s", is_nonv));
+#endif
+ assert(valid_vtable_index() || valid_itable_index(), "method must be linked before we ask this question");
return vtable_index() == nonvirtual_vtable_index;
}
+bool Method::can_be_statically_bound() const {
+ return can_be_statically_bound(method_holder()->access_flags());
+}
bool Method::is_accessor() const {
if (code_size() != 5) return false;
@@ -894,16 +901,6 @@
// This function must not hit a safepoint!
address Method::verified_code_entry() {
debug_only(No_Safepoint_Verifier nsv;)
- nmethod *code = (nmethod *)OrderAccess::load_ptr_acquire(&_code);
- if (code == NULL && UseCodeCacheFlushing) {
- nmethod *saved_code = CodeCache::reanimate_saved_code(this);
- if (saved_code != NULL) {
- methodHandle method(this);
- assert( ! saved_code->is_osr_method(), "should not get here for osr" );
- set_code( method, saved_code );
- }
- }
-
assert(_from_compiled_entry != NULL, "must be set");
return _from_compiled_entry;
}
@@ -967,7 +964,7 @@
assert(ik->is_subclass_of(method_holder()), "should be subklass");
assert(ik->vtable() != NULL, "vtable should exist");
- if (vtable_index() == nonvirtual_vtable_index) {
+ if (!has_vtable_index()) {
return false;
} else {
Method* vt_m = ik->method_at_vtable(vtable_index());
@@ -1959,7 +1956,7 @@
void Method::print_value_on(outputStream* st) const {
assert(is_method(), "must be method");
- st->print_cr(internal_name());
+ st->print(internal_name());
print_address_on(st);
st->print(" ");
name()->print_value_on(st);
@@ -1967,6 +1964,7 @@
signature()->print_value_on(st);
st->print(" in ");
method_holder()->print_value_on(st);
+ if (WizardMode) st->print("#%d", _vtable_index);
if (WizardMode) st->print("[%d,%d]", size_of_parameters(), max_locals());
if (WizardMode && code() != NULL) st->print(" ((nmethod*)%p)", code());
}
--- a/hotspot/src/share/vm/oops/method.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/method.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -448,16 +448,22 @@
enum VtableIndexFlag {
// Valid vtable indexes are non-negative (>= 0).
// These few negative values are used as sentinels.
- highest_unused_vtable_index_value = -5,
+ itable_index_max = -10, // first itable index, growing downward
+ pending_itable_index = -9, // itable index will be assigned
invalid_vtable_index = -4, // distinct from any valid vtable index
garbage_vtable_index = -3, // not yet linked; no vtable layout yet
nonvirtual_vtable_index = -2 // there is no need for vtable dispatch
// 6330203 Note: Do not use -1, which was overloaded with many meanings.
};
DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; })
- int vtable_index() const { assert(valid_vtable_index(), "");
- return _vtable_index; }
+ bool has_vtable_index() const { return _vtable_index >= 0; }
+ int vtable_index() const { return _vtable_index; }
void set_vtable_index(int index) { _vtable_index = index; }
+ DEBUG_ONLY(bool valid_itable_index() const { return _vtable_index <= pending_itable_index; })
+ bool has_itable_index() const { return _vtable_index <= itable_index_max; }
+ int itable_index() const { assert(valid_itable_index(), "");
+ return itable_index_max - _vtable_index; }
+ void set_itable_index(int index) { _vtable_index = itable_index_max - index; assert(valid_itable_index(), ""); }
// interpreter entry
address interpreter_entry() const { return _i2i_entry; }
@@ -560,10 +566,11 @@
// checks method and its method holder
bool is_final_method() const;
- bool is_strict_method() const;
+ bool is_final_method(AccessFlags class_access_flags) const;
// true if method needs no dynamic dispatch (final and/or no vtable entry)
bool can_be_statically_bound() const;
+ bool can_be_statically_bound(AccessFlags class_access_flags) const;
// returns true if the method has any backward branches.
bool has_loops() {
@@ -740,10 +747,6 @@
// so handles are not used to avoid deadlock.
jmethodID find_jmethod_id_or_null() { return method_holder()->jmethod_id_or_null(this); }
- // JNI static invoke cached itable index accessors
- int cached_itable_index() { return method_holder()->cached_itable_index(method_idnum()); }
- void set_cached_itable_index(int index) { method_holder()->set_cached_itable_index(method_idnum(), index); }
-
// Support for inlining of intrinsic methods
vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; }
void set_intrinsic_id(vmIntrinsics::ID id) { _intrinsic_id = (u1) id; }
--- a/hotspot/src/share/vm/oops/methodData.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/methodData.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -72,6 +72,8 @@
//
// Overlay for generic profiling data.
class DataLayout VALUE_OBJ_CLASS_SPEC {
+ friend class VMStructs;
+
private:
// Every data layout begins with a header. This header
// contains a tag, which is used to indicate the size/layout
@@ -331,10 +333,10 @@
return (int)data()->cell_at(index);
}
void set_oop_at(int index, oop value) {
- set_intptr_at(index, (intptr_t) value);
+ set_intptr_at(index, cast_from_oop<intptr_t>(value));
}
oop oop_at(int index) {
- return (oop)intptr_at(index);
+ return cast_to_oop(intptr_at(index));
}
void set_flag_at(int flag_number) {
--- a/hotspot/src/share/vm/oops/oop.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/oop.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -69,7 +69,7 @@
}
inline Klass* oopDesc::klass() const {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
return Klass::decode_klass_not_null(_metadata._compressed_klass);
} else {
return _metadata._klass;
@@ -78,7 +78,7 @@
inline Klass* oopDesc::klass_or_null() const volatile {
// can be NULL in CMS
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
return Klass::decode_klass(_metadata._compressed_klass);
} else {
return _metadata._klass;
@@ -86,19 +86,19 @@
}
inline int oopDesc::klass_gap_offset_in_bytes() {
- assert(UseCompressedKlassPointers, "only applicable to compressed klass pointers");
+ assert(UseCompressedClassPointers, "only applicable to compressed klass pointers");
return oopDesc::klass_offset_in_bytes() + sizeof(narrowKlass);
}
inline Klass** oopDesc::klass_addr() {
// Only used internally and with CMS and will not work with
// UseCompressedOops
- assert(!UseCompressedKlassPointers, "only supported with uncompressed klass pointers");
+ assert(!UseCompressedClassPointers, "only supported with uncompressed klass pointers");
return (Klass**) &_metadata._klass;
}
inline narrowKlass* oopDesc::compressed_klass_addr() {
- assert(UseCompressedKlassPointers, "only called by compressed klass pointers");
+ assert(UseCompressedClassPointers, "only called by compressed klass pointers");
return &_metadata._compressed_klass;
}
@@ -106,7 +106,7 @@
// since klasses are promoted no store check is needed
assert(Universe::is_bootstrapping() || k != NULL, "must be a real Klass*");
assert(Universe::is_bootstrapping() || k->is_klass(), "not a Klass*");
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
*compressed_klass_addr() = Klass::encode_klass_not_null(k);
} else {
*klass_addr() = k;
@@ -118,7 +118,7 @@
}
inline void oopDesc::set_klass_gap(int v) {
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
*(int*)(((intptr_t)this) + klass_gap_offset_in_bytes()) = v;
}
}
@@ -126,7 +126,7 @@
inline void oopDesc::set_klass_to_list_ptr(oop k) {
// This is only to be used during GC, for from-space objects, so no
// barrier is needed.
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
_metadata._compressed_klass = (narrowKlass)encode_heap_oop(k); // may be null (parnew overflow handling)
} else {
_metadata._klass = (Klass*)(address)k;
@@ -135,7 +135,7 @@
inline oop oopDesc::list_ptr_from_klass() {
// This is only to be used during GC, for from-space objects.
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
return decode_heap_oop((narrowOop)_metadata._compressed_klass);
} else {
// Special case for GC
@@ -183,7 +183,7 @@
// in inner GC loops so these are separated.
inline bool check_obj_alignment(oop obj) {
- return (intptr_t)obj % MinObjAlignmentInBytes == 0;
+ return cast_from_oop<intptr_t>(obj) % MinObjAlignmentInBytes == 0;
}
inline narrowOop oopDesc::encode_heap_oop_not_null(oop v) {
--- a/hotspot/src/share/vm/oops/oopsHierarchy.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -55,11 +55,16 @@
// to and from the underlying oopDesc pointer type.
//
// Because oop and its subclasses <type>Oop are class types, arbitrary
-// conversions are not accepted by the compiler, and you may get a message
-// about overloading ambiguity (between long and int is common when converting
-// from a constant in 64 bit mode), or unable to convert from type to 'oop'.
-// Applying a cast to one of these conversion operators first will get to the
-// underlying oopDesc* type if appropriate.
+// conversions are not accepted by the compiler. Applying a cast to
+// an oop will cause the best matched conversion operator to be
+// invoked returning the underlying oopDesc* type if appropriate.
+// No copy constructors, explicit user conversions or operators of
+// numerical type should be defined within the oop class. Most C++
+// compilers will issue a compile time error concerning the overloading
+// ambiguity between operators of numerical and pointer types. If
+// a conversion to or from an oop to a numerical type is needed,
+// use the inline template methods, cast_*_oop, defined below.
+//
// Converting NULL to oop to Handle implicit is no longer accepted by the
// compiler because there are too many steps in the conversion. Use Handle()
// instead, which generates less code anyway.
@@ -83,12 +88,9 @@
void raw_set_obj(const void* p) { _o = (oopDesc*)p; }
oop() { set_obj(NULL); }
+ oop(const oop& o) { set_obj(o.obj()); }
oop(const volatile oop& o) { set_obj(o.obj()); }
oop(const void* p) { set_obj(p); }
- oop(intptr_t i) { set_obj((void *)i); }
-#ifdef _LP64
- oop(int i) { set_obj((void *)i); }
-#endif
~oop() {
if (CheckUnhandledOops) unregister_oop();
}
@@ -101,8 +103,6 @@
bool operator==(void *p) const { return obj() == p; }
bool operator!=(const volatile oop o) const { return obj() != o.obj(); }
bool operator!=(void *p) const { return obj() != p; }
- bool operator==(intptr_t p) const { return obj() == (oopDesc*)p; }
- bool operator!=(intptr_t p) const { return obj() != (oopDesc*)p; }
bool operator<(oop o) const { return obj() < o.obj(); }
bool operator>(oop o) const { return obj() > o.obj(); }
@@ -110,8 +110,18 @@
bool operator>=(oop o) const { return obj() >= o.obj(); }
bool operator!() const { return !obj(); }
- // Cast
+ // Assignment
+ oop& operator=(const oop& o) { _o = o.obj(); return *this; }
+#ifndef SOLARIS
+ volatile oop& operator=(const oop& o) volatile { _o = o.obj(); return *this; }
+#endif
+ volatile oop& operator=(const volatile oop& o) volatile { _o = o.obj(); return *this; }
+
+ // Explict user conversions
operator void* () const { return (void *)obj(); }
+#ifndef SOLARIS
+ operator void* () const volatile { return (void *)obj(); }
+#endif
operator HeapWord* () const { return (HeapWord*)obj(); }
operator oopDesc* () const { return obj(); }
operator intptr_t* () const { return (intptr_t*)obj(); }
@@ -119,7 +129,6 @@
operator markOop () const { return markOop(obj()); }
operator address () const { return (address)obj(); }
- operator intptr_t () const volatile { return (intptr_t)obj(); }
// from javaCalls.cpp
operator jobject () const { return (jobject)obj(); }
@@ -141,12 +150,26 @@
class type##Oop : public oop { \
public: \
type##Oop() : oop() {} \
+ type##Oop(const oop& o) : oop(o) {} \
type##Oop(const volatile oop& o) : oop(o) {} \
type##Oop(const void* p) : oop(p) {} \
operator type##OopDesc* () const { return (type##OopDesc*)obj(); } \
type##OopDesc* operator->() const { \
return (type##OopDesc*)obj(); \
} \
+ type##Oop& operator=(const type##Oop& o) { \
+ oop::operator=(o); \
+ return *this; \
+ } \
+ NOT_SOLARIS( \
+ volatile type##Oop& operator=(const type##Oop& o) volatile { \
+ (void)const_cast<oop&>(oop::operator=(o)); \
+ return *this; \
+ }) \
+ volatile type##Oop& operator=(const volatile type##Oop& o) volatile {\
+ (void)const_cast<oop&>(oop::operator=(o)); \
+ return *this; \
+ } \
};
DEF_OOP(instance);
@@ -156,6 +179,16 @@
#endif // CHECK_UNHANDLED_OOPS
+// For CHECK_UNHANDLED_OOPS, it is ambiguous C++ behavior to have the oop
+// structure contain explicit user defined conversions of both numerical
+// and pointer type. Define inline methods to provide the numerical conversions.
+template <class T> inline oop cast_to_oop(T value) {
+ return (oop)(CHECK_UNHANDLED_OOPS_ONLY((void *))(value));
+}
+template <class T> inline T cast_from_oop(oop o) {
+ return (T)(CHECK_UNHANDLED_OOPS_ONLY((void*))o);
+}
+
// The metadata hierarchy is separate from the oop hierarchy
// class MetaspaceObj
--- a/hotspot/src/share/vm/oops/symbol.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/oops/symbol.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -45,7 +45,7 @@
// in the SymbolTable bucket (the _literal field in HashtableEntry)
// that points to the Symbol. All other stores of a Symbol*
// to a field of a persistent variable (e.g., the _name filed in
-// FieldAccessInfo or _ptr in a CPSlot) is reference counted.
+// fieldDescriptor or _ptr in a CPSlot) is reference counted.
//
// 1) The lookup of a "name" in the SymbolTable either creates a Symbol F for
// "name" and returns a pointer to F or finds a pre-existing Symbol F for
--- a/hotspot/src/share/vm/opto/bytecodeInfo.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -123,7 +123,7 @@
// Allows targeted inlining
if(callee_method->should_inline()) {
*wci_result = *(WarmCallInfo::always_hot());
- if (PrintInlining && Verbose) {
+ if (C->print_inlining() && Verbose) {
CompileTask::print_inline_indent(inline_level());
tty->print_cr("Inlined method is hot: ");
}
@@ -137,7 +137,7 @@
if(callee_method->interpreter_throwout_count() > InlineThrowCount &&
size < InlineThrowMaxSize ) {
wci_result->set_profit(wci_result->profit() * 100);
- if (PrintInlining && Verbose) {
+ if (C->print_inlining() && Verbose) {
CompileTask::print_inline_indent(inline_level());
tty->print_cr("Inlined method with many throws (throws=%d):", callee_method->interpreter_throwout_count());
}
@@ -491,7 +491,7 @@
C->log()->inline_fail(inline_msg);
}
}
- if (PrintInlining) {
+ if (C->print_inlining()) {
C->print_inlining(callee_method, inline_level(), caller_bci, inline_msg);
if (callee_method == NULL) tty->print(" callee not monotonic or profiled");
if (Verbose && callee_method) {
@@ -540,7 +540,7 @@
#ifndef PRODUCT
if (UseOldInlining && InlineWarmCalls
- && (PrintOpto || PrintOptoInlining || PrintInlining)) {
+ && (PrintOpto || C->print_inlining())) {
bool cold = wci.is_cold();
bool hot = !cold && wci.is_hot();
bool old_cold = !success;
@@ -617,7 +617,7 @@
callee_method->is_compiled_lambda_form()) {
max_inline_level_adjust += 1; // don't count method handle calls from java.lang.invoke implem
}
- if (max_inline_level_adjust != 0 && PrintInlining && (Verbose || WizardMode)) {
+ if (max_inline_level_adjust != 0 && C->print_inlining() && (Verbose || WizardMode)) {
CompileTask::print_inline_indent(inline_level());
tty->print_cr(" \\-> discounting inline depth");
}
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -636,7 +636,9 @@
\
diagnostic(bool, OptimizeExpensiveOps, true, \
"Find best control for expensive operations") \
-
+ \
+ product(bool, UseMathExactIntrinsics, true, \
+ "Enables intrinsification of various java.lang.Math funcitons")
C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG)
--- a/hotspot/src/share/vm/opto/callGenerator.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -65,6 +65,8 @@
virtual bool is_predicted() const { return false; }
// is_trap: Does not return to the caller. (E.g., uncommon trap.)
virtual bool is_trap() const { return false; }
+ // does_virtual_dispatch: Should try inlining as normal method first.
+ virtual bool does_virtual_dispatch() const { return false; }
// is_late_inline: supports conversion of call into an inline
virtual bool is_late_inline() const { return false; }
@@ -159,8 +161,9 @@
virtual void print_inlining_late(const char* msg) { ShouldNotReachHere(); }
static void print_inlining(Compile* C, ciMethod* callee, int inline_level, int bci, const char* msg) {
- if (PrintInlining)
+ if (C->print_inlining()) {
C->print_inlining(callee, inline_level, bci, msg);
+ }
}
};
--- a/hotspot/src/share/vm/opto/cfgnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/cfgnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1932,7 +1932,7 @@
#ifdef _LP64
// Push DecodeN/DecodeNKlass down through phi.
// The rest of phi graph will transform by split EncodeP node though phis up.
- if ((UseCompressedOops || UseCompressedKlassPointers) && can_reshape && progress == NULL) {
+ if ((UseCompressedOops || UseCompressedClassPointers) && can_reshape && progress == NULL) {
bool may_push = true;
bool has_decodeN = false;
bool is_decodeN = false;
--- a/hotspot/src/share/vm/opto/chaitin.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/chaitin.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -122,40 +122,23 @@
return score;
}
-LRG_List::LRG_List( uint max ) : _cnt(max), _max(max), _lidxs(NEW_RESOURCE_ARRAY(uint,max)) {
- memset( _lidxs, 0, sizeof(uint)*max );
-}
-
-void LRG_List::extend( uint nidx, uint lidx ) {
- _nesting.check();
- if( nidx >= _max ) {
- uint size = 16;
- while( size <= nidx ) size <<=1;
- _lidxs = REALLOC_RESOURCE_ARRAY( uint, _lidxs, _max, size );
- _max = size;
- }
- while( _cnt <= nidx )
- _lidxs[_cnt++] = 0;
- _lidxs[nidx] = lidx;
-}
-
#define NUMBUCKS 3
// Straight out of Tarjan's union-find algorithm
uint LiveRangeMap::find_compress(uint lrg) {
uint cur = lrg;
- uint next = _uf_map[cur];
+ uint next = _uf_map.at(cur);
while (next != cur) { // Scan chain of equivalences
assert( next < cur, "always union smaller");
cur = next; // until find a fixed-point
- next = _uf_map[cur];
+ next = _uf_map.at(cur);
}
// Core of union-find algorithm: update chain of
// equivalences to be equal to the root.
while (lrg != next) {
- uint tmp = _uf_map[lrg];
- _uf_map.map(lrg, next);
+ uint tmp = _uf_map.at(lrg);
+ _uf_map.at_put(lrg, next);
lrg = tmp;
}
return lrg;
@@ -165,10 +148,10 @@
void LiveRangeMap::reset_uf_map(uint max_lrg_id) {
_max_lrg_id= max_lrg_id;
// Force the Union-Find mapping to be at least this large
- _uf_map.extend(_max_lrg_id, 0);
+ _uf_map.at_put_grow(_max_lrg_id, 0);
// Initialize it to be the ID mapping.
for (uint i = 0; i < _max_lrg_id; ++i) {
- _uf_map.map(i, i);
+ _uf_map.at_put(i, i);
}
}
@@ -176,12 +159,12 @@
// the Union-Find mapping after this call.
void LiveRangeMap::compress_uf_map_for_nodes() {
// For all Nodes, compress mapping
- uint unique = _names.Size();
+ uint unique = _names.length();
for (uint i = 0; i < unique; ++i) {
- uint lrg = _names[i];
+ uint lrg = _names.at(i);
uint compressed_lrg = find(lrg);
if (lrg != compressed_lrg) {
- _names.map(i, compressed_lrg);
+ _names.at_put(i, compressed_lrg);
}
}
}
@@ -198,11 +181,11 @@
return lrg;
}
- uint next = _uf_map[lrg];
+ uint next = _uf_map.at(lrg);
while (next != lrg) { // Scan chain of equivalences
assert(next < lrg, "always union smaller");
lrg = next; // until find a fixed-point
- next = _uf_map[lrg];
+ next = _uf_map.at(lrg);
}
return next;
}
@@ -215,7 +198,7 @@
NULL
#endif
)
- , _lrg_map(unique)
+ , _lrg_map(Thread::current()->resource_area(), unique)
, _live(0)
, _spilled_once(Thread::current()->resource_area())
, _spilled_twice(Thread::current()->resource_area())
@@ -692,6 +675,7 @@
_lrg_map.map(n->_idx, rm.is_NotEmpty() ? lr_counter++ : 0);
}
}
+
// Reset the Union-Find mapping to be identity
_lrg_map.reset_uf_map(lr_counter);
}
--- a/hotspot/src/share/vm/opto/chaitin.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/chaitin.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -283,8 +283,8 @@
// Straight out of Tarjan's union-find algorithm
uint find_compress(const Node *node) {
- uint lrg_id = find_compress(_names[node->_idx]);
- _names.map(node->_idx, lrg_id);
+ uint lrg_id = find_compress(_names.at(node->_idx));
+ _names.at_put(node->_idx, lrg_id);
return lrg_id;
}
@@ -305,40 +305,40 @@
}
uint size() const {
- return _names.Size();
+ return _names.length();
}
uint live_range_id(uint idx) const {
- return _names[idx];
+ return _names.at(idx);
}
uint live_range_id(const Node *node) const {
- return _names[node->_idx];
+ return _names.at(node->_idx);
}
uint uf_live_range_id(uint lrg_id) const {
- return _uf_map[lrg_id];
+ return _uf_map.at(lrg_id);
}
void map(uint idx, uint lrg_id) {
- _names.map(idx, lrg_id);
+ _names.at_put(idx, lrg_id);
}
void uf_map(uint dst_lrg_id, uint src_lrg_id) {
- _uf_map.map(dst_lrg_id, src_lrg_id);
+ _uf_map.at_put(dst_lrg_id, src_lrg_id);
}
void extend(uint idx, uint lrg_id) {
- _names.extend(idx, lrg_id);
+ _names.at_put_grow(idx, lrg_id);
}
void uf_extend(uint dst_lrg_id, uint src_lrg_id) {
- _uf_map.extend(dst_lrg_id, src_lrg_id);
+ _uf_map.at_put_grow(dst_lrg_id, src_lrg_id);
}
- LiveRangeMap(uint unique)
- : _names(unique)
- , _uf_map(unique)
+ LiveRangeMap(Arena* arena, uint unique)
+ : _names(arena, unique, unique, 0)
+ , _uf_map(arena, unique, unique, 0)
, _max_lrg_id(0) {}
uint find_id( const Node *n ) {
@@ -355,14 +355,14 @@
void compress_uf_map_for_nodes();
uint find(uint lidx) {
- uint uf_lidx = _uf_map[lidx];
+ uint uf_lidx = _uf_map.at(lidx);
return (uf_lidx == lidx) ? uf_lidx : find_compress(lidx);
}
// Convert a Node into a Live Range Index - a lidx
uint find(const Node *node) {
uint lidx = live_range_id(node);
- uint uf_lidx = _uf_map[lidx];
+ uint uf_lidx = _uf_map.at(lidx);
return (uf_lidx == lidx) ? uf_lidx : find_compress(node);
}
@@ -371,10 +371,10 @@
// Like Find above, but no path compress, so bad asymptotic behavior
uint find_const(const Node *node) const {
- if(node->_idx >= _names.Size()) {
+ if(node->_idx >= (uint)_names.length()) {
return 0; // not mapped, usual for debug dump
}
- return find_const(_names[node->_idx]);
+ return find_const(_names.at(node->_idx));
}
};
--- a/hotspot/src/share/vm/opto/classes.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/classes.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -32,6 +32,7 @@
#include "opto/loopnode.hpp"
#include "opto/machnode.hpp"
#include "opto/memnode.hpp"
+#include "opto/mathexactnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/multnode.hpp"
#include "opto/node.hpp"
--- a/hotspot/src/share/vm/opto/classes.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/classes.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -29,6 +29,7 @@
macro(AbsF)
macro(AbsI)
macro(AddD)
+macro(AddExactI)
macro(AddF)
macro(AddI)
macro(AddL)
@@ -133,6 +134,7 @@
macro(ExpD)
macro(FastLock)
macro(FastUnlock)
+macro(FlagsProj)
macro(Goto)
macro(Halt)
macro(If)
@@ -167,6 +169,7 @@
macro(LoopLimit)
macro(Mach)
macro(MachProj)
+macro(MathExact)
macro(MaxI)
macro(MemBarAcquire)
macro(MemBarAcquireLock)
--- a/hotspot/src/share/vm/opto/coalesce.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/coalesce.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
class LoopTree;
class LRG;
-class LRG_List;
class Matcher;
class PhaseIFG;
class PhaseCFG;
--- a/hotspot/src/share/vm/opto/compile.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/compile.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -654,7 +654,7 @@
_inlining_progress(false),
_inlining_incrementally(false),
_print_inlining_list(NULL),
- _print_inlining(0) {
+ _print_inlining_idx(0) {
C = this;
CompileWrapper cw(this);
@@ -679,6 +679,8 @@
set_print_assembly(print_opto_assembly);
set_parsed_irreducible_loop(false);
#endif
+ set_print_inlining(PrintInlining || method()->has_option("PrintInlining") NOT_PRODUCT( || PrintOptoInlining));
+ set_print_intrinsics(PrintIntrinsics || method()->has_option("PrintIntrinsics"));
if (ProfileTraps) {
// Make sure the method being compiled gets its own MDO,
@@ -710,7 +712,7 @@
PhaseGVN gvn(node_arena(), estimated_size);
set_initial_gvn(&gvn);
- if (PrintInlining || PrintIntrinsics NOT_PRODUCT( || PrintOptoInlining)) {
+ if (print_inlining() || print_intrinsics()) {
_print_inlining_list = new (comp_arena())GrowableArray<PrintInliningBuffer>(comp_arena(), 1, 1, PrintInliningBuffer());
}
{ // Scope for timing the parser
@@ -937,7 +939,7 @@
_inlining_progress(false),
_inlining_incrementally(false),
_print_inlining_list(NULL),
- _print_inlining(0) {
+ _print_inlining_idx(0) {
C = this;
#ifndef PRODUCT
@@ -2646,7 +2648,7 @@
addp->in(AddPNode::Base) == n->in(AddPNode::Base),
"Base pointers must match" );
#ifdef _LP64
- if ((UseCompressedOops || UseCompressedKlassPointers) &&
+ if ((UseCompressedOops || UseCompressedClassPointers) &&
addp->Opcode() == Op_ConP &&
addp == n->in(AddPNode::Base) &&
n->in(AddPNode::Offset)->is_Con()) {
@@ -3033,7 +3035,7 @@
// Skip next transformation if compressed oops are not used.
if ((UseCompressedOops && !Matcher::gen_narrow_oop_implicit_null_checks()) ||
- (!UseCompressedOops && !UseCompressedKlassPointers))
+ (!UseCompressedOops && !UseCompressedClassPointers))
return;
// Go over safepoints nodes to skip DecodeN/DecodeNKlass nodes for debug edges.
@@ -3611,7 +3613,7 @@
}
void Compile::dump_inlining() {
- if (PrintInlining || PrintIntrinsics NOT_PRODUCT( || PrintOptoInlining)) {
+ if (print_inlining() || print_intrinsics()) {
// Print inlining message for candidates that we couldn't inline
// for lack of space or non constant receiver
for (int i = 0; i < _late_inlines.length(); i++) {
@@ -3635,7 +3637,7 @@
}
}
for (int i = 0; i < _print_inlining_list->length(); i++) {
- tty->print(_print_inlining_list->at(i).ss()->as_string());
+ tty->print(_print_inlining_list->adr_at(i)->ss()->as_string());
}
}
}
--- a/hotspot/src/share/vm/opto/compile.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/compile.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -312,6 +312,8 @@
bool _do_method_data_update; // True if we generate code to update MethodData*s
int _AliasLevel; // Locally-adjusted version of AliasLevel flag.
bool _print_assembly; // True if we should dump assembly code for this compilation
+ bool _print_inlining; // True if we should print inlining for this compilation
+ bool _print_intrinsics; // True if we should print intrinsics for this compilation
#ifndef PRODUCT
bool _trace_opto_output;
bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing
@@ -414,7 +416,7 @@
};
GrowableArray<PrintInliningBuffer>* _print_inlining_list;
- int _print_inlining;
+ int _print_inlining_idx;
// Only keep nodes in the expensive node list that need to be optimized
void cleanup_expensive_nodes(PhaseIterGVN &igvn);
@@ -426,24 +428,24 @@
public:
outputStream* print_inlining_stream() const {
- return _print_inlining_list->at(_print_inlining).ss();
+ return _print_inlining_list->adr_at(_print_inlining_idx)->ss();
}
void print_inlining_skip(CallGenerator* cg) {
- if (PrintInlining) {
- _print_inlining_list->at(_print_inlining).set_cg(cg);
- _print_inlining++;
- _print_inlining_list->insert_before(_print_inlining, PrintInliningBuffer());
+ if (_print_inlining) {
+ _print_inlining_list->adr_at(_print_inlining_idx)->set_cg(cg);
+ _print_inlining_idx++;
+ _print_inlining_list->insert_before(_print_inlining_idx, PrintInliningBuffer());
}
}
void print_inlining_insert(CallGenerator* cg) {
- if (PrintInlining) {
+ if (_print_inlining) {
for (int i = 0; i < _print_inlining_list->length(); i++) {
- if (_print_inlining_list->at(i).cg() == cg) {
+ if (_print_inlining_list->adr_at(i)->cg() == cg) {
_print_inlining_list->insert_before(i+1, PrintInliningBuffer());
- _print_inlining = i+1;
- _print_inlining_list->at(i).set_cg(NULL);
+ _print_inlining_idx = i+1;
+ _print_inlining_list->adr_at(i)->set_cg(NULL);
return;
}
}
@@ -572,6 +574,10 @@
int AliasLevel() const { return _AliasLevel; }
bool print_assembly() const { return _print_assembly; }
void set_print_assembly(bool z) { _print_assembly = z; }
+ bool print_inlining() const { return _print_inlining; }
+ void set_print_inlining(bool z) { _print_inlining = z; }
+ bool print_intrinsics() const { return _print_intrinsics; }
+ void set_print_intrinsics(bool z) { _print_intrinsics = z; }
// check the CompilerOracle for special behaviours for this compile
bool method_has_option(const char * option) {
return method() != NULL && method()->has_option(option);
--- a/hotspot/src/share/vm/opto/connode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/connode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -630,7 +630,7 @@
if (t == Type::TOP) return Type::TOP;
assert (t != TypePtr::NULL_PTR, "null klass?");
- assert(UseCompressedKlassPointers && t->isa_klassptr(), "only klass ptr here");
+ assert(UseCompressedClassPointers && t->isa_klassptr(), "only klass ptr here");
return t->make_narrowklass();
}
--- a/hotspot/src/share/vm/opto/doCall.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/doCall.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -41,9 +41,9 @@
#include "runtime/sharedRuntime.hpp"
void trace_type_profile(Compile* C, ciMethod *method, int depth, int bci, ciMethod *prof_method, ciKlass *prof_klass, int site_count, int receiver_count) {
- if (TraceTypeProfile || PrintInlining NOT_PRODUCT(|| PrintOptoInlining)) {
+ if (TraceTypeProfile || C->print_inlining()) {
outputStream* out = tty;
- if (!PrintInlining) {
+ if (!C->print_inlining()) {
if (NOT_PRODUCT(!PrintOpto &&) !PrintCompilation) {
method->print_short_name();
tty->cr();
@@ -110,6 +110,7 @@
// then we return it as the inlined version of the call.
// We do this before the strict f.p. check below because the
// intrinsics handle strict f.p. correctly.
+ CallGenerator* cg_intrinsic = NULL;
if (allow_inline && allow_intrinsics) {
CallGenerator* cg = find_intrinsic(callee, call_does_dispatch);
if (cg != NULL) {
@@ -121,7 +122,16 @@
cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg);
}
}
- return cg;
+
+ // If intrinsic does the virtual dispatch, we try to use the type profile
+ // first, and hopefully inline it as the regular virtual call below.
+ // We will retry the intrinsic if nothing had claimed it afterwards.
+ if (cg->does_virtual_dispatch()) {
+ cg_intrinsic = cg;
+ cg = NULL;
+ } else {
+ return cg;
+ }
}
}
@@ -266,6 +276,13 @@
}
}
+ // Nothing claimed the intrinsic, we go with straight-forward inlining
+ // for already discovered intrinsic.
+ if (allow_inline && allow_intrinsics && cg_intrinsic != NULL) {
+ assert(cg_intrinsic->does_virtual_dispatch(), "sanity");
+ return cg_intrinsic;
+ }
+
// There was no special inlining tactic, or it bailed out.
// Use a more generic tactic, like a simple call.
if (call_does_dispatch) {
--- a/hotspot/src/share/vm/opto/graphKit.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -3849,9 +3849,9 @@
const TypeInstPtr* string_type = TypeInstPtr::make(TypePtr::NotNull, C->env()->String_klass(),
false, NULL, 0);
const TypePtr* value_field_type = string_type->add_offset(value_offset);
- int value_field_idx = C->get_alias_index(value_field_type);
- store_to_memory(ctrl, basic_plus_adr(str, value_offset),
- value, T_OBJECT, value_field_idx);
+
+ store_oop_to_object(ctrl, str, basic_plus_adr(str, value_offset), value_field_type,
+ value, TypeAryPtr::CHARS, T_OBJECT);
}
void GraphKit::store_String_length(Node* ctrl, Node* str, Node* value) {
--- a/hotspot/src/share/vm/opto/ifnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -76,6 +76,7 @@
if( !i1->is_Bool() ) return NULL;
BoolNode *b = i1->as_Bool();
Node *cmp = b->in(1);
+ if( cmp->is_FlagsProj() ) return NULL;
if( !cmp->is_Cmp() ) return NULL;
i1 = cmp->in(1);
if( i1 == NULL || !i1->is_Phi() ) return NULL;
--- a/hotspot/src/share/vm/opto/lcm.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/lcm.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -472,6 +472,13 @@
break;
}
+ // For nodes that produce a FlagsProj, make the node adjacent to the
+ // use of the FlagsProj
+ if (use->is_FlagsProj() && get_block_for_node(use) == block) {
+ found_machif = true;
+ break;
+ }
+
// More than this instruction pending for successor to be ready,
// don't choose this if other opportunities are ready
if (ready_cnt.at(use->_idx) > 1)
--- a/hotspot/src/share/vm/opto/library_call.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/library_call.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -32,6 +32,7 @@
#include "opto/callGenerator.hpp"
#include "opto/cfgnode.hpp"
#include "opto/idealKit.hpp"
+#include "opto/mathexactnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/parse.hpp"
#include "opto/runtime.hpp"
@@ -46,19 +47,22 @@
private:
bool _is_virtual;
bool _is_predicted;
+ bool _does_virtual_dispatch;
vmIntrinsics::ID _intrinsic_id;
public:
- LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, vmIntrinsics::ID id)
+ LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
: InlineCallGenerator(m),
_is_virtual(is_virtual),
_is_predicted(is_predicted),
+ _does_virtual_dispatch(does_virtual_dispatch),
_intrinsic_id(id)
{
}
virtual bool is_intrinsic() const { return true; }
virtual bool is_virtual() const { return _is_virtual; }
virtual bool is_predicted() const { return _is_predicted; }
+ virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; }
virtual JVMState* generate(JVMState* jvms);
virtual Node* generate_predicate(JVMState* jvms);
vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
@@ -199,6 +203,8 @@
bool inline_math_native(vmIntrinsics::ID id);
bool inline_trig(vmIntrinsics::ID id);
bool inline_math(vmIntrinsics::ID id);
+ bool inline_math_mathExact(Node* math);
+ bool inline_math_addExact();
bool inline_exp();
bool inline_pow();
void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName);
@@ -352,6 +358,7 @@
}
bool is_predicted = false;
+ bool does_virtual_dispatch = false;
switch (id) {
case vmIntrinsics::_compareTo:
@@ -378,8 +385,10 @@
break;
case vmIntrinsics::_hashCode:
if (!InlineObjectHash) return NULL;
+ does_virtual_dispatch = true;
break;
case vmIntrinsics::_clone:
+ does_virtual_dispatch = true;
case vmIntrinsics::_copyOf:
case vmIntrinsics::_copyOfRange:
if (!InlineObjectCopy) return NULL;
@@ -498,6 +507,15 @@
if (!UseCRC32Intrinsics) return NULL;
break;
+ case vmIntrinsics::_addExact:
+ if (!Matcher::match_rule_supported(Op_AddExactI)) {
+ return NULL;
+ }
+ if (!UseMathExactIntrinsics) {
+ return NULL;
+ }
+ break;
+
default:
assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility");
assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?");
@@ -529,7 +547,7 @@
if (!InlineUnsafeOps) return NULL;
}
- return new LibraryIntrinsic(m, is_virtual, is_predicted, (vmIntrinsics::ID) id);
+ return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
}
//----------------------register_library_intrinsics-----------------------
@@ -543,7 +561,7 @@
Compile* C = kit.C;
int nodes = C->unique();
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
char buf[1000];
const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
tty->print_cr("Intrinsic %s", str);
@@ -554,7 +572,7 @@
// Try to inline the intrinsic.
if (kit.try_to_inline()) {
- if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
+ if (C->print_intrinsics() || C->print_inlining()) {
C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
}
C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
@@ -570,7 +588,7 @@
}
// The intrinsic bailed out
- if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
+ if (C->print_intrinsics() || C->print_inlining()) {
if (jvms->has_method()) {
// Not a root compile.
const char* msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)";
@@ -592,7 +610,7 @@
int nodes = C->unique();
#ifndef PRODUCT
assert(is_predicted(), "sanity");
- if ((PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
char buf[1000];
const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
tty->print_cr("Predicate for intrinsic %s", str);
@@ -603,7 +621,7 @@
Node* slow_ctl = kit.try_to_predicate();
if (!kit.failing()) {
- if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
+ if (C->print_intrinsics() || C->print_inlining()) {
C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
}
C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
@@ -617,7 +635,7 @@
}
// The intrinsic bailed out
- if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) {
+ if (C->print_intrinsics() || C->print_inlining()) {
if (jvms->has_method()) {
// Not a root compile.
const char* msg = "failed to generate predicate for intrinsic";
@@ -668,6 +686,8 @@
case vmIntrinsics::_min:
case vmIntrinsics::_max: return inline_min_max(intrinsic_id());
+ case vmIntrinsics::_addExact: return inline_math_addExact();
+
case vmIntrinsics::_arraycopy: return inline_arraycopy();
case vmIntrinsics::_compareTo: return inline_string_compareTo();
@@ -1911,6 +1931,45 @@
return true;
}
+bool LibraryCallKit::inline_math_mathExact(Node* math) {
+ Node* result = _gvn.transform( new(C) ProjNode(math, MathExactNode::result_proj_node));
+ Node* flags = _gvn.transform( new(C) FlagsProjNode(math, MathExactNode::flags_proj_node));
+
+ Node* bol = _gvn.transform( new (C) BoolNode(flags, BoolTest::overflow) );
+ IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
+ Node* fast_path = _gvn.transform( new (C) IfFalseNode(check));
+ Node* slow_path = _gvn.transform( new (C) IfTrueNode(check) );
+
+ {
+ PreserveJVMState pjvms(this);
+ PreserveReexecuteState preexecs(this);
+ jvms()->set_should_reexecute(true);
+
+ set_control(slow_path);
+ set_i_o(i_o());
+
+ uncommon_trap(Deoptimization::Reason_intrinsic,
+ Deoptimization::Action_none);
+ }
+
+ set_control(fast_path);
+ set_result(result);
+ return true;
+}
+
+bool LibraryCallKit::inline_math_addExact() {
+ Node* arg1 = argument(0);
+ Node* arg2 = argument(1);
+
+ Node* add = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2) );
+ if (add->Opcode() == Op_AddExactI) {
+ return inline_math_mathExact(add);
+ } else {
+ set_result(add);
+ }
+ return true;
+}
+
Node*
LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
// These are the candidate return value:
@@ -2299,7 +2358,7 @@
const TypeOopPtr* tjp = TypeOopPtr::make_from_klass(sharpened_klass);
#ifndef PRODUCT
- if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
+ if (C->print_intrinsics() || C->print_inlining()) {
tty->print(" from base type: "); adr_type->dump();
tty->print(" sharpened value: "); tjp->dump();
}
@@ -3260,7 +3319,7 @@
if (mirror_con == NULL) return false; // cannot happen?
#ifndef PRODUCT
- if (PrintIntrinsics || PrintInlining || PrintOptoInlining) {
+ if (C->print_intrinsics() || C->print_inlining()) {
ciType* k = mirror_con->java_mirror_type();
if (k) {
tty->print("Inlining %s on constant Class ", vmIntrinsics::name_at(intrinsic_id()));
@@ -3734,6 +3793,8 @@
RegionNode* slow_region) {
ciMethod* method = callee();
int vtable_index = method->vtable_index();
+ assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
+ err_msg_res("bad index %d", vtable_index));
// Get the Method* out of the appropriate vtable entry.
int entry_offset = (InstanceKlass::vtable_start_offset() +
vtable_index*vtableEntry::size()) * wordSize +
@@ -3784,6 +3845,8 @@
// so the vtable index is fixed.
// No need to use the linkResolver to get it.
vtable_index = method->vtable_index();
+ assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
+ err_msg_res("bad index %d", vtable_index));
}
slow_call = new(C) CallDynamicJavaNode(tf,
SharedRuntime::get_resolve_virtual_call_stub(),
@@ -3948,14 +4011,14 @@
// caller sensitive methods.
bool LibraryCallKit::inline_native_Reflection_getCallerClass() {
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
tty->print_cr("Attempting to inline sun.reflect.Reflection.getCallerClass");
}
#endif
if (!jvms()->has_method()) {
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
tty->print_cr(" Bailing out because intrinsic was inlined at top level");
}
#endif
@@ -3979,7 +4042,7 @@
// Frame 0 and 1 must be caller sensitive (see JVM_GetCallerClass).
if (!m->caller_sensitive()) {
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
tty->print_cr(" Bailing out: CallerSensitive annotation expected at frame %d", n);
}
#endif
@@ -3995,7 +4058,7 @@
set_result(makecon(TypeInstPtr::make(caller_mirror)));
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
tty->print_cr(" Succeeded: caller = %d) %s.%s, JVMS depth = %d", n, caller_klass->name()->as_utf8(), caller_jvms->method()->name()->as_utf8(), jvms()->depth());
tty->print_cr(" JVM state at this point:");
for (int i = jvms()->depth(), n = 1; i >= 1; i--, n++) {
@@ -4011,7 +4074,7 @@
}
#ifndef PRODUCT
- if ((PrintIntrinsics || PrintInlining || PrintOptoInlining) && Verbose) {
+ if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
tty->print_cr(" Bailing out because caller depth exceeded inlining depth = %d", jvms()->depth());
tty->print_cr(" JVM state at this point:");
for (int i = jvms()->depth(), n = 1; i >= 1; i--, n++) {
@@ -4204,7 +4267,7 @@
// 12 - 64-bit VM, compressed klass
// 16 - 64-bit VM, normal klass
if (base_off % BytesPerLong != 0) {
- assert(UseCompressedKlassPointers, "");
+ assert(UseCompressedClassPointers, "");
if (is_array) {
// Exclude length to copy by 8 bytes words.
base_off += sizeof(int);
--- a/hotspot/src/share/vm/opto/live.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/live.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -91,7 +91,7 @@
break;
}
- uint r = _names[n->_idx];
+ uint r = _names.at(n->_idx);
assert(!def_outside->member(r), "Use of external LRG overlaps the same LRG defined in this block");
def->insert( r );
use->remove( r );
@@ -100,7 +100,7 @@
Node *nk = n->in(k);
uint nkidx = nk->_idx;
if (_cfg.get_block_for_node(nk) != block) {
- uint u = _names[nkidx];
+ uint u = _names.at(nkidx);
use->insert(u);
DEBUG_ONLY(def_outside->insert(u);)
}
@@ -112,7 +112,7 @@
#endif
// Remove anything defined by Phis and the block start instruction
for (uint k = i; k > 0; k--) {
- uint r = _names[block->get_node(k - 1)->_idx];
+ uint r = _names.at(block->get_node(k - 1)->_idx);
def->insert(r);
use->remove(r);
}
@@ -124,7 +124,7 @@
// PhiNode uses go in the live-out set of prior blocks.
for (uint k = i; k > 0; k--) {
- add_liveout(p, _names[block->get_node(k-1)->in(l)->_idx], first_pass);
+ add_liveout(p, _names.at(block->get_node(k-1)->in(l)->_idx), first_pass);
}
}
freeset(block);
@@ -256,7 +256,7 @@
tty->print("LiveOut: "); _live[b->_pre_order-1].dump();
uint cnt = b->number_of_nodes();
for( uint i=0; i<cnt; i++ ) {
- tty->print("L%d/", _names[b->get_node(i)->_idx] );
+ tty->print("L%d/", _names.at(b->get_node(i)->_idx));
b->get_node(i)->dump();
}
tty->print("\n");
@@ -321,7 +321,7 @@
#ifdef _LP64
UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_CastPP ||
UseCompressedOops && check->as_Mach()->ideal_Opcode() == Op_DecodeN ||
- UseCompressedKlassPointers && check->as_Mach()->ideal_Opcode() == Op_DecodeNKlass ||
+ UseCompressedClassPointers && check->as_Mach()->ideal_Opcode() == Op_DecodeNKlass ||
#endif
check->as_Mach()->ideal_Opcode() == Op_LoadP ||
check->as_Mach()->ideal_Opcode() == Op_LoadKlass)) {
--- a/hotspot/src/share/vm/opto/live.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/live.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -40,27 +40,7 @@
//------------------------------LRG_List---------------------------------------
// Map Node indices to Live RanGe indices.
// Array lookup in the optimized case.
-class LRG_List : public ResourceObj {
- friend class VMStructs;
- uint _cnt, _max;
- uint* _lidxs;
- ReallocMark _nesting; // assertion check for reallocations
-public:
- LRG_List( uint max );
-
- uint lookup( uint nidx ) const {
- return _lidxs[nidx];
- }
- uint operator[] (uint nidx) const { return lookup(nidx); }
-
- void map( uint nidx, uint lidx ) {
- assert( nidx < _cnt, "oob" );
- _lidxs[nidx] = lidx;
- }
- void extend( uint nidx, uint lidx );
-
- uint Size() const { return _cnt; }
-};
+typedef GrowableArray<uint> LRG_List;
//------------------------------PhaseLive--------------------------------------
// Compute live-in/live-out
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -776,6 +776,9 @@
continue; // not RC
Node *cmp = bol->in(1);
+ if (cmp->is_FlagsProj()) {
+ continue;
+ }
Node *rc_exp = cmp->in(1);
Node *limit = cmp->in(2);
--- a/hotspot/src/share/vm/opto/loopopts.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -2355,7 +2355,8 @@
opc == Op_Catch ||
opc == Op_CatchProj ||
opc == Op_Jump ||
- opc == Op_JumpProj) {
+ opc == Op_JumpProj ||
+ opc == Op_FlagsProj) {
#if !defined(PRODUCT)
if (TracePartialPeeling) {
tty->print_cr("\nExit control too complex: lp: %d", head->_idx);
--- a/hotspot/src/share/vm/opto/machnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/machnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -341,7 +341,7 @@
return TypePtr::BOTTOM;
}
// %%% make offset be intptr_t
- assert(!Universe::heap()->is_in_reserved((oop)offset), "must be a raw ptr");
+ assert(!Universe::heap()->is_in_reserved(cast_to_oop(offset)), "must be a raw ptr");
return TypeRawPtr::BOTTOM;
}
--- a/hotspot/src/share/vm/opto/macro.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/macro.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -2191,7 +2191,7 @@
Node* k_adr = basic_plus_adr(obj, oopDesc::klass_offset_in_bytes());
klass_node = transform_later( LoadKlassNode::make(_igvn, mem, k_adr, _igvn.type(k_adr)->is_ptr()) );
#ifdef _LP64
- if (UseCompressedKlassPointers && klass_node->is_DecodeNKlass()) {
+ if (UseCompressedClassPointers && klass_node->is_DecodeNKlass()) {
assert(klass_node->in(1)->Opcode() == Op_LoadNKlass, "sanity");
klass_node->in(1)->init_req(0, ctrl);
} else
--- a/hotspot/src/share/vm/opto/matcher.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/matcher.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1964,6 +1964,7 @@
case Op_Catch:
case Op_CatchProj:
case Op_CProj:
+ case Op_FlagsProj:
case Op_JumpProj:
case Op_JProj:
case Op_NeverBranch:
--- a/hotspot/src/share/vm/opto/matcher.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/matcher.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -337,6 +337,9 @@
// Register for MODL projection of divmodL
static RegMask modL_proj_mask();
+ static const RegMask mathExactI_result_proj_mask();
+ static const RegMask mathExactI_flags_proj_mask();
+
// Use hardware DIV instruction when it is faster than
// a code which use multiply for division by constant.
static bool use_asm_for_ldiv_by_con( jlong divisor );
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/opto/mathexactnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "memory/allocation.inline.hpp"
+#include "opto/addnode.hpp"
+#include "opto/machnode.hpp"
+#include "opto/mathexactnode.hpp"
+#include "opto/matcher.hpp"
+#include "opto/subnode.hpp"
+
+MathExactNode::MathExactNode(Node* ctrl, Node* n1, Node* n2) : MultiNode(3) {
+ init_req(0, ctrl);
+ init_req(1, n1);
+ init_req(2, n2);
+}
+
+Node* AddExactINode::match(const ProjNode* proj, const Matcher* m) {
+ uint ideal_reg = proj->ideal_reg();
+ RegMask rm;
+ if (proj->_con == result_proj_node) {
+ rm = m->mathExactI_result_proj_mask();
+ } else {
+ assert(proj->_con == flags_proj_node, "must be result or flags");
+ assert(ideal_reg == Op_RegFlags, "sanity");
+ rm = m->mathExactI_flags_proj_mask();
+ }
+ return new (m->C) MachProjNode(this, proj->_con, rm, ideal_reg);
+}
+
+// If the MathExactNode won't overflow we have to replace the
+// FlagsProjNode and ProjNode that is generated by the MathExactNode
+Node* MathExactNode::no_overflow(PhaseGVN *phase, Node* new_result) {
+ PhaseIterGVN *igvn = phase->is_IterGVN();
+ if (igvn) {
+ ProjNode* result = result_node();
+ ProjNode* flags = flags_node();
+
+ if (result != NULL) {
+ igvn->replace_node(result, new_result);
+ }
+
+ if (flags != NULL) {
+ BoolNode* bolnode = (BoolNode *) flags->unique_out();
+ switch (bolnode->_test._test) {
+ case BoolTest::overflow:
+ // if the check is for overflow - never taken
+ igvn->replace_node(bolnode, phase->intcon(0));
+ break;
+ case BoolTest::no_overflow:
+ // if the check is for no overflow - always taken
+ igvn->replace_node(bolnode, phase->intcon(1));
+ break;
+ default:
+ fatal("Unexpected value of BoolTest");
+ break;
+ }
+ flags->del_req(0);
+ }
+ }
+ return new_result;
+}
+
+Node *AddExactINode::Ideal(PhaseGVN *phase, bool can_reshape) {
+ Node *arg1 = in(1);
+ Node *arg2 = in(2);
+
+ const Type* type1 = phase->type(arg1);
+ const Type* type2 = phase->type(arg2);
+
+ if (type1 != Type::TOP && type1->singleton() &&
+ type2 != Type::TOP && type2->singleton()) {
+ jint val1 = arg1->get_int();
+ jint val2 = arg2->get_int();
+ jint result = val1 + val2;
+ // Hacker's Delight 2-12 Overflow if both arguments have the opposite sign of the result
+ if ( (((val1 ^ result) & (val2 ^ result)) >= 0)) {
+ Node* con_result = ConINode::make(phase->C, result);
+ return no_overflow(phase, con_result);
+ }
+ return NULL;
+ }
+
+ if (type1 == TypeInt::ZERO) { // (Add 0 x) == x
+ Node* add_result = new (phase->C) AddINode(arg1, arg2);
+ return no_overflow(phase, add_result);
+ }
+
+ if (type2 == TypeInt::ZERO) { // (Add x 0) == x
+ Node* add_result = new (phase->C) AddINode(arg1, arg2);
+ return no_overflow(phase, add_result);
+ }
+
+ if (type2->singleton()) {
+ return NULL; // no change - keep constant on the right
+ }
+
+ if (type1->singleton()) {
+ // Make it x + Constant - move constant to the right
+ swap_edges(1, 2);
+ return this;
+ }
+
+ if (arg2->is_Load()) {
+ return NULL; // no change - keep load on the right
+ }
+
+ if (arg1->is_Load()) {
+ // Make it x + Load - move load to the right
+ swap_edges(1, 2);
+ return this;
+ }
+
+ if (arg1->_idx > arg2->_idx) {
+ // Sort the edges
+ swap_edges(1, 2);
+ return this;
+ }
+
+ return NULL;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/opto/mathexactnode.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#ifndef SHARE_VM_OPTO_MATHEXACTNODE_HPP
+#define SHARE_VM_OPTO_MATHEXACTNODE_HPP
+
+#include "opto/multnode.hpp"
+#include "opto/node.hpp"
+#include "opto/type.hpp"
+
+class Node;
+
+class PhaseGVN;
+class PhaseTransform;
+
+class MathExactNode : public MultiNode {
+public:
+ MathExactNode(Node* ctrl, Node* in1, Node* in2);
+ enum {
+ result_proj_node = 0,
+ flags_proj_node = 1
+ };
+ virtual int Opcode() const;
+ virtual Node* Identity(PhaseTransform* phase) { return this; }
+ virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; }
+ virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); }
+ virtual uint hash() const { return Node::hash(); }
+ virtual bool is_CFG() const { return false; }
+ virtual uint ideal_reg() const { return NotAMachineReg; }
+
+ ProjNode* result_node() { return proj_out(result_proj_node); }
+ ProjNode* flags_node() { return proj_out(flags_proj_node); }
+protected:
+ Node* no_overflow(PhaseGVN *phase, Node* new_result);
+};
+
+class AddExactINode : public MathExactNode {
+public:
+ AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {}
+ virtual int Opcode() const;
+ virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; }
+ virtual Node* match(const ProjNode* proj, const Matcher* m);
+ virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
+};
+
+class FlagsProjNode : public ProjNode {
+public:
+ FlagsProjNode(Node* src, uint con) : ProjNode(src, con) {
+ init_class_id(Class_FlagsProj);
+ }
+
+ virtual int Opcode() const;
+ virtual bool is_CFG() const { return false; }
+ virtual const Type* bottom_type() const { return TypeInt::CC; }
+ virtual uint ideal_reg() const { return Op_RegFlags; }
+};
+
+
+#endif
+
--- a/hotspot/src/share/vm/opto/memnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/memnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -2031,7 +2031,7 @@
assert(adr_type != NULL, "expecting TypeKlassPtr");
#ifdef _LP64
if (adr_type->is_ptr_to_narrowklass()) {
- assert(UseCompressedKlassPointers, "no compressed klasses");
+ assert(UseCompressedClassPointers, "no compressed klasses");
Node* load_klass = gvn.transform(new (C) LoadNKlassNode(ctl, mem, adr, at, tk->make_narrowklass()));
return new (C) DecodeNKlassNode(load_klass, load_klass->bottom_type()->make_ptr());
}
@@ -2369,7 +2369,7 @@
val = gvn.transform(new (C) EncodePNode(val, val->bottom_type()->make_narrowoop()));
return new (C) StoreNNode(ctl, mem, adr, adr_type, val);
} else if (adr->bottom_type()->is_ptr_to_narrowklass() ||
- (UseCompressedKlassPointers && val->bottom_type()->isa_klassptr() &&
+ (UseCompressedClassPointers && val->bottom_type()->isa_klassptr() &&
adr->bottom_type()->isa_rawptr())) {
val = gvn.transform(new (C) EncodePKlassNode(val, val->bottom_type()->make_narrowklass()));
return new (C) StoreNKlassNode(ctl, mem, adr, adr_type, val);
--- a/hotspot/src/share/vm/opto/multnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/multnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "opto/callnode.hpp"
#include "opto/matcher.hpp"
+#include "opto/mathexactnode.hpp"
#include "opto/multnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
@@ -46,15 +47,21 @@
assert(Opcode() != Op_If || outcnt() == 2, "bad if #1");
for( DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++ ) {
Node *p = fast_out(i);
- if( !p->is_Proj() ) {
+ if (p->is_Proj()) {
+ ProjNode *proj = p->as_Proj();
+ if (proj->_con == which_proj) {
+ assert(Opcode() != Op_If || proj->Opcode() == (which_proj?Op_IfTrue:Op_IfFalse), "bad if #2");
+ return proj;
+ }
+ } else if (p->is_FlagsProj()) {
+ FlagsProjNode *proj = p->as_FlagsProj();
+ if (proj->_con == which_proj) {
+ return proj;
+ }
+ } else {
assert(p == this && this->is_Start(), "else must be proj");
continue;
}
- ProjNode *proj = p->as_Proj();
- if( proj->_con == which_proj ) {
- assert(Opcode() != Op_If || proj->Opcode() == (which_proj?Op_IfTrue:Op_IfFalse), "bad if #2");
- return proj;
- }
}
return NULL;
}
--- a/hotspot/src/share/vm/opto/node.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/node.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -69,6 +69,7 @@
class EncodePKlassNode;
class FastLockNode;
class FastUnlockNode;
+class FlagsProjNode;
class IfNode;
class IfFalseNode;
class IfTrueNode;
@@ -623,6 +624,7 @@
DEFINE_CLASS_ID(Cmp, Sub, 0)
DEFINE_CLASS_ID(FastLock, Cmp, 0)
DEFINE_CLASS_ID(FastUnlock, Cmp, 1)
+ DEFINE_CLASS_ID(FlagsProj, Cmp, 2)
DEFINE_CLASS_ID(MergeMem, Node, 7)
DEFINE_CLASS_ID(Bool, Node, 8)
@@ -726,6 +728,7 @@
DEFINE_CLASS_QUERY(EncodePKlass)
DEFINE_CLASS_QUERY(FastLock)
DEFINE_CLASS_QUERY(FastUnlock)
+ DEFINE_CLASS_QUERY(FlagsProj)
DEFINE_CLASS_QUERY(If)
DEFINE_CLASS_QUERY(IfFalse)
DEFINE_CLASS_QUERY(IfTrue)
--- a/hotspot/src/share/vm/opto/subnode.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/subnode.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1064,7 +1064,7 @@
// Print special per-node info
#ifndef PRODUCT
void BoolTest::dump_on(outputStream *st) const {
- const char *msg[] = {"eq","gt","??","lt","ne","le","??","ge"};
+ const char *msg[] = {"eq","gt","of","lt","ne","le","nof","ge"};
st->print(msg[_test]);
}
#endif
@@ -1126,7 +1126,7 @@
Node *cmp = in(1);
if( !cmp->is_Sub() ) return NULL;
int cop = cmp->Opcode();
- if( cop == Op_FastLock || cop == Op_FastUnlock ) return NULL;
+ if( cop == Op_FastLock || cop == Op_FastUnlock || cop == Op_FlagsProj) return NULL;
Node *cmp1 = cmp->in(1);
Node *cmp2 = cmp->in(2);
if( !cmp1 ) return NULL;
--- a/hotspot/src/share/vm/opto/subnode.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/subnode.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -263,16 +263,16 @@
// We pick the values as 3 bits; the low order 2 bits we compare against the
// condition codes, the high bit flips the sense of the result.
struct BoolTest VALUE_OBJ_CLASS_SPEC {
- enum mask { eq = 0, ne = 4, le = 5, ge = 7, lt = 3, gt = 1, illegal = 8 };
+ enum mask { eq = 0, ne = 4, le = 5, ge = 7, lt = 3, gt = 1, overflow = 2, no_overflow = 6, illegal = 8 };
mask _test;
BoolTest( mask btm ) : _test(btm) {}
const Type *cc2logical( const Type *CC ) const;
// Commute the test. I use a small table lookup. The table is created as
// a simple char array where each element is the ASCII version of a 'mask'
// enum from above.
- mask commute( ) const { return mask("038147858"[_test]-'0'); }
+ mask commute( ) const { return mask("032147658"[_test]-'0'); }
mask negate( ) const { return mask(_test^4); }
- bool is_canonical( ) const { return (_test == BoolTest::ne || _test == BoolTest::lt || _test == BoolTest::le); }
+ bool is_canonical( ) const { return (_test == BoolTest::ne || _test == BoolTest::lt || _test == BoolTest::le || _test == BoolTest::overflow); }
#ifndef PRODUCT
void dump_on(outputStream *st) const;
#endif
--- a/hotspot/src/share/vm/opto/type.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/type.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -430,6 +430,11 @@
longpair[1] = TypeLong::LONG;
TypeTuple::LONG_PAIR = TypeTuple::make(2, longpair);
+ const Type **intccpair = TypeTuple::fields(2);
+ intccpair[0] = TypeInt::INT;
+ intccpair[1] = TypeInt::CC;
+ TypeTuple::INT_CC_PAIR = TypeTuple::make(2, intccpair);
+
_const_basic_type[T_NARROWOOP] = TypeNarrowOop::BOTTOM;
_const_basic_type[T_NARROWKLASS] = Type::BOTTOM;
_const_basic_type[T_BOOLEAN] = TypeInt::BOOL;
@@ -1646,6 +1651,7 @@
const TypeTuple *TypeTuple::START_I2C;
const TypeTuple *TypeTuple::INT_PAIR;
const TypeTuple *TypeTuple::LONG_PAIR;
+const TypeTuple *TypeTuple::INT_CC_PAIR;
//------------------------------make-------------------------------------------
@@ -2416,7 +2422,7 @@
#ifdef _LP64
if (_offset != 0) {
if (_offset == oopDesc::klass_offset_in_bytes()) {
- _is_ptr_to_narrowklass = UseCompressedKlassPointers;
+ _is_ptr_to_narrowklass = UseCompressedClassPointers;
} else if (klass() == NULL) {
// Array with unknown body type
assert(this->isa_aryptr(), "only arrays without klass");
--- a/hotspot/src/share/vm/opto/type.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/opto/type.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -584,6 +584,7 @@
static const TypeTuple *START_I2C;
static const TypeTuple *INT_PAIR;
static const TypeTuple *LONG_PAIR;
+ static const TypeTuple *INT_CC_PAIR;
#ifndef PRODUCT
virtual void dump2( Dict &d, uint, outputStream *st ) const; // Specialized per-Type dumping
#endif
--- a/hotspot/src/share/vm/prims/jni.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jni.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1336,6 +1336,7 @@
if (call_type == JNI_VIRTUAL) {
// jni_GetMethodID makes sure class is linked and initialized
// so m should have a valid vtable index.
+ assert(!m->has_itable_index(), "");
int vtbl_index = m->vtable_index();
if (vtbl_index != Method::nonvirtual_vtable_index) {
Klass* k = h_recv->klass();
@@ -1355,12 +1356,7 @@
// interface call
KlassHandle h_holder(THREAD, holder);
- int itbl_index = m->cached_itable_index();
- if (itbl_index == -1) {
- itbl_index = klassItable::compute_itable_index(m);
- m->set_cached_itable_index(itbl_index);
- // the above may have grabbed a lock, 'm' and anything non-handlized can't be used again
- }
+ int itbl_index = m->itable_index();
Klass* k = h_recv->klass();
selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
}
@@ -5037,6 +5033,7 @@
#include "gc_implementation/g1/heapRegionRemSet.hpp"
#endif
#include "utilities/quickSort.hpp"
+#include "utilities/ostream.hpp"
#if INCLUDE_VM_STRUCTS
#include "runtime/vmStructs.hpp"
#endif
@@ -5048,22 +5045,31 @@
// Forward declaration
void TestReservedSpace_test();
void TestReserveMemorySpecial_test();
+void TestVirtualSpace_test();
+void TestMetaspaceAux_test();
+#if INCLUDE_ALL_GCS
+void TestG1BiasedArray_test();
+#endif
void execute_internal_vm_tests() {
if (ExecuteInternalVMTests) {
tty->print_cr("Running internal VM tests");
run_unit_test(TestReservedSpace_test());
run_unit_test(TestReserveMemorySpecial_test());
+ run_unit_test(TestVirtualSpace_test());
+ run_unit_test(TestMetaspaceAux_test());
run_unit_test(GlobalDefinitions::test_globals());
run_unit_test(GCTimerAllTest::all());
run_unit_test(arrayOopDesc::test_max_array_length());
run_unit_test(CollectedHeap::test_is_in());
run_unit_test(QuickSort::test_quick_sort());
run_unit_test(AltHashing::test_alt_hash());
+ run_unit_test(test_loggc_filename());
#if INCLUDE_VM_STRUCTS
run_unit_test(VMStructs::test());
#endif
#if INCLUDE_ALL_GCS
+ run_unit_test(TestG1BiasedArray_test());
run_unit_test(HeapRegionRemSet::test_prt());
#endif
tty->print_cr("All internal VM tests passed");
--- a/hotspot/src/share/vm/prims/jvm.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvm.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1824,7 +1824,7 @@
}
if (!publicOnly || fs.access_flags().is_public()) {
- fd.initialize(k(), fs.index());
+ fd.reinitialize(k(), fs.index());
oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL);
result->obj_at_put(out_idx, field);
++out_idx;
@@ -1835,16 +1835,27 @@
}
JVM_END
-JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
-{
- JVMWrapper("JVM_GetClassDeclaredMethods");
+static bool select_method(methodHandle method, bool want_constructor) {
+ if (want_constructor) {
+ return (method->is_initializer() && !method->is_static());
+ } else {
+ return (!method->is_initializer() && !method->is_overpass());
+ }
+}
+
+static jobjectArray get_class_declared_methods_helper(
+ JNIEnv *env,
+ jclass ofClass, jboolean publicOnly,
+ bool want_constructor,
+ Klass* klass, TRAPS) {
+
JvmtiVMObjectAllocEventCollector oam;
// Exclude primitive types and array types
if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
|| java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
// Return empty array
- oop res = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), 0, CHECK_NULL);
+ oop res = oopFactory::new_objArray(klass, 0, CHECK_NULL);
return (jobjectArray) JNIHandles::make_local(env, res);
}
@@ -1855,87 +1866,67 @@
Array<Method*>* methods = k->methods();
int methods_length = methods->length();
+
+ // Save original method_idnum in case of redefinition, which can change
+ // the idnum of obsolete methods. The new method will have the same idnum
+ // but if we refresh the methods array, the counts will be wrong.
+ ResourceMark rm(THREAD);
+ GrowableArray<int>* idnums = new GrowableArray<int>(methods_length);
int num_methods = 0;
- int i;
- for (i = 0; i < methods_length; i++) {
+ for (int i = 0; i < methods_length; i++) {
methodHandle method(THREAD, methods->at(i));
- if (!method->is_initializer() && !method->is_overpass()) {
+ if (select_method(method, want_constructor)) {
if (!publicOnly || method->is_public()) {
+ idnums->push(method->method_idnum());
++num_methods;
}
}
}
// Allocate result
- objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Method_klass(), num_methods, CHECK_NULL);
+ objArrayOop r = oopFactory::new_objArray(klass, num_methods, CHECK_NULL);
objArrayHandle result (THREAD, r);
- int out_idx = 0;
- for (i = 0; i < methods_length; i++) {
- methodHandle method(THREAD, methods->at(i));
- if (!method->is_initializer() && !method->is_overpass()) {
- if (!publicOnly || method->is_public()) {
- oop m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
- result->obj_at_put(out_idx, m);
- ++out_idx;
+ // Now just put the methods that we selected above, but go by their idnum
+ // in case of redefinition. The methods can be redefined at any safepoint,
+ // so above when allocating the oop array and below when creating reflect
+ // objects.
+ for (int i = 0; i < num_methods; i++) {
+ methodHandle method(THREAD, k->method_with_idnum(idnums->at(i)));
+ if (method.is_null()) {
+ // Method may have been deleted and seems this API can handle null
+ // Otherwise should probably put a method that throws NSME
+ result->obj_at_put(i, NULL);
+ } else {
+ oop m;
+ if (want_constructor) {
+ m = Reflection::new_constructor(method, CHECK_NULL);
+ } else {
+ m = Reflection::new_method(method, UseNewReflection, false, CHECK_NULL);
}
+ result->obj_at_put(i, m);
}
}
- assert(out_idx == num_methods, "just checking");
+
return (jobjectArray) JNIHandles::make_local(env, result());
}
+
+JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredMethods(JNIEnv *env, jclass ofClass, jboolean publicOnly))
+{
+ JVMWrapper("JVM_GetClassDeclaredMethods");
+ return get_class_declared_methods_helper(env, ofClass, publicOnly,
+ /*want_constructor*/ false,
+ SystemDictionary::reflect_Method_klass(), THREAD);
+}
JVM_END
JVM_ENTRY(jobjectArray, JVM_GetClassDeclaredConstructors(JNIEnv *env, jclass ofClass, jboolean publicOnly))
{
JVMWrapper("JVM_GetClassDeclaredConstructors");
- JvmtiVMObjectAllocEventCollector oam;
-
- // Exclude primitive types and array types
- if (java_lang_Class::is_primitive(JNIHandles::resolve_non_null(ofClass))
- || java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass))->oop_is_array()) {
- // Return empty array
- oop res = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0 , CHECK_NULL);
- return (jobjectArray) JNIHandles::make_local(env, res);
- }
-
- instanceKlassHandle k(THREAD, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(ofClass)));
-
- // Ensure class is linked
- k->link_class(CHECK_NULL);
-
- Array<Method*>* methods = k->methods();
- int methods_length = methods->length();
- int num_constructors = 0;
-
- int i;
- for (i = 0; i < methods_length; i++) {
- methodHandle method(THREAD, methods->at(i));
- if (method->is_initializer() && !method->is_static()) {
- if (!publicOnly || method->is_public()) {
- ++num_constructors;
- }
- }
- }
-
- // Allocate result
- objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), num_constructors, CHECK_NULL);
- objArrayHandle result(THREAD, r);
-
- int out_idx = 0;
- for (i = 0; i < methods_length; i++) {
- methodHandle method(THREAD, methods->at(i));
- if (method->is_initializer() && !method->is_static()) {
- if (!publicOnly || method->is_public()) {
- oop m = Reflection::new_constructor(method, CHECK_NULL);
- result->obj_at_put(out_idx, m);
- ++out_idx;
- }
- }
- }
- assert(out_idx == num_constructors, "just checking");
- return (jobjectArray) JNIHandles::make_local(env, result());
+ return get_class_declared_methods_helper(env, ofClass, publicOnly,
+ /*want_constructor*/ true,
+ SystemDictionary::reflect_Constructor_klass(), THREAD);
}
JVM_END
@@ -4235,13 +4226,13 @@
JVM_LEAF(jboolean, JVM_AccessVMBooleanFlag(const char* name, jboolean* value, jboolean is_get))
JVMWrapper("JVM_AccessBoolVMFlag");
- return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, INTERNAL);
+ return is_get ? CommandLineFlags::boolAt((char*) name, (bool*) value) : CommandLineFlags::boolAtPut((char*) name, (bool*) value, Flag::INTERNAL);
JVM_END
JVM_LEAF(jboolean, JVM_AccessVMIntFlag(const char* name, jint* value, jboolean is_get))
JVMWrapper("JVM_AccessVMIntFlag");
intx v;
- jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, INTERNAL);
+ jboolean result = is_get ? CommandLineFlags::intxAt((char*) name, &v) : CommandLineFlags::intxAtPut((char*) name, &v, Flag::INTERNAL);
*value = (jint)v;
return result;
JVM_END
--- a/hotspot/src/share/vm/prims/jvmti.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmti.xml Thu Oct 03 19:18:54 2013 +0100
@@ -458,8 +458,10 @@
the same name from being loaded dynamically.
<p/>
The VM will invoke the Agent_OnUnload_L function of the agent, if such
- a function is exported, at the same point during startup as it would
- have called the dynamic entry point Agent_OnUnLoad.
+ a function is exported, at the same point during VM execution as it would
+ have called the dynamic entry point Agent_OnUnLoad. A statically loaded
+ agent cannot be unloaded. The Agent_OnUnload_L function will still be
+ called to do any other agent shutdown related tasks.
If a <i>statically linked</i> agent L exports a function called
Agent_OnUnLoad_L and a function called Agent_OnUnLoad, the Agent_OnUnLoad
function will be ignored.
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -406,7 +406,11 @@
VMOp_Type type() const { return VMOp_GetCurrentContendedMonitor; }
jvmtiError result() { return _result; }
void doit() {
- _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr);
+ _result = JVMTI_ERROR_THREAD_NOT_ALIVE;
+ if (Threads::includes(_java_thread) && !_java_thread->is_exiting() &&
+ _java_thread->threadObj() != NULL) {
+ _result = ((JvmtiEnvBase *)_env)->get_current_contended_monitor(_calling_thread,_java_thread,_owned_monitor_ptr);
+ }
}
};
--- a/hotspot/src/share/vm/prims/jvmtiImpl.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -273,59 +273,49 @@
// add/remove breakpoint to/from versions of the method that
// are EMCP. Directly or transitively obsolete methods are
- // not saved in the PreviousVersionInfo.
+ // not saved in the PreviousVersionNodes.
Thread *thread = Thread::current();
instanceKlassHandle ikh = instanceKlassHandle(thread, _method->method_holder());
Symbol* m_name = _method->name();
Symbol* m_signature = _method->signature();
- {
- ResourceMark rm(thread);
- // PreviousVersionInfo objects returned via PreviousVersionWalker
- // contain a GrowableArray of handles. We have to clean up the
- // GrowableArray _after_ the PreviousVersionWalker destructor
- // has destroyed the handles.
- {
- // search previous versions if they exist
- PreviousVersionWalker pvw((InstanceKlass *)ikh());
- for (PreviousVersionInfo * pv_info = pvw.next_previous_version();
- pv_info != NULL; pv_info = pvw.next_previous_version()) {
- GrowableArray<methodHandle>* methods =
- pv_info->prev_EMCP_method_handles();
+ // search previous versions if they exist
+ PreviousVersionWalker pvw(thread, (InstanceKlass *)ikh());
+ for (PreviousVersionNode * pv_node = pvw.next_previous_version();
+ pv_node != NULL; pv_node = pvw.next_previous_version()) {
+ GrowableArray<Method*>* methods = pv_node->prev_EMCP_methods();
- if (methods == NULL) {
- // We have run into a PreviousVersion generation where
- // all methods were made obsolete during that generation's
- // RedefineClasses() operation. At the time of that
- // operation, all EMCP methods were flushed so we don't
- // have to go back any further.
- //
- // A NULL methods array is different than an empty methods
- // array. We cannot infer any optimizations about older
- // generations from an empty methods array for the current
- // generation.
- break;
- }
+ if (methods == NULL) {
+ // We have run into a PreviousVersion generation where
+ // all methods were made obsolete during that generation's
+ // RedefineClasses() operation. At the time of that
+ // operation, all EMCP methods were flushed so we don't
+ // have to go back any further.
+ //
+ // A NULL methods array is different than an empty methods
+ // array. We cannot infer any optimizations about older
+ // generations from an empty methods array for the current
+ // generation.
+ break;
+ }
- for (int i = methods->length() - 1; i >= 0; i--) {
- methodHandle method = methods->at(i);
- // obsolete methods that are running are not deleted from
- // previous version array, but they are skipped here.
- if (!method->is_obsolete() &&
- method->name() == m_name &&
- method->signature() == m_signature) {
- RC_TRACE(0x00000800, ("%sing breakpoint in %s(%s)",
- meth_act == &Method::set_breakpoint ? "sett" : "clear",
- method->name()->as_C_string(),
- method->signature()->as_C_string()));
+ for (int i = methods->length() - 1; i >= 0; i--) {
+ Method* method = methods->at(i);
+ // obsolete methods that are running are not deleted from
+ // previous version array, but they are skipped here.
+ if (!method->is_obsolete() &&
+ method->name() == m_name &&
+ method->signature() == m_signature) {
+ RC_TRACE(0x00000800, ("%sing breakpoint in %s(%s)",
+ meth_act == &Method::set_breakpoint ? "sett" : "clear",
+ method->name()->as_C_string(),
+ method->signature()->as_C_string()));
- ((Method*)method()->*meth_act)(_bci);
- break;
- }
- }
+ (method->*meth_act)(_bci);
+ break;
}
- } // pvw is cleaned up
- } // rm is cleaned up
+ }
+ }
}
void JvmtiBreakpoint::set() {
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1072,8 +1072,17 @@
}
res = merge_cp_and_rewrite(the_class, scratch_class, THREAD);
- if (res != JVMTI_ERROR_NONE) {
- return res;
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
+ RC_TRACE_WITH_THREAD(0x00000002, THREAD,
+ ("merge_cp_and_rewrite exception: '%s'", ex_name->as_C_string()));
+ CLEAR_PENDING_EXCEPTION;
+ if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) {
+ return JVMTI_ERROR_OUT_OF_MEMORY;
+ } else {
+ return JVMTI_ERROR_INTERNAL;
+ }
}
if (VerifyMergedCPBytecodes) {
@@ -1105,6 +1114,9 @@
}
if (HAS_PENDING_EXCEPTION) {
Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
+ RC_TRACE_WITH_THREAD(0x00000002, THREAD,
+ ("Rewriter::rewrite or link_methods exception: '%s'", ex_name->as_C_string()));
CLEAR_PENDING_EXCEPTION;
if (ex_name == vmSymbols::java_lang_OutOfMemoryError()) {
return JVMTI_ERROR_OUT_OF_MEMORY;
@@ -1395,8 +1407,8 @@
ClassLoaderData* loader_data = the_class->class_loader_data();
ConstantPool* merge_cp_oop =
ConstantPool::allocate(loader_data,
- merge_cp_length,
- THREAD);
+ merge_cp_length,
+ CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
MergeCPCleaner cp_cleaner(loader_data, merge_cp_oop);
HandleMark hm(THREAD); // make sure handles are cleared before
@@ -1472,7 +1484,8 @@
// Replace the new constant pool with a shrunken copy of the
// merged constant pool
- set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD);
+ set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length,
+ CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
// The new constant pool replaces scratch_cp so have cleaner clean it up.
// It can't be cleaned up while there are handles to it.
cp_cleaner.add_scratch_cp(scratch_cp());
@@ -1502,7 +1515,8 @@
// merged constant pool so now the rewritten bytecodes have
// valid references; the previous new constant pool will get
// GCed.
- set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length, THREAD);
+ set_new_constant_pool(loader_data, scratch_class, merge_cp, merge_cp_length,
+ CHECK_(JVMTI_ERROR_OUT_OF_MEMORY));
// The new constant pool replaces scratch_cp so have cleaner clean it up.
// It can't be cleaned up while there are handles to it.
cp_cleaner.add_scratch_cp(scratch_cp());
@@ -1590,11 +1604,23 @@
for (int i = methods->length() - 1; i >= 0; i--) {
methodHandle method(THREAD, methods->at(i));
methodHandle new_method;
- rewrite_cp_refs_in_method(method, &new_method, CHECK_false);
+ rewrite_cp_refs_in_method(method, &new_method, THREAD);
if (!new_method.is_null()) {
// the method has been replaced so save the new method version
+ // even in the case of an exception. original method is on the
+ // deallocation list.
methods->at_put(i, new_method());
}
+ if (HAS_PENDING_EXCEPTION) {
+ Symbol* ex_name = PENDING_EXCEPTION->klass()->name();
+ // RC_TRACE_WITH_THREAD macro has an embedded ResourceMark
+ RC_TRACE_WITH_THREAD(0x00000002, THREAD,
+ ("rewrite_cp_refs_in_method exception: '%s'", ex_name->as_C_string()));
+ // Need to clear pending exception here as the super caller sets
+ // the JVMTI_ERROR_INTERNAL if the returned value is false.
+ CLEAR_PENDING_EXCEPTION;
+ return false;
+ }
}
return true;
@@ -1674,10 +1700,7 @@
Pause_No_Safepoint_Verifier pnsv(&nsv);
// ldc is 2 bytes and ldc_w is 3 bytes
- m = rc.insert_space_at(bci, 3, inst_buffer, THREAD);
- if (m.is_null() || HAS_PENDING_EXCEPTION) {
- guarantee(false, "insert_space_at() failed");
- }
+ m = rc.insert_space_at(bci, 3, inst_buffer, CHECK);
}
// return the new method so that the caller can update
@@ -2487,8 +2510,8 @@
// scratch_cp is a merged constant pool and has enough space for a
// worst case merge situation. We want to associate the minimum
// sized constant pool with the klass to save space.
- constantPoolHandle smaller_cp(THREAD,
- ConstantPool::allocate(loader_data, scratch_cp_length, THREAD));
+ ConstantPool* cp = ConstantPool::allocate(loader_data, scratch_cp_length, CHECK);
+ constantPoolHandle smaller_cp(THREAD, cp);
// preserve version() value in the smaller copy
int version = scratch_cp->version();
@@ -2500,6 +2523,11 @@
smaller_cp->set_pool_holder(scratch_class());
scratch_cp->copy_cp_to(1, scratch_cp_length - 1, smaller_cp, 1, THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ // Exception is handled in the caller
+ loader_data->add_to_deallocate_list(smaller_cp());
+ return;
+ }
scratch_cp = smaller_cp;
// attach new constant pool to klass
@@ -2779,28 +2807,20 @@
&trace_name_printed);
}
}
- {
- ResourceMark rm(_thread);
- // PreviousVersionInfo objects returned via PreviousVersionWalker
- // contain a GrowableArray of handles. We have to clean up the
- // GrowableArray _after_ the PreviousVersionWalker destructor
- // has destroyed the handles.
- {
- // the previous versions' constant pool caches may need adjustment
- PreviousVersionWalker pvw(ik);
- for (PreviousVersionInfo * pv_info = pvw.next_previous_version();
- pv_info != NULL; pv_info = pvw.next_previous_version()) {
- other_cp = pv_info->prev_constant_pool_handle();
- cp_cache = other_cp->cache();
- if (cp_cache != NULL) {
- cp_cache->adjust_method_entries(_matching_old_methods,
- _matching_new_methods,
- _matching_methods_length,
- &trace_name_printed);
- }
- }
- } // pvw is cleaned up
- } // rm is cleaned up
+
+ // the previous versions' constant pool caches may need adjustment
+ PreviousVersionWalker pvw(_thread, ik);
+ for (PreviousVersionNode * pv_node = pvw.next_previous_version();
+ pv_node != NULL; pv_node = pvw.next_previous_version()) {
+ other_cp = pv_node->prev_constant_pool();
+ cp_cache = other_cp->cache();
+ if (cp_cache != NULL) {
+ cp_cache->adjust_method_entries(_matching_old_methods,
+ _matching_new_methods,
+ _matching_methods_length,
+ &trace_name_printed);
+ }
+ }
}
}
@@ -2914,10 +2934,9 @@
// obsolete methods need a unique idnum
u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum();
if (num != ConstMethod::UNSET_IDNUM) {
-// u2 old_num = old_method->method_idnum();
old_method->set_method_idnum(num);
-// TO DO: attach obsolete annotations to obsolete method's new idnum
}
+
// With tracing we try not to "yack" too much. The position of
// this trace assumes there are fewer obsolete methods than
// EMCP methods.
@@ -2930,7 +2949,7 @@
for (int i = 0; i < _deleted_methods_length; ++i) {
Method* old_method = _deleted_methods[i];
- assert(old_method->vtable_index() < 0,
+ assert(!old_method->has_vtable_index(),
"cannot delete methods with vtable entries");;
// Mark all deleted methods as old and obsolete
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -165,7 +165,7 @@
static unsigned int hash(oop key, int size) {
// shift right to get better distribution (as these bits will be zero
// with aligned addresses)
- unsigned int addr = (unsigned int)((intptr_t)key);
+ unsigned int addr = (unsigned int)(cast_from_oop<intptr_t>(key));
#ifdef _LP64
return (addr >> 3) % size;
#else
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -127,25 +127,37 @@
}
oop MethodHandles::init_MemberName(Handle mname, Handle target) {
+ // This method is used from java.lang.invoke.MemberName constructors.
+ // It fills in the new MemberName from a java.lang.reflect.Member.
Thread* thread = Thread::current();
oop target_oop = target();
Klass* target_klass = target_oop->klass();
if (target_klass == SystemDictionary::reflect_Field_klass()) {
oop clazz = java_lang_reflect_Field::clazz(target_oop); // fd.field_holder()
int slot = java_lang_reflect_Field::slot(target_oop); // fd.index()
- int mods = java_lang_reflect_Field::modifiers(target_oop);
- oop type = java_lang_reflect_Field::type(target_oop);
- oop name = java_lang_reflect_Field::name(target_oop);
KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
- intptr_t offset = InstanceKlass::cast(k())->field_offset(slot);
- return init_field_MemberName(mname, k, accessFlags_from(mods), type, name, offset);
+ if (!k.is_null() && k->oop_is_instance()) {
+ fieldDescriptor fd(InstanceKlass::cast(k()), slot);
+ oop mname2 = init_field_MemberName(mname, fd);
+ if (mname2 != NULL) {
+ // Since we have the reified name and type handy, add them to the result.
+ if (java_lang_invoke_MemberName::name(mname2) == NULL)
+ java_lang_invoke_MemberName::set_name(mname2, java_lang_reflect_Field::name(target_oop));
+ if (java_lang_invoke_MemberName::type(mname2) == NULL)
+ java_lang_invoke_MemberName::set_type(mname2, java_lang_reflect_Field::type(target_oop));
+ }
+ return mname2;
+ }
} else if (target_klass == SystemDictionary::reflect_Method_klass()) {
oop clazz = java_lang_reflect_Method::clazz(target_oop);
int slot = java_lang_reflect_Method::slot(target_oop);
KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
if (!k.is_null() && k->oop_is_instance()) {
Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
- return init_method_MemberName(mname, m, true, k);
+ if (m == NULL || is_signature_polymorphic(m->intrinsic_id()))
+ return NULL; // do not resolve unless there is a concrete signature
+ CallInfo info(m, k());
+ return init_method_MemberName(mname, info);
}
} else if (target_klass == SystemDictionary::reflect_Constructor_klass()) {
oop clazz = java_lang_reflect_Constructor::clazz(target_oop);
@@ -153,65 +165,50 @@
KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
if (!k.is_null() && k->oop_is_instance()) {
Method* m = InstanceKlass::cast(k())->method_with_idnum(slot);
- return init_method_MemberName(mname, m, false, k);
- }
- } else if (target_klass == SystemDictionary::MemberName_klass()) {
- // Note: This only works if the MemberName has already been resolved.
- oop clazz = java_lang_invoke_MemberName::clazz(target_oop);
- int flags = java_lang_invoke_MemberName::flags(target_oop);
- Metadata* vmtarget=java_lang_invoke_MemberName::vmtarget(target_oop);
- intptr_t vmindex = java_lang_invoke_MemberName::vmindex(target_oop);
- KlassHandle k(thread, java_lang_Class::as_Klass(clazz));
- int ref_kind = (flags >> REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK;
- if (vmtarget == NULL) return NULL; // not resolved
- if ((flags & IS_FIELD) != 0) {
- assert(vmtarget->is_klass(), "field vmtarget is Klass*");
- int basic_mods = (ref_kind_is_static(ref_kind) ? JVM_ACC_STATIC : 0);
- // FIXME: how does k (receiver_limit) contribute?
- KlassHandle k_vmtarget(thread, (Klass*)vmtarget);
- return init_field_MemberName(mname, k_vmtarget, accessFlags_from(basic_mods), NULL, NULL, vmindex);
- } else if ((flags & (IS_METHOD | IS_CONSTRUCTOR)) != 0) {
- assert(vmtarget->is_method(), "method or constructor vmtarget is Method*");
- return init_method_MemberName(mname, (Method*)vmtarget, ref_kind_does_dispatch(ref_kind), k);
- } else {
- return NULL;
+ if (m == NULL) return NULL;
+ CallInfo info(m, k());
+ return init_method_MemberName(mname, info);
}
}
return NULL;
}
-oop MethodHandles::init_method_MemberName(Handle mname, Method* m, bool do_dispatch,
- KlassHandle receiver_limit_h) {
- Klass* receiver_limit = receiver_limit_h();
- AccessFlags mods = m->access_flags();
- int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
- int vmindex = Method::nonvirtual_vtable_index; // implies never any dispatch
- Klass* mklass = m->method_holder();
- if (receiver_limit == NULL)
- receiver_limit = mklass;
- if (m->is_initializer()) {
- flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
- } else if (mods.is_static()) {
- flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
- } else if (receiver_limit != mklass &&
- !receiver_limit->is_subtype_of(mklass)) {
- return NULL; // bad receiver limit
- } else if (do_dispatch && receiver_limit->is_interface() &&
- mklass->is_interface()) {
+oop MethodHandles::init_method_MemberName(Handle mname, CallInfo& info) {
+ assert(info.resolved_appendix().is_null(), "only normal methods here");
+ KlassHandle receiver_limit = info.resolved_klass();
+ methodHandle m = info.resolved_method();
+ int flags = (jushort)( m->access_flags().as_short() & JVM_RECOGNIZED_METHOD_MODIFIERS );
+ int vmindex = Method::invalid_vtable_index;
+
+ switch (info.call_kind()) {
+ case CallInfo::itable_call:
+ vmindex = info.itable_index();
+ // More importantly, the itable index only works with the method holder.
+ receiver_limit = m->method_holder();
+ assert(receiver_limit->verify_itable_index(vmindex), "");
flags |= IS_METHOD | (JVM_REF_invokeInterface << REFERENCE_KIND_SHIFT);
- receiver_limit = mklass; // ignore passed-in limit; interfaces are interconvertible
- vmindex = klassItable::compute_itable_index(m);
- } else if (do_dispatch && mklass != receiver_limit && mklass->is_interface()) {
+ break;
+
+ case CallInfo::vtable_call:
+ vmindex = info.vtable_index();
flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
- // it is a miranda method, so m->vtable_index is not what we want
- ResourceMark rm;
- klassVtable* vt = InstanceKlass::cast(receiver_limit)->vtable();
- vmindex = vt->index_of_miranda(m->name(), m->signature());
- } else if (!do_dispatch || m->can_be_statically_bound()) {
- flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
- } else {
- flags |= IS_METHOD | (JVM_REF_invokeVirtual << REFERENCE_KIND_SHIFT);
- vmindex = m->vtable_index();
+ assert(receiver_limit->is_subtype_of(m->method_holder()), "virtual call must be type-safe");
+ break;
+
+ case CallInfo::direct_call:
+ vmindex = Method::nonvirtual_vtable_index;
+ if (m->is_static()) {
+ flags |= IS_METHOD | (JVM_REF_invokeStatic << REFERENCE_KIND_SHIFT);
+ } else if (m->is_initializer()) {
+ flags |= IS_CONSTRUCTOR | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
+ assert(receiver_limit == m->method_holder(), "constructor call must be exactly typed");
+ } else {
+ flags |= IS_METHOD | (JVM_REF_invokeSpecial << REFERENCE_KIND_SHIFT);
+ assert(receiver_limit->is_subtype_of(m->method_holder()), "special call must be type-safe");
+ }
+ break;
+
+ default: assert(false, "bad CallInfo"); return NULL;
}
// @CallerSensitive annotation detected
@@ -221,7 +218,7 @@
oop mname_oop = mname();
java_lang_invoke_MemberName::set_flags( mname_oop, flags);
- java_lang_invoke_MemberName::set_vmtarget(mname_oop, m);
+ java_lang_invoke_MemberName::set_vmtarget(mname_oop, m());
java_lang_invoke_MemberName::set_vmindex( mname_oop, vmindex); // vtable/itable index
java_lang_invoke_MemberName::set_clazz( mname_oop, receiver_limit->java_mirror());
// Note: name and type can be lazily computed by resolve_MemberName,
@@ -237,59 +234,19 @@
return mname();
}
-Handle MethodHandles::init_method_MemberName(Handle mname, CallInfo& info, TRAPS) {
- Handle empty;
- if (info.resolved_appendix().not_null()) {
- // The resolved MemberName must not be accompanied by an appendix argument,
- // since there is no way to bind this value into the MemberName.
- // Caller is responsible to prevent this from happening.
- THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
- }
- methodHandle m = info.resolved_method();
- KlassHandle defc = info.resolved_klass();
- int vmindex = Method::invalid_vtable_index;
- if (defc->is_interface() && m->method_holder()->is_interface()) {
- // static interface methods do not reference vtable or itable
- if (m->is_static()) {
- vmindex = Method::nonvirtual_vtable_index;
- }
- // interface methods invoked via invokespecial also
- // do not reference vtable or itable.
- int ref_kind = ((java_lang_invoke_MemberName::flags(mname()) >>
- REFERENCE_KIND_SHIFT) & REFERENCE_KIND_MASK);
- if (ref_kind == JVM_REF_invokeSpecial) {
- vmindex = Method::nonvirtual_vtable_index;
- }
- // If neither m is static nor ref_kind is invokespecial,
- // set it to itable index.
- if (vmindex == Method::invalid_vtable_index) {
- // LinkResolver does not report itable indexes! (fix this?)
- vmindex = klassItable::compute_itable_index(m());
- }
- } else if (m->can_be_statically_bound()) {
- // LinkResolver reports vtable index even for final methods!
- vmindex = Method::nonvirtual_vtable_index;
- } else {
- vmindex = info.vtable_index();
- }
- oop res = init_method_MemberName(mname, m(), (vmindex >= 0), defc());
- assert(res == NULL || (java_lang_invoke_MemberName::vmindex(res) == vmindex), "");
- return Handle(THREAD, res);
-}
-
-oop MethodHandles::init_field_MemberName(Handle mname, KlassHandle field_holder,
- AccessFlags mods, oop type, oop name,
- intptr_t offset, bool is_setter) {
- int flags = (jushort)( mods.as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
- flags |= IS_FIELD | ((mods.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
+oop MethodHandles::init_field_MemberName(Handle mname, fieldDescriptor& fd, bool is_setter) {
+ int flags = (jushort)( fd.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS );
+ flags |= IS_FIELD | ((fd.is_static() ? JVM_REF_getStatic : JVM_REF_getField) << REFERENCE_KIND_SHIFT);
if (is_setter) flags += ((JVM_REF_putField - JVM_REF_getField) << REFERENCE_KIND_SHIFT);
- Metadata* vmtarget = field_holder();
- int vmindex = offset; // determines the field uniquely when combined with static bit
+ Metadata* vmtarget = fd.field_holder();
+ int vmindex = fd.offset(); // determines the field uniquely when combined with static bit
oop mname_oop = mname();
java_lang_invoke_MemberName::set_flags(mname_oop, flags);
java_lang_invoke_MemberName::set_vmtarget(mname_oop, vmtarget);
java_lang_invoke_MemberName::set_vmindex(mname_oop, vmindex);
- java_lang_invoke_MemberName::set_clazz(mname_oop, field_holder->java_mirror());
+ java_lang_invoke_MemberName::set_clazz(mname_oop, fd.field_holder()->java_mirror());
+ oop type = field_signature_type_or_null(fd.signature());
+ oop name = field_name_or_null(fd.name());
if (name != NULL)
java_lang_invoke_MemberName::set_name(mname_oop, name);
if (type != NULL)
@@ -305,19 +262,6 @@
return mname();
}
-Handle MethodHandles::init_field_MemberName(Handle mname, FieldAccessInfo& info, TRAPS) {
- return Handle();
-#if 0 // FIXME
- KlassHandle field_holder = info.klass();
- intptr_t field_offset = info.field_offset();
- return init_field_MemberName(mname_oop, field_holder(),
- info.access_flags(),
- type, name,
- field_offset, false /*is_setter*/);
-#endif
-}
-
-
// JVM 2.9 Special Methods:
// A method is signature polymorphic if and only if all of the following conditions hold :
// * It is declared in the java.lang.invoke.MethodHandle class.
@@ -573,12 +517,12 @@
return SystemDictionary::Object_klass()->java_mirror();
}
-static oop field_name_or_null(Symbol* s) {
+oop MethodHandles::field_name_or_null(Symbol* s) {
if (s == NULL) return NULL;
return StringTable::lookup(s);
}
-static oop field_signature_type_or_null(Symbol* s) {
+oop MethodHandles::field_signature_type_or_null(Symbol* s) {
if (s == NULL) return NULL;
BasicType bt = FieldType::basic_type(s);
if (is_java_primitive(bt)) {
@@ -701,7 +645,14 @@
return empty;
}
}
- return init_method_MemberName(mname, result, THREAD);
+ if (result.resolved_appendix().not_null()) {
+ // The resolved MemberName must not be accompanied by an appendix argument,
+ // since there is no way to bind this value into the MemberName.
+ // Caller is responsible to prevent this from happening.
+ THROW_MSG_(vmSymbols::java_lang_InternalError(), "appendix", empty);
+ }
+ oop mname2 = init_method_MemberName(mname, result);
+ return Handle(THREAD, mname2);
}
case IS_CONSTRUCTOR:
{
@@ -719,22 +670,21 @@
}
}
assert(result.is_statically_bound(), "");
- return init_method_MemberName(mname, result, THREAD);
+ oop mname2 = init_method_MemberName(mname, result);
+ return Handle(THREAD, mname2);
}
case IS_FIELD:
{
- // This is taken from LinkResolver::resolve_field, sans access checks.
- fieldDescriptor fd; // find_field initializes fd if found
- KlassHandle sel_klass(THREAD, InstanceKlass::cast(defc())->find_field(name, type, &fd));
- // check if field exists; i.e., if a klass containing the field def has been selected
- if (sel_klass.is_null()) return empty; // should not happen
- oop type = field_signature_type_or_null(fd.signature());
- oop name = field_name_or_null(fd.name());
- bool is_setter = (ref_kind_is_valid(ref_kind) && ref_kind_is_setter(ref_kind));
- mname = Handle(THREAD,
- init_field_MemberName(mname, sel_klass,
- fd.access_flags(), type, name, fd.offset(), is_setter));
- return mname;
+ fieldDescriptor result; // find_field initializes fd if found
+ {
+ assert(!HAS_PENDING_EXCEPTION, "");
+ LinkResolver::resolve_field(result, defc, name, type, KlassHandle(), Bytecodes::_nop, false, false, THREAD);
+ if (HAS_PENDING_EXCEPTION) {
+ return empty;
+ }
+ }
+ oop mname2 = init_field_MemberName(mname, result, ref_kind_is_setter(ref_kind));
+ return Handle(THREAD, mname2);
}
default:
THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty);
@@ -793,7 +743,6 @@
}
case IS_FIELD:
{
- // This is taken from LinkResolver::resolve_field, sans access checks.
assert(vmtarget->is_klass(), "field vmtarget is Klass*");
if (!((Klass*) vmtarget)->oop_is_instance()) break;
instanceKlassHandle defc(THREAD, (Klass*) vmtarget);
@@ -872,11 +821,7 @@
Handle result(thread, results->obj_at(rfill++));
if (!java_lang_invoke_MemberName::is_instance(result()))
return -99; // caller bug!
- oop type = field_signature_type_or_null(st.signature());
- oop name = field_name_or_null(st.name());
- oop saved = MethodHandles::init_field_MemberName(result, st.klass(),
- st.access_flags(), type, name,
- st.offset());
+ oop saved = MethodHandles::init_field_MemberName(result, st.field_descriptor());
if (saved != result())
results->obj_at_put(rfill-1, saved); // show saved instance to user
} else if (++overflow >= overflow_limit) {
@@ -926,7 +871,8 @@
Handle result(thread, results->obj_at(rfill++));
if (!java_lang_invoke_MemberName::is_instance(result()))
return -99; // caller bug!
- oop saved = MethodHandles::init_method_MemberName(result, m, true, NULL);
+ CallInfo info(m);
+ oop saved = MethodHandles::init_method_MemberName(result, info);
if (saved != result())
results->obj_at_put(rfill-1, saved); // show saved instance to user
} else if (++overflow >= overflow_limit) {
@@ -1227,7 +1173,8 @@
x = ((Klass*) vmtarget)->java_mirror();
} else if (vmtarget->is_method()) {
Handle mname2 = MethodHandles::new_MemberName(CHECK_NULL);
- x = MethodHandles::init_method_MemberName(mname2, (Method*)vmtarget, false, NULL);
+ CallInfo info((Method*)vmtarget);
+ x = MethodHandles::init_method_MemberName(mname2, info);
}
result->obj_at_put(1, x);
return JNIHandles::make_local(env, result());
--- a/hotspot/src/share/vm/prims/methodHandles.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -49,19 +49,18 @@
// Adapters.
static MethodHandlesAdapterBlob* _adapter_code;
+ // utility functions for reifying names and types
+ static oop field_name_or_null(Symbol* s);
+ static oop field_signature_type_or_null(Symbol* s);
+
public:
// working with member names
static Handle resolve_MemberName(Handle mname, TRAPS); // compute vmtarget/vmindex from name/type
static void expand_MemberName(Handle mname, int suppress, TRAPS); // expand defc/name/type if missing
static Handle new_MemberName(TRAPS); // must be followed by init_MemberName
static oop init_MemberName(Handle mname_h, Handle target_h); // compute vmtarget/vmindex from target
- static oop init_method_MemberName(Handle mname_h, Method* m, bool do_dispatch,
- KlassHandle receiver_limit_h);
- static oop init_field_MemberName(Handle mname_h, KlassHandle field_holder_h,
- AccessFlags mods, oop type, oop name,
- intptr_t offset, bool is_setter = false);
- static Handle init_method_MemberName(Handle mname_h, CallInfo& info, TRAPS);
- static Handle init_field_MemberName(Handle mname_h, FieldAccessInfo& info, TRAPS);
+ static oop init_field_MemberName(Handle mname_h, fieldDescriptor& fd, bool is_setter = false);
+ static oop init_method_MemberName(Handle mname_h, CallInfo& info);
static int method_ref_kind(Method* m, bool do_dispatch_if_possible = true);
static int find_MemberNames(KlassHandle k, Symbol* name, Symbol* sig,
int mflags, KlassHandle caller,
--- a/hotspot/src/share/vm/prims/unsafe.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -292,9 +292,9 @@
volatile oop v;
if (UseCompressedOops) {
volatile narrowOop n = *(volatile narrowOop*) addr;
- v = oopDesc::decode_heap_oop(n);
+ (void)const_cast<oop&>(v = oopDesc::decode_heap_oop(n));
} else {
- v = *(volatile oop*) addr;
+ (void)const_cast<oop&>(v = *(volatile oop*) addr);
}
OrderAccess::acquire();
return JNIHandles::make_local(env, v);
@@ -1222,9 +1222,9 @@
#endif /* USDT2 */
if (event.should_commit()) {
oop obj = thread->current_park_blocker();
- event.set_klass(obj ? obj->klass() : NULL);
+ event.set_klass((obj != NULL) ? obj->klass() : NULL);
event.set_timeout(time);
- event.set_address(obj ? (TYPE_ADDRESS) (uintptr_t) obj : 0);
+ event.set_address((obj != NULL) ? (TYPE_ADDRESS) cast_from_oop<uintptr_t>(obj) : 0);
event.commit();
}
UNSAFE_END
--- a/hotspot/src/share/vm/prims/whitebox.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -33,6 +33,7 @@
#include "prims/whitebox.hpp"
#include "prims/wbtestmethods/parserTests.hpp"
+#include "runtime/arguments.hpp"
#include "runtime/interfaceSupport.hpp"
#include "runtime/os.hpp"
#include "utilities/debug.hpp"
@@ -94,6 +95,11 @@
return closure.found();
WB_END
+WB_ENTRY(jlong, WB_GetCompressedOopsMaxHeapSize(JNIEnv* env, jobject o)) {
+ return (jlong)Arguments::max_heap_for_compressed_oops();
+}
+WB_END
+
WB_ENTRY(void, WB_PrintHeapSizes(JNIEnv* env, jobject o)) {
CollectorPolicy * p = Universe::heap()->collector_policy();
gclog_or_tty->print_cr("Minimum heap "SIZE_FORMAT" Initial heap "
@@ -436,6 +442,8 @@
CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
(void*) &WB_ParseCommandLine
},
+ {CC"getCompressedOopsMaxHeapSize", CC"()J",
+ (void*)&WB_GetCompressedOopsMaxHeapSize},
{CC"printHeapSizes", CC"()V", (void*)&WB_PrintHeapSizes },
#if INCLUDE_ALL_GCS
{CC"g1InConcurrentMark", CC"()Z", (void*)&WB_G1InConcurrentMark},
--- a/hotspot/src/share/vm/runtime/arguments.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -28,6 +28,7 @@
#include "compiler/compilerOracle.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/cardTableRS.hpp"
+#include "memory/genCollectedHeap.hpp"
#include "memory/referenceProcessor.hpp"
#include "memory/universe.inline.hpp"
#include "oops/oop.inline.hpp"
@@ -54,6 +55,8 @@
#endif
#if INCLUDE_ALL_GCS
#include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp"
+#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
+#include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
#endif // INCLUDE_ALL_GCS
// Note: This is a special bug reporting site for the JVM
@@ -90,6 +93,7 @@
SystemProperty* Arguments::_system_properties = NULL;
const char* Arguments::_gc_log_filename = NULL;
bool Arguments::_has_profile = false;
+size_t Arguments::_conservative_max_heap_alignment = 0;
uintx Arguments::_min_heap_size = 0;
Arguments::Mode Arguments::_mode = _mixed;
bool Arguments::_java_compiler = false;
@@ -621,11 +625,11 @@
}
}
-static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) {
+static bool set_bool_flag(char* name, bool value, Flag::Flags origin) {
return CommandLineFlags::boolAtPut(name, &value, origin);
}
-static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
+static bool set_fp_numeric_flag(char* name, char* value, Flag::Flags origin) {
double v;
if (sscanf(value, "%lf", &v) != 1) {
return false;
@@ -637,7 +641,7 @@
return false;
}
-static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
+static bool set_numeric_flag(char* name, char* value, Flag::Flags origin) {
julong v;
intx intx_v;
bool is_neg = false;
@@ -670,14 +674,14 @@
return false;
}
-static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) {
+static bool set_string_flag(char* name, const char* value, Flag::Flags origin) {
if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false;
// Contract: CommandLineFlags always returns a pointer that needs freeing.
FREE_C_HEAP_ARRAY(char, value, mtInternal);
return true;
}
-static bool append_to_string_flag(char* name, const char* new_value, FlagValueOrigin origin) {
+static bool append_to_string_flag(char* name, const char* new_value, Flag::Flags origin) {
const char* old_value = "";
if (!CommandLineFlags::ccstrAt(name, &old_value)) return false;
size_t old_len = old_value != NULL ? strlen(old_value) : 0;
@@ -705,7 +709,7 @@
return true;
}
-bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) {
+bool Arguments::parse_argument(const char* arg, Flag::Flags origin) {
// range of acceptable characters spelled out for portability reasons
#define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]"
@@ -846,7 +850,7 @@
}
bool Arguments::process_argument(const char* arg,
- jboolean ignore_unrecognized, FlagValueOrigin origin) {
+ jboolean ignore_unrecognized, Flag::Flags origin) {
JDK_Version since = JDK_Version();
@@ -900,7 +904,7 @@
jio_fprintf(defaultStream::error_stream(),
"Did you mean '%s%s%s'?\n",
(fuzzy_matched->is_bool()) ? "(+/-)" : "",
- fuzzy_matched->name,
+ fuzzy_matched->_name,
(fuzzy_matched->is_bool()) ? "" : "=<value>");
}
}
@@ -948,7 +952,7 @@
// this allows a way to include spaces in string-valued options
token[pos] = '\0';
logOption(token);
- result &= process_argument(token, ignore_unrecognized, CONFIG_FILE);
+ result &= process_argument(token, ignore_unrecognized, Flag::CONFIG_FILE);
build_jvm_flags(token);
pos = 0;
in_white_space = true;
@@ -966,7 +970,7 @@
}
if (pos > 0) {
token[pos] = '\0';
- result &= process_argument(token, ignore_unrecognized, CONFIG_FILE);
+ result &= process_argument(token, ignore_unrecognized, Flag::CONFIG_FILE);
build_jvm_flags(token);
}
fclose(stream);
@@ -1096,6 +1100,7 @@
}
}
+#if defined(COMPILER2) || defined(_LP64) || !INCLUDE_CDS
// Conflict: required to use shared spaces (-Xshare:on), but
// incompatible command line options were chosen.
@@ -1108,6 +1113,7 @@
FLAG_SET_DEFAULT(UseSharedSpaces, false);
}
}
+#endif
void Arguments::set_tiered_flags() {
// With tiered, set default policy to AdvancedThresholdPolicy, which is 3.
@@ -1126,6 +1132,9 @@
Tier3InvokeNotifyFreqLog = 0;
Tier4InvocationThreshold = 0;
}
+ if (FLAG_IS_DEFAULT(NmethodSweepFraction)) {
+ FLAG_SET_DEFAULT(NmethodSweepFraction, 1 + ReservedCodeCacheSize / (16 * M));
+ }
}
#if INCLUDE_ALL_GCS
@@ -1391,10 +1400,17 @@
return true;
}
-inline uintx max_heap_for_compressed_oops() {
+uintx Arguments::max_heap_for_compressed_oops() {
// Avoid sign flip.
assert(OopEncodingHeapMax > (uint64_t)os::vm_page_size(), "Unusual page size");
- LP64_ONLY(return OopEncodingHeapMax - os::vm_page_size());
+ // We need to fit both the NULL page and the heap into the memory budget, while
+ // keeping alignment constraints of the heap. To guarantee the latter, as the
+ // NULL page is located before the heap, we pad the NULL page to the conservative
+ // maximum alignment that the GC may ever impose upon the heap.
+ size_t displacement_due_to_null_page = align_size_up_(os::vm_page_size(),
+ Arguments::conservative_max_heap_alignment());
+
+ LP64_ONLY(return OopEncodingHeapMax - displacement_due_to_null_page);
NOT_LP64(ShouldNotReachHere(); return 0);
}
@@ -1439,7 +1455,7 @@
if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) {
warning("Max heap size too large for Compressed Oops");
FLAG_SET_DEFAULT(UseCompressedOops, false);
- FLAG_SET_DEFAULT(UseCompressedKlassPointers, false);
+ FLAG_SET_DEFAULT(UseCompressedClassPointers, false);
}
}
#endif // _LP64
@@ -1452,22 +1468,22 @@
void Arguments::set_use_compressed_klass_ptrs() {
#ifndef ZERO
#ifdef _LP64
- // UseCompressedOops must be on for UseCompressedKlassPointers to be on.
+ // UseCompressedOops must be on for UseCompressedClassPointers to be on.
if (!UseCompressedOops) {
- if (UseCompressedKlassPointers) {
- warning("UseCompressedKlassPointers requires UseCompressedOops");
+ if (UseCompressedClassPointers) {
+ warning("UseCompressedClassPointers requires UseCompressedOops");
}
- FLAG_SET_DEFAULT(UseCompressedKlassPointers, false);
+ FLAG_SET_DEFAULT(UseCompressedClassPointers, false);
} else {
- // Turn on UseCompressedKlassPointers too
- if (FLAG_IS_DEFAULT(UseCompressedKlassPointers)) {
- FLAG_SET_ERGO(bool, UseCompressedKlassPointers, true);
+ // Turn on UseCompressedClassPointers too
+ if (FLAG_IS_DEFAULT(UseCompressedClassPointers)) {
+ FLAG_SET_ERGO(bool, UseCompressedClassPointers, true);
}
- // Check the ClassMetaspaceSize to make sure we use compressed klass ptrs.
- if (UseCompressedKlassPointers) {
- if (ClassMetaspaceSize > KlassEncodingMetaspaceMax) {
- warning("Class metaspace size is too large for UseCompressedKlassPointers");
- FLAG_SET_DEFAULT(UseCompressedKlassPointers, false);
+ // Check the CompressedClassSpaceSize to make sure we use compressed klass ptrs.
+ if (UseCompressedClassPointers) {
+ if (CompressedClassSpaceSize > KlassEncodingMetaspaceMax) {
+ warning("CompressedClassSpaceSize is too large for UseCompressedClassPointers");
+ FLAG_SET_DEFAULT(UseCompressedClassPointers, false);
}
}
}
@@ -1475,6 +1491,23 @@
#endif // !ZERO
}
+void Arguments::set_conservative_max_heap_alignment() {
+ // The conservative maximum required alignment for the heap is the maximum of
+ // the alignments imposed by several sources: any requirements from the heap
+ // itself, the collector policy and the maximum page size we may run the VM
+ // with.
+ size_t heap_alignment = GenCollectedHeap::conservative_max_heap_alignment();
+#if INCLUDE_ALL_GCS
+ if (UseParallelGC) {
+ heap_alignment = ParallelScavengeHeap::conservative_max_heap_alignment();
+ } else if (UseG1GC) {
+ heap_alignment = G1CollectedHeap::conservative_max_heap_alignment();
+ }
+#endif // INCLUDE_ALL_GCS
+ _conservative_max_heap_alignment = MAX3(heap_alignment, os::max_page_size(),
+ CollectorPolicy::compute_max_alignment());
+}
+
void Arguments::set_ergonomics_flags() {
if (os::is_server_class_machine()) {
@@ -1492,16 +1525,20 @@
FLAG_SET_ERGO(bool, UseParallelGC, true);
}
}
- // Shared spaces work fine with other GCs but causes bytecode rewriting
- // to be disabled, which hurts interpreter performance and decreases
- // server performance. On server class machines, keep the default
- // off unless it is asked for. Future work: either add bytecode rewriting
- // at link time, or rewrite bytecodes in non-shared methods.
- if (!DumpSharedSpaces && !RequireSharedSpaces &&
- (FLAG_IS_DEFAULT(UseSharedSpaces) || !UseSharedSpaces)) {
- no_shared_spaces();
- }
}
+#ifdef COMPILER2
+ // Shared spaces work fine with other GCs but causes bytecode rewriting
+ // to be disabled, which hurts interpreter performance and decreases
+ // server performance. When -server is specified, keep the default off
+ // unless it is asked for. Future work: either add bytecode rewriting
+ // at link time, or rewrite bytecodes in non-shared methods.
+ if (!DumpSharedSpaces && !RequireSharedSpaces &&
+ (FLAG_IS_DEFAULT(UseSharedSpaces) || !UseSharedSpaces)) {
+ no_shared_spaces();
+ }
+#endif
+
+ set_conservative_max_heap_alignment();
#ifndef ZERO
#ifdef _LP64
@@ -1839,7 +1876,7 @@
(NumberOfGCLogFiles == 0) ||
(GCLogFileSize == 0)) {
jio_fprintf(defaultStream::output_stream(),
- "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files> -XX:GCLogFileSize=<num_of_size>\n"
+ "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files> -XX:GCLogFileSize=<num_of_size>[k|K|m|M|g|G]\n"
"where num_of_file > 0 and num_of_size > 0\n"
"GC log rotation is turned off\n");
UseGCLogFileRotation = false;
@@ -1853,6 +1890,51 @@
}
}
+// This function is called for -Xloggc:<filename>, it can be used
+// to check if a given file name(or string) conforms to the following
+// specification:
+// A valid string only contains "[A-Z][a-z][0-9].-_%[p|t]"
+// %p and %t only allowed once. We only limit usage of filename not path
+bool is_filename_valid(const char *file_name) {
+ const char* p = file_name;
+ char file_sep = os::file_separator()[0];
+ const char* cp;
+ // skip prefix path
+ for (cp = file_name; *cp != '\0'; cp++) {
+ if (*cp == '/' || *cp == file_sep) {
+ p = cp + 1;
+ }
+ }
+
+ int count_p = 0;
+ int count_t = 0;
+ while (*p != '\0') {
+ if ((*p >= '0' && *p <= '9') ||
+ (*p >= 'A' && *p <= 'Z') ||
+ (*p >= 'a' && *p <= 'z') ||
+ *p == '-' ||
+ *p == '_' ||
+ *p == '.') {
+ p++;
+ continue;
+ }
+ if (*p == '%') {
+ if(*(p + 1) == 'p') {
+ p += 2;
+ count_p ++;
+ continue;
+ }
+ if (*(p + 1) == 't') {
+ p += 2;
+ count_t ++;
+ continue;
+ }
+ }
+ return false;
+ }
+ return count_p < 2 && count_t < 2;
+}
+
// Check consistency of GC selection
bool Arguments::check_gc_consistency() {
check_gclog_consistency();
@@ -2148,8 +2230,8 @@
status = status && verify_object_alignment();
- status = status && verify_interval(ClassMetaspaceSize, 1*M, 3*G,
- "ClassMetaspaceSize");
+ status = status && verify_interval(CompressedClassSpaceSize, 1*M, 3*G,
+ "CompressedClassSpaceSize");
status = status && verify_interval(MarkStackSizeMax,
1, (max_jint - 1), "MarkStackSizeMax");
@@ -2258,6 +2340,10 @@
(2*G)/M);
status = false;
}
+
+ status &= verify_interval(NmethodSweepFraction, 1, ReservedCodeCacheSize/K, "NmethodSweepFraction");
+ status &= verify_interval(NmethodSweepActivity, 0, 2000, "NmethodSweepActivity");
+
return status;
}
@@ -2359,26 +2445,11 @@
}
// Parse JavaVMInitArgs structure passed in
- result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, COMMAND_LINE);
+ result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, Flag::COMMAND_LINE);
if (result != JNI_OK) {
return result;
}
- if (AggressiveOpts) {
- // Insert alt-rt.jar between user-specified bootclasspath
- // prefix and the default bootclasspath. os::set_boot_path()
- // uses meta_index_dir as the default bootclasspath directory.
- const char* altclasses_jar = "alt-rt.jar";
- size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 +
- strlen(altclasses_jar);
- char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len, mtInternal);
- strcpy(altclasses_path, get_meta_index_dir());
- strcat(altclasses_path, altclasses_jar);
- scp.add_suffix_to_prefix(altclasses_path);
- scp_assembly_required = true;
- FREE_C_HEAP_ARRAY(char, altclasses_path, mtInternal);
- }
-
// Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM)
result = parse_java_options_environment_variable(&scp, &scp_assembly_required);
if (result != JNI_OK) {
@@ -2446,7 +2517,7 @@
jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
SysClassPath* scp_p,
bool* scp_assembly_required_p,
- FlagValueOrigin origin) {
+ Flag::Flags origin) {
// Remaining part of option string
const char* tail;
@@ -2806,6 +2877,13 @@
// ostream_init_log(), when called will use this filename
// to initialize a fileStream.
_gc_log_filename = strdup(tail);
+ if (!is_filename_valid(_gc_log_filename)) {
+ jio_fprintf(defaultStream::output_stream(),
+ "Invalid file name for use with -Xloggc: Filename can only contain the "
+ "characters [A-Z][a-z][0-9]-_.%%[p|t] but it has been %s\n"
+ "Note %%p or %%t can only be used once\n", _gc_log_filename);
+ return JNI_EINVAL;
+ }
FLAG_SET_CMDLINE(bool, PrintGC, true);
FLAG_SET_CMDLINE(bool, PrintGCTimeStamps, true);
@@ -3262,7 +3340,7 @@
}
}
- return(parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p, ENVIRON_VAR));
+ return(parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p, Flag::ENVIRON_VAR));
}
return JNI_OK;
}
@@ -3274,13 +3352,13 @@
}
UseSharedSpaces = false;
#ifdef _LP64
- if (!UseCompressedOops || !UseCompressedKlassPointers) {
+ if (!UseCompressedOops || !UseCompressedClassPointers) {
vm_exit_during_initialization(
- "Cannot dump shared archive when UseCompressedOops or UseCompressedKlassPointers is off.", NULL);
+ "Cannot dump shared archive when UseCompressedOops or UseCompressedClassPointers is off.", NULL);
}
} else {
- // UseCompressedOops and UseCompressedKlassPointers must be on for UseSharedSpaces.
- if (!UseCompressedOops || !UseCompressedKlassPointers) {
+ // UseCompressedOops and UseCompressedClassPointers must be on for UseSharedSpaces.
+ if (!UseCompressedOops || !UseCompressedClassPointers) {
no_shared_spaces();
}
#endif
@@ -3326,6 +3404,33 @@
return shared_archive_path;
}
+#ifndef PRODUCT
+// Determine whether LogVMOutput should be implicitly turned on.
+static bool use_vm_log() {
+ if (LogCompilation || !FLAG_IS_DEFAULT(LogFile) ||
+ PrintCompilation || PrintInlining || PrintDependencies || PrintNativeNMethods ||
+ PrintDebugInfo || PrintRelocations || PrintNMethods || PrintExceptionHandlers ||
+ PrintAssembly || TraceDeoptimization || TraceDependencies ||
+ (VerifyDependencies && FLAG_IS_CMDLINE(VerifyDependencies))) {
+ return true;
+ }
+
+#ifdef COMPILER1
+ if (PrintC1Statistics) {
+ return true;
+ }
+#endif // COMPILER1
+
+#ifdef COMPILER2
+ if (PrintOptoAssembly || PrintOptoStatistics) {
+ return true;
+ }
+#endif // COMPILER2
+
+ return false;
+}
+#endif // PRODUCT
+
// Parse entry point called from JNI_CreateJavaVM
jint Arguments::parse(const JavaVMInitArgs* args) {
@@ -3506,6 +3611,11 @@
no_shared_spaces();
#endif // INCLUDE_CDS
+ return JNI_OK;
+}
+
+jint Arguments::apply_ergo() {
+
// Set flags based on ergonomics.
set_ergonomics_flags();
@@ -3581,7 +3691,7 @@
FLAG_SET_DEFAULT(ProfileInterpreter, false);
FLAG_SET_DEFAULT(UseBiasedLocking, false);
LP64_ONLY(FLAG_SET_DEFAULT(UseCompressedOops, false));
- LP64_ONLY(FLAG_SET_DEFAULT(UseCompressedKlassPointers, false));
+ LP64_ONLY(FLAG_SET_DEFAULT(UseCompressedClassPointers, false));
#endif // CC_INTERP
#ifdef COMPILER2
@@ -3610,6 +3720,10 @@
DebugNonSafepoints = true;
}
+ if (FLAG_IS_CMDLINE(CompressedClassSpaceSize) && !UseCompressedClassPointers) {
+ warning("Setting CompressedClassSpaceSize has no effect when compressed class pointers are not used");
+ }
+
#ifndef PRODUCT
if (CompileTheWorld) {
// Force NmethodSweeper to sweep whole CodeCache each time.
@@ -3617,7 +3731,13 @@
NmethodSweepFraction = 1;
}
}
-#endif
+
+ if (!LogVMOutput && FLAG_IS_DEFAULT(LogVMOutput)) {
+ if (use_vm_log()) {
+ LogVMOutput = true;
+ }
+ }
+#endif // PRODUCT
if (PrintCommandLineFlags) {
CommandLineFlags::printSetFlags(tty);
--- a/hotspot/src/share/vm/runtime/arguments.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -144,7 +144,7 @@
void set_os_lib(void* os_lib) { _os_lib = os_lib; }
AgentLibrary* next() const { return _next; }
bool is_static_lib() const { return _is_static_lib; }
- void set_static_lib(bool static_lib) { _is_static_lib = static_lib; }
+ void set_static_lib(bool is_static_lib) { _is_static_lib = is_static_lib; }
bool valid() { return (_state == agent_valid); }
void set_valid() { _state = agent_valid; }
void set_invalid() { _state = agent_invalid; }
@@ -280,6 +280,9 @@
// Option flags
static bool _has_profile;
static const char* _gc_log_filename;
+ // Value of the conservative maximum heap alignment needed
+ static size_t _conservative_max_heap_alignment;
+
static uintx _min_heap_size;
// -Xrun arguments
@@ -327,6 +330,7 @@
// Garbage-First (UseG1GC)
static void set_g1_gc_flags();
// GC ergonomics
+ static void set_conservative_max_heap_alignment();
static void set_use_compressed_oops();
static void set_use_compressed_klass_ptrs();
static void set_ergonomics_flags();
@@ -356,15 +360,15 @@
// Argument parsing
static void do_pd_flag_adjustments();
- static bool parse_argument(const char* arg, FlagValueOrigin origin);
- static bool process_argument(const char* arg, jboolean ignore_unrecognized, FlagValueOrigin origin);
+ static bool parse_argument(const char* arg, Flag::Flags origin);
+ static bool process_argument(const char* arg, jboolean ignore_unrecognized, Flag::Flags origin);
static void process_java_launcher_argument(const char*, void*);
static void process_java_compiler_argument(char* arg);
static jint parse_options_environment_variable(const char* name, SysClassPath* scp_p, bool* scp_assembly_required_p);
static jint parse_java_tool_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p);
static jint parse_java_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p);
static jint parse_vm_init_args(const JavaVMInitArgs* args);
- static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, SysClassPath* scp_p, bool* scp_assembly_required_p, FlagValueOrigin origin);
+ static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, SysClassPath* scp_p, bool* scp_assembly_required_p, Flag::Flags origin);
static jint finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required);
static bool is_bad_option(const JavaVMOption* option, jboolean ignore,
const char* option_type);
@@ -430,8 +434,10 @@
static char* SharedArchivePath;
public:
- // Parses the arguments
+ // Parses the arguments, first phase
static jint parse(const JavaVMInitArgs* args);
+ // Apply ergonomics
+ static jint apply_ergo();
// Adjusts the arguments after the OS have adjusted the arguments
static jint adjust_after_os();
// Check for consistency in the selection of the garbage collector.
@@ -445,6 +451,10 @@
// Used by os_solaris
static bool process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized);
+ static size_t conservative_max_heap_alignment() { return _conservative_max_heap_alignment; }
+ // Return the maximum size a heap with compressed oops can take
+ static size_t max_heap_for_compressed_oops();
+
// return a char* array containing all options
static char** jvm_flags_array() { return _jvm_flags_array; }
static char** jvm_args_array() { return _jvm_args_array; }
--- a/hotspot/src/share/vm/runtime/biasedLocking.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -161,7 +161,7 @@
if (TraceBiasedLocking && (Verbose || !is_bulk)) {
ResourceMark rm;
tty->print_cr("Revoking bias of object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s , prototype header " INTPTR_FORMAT " , allow rebias %d , requesting thread " INTPTR_FORMAT,
- (intptr_t) obj, (intptr_t) mark, obj->klass()->external_name(), (intptr_t) obj->klass()->prototype_header(), (allow_rebias ? 1 : 0), (intptr_t) requesting_thread);
+ (void *)obj, (intptr_t) mark, obj->klass()->external_name(), (intptr_t) obj->klass()->prototype_header(), (allow_rebias ? 1 : 0), (intptr_t) requesting_thread);
}
JavaThread* biased_thread = mark->biased_locker();
@@ -214,8 +214,8 @@
if (mon_info->owner() == obj) {
if (TraceBiasedLocking && Verbose) {
tty->print_cr(" mon_info->owner (" PTR_FORMAT ") == obj (" PTR_FORMAT ")",
- (intptr_t) mon_info->owner(),
- (intptr_t) obj);
+ (void *) mon_info->owner(),
+ (void *) obj);
}
// Assume recursive case and fix up highest lock later
markOop mark = markOopDesc::encode((BasicLock*) NULL);
@@ -224,8 +224,8 @@
} else {
if (TraceBiasedLocking && Verbose) {
tty->print_cr(" mon_info->owner (" PTR_FORMAT ") != obj (" PTR_FORMAT ")",
- (intptr_t) mon_info->owner(),
- (intptr_t) obj);
+ (void *) mon_info->owner(),
+ (void *) obj);
}
}
}
@@ -326,7 +326,7 @@
tty->print_cr("* Beginning bulk revocation (kind == %s) because of object "
INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
(bulk_rebias ? "rebias" : "revoke"),
- (intptr_t) o, (intptr_t) o->mark(), o->klass()->external_name());
+ (void *) o, (intptr_t) o->mark(), o->klass()->external_name());
}
jlong cur_time = os::javaTimeMillis();
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -234,7 +234,7 @@
assert(Universe::heap()->is_in_or_null(result), "must be heap pointer");
if (TraceDeoptimization) {
ttyLocker ttyl;
- tty->print_cr("SAVED OOP RESULT " INTPTR_FORMAT " in thread " INTPTR_FORMAT, result, thread);
+ tty->print_cr("SAVED OOP RESULT " INTPTR_FORMAT " in thread " INTPTR_FORMAT, (void *)result, thread);
}
}
bool reallocated = false;
@@ -278,7 +278,7 @@
first = false;
tty->print_cr("RELOCK OBJECTS in thread " INTPTR_FORMAT, thread);
}
- tty->print_cr(" object <" INTPTR_FORMAT "> locked", mi->owner());
+ tty->print_cr(" object <" INTPTR_FORMAT "> locked", (void *)mi->owner());
}
}
}
@@ -977,7 +977,7 @@
KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()()));
Handle obj = sv->value();
- tty->print(" object <" INTPTR_FORMAT "> of type ", sv->value()());
+ tty->print(" object <" INTPTR_FORMAT "> of type ", (void *)sv->value()());
k->print_value();
tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize);
tty->cr();
@@ -1751,7 +1751,7 @@
else return trap_state & ~DS_RECOMPILE_BIT;
}
//---------------------------format_trap_state---------------------------------
-// This is used for debugging and diagnostics, including hotspot.log output.
+// This is used for debugging and diagnostics, including LogFile output.
const char* Deoptimization::format_trap_state(char* buf, size_t buflen,
int trap_state) {
DeoptReason reason = trap_state_reason(trap_state);
@@ -1828,7 +1828,7 @@
return buf;
}
-// This is used for debugging and diagnostics, including hotspot.log output.
+// This is used for debugging and diagnostics, including LogFile output.
const char* Deoptimization::format_trap_request(char* buf, size_t buflen,
int trap_request) {
jint unloaded_class_index = trap_request_index(trap_request);
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -97,18 +97,32 @@
return constants()->uncached_string_at(initial_value_index(), CHECK_0);
}
-void fieldDescriptor::initialize(InstanceKlass* ik, int index) {
- _cp = ik->constants();
+void fieldDescriptor::reinitialize(InstanceKlass* ik, int index) {
+ if (_cp.is_null() || field_holder() != ik) {
+ _cp = constantPoolHandle(Thread::current(), ik->constants());
+ // _cp should now reference ik's constant pool; i.e., ik is now field_holder.
+ assert(field_holder() == ik, "must be already initialized to this class");
+ }
FieldInfo* f = ik->field(index);
assert(!f->is_internal(), "regular Java fields only");
_access_flags = accessFlags_from(f->access_flags());
guarantee(f->name_index() != 0 && f->signature_index() != 0, "bad constant pool index for fieldDescriptor");
_index = index;
+ verify();
}
#ifndef PRODUCT
+void fieldDescriptor::verify() const {
+ if (_cp.is_null()) {
+ assert(_index == badInt, "constructor must be called"); // see constructor
+ } else {
+ assert(_index >= 0, "good index");
+ assert(_index < field_holder()->java_fields_count(), "oob");
+ }
+}
+
void fieldDescriptor::print_on(outputStream* st) const {
access_flags().print_on(st);
name()->print_value_on(st);
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,6 +53,13 @@
}
public:
+ fieldDescriptor() {
+ DEBUG_ONLY(_index = badInt);
+ }
+ fieldDescriptor(InstanceKlass* ik, int index) {
+ DEBUG_ONLY(_index = badInt);
+ reinitialize(ik, index);
+ }
Symbol* name() const {
return field()->name(_cp);
}
@@ -112,12 +119,13 @@
}
// Initialization
- void initialize(InstanceKlass* ik, int index);
+ void reinitialize(InstanceKlass* ik, int index);
// Print
void print() { print_on(tty); }
void print_on(outputStream* st) const PRODUCT_RETURN;
void print_on_for(outputStream* st, oop obj) PRODUCT_RETURN;
+ void verify() const PRODUCT_RETURN;
};
#endif // SHARE_VM_RUNTIME_FIELDDESCRIPTOR_HPP
--- a/hotspot/src/share/vm/runtime/frame.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/frame.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -652,7 +652,7 @@
// Return whether the frame is in the VM or os indicating a Hotspot problem.
// Otherwise, it's likely a bug in the native library that the Java code calls,
// hopefully indicating where to submit bugs.
-static void print_C_frame(outputStream* st, char* buf, int buflen, address pc) {
+void frame::print_C_frame(outputStream* st, char* buf, int buflen, address pc) {
// C/C++ frame
bool in_vm = os::address_is_in_vm(pc);
st->print(in_vm ? "V" : "C");
@@ -1097,7 +1097,7 @@
return NULL;
}
oop r = *oop_adr;
- assert(Universe::heap()->is_in_or_null(r), err_msg("bad receiver: " INTPTR_FORMAT " (" INTX_FORMAT ")", (intptr_t) r, (intptr_t) r));
+ assert(Universe::heap()->is_in_or_null(r), err_msg("bad receiver: " INTPTR_FORMAT " (" INTX_FORMAT ")", (void *) r, (void *) r));
return r;
}
@@ -1228,9 +1228,7 @@
void frame::ZapDeadClosure::do_oop(oop* p) {
if (TraceZapDeadLocals) tty->print_cr("zapping @ " INTPTR_FORMAT " containing " INTPTR_FORMAT, p, (address)*p);
- // Need cast because on _LP64 the conversion to oop is ambiguous. Constant
- // can be either long or int.
- *p = (oop)(int)0xbabebabe;
+ *p = cast_to_oop<intptr_t>(0xbabebabe);
}
frame::ZapDeadClosure frame::_zap_dead;
--- a/hotspot/src/share/vm/runtime/frame.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/frame.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -406,6 +406,7 @@
void print_on(outputStream* st) const;
void interpreter_frame_print_on(outputStream* st) const;
void print_on_error(outputStream* st, char* buf, int buflen, bool verbose = false) const;
+ static void print_C_frame(outputStream* st, char* buf, int buflen, address pc);
// Add annotated descriptions of memory locations belonging to this frame to values
void describe(FrameValues& values, int frame_no);
--- a/hotspot/src/share/vm/runtime/globals.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -62,26 +62,174 @@
MATERIALIZE_FLAGS_EXT
+void Flag::check_writable() {
+ if (is_constant_in_binary()) {
+ fatal(err_msg("flag is constant: %s", _name));
+ }
+}
+
+bool Flag::is_bool() const {
+ return strcmp(_type, "bool") == 0;
+}
+
+bool Flag::get_bool() const {
+ return *((bool*) _addr);
+}
+
+void Flag::set_bool(bool value) {
+ check_writable();
+ *((bool*) _addr) = value;
+}
+
+bool Flag::is_intx() const {
+ return strcmp(_type, "intx") == 0;
+}
+
+intx Flag::get_intx() const {
+ return *((intx*) _addr);
+}
+
+void Flag::set_intx(intx value) {
+ check_writable();
+ *((intx*) _addr) = value;
+}
+
+bool Flag::is_uintx() const {
+ return strcmp(_type, "uintx") == 0;
+}
+
+uintx Flag::get_uintx() const {
+ return *((uintx*) _addr);
+}
+
+void Flag::set_uintx(uintx value) {
+ check_writable();
+ *((uintx*) _addr) = value;
+}
+
+bool Flag::is_uint64_t() const {
+ return strcmp(_type, "uint64_t") == 0;
+}
+
+uint64_t Flag::get_uint64_t() const {
+ return *((uint64_t*) _addr);
+}
+
+void Flag::set_uint64_t(uint64_t value) {
+ check_writable();
+ *((uint64_t*) _addr) = value;
+}
+
+bool Flag::is_double() const {
+ return strcmp(_type, "double") == 0;
+}
+
+double Flag::get_double() const {
+ return *((double*) _addr);
+}
+
+void Flag::set_double(double value) {
+ check_writable();
+ *((double*) _addr) = value;
+}
+
+bool Flag::is_ccstr() const {
+ return strcmp(_type, "ccstr") == 0 || strcmp(_type, "ccstrlist") == 0;
+}
+
+bool Flag::ccstr_accumulates() const {
+ return strcmp(_type, "ccstrlist") == 0;
+}
+
+ccstr Flag::get_ccstr() const {
+ return *((ccstr*) _addr);
+}
+
+void Flag::set_ccstr(ccstr value) {
+ check_writable();
+ *((ccstr*) _addr) = value;
+}
+
+
+Flag::Flags Flag::get_origin() {
+ return Flags(_flags & VALUE_ORIGIN_MASK);
+}
+
+void Flag::set_origin(Flags origin) {
+ assert((origin & VALUE_ORIGIN_MASK) == origin, "sanity");
+ _flags = Flags((_flags & ~VALUE_ORIGIN_MASK) | origin);
+}
+
+bool Flag::is_default() {
+ return (get_origin() == DEFAULT);
+}
+
+bool Flag::is_ergonomic() {
+ return (get_origin() == ERGONOMIC);
+}
+
+bool Flag::is_command_line() {
+ return (get_origin() == COMMAND_LINE);
+}
+
+bool Flag::is_product() const {
+ return (_flags & KIND_PRODUCT) != 0;
+}
+
+bool Flag::is_manageable() const {
+ return (_flags & KIND_MANAGEABLE) != 0;
+}
+
+bool Flag::is_diagnostic() const {
+ return (_flags & KIND_DIAGNOSTIC) != 0;
+}
+
+bool Flag::is_experimental() const {
+ return (_flags & KIND_EXPERIMENTAL) != 0;
+}
+
+bool Flag::is_notproduct() const {
+ return (_flags & KIND_NOT_PRODUCT) != 0;
+}
+
+bool Flag::is_develop() const {
+ return (_flags & KIND_DEVELOP) != 0;
+}
+
+bool Flag::is_read_write() const {
+ return (_flags & KIND_READ_WRITE) != 0;
+}
+
+bool Flag::is_commercial() const {
+ return (_flags & KIND_COMMERCIAL) != 0;
+}
+
+/**
+ * Returns if this flag is a constant in the binary. Right now this is
+ * true for notproduct and develop flags in product builds.
+ */
+bool Flag::is_constant_in_binary() const {
+#ifdef PRODUCT
+ return is_notproduct() || is_develop();
+#else
+ return false;
+#endif
+}
+
bool Flag::is_unlocker() const {
- return strcmp(name, "UnlockDiagnosticVMOptions") == 0 ||
- strcmp(name, "UnlockExperimentalVMOptions") == 0 ||
+ return strcmp(_name, "UnlockDiagnosticVMOptions") == 0 ||
+ strcmp(_name, "UnlockExperimentalVMOptions") == 0 ||
is_unlocker_ext();
}
bool Flag::is_unlocked() const {
- if (strcmp(kind, "{diagnostic}") == 0 ||
- strcmp(kind, "{C2 diagnostic}") == 0 ||
- strcmp(kind, "{ARCH diagnostic}") == 0 ||
- strcmp(kind, "{Shark diagnostic}") == 0) {
+ if (is_diagnostic()) {
return UnlockDiagnosticVMOptions;
- } else if (strcmp(kind, "{experimental}") == 0 ||
- strcmp(kind, "{C2 experimental}") == 0 ||
- strcmp(kind, "{ARCH experimental}") == 0 ||
- strcmp(kind, "{Shark experimental}") == 0) {
+ }
+ if (is_experimental()) {
return UnlockExperimentalVMOptions;
- } else {
- return is_unlocked_ext();
}
+ return is_unlocked_ext();
}
// Get custom message for this locked flag, or return NULL if
@@ -91,16 +239,14 @@
}
bool Flag::is_writeable() const {
- return strcmp(kind, "{manageable}") == 0 ||
- strcmp(kind, "{product rw}") == 0 ||
- is_writeable_ext();
+ return is_manageable() || (is_product() && is_read_write()) || is_writeable_ext();
}
// All flags except "manageable" are assumed to be internal flags.
// Long term, we need to define a mechanism to specify which flags
// are external/stable and change this function accordingly.
bool Flag::is_external() const {
- return strcmp(kind, "{manageable}") == 0 || is_external_ext();
+ return is_manageable() || is_external_ext();
}
@@ -108,53 +254,113 @@
#define FORMAT_BUFFER_LEN 16
void Flag::print_on(outputStream* st, bool withComments) {
- st->print("%9s %-40s %c= ", type, name, (origin != DEFAULT ? ':' : ' '));
- if (is_bool()) st->print("%-16s", get_bool() ? "true" : "false");
- if (is_intx()) st->print("%-16ld", get_intx());
- if (is_uintx()) st->print("%-16lu", get_uintx());
- if (is_uint64_t()) st->print("%-16lu", get_uint64_t());
- if (is_double()) st->print("%-16f", get_double());
+ // Don't print notproduct and develop flags in a product build.
+ if (is_constant_in_binary()) {
+ return;
+ }
+
+ st->print("%9s %-40s %c= ", _type, _name, (!is_default() ? ':' : ' '));
+ if (is_bool()) {
+ st->print("%-16s", get_bool() ? "true" : "false");
+ }
+ if (is_intx()) {
+ st->print("%-16ld", get_intx());
+ }
+ if (is_uintx()) {
+ st->print("%-16lu", get_uintx());
+ }
+ if (is_uint64_t()) {
+ st->print("%-16lu", get_uint64_t());
+ }
+ if (is_double()) {
+ st->print("%-16f", get_double());
+ }
if (is_ccstr()) {
- const char* cp = get_ccstr();
- if (cp != NULL) {
- const char* eol;
- while ((eol = strchr(cp, '\n')) != NULL) {
- char format_buffer[FORMAT_BUFFER_LEN];
- size_t llen = pointer_delta(eol, cp, sizeof(char));
- jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
- "%%." SIZE_FORMAT "s", llen);
- st->print(format_buffer, cp);
- st->cr();
- cp = eol+1;
- st->print("%5s %-35s += ", "", name);
- }
- st->print("%-16s", cp);
- }
- else st->print("%-16s", "");
+ const char* cp = get_ccstr();
+ if (cp != NULL) {
+ const char* eol;
+ while ((eol = strchr(cp, '\n')) != NULL) {
+ char format_buffer[FORMAT_BUFFER_LEN];
+ size_t llen = pointer_delta(eol, cp, sizeof(char));
+ jio_snprintf(format_buffer, FORMAT_BUFFER_LEN,
+ "%%." SIZE_FORMAT "s", llen);
+ st->print(format_buffer, cp);
+ st->cr();
+ cp = eol+1;
+ st->print("%5s %-35s += ", "", _name);
+ }
+ st->print("%-16s", cp);
+ }
+ else st->print("%-16s", "");
}
- st->print("%-20s", kind);
+
+ st->print("%-20");
+ print_kind(st);
+
if (withComments) {
#ifndef PRODUCT
- st->print("%s", doc );
+ st->print("%s", _doc);
#endif
}
st->cr();
}
+void Flag::print_kind(outputStream* st) {
+ struct Data {
+ int flag;
+ const char* name;
+ };
+
+ Data data[] = {
+ { KIND_C1, "C1" },
+ { KIND_C2, "C2" },
+ { KIND_ARCH, "ARCH" },
+ { KIND_SHARK, "SHARK" },
+ { KIND_PLATFORM_DEPENDENT, "pd" },
+ { KIND_PRODUCT, "product" },
+ { KIND_MANAGEABLE, "manageable" },
+ { KIND_DIAGNOSTIC, "diagnostic" },
+ { KIND_NOT_PRODUCT, "notproduct" },
+ { KIND_DEVELOP, "develop" },
+ { KIND_LP64_PRODUCT, "lp64_product" },
+ { KIND_READ_WRITE, "rw" },
+ { -1, "" }
+ };
+
+ if ((_flags & KIND_MASK) != 0) {
+ st->print("{");
+ bool is_first = true;
+
+ for (int i = 0; data[i].flag != -1; i++) {
+ Data d = data[i];
+ if ((_flags & d.flag) != 0) {
+ if (is_first) {
+ is_first = false;
+ } else {
+ st->print(" ");
+ }
+ st->print(d.name);
+ }
+ }
+
+ st->print("}");
+ }
+}
+
void Flag::print_as_flag(outputStream* st) {
if (is_bool()) {
- st->print("-XX:%s%s", get_bool() ? "+" : "-", name);
+ st->print("-XX:%s%s", get_bool() ? "+" : "-", _name);
} else if (is_intx()) {
- st->print("-XX:%s=" INTX_FORMAT, name, get_intx());
+ st->print("-XX:%s=" INTX_FORMAT, _name, get_intx());
} else if (is_uintx()) {
- st->print("-XX:%s=" UINTX_FORMAT, name, get_uintx());
+ st->print("-XX:%s=" UINTX_FORMAT, _name, get_uintx());
} else if (is_uint64_t()) {
- st->print("-XX:%s=" UINT64_FORMAT, name, get_uint64_t());
+ st->print("-XX:%s=" UINT64_FORMAT, _name, get_uint64_t());
} else if (is_double()) {
- st->print("-XX:%s=%f", name, get_double());
+ st->print("-XX:%s=%f", _name, get_double());
} else if (is_ccstr()) {
- st->print("-XX:%s=", name);
+ st->print("-XX:%s=", _name);
const char* cp = get_ccstr();
if (cp != NULL) {
// Need to turn embedded '\n's back into separate arguments
@@ -167,7 +373,7 @@
st->print("%c", *cp);
break;
case '\n':
- st->print(" -XX:%s=", name);
+ st->print(" -XX:%s=", _name);
break;
}
}
@@ -180,79 +386,51 @@
// 4991491 do not "optimize out" the was_set false values: omitting them
// tickles a Microsoft compiler bug causing flagTable to be malformed
-#define RUNTIME_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product}", DEFAULT },
-#define RUNTIME_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{pd product}", DEFAULT },
-#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{diagnostic}", DEFAULT },
-#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{experimental}", DEFAULT },
-#define RUNTIME_MANAGEABLE_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{manageable}", DEFAULT },
-#define RUNTIME_PRODUCT_RW_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{product rw}", DEFAULT },
+#define NAME(name) NOT_PRODUCT(&name) PRODUCT_ONLY(&CONST_##name)
-#ifdef PRODUCT
- #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
- #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
- #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
-#else
- #define RUNTIME_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "", DEFAULT },
- #define RUNTIME_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{pd}", DEFAULT },
- #define RUNTIME_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{notproduct}", DEFAULT },
-#endif
+#define RUNTIME_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT) },
+#define RUNTIME_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
+#define RUNTIME_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DIAGNOSTIC) },
+#define RUNTIME_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_EXPERIMENTAL) },
+#define RUNTIME_MANAGEABLE_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_MANAGEABLE) },
+#define RUNTIME_PRODUCT_RW_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_PRODUCT | Flag::KIND_READ_WRITE) },
+#define RUNTIME_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DEVELOP) },
+#define RUNTIME_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
+#define RUNTIME_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_NOT_PRODUCT) },
#ifdef _LP64
- #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{lp64_product}", DEFAULT },
+#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_LP64_PRODUCT) },
#else
- #define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
+#define RUNTIME_LP64_PRODUCT_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
#endif // _LP64
-#define C1_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 product}", DEFAULT },
-#define C1_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 pd product}", DEFAULT },
-#define C1_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C1 diagnostic}", DEFAULT },
-#ifdef PRODUCT
- #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
- #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
- #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
-#else
- #define C1_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1}", DEFAULT },
- #define C1_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C1 pd}", DEFAULT },
- #define C1_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C1 notproduct}", DEFAULT },
-#endif
+#define C1_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT) },
+#define C1_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
+#define C1_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DIAGNOSTIC) },
+#define C1_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP) },
+#define C1_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
+#define C1_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C1 | Flag::KIND_NOT_PRODUCT) },
-#define C2_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 product}", DEFAULT },
-#define C2_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 pd product}", DEFAULT },
-#define C2_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 diagnostic}", DEFAULT },
-#define C2_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{C2 experimental}", DEFAULT },
-#ifdef PRODUCT
- #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
- #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
- #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
-#else
- #define C2_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2}", DEFAULT },
- #define C2_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{C2 pd}", DEFAULT },
- #define C2_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{C2 notproduct}", DEFAULT },
-#endif
+#define C2_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT) },
+#define C2_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
+#define C2_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DIAGNOSTIC) },
+#define C2_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_EXPERIMENTAL) },
+#define C2_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP) },
+#define C2_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
+#define C2_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_C2 | Flag::KIND_NOT_PRODUCT) },
-#define ARCH_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH product}", DEFAULT },
-#define ARCH_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH diagnostic}", DEFAULT },
-#define ARCH_EXPERIMENTAL_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{ARCH experimental}", DEFAULT },
-#ifdef PRODUCT
- #define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
- #define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
-#else
- #define ARCH_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH}", DEFAULT },
- #define ARCH_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{ARCH notproduct}", DEFAULT },
-#endif
+#define ARCH_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_PRODUCT) },
+#define ARCH_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_DIAGNOSTIC) },
+#define ARCH_EXPERIMENTAL_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_EXPERIMENTAL) },
+#define ARCH_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_DEVELOP) },
+#define ARCH_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_ARCH | Flag::KIND_NOT_PRODUCT) },
-#define SHARK_PRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark product}", DEFAULT },
-#define SHARK_PD_PRODUCT_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark pd product}", DEFAULT },
-#define SHARK_DIAGNOSTIC_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) "{Shark diagnostic}", DEFAULT },
-#ifdef PRODUCT
- #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) /* flag is constant */
- #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) /* flag is constant */
- #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc)
-#else
- #define SHARK_DEVELOP_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark}", DEFAULT },
- #define SHARK_PD_DEVELOP_FLAG_STRUCT(type, name, doc) { #type, XSTR(name), &name, doc, "{Shark pd}", DEFAULT },
- #define SHARK_NOTPRODUCT_FLAG_STRUCT(type, name, value, doc) { #type, XSTR(name), &name, doc, "{Shark notproduct}", DEFAULT },
-#endif
+#define SHARK_PRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT) },
+#define SHARK_PD_PRODUCT_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_PRODUCT | Flag::KIND_PLATFORM_DEPENDENT) },
+#define SHARK_DIAGNOSTIC_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), &name, NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DIAGNOSTIC) },
+#define SHARK_DEVELOP_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP) },
+#define SHARK_PD_DEVELOP_FLAG_STRUCT( type, name, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_DEVELOP | Flag::KIND_PLATFORM_DEPENDENT) },
+#define SHARK_NOTPRODUCT_FLAG_STRUCT( type, name, value, doc) { #type, XSTR(name), NAME(name), NOT_PRODUCT_ARG(doc) Flag::Flags(Flag::DEFAULT | Flag::KIND_SHARK | Flag::KIND_NOT_PRODUCT) },
static Flag flagTable[] = {
RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_STRUCT, RUNTIME_PD_DEVELOP_FLAG_STRUCT, RUNTIME_PRODUCT_FLAG_STRUCT, RUNTIME_PD_PRODUCT_FLAG_STRUCT, RUNTIME_DIAGNOSTIC_FLAG_STRUCT, RUNTIME_EXPERIMENTAL_FLAG_STRUCT, RUNTIME_NOTPRODUCT_FLAG_STRUCT, RUNTIME_MANAGEABLE_FLAG_STRUCT, RUNTIME_PRODUCT_RW_FLAG_STRUCT, RUNTIME_LP64_PRODUCT_FLAG_STRUCT)
@@ -285,9 +463,14 @@
// Search the flag table for a named flag
Flag* Flag::find_flag(const char* name, size_t length, bool allow_locked) {
- for (Flag* current = &flagTable[0]; current->name != NULL; current++) {
- if (str_equal(current->name, name, length)) {
- // Found a matching entry. Report locked flags only if allowed.
+ for (Flag* current = &flagTable[0]; current->_name != NULL; current++) {
+ if (str_equal(current->_name, name, length)) {
+ // Found a matching entry.
+ // Don't report notproduct and develop flags in product builds.
+ if (current->is_constant_in_binary()) {
+ return NULL;
+ }
+ // Report locked flags only if allowed.
if (!(current->is_unlocked() || current->is_unlocker())) {
if (!allow_locked) {
// disable use of locked flags, e.g. diagnostic, experimental,
@@ -327,8 +510,8 @@
float score;
float max_score = -1;
- for (Flag* current = &flagTable[0]; current->name != NULL; current++) {
- score = str_similar(current->name, name, length);
+ for (Flag* current = &flagTable[0]; current->_name != NULL; current++) {
+ score = str_similar(current->_name, name, length);
if (score > max_score) {
max_score = score;
match = current;
@@ -357,25 +540,25 @@
bool CommandLineFlagsEx::is_default(CommandLineFlag flag) {
assert((size_t)flag < Flag::numFlags, "bad command line flag index");
Flag* f = &Flag::flags[flag];
- return (f->origin == DEFAULT);
+ return f->is_default();
}
bool CommandLineFlagsEx::is_ergo(CommandLineFlag flag) {
assert((size_t)flag < Flag::numFlags, "bad command line flag index");
Flag* f = &Flag::flags[flag];
- return (f->origin == ERGONOMIC);
+ return f->is_ergonomic();
}
bool CommandLineFlagsEx::is_cmdline(CommandLineFlag flag) {
assert((size_t)flag < Flag::numFlags, "bad command line flag index");
Flag* f = &Flag::flags[flag];
- return (f->origin == COMMAND_LINE);
+ return f->is_command_line();
}
bool CommandLineFlags::wasSetOnCmdline(const char* name, bool* value) {
Flag* result = Flag::find_flag((char*)name, strlen(name));
if (result == NULL) return false;
- *value = (result->origin == COMMAND_LINE);
+ *value = result->is_command_line();
return true;
}
@@ -387,22 +570,22 @@
return true;
}
-bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin) {
+bool CommandLineFlags::boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_bool()) return false;
bool old_value = result->get_bool();
result->set_bool(*value);
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
-void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::boolAtPut(CommandLineFlagWithType flag, bool value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_bool(), "wrong flag type");
faddr->set_bool(value);
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
bool CommandLineFlags::intxAt(char* name, size_t len, intx* value) {
@@ -413,22 +596,22 @@
return true;
}
-bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin) {
+bool CommandLineFlags::intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_intx()) return false;
intx old_value = result->get_intx();
result->set_intx(*value);
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
-void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::intxAtPut(CommandLineFlagWithType flag, intx value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_intx(), "wrong flag type");
faddr->set_intx(value);
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
bool CommandLineFlags::uintxAt(char* name, size_t len, uintx* value) {
@@ -439,22 +622,22 @@
return true;
}
-bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin) {
+bool CommandLineFlags::uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uintx()) return false;
uintx old_value = result->get_uintx();
result->set_uintx(*value);
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
-void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_uintx(), "wrong flag type");
faddr->set_uintx(value);
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
bool CommandLineFlags::uint64_tAt(char* name, size_t len, uint64_t* value) {
@@ -465,22 +648,22 @@
return true;
}
-bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, FlagValueOrigin origin) {
+bool CommandLineFlags::uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_uint64_t()) return false;
uint64_t old_value = result->get_uint64_t();
result->set_uint64_t(*value);
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
-void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_uint64_t(), "wrong flag type");
faddr->set_uint64_t(value);
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
bool CommandLineFlags::doubleAt(char* name, size_t len, double* value) {
@@ -491,22 +674,22 @@
return true;
}
-bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin) {
+bool CommandLineFlags::doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_double()) return false;
double old_value = result->get_double();
result->set_double(*value);
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
-void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_double(), "wrong flag type");
faddr->set_double(value);
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
bool CommandLineFlags::ccstrAt(char* name, size_t len, ccstr* value) {
@@ -519,7 +702,7 @@
// Contract: Flag will make private copy of the incoming value.
// Outgoing value is always malloc-ed, and caller MUST call free.
-bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin) {
+bool CommandLineFlags::ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin) {
Flag* result = Flag::find_flag(name, len);
if (result == NULL) return false;
if (!result->is_ccstr()) return false;
@@ -530,35 +713,35 @@
strcpy(new_value, *value);
}
result->set_ccstr(new_value);
- if (result->origin == DEFAULT && old_value != NULL) {
+ if (result->is_default() && old_value != NULL) {
// Prior value is NOT heap allocated, but was a literal constant.
char* old_value_to_free = NEW_C_HEAP_ARRAY(char, strlen(old_value)+1, mtInternal);
strcpy(old_value_to_free, old_value);
old_value = old_value_to_free;
}
*value = old_value;
- result->origin = origin;
+ result->set_origin(origin);
return true;
}
// Contract: Flag will make private copy of the incoming value.
-void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin) {
+void CommandLineFlagsEx::ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin) {
Flag* faddr = address_of_flag(flag);
guarantee(faddr != NULL && faddr->is_ccstr(), "wrong flag type");
ccstr old_value = faddr->get_ccstr();
char* new_value = NEW_C_HEAP_ARRAY(char, strlen(value)+1, mtInternal);
strcpy(new_value, value);
faddr->set_ccstr(new_value);
- if (faddr->origin != DEFAULT && old_value != NULL) {
+ if (!faddr->is_default() && old_value != NULL) {
// Prior value is heap allocated so free it.
FREE_C_HEAP_ARRAY(char, old_value, mtInternal);
}
- faddr->origin = origin;
+ faddr->set_origin(origin);
}
extern "C" {
static int compare_flags(const void* void_a, const void* void_b) {
- return strcmp((*((Flag**) void_a))->name, (*((Flag**) void_b))->name);
+ return strcmp((*((Flag**) void_a))->_name, (*((Flag**) void_b))->_name);
}
}
@@ -567,20 +750,19 @@
// note: this method is called before the thread structure is in place
// which means resource allocation cannot be used.
- // Compute size
- int length= 0;
- while (flagTable[length].name != NULL) length++;
+ // The last entry is the null entry.
+ const size_t length = Flag::numFlags - 1;
// Sort
Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal);
- for (int index = 0; index < length; index++) {
- array[index] = &flagTable[index];
+ for (size_t i = 0; i < length; i++) {
+ array[i] = &flagTable[i];
}
qsort(array, length, sizeof(Flag*), compare_flags);
// Print
- for (int i = 0; i < length; i++) {
- if (array[i]->origin /* naked field! */) {
+ for (size_t i = 0; i < length; i++) {
+ if (array[i]->get_origin() /* naked field! */) {
array[i]->print_as_flag(out);
out->print(" ");
}
@@ -603,20 +785,19 @@
// note: this method is called before the thread structure is in place
// which means resource allocation cannot be used.
- // Compute size
- int length= 0;
- while (flagTable[length].name != NULL) length++;
+ // The last entry is the null entry.
+ const size_t length = Flag::numFlags - 1;
// Sort
Flag** array = NEW_C_HEAP_ARRAY(Flag*, length, mtInternal);
- for (int index = 0; index < length; index++) {
- array[index] = &flagTable[index];
+ for (size_t i = 0; i < length; i++) {
+ array[i] = &flagTable[i];
}
qsort(array, length, sizeof(Flag*), compare_flags);
// Print
out->print_cr("[Global flags]");
- for (int i = 0; i < length; i++) {
+ for (size_t i = 0; i < length; i++) {
if (array[i]->is_unlocked()) {
array[i]->print_on(out, withComments);
}
--- a/hotspot/src/share/vm/runtime/globals.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -194,29 +194,49 @@
typedef const char* ccstr;
typedef const char* ccstrlist; // represents string arguments which accumulate
-enum FlagValueOrigin {
- DEFAULT = 0,
- COMMAND_LINE = 1,
- ENVIRON_VAR = 2,
- CONFIG_FILE = 3,
- MANAGEMENT = 4,
- ERGONOMIC = 5,
- ATTACH_ON_DEMAND = 6,
- INTERNAL = 99
-};
+struct Flag {
+ enum Flags {
+ // value origin
+ DEFAULT = 0,
+ COMMAND_LINE = 1,
+ ENVIRON_VAR = 2,
+ CONFIG_FILE = 3,
+ MANAGEMENT = 4,
+ ERGONOMIC = 5,
+ ATTACH_ON_DEMAND = 6,
+ INTERNAL = 7,
+
+ LAST_VALUE_ORIGIN = INTERNAL,
+ VALUE_ORIGIN_BITS = 4,
+ VALUE_ORIGIN_MASK = right_n_bits(VALUE_ORIGIN_BITS),
-struct Flag {
- const char *type;
- const char *name;
- void* addr;
+ // flag kind
+ KIND_PRODUCT = 1 << 4,
+ KIND_MANAGEABLE = 1 << 5,
+ KIND_DIAGNOSTIC = 1 << 6,
+ KIND_EXPERIMENTAL = 1 << 7,
+ KIND_NOT_PRODUCT = 1 << 8,
+ KIND_DEVELOP = 1 << 9,
+ KIND_PLATFORM_DEPENDENT = 1 << 10,
+ KIND_READ_WRITE = 1 << 11,
+ KIND_C1 = 1 << 12,
+ KIND_C2 = 1 << 13,
+ KIND_ARCH = 1 << 14,
+ KIND_SHARK = 1 << 15,
+ KIND_LP64_PRODUCT = 1 << 16,
+ KIND_COMMERCIAL = 1 << 17,
- NOT_PRODUCT(const char *doc;)
+ KIND_MASK = ~VALUE_ORIGIN_MASK
+ };
- const char *kind;
- FlagValueOrigin origin;
+ const char* _type;
+ const char* _name;
+ void* _addr;
+ NOT_PRODUCT(const char* _doc;)
+ Flags _flags;
// points to all Flags static array
- static Flag *flags;
+ static Flag* flags;
// number of flags
static size_t numFlags;
@@ -224,30 +244,50 @@
static Flag* find_flag(const char* name, size_t length, bool allow_locked = false);
static Flag* fuzzy_match(const char* name, size_t length, bool allow_locked = false);
- bool is_bool() const { return strcmp(type, "bool") == 0; }
- bool get_bool() const { return *((bool*) addr); }
- void set_bool(bool value) { *((bool*) addr) = value; }
+ void check_writable();
+
+ bool is_bool() const;
+ bool get_bool() const;
+ void set_bool(bool value);
+
+ bool is_intx() const;
+ intx get_intx() const;
+ void set_intx(intx value);
- bool is_intx() const { return strcmp(type, "intx") == 0; }
- intx get_intx() const { return *((intx*) addr); }
- void set_intx(intx value) { *((intx*) addr) = value; }
+ bool is_uintx() const;
+ uintx get_uintx() const;
+ void set_uintx(uintx value);
- bool is_uintx() const { return strcmp(type, "uintx") == 0; }
- uintx get_uintx() const { return *((uintx*) addr); }
- void set_uintx(uintx value) { *((uintx*) addr) = value; }
+ bool is_uint64_t() const;
+ uint64_t get_uint64_t() const;
+ void set_uint64_t(uint64_t value);
+
+ bool is_double() const;
+ double get_double() const;
+ void set_double(double value);
- bool is_uint64_t() const { return strcmp(type, "uint64_t") == 0; }
- uint64_t get_uint64_t() const { return *((uint64_t*) addr); }
- void set_uint64_t(uint64_t value) { *((uint64_t*) addr) = value; }
+ bool is_ccstr() const;
+ bool ccstr_accumulates() const;
+ ccstr get_ccstr() const;
+ void set_ccstr(ccstr value);
+
+ Flags get_origin();
+ void set_origin(Flags origin);
- bool is_double() const { return strcmp(type, "double") == 0; }
- double get_double() const { return *((double*) addr); }
- void set_double(double value) { *((double*) addr) = value; }
+ bool is_default();
+ bool is_ergonomic();
+ bool is_command_line();
- bool is_ccstr() const { return strcmp(type, "ccstr") == 0 || strcmp(type, "ccstrlist") == 0; }
- bool ccstr_accumulates() const { return strcmp(type, "ccstrlist") == 0; }
- ccstr get_ccstr() const { return *((ccstr*) addr); }
- void set_ccstr(ccstr value) { *((ccstr*) addr) = value; }
+ bool is_product() const;
+ bool is_manageable() const;
+ bool is_diagnostic() const;
+ bool is_experimental() const;
+ bool is_notproduct() const;
+ bool is_develop() const;
+ bool is_read_write() const;
+ bool is_commercial() const;
+
+ bool is_constant_in_binary() const;
bool is_unlocker() const;
bool is_unlocked() const;
@@ -263,6 +303,7 @@
void get_locked_message_ext(char*, int) const;
void print_on(outputStream* st, bool withComments = false );
+ void print_kind(outputStream* st);
void print_as_flag(outputStream* st);
};
@@ -310,33 +351,33 @@
public:
static bool boolAt(char* name, size_t len, bool* value);
static bool boolAt(char* name, bool* value) { return boolAt(name, strlen(name), value); }
- static bool boolAtPut(char* name, size_t len, bool* value, FlagValueOrigin origin);
- static bool boolAtPut(char* name, bool* value, FlagValueOrigin origin) { return boolAtPut(name, strlen(name), value, origin); }
+ static bool boolAtPut(char* name, size_t len, bool* value, Flag::Flags origin);
+ static bool boolAtPut(char* name, bool* value, Flag::Flags origin) { return boolAtPut(name, strlen(name), value, origin); }
static bool intxAt(char* name, size_t len, intx* value);
static bool intxAt(char* name, intx* value) { return intxAt(name, strlen(name), value); }
- static bool intxAtPut(char* name, size_t len, intx* value, FlagValueOrigin origin);
- static bool intxAtPut(char* name, intx* value, FlagValueOrigin origin) { return intxAtPut(name, strlen(name), value, origin); }
+ static bool intxAtPut(char* name, size_t len, intx* value, Flag::Flags origin);
+ static bool intxAtPut(char* name, intx* value, Flag::Flags origin) { return intxAtPut(name, strlen(name), value, origin); }
static bool uintxAt(char* name, size_t len, uintx* value);
static bool uintxAt(char* name, uintx* value) { return uintxAt(name, strlen(name), value); }
- static bool uintxAtPut(char* name, size_t len, uintx* value, FlagValueOrigin origin);
- static bool uintxAtPut(char* name, uintx* value, FlagValueOrigin origin) { return uintxAtPut(name, strlen(name), value, origin); }
+ static bool uintxAtPut(char* name, size_t len, uintx* value, Flag::Flags origin);
+ static bool uintxAtPut(char* name, uintx* value, Flag::Flags origin) { return uintxAtPut(name, strlen(name), value, origin); }
static bool uint64_tAt(char* name, size_t len, uint64_t* value);
static bool uint64_tAt(char* name, uint64_t* value) { return uint64_tAt(name, strlen(name), value); }
- static bool uint64_tAtPut(char* name, size_t len, uint64_t* value, FlagValueOrigin origin);
- static bool uint64_tAtPut(char* name, uint64_t* value, FlagValueOrigin origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
+ static bool uint64_tAtPut(char* name, size_t len, uint64_t* value, Flag::Flags origin);
+ static bool uint64_tAtPut(char* name, uint64_t* value, Flag::Flags origin) { return uint64_tAtPut(name, strlen(name), value, origin); }
static bool doubleAt(char* name, size_t len, double* value);
static bool doubleAt(char* name, double* value) { return doubleAt(name, strlen(name), value); }
- static bool doubleAtPut(char* name, size_t len, double* value, FlagValueOrigin origin);
- static bool doubleAtPut(char* name, double* value, FlagValueOrigin origin) { return doubleAtPut(name, strlen(name), value, origin); }
+ static bool doubleAtPut(char* name, size_t len, double* value, Flag::Flags origin);
+ static bool doubleAtPut(char* name, double* value, Flag::Flags origin) { return doubleAtPut(name, strlen(name), value, origin); }
static bool ccstrAt(char* name, size_t len, ccstr* value);
static bool ccstrAt(char* name, ccstr* value) { return ccstrAt(name, strlen(name), value); }
- static bool ccstrAtPut(char* name, size_t len, ccstr* value, FlagValueOrigin origin);
- static bool ccstrAtPut(char* name, ccstr* value, FlagValueOrigin origin) { return ccstrAtPut(name, strlen(name), value, origin); }
+ static bool ccstrAtPut(char* name, size_t len, ccstr* value, Flag::Flags origin);
+ static bool ccstrAtPut(char* name, ccstr* value, Flag::Flags origin) { return ccstrAtPut(name, strlen(name), value, origin); }
// Returns false if name is not a command line flag.
static bool wasSetOnCmdline(const char* name, bool* value);
@@ -443,8 +484,8 @@
"Use 32-bit object references in 64-bit VM " \
"lp64_product means flag is always constant in 32 bit VM") \
\
- lp64_product(bool, UseCompressedKlassPointers, false, \
- "Use 32-bit klass pointers in 64-bit VM " \
+ lp64_product(bool, UseCompressedClassPointers, false, \
+ "Use 32-bit class pointers in 64-bit VM " \
"lp64_product means flag is always constant in 32 bit VM") \
\
notproduct(bool, CheckCompressedOops, true, \
@@ -880,7 +921,7 @@
"stay alive at the expense of JVM performance") \
\
diagnostic(bool, LogCompilation, false, \
- "Log compilation activity in detail to hotspot.log or LogFile") \
+ "Log compilation activity in detail to LogFile") \
\
product(bool, PrintCompilation, false, \
"Print compilations") \
@@ -2498,16 +2539,17 @@
"Print all VM flags with default values and descriptions and exit")\
\
diagnostic(bool, SerializeVMOutput, true, \
- "Use a mutex to serialize output to tty and hotspot.log") \
+ "Use a mutex to serialize output to tty and LogFile") \
\
diagnostic(bool, DisplayVMOutput, true, \
"Display all VM output on the tty, independently of LogVMOutput") \
\
- diagnostic(bool, LogVMOutput, trueInDebug, \
- "Save VM output to hotspot.log, or to LogFile") \
+ diagnostic(bool, LogVMOutput, false, \
+ "Save VM output to LogFile") \
\
diagnostic(ccstr, LogFile, NULL, \
- "If LogVMOutput is on, save VM output to this file [hotspot.log]") \
+ "If LogVMOutput or LogCompilation is on, save VM output to " \
+ "this file [default: ./hotspot_pid%p.log] (%p replaced with pid)") \
\
product(ccstr, ErrorFile, NULL, \
"If an error occurs, save the error data to this file " \
@@ -2525,6 +2567,9 @@
product(bool, PrintStringTableStatistics, false, \
"print statistics about the StringTable and SymbolTable") \
\
+ diagnostic(bool, VerifyStringTableAtExit, false, \
+ "verify StringTable contents at exit") \
+ \
notproduct(bool, PrintSymbolTableSizeHistogram, false, \
"print histogram of the symbol table") \
\
@@ -2826,6 +2871,10 @@
product(intx, NmethodSweepCheckInterval, 5, \
"Compilers wake up every n seconds to possibly sweep nmethods") \
\
+ product(intx, NmethodSweepActivity, 10, \
+ "Removes cold nmethods from code cache if > 0. Higher values " \
+ "result in more aggressive sweeping") \
+ \
notproduct(bool, LogSweeper, false, \
"Keep a ring buffer of sweeper activity") \
\
@@ -3039,9 +3088,9 @@
product(uintx, MaxMetaspaceSize, max_uintx, \
"Maximum size of Metaspaces (in bytes)") \
\
- product(uintx, ClassMetaspaceSize, 1*G, \
- "Maximum size of InstanceKlass area in Metaspace used for " \
- "UseCompressedKlassPointers") \
+ product(uintx, CompressedClassSpaceSize, 1*G, \
+ "Maximum size of class area in Metaspace when compressed " \
+ "class pointers are used") \
\
product(uintx, MinHeapFreeRatio, 40, \
"Min percentage of heap free after GC to avoid expansion") \
@@ -3197,15 +3246,6 @@
product(bool, UseCodeCacheFlushing, true, \
"Attempt to clean the code cache before shutting off compiler") \
\
- product(intx, MinCodeCacheFlushingInterval, 30, \
- "Min number of seconds between code cache cleaning sessions") \
- \
- product(uintx, CodeCacheFlushingMinimumFreeSpace, 1500*K, \
- "When less than X space left, start code cache cleaning") \
- \
- product(uintx, CodeCacheFlushingFraction, 2, \
- "Fraction of the code cache that is flushed when full") \
- \
/* interpreter debugging */ \
develop(intx, BinarySwitchThreshold, 5, \
"Minimal number of lookupswitch entries for rewriting to binary " \
@@ -3726,20 +3766,20 @@
*/
// Interface macros
-#define DECLARE_PRODUCT_FLAG(type, name, value, doc) extern "C" type name;
-#define DECLARE_PD_PRODUCT_FLAG(type, name, doc) extern "C" type name;
-#define DECLARE_DIAGNOSTIC_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_PRODUCT_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_PD_PRODUCT_FLAG(type, name, doc) extern "C" type name;
+#define DECLARE_DIAGNOSTIC_FLAG(type, name, value, doc) extern "C" type name;
#define DECLARE_EXPERIMENTAL_FLAG(type, name, value, doc) extern "C" type name;
-#define DECLARE_MANAGEABLE_FLAG(type, name, value, doc) extern "C" type name;
-#define DECLARE_PRODUCT_RW_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_MANAGEABLE_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_PRODUCT_RW_FLAG(type, name, value, doc) extern "C" type name;
#ifdef PRODUCT
-#define DECLARE_DEVELOPER_FLAG(type, name, value, doc) const type name = value;
-#define DECLARE_PD_DEVELOPER_FLAG(type, name, doc) const type name = pd_##name;
-#define DECLARE_NOTPRODUCT_FLAG(type, name, value, doc)
+#define DECLARE_DEVELOPER_FLAG(type, name, value, doc) extern "C" type CONST_##name; const type name = value;
+#define DECLARE_PD_DEVELOPER_FLAG(type, name, doc) extern "C" type CONST_##name; const type name = pd_##name;
+#define DECLARE_NOTPRODUCT_FLAG(type, name, value, doc) extern "C" type CONST_##name;
#else
-#define DECLARE_DEVELOPER_FLAG(type, name, value, doc) extern "C" type name;
-#define DECLARE_PD_DEVELOPER_FLAG(type, name, doc) extern "C" type name;
-#define DECLARE_NOTPRODUCT_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_DEVELOPER_FLAG(type, name, value, doc) extern "C" type name;
+#define DECLARE_PD_DEVELOPER_FLAG(type, name, doc) extern "C" type name;
+#define DECLARE_NOTPRODUCT_FLAG(type, name, value, doc) extern "C" type name;
#endif
// Special LP64 flags, product only needed for now.
#ifdef _LP64
@@ -3749,23 +3789,23 @@
#endif // _LP64
// Implementation macros
-#define MATERIALIZE_PRODUCT_FLAG(type, name, value, doc) type name = value;
-#define MATERIALIZE_PD_PRODUCT_FLAG(type, name, doc) type name = pd_##name;
-#define MATERIALIZE_DIAGNOSTIC_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_PRODUCT_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_PD_PRODUCT_FLAG(type, name, doc) type name = pd_##name;
+#define MATERIALIZE_DIAGNOSTIC_FLAG(type, name, value, doc) type name = value;
#define MATERIALIZE_EXPERIMENTAL_FLAG(type, name, value, doc) type name = value;
-#define MATERIALIZE_MANAGEABLE_FLAG(type, name, value, doc) type name = value;
-#define MATERIALIZE_PRODUCT_RW_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_MANAGEABLE_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_PRODUCT_RW_FLAG(type, name, value, doc) type name = value;
#ifdef PRODUCT
-#define MATERIALIZE_DEVELOPER_FLAG(type, name, value, doc) /* flag name is constant */
-#define MATERIALIZE_PD_DEVELOPER_FLAG(type, name, doc) /* flag name is constant */
-#define MATERIALIZE_NOTPRODUCT_FLAG(type, name, value, doc)
+#define MATERIALIZE_DEVELOPER_FLAG(type, name, value, doc) type CONST_##name = value;
+#define MATERIALIZE_PD_DEVELOPER_FLAG(type, name, doc) type CONST_##name = pd_##name;
+#define MATERIALIZE_NOTPRODUCT_FLAG(type, name, value, doc) type CONST_##name = value;
#else
-#define MATERIALIZE_DEVELOPER_FLAG(type, name, value, doc) type name = value;
-#define MATERIALIZE_PD_DEVELOPER_FLAG(type, name, doc) type name = pd_##name;
-#define MATERIALIZE_NOTPRODUCT_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_DEVELOPER_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_PD_DEVELOPER_FLAG(type, name, doc) type name = pd_##name;
+#define MATERIALIZE_NOTPRODUCT_FLAG(type, name, value, doc) type name = value;
#endif
#ifdef _LP64
-#define MATERIALIZE_LP64_PRODUCT_FLAG(type, name, value, doc) type name = value;
+#define MATERIALIZE_LP64_PRODUCT_FLAG(type, name, value, doc) type name = value;
#else
#define MATERIALIZE_LP64_PRODUCT_FLAG(type, name, value, doc) /* flag is constant */
#endif // _LP64
--- a/hotspot/src/share/vm/runtime/globals_extension.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -34,64 +34,42 @@
// Parens left off in the following for the enum decl below.
#define FLAG_MEMBER(flag) Flag_##flag
-#define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
-#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define RUNTIME_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#ifdef PRODUCT
- #define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
- #define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */
- #define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)
+#define RUNTIME_MANAGEABLE_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_PRODUCT_RW_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+
+#ifdef _LP64
+#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#else
- #define RUNTIME_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
- #define RUNTIME_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
- #define RUNTIME_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#endif
-#ifdef _LP64
-#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#else
-#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
+#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
#endif // _LP64
-#define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
-#define C1_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#ifdef PRODUCT
- #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
- #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */
- #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)
-#else
- #define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
- #define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
- #define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#endif
+#define C1_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C1_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define C1_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C1_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C1_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define C1_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
-#define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#ifdef PRODUCT
- #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
- #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) /* flag is constant */
- #define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)
-#else
- #define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
- #define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
- #define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#endif
+#define C2_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C2_PD_PRODUCT_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define C2_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C2_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C2_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define C2_PD_DEVELOP_FLAG_MEMBER(type, name, doc) FLAG_MEMBER(name),
+#define C2_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define ARCH_PRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define ARCH_DIAGNOSTIC_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
#define ARCH_EXPERIMENTAL_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#ifdef PRODUCT
- #define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) /* flag is constant */
- #define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc)
-#else
- #define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
- #define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
-#endif
+#define ARCH_DEVELOP_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
+#define ARCH_NOTPRODUCT_FLAG_MEMBER(type, name, value, doc) FLAG_MEMBER(name),
typedef enum {
RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER, RUNTIME_PD_DEVELOP_FLAG_MEMBER, RUNTIME_PRODUCT_FLAG_MEMBER, RUNTIME_PD_PRODUCT_FLAG_MEMBER, RUNTIME_DIAGNOSTIC_FLAG_MEMBER, RUNTIME_EXPERIMENTAL_FLAG_MEMBER, RUNTIME_NOTPRODUCT_FLAG_MEMBER, RUNTIME_MANAGEABLE_FLAG_MEMBER, RUNTIME_PRODUCT_RW_FLAG_MEMBER, RUNTIME_LP64_PRODUCT_FLAG_MEMBER)
@@ -114,64 +92,42 @@
#define FLAG_MEMBER_WITH_TYPE(flag,type) Flag_##flag##_##type
-#define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define RUNTIME_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#ifdef PRODUCT
- #define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
- #define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */
- #define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)
-#else
- #define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#endif
+#define RUNTIME_MANAGEABLE_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PRODUCT_RW_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define RUNTIME_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#ifdef PRODUCT
- #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
- #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */
- #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)
+#define C1_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+
+#ifdef _LP64
+#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#else
- #define C1_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define C1_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define C1_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#endif
-#ifdef _LP64
-#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#else
-#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
+#define RUNTIME_LP64_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
#endif // _LP64
-#define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_PD_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define C2_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#ifdef PRODUCT
- #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
- #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) /* flag is constant */
- #define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)
-#else
- #define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#endif
+#define C2_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_PD_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define C2_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define ARCH_PRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
#define ARCH_DIAGNOSTIC_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#define ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#ifdef PRODUCT
- #define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) /* flag is constant */
- #define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc)
-#else
- #define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
- #define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
-#endif
+#define ARCH_EXPERIMENTAL_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define ARCH_DEVELOP_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
+#define ARCH_NOTPRODUCT_FLAG_MEMBER_WITH_TYPE(type, name, value, doc) FLAG_MEMBER_WITH_TYPE(name,type),
typedef enum {
RUNTIME_FLAGS(RUNTIME_DEVELOP_FLAG_MEMBER_WITH_TYPE,
@@ -233,19 +189,19 @@
#define FLAG_SET_DEFAULT(name, value) ((name) = (value))
-#define FLAG_SET_CMDLINE(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), COMMAND_LINE))
-#define FLAG_SET_ERGO(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), ERGONOMIC))
+#define FLAG_SET_CMDLINE(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), Flag::COMMAND_LINE))
+#define FLAG_SET_ERGO(type, name, value) (CommandLineFlagsEx::type##AtPut(FLAG_MEMBER_WITH_TYPE(name,type), (type)(value), Flag::ERGONOMIC))
// Can't put the following in CommandLineFlags because
// of a circular dependency on the enum definition.
class CommandLineFlagsEx : CommandLineFlags {
public:
- static void boolAtPut(CommandLineFlagWithType flag, bool value, FlagValueOrigin origin);
- static void intxAtPut(CommandLineFlagWithType flag, intx value, FlagValueOrigin origin);
- static void uintxAtPut(CommandLineFlagWithType flag, uintx value, FlagValueOrigin origin);
- static void uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, FlagValueOrigin origin);
- static void doubleAtPut(CommandLineFlagWithType flag, double value, FlagValueOrigin origin);
- static void ccstrAtPut(CommandLineFlagWithType flag, ccstr value, FlagValueOrigin origin);
+ static void boolAtPut(CommandLineFlagWithType flag, bool value, Flag::Flags origin);
+ static void intxAtPut(CommandLineFlagWithType flag, intx value, Flag::Flags origin);
+ static void uintxAtPut(CommandLineFlagWithType flag, uintx value, Flag::Flags origin);
+ static void uint64_tAtPut(CommandLineFlagWithType flag, uint64_t value, Flag::Flags origin);
+ static void doubleAtPut(CommandLineFlagWithType flag, double value, Flag::Flags origin);
+ static void ccstrAtPut(CommandLineFlagWithType flag, ccstr value, Flag::Flags origin);
static bool is_default(CommandLineFlag flag);
static bool is_ergo(CommandLineFlag flag);
--- a/hotspot/src/share/vm/runtime/handles.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/handles.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -136,7 +136,7 @@
// Specific Handles for different oop types
#define DEF_METADATA_HANDLE(name, type) \
class name##Handle; \
- class name##Handle { \
+ class name##Handle : public StackObj { \
type* _value; \
Thread* _thread; \
protected: \
@@ -175,7 +175,7 @@
// Writing this class explicitly, since DEF_METADATA_HANDLE(klass) doesn't
// provide the necessary Klass* <-> Klass* conversions. This Klass
// could be removed when we don't have the Klass* typedef anymore.
-class KlassHandle {
+class KlassHandle : public StackObj {
Klass* _value;
protected:
Klass* obj() const { return _value; }
--- a/hotspot/src/share/vm/runtime/handles.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/handles.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -79,6 +79,7 @@
} else { \
_thread = Thread::current(); \
} \
+ assert (_thread->is_in_stack((address)this), "not on stack?"); \
_thread->metadata_handles()->push((Metadata*)_value); \
} else { \
_thread = NULL; \
@@ -95,6 +96,7 @@
} else { \
_thread = Thread::current(); \
} \
+ assert (_thread->is_in_stack((address)this), "not on stack?"); \
_thread->metadata_handles()->push((Metadata*)_value); \
} else { \
_thread = NULL; \
--- a/hotspot/src/share/vm/runtime/java.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/java.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -544,6 +544,19 @@
// it will run into trouble when system destroys static variables.
MemTracker::shutdown(MemTracker::NMT_normal);
+ if (VerifyStringTableAtExit) {
+ int fail_cnt = 0;
+ {
+ MutexLocker ml(StringTable_lock);
+ fail_cnt = StringTable::verify_and_compare_entries();
+ }
+
+ if (fail_cnt != 0) {
+ tty->print_cr("ERROR: fail_cnt=%d", fail_cnt);
+ guarantee(fail_cnt == 0, "unexpected StringTable verification failures");
+ }
+ }
+
#undef BEFORE_EXIT_NOT_RUN
#undef BEFORE_EXIT_RUNNING
#undef BEFORE_EXIT_DONE
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -430,7 +430,7 @@
for(int i = 0; i < _size; i++) {
if (_is_oop[i]) {
// Handle conversion
- _value[i] = (intptr_t)Handle::raw_resolve((oop *)_value[i]);
+ _value[i] = cast_from_oop<intptr_t>(Handle::raw_resolve((oop *)_value[i]));
}
}
// Return argument vector
--- a/hotspot/src/share/vm/runtime/mutexLocker.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -45,7 +45,6 @@
Mutex* VMStatistic_lock = NULL;
Mutex* JNIGlobalHandle_lock = NULL;
Mutex* JNIHandleBlockFreeList_lock = NULL;
-Mutex* JNICachedItableIndex_lock = NULL;
Mutex* MemberNameTable_lock = NULL;
Mutex* JmethodIdCreation_lock = NULL;
Mutex* JfieldIdCreation_lock = NULL;
@@ -253,7 +252,6 @@
}
def(Heap_lock , Monitor, nonleaf+1, false);
def(JfieldIdCreation_lock , Mutex , nonleaf+1, true ); // jfieldID, Used in VM_Operation
- def(JNICachedItableIndex_lock , Mutex , nonleaf+1, false); // Used to cache an itable index during JNI invoke
def(MemberNameTable_lock , Mutex , nonleaf+1, false); // Used to protect MemberNameTable
def(CompiledIC_lock , Mutex , nonleaf+2, false); // locks VtableStubs_lock, InlineCacheBuffer_lock
--- a/hotspot/src/share/vm/runtime/mutexLocker.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -50,7 +50,6 @@
extern Mutex* VMStatistic_lock; // a lock used to guard statistics count increment
extern Mutex* JNIGlobalHandle_lock; // a lock on creating JNI global handles
extern Mutex* JNIHandleBlockFreeList_lock; // a lock on the JNI handle block free list
-extern Mutex* JNICachedItableIndex_lock; // a lock on caching an itable index during JNI invoke
extern Mutex* MemberNameTable_lock; // a lock on the MemberNameTable updates
extern Mutex* JmethodIdCreation_lock; // a lock on creating JNI method identifiers
extern Mutex* JfieldIdCreation_lock; // a lock on creating JNI static field identifiers
--- a/hotspot/src/share/vm/runtime/os.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/os.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -314,6 +314,11 @@
}
}
+void os::init_before_ergo() {
+ // We need to initialize large page support here because ergonomics takes some
+ // decisions depending on large page support and the calculated large page size.
+ large_page_init();
+}
void os::signal_init() {
if (!ReduceSignalUsage) {
@@ -454,6 +459,7 @@
*/
void* os::find_agent_function(AgentLibrary *agent_lib, bool check_lib,
const char *syms[], size_t syms_len) {
+ assert(agent_lib != NULL, "sanity check");
const char *lib_name;
void *handle = agent_lib->os_lib();
void *entryName = NULL;
@@ -484,6 +490,7 @@
void *proc_handle;
void *save_handle;
+ assert(agent_lib != NULL, "sanity check");
if (agent_lib->name() == NULL) {
return false;
}
@@ -493,14 +500,13 @@
// We want to look in this process' symbol table.
agent_lib->set_os_lib(proc_handle);
ret = find_agent_function(agent_lib, true, syms, syms_len);
- agent_lib->set_os_lib(save_handle);
if (ret != NULL) {
// Found an entry point like Agent_OnLoad_lib_name so we have a static agent
- agent_lib->set_os_lib(proc_handle);
agent_lib->set_valid();
agent_lib->set_static_lib(true);
return true;
}
+ agent_lib->set_os_lib(save_handle);
return false;
}
--- a/hotspot/src/share/vm/runtime/os.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/os.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -91,6 +91,8 @@
typedef void (*java_call_t)(JavaValue* value, methodHandle* method, JavaCallArguments* args, Thread* thread);
class os: AllStatic {
+ friend class VMStructs;
+
public:
enum { page_sizes_max = 9 }; // Size of _page_sizes array (8 plus a sentinel)
@@ -139,7 +141,10 @@
public:
static void init(void); // Called before command line parsing
+ static void init_before_ergo(void); // Called after command line parsing
+ // before VM ergonomics processing.
static jint init_2(void); // Called after command line parsing
+ // and VM ergonomics processing
static void init_globals(void) { // Called from init_globals() in init.cpp
init_globals_ext();
}
@@ -254,6 +259,11 @@
static size_t page_size_for_region(size_t region_min_size,
size_t region_max_size,
uint min_pages);
+ // Return the largest page size that can be used
+ static size_t max_page_size() {
+ // The _page_sizes array is sorted in descending order.
+ return _page_sizes[0];
+ }
// Methods for tracing page sizes returned by the above method; enabled by
// TracePageSizes. The region_{min,max}_size parameters should be the values
@@ -795,6 +805,14 @@
#endif
public:
+#ifndef PLATFORM_PRINT_NATIVE_STACK
+ // No platform-specific code for printing the native stack.
+ static bool platform_print_native_stack(outputStream* st, void* context,
+ char *buf, int buf_size) {
+ return false;
+ }
+#endif
+
// debugging support (mostly used by debug.cpp but also fatal error handler)
static bool find(address pc, outputStream* st = tty); // OS specific function to make sense out of an address
--- a/hotspot/src/share/vm/runtime/reflection.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -952,7 +952,8 @@
}
} else {
// if the method can be overridden, we resolve using the vtable index.
- int index = reflected_method->vtable_index();
+ assert(!reflected_method->has_itable_index(), "");
+ int index = reflected_method->vtable_index();
method = reflected_method;
if (index != Method::nonvirtual_vtable_index) {
// target_klass might be an arrayKlassOop but all vtables start at
--- a/hotspot/src/share/vm/runtime/reflectionUtils.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/reflectionUtils.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -109,6 +109,8 @@
private:
int length() const { return _klass->java_fields_count(); }
+ fieldDescriptor _fd_buf;
+
public:
FieldStream(instanceKlassHandle klass, bool local_only, bool classes_only)
: KlassStream(klass, local_only, classes_only) {
@@ -134,6 +136,12 @@
int offset() const {
return _klass->field_offset( index() );
}
+ // bridge to a heavier API:
+ fieldDescriptor& field_descriptor() const {
+ fieldDescriptor& field = const_cast<fieldDescriptor&>(_fd_buf);
+ field.reinitialize(_klass(), _index);
+ return field;
+ }
};
class FilteredField : public CHeapObj<mtInternal> {
--- a/hotspot/src/share/vm/runtime/safepoint.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -519,8 +519,8 @@
}
{
- TraceTime t4("sweeping nmethods", TraceSafepointCleanupTime);
- NMethodSweeper::scan_stacks();
+ TraceTime t4("mark nmethods", TraceSafepointCleanupTime);
+ NMethodSweeper::mark_active_nmethods();
}
if (SymbolTable::needs_rehashing()) {
@@ -745,14 +745,14 @@
#endif
static void print_ptrs(intptr_t oldptr, intptr_t newptr, bool wasoop) {
- bool is_oop = newptr ? ((oop)newptr)->is_oop() : false;
+ bool is_oop = newptr ? (cast_to_oop(newptr))->is_oop() : false;
tty->print_cr(PTR_FORMAT PTR_PAD " %s %c " PTR_FORMAT PTR_PAD " %s %s",
oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
}
static void print_longs(jlong oldptr, jlong newptr, bool wasoop) {
- bool is_oop = newptr ? ((oop)(intptr_t)newptr)->is_oop() : false;
+ bool is_oop = newptr ? (cast_to_oop(newptr))->is_oop() : false;
tty->print_cr(PTR64_FORMAT " %s %c " PTR64_FORMAT " %s %s",
oldptr, wasoop?"oop":" ", oldptr == newptr ? ' ' : '!',
newptr, is_oop?"oop":" ", (wasoop && !is_oop) ? "STALE" : ((wasoop==false&&is_oop==false&&oldptr !=newptr)?"STOMP":" "));
--- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -577,7 +577,7 @@
assert(caller.is_interpreted_frame(), "");
int args_size = ArgumentSizeComputer(sig).size() + 1;
assert(args_size <= caller.interpreter_frame_expression_stack_size(), "receiver must be on interpreter stack");
- oop result = (oop) *caller.interpreter_frame_tos_at(args_size - 1);
+ oop result = cast_to_oop(*caller.interpreter_frame_tos_at(args_size - 1));
assert(Universe::heap()->is_in(result) && result->is_oop(), "receiver must be an oop");
return result;
}
@@ -1506,8 +1506,11 @@
info, CHECK_(methodHandle()));
inline_cache->set_to_monomorphic(info);
} else if (!inline_cache->is_megamorphic() && !inline_cache->is_clean()) {
- // Change to megamorphic
- inline_cache->set_to_megamorphic(&call_info, bc, CHECK_(methodHandle()));
+ // Potential change to megamorphic
+ bool successful = inline_cache->set_to_megamorphic(&call_info, bc, CHECK_(methodHandle()));
+ if (!successful) {
+ inline_cache->set_to_clean();
+ }
} else {
// Either clean or megamorphic
}
@@ -2872,7 +2875,7 @@
ObjectSynchronizer::inflate_helper(kptr2->obj());
// Now the displaced header is free to move
buf[i++] = (intptr_t)lock->displaced_header();
- buf[i++] = (intptr_t)kptr2->obj();
+ buf[i++] = cast_from_oop<intptr_t>(kptr2->obj());
}
}
assert( i - max_locals == active_monitor_count*2, "found the expected number of monitors" );
--- a/hotspot/src/share/vm/runtime/sweeper.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sweeper.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -127,64 +127,79 @@
#define SWEEP(nm)
#endif
+nmethod* NMethodSweeper::_current = NULL; // Current nmethod
+long NMethodSweeper::_traversals = 0; // Nof. stack traversals performed
+int NMethodSweeper::_seen = 0; // Nof. nmethods we have currently processed in current pass of CodeCache
+int NMethodSweeper::_flushed_count = 0; // Nof. nmethods flushed in current sweep
+int NMethodSweeper::_zombified_count = 0; // Nof. nmethods made zombie in current sweep
+int NMethodSweeper::_marked_count = 0; // Nof. nmethods marked for reclaim in current sweep
-long NMethodSweeper::_traversals = 0; // No. of stack traversals performed
-nmethod* NMethodSweeper::_current = NULL; // Current nmethod
-int NMethodSweeper::_seen = 0 ; // No. of nmethods we have currently processed in current pass of CodeCache
-int NMethodSweeper::_flushed_count = 0; // Nof. nmethods flushed in current sweep
-int NMethodSweeper::_zombified_count = 0; // Nof. nmethods made zombie in current sweep
-int NMethodSweeper::_marked_count = 0; // Nof. nmethods marked for reclaim in current sweep
-
-volatile int NMethodSweeper::_invocations = 0; // No. of invocations left until we are completed with this pass
+volatile int NMethodSweeper::_invocations = 0; // Nof. invocations left until we are completed with this pass
volatile int NMethodSweeper::_sweep_started = 0; // Whether a sweep is in progress.
-jint NMethodSweeper::_locked_seen = 0;
+jint NMethodSweeper::_locked_seen = 0;
jint NMethodSweeper::_not_entrant_seen_on_stack = 0;
-bool NMethodSweeper::_resweep = false;
-jint NMethodSweeper::_flush_token = 0;
-jlong NMethodSweeper::_last_full_flush_time = 0;
-int NMethodSweeper::_highest_marked = 0;
-int NMethodSweeper::_dead_compile_ids = 0;
-long NMethodSweeper::_last_flush_traversal_id = 0;
+bool NMethodSweeper::_request_mark_phase = false;
-int NMethodSweeper::_number_of_flushes = 0; // Total of full traversals caused by full cache
int NMethodSweeper::_total_nof_methods_reclaimed = 0;
-jlong NMethodSweeper::_total_time_sweeping = 0;
-jlong NMethodSweeper::_total_time_this_sweep = 0;
-jlong NMethodSweeper::_peak_sweep_time = 0;
-jlong NMethodSweeper::_peak_sweep_fraction_time = 0;
-jlong NMethodSweeper::_total_disconnect_time = 0;
-jlong NMethodSweeper::_peak_disconnect_time = 0;
+jlong NMethodSweeper::_total_time_sweeping = 0;
+jlong NMethodSweeper::_total_time_this_sweep = 0;
+jlong NMethodSweeper::_peak_sweep_time = 0;
+jlong NMethodSweeper::_peak_sweep_fraction_time = 0;
+int NMethodSweeper::_hotness_counter_reset_val = 0;
+
class MarkActivationClosure: public CodeBlobClosure {
public:
virtual void do_code_blob(CodeBlob* cb) {
- // If we see an activation belonging to a non_entrant nmethod, we mark it.
- if (cb->is_nmethod() && ((nmethod*)cb)->is_not_entrant()) {
- ((nmethod*)cb)->mark_as_seen_on_stack();
+ if (cb->is_nmethod()) {
+ nmethod* nm = (nmethod*)cb;
+ nm->set_hotness_counter(NMethodSweeper::hotness_counter_reset_val());
+ // If we see an activation belonging to a non_entrant nmethod, we mark it.
+ if (nm->is_not_entrant()) {
+ nm->mark_as_seen_on_stack();
+ }
}
}
};
static MarkActivationClosure mark_activation_closure;
+class SetHotnessClosure: public CodeBlobClosure {
+public:
+ virtual void do_code_blob(CodeBlob* cb) {
+ if (cb->is_nmethod()) {
+ nmethod* nm = (nmethod*)cb;
+ nm->set_hotness_counter(NMethodSweeper::hotness_counter_reset_val());
+ }
+ }
+};
+static SetHotnessClosure set_hotness_closure;
+
+
+int NMethodSweeper::hotness_counter_reset_val() {
+ if (_hotness_counter_reset_val == 0) {
+ _hotness_counter_reset_val = (ReservedCodeCacheSize < M) ? 1 : (ReservedCodeCacheSize / M) * 2;
+ }
+ return _hotness_counter_reset_val;
+}
bool NMethodSweeper::sweep_in_progress() {
return (_current != NULL);
}
-void NMethodSweeper::scan_stacks() {
+// Scans the stacks of all Java threads and marks activations of not-entrant methods.
+// No need to synchronize access, since 'mark_active_nmethods' is always executed at a
+// safepoint.
+void NMethodSweeper::mark_active_nmethods() {
assert(SafepointSynchronize::is_at_safepoint(), "must be executed at a safepoint");
- if (!MethodFlushing) return;
-
- // No need to synchronize access, since this is always executed at a
- // safepoint.
-
- // Make sure CompiledIC_lock in unlocked, since we might update some
- // inline caches. If it is, we just bail-out and try later.
- if (CompiledIC_lock->is_locked() || Patching_lock->is_locked()) return;
+ // If we do not want to reclaim not-entrant or zombie methods there is no need
+ // to scan stacks
+ if (!MethodFlushing) {
+ return;
+ }
// Check for restart
assert(CodeCache::find_blob_unsafe(_current) == _current, "Sweeper nmethod cached state invalid");
- if (!sweep_in_progress() && _resweep) {
+ if (!sweep_in_progress() && need_marking_phase()) {
_seen = 0;
_invocations = NmethodSweepFraction;
_current = CodeCache::first_nmethod();
@@ -197,30 +212,22 @@
Threads::nmethods_do(&mark_activation_closure);
// reset the flags since we started a scan from the beginning.
- _resweep = false;
+ reset_nmethod_marking();
_locked_seen = 0;
_not_entrant_seen_on_stack = 0;
+ } else {
+ // Only set hotness counter
+ Threads::nmethods_do(&set_hotness_closure);
}
- if (UseCodeCacheFlushing) {
- // only allow new flushes after the interval is complete.
- jlong now = os::javaTimeMillis();
- jlong max_interval = (jlong)MinCodeCacheFlushingInterval * (jlong)1000;
- jlong curr_interval = now - _last_full_flush_time;
- if (curr_interval > max_interval) {
- _flush_token = 0;
- }
-
- if (!CodeCache::needs_flushing() && !CompileBroker::should_compile_new_jobs()) {
- CompileBroker::set_should_compile_new_jobs(CompileBroker::run_compilation);
- log_sweep("restart_compiler");
- }
- }
+ OrderAccess::storestore();
}
void NMethodSweeper::possibly_sweep() {
assert(JavaThread::current()->thread_state() == _thread_in_vm, "must run in vm mode");
- if (!MethodFlushing || !sweep_in_progress()) return;
+ if (!MethodFlushing || !sweep_in_progress()) {
+ return;
+ }
if (_invocations > 0) {
// Only one thread at a time will sweep
@@ -258,8 +265,7 @@
if (!CompileBroker::should_compile_new_jobs()) {
// If we have turned off compilations we might as well do full sweeps
// in order to reach the clean state faster. Otherwise the sleeping compiler
- // threads will slow down sweeping. After a few iterations the cache
- // will be clean and sweeping stops (_resweep will not be set)
+ // threads will slow down sweeping.
_invocations = 1;
}
@@ -269,15 +275,19 @@
// the number of nmethods changes during the sweep so the final
// stage must iterate until it there are no more nmethods.
int todo = (CodeCache::nof_nmethods() - _seen) / _invocations;
+ int swept_count = 0;
+
assert(!SafepointSynchronize::is_at_safepoint(), "should not be in safepoint when we get here");
assert(!CodeCache_lock->owned_by_self(), "just checking");
+ int freed_memory = 0;
{
MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
// The last invocation iterates until there are no more nmethods
for (int i = 0; (i < todo || _invocations == 1) && _current != NULL; i++) {
+ swept_count++;
if (SafepointSynchronize::is_synchronizing()) { // Safepoint request
if (PrintMethodFlushing && Verbose) {
tty->print_cr("### Sweep at %d out of %d, invocation: %d, yielding to safepoint", _seen, CodeCache::nof_nmethods(), _invocations);
@@ -297,7 +307,7 @@
// Now ready to process nmethod and give up CodeCache_lock
{
MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
- process_nmethod(_current);
+ freed_memory += process_nmethod(_current);
}
_seen++;
_current = next;
@@ -306,11 +316,11 @@
assert(_invocations > 1 || _current == NULL, "must have scanned the whole cache");
- if (!sweep_in_progress() && !_resweep && (_locked_seen || _not_entrant_seen_on_stack)) {
+ if (!sweep_in_progress() && !need_marking_phase() && (_locked_seen || _not_entrant_seen_on_stack)) {
// we've completed a scan without making progress but there were
// nmethods we were unable to process either because they were
- // locked or were still on stack. We don't have to aggresively
- // clean them up so just stop scanning. We could scan once more
+ // locked or were still on stack. We don't have to aggressively
+ // clean them up so just stop scanning. We could scan once more
// but that complicates the control logic and it's unlikely to
// matter much.
if (PrintMethodFlushing) {
@@ -331,7 +341,7 @@
event.set_endtime(sweep_end_counter);
event.set_sweepIndex(_traversals);
event.set_sweepFractionIndex(NmethodSweepFraction - _invocations + 1);
- event.set_sweptCount(todo);
+ event.set_sweptCount(swept_count);
event.set_flushedCount(_flushed_count);
event.set_markedCount(_marked_count);
event.set_zombifiedCount(_zombified_count);
@@ -349,9 +359,16 @@
log_sweep("finished");
}
- // Sweeper is the only case where memory is released,
- // check here if it is time to restart the compiler.
- if (UseCodeCacheFlushing && !CompileBroker::should_compile_new_jobs() && !CodeCache::needs_flushing()) {
+ // Sweeper is the only case where memory is released, check here if it
+ // is time to restart the compiler. Only checking if there is a certain
+ // amount of free memory in the code cache might lead to re-enabling
+ // compilation although no memory has been released. For example, there are
+ // cases when compilation was disabled although there is 4MB (or more) free
+ // memory in the code cache. The reason is code cache fragmentation. Therefore,
+ // it only makes sense to re-enable compilation if we have actually freed memory.
+ // Note that typically several kB are released for sweeping 16MB of the code
+ // cache. As a result, 'freed_memory' > 0 to restart the compiler.
+ if (UseCodeCacheFlushing && (!CompileBroker::should_compile_new_jobs() && (freed_memory > 0))) {
CompileBroker::set_should_compile_new_jobs(CompileBroker::run_compilation);
log_sweep("restart_compiler");
}
@@ -365,8 +382,8 @@
_thread = CompilerThread::current();
if (!nm->is_zombie() && !nm->is_unloaded()) {
// Only expose live nmethods for scanning
- _thread->set_scanned_nmethod(nm);
- }
+ _thread->set_scanned_nmethod(nm);
+ }
}
~NMethodMarker() {
_thread->set_scanned_nmethod(NULL);
@@ -390,20 +407,20 @@
nm->flush();
}
-void NMethodSweeper::process_nmethod(nmethod *nm) {
+int NMethodSweeper::process_nmethod(nmethod *nm) {
assert(!CodeCache_lock->owned_by_self(), "just checking");
+ int freed_memory = 0;
// Make sure this nmethod doesn't get unloaded during the scan,
- // since the locks acquired below might safepoint.
+ // since safepoints may happen during acquired below locks.
NMethodMarker nmm(nm);
-
SWEEP(nm);
// Skip methods that are currently referenced by the VM
if (nm->is_locked_by_vm()) {
// But still remember to clean-up inline caches for alive nmethods
if (nm->is_alive()) {
- // Clean-up all inline caches that points to zombie/non-reentrant methods
+ // Clean inline caches that point to zombie/non-entrant methods
MutexLocker cl(CompiledIC_lock);
nm->cleanup_inline_caches();
SWEEP(nm);
@@ -411,18 +428,19 @@
_locked_seen++;
SWEEP(nm);
}
- return;
+ return freed_memory;
}
if (nm->is_zombie()) {
- // If it is first time, we see nmethod then we mark it. Otherwise,
- // we reclame it. When we have seen a zombie method twice, we know that
+ // If it is the first time we see nmethod then we mark it. Otherwise,
+ // we reclaim it. When we have seen a zombie method twice, we know that
// there are no inline caches that refer to it.
if (nm->is_marked_for_reclamation()) {
assert(!nm->is_locked_by_vm(), "must not flush locked nmethods");
if (PrintMethodFlushing && Verbose) {
tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (marked for reclamation) being flushed", nm->compile_id(), nm);
}
+ freed_memory = nm->total_size();
release_nmethod(nm);
_flushed_count++;
} else {
@@ -430,19 +448,19 @@
tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (zombie) being marked for reclamation", nm->compile_id(), nm);
}
nm->mark_for_reclamation();
- _resweep = true;
+ request_nmethod_marking();
_marked_count++;
SWEEP(nm);
}
} else if (nm->is_not_entrant()) {
- // If there is no current activations of this method on the
+ // If there are no current activations of this method on the
// stack we can safely convert it to a zombie method
if (nm->can_not_entrant_be_converted()) {
if (PrintMethodFlushing && Verbose) {
tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (not entrant) being made zombie", nm->compile_id(), nm);
}
nm->make_zombie();
- _resweep = true;
+ request_nmethod_marking();
_zombified_count++;
SWEEP(nm);
} else {
@@ -457,159 +475,57 @@
}
} else if (nm->is_unloaded()) {
// Unloaded code, just make it a zombie
- if (PrintMethodFlushing && Verbose)
+ if (PrintMethodFlushing && Verbose) {
tty->print_cr("### Nmethod %3d/" PTR_FORMAT " (unloaded) being made zombie", nm->compile_id(), nm);
-
+ }
if (nm->is_osr_method()) {
SWEEP(nm);
// No inline caches will ever point to osr methods, so we can just remove it
+ freed_memory = nm->total_size();
release_nmethod(nm);
_flushed_count++;
} else {
nm->make_zombie();
- _resweep = true;
+ request_nmethod_marking();
_zombified_count++;
SWEEP(nm);
}
} else {
- assert(nm->is_alive(), "should be alive");
-
if (UseCodeCacheFlushing) {
- if (nm->is_speculatively_disconnected() && !nm->is_locked_by_vm() && !nm->is_osr_method() &&
- (_traversals > _last_flush_traversal_id + 2) && (nm->compile_id() < _highest_marked)) {
- // This method has not been called since the forced cleanup happened
- nm->make_not_entrant();
+ if (!nm->is_locked_by_vm() && !nm->is_osr_method() && !nm->is_native_method()) {
+ // Do not make native methods and OSR-methods not-entrant
+ nm->dec_hotness_counter();
+ // Get the initial value of the hotness counter. This value depends on the
+ // ReservedCodeCacheSize
+ int reset_val = hotness_counter_reset_val();
+ int time_since_reset = reset_val - nm->hotness_counter();
+ double threshold = -reset_val + (CodeCache::reverse_free_ratio() * NmethodSweepActivity);
+ // The less free space in the code cache we have - the bigger reverse_free_ratio() is.
+ // I.e., 'threshold' increases with lower available space in the code cache and a higher
+ // NmethodSweepActivity. If the current hotness counter - which decreases from its initial
+ // value until it is reset by stack walking - is smaller than the computed threshold, the
+ // corresponding nmethod is considered for removal.
+ if ((NmethodSweepActivity > 0) && (nm->hotness_counter() < threshold) && (time_since_reset > 10)) {
+ // A method is marked as not-entrant if the method is
+ // 1) 'old enough': nm->hotness_counter() < threshold
+ // 2) The method was in_use for a minimum amount of time: (time_since_reset > 10)
+ // The second condition is necessary if we are dealing with very small code cache
+ // sizes (e.g., <10m) and the code cache size is too small to hold all hot methods.
+ // The second condition ensures that methods are not immediately made not-entrant
+ // after compilation.
+ nm->make_not_entrant();
+ request_nmethod_marking();
+ }
}
}
-
- // Clean-up all inline caches that points to zombie/non-reentrant methods
+ // Clean-up all inline caches that point to zombie/non-reentrant methods
MutexLocker cl(CompiledIC_lock);
nm->cleanup_inline_caches();
SWEEP(nm);
}
-}
-
-// Code cache unloading: when compilers notice the code cache is getting full,
-// they will call a vm op that comes here. This code attempts to speculatively
-// unload the oldest half of the nmethods (based on the compile job id) by
-// saving the old code in a list in the CodeCache. Then
-// execution resumes. If a method so marked is not called by the second sweeper
-// stack traversal after the current one, the nmethod will be marked non-entrant and
-// got rid of by normal sweeping. If the method is called, the Method*'s
-// _code field is restored and the Method*/nmethod
-// go back to their normal state.
-void NMethodSweeper::handle_full_code_cache(bool is_full) {
-
- if (is_full) {
- // Since code cache is full, immediately stop new compiles
- if (CompileBroker::set_should_compile_new_jobs(CompileBroker::stop_compilation)) {
- log_sweep("disable_compiler");
- }
- }
-
- // Make sure only one thread can flush
- // The token is reset after CodeCacheMinimumFlushInterval in scan stacks,
- // no need to check the timeout here.
- jint old = Atomic::cmpxchg( 1, &_flush_token, 0 );
- if (old != 0) {
- return;
- }
-
- VM_HandleFullCodeCache op(is_full);
- VMThread::execute(&op);
-
- // resweep again as soon as possible
- _resweep = true;
+ return freed_memory;
}
-void NMethodSweeper::speculative_disconnect_nmethods(bool is_full) {
- // If there was a race in detecting full code cache, only run
- // one vm op for it or keep the compiler shut off
-
- jlong disconnect_start_counter = os::elapsed_counter();
-
- // Traverse the code cache trying to dump the oldest nmethods
- int curr_max_comp_id = CompileBroker::get_compilation_id();
- int flush_target = ((curr_max_comp_id - _dead_compile_ids) / CodeCacheFlushingFraction) + _dead_compile_ids;
-
- log_sweep("start_cleaning");
-
- nmethod* nm = CodeCache::alive_nmethod(CodeCache::first());
- jint disconnected = 0;
- jint made_not_entrant = 0;
- jint nmethod_count = 0;
-
- while ((nm != NULL)){
- int curr_comp_id = nm->compile_id();
-
- // OSR methods cannot be flushed like this. Also, don't flush native methods
- // since they are part of the JDK in most cases
- if (!nm->is_osr_method() && !nm->is_locked_by_vm() && !nm->is_native_method()) {
-
- // only count methods that can be speculatively disconnected
- nmethod_count++;
-
- if (nm->is_in_use() && (curr_comp_id < flush_target)) {
- if ((nm->method()->code() == nm)) {
- // This method has not been previously considered for
- // unloading or it was restored already
- CodeCache::speculatively_disconnect(nm);
- disconnected++;
- } else if (nm->is_speculatively_disconnected()) {
- // This method was previously considered for preemptive unloading and was not called since then
- CompilationPolicy::policy()->delay_compilation(nm->method());
- nm->make_not_entrant();
- made_not_entrant++;
- }
-
- if (curr_comp_id > _highest_marked) {
- _highest_marked = curr_comp_id;
- }
- }
- }
- nm = CodeCache::alive_nmethod(CodeCache::next(nm));
- }
-
- // remember how many compile_ids wheren't seen last flush.
- _dead_compile_ids = curr_max_comp_id - nmethod_count;
-
- log_sweep("stop_cleaning",
- "disconnected='" UINT32_FORMAT "' made_not_entrant='" UINT32_FORMAT "'",
- disconnected, made_not_entrant);
-
- // Shut off compiler. Sweeper will start over with a new stack scan and
- // traversal cycle and turn it back on if it clears enough space.
- if (is_full) {
- _last_full_flush_time = os::javaTimeMillis();
- }
-
- jlong disconnect_end_counter = os::elapsed_counter();
- jlong disconnect_time = disconnect_end_counter - disconnect_start_counter;
- _total_disconnect_time += disconnect_time;
- _peak_disconnect_time = MAX2(disconnect_time, _peak_disconnect_time);
-
- EventCleanCodeCache event(UNTIMED);
- if (event.should_commit()) {
- event.set_starttime(disconnect_start_counter);
- event.set_endtime(disconnect_end_counter);
- event.set_disconnectedCount(disconnected);
- event.set_madeNonEntrantCount(made_not_entrant);
- event.commit();
- }
- _number_of_flushes++;
-
- // After two more traversals the sweeper will get rid of unrestored nmethods
- _last_flush_traversal_id = _traversals;
- _resweep = true;
-#ifdef ASSERT
-
- if(PrintMethodFlushing && Verbose) {
- tty->print_cr("### sweeper: unload time: " INT64_FORMAT, (jlong)disconnect_time);
- }
-#endif
-}
-
-
// Print out some state information about the current sweep and the
// state of the code cache if it's requested.
void NMethodSweeper::log_sweep(const char* msg, const char* format, ...) {
--- a/hotspot/src/share/vm/runtime/sweeper.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sweeper.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -27,8 +27,30 @@
// An NmethodSweeper is an incremental cleaner for:
// - cleanup inline caches
-// - reclamation of unreferences zombie nmethods
-//
+// - reclamation of nmethods
+// Removing nmethods from the code cache includes two operations
+// 1) mark active nmethods
+// Is done in 'mark_active_nmethods()'. This function is called at a
+// safepoint and marks all nmethods that are active on a thread's stack.
+// 2) sweep nmethods
+// Is done in sweep_code_cache(). This function is the only place in the
+// sweeper where memory is reclaimed. Note that sweep_code_cache() is not
+// called at a safepoint. However, sweep_code_cache() stops executing if
+// another thread requests a safepoint. Consequently, 'mark_active_nmethods()'
+// and sweep_code_cache() cannot execute at the same time.
+// To reclaim memory, nmethods are first marked as 'not-entrant'. Methods can
+// be made not-entrant by (i) the sweeper, (ii) deoptimization, (iii) dependency
+// invalidation, and (iv) being replaced be a different method version (tiered
+// compilation). Not-entrant nmethod cannot be called by Java threads, but they
+// can still be active on the stack. To ensure that active nmethod are not reclaimed,
+// we have to wait until the next marking phase has completed. If a not-entrant
+// nmethod was NOT marked as active, it can be converted to 'zombie' state. To safely
+// remove the nmethod, all inline caches (IC) that point to the the nmethod must be
+// cleared. After that, the nmethod can be evicted from the code cache. Each nmethod's
+// state change happens during separate sweeps. It may take at least 3 sweeps before an
+// nmethod's space is freed. Sweeping is currently done by compiler threads between
+// compilations or at least each 5 sec (NmethodSweepCheckInterval) when the code cache
+// is full.
class NMethodSweeper : public AllStatic {
static long _traversals; // Stack scan count, also sweep ID.
@@ -41,46 +63,38 @@
static volatile int _invocations; // No. of invocations left until we are completed with this pass
static volatile int _sweep_started; // Flag to control conc sweeper
- //The following are reset in scan_stacks and synchronized by the safepoint
- static bool _resweep; // Indicates that a change has happend and we want another sweep,
- // always checked and reset at a safepoint so memory will be in sync.
- static int _locked_seen; // Number of locked nmethods encountered during the scan
+ //The following are reset in mark_active_nmethods and synchronized by the safepoint
+ static bool _request_mark_phase; // Indicates that a change has happend and we need another mark pahse,
+ // always checked and reset at a safepoint so memory will be in sync.
+ static int _locked_seen; // Number of locked nmethods encountered during the scan
static int _not_entrant_seen_on_stack; // Number of not entrant nmethod were are still on stack
- static jint _flush_token; // token that guards method flushing, making sure it is executed only once.
-
- // These are set during a flush, a VM-operation
- static long _last_flush_traversal_id; // trav number at last flush unloading
- static jlong _last_full_flush_time; // timestamp of last emergency unloading
-
- // These are synchronized by the _sweep_started token
- static int _highest_marked; // highest compile id dumped at last emergency unloading
- static int _dead_compile_ids; // number of compile ids that where not in the cache last flush
// Stat counters
- static int _number_of_flushes; // Total of full traversals caused by full cache
static int _total_nof_methods_reclaimed; // Accumulated nof methods flushed
static jlong _total_time_sweeping; // Accumulated time sweeping
static jlong _total_time_this_sweep; // Total time this sweep
static jlong _peak_sweep_time; // Peak time for a full sweep
static jlong _peak_sweep_fraction_time; // Peak time sweeping one fraction
- static jlong _total_disconnect_time; // Total time cleaning code mem
- static jlong _peak_disconnect_time; // Peak time cleaning code mem
- static void process_nmethod(nmethod *nm);
+ static int process_nmethod(nmethod *nm);
static void release_nmethod(nmethod* nm);
- static void log_sweep(const char* msg, const char* format = NULL, ...);
static bool sweep_in_progress();
+ static void sweep_code_cache();
+ static void request_nmethod_marking() { _request_mark_phase = true; }
+ static void reset_nmethod_marking() { _request_mark_phase = false; }
+ static bool need_marking_phase() { return _request_mark_phase; }
+
+ static int _hotness_counter_reset_val;
public:
static long traversal_count() { return _traversals; }
- static int number_of_flushes() { return _number_of_flushes; }
static int total_nof_methods_reclaimed() { return _total_nof_methods_reclaimed; }
static jlong total_time_sweeping() { return _total_time_sweeping; }
static jlong peak_sweep_time() { return _peak_sweep_time; }
static jlong peak_sweep_fraction_time() { return _peak_sweep_fraction_time; }
- static jlong total_disconnect_time() { return _total_disconnect_time; }
- static jlong peak_disconnect_time() { return _peak_disconnect_time; }
+ static void log_sweep(const char* msg, const char* format = NULL, ...);
+
#ifdef ASSERT
static bool is_sweeping(nmethod* which) { return _current == which; }
@@ -90,19 +104,18 @@
static void report_events();
#endif
- static void scan_stacks(); // Invoked at the end of each safepoint
- static void sweep_code_cache(); // Concurrent part of sweep job
- static void possibly_sweep(); // Compiler threads call this to sweep
+ static void mark_active_nmethods(); // Invoked at the end of each safepoint
+ static void possibly_sweep(); // Compiler threads call this to sweep
- static void notify(nmethod* nm) {
+ static int sort_nmethods_by_hotness(nmethod** nm1, nmethod** nm2);
+ static int hotness_counter_reset_val();
+
+ static void notify() {
// Request a new sweep of the code cache from the beginning. No
// need to synchronize the setting of this flag since it only
// changes to false at safepoint so we can never overwrite it with false.
- _resweep = true;
+ request_nmethod_marking();
}
-
- static void handle_full_code_cache(bool is_full); // Called by compilers who fail to allocate
- static void speculative_disconnect_nmethods(bool was_full); // Called by vm op to deal with alloc failure
};
#endif // SHARE_VM_RUNTIME_SWEEPER_HPP
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -154,7 +154,7 @@
static volatile intptr_t ListLock = 0 ; // protects global monitor free-list cache
static volatile int MonitorFreeCount = 0 ; // # on gFreeList
static volatile int MonitorPopulation = 0 ; // # Extant -- in circulation
-#define CHAINMARKER ((oop)-1)
+#define CHAINMARKER (cast_to_oop<intptr_t>(-1))
// -----------------------------------------------------------------------------
// Fast Monitor Enter/Exit
@@ -510,7 +510,7 @@
// then for each thread on the list, set the flag and unpark() the thread.
// This is conceptually similar to muxAcquire-muxRelease, except that muxRelease
// wakes at most one thread whereas we need to wake the entire list.
- int ix = (intptr_t(obj) >> 5) & (NINFLATIONLOCKS-1) ;
+ int ix = (cast_from_oop<intptr_t>(obj) >> 5) & (NINFLATIONLOCKS-1) ;
int YieldThenBlock = 0 ;
assert (ix >= 0 && ix < NINFLATIONLOCKS, "invariant") ;
assert ((NINFLATIONLOCKS & (NINFLATIONLOCKS-1)) == 0, "invariant") ;
@@ -565,7 +565,7 @@
// This variation has the property of being stable (idempotent)
// between STW operations. This can be useful in some of the 1-0
// synchronization schemes.
- intptr_t addrBits = intptr_t(obj) >> 3 ;
+ intptr_t addrBits = cast_from_oop<intptr_t>(obj) >> 3 ;
value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;
} else
if (hashCode == 2) {
@@ -575,7 +575,7 @@
value = ++GVars.hcSequence ;
} else
if (hashCode == 4) {
- value = intptr_t(obj) ;
+ value = cast_from_oop<intptr_t>(obj) ;
} else {
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
@@ -1321,7 +1321,7 @@
if (object->is_instance()) {
ResourceMark rm;
tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
- (intptr_t) object, (intptr_t) object->mark(),
+ (void *) object, (intptr_t) object->mark(),
object->klass()->external_name());
}
}
@@ -1371,7 +1371,7 @@
if (object->is_instance()) {
ResourceMark rm;
tty->print_cr("Inflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
- (intptr_t) object, (intptr_t) object->mark(),
+ (void *) object, (intptr_t) object->mark(),
object->klass()->external_name());
}
}
@@ -1439,7 +1439,7 @@
if (obj->is_instance()) {
ResourceMark rm;
tty->print_cr("Deflating object " INTPTR_FORMAT " , mark " INTPTR_FORMAT " , type %s",
- (intptr_t) obj, (intptr_t) obj->mark(), obj->klass()->external_name());
+ (void *) obj, (intptr_t) obj->mark(), obj->klass()->external_name());
}
}
--- a/hotspot/src/share/vm/runtime/thread.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/thread.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -333,6 +333,8 @@
// Reclaim the objectmonitors from the omFreeList of the moribund thread.
ObjectSynchronizer::omFlush (this) ;
+ EVENT_THREAD_DESTRUCT(this);
+
// stack_base can be NULL if the thread is never started or exited before
// record_stack_base_and_size called. Although, we would like to ensure
// that all started threads do call record_stack_base_and_size(), there is
@@ -1442,7 +1444,7 @@
_in_deopt_handler = 0;
_doing_unsafe_access = false;
_stack_guard_state = stack_guard_unused;
- _exception_oop = NULL;
+ (void)const_cast<oop&>(_exception_oop = NULL);
_exception_pc = 0;
_exception_handler_pc = 0;
_is_method_handle_return = 0;
@@ -3329,6 +3331,11 @@
jint parse_result = Arguments::parse(args);
if (parse_result != JNI_OK) return parse_result;
+ os::init_before_ergo();
+
+ jint ergo_result = Arguments::apply_ergo();
+ if (ergo_result != JNI_OK) return ergo_result;
+
if (PauseAtStartup) {
os::pause();
}
@@ -3714,7 +3721,7 @@
const char *name = agent->name();
const char *msg = "Could not find agent library ";
- // First check to see if agent is statcally linked into executable
+ // First check to see if agent is statically linked into executable
if (os::find_builtin_agent(agent, on_load_symbols, num_symbol_entries)) {
library = agent->os_lib();
} else if (agent->is_absolute_path()) {
--- a/hotspot/src/share/vm/runtime/thread.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/thread.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1278,7 +1278,7 @@
address exception_handler_pc() const { return _exception_handler_pc; }
bool is_method_handle_return() const { return _is_method_handle_return == 1; }
- void set_exception_oop(oop o) { _exception_oop = o; }
+ void set_exception_oop(oop o) { (void)const_cast<oop&>(_exception_oop = o); }
void set_exception_pc(address a) { _exception_pc = a; }
void set_exception_handler_pc(address a) { _exception_handler_pc = a; }
void set_is_method_handle_return(bool value) { _is_method_handle_return = value ? 1 : 0; }
--- a/hotspot/src/share/vm/runtime/vframeArray.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vframeArray.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -111,7 +111,7 @@
case T_OBJECT:
assert(!value->obj_is_scalar_replaced(), "object should be reallocated already");
// preserve object type
- _locals->add( new StackValue((intptr_t) (value->get_obj()()), T_OBJECT ));
+ _locals->add( new StackValue(cast_from_oop<intptr_t>((value->get_obj()())), T_OBJECT ));
break;
case T_CONFLICT:
// A dead local. Will be initialized to null/zero.
@@ -136,7 +136,7 @@
case T_OBJECT:
assert(!value->obj_is_scalar_replaced(), "object should be reallocated already");
// preserve object type
- _expressions->add( new StackValue((intptr_t) (value->get_obj()()), T_OBJECT ));
+ _expressions->add( new StackValue(cast_from_oop<intptr_t>((value->get_obj()())), T_OBJECT ));
break;
case T_CONFLICT:
// A dead stack element. Will be initialized to null/zero.
--- a/hotspot/src/share/vm/runtime/virtualspace.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/virtualspace.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -453,6 +453,42 @@
return reserved_size() - committed_size();
}
+size_t VirtualSpace::actual_committed_size() const {
+ // Special VirtualSpaces commit all reserved space up front.
+ if (special()) {
+ return reserved_size();
+ }
+
+ size_t committed_low = pointer_delta(_lower_high, _low_boundary, sizeof(char));
+ size_t committed_middle = pointer_delta(_middle_high, _lower_high_boundary, sizeof(char));
+ size_t committed_high = pointer_delta(_upper_high, _middle_high_boundary, sizeof(char));
+
+#ifdef ASSERT
+ size_t lower = pointer_delta(_lower_high_boundary, _low_boundary, sizeof(char));
+ size_t middle = pointer_delta(_middle_high_boundary, _lower_high_boundary, sizeof(char));
+ size_t upper = pointer_delta(_upper_high_boundary, _middle_high_boundary, sizeof(char));
+
+ if (committed_high > 0) {
+ assert(committed_low == lower, "Must be");
+ assert(committed_middle == middle, "Must be");
+ }
+
+ if (committed_middle > 0) {
+ assert(committed_low == lower, "Must be");
+ }
+ if (committed_middle < middle) {
+ assert(committed_high == 0, "Must be");
+ }
+
+ if (committed_low < lower) {
+ assert(committed_high == 0, "Must be");
+ assert(committed_middle == 0, "Must be");
+ }
+#endif
+
+ return committed_low + committed_middle + committed_high;
+}
+
bool VirtualSpace::contains(const void* p) const {
return low() <= (const char*) p && (const char*) p < high();
@@ -718,16 +754,19 @@
assert(high() <= upper_high(), "upper high");
}
-void VirtualSpace::print() {
- tty->print ("Virtual space:");
- if (special()) tty->print(" (pinned in memory)");
- tty->cr();
- tty->print_cr(" - committed: " SIZE_FORMAT, committed_size());
- tty->print_cr(" - reserved: " SIZE_FORMAT, reserved_size());
- tty->print_cr(" - [low, high]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low(), high());
- tty->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low_boundary(), high_boundary());
+void VirtualSpace::print_on(outputStream* out) {
+ out->print ("Virtual space:");
+ if (special()) out->print(" (pinned in memory)");
+ out->cr();
+ out->print_cr(" - committed: " SIZE_FORMAT, committed_size());
+ out->print_cr(" - reserved: " SIZE_FORMAT, reserved_size());
+ out->print_cr(" - [low, high]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low(), high());
+ out->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low_boundary(), high_boundary());
}
+void VirtualSpace::print() {
+ print_on(tty);
+}
/////////////// Unit tests ///////////////
@@ -910,6 +949,109 @@
TestReservedSpace::test_reserved_space();
}
+#define assert_equals(actual, expected) \
+ assert(actual == expected, \
+ err_msg("Got " SIZE_FORMAT " expected " \
+ SIZE_FORMAT, actual, expected));
+
+#define assert_ge(value1, value2) \
+ assert(value1 >= value2, \
+ err_msg("'" #value1 "': " SIZE_FORMAT " '" \
+ #value2 "': " SIZE_FORMAT, value1, value2));
+
+#define assert_lt(value1, value2) \
+ assert(value1 < value2, \
+ err_msg("'" #value1 "': " SIZE_FORMAT " '" \
+ #value2 "': " SIZE_FORMAT, value1, value2));
+
+
+class TestVirtualSpace : AllStatic {
+ public:
+ static void test_virtual_space_actual_committed_space(size_t reserve_size, size_t commit_size) {
+ size_t granularity = os::vm_allocation_granularity();
+ size_t reserve_size_aligned = align_size_up(reserve_size, granularity);
+
+ ReservedSpace reserved(reserve_size_aligned);
+
+ assert(reserved.is_reserved(), "Must be");
+
+ VirtualSpace vs;
+ bool initialized = vs.initialize(reserved, 0);
+ assert(initialized, "Failed to initialize VirtualSpace");
+
+ vs.expand_by(commit_size, false);
+
+ if (vs.special()) {
+ assert_equals(vs.actual_committed_size(), reserve_size_aligned);
+ } else {
+ assert_ge(vs.actual_committed_size(), commit_size);
+ // Approximate the commit granularity.
+ size_t commit_granularity = UseLargePages ? os::large_page_size() : os::vm_page_size();
+ assert_lt(vs.actual_committed_size(), commit_size + commit_granularity);
+ }
+
+ reserved.release();
+ }
+
+ static void test_virtual_space_actual_committed_space_one_large_page() {
+ if (!UseLargePages) {
+ return;
+ }
+
+ size_t large_page_size = os::large_page_size();
+
+ ReservedSpace reserved(large_page_size, large_page_size, true, false);
+
+ assert(reserved.is_reserved(), "Must be");
+
+ VirtualSpace vs;
+ bool initialized = vs.initialize(reserved, 0);
+ assert(initialized, "Failed to initialize VirtualSpace");
+
+ vs.expand_by(large_page_size, false);
+
+ assert_equals(vs.actual_committed_size(), large_page_size);
+
+ reserved.release();
+ }
+
+ static void test_virtual_space_actual_committed_space() {
+ test_virtual_space_actual_committed_space(4 * K, 0);
+ test_virtual_space_actual_committed_space(4 * K, 4 * K);
+ test_virtual_space_actual_committed_space(8 * K, 0);
+ test_virtual_space_actual_committed_space(8 * K, 4 * K);
+ test_virtual_space_actual_committed_space(8 * K, 8 * K);
+ test_virtual_space_actual_committed_space(12 * K, 0);
+ test_virtual_space_actual_committed_space(12 * K, 4 * K);
+ test_virtual_space_actual_committed_space(12 * K, 8 * K);
+ test_virtual_space_actual_committed_space(12 * K, 12 * K);
+ test_virtual_space_actual_committed_space(64 * K, 0);
+ test_virtual_space_actual_committed_space(64 * K, 32 * K);
+ test_virtual_space_actual_committed_space(64 * K, 64 * K);
+ test_virtual_space_actual_committed_space(2 * M, 0);
+ test_virtual_space_actual_committed_space(2 * M, 4 * K);
+ test_virtual_space_actual_committed_space(2 * M, 64 * K);
+ test_virtual_space_actual_committed_space(2 * M, 1 * M);
+ test_virtual_space_actual_committed_space(2 * M, 2 * M);
+ test_virtual_space_actual_committed_space(10 * M, 0);
+ test_virtual_space_actual_committed_space(10 * M, 4 * K);
+ test_virtual_space_actual_committed_space(10 * M, 8 * K);
+ test_virtual_space_actual_committed_space(10 * M, 1 * M);
+ test_virtual_space_actual_committed_space(10 * M, 2 * M);
+ test_virtual_space_actual_committed_space(10 * M, 5 * M);
+ test_virtual_space_actual_committed_space(10 * M, 10 * M);
+ }
+
+ static void test_virtual_space() {
+ test_virtual_space_actual_committed_space();
+ test_virtual_space_actual_committed_space_one_large_page();
+ }
+};
+
+void TestVirtualSpace_test() {
+ TestVirtualSpace::test_virtual_space();
+}
+
#endif // PRODUCT
#endif
--- a/hotspot/src/share/vm/runtime/virtualspace.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/virtualspace.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -183,11 +183,16 @@
// Destruction
~VirtualSpace();
- // Testers (all sizes are byte sizes)
- size_t committed_size() const;
- size_t reserved_size() const;
+ // Reserved memory
+ size_t reserved_size() const;
+ // Actually committed OS memory
+ size_t actual_committed_size() const;
+ // Memory used/expanded in this virtual space
+ size_t committed_size() const;
+ // Memory left to use/expand in this virtual space
size_t uncommitted_size() const;
- bool contains(const void* p) const;
+
+ bool contains(const void* p) const;
// Operations
// returns true on success, false otherwise
@@ -198,7 +203,8 @@
void check_for_contiguity() PRODUCT_RETURN;
// Debugging
- void print() PRODUCT_RETURN;
+ void print_on(outputStream* out) PRODUCT_RETURN;
+ void print();
};
#endif // SHARE_VM_RUNTIME_VIRTUALSPACE_HPP
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -176,6 +176,7 @@
#include "opto/loopnode.hpp"
#include "opto/machnode.hpp"
#include "opto/matcher.hpp"
+#include "opto/mathexactnode.hpp"
#include "opto/mulnode.hpp"
#include "opto/phaseX.hpp"
#include "opto/parse.hpp"
@@ -315,7 +316,6 @@
nonstatic_field(InstanceKlass, _breakpoints, BreakpointInfo*) \
nonstatic_field(InstanceKlass, _generic_signature_index, u2) \
nonstatic_field(InstanceKlass, _methods_jmethod_ids, jmethodID*) \
- nonstatic_field(InstanceKlass, _methods_cached_itable_indices, int*) \
volatile_nonstatic_field(InstanceKlass, _idnum_allocated_count, u2) \
nonstatic_field(InstanceKlass, _annotations, Annotations*) \
nonstatic_field(InstanceKlass, _dependencies, nmethodBucket*) \
@@ -330,11 +330,13 @@
nonstatic_field(Klass, _java_mirror, oop) \
nonstatic_field(Klass, _modifier_flags, jint) \
nonstatic_field(Klass, _super, Klass*) \
+ nonstatic_field(Klass, _subklass, Klass*) \
nonstatic_field(Klass, _layout_helper, jint) \
nonstatic_field(Klass, _name, Symbol*) \
nonstatic_field(Klass, _access_flags, AccessFlags) \
- nonstatic_field(Klass, _subklass, Klass*) \
+ nonstatic_field(Klass, _prototype_header, markOop) \
nonstatic_field(Klass, _next_sibling, Klass*) \
+ nonstatic_field(vtableEntry, _method, Method*) \
nonstatic_field(MethodData, _size, int) \
nonstatic_field(MethodData, _method, Method*) \
nonstatic_field(MethodData, _data_size, int) \
@@ -342,10 +344,15 @@
nonstatic_field(MethodData, _nof_decompiles, uint) \
nonstatic_field(MethodData, _nof_overflow_recompiles, uint) \
nonstatic_field(MethodData, _nof_overflow_traps, uint) \
+ nonstatic_field(MethodData, _trap_hist._array[0], u1) \
nonstatic_field(MethodData, _eflags, intx) \
nonstatic_field(MethodData, _arg_local, intx) \
nonstatic_field(MethodData, _arg_stack, intx) \
nonstatic_field(MethodData, _arg_returned, intx) \
+ nonstatic_field(DataLayout, _header._struct._tag, u1) \
+ nonstatic_field(DataLayout, _header._struct._flags, u1) \
+ nonstatic_field(DataLayout, _header._struct._bci, u2) \
+ nonstatic_field(DataLayout, _cells[0], intptr_t) \
nonstatic_field(MethodCounters, _interpreter_invocation_count, int) \
nonstatic_field(MethodCounters, _interpreter_throwout_count, u2) \
nonstatic_field(MethodCounters, _number_of_breakpoints, u2) \
@@ -357,6 +364,7 @@
nonstatic_field(Method, _access_flags, AccessFlags) \
nonstatic_field(Method, _vtable_index, int) \
nonstatic_field(Method, _method_size, u2) \
+ nonstatic_field(Method, _intrinsic_id, u1) \
nonproduct_nonstatic_field(Method, _compiled_invocation_count, int) \
volatile_nonstatic_field(Method, _code, nmethod*) \
nonstatic_field(Method, _i2i_entry, address) \
@@ -443,12 +451,19 @@
static_field(Universe, _bootstrapping, bool) \
static_field(Universe, _fully_initialized, bool) \
static_field(Universe, _verify_count, int) \
+ static_field(Universe, _non_oop_bits, intptr_t) \
static_field(Universe, _narrow_oop._base, address) \
static_field(Universe, _narrow_oop._shift, int) \
static_field(Universe, _narrow_oop._use_implicit_null_checks, bool) \
static_field(Universe, _narrow_klass._base, address) \
static_field(Universe, _narrow_klass._shift, int) \
\
+ /******/ \
+ /* os */ \
+ /******/ \
+ \
+ static_field(os, _polling_page, address) \
+ \
/**********************************************************************************/ \
/* Generation and Space hierarchies */ \
/**********************************************************************************/ \
@@ -456,6 +471,7 @@
unchecked_nonstatic_field(ageTable, sizes, sizeof(ageTable::sizes)) \
\
nonstatic_field(BarrierSet, _max_covered_regions, int) \
+ nonstatic_field(BarrierSet, _kind, BarrierSet::Name) \
nonstatic_field(BlockOffsetTable, _bottom, HeapWord*) \
nonstatic_field(BlockOffsetTable, _end, HeapWord*) \
\
@@ -495,6 +511,7 @@
nonstatic_field(CollectedHeap, _barrier_set, BarrierSet*) \
nonstatic_field(CollectedHeap, _defer_initial_card_mark, bool) \
nonstatic_field(CollectedHeap, _is_gc_active, bool) \
+ nonstatic_field(CollectedHeap, _total_collections, unsigned int) \
nonstatic_field(CompactibleSpace, _compaction_top, HeapWord*) \
nonstatic_field(CompactibleSpace, _first_dead, HeapWord*) \
nonstatic_field(CompactibleSpace, _end_of_live, HeapWord*) \
@@ -505,7 +522,7 @@
nonstatic_field(ContiguousSpace, _saved_mark_word, HeapWord*) \
\
nonstatic_field(DefNewGeneration, _next_gen, Generation*) \
- nonstatic_field(DefNewGeneration, _tenuring_threshold, uint) \
+ nonstatic_field(DefNewGeneration, _tenuring_threshold, uint) \
nonstatic_field(DefNewGeneration, _age_table, ageTable) \
nonstatic_field(DefNewGeneration, _eden_space, EdenSpace*) \
nonstatic_field(DefNewGeneration, _from_space, ContiguousSpace*) \
@@ -552,6 +569,11 @@
nonstatic_field(ThreadLocalAllocBuffer, _desired_size, size_t) \
nonstatic_field(ThreadLocalAllocBuffer, _refill_waste_limit, size_t) \
static_field(ThreadLocalAllocBuffer, _target_refills, unsigned) \
+ nonstatic_field(ThreadLocalAllocBuffer, _number_of_refills, unsigned) \
+ nonstatic_field(ThreadLocalAllocBuffer, _fast_refill_waste, unsigned) \
+ nonstatic_field(ThreadLocalAllocBuffer, _slow_refill_waste, unsigned) \
+ nonstatic_field(ThreadLocalAllocBuffer, _gc_waste, unsigned) \
+ nonstatic_field(ThreadLocalAllocBuffer, _slow_allocations, unsigned) \
nonstatic_field(VirtualSpace, _low_boundary, char*) \
nonstatic_field(VirtualSpace, _high_boundary, char*) \
nonstatic_field(VirtualSpace, _low, char*) \
@@ -713,6 +735,13 @@
\
static_field(ClassLoaderDataGraph, _head, ClassLoaderData*) \
\
+ /**********/ \
+ /* Arrays */ \
+ /**********/ \
+ \
+ nonstatic_field(Array<Klass*>, _length, int) \
+ nonstatic_field(Array<Klass*>, _data[0], Klass*) \
+ \
/*******************/ \
/* GrowableArrays */ \
/*******************/ \
@@ -720,7 +749,7 @@
nonstatic_field(GenericGrowableArray, _len, int) \
nonstatic_field(GenericGrowableArray, _max, int) \
nonstatic_field(GenericGrowableArray, _arena, Arena*) \
- nonstatic_field(GrowableArray<int>, _data, int*) \
+ nonstatic_field(GrowableArray<int>, _data, int*) \
\
/********************************/ \
/* CodeCache (NOTE: incomplete) */ \
@@ -763,7 +792,20 @@
/* StubRoutines (NOTE: incomplete) */ \
/***********************************/ \
\
+ static_field(StubRoutines, _verify_oop_count, jint) \
static_field(StubRoutines, _call_stub_return_address, address) \
+ static_field(StubRoutines, _aescrypt_encryptBlock, address) \
+ static_field(StubRoutines, _aescrypt_decryptBlock, address) \
+ static_field(StubRoutines, _cipherBlockChaining_encryptAESCrypt, address) \
+ static_field(StubRoutines, _cipherBlockChaining_decryptAESCrypt, address) \
+ static_field(StubRoutines, _updateBytesCRC32, address) \
+ static_field(StubRoutines, _crc_table_adr, address) \
+ \
+ /*****************/ \
+ /* SharedRuntime */ \
+ /*****************/ \
+ \
+ static_field(SharedRuntime, _ic_miss_blob, RuntimeStub*) \
\
/***************************************/ \
/* PcDesc and other compiled code info */ \
@@ -800,7 +842,7 @@
nonstatic_field(nmethod, _osr_link, nmethod*) \
nonstatic_field(nmethod, _scavenge_root_link, nmethod*) \
nonstatic_field(nmethod, _scavenge_root_state, jbyte) \
- nonstatic_field(nmethod, _state, unsigned char) \
+ nonstatic_field(nmethod, _state, volatile unsigned char) \
nonstatic_field(nmethod, _exception_offset, int) \
nonstatic_field(nmethod, _deoptimize_offset, int) \
nonstatic_field(nmethod, _deoptimize_mh_offset, int) \
@@ -853,6 +895,7 @@
volatile_nonstatic_field(Thread, _suspend_flags, uint32_t) \
nonstatic_field(Thread, _active_handles, JNIHandleBlock*) \
nonstatic_field(Thread, _tlab, ThreadLocalAllocBuffer) \
+ nonstatic_field(Thread, _allocated_bytes, jlong) \
nonstatic_field(Thread, _current_pending_monitor, ObjectMonitor*) \
nonstatic_field(Thread, _current_pending_monitor_is_from_java, bool) \
nonstatic_field(Thread, _current_waiting_monitor, ObjectMonitor*) \
@@ -866,6 +909,7 @@
nonstatic_field(JavaThread, _pending_async_exception, oop) \
volatile_nonstatic_field(JavaThread, _exception_oop, oop) \
volatile_nonstatic_field(JavaThread, _exception_pc, address) \
+ volatile_nonstatic_field(JavaThread, _is_method_handle_return, int) \
nonstatic_field(JavaThread, _is_compiling, bool) \
nonstatic_field(JavaThread, _special_runtime_exit_condition, JavaThread::AsyncRequests) \
nonstatic_field(JavaThread, _saved_exception_pc, address) \
@@ -875,6 +919,8 @@
nonstatic_field(JavaThread, _stack_size, size_t) \
nonstatic_field(JavaThread, _vframe_array_head, vframeArray*) \
nonstatic_field(JavaThread, _vframe_array_last, vframeArray*) \
+ nonstatic_field(JavaThread, _satb_mark_queue, ObjPtrQueue) \
+ nonstatic_field(JavaThread, _dirty_card_queue, DirtyCardQueue) \
nonstatic_field(Thread, _resource_area, ResourceArea*) \
nonstatic_field(CompilerThread, _env, ciEnv*) \
\
@@ -1140,11 +1186,10 @@
/* -XX flags */ \
/*********************/ \
\
- nonstatic_field(Flag, type, const char*) \
- nonstatic_field(Flag, name, const char*) \
- unchecked_nonstatic_field(Flag, addr, sizeof(void*)) /* NOTE: no type */ \
- nonstatic_field(Flag, kind, const char*) \
- nonstatic_field(Flag, origin, FlagValueOrigin) \
+ nonstatic_field(Flag, _type, const char*) \
+ nonstatic_field(Flag, _name, const char*) \
+ unchecked_nonstatic_field(Flag, _addr, sizeof(void*)) /* NOTE: no type */ \
+ nonstatic_field(Flag, _flags, Flag::Flags) \
static_field(Flag, flags, Flag*) \
static_field(Flag, numFlags, size_t) \
\
@@ -1187,7 +1232,7 @@
unchecked_nonstatic_field(Array<int>, _data, sizeof(int)) \
unchecked_nonstatic_field(Array<u1>, _data, sizeof(u1)) \
unchecked_nonstatic_field(Array<u2>, _data, sizeof(u2)) \
- unchecked_nonstatic_field(Array<Method*>, _data, sizeof(Method*)) \
+ unchecked_nonstatic_field(Array<Method*>, _data, sizeof(Method*)) \
unchecked_nonstatic_field(Array<Klass*>, _data, sizeof(Klass*)) \
\
/*********************************/ \
@@ -1203,7 +1248,7 @@
/* Miscellaneous fields */ \
/************************/ \
\
- nonstatic_field(CompileTask, _method, Method*) \
+ nonstatic_field(CompileTask, _method, Method*) \
nonstatic_field(CompileTask, _osr_bci, int) \
nonstatic_field(CompileTask, _comp_level, int) \
nonstatic_field(CompileTask, _compile_id, uint) \
@@ -1217,7 +1262,11 @@
\
nonstatic_field(vframeArrayElement, _frame, frame) \
nonstatic_field(vframeArrayElement, _bci, int) \
- nonstatic_field(vframeArrayElement, _method, Method*) \
+ nonstatic_field(vframeArrayElement, _method, Method*) \
+ \
+ nonstatic_field(PtrQueue, _active, bool) \
+ nonstatic_field(PtrQueue, _buf, void**) \
+ nonstatic_field(PtrQueue, _index, size_t) \
\
nonstatic_field(AccessFlags, _flags, jint) \
nonstatic_field(elapsedTimer, _counter, jlong) \
@@ -1311,6 +1360,7 @@
declare_integer_type(long) \
declare_integer_type(char) \
declare_unsigned_integer_type(unsigned char) \
+ declare_unsigned_integer_type(volatile unsigned char) \
declare_unsigned_integer_type(u_char) \
declare_unsigned_integer_type(unsigned int) \
declare_unsigned_integer_type(uint) \
@@ -1333,6 +1383,7 @@
declare_toplevel_type(char**) \
declare_toplevel_type(u_char*) \
declare_toplevel_type(unsigned char*) \
+ declare_toplevel_type(volatile unsigned char*) \
\
/*******************************************************************/ \
/* Types which it will be handy to have available over in the SA */ \
@@ -1363,7 +1414,7 @@
/* MetadataOopDesc hierarchy (NOTE: some missing) */ \
/**************************************************/ \
\
- declare_toplevel_type(CompiledICHolder) \
+ declare_toplevel_type(CompiledICHolder) \
declare_toplevel_type(MetaspaceObj) \
declare_type(Metadata, MetaspaceObj) \
declare_type(Klass, Metadata) \
@@ -1374,17 +1425,20 @@
declare_type(InstanceClassLoaderKlass, InstanceKlass) \
declare_type(InstanceMirrorKlass, InstanceKlass) \
declare_type(InstanceRefKlass, InstanceKlass) \
- declare_type(ConstantPool, Metadata) \
- declare_type(ConstantPoolCache, MetaspaceObj) \
- declare_type(MethodData, Metadata) \
- declare_type(Method, Metadata) \
- declare_type(MethodCounters, MetaspaceObj) \
- declare_type(ConstMethod, MetaspaceObj) \
+ declare_type(ConstantPool, Metadata) \
+ declare_type(ConstantPoolCache, MetaspaceObj) \
+ declare_type(MethodData, Metadata) \
+ declare_type(Method, Metadata) \
+ declare_type(MethodCounters, MetaspaceObj) \
+ declare_type(ConstMethod, MetaspaceObj) \
+ \
+ declare_toplevel_type(vtableEntry) \
\
declare_toplevel_type(Symbol) \
declare_toplevel_type(Symbol*) \
declare_toplevel_type(volatile Metadata*) \
\
+ declare_toplevel_type(DataLayout) \
declare_toplevel_type(nmethodBucket) \
\
/********/ \
@@ -1432,6 +1486,7 @@
declare_type(ModRefBarrierSet, BarrierSet) \
declare_type(CardTableModRefBS, ModRefBarrierSet) \
declare_type(CardTableModRefBSForCTRS, CardTableModRefBS) \
+ declare_toplevel_type(BarrierSet::Name) \
declare_toplevel_type(GenRemSet) \
declare_type(CardTableRS, GenRemSet) \
declare_toplevel_type(BlockOffsetSharedArray) \
@@ -1450,6 +1505,8 @@
declare_toplevel_type(ThreadLocalAllocBuffer) \
declare_toplevel_type(VirtualSpace) \
declare_toplevel_type(WaterMark) \
+ declare_toplevel_type(ObjPtrQueue) \
+ declare_toplevel_type(DirtyCardQueue) \
\
/* Pointers to Garbage Collection types */ \
\
@@ -1873,6 +1930,9 @@
declare_c2_type(CmpF3Node, CmpFNode) \
declare_c2_type(CmpDNode, CmpNode) \
declare_c2_type(CmpD3Node, CmpDNode) \
+ declare_c2_type(MathExactNode, MultiNode) \
+ declare_c2_type(AddExactINode, MathExactNode) \
+ declare_c2_type(FlagsProjNode, ProjNode) \
declare_c2_type(BoolNode, Node) \
declare_c2_type(AbsNode, Node) \
declare_c2_type(AbsINode, AbsNode) \
@@ -2019,7 +2079,7 @@
declare_integer_type(JavaThreadState) \
declare_integer_type(Location::Type) \
declare_integer_type(Location::Where) \
- declare_integer_type(FlagValueOrigin) \
+ declare_integer_type(Flag::Flags) \
COMPILER2_PRESENT(declare_integer_type(OptoReg::Name)) \
\
declare_toplevel_type(CHeapObj<mtInternal>) \
@@ -2027,7 +2087,7 @@
declare_type(Array<u1>, MetaspaceObj) \
declare_type(Array<u2>, MetaspaceObj) \
declare_type(Array<Klass*>, MetaspaceObj) \
- declare_type(Array<Method*>, MetaspaceObj) \
+ declare_type(Array<Method*>, MetaspaceObj) \
\
declare_integer_type(AccessFlags) /* FIXME: wrong type (not integer) */\
declare_toplevel_type(address) /* FIXME: should this be an integer type? */\
@@ -2068,6 +2128,7 @@
declare_toplevel_type(StubQueue*) \
declare_toplevel_type(Thread*) \
declare_toplevel_type(Universe) \
+ declare_toplevel_type(os) \
declare_toplevel_type(vframeArray) \
declare_toplevel_type(vframeArrayElement) \
declare_toplevel_type(Annotations*) \
@@ -2076,6 +2137,8 @@
/* Miscellaneous types */ \
/***************/ \
\
+ declare_toplevel_type(PtrQueue) \
+ \
/* freelist */ \
declare_toplevel_type(FreeChunk*) \
declare_toplevel_type(Metablock*) \
@@ -2106,6 +2169,7 @@
/* Useful globals */ \
/******************/ \
\
+ declare_preprocessor_constant("ASSERT", DEBUG_ONLY(1) NOT_DEBUG(0)) \
\
/**************/ \
/* Stack bias */ \
@@ -2122,6 +2186,8 @@
declare_constant(BytesPerWord) \
declare_constant(BytesPerLong) \
\
+ declare_constant(LogKlassAlignmentInBytes) \
+ \
/********************************************/ \
/* Generation and Space Hierarchy Constants */ \
/********************************************/ \
@@ -2130,6 +2196,9 @@
\
declare_constant(BarrierSet::ModRef) \
declare_constant(BarrierSet::CardTableModRef) \
+ declare_constant(BarrierSet::CardTableExtension) \
+ declare_constant(BarrierSet::G1SATBCT) \
+ declare_constant(BarrierSet::G1SATBCTLogging) \
declare_constant(BarrierSet::Other) \
\
declare_constant(BlockOffsetSharedArray::LogN) \
@@ -2248,8 +2317,11 @@
declare_constant(Klass::_primary_super_limit) \
declare_constant(Klass::_lh_instance_slow_path_bit) \
declare_constant(Klass::_lh_log2_element_size_shift) \
+ declare_constant(Klass::_lh_log2_element_size_mask) \
declare_constant(Klass::_lh_element_type_shift) \
+ declare_constant(Klass::_lh_element_type_mask) \
declare_constant(Klass::_lh_header_size_shift) \
+ declare_constant(Klass::_lh_header_size_mask) \
declare_constant(Klass::_lh_array_tag_shift) \
declare_constant(Klass::_lh_array_tag_type_value) \
declare_constant(Klass::_lh_array_tag_obj_value) \
@@ -2268,6 +2340,12 @@
declare_constant(ConstMethod::_has_default_annotations) \
declare_constant(ConstMethod::_has_type_annotations) \
\
+ /**************/ \
+ /* DataLayout */ \
+ /**************/ \
+ \
+ declare_constant(DataLayout::cell_size) \
+ \
/*************************************/ \
/* InstanceKlass enum */ \
/*************************************/ \
@@ -2402,6 +2480,13 @@
declare_constant(Deoptimization::Reason_LIMIT) \
declare_constant(Deoptimization::Reason_RECORDED_LIMIT) \
\
+ declare_constant(Deoptimization::Action_none) \
+ declare_constant(Deoptimization::Action_maybe_recompile) \
+ declare_constant(Deoptimization::Action_reinterpret) \
+ declare_constant(Deoptimization::Action_make_not_entrant) \
+ declare_constant(Deoptimization::Action_make_not_compilable) \
+ declare_constant(Deoptimization::Action_LIMIT) \
+ \
/*********************/ \
/* Matcher (C2 only) */ \
/*********************/ \
@@ -2468,6 +2553,16 @@
declare_constant(vmSymbols::FIRST_SID) \
declare_constant(vmSymbols::SID_LIMIT) \
\
+ /****************/ \
+ /* vmIntrinsics */ \
+ /****************/ \
+ \
+ declare_constant(vmIntrinsics::_invokeBasic) \
+ declare_constant(vmIntrinsics::_linkToVirtual) \
+ declare_constant(vmIntrinsics::_linkToStatic) \
+ declare_constant(vmIntrinsics::_linkToSpecial) \
+ declare_constant(vmIntrinsics::_linkToInterface) \
+ \
/********************************/ \
/* Calling convention constants */ \
/********************************/ \
@@ -2515,6 +2610,8 @@
declare_constant(markOopDesc::biased_lock_bit_in_place) \
declare_constant(markOopDesc::age_mask) \
declare_constant(markOopDesc::age_mask_in_place) \
+ declare_constant(markOopDesc::epoch_mask) \
+ declare_constant(markOopDesc::epoch_mask_in_place) \
declare_constant(markOopDesc::hash_mask) \
declare_constant(markOopDesc::hash_mask_in_place) \
declare_constant(markOopDesc::biased_lock_alignment) \
--- a/hotspot/src/share/vm/runtime/vm_operations.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_operations.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -173,10 +173,6 @@
SymbolTable::unlink();
}
-void VM_HandleFullCodeCache::doit() {
- NMethodSweeper::speculative_disconnect_nmethods(_is_full);
-}
-
void VM_Verify::doit() {
Universe::heap()->prepare_for_verify();
Universe::verify(_silent);
--- a/hotspot/src/share/vm/runtime/vm_operations.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -51,7 +51,6 @@
template(DeoptimizeAll) \
template(ZombieAll) \
template(UnlinkSymbols) \
- template(HandleFullCodeCache) \
template(Verify) \
template(PrintJNI) \
template(HeapDumper) \
@@ -261,16 +260,6 @@
bool allow_nested_vm_operations() const { return true; }
};
-class VM_HandleFullCodeCache: public VM_Operation {
- private:
- bool _is_full;
- public:
- VM_HandleFullCodeCache(bool is_full) { _is_full = is_full; }
- VMOp_Type type() const { return VMOp_HandleFullCodeCache; }
- void doit();
- bool allow_nested_vm_operations() const { return true; }
-};
-
#ifndef PRODUCT
class VM_DeoptimizeAll: public VM_Operation {
private:
--- a/hotspot/src/share/vm/runtime/vm_version.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_version.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -78,7 +78,13 @@
static const char* jre_release_version();
// does HW support an 8-byte compare-exchange operation?
- static bool supports_cx8() {return _supports_cx8;}
+ static bool supports_cx8() {
+#ifdef SUPPORTS_NATIVE_CX8
+ return true;
+#else
+ return _supports_cx8;
+#endif
+ }
// does HW support atomic get-and-set or atomic get-and-add? Used
// to guide intrinsification decisions for Unsafe atomic ops
static bool supports_atomic_getset4() {return _supports_atomic_getset4;}
--- a/hotspot/src/share/vm/services/attachListener.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/attachListener.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -245,7 +245,7 @@
}
value = (tmp != 0);
}
- bool res = CommandLineFlags::boolAtPut((char*)name, &value, ATTACH_ON_DEMAND);
+ bool res = CommandLineFlags::boolAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (! res) {
out->print_cr("setting flag %s failed", name);
}
@@ -263,7 +263,7 @@
return JNI_ERR;
}
}
- bool res = CommandLineFlags::intxAtPut((char*)name, &value, ATTACH_ON_DEMAND);
+ bool res = CommandLineFlags::intxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (! res) {
out->print_cr("setting flag %s failed", name);
}
@@ -282,7 +282,7 @@
return JNI_ERR;
}
}
- bool res = CommandLineFlags::uintxAtPut((char*)name, &value, ATTACH_ON_DEMAND);
+ bool res = CommandLineFlags::uintxAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (! res) {
out->print_cr("setting flag %s failed", name);
}
@@ -301,7 +301,7 @@
return JNI_ERR;
}
}
- bool res = CommandLineFlags::uint64_tAtPut((char*)name, &value, ATTACH_ON_DEMAND);
+ bool res = CommandLineFlags::uint64_tAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (! res) {
out->print_cr("setting flag %s failed", name);
}
@@ -316,7 +316,7 @@
out->print_cr("flag value must be a string");
return JNI_ERR;
}
- bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, ATTACH_ON_DEMAND);
+ bool res = CommandLineFlags::ccstrAtPut((char*)name, &value, Flag::ATTACH_ON_DEMAND);
if (res) {
FREE_C_HEAP_ARRAY(char, value, mtInternal);
} else {
@@ -470,7 +470,17 @@
vmSymbols::threadgroup_string_void_signature(),
thread_group,
string,
- CHECK);
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ tty->print_cr("Exception in VM (AttachListener::init) : ");
+ java_lang_Throwable::print(PENDING_EXCEPTION, tty);
+ tty->cr();
+
+ CLEAR_PENDING_EXCEPTION;
+
+ return;
+ }
KlassHandle group(THREAD, SystemDictionary::ThreadGroup_klass());
JavaCalls::call_special(&result,
@@ -479,7 +489,17 @@
vmSymbols::add_method_name(),
vmSymbols::thread_void_signature(),
thread_oop, // ARG 1
- CHECK);
+ THREAD);
+
+ if (HAS_PENDING_EXCEPTION) {
+ tty->print_cr("Exception in VM (AttachListener::init) : ");
+ java_lang_Throwable::print(PENDING_EXCEPTION, tty);
+ tty->cr();
+
+ CLEAR_PENDING_EXCEPTION;
+
+ return;
+ }
{ MutexLocker mu(Threads_lock);
JavaThread* listener_thread = new JavaThread(&attach_listener_thread_entry);
--- a/hotspot/src/share/vm/services/classLoadingService.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/classLoadingService.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -52,7 +52,7 @@
len = name->utf8_length(); \
} \
HS_DTRACE_PROBE4(hotspot, class__##type, \
- data, len, (clss)->class_loader(), (shared)); \
+ data, len, SOLARIS_ONLY((void *))(clss)->class_loader(), (shared)); \
}
#else /* USDT2 */
@@ -202,7 +202,7 @@
MutexLocker m(Management_lock);
// verbose will be set to the previous value
- bool succeed = CommandLineFlags::boolAtPut((char*)"TraceClassLoading", &verbose, MANAGEMENT);
+ bool succeed = CommandLineFlags::boolAtPut((char*)"TraceClassLoading", &verbose, Flag::MANAGEMENT);
assert(succeed, "Setting TraceClassLoading flag fails");
reset_trace_class_unloading();
@@ -213,7 +213,7 @@
void ClassLoadingService::reset_trace_class_unloading() {
assert(Management_lock->owned_by_self(), "Must own the Management_lock");
bool value = MemoryService::get_verbose() || ClassLoadingService::get_verbose();
- bool succeed = CommandLineFlags::boolAtPut((char*)"TraceClassUnloading", &value, MANAGEMENT);
+ bool succeed = CommandLineFlags::boolAtPut((char*)"TraceClassUnloading", &value, Flag::MANAGEMENT);
assert(succeed, "Setting TraceClassUnLoading flag fails");
}
--- a/hotspot/src/share/vm/services/diagnosticArgument.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/diagnosticArgument.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -61,7 +61,7 @@
}
void GenDCmdArgument::to_string(char* c, char* buf, size_t len) {
- jio_snprintf(buf, len, "%s", c);
+ jio_snprintf(buf, len, "%s", (c != NULL) ? c : "");
}
void GenDCmdArgument::to_string(StringArrayArgument* f, char* buf, size_t len) {
--- a/hotspot/src/share/vm/services/dtraceAttacher.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/dtraceAttacher.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -51,7 +51,7 @@
static void set_bool_flag(const char* flag, bool value) {
CommandLineFlags::boolAtPut((char*)flag, strlen(flag), &value,
- ATTACH_ON_DEMAND);
+ Flag::ATTACH_ON_DEMAND);
}
// Enable only the "fine grained" flags. Do *not* touch
--- a/hotspot/src/share/vm/services/gcNotifier.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/gcNotifier.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -209,7 +209,7 @@
GCNotificationRequest *request = getRequest();
if (request != NULL) {
NotificationMark nm(request);
- Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, THREAD);
+ Handle objGcInfo = createGcInfo(request->gcManager, request->gcStatInfo, CHECK);
Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK);
Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK);
--- a/hotspot/src/share/vm/services/heapDumper.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/heapDumper.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -563,7 +563,7 @@
}
void DumpWriter::write_objectID(oop o) {
- address a = (address)((uintptr_t)o);
+ address a = (address)o;
#ifdef _LP64
write_u8((u8)a);
#else
--- a/hotspot/src/share/vm/services/management.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/management.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1643,9 +1643,13 @@
int num_entries = 0;
for (int i = 0; i < nFlags; i++) {
Flag* flag = &Flag::flags[i];
+ // Exclude notproduct and develop flags in product builds.
+ if (flag->is_constant_in_binary()) {
+ continue;
+ }
// Exclude the locked (experimental, diagnostic) flags
if (flag->is_unlocked() || flag->is_unlocker()) {
- Handle s = java_lang_String::create_from_str(flag->name, CHECK_0);
+ Handle s = java_lang_String::create_from_str(flag->_name, CHECK_0);
flags_ah->obj_at_put(num_entries, s());
num_entries++;
}
@@ -1669,7 +1673,7 @@
bool add_global_entry(JNIEnv* env, Handle name, jmmVMGlobal *global, Flag *flag, TRAPS) {
Handle flag_name;
if (name() == NULL) {
- flag_name = java_lang_String::create_from_str(flag->name, CHECK_false);
+ flag_name = java_lang_String::create_from_str(flag->_name, CHECK_false);
} else {
flag_name = name;
}
@@ -1698,23 +1702,23 @@
global->writeable = flag->is_writeable();
global->external = flag->is_external();
- switch (flag->origin) {
- case DEFAULT:
+ switch (flag->get_origin()) {
+ case Flag::DEFAULT:
global->origin = JMM_VMGLOBAL_ORIGIN_DEFAULT;
break;
- case COMMAND_LINE:
+ case Flag::COMMAND_LINE:
global->origin = JMM_VMGLOBAL_ORIGIN_COMMAND_LINE;
break;
- case ENVIRON_VAR:
+ case Flag::ENVIRON_VAR:
global->origin = JMM_VMGLOBAL_ORIGIN_ENVIRON_VAR;
break;
- case CONFIG_FILE:
+ case Flag::CONFIG_FILE:
global->origin = JMM_VMGLOBAL_ORIGIN_CONFIG_FILE;
break;
- case MANAGEMENT:
+ case Flag::MANAGEMENT:
global->origin = JMM_VMGLOBAL_ORIGIN_MANAGEMENT;
break;
- case ERGONOMIC:
+ case Flag::ERGONOMIC:
global->origin = JMM_VMGLOBAL_ORIGIN_ERGONOMIC;
break;
default:
@@ -1781,6 +1785,10 @@
int num_entries = 0;
for (int i = 0; i < nFlags && num_entries < count; i++) {
Flag* flag = &Flag::flags[i];
+ // Exclude notproduct and develop flags in product builds.
+ if (flag->is_constant_in_binary()) {
+ continue;
+ }
// Exclude the locked (diagnostic, experimental) flags
if ((flag->is_unlocked() || flag->is_unlocker()) &&
add_global_entry(env, null_h, &globals[num_entries], flag, THREAD)) {
@@ -1813,23 +1821,23 @@
bool succeed;
if (flag->is_bool()) {
bool bvalue = (new_value.z == JNI_TRUE ? true : false);
- succeed = CommandLineFlags::boolAtPut(name, &bvalue, MANAGEMENT);
+ succeed = CommandLineFlags::boolAtPut(name, &bvalue, Flag::MANAGEMENT);
} else if (flag->is_intx()) {
intx ivalue = (intx)new_value.j;
- succeed = CommandLineFlags::intxAtPut(name, &ivalue, MANAGEMENT);
+ succeed = CommandLineFlags::intxAtPut(name, &ivalue, Flag::MANAGEMENT);
} else if (flag->is_uintx()) {
uintx uvalue = (uintx)new_value.j;
- succeed = CommandLineFlags::uintxAtPut(name, &uvalue, MANAGEMENT);
+ succeed = CommandLineFlags::uintxAtPut(name, &uvalue, Flag::MANAGEMENT);
} else if (flag->is_uint64_t()) {
uint64_t uvalue = (uint64_t)new_value.j;
- succeed = CommandLineFlags::uint64_tAtPut(name, &uvalue, MANAGEMENT);
+ succeed = CommandLineFlags::uint64_tAtPut(name, &uvalue, Flag::MANAGEMENT);
} else if (flag->is_ccstr()) {
oop str = JNIHandles::resolve_external_guard(new_value.l);
if (str == NULL) {
THROW(vmSymbols::java_lang_NullPointerException());
}
ccstr svalue = java_lang_String::as_utf8_string(str);
- succeed = CommandLineFlags::ccstrAtPut(name, &svalue, MANAGEMENT);
+ succeed = CommandLineFlags::ccstrAtPut(name, &svalue, Flag::MANAGEMENT);
}
assert(succeed, "Setting flag should succeed");
JVM_END
--- a/hotspot/src/share/vm/services/memPtr.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memPtr.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,9 +34,9 @@
jint seq = Atomic::add(1, &_seq_number);
if (seq < 0) {
MemTracker::shutdown(MemTracker::NMT_sequence_overflow);
+ } else {
+ NOT_PRODUCT(_max_seq_number = (seq > _max_seq_number) ? seq : _max_seq_number;)
}
- assert(seq > 0, "counter overflow");
- NOT_PRODUCT(_max_seq_number = (seq > _max_seq_number) ? seq : _max_seq_number;)
return seq;
}
--- a/hotspot/src/share/vm/services/memoryManager.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryManager.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
MemoryManager::MemoryManager() {
_num_pools = 0;
- _memory_mgr_obj = NULL;
+ (void)const_cast<instanceOop&>(_memory_mgr_obj = NULL);
}
void MemoryManager::add_pool(MemoryPool* pool) {
--- a/hotspot/src/share/vm/services/memoryPool.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryPool.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,7 +45,7 @@
_name = name;
_initial_size = init_size;
_max_size = max_size;
- _memory_pool_obj = NULL;
+ (void)const_cast<instanceOop&>(_memory_pool_obj = NULL);
_available_for_allocation = true;
_num_managers = 0;
_type = type;
@@ -260,10 +260,10 @@
}
MetaspacePool::MetaspacePool() :
- MemoryPool("Metaspace", NonHeap, capacity_in_bytes(), calculate_max_size(), true, false) { }
+ MemoryPool("Metaspace", NonHeap, 0, calculate_max_size(), true, false) { }
MemoryUsage MetaspacePool::get_memory_usage() {
- size_t committed = align_size_down_(capacity_in_bytes(), os::vm_page_size());
+ size_t committed = MetaspaceAux::committed_bytes();
return MemoryUsage(initial_size(), used_in_bytes(), committed, max_size());
}
@@ -271,26 +271,19 @@
return MetaspaceAux::allocated_used_bytes();
}
-size_t MetaspacePool::capacity_in_bytes() const {
- return MetaspaceAux::allocated_capacity_bytes();
-}
-
size_t MetaspacePool::calculate_max_size() const {
- return FLAG_IS_CMDLINE(MaxMetaspaceSize) ? MaxMetaspaceSize : max_uintx;
+ return FLAG_IS_CMDLINE(MaxMetaspaceSize) ? MaxMetaspaceSize :
+ MemoryUsage::undefined_size();
}
CompressedKlassSpacePool::CompressedKlassSpacePool() :
- MemoryPool("Compressed Class Space", NonHeap, capacity_in_bytes(), ClassMetaspaceSize, true, false) { }
+ MemoryPool("Compressed Class Space", NonHeap, 0, CompressedClassSpaceSize, true, false) { }
size_t CompressedKlassSpacePool::used_in_bytes() {
return MetaspaceAux::allocated_used_bytes(Metaspace::ClassType);
}
-size_t CompressedKlassSpacePool::capacity_in_bytes() const {
- return MetaspaceAux::allocated_capacity_bytes(Metaspace::ClassType);
-}
-
MemoryUsage CompressedKlassSpacePool::get_memory_usage() {
- size_t committed = align_size_down_(capacity_in_bytes(), os::vm_page_size());
+ size_t committed = MetaspaceAux::committed_bytes(Metaspace::ClassType);
return MemoryUsage(initial_size(), used_in_bytes(), committed, max_size());
}
--- a/hotspot/src/share/vm/services/memoryPool.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryPool.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -224,7 +224,6 @@
class MetaspacePool : public MemoryPool {
size_t calculate_max_size() const;
- size_t capacity_in_bytes() const;
public:
MetaspacePool();
MemoryUsage get_memory_usage();
@@ -232,7 +231,6 @@
};
class CompressedKlassSpacePool : public MemoryPool {
- size_t capacity_in_bytes() const;
public:
CompressedKlassSpacePool();
MemoryUsage get_memory_usage();
--- a/hotspot/src/share/vm/services/memoryService.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryService.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -409,7 +409,7 @@
mgr->add_pool(_metaspace_pool);
_pools_list->append(_metaspace_pool);
- if (UseCompressedKlassPointers) {
+ if (UseCompressedClassPointers) {
_compressed_class_pool = new CompressedKlassSpacePool();
mgr->add_pool(_compressed_class_pool);
_pools_list->append(_compressed_class_pool);
@@ -515,7 +515,7 @@
bool MemoryService::set_verbose(bool verbose) {
MutexLocker m(Management_lock);
// verbose will be set to the previous value
- bool succeed = CommandLineFlags::boolAtPut((char*)"PrintGC", &verbose, MANAGEMENT);
+ bool succeed = CommandLineFlags::boolAtPut((char*)"PrintGC", &verbose, Flag::MANAGEMENT);
assert(succeed, "Setting PrintGC flag fails");
ClassLoadingService::reset_trace_class_unloading();
@@ -618,4 +618,3 @@
MemoryService::gc_end(_fullGC, _recordPostGCUsage, _recordAccumulatedGCTime,
_recordGCEndTime, _countCollection, _cause);
}
-
--- a/hotspot/src/share/vm/services/memoryUsage.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryUsage.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -63,10 +63,12 @@
size_t committed() const { return _committed; }
size_t max_size() const { return _maxSize; }
+ static size_t undefined_size() { return (size_t) -1; }
+
inline static jlong convert_to_jlong(size_t val) {
// In the 64-bit vm, a size_t can overflow a jlong (which is signed).
jlong ret;
- if (val == (size_t)-1) {
+ if (val == undefined_size()) {
ret = -1L;
} else {
NOT_LP64(ret = val;)
--- a/hotspot/src/share/vm/trace/trace.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/trace/trace.xml Thu Oct 03 19:18:54 2013 +0100
@@ -313,13 +313,6 @@
<value type="UINT" field="zombifiedCount" label="Methods Zombified"/>
</event>
- <event id="CleanCodeCache" path="vm/code_sweeper/clean" label="Clean Code Cache"
- description="Clean code cache from oldest methods"
- has_thread="true" is_requestable="false" is_constant="false">
- <value type="UINT" field="disconnectedCount" label="Methods Disconnected"/>
- <value type="UINT" field="madeNonEntrantCount" label="Methods Made Non-Entrant"/>
- </event>
-
<!-- Code cache events -->
<event id="CodeCacheFull" path="vm/code_cache/full" label="Code Cache Full"
--- a/hotspot/src/share/vm/trace/traceMacros.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/trace/traceMacros.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -26,6 +26,7 @@
#define SHARE_VM_TRACE_TRACE_MACRO_HPP
#define EVENT_THREAD_EXIT(thread)
+#define EVENT_THREAD_DESTRUCT(thread)
#define TRACE_INIT_ID(k)
#define TRACE_DATA TraceThreadData
--- a/hotspot/src/share/vm/utilities/array.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/array.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -353,9 +353,9 @@
// sort the array.
bool contains(const T& x) const { return index_of(x) >= 0; }
- T at(int i) const { assert(i >= 0 && i< _length, err_msg_res("oob: 0 <= %d < %d", i, _length)); return _data[i]; }
- void at_put(const int i, const T& x) { assert(i >= 0 && i< _length, err_msg_res("oob: 0 <= %d < %d", i, _length)); _data[i] = x; }
- T* adr_at(const int i) { assert(i >= 0 && i< _length, err_msg_res("oob: 0 <= %d < %d", i, _length)); return &_data[i]; }
+ T at(int i) const { assert(i >= 0 && i< _length, err_msg("oob: 0 <= %d < %d", i, _length)); return _data[i]; }
+ void at_put(const int i, const T& x) { assert(i >= 0 && i< _length, err_msg("oob: 0 <= %d < %d", i, _length)); _data[i] = x; }
+ T* adr_at(const int i) { assert(i >= 0 && i< _length, err_msg("oob: 0 <= %d < %d", i, _length)); return &_data[i]; }
int find(const T& x) { return index_of(x); }
T at_acquire(const int which) { return OrderAccess::load_acquire(adr_at(which)); }
--- a/hotspot/src/share/vm/utilities/bitMap.inline.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/bitMap.inline.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -52,16 +52,16 @@
inline bool BitMap::par_set_bit(idx_t bit) {
verify_index(bit);
- volatile idx_t* const addr = word_addr(bit);
- const idx_t mask = bit_mask(bit);
- idx_t old_val = *addr;
+ volatile bm_word_t* const addr = word_addr(bit);
+ const bm_word_t mask = bit_mask(bit);
+ bm_word_t old_val = *addr;
do {
- const idx_t new_val = old_val | mask;
+ const bm_word_t new_val = old_val | mask;
if (new_val == old_val) {
return false; // Someone else beat us to it.
}
- const idx_t cur_val = (idx_t) Atomic::cmpxchg_ptr((void*) new_val,
+ const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
(volatile void*) addr,
(void*) old_val);
if (cur_val == old_val) {
@@ -73,16 +73,16 @@
inline bool BitMap::par_clear_bit(idx_t bit) {
verify_index(bit);
- volatile idx_t* const addr = word_addr(bit);
- const idx_t mask = ~bit_mask(bit);
- idx_t old_val = *addr;
+ volatile bm_word_t* const addr = word_addr(bit);
+ const bm_word_t mask = ~bit_mask(bit);
+ bm_word_t old_val = *addr;
do {
- const idx_t new_val = old_val & mask;
+ const bm_word_t new_val = old_val & mask;
if (new_val == old_val) {
return false; // Someone else beat us to it.
}
- const idx_t cur_val = (idx_t) Atomic::cmpxchg_ptr((void*) new_val,
+ const bm_word_t cur_val = (bm_word_t) Atomic::cmpxchg_ptr((void*) new_val,
(volatile void*) addr,
(void*) old_val);
if (cur_val == old_val) {
--- a/hotspot/src/share/vm/utilities/decoder.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/decoder.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -24,7 +24,6 @@
#include "precompiled.hpp"
#include "prims/jvm.h"
-#include "runtime/mutexLocker.hpp"
#include "runtime/os.hpp"
#include "utilities/decoder.hpp"
#include "utilities/vmError.hpp"
@@ -80,6 +79,23 @@
return decoder;
}
+inline bool DecoderLocker::is_first_error_thread() {
+ return (os::current_thread_id() == VMError::get_first_error_tid());
+}
+
+DecoderLocker::DecoderLocker() :
+ MutexLockerEx(DecoderLocker::is_first_error_thread() ?
+ NULL : Decoder::shared_decoder_lock(), true) {
+ _decoder = is_first_error_thread() ?
+ Decoder::get_error_handler_instance() : Decoder::get_shared_instance();
+ assert(_decoder != NULL, "null decoder");
+}
+
+Mutex* Decoder::shared_decoder_lock() {
+ assert(_shared_decoder_lock != NULL, "Just check");
+ return _shared_decoder_lock;
+}
+
bool Decoder::decode(address addr, char* buf, int buflen, int* offset, const char* modulepath) {
assert(_shared_decoder_lock != NULL, "Just check");
bool error_handling_thread = os::current_thread_id() == VMError::first_error_tid;
--- a/hotspot/src/share/vm/utilities/decoder.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/decoder.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -28,6 +28,7 @@
#include "memory/allocation.hpp"
#include "runtime/mutex.hpp"
+#include "runtime/mutexLocker.hpp"
class AbstractDecoder : public CHeapObj<mtInternal> {
public:
@@ -124,6 +125,19 @@
protected:
static Mutex* _shared_decoder_lock;
+ static Mutex* shared_decoder_lock();
+
+ friend class DecoderLocker;
+};
+
+class DecoderLocker : public MutexLockerEx {
+ AbstractDecoder* _decoder;
+ inline bool is_first_error_thread();
+public:
+ DecoderLocker();
+ AbstractDecoder* decoder() {
+ return _decoder;
+ }
};
#endif // SHARE_VM_UTILITIES_DECODER_HPP
--- a/hotspot/src/share/vm/utilities/globalDefinitions.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -967,9 +967,9 @@
// (These must be implemented as #defines because C++ compilers are
// not obligated to inline non-integral constants!)
#define badAddress ((address)::badAddressVal)
-#define badOop ((oop)::badOopVal)
+#define badOop (cast_to_oop(::badOopVal))
#define badHeapWord (::badHeapWordVal)
-#define badJNIHandle ((oop)::badJNIHandleVal)
+#define badJNIHandle (cast_to_oop(::badJNIHandleVal))
// Default TaskQueue size is 16K (32-bit) or 128K (64-bit)
#define TASKQUEUE_SIZE (NOT_LP64(1<<14) LP64_ONLY(1<<17))
--- a/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -189,6 +189,10 @@
#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union (needed in windows.h)
#pragma warning( disable : 4511 ) // copy constructor could not be generated
#pragma warning( disable : 4291 ) // no matching operator delete found; memory will not be freed if initialization thows an exception
+#ifdef CHECK_UNHANDLED_OOPS
+#pragma warning( disable : 4521 ) // class has multiple copy ctors of a single type
+#pragma warning( disable : 4522 ) // class has multiple assignment operators of a single type
+#endif // CHECK_UNHANDLED_OOPS
#if _MSC_VER >= 1400
#pragma warning( disable : 4996 ) // unsafe string functions. Same as define _CRT_SECURE_NO_WARNINGS/_CRT_SECURE_NO_DEPRICATE
#endif
--- a/hotspot/src/share/vm/utilities/hashtable.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/hashtable.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -356,9 +356,9 @@
template class Hashtable<Symbol*, mtSymbol>;
template class Hashtable<Klass*, mtClass>;
template class Hashtable<oop, mtClass>;
-#ifdef SOLARIS
+#if defined(SOLARIS) || defined(CHECK_UNHANDLED_OOPS)
template class Hashtable<oop, mtSymbol>;
-#endif
+#endif // SOLARIS || CHECK_UNHANDLED_OOPS
template class Hashtable<oopDesc*, mtSymbol>;
template class Hashtable<Symbol*, mtClass>;
template class HashtableEntry<Symbol*, mtSymbol>;
--- a/hotspot/src/share/vm/utilities/ostream.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/ostream.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -342,7 +342,7 @@
}
char* stringStream::as_string() {
- char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos+1);
+ char* copy = NEW_RESOURCE_ARRAY(char, buffer_pos + 1);
strncpy(copy, buffer, buffer_pos);
copy[buffer_pos] = 0; // terminating null
return copy;
@@ -355,14 +355,190 @@
outputStream* gclog_or_tty;
extern Mutex* tty_lock;
+#define EXTRACHARLEN 32
+#define CURRENTAPPX ".current"
+#define FILENAMEBUFLEN 1024
+// convert YYYY-MM-DD HH:MM:SS to YYYY-MM-DD_HH-MM-SS
+char* get_datetime_string(char *buf, size_t len) {
+ os::local_time_string(buf, len);
+ int i = (int)strlen(buf);
+ while (i-- >= 0) {
+ if (buf[i] == ' ') buf[i] = '_';
+ else if (buf[i] == ':') buf[i] = '-';
+ }
+ return buf;
+}
+
+static const char* make_log_name_internal(const char* log_name, const char* force_directory,
+ int pid, const char* tms) {
+ const char* basename = log_name;
+ char file_sep = os::file_separator()[0];
+ const char* cp;
+ char pid_text[32];
+
+ for (cp = log_name; *cp != '\0'; cp++) {
+ if (*cp == '/' || *cp == file_sep) {
+ basename = cp + 1;
+ }
+ }
+ const char* nametail = log_name;
+ // Compute buffer length
+ size_t buffer_length;
+ if (force_directory != NULL) {
+ buffer_length = strlen(force_directory) + strlen(os::file_separator()) +
+ strlen(basename) + 1;
+ } else {
+ buffer_length = strlen(log_name) + 1;
+ }
+
+ // const char* star = strchr(basename, '*');
+ const char* pts = strstr(basename, "%p");
+ int pid_pos = (pts == NULL) ? -1 : (pts - nametail);
+
+ if (pid_pos >= 0) {
+ jio_snprintf(pid_text, sizeof(pid_text), "pid%u", pid);
+ buffer_length += strlen(pid_text);
+ }
+
+ pts = strstr(basename, "%t");
+ int tms_pos = (pts == NULL) ? -1 : (pts - nametail);
+ if (tms_pos >= 0) {
+ buffer_length += strlen(tms);
+ }
+
+ // Create big enough buffer.
+ char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
+
+ strcpy(buf, "");
+ if (force_directory != NULL) {
+ strcat(buf, force_directory);
+ strcat(buf, os::file_separator());
+ nametail = basename; // completely skip directory prefix
+ }
+
+ // who is first, %p or %t?
+ int first = -1, second = -1;
+ const char *p1st = NULL;
+ const char *p2nd = NULL;
+
+ if (pid_pos >= 0 && tms_pos >= 0) {
+ // contains both %p and %t
+ if (pid_pos < tms_pos) {
+ // case foo%pbar%tmonkey.log
+ first = pid_pos;
+ p1st = pid_text;
+ second = tms_pos;
+ p2nd = tms;
+ } else {
+ // case foo%tbar%pmonkey.log
+ first = tms_pos;
+ p1st = tms;
+ second = pid_pos;
+ p2nd = pid_text;
+ }
+ } else if (pid_pos >= 0) {
+ // contains %p only
+ first = pid_pos;
+ p1st = pid_text;
+ } else if (tms_pos >= 0) {
+ // contains %t only
+ first = tms_pos;
+ p1st = tms;
+ }
+
+ int buf_pos = (int)strlen(buf);
+ const char* tail = nametail;
+
+ if (first >= 0) {
+ tail = nametail + first + 2;
+ strncpy(&buf[buf_pos], nametail, first);
+ strcpy(&buf[buf_pos + first], p1st);
+ buf_pos = (int)strlen(buf);
+ if (second >= 0) {
+ strncpy(&buf[buf_pos], tail, second - first - 2);
+ strcpy(&buf[buf_pos + second - first - 2], p2nd);
+ tail = nametail + second + 2;
+ }
+ }
+ strcat(buf, tail); // append rest of name, or all of name
+ return buf;
+}
+
+// log_name comes from -XX:LogFile=log_name or -Xloggc:log_name
+// in log_name, %p => pipd1234 and
+// %t => YYYY-MM-DD_HH-MM-SS
+static const char* make_log_name(const char* log_name, const char* force_directory) {
+ char timestr[32];
+ get_datetime_string(timestr, sizeof(timestr));
+ return make_log_name_internal(log_name, force_directory, os::current_process_id(),
+ timestr);
+}
+
+#ifndef PRODUCT
+void test_loggc_filename() {
+ int pid;
+ char tms[32];
+ char i_result[FILENAMEBUFLEN];
+ const char* o_result;
+ get_datetime_string(tms, sizeof(tms));
+ pid = os::current_process_id();
+
+ // test.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test.log", tms);
+ o_result = make_log_name_internal("test.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+
+ // test-%t-%p.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test-%s-pid%u.log", tms, pid);
+ o_result = make_log_name_internal("test-%t-%p.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test-%%t-%%p.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+
+ // test-%t%p.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test-%spid%u.log", tms, pid);
+ o_result = make_log_name_internal("test-%t%p.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test-%%t%%p.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+
+ // %p%t.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "pid%u%s.log", pid, tms);
+ o_result = make_log_name_internal("%p%t.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%p%%t.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+
+ // %p-test.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "pid%u-test.log", pid);
+ o_result = make_log_name_internal("%p-test.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%p-test.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+
+ // %t.log
+ jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "%s.log", tms);
+ o_result = make_log_name_internal("%t.log", NULL, pid, tms);
+ assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%t.log\", NULL)");
+ FREE_C_HEAP_ARRAY(char, o_result, mtInternal);
+}
+#endif // PRODUCT
+
fileStream::fileStream(const char* file_name) {
_file = fopen(file_name, "w");
- _need_close = true;
+ if (_file != NULL) {
+ _need_close = true;
+ } else {
+ warning("Cannot open file %s due to %s\n", file_name, strerror(errno));
+ _need_close = false;
+ }
}
fileStream::fileStream(const char* file_name, const char* opentype) {
_file = fopen(file_name, opentype);
- _need_close = true;
+ if (_file != NULL) {
+ _need_close = true;
+ } else {
+ warning("Cannot open file %s due to %s\n", file_name, strerror(errno));
+ _need_close = false;
+ }
}
void fileStream::write(const char* s, size_t len) {
@@ -423,34 +599,51 @@
update_position(s, len);
}
-rotatingFileStream::~rotatingFileStream() {
+// dump vm version, os version, platform info, build id,
+// memory usage and command line flags into header
+void gcLogFileStream::dump_loggc_header() {
+ if (is_open()) {
+ print_cr(Abstract_VM_Version::internal_vm_info_string());
+ os::print_memory_info(this);
+ print("CommandLine flags: ");
+ CommandLineFlags::printSetFlags(this);
+ }
+}
+
+gcLogFileStream::~gcLogFileStream() {
if (_file != NULL) {
if (_need_close) fclose(_file);
- _file = NULL;
+ _file = NULL;
+ }
+ if (_file_name != NULL) {
FREE_C_HEAP_ARRAY(char, _file_name, mtInternal);
_file_name = NULL;
}
}
-rotatingFileStream::rotatingFileStream(const char* file_name) {
+gcLogFileStream::gcLogFileStream(const char* file_name) {
_cur_file_num = 0;
_bytes_written = 0L;
- _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
- jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
- _file = fopen(_file_name, "w");
- _need_close = true;
+ _file_name = make_log_name(file_name, NULL);
+
+ // gc log file rotation
+ if (UseGCLogFileRotation && NumberOfGCLogFiles > 1) {
+ char tempbuf[FILENAMEBUFLEN];
+ jio_snprintf(tempbuf, sizeof(tempbuf), "%s.%d" CURRENTAPPX, _file_name, _cur_file_num);
+ _file = fopen(tempbuf, "w");
+ } else {
+ _file = fopen(_file_name, "w");
+ }
+ if (_file != NULL) {
+ _need_close = true;
+ dump_loggc_header();
+ } else {
+ warning("Cannot open file %s due to %s\n", _file_name, strerror(errno));
+ _need_close = false;
+ }
}
-rotatingFileStream::rotatingFileStream(const char* file_name, const char* opentype) {
- _cur_file_num = 0;
- _bytes_written = 0L;
- _file_name = NEW_C_HEAP_ARRAY(char, strlen(file_name)+10, mtInternal);
- jio_snprintf(_file_name, strlen(file_name)+10, "%s.%d", file_name, _cur_file_num);
- _file = fopen(_file_name, opentype);
- _need_close = true;
-}
-
-void rotatingFileStream::write(const char* s, size_t len) {
+void gcLogFileStream::write(const char* s, size_t len) {
if (_file != NULL) {
size_t count = fwrite(s, 1, len, _file);
_bytes_written += count;
@@ -466,7 +659,12 @@
// write to gc log file at safepoint. If in future, changes made for mutator threads or
// concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log
// must be synchronized.
-void rotatingFileStream::rotate_log() {
+void gcLogFileStream::rotate_log() {
+ char time_msg[FILENAMEBUFLEN];
+ char time_str[EXTRACHARLEN];
+ char current_file_name[FILENAMEBUFLEN];
+ char renamed_file_name[FILENAMEBUFLEN];
+
if (_bytes_written < (jlong)GCLogFileSize) {
return;
}
@@ -481,27 +679,89 @@
// rotate in same file
rewind();
_bytes_written = 0L;
+ jio_snprintf(time_msg, sizeof(time_msg), "File %s rotated at %s\n",
+ _file_name, os::local_time_string((char *)time_str, sizeof(time_str)));
+ write(time_msg, strlen(time_msg));
+ dump_loggc_header();
return;
}
- // rotate file in names file.0, file.1, file.2, ..., file.<MaxGCLogFileNumbers-1>
- // close current file, rotate to next file
+#if defined(_WINDOWS)
+#ifndef F_OK
+#define F_OK 0
+#endif
+#endif // _WINDOWS
+
+ // rotate file in names extended_filename.0, extended_filename.1, ...,
+ // extended_filename.<NumberOfGCLogFiles - 1>. Current rotation file name will
+ // have a form of extended_filename.<i>.current where i is the current rotation
+ // file number. After it reaches max file size, the file will be saved and renamed
+ // with .current removed from its tail.
+ size_t filename_len = strlen(_file_name);
if (_file != NULL) {
- _cur_file_num ++;
- if (_cur_file_num >= NumberOfGCLogFiles) _cur_file_num = 0;
- jio_snprintf(_file_name, strlen(Arguments::gc_log_filename()) + 10, "%s.%d",
- Arguments::gc_log_filename(), _cur_file_num);
+ jio_snprintf(renamed_file_name, filename_len + EXTRACHARLEN, "%s.%d",
+ _file_name, _cur_file_num);
+ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX,
+ _file_name, _cur_file_num);
+ jio_snprintf(time_msg, sizeof(time_msg), "%s GC log file has reached the"
+ " maximum size. Saved as %s\n",
+ os::local_time_string((char *)time_str, sizeof(time_str)),
+ renamed_file_name);
+ write(time_msg, strlen(time_msg));
+
fclose(_file);
_file = NULL;
+
+ bool can_rename = true;
+ if (access(current_file_name, F_OK) != 0) {
+ // current file does not exist?
+ warning("No source file exists, cannot rename\n");
+ can_rename = false;
+ }
+ if (can_rename) {
+ if (access(renamed_file_name, F_OK) == 0) {
+ if (remove(renamed_file_name) != 0) {
+ warning("Could not delete existing file %s\n", renamed_file_name);
+ can_rename = false;
+ }
+ } else {
+ // file does not exist, ok to rename
+ }
+ }
+ if (can_rename && rename(current_file_name, renamed_file_name) != 0) {
+ warning("Could not rename %s to %s\n", _file_name, renamed_file_name);
+ }
}
- _file = fopen(_file_name, "w");
+
+ _cur_file_num++;
+ if (_cur_file_num > NumberOfGCLogFiles - 1) _cur_file_num = 0;
+ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX,
+ _file_name, _cur_file_num);
+ _file = fopen(current_file_name, "w");
+
if (_file != NULL) {
_bytes_written = 0L;
_need_close = true;
+ // reuse current_file_name for time_msg
+ jio_snprintf(current_file_name, filename_len + EXTRACHARLEN,
+ "%s.%d", _file_name, _cur_file_num);
+ jio_snprintf(time_msg, sizeof(time_msg), "%s GC log file created %s\n",
+ os::local_time_string((char *)time_str, sizeof(time_str)),
+ current_file_name);
+ write(time_msg, strlen(time_msg));
+ dump_loggc_header();
+ // remove the existing file
+ if (access(current_file_name, F_OK) == 0) {
+ if (remove(current_file_name) != 0) {
+ warning("Could not delete existing file %s\n", current_file_name);
+ }
+ }
} else {
- tty->print_cr("failed to open rotation log file %s due to %s\n",
+ warning("failed to open rotation log file %s due to %s\n"
+ "Turned off GC log file rotation\n",
_file_name, strerror(errno));
_need_close = false;
+ FLAG_SET_DEFAULT(UseGCLogFileRotation, false);
}
}
@@ -530,69 +790,9 @@
return _log_file != NULL;
}
-static const char* make_log_name(const char* log_name, const char* force_directory) {
- const char* basename = log_name;
- char file_sep = os::file_separator()[0];
- const char* cp;
- for (cp = log_name; *cp != '\0'; cp++) {
- if (*cp == '/' || *cp == file_sep) {
- basename = cp+1;
- }
- }
- const char* nametail = log_name;
-
- // Compute buffer length
- size_t buffer_length;
- if (force_directory != NULL) {
- buffer_length = strlen(force_directory) + strlen(os::file_separator()) +
- strlen(basename) + 1;
- } else {
- buffer_length = strlen(log_name) + 1;
- }
-
- const char* star = strchr(basename, '*');
- int star_pos = (star == NULL) ? -1 : (star - nametail);
- int skip = 1;
- if (star == NULL) {
- // Try %p
- star = strstr(basename, "%p");
- if (star != NULL) {
- skip = 2;
- }
- }
- star_pos = (star == NULL) ? -1 : (star - nametail);
-
- char pid[32];
- if (star_pos >= 0) {
- jio_snprintf(pid, sizeof(pid), "%u", os::current_process_id());
- buffer_length += strlen(pid);
- }
-
- // Create big enough buffer.
- char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
-
- strcpy(buf, "");
- if (force_directory != NULL) {
- strcat(buf, force_directory);
- strcat(buf, os::file_separator());
- nametail = basename; // completely skip directory prefix
- }
-
- if (star_pos >= 0) {
- // convert foo*bar.log or foo%pbar.log to foo123bar.log
- int buf_pos = (int) strlen(buf);
- strncpy(&buf[buf_pos], nametail, star_pos);
- strcpy(&buf[buf_pos + star_pos], pid);
- nametail += star_pos + skip; // skip prefix and pid format
- }
-
- strcat(buf, nametail); // append rest of name, or all of name
- return buf;
-}
-
void defaultStream::init_log() {
// %%% Need a MutexLocker?
- const char* log_name = LogFile != NULL ? LogFile : "hotspot.log";
+ const char* log_name = LogFile != NULL ? LogFile : "hotspot_pid%p.log";
const char* try_name = make_log_name(log_name, NULL);
fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
if (!file->is_open()) {
@@ -603,14 +803,15 @@
// Note: This feature is for maintainer use only. No need for L10N.
jio_print(warnbuf);
FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
- try_name = make_log_name("hs_pid%p.log", os::get_temp_directory());
+ try_name = make_log_name(log_name, os::get_temp_directory());
jio_snprintf(warnbuf, sizeof(warnbuf),
"Warning: Forcing option -XX:LogFile=%s\n", try_name);
jio_print(warnbuf);
delete file;
file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
- FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
}
+ FREE_C_HEAP_ARRAY(char, try_name, mtInternal);
+
if (file->is_open()) {
_log_file = file;
xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
@@ -877,11 +1078,8 @@
gclog_or_tty = tty; // default to tty
if (Arguments::gc_log_filename() != NULL) {
- fileStream * gclog = UseGCLogFileRotation ?
- new(ResourceObj::C_HEAP, mtInternal)
- rotatingFileStream(Arguments::gc_log_filename()) :
- new(ResourceObj::C_HEAP, mtInternal)
- fileStream(Arguments::gc_log_filename());
+ fileStream * gclog = new(ResourceObj::C_HEAP, mtInternal)
+ gcLogFileStream(Arguments::gc_log_filename());
if (gclog->is_open()) {
// now we update the time stamp of the GC log to be synced up
// with tty.
--- a/hotspot/src/share/vm/utilities/ostream.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/ostream.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -231,20 +231,24 @@
void flush() {};
};
-class rotatingFileStream : public fileStream {
+class gcLogFileStream : public fileStream {
protected:
- char* _file_name;
+ const char* _file_name;
jlong _bytes_written;
- uintx _cur_file_num; // current logfile rotation number, from 0 to MaxGCLogFileNumbers-1
+ uintx _cur_file_num; // current logfile rotation number, from 0 to NumberOfGCLogFiles-1
public:
- rotatingFileStream(const char* file_name);
- rotatingFileStream(const char* file_name, const char* opentype);
- rotatingFileStream(FILE* file) : fileStream(file) {}
- ~rotatingFileStream();
+ gcLogFileStream(const char* file_name);
+ ~gcLogFileStream();
virtual void write(const char* c, size_t len);
virtual void rotate_log();
+ void dump_loggc_header();
};
+#ifndef PRODUCT
+// unit test for checking -Xloggc:<filename> parsing result
+void test_loggc_filename();
+#endif
+
void ostream_init();
void ostream_init_log();
void ostream_exit();
--- a/hotspot/src/share/vm/utilities/taskqueue.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/taskqueue.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -322,11 +322,11 @@
// Attempts to claim a task from the "local" end of the queue (the most
// recently pushed). If successful, returns true and sets t to the task;
// otherwise, returns false (the queue is empty).
- inline bool pop_local(E& t);
+ inline bool pop_local(volatile E& t);
// Like pop_local(), but uses the "global" end of the queue (the least
// recently pushed).
- bool pop_global(E& t);
+ bool pop_global(volatile E& t);
// Delete any resource associated with the queue.
~GenericTaskQueue();
@@ -424,7 +424,7 @@
}
template<class E, MEMFLAGS F, unsigned int N>
-bool GenericTaskQueue<E, F, N>::pop_global(E& t) {
+bool GenericTaskQueue<E, F, N>::pop_global(volatile E& t) {
Age oldAge = _age.get();
// Architectures with weak memory model require a barrier here
// to guarantee that bottom is not older than age,
@@ -701,7 +701,7 @@
}
template<class E, MEMFLAGS F, unsigned int N> inline bool
-GenericTaskQueue<E, F, N>::pop_local(E& t) {
+GenericTaskQueue<E, F, N>::pop_local(volatile E& t) {
uint localBot = _bottom;
// This value cannot be N-1. That can only occur as a result of
// the assignment to bottom in this method. If it does, this method
@@ -799,7 +799,7 @@
}
volatile ObjArrayTask&
operator =(const volatile ObjArrayTask& t) volatile {
- _obj = t._obj;
+ (void)const_cast<oop&>(_obj = t._obj);
_index = t._index;
return *this;
}
--- a/hotspot/src/share/vm/utilities/vmError.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -574,6 +574,10 @@
STEP(120, "(printing native stack)" )
if (_verbose) {
+ if (os::platform_print_native_stack(st, _context, buf, sizeof(buf))) {
+ // We have printed the native stack in platform-specific code
+ // Windows/x64 needs special handling.
+ } else {
frame fr = _context ? os::fetch_frame_from_context(_context)
: os::current_frame();
@@ -604,6 +608,7 @@
st->cr();
}
}
+ }
STEP(130, "(printing Java stack)" )
--- a/hotspot/src/share/vm/utilities/vmError.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/vmError.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -136,6 +136,10 @@
// check to see if fatal error reporting is in progress
static bool fatal_error_in_progress() { return first_error != NULL; }
+
+ static jlong get_first_error_tid() {
+ return first_error_tid;
+ }
};
#endif // SHARE_VM_UTILITIES_VMERROR_HPP
--- a/hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/src/share/vm/utilities/yieldingWorkgroup.hpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,7 @@
#define SHARE_VM_UTILITIES_YIELDINGWORKGROUP_HPP
#include "utilities/macros.hpp"
-#if INCLUDE_ALL_GCS
#include "utilities/workgroup.hpp"
-#endif // INCLUDE_ALL_GCS
-
// Forward declarations
class YieldingFlexibleWorkGang;
--- a/hotspot/test/TEST.groups Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/TEST.groups Thu Oct 03 19:18:54 2013 +0100
@@ -62,7 +62,7 @@
#
needs_jdk = \
gc/TestG1ZeroPGCTJcmdThreadPrint.java \
- gc/metaspace/ClassMetaspaceSizeInJmapHeap.java \
+ gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java \
gc/metaspace/TestMetaspacePerfCounters.java \
runtime/6819213/TestBootNativeLibraryPath.java \
runtime/6878713/Test6878713.sh \
@@ -84,6 +84,7 @@
runtime/NMT/ThreadedVirtualAllocTestType.java \
runtime/NMT/VirtualAllocTestType.java \
runtime/RedefineObject/TestRedefineObject.java \
+ runtime/XCheckJniJsig/XCheckJSig.java \
serviceability/attach/AttachWithStalePidFile.java
# JRE adds further tests to compact3
@@ -159,7 +160,18 @@
gc/g1/TestRegionAlignment.java \
gc/g1/TestShrinkToOneRegion.java \
gc/metaspace/G1AddMetaspaceDependency.java \
- runtime/6929067/Test6929067.sh
+ gc/startup_warnings/TestCMS.java \
+ gc/startup_warnings/TestCMSIncrementalMode.java \
+ gc/startup_warnings/TestCMSNoIncrementalMode.java \
+ gc/startup_warnings/TestDefaultMaxRAMFraction.java \
+ gc/startup_warnings/TestDefNewCMS.java \
+ gc/startup_warnings/TestIncGC.java \
+ gc/startup_warnings/TestParallelGC.java \
+ gc/startup_warnings/TestParallelScavengeSerialOld.java \
+ gc/startup_warnings/TestParNewCMS.java \
+ gc/startup_warnings/TestParNewSerialOld.java \
+ runtime/6929067/Test6929067.sh \
+ runtime/SharedArchiveFile/SharedArchiveFile.java
# Minimal VM on Compact 2 adds in some compact2 tests
#
@@ -181,6 +193,7 @@
serviceability/ \
compiler/ \
testlibrary/ \
+ testlibrary_tests/ \
sanity/ \
runtime/ \
gc/ \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/CondTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024924
+ * @summary Test non constant addExact
+ * @compile CondTest.java Verify.java
+ * @run main CondTest
+ *
+ */
+
+import java.lang.ArithmeticException;
+
+public class CondTest {
+ public static int result = 0;
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 50000; ++i) {
+ runTest();
+ }
+ }
+
+ public static void runTest() {
+ int i = 7;
+ while (java.lang.Math.addExact(i, result) < 89361) {
+ if ((java.lang.Math.addExact(i, i) & 1) == 1) {
+ i += 3;
+ } else if ((i & 5) == 4) {
+ i += 7;
+ } else if ((i & 0xf) == 6) {
+ i += 2;
+ } else {
+ i += 1;
+ }
+ result += 2;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/ConstantTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024924
+ * @summary Test constant addExact
+ * @compile ConstantTest.java Verify.java
+ * @run main ConstantTest
+ *
+ */
+
+import java.lang.ArithmeticException;
+
+public class ConstantTest {
+ public static void main(String[] args) {
+ for (int i = 0; i < 50000; ++i) {
+ Verify.verify(5, 7);
+ Verify.verify(Integer.MAX_VALUE, 1);
+ Verify.verify(Integer.MIN_VALUE, -1);
+ Verify.verify(Integer.MAX_VALUE, -1);
+ Verify.verify(Integer.MIN_VALUE, 1);
+ Verify.verify(Integer.MAX_VALUE / 2, Integer.MAX_VALUE / 2);
+ Verify.verify(Integer.MAX_VALUE / 2, (Integer.MAX_VALUE / 2) + 3);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/LoadTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024924
+ * @summary Test non constant addExact
+ * @compile LoadTest.java Verify.java
+ * @run main LoadTest
+ *
+ */
+
+import java.lang.ArithmeticException;
+
+public class LoadTest {
+ public static java.util.Random rnd = new java.util.Random();
+ public static int[] values = new int[256];
+
+ public static void main(String[] args) {
+ for (int i = 0; i < values.length; ++i) {
+ values[i] = rnd.nextInt();
+ }
+
+ for (int i = 0; i < 50000; ++i) {
+ Verify.verify(values[i & 255], values[i & 255] - i);
+ Verify.verify(values[i & 255] + i, values[i & 255] - i);
+ Verify.verify(values[i & 255], values[i & 255]);
+ if ((i & 1) == 1 && i > 5) {
+ Verify.verify(values[i & 255] + i, values[i & 255] - i);
+ } else {
+ Verify.verify(values[i & 255] - i, values[i & 255] + i);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/LoopDependentTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024924
+ * @summary Test non constant addExact
+ * @compile LoopDependentTest.java Verify.java
+ * @run main LoopDependentTest
+ *
+ */
+
+import java.lang.ArithmeticException;
+
+public class LoopDependentTest {
+ public static java.util.Random rnd = new java.util.Random();
+
+ public static void main(String[] args) {
+ int rnd1 = rnd.nextInt(), rnd2 = rnd.nextInt();
+ for (int i = 0; i < 50000; ++i) {
+ Verify.verify(rnd1 + i, rnd2 + i);
+ Verify.verify(rnd1 + i, rnd2 + (i & 0xff));
+ Verify.verify(rnd1 - i, rnd2 - (i & 0xff));
+ Verify.verify(rnd1 + i + 1, rnd2 + i + 2);
+ Verify.verify(rnd1 + i * 2, rnd2 + i);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/NonConstantTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024924
+ * @summary Test non constant addExact
+ * @compile NonConstantTest.java Verify.java
+ * @run main NonConstantTest
+ *
+ */
+
+import java.lang.ArithmeticException;
+
+public class NonConstantTest {
+ public static java.util.Random rnd = new java.util.Random();
+
+ public static void main(String[] args) {
+ for (int i = 0; i < 50000; ++i) {
+ int rnd1 = rnd.nextInt(), rnd2 = rnd.nextInt();
+ Verify.verify(rnd1, rnd2);
+ Verify.verify(rnd1, rnd2 + 1);
+ Verify.verify(rnd1 + 1, rnd2);
+ Verify.verify(rnd1 - 1, rnd2);
+ Verify.verify(rnd1, rnd2 - 1);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/mathexact/Verify.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class Verify {
+ public static String throwWord(boolean threw) {
+ return (threw ? "threw" : "didn't throw");
+ }
+
+ public static void verify(int a, int b) {
+ boolean exception1 = false, exception2 = false;
+ int result1 = 0, result2 = 0;
+ try {
+ result1 = testIntrinsic(a, b);
+ } catch (ArithmeticException e) {
+ exception1 = true;
+ }
+ try {
+ result2 = testNonIntrinsic(a, b);
+ } catch (ArithmeticException e) {
+ exception2 = true;
+ }
+
+ if (exception1 != exception2) {
+ throw new RuntimeException("Intrinsic version " + throwWord(exception1) + " exception, NonIntrinsic version " + throwWord(exception2) + " for: " + a + " + " + b);
+ }
+ if (result1 != result2) {
+ throw new RuntimeException("Intrinsic version returned: " + a + " while NonIntrinsic version returned: " + b);
+ }
+ }
+
+ public static int testIntrinsic(int a, int b) {
+ return java.lang.Math.addExact(a, b);
+ }
+
+ public static int testNonIntrinsic(int a, int b) {
+ return safeAddExact(a, b);
+ }
+
+ // Copied java.lang.Math.addExact to avoid intrinsification
+ public static int safeAddExact(int x, int y) {
+ int r = x + y;
+ // HD 2-12 Overflow iff both arguments have the opposite sign of the result
+ if (((x ^ r) & (y ^ r)) < 0) {
+ throw new ArithmeticException("integer overflow");
+ }
+ return r;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jsr292/methodHandleExceptions/ByteClassLoader.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * A minimal classloader for loading bytecodes that could not result from
+ * properly compiled Java.
+ *
+ * @author dr2chase
+ */
+public class ByteClassLoader extends ClassLoader {
+ /**
+ * (pre)load class name using classData for the definition.
+ *
+ * @param name
+ * @param classData
+ * @return
+ */
+ public Class<?> loadBytes(String name, byte[] classData) {
+ Class<?> clazz = defineClass(name, classData, 0, classData.length);
+ resolveClass(clazz);
+ return clazz;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jsr292/methodHandleExceptions/C.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * Test class -- implements I, which provides default for m, but this class
+ * declares it abstract which (should) hide the interface default, and throw
+ * an abstract method error if it is called (calling it requires bytecode hacking
+ * or inconsistent compilation).
+ */
+public abstract class C implements I {
+ public abstract int m();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jsr292/methodHandleExceptions/I.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+public interface I {
+ default public int m() { return 1; }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/jsr292/methodHandleExceptions/TestAMEnotNPE.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+import java.lang.reflect.InvocationTargetException;
+import jdk.internal.org.objectweb.asm.ClassWriter;
+import jdk.internal.org.objectweb.asm.Handle;
+import jdk.internal.org.objectweb.asm.MethodVisitor;
+import jdk.internal.org.objectweb.asm.Opcodes;
+
+/**
+ * @test
+ * @bug 8025260
+ * @summary Ensure that AbstractMethodError is thrown, not NullPointerException, through MethodHandles::jump_from_method_handle code path
+ *
+ * @compile -XDignore.symbol.file ByteClassLoader.java I.java C.java TestAMEnotNPE.java
+ * @run main/othervm TestAMEnotNPE
+ */
+
+public class TestAMEnotNPE implements Opcodes {
+
+ /**
+ * The bytes for D, a NOT abstract class extending abstract class C
+ * without supplying an implementation for abstract method m.
+ * There is a default method in the interface I, but it should lose to
+ * the abstract class.
+
+ class D extends C {
+ D() { super(); }
+ // does not define m
+ }
+
+ * @return
+ * @throws Exception
+ */
+ public static byte[] bytesForD() throws Exception {
+
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
+ MethodVisitor mv;
+
+ cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "D", null, "C", null);
+
+ {
+ mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, "C", "<init>", "()V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+
+ return cw.toByteArray();
+ }
+
+
+ /**
+ * The bytecodes for an invokeExact of a particular methodHandle, I.m, invoked on a D
+
+ class T {
+ T() { super(); } // boring constructor
+ int test() {
+ MethodHandle mh = `I.m():int`;
+ D d = new D();
+ return mh.invokeExact(d); // Should explode here, AbstractMethodError
+ }
+ }
+
+ * @return
+ * @throws Exception
+ */
+ public static byte[] bytesForT() throws Exception {
+
+ ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
+ MethodVisitor mv;
+
+ cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, "T", null, "java/lang/Object", null);
+ {
+ mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(0,0);
+ mv.visitEnd();
+ }
+ {
+ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "test", "()I", null, null);
+ mv.visitCode();
+ mv.visitLdcInsn(new Handle(Opcodes.H_INVOKEINTERFACE, "I", "m", "()I"));
+ mv.visitTypeInsn(NEW, "D");
+ mv.visitInsn(DUP);
+ mv.visitMethodInsn(INVOKESPECIAL, "D", "<init>", "()V");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/invoke/MethodHandle", "invokeExact", "(LI;)I");
+ mv.visitInsn(IRETURN);
+ mv.visitMaxs(0,0);
+ mv.visitEnd();
+ }
+ cw.visitEnd();
+ return cw.toByteArray();
+ }
+
+ public static void main(String args[] ) throws Throwable {
+ ByteClassLoader bcl = new ByteClassLoader();
+ Class<?> d = bcl.loadBytes("D", bytesForD());
+ Class<?> t = bcl.loadBytes("T", bytesForT());
+ try {
+ Object result = t.getMethod("test").invoke(null);
+ System.out.println("Expected AbstractMethodError wrapped in InvocationTargetException, saw no exception");
+ throw new Error("Missing expected exception");
+ } catch (InvocationTargetException e) {
+ Throwable th = e.getCause();
+ if (th instanceof AbstractMethodError) {
+ th.printStackTrace(System.out);
+ System.out.println("PASS, saw expected exception (AbstractMethodError, wrapped in InvocationTargetException).");
+ } else {
+ System.out.println("Expected AbstractMethodError wrapped in InvocationTargetException, saw " + th);
+ throw th;
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/print/PrintInlining.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8022585
+ * @summary VM crashes when ran with -XX:+PrintInlining
+ * @run main/othervm -Xcomp -XX:+PrintInlining PrintInlining
+ *
+ */
+
+public class PrintInlining {
+ public static void main(String[] args) {
+ System.out.println("Passed");
+ }
+}
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -74,6 +74,9 @@
protected static final int THRESHOLD;
/** count of invocation to triger OSR compilation */
protected static final long BACKEDGE_THRESHOLD;
+ /** Value of {@code java.vm.info} (interpreted|mixed|comp mode) */
+ protected static final String MODE
+ = System.getProperty("java.vm.info");
static {
if (TIERED_COMPILATION) {
@@ -202,7 +205,7 @@
if (WHITE_BOX.getMethodCompilationLevel(method, true) != 0) {
throw new RuntimeException(method + " osr_comp_level must be == 0");
}
- }
+ }
/**
* Checks, that {@linkplain #method} is compiled.
--- a/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -53,6 +53,12 @@
*/
@Override
protected void test() throws Exception {
+ if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith(
+ "compiled ")) {
+ System.err.printf("Warning: %s is not applicable in %s%n",
+ testCase.name(), CompilerWhiteBoxTest.MODE);
+ return;
+ }
compile();
checkCompiled();
WHITE_BOX.deoptimizeAll();
--- a/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -53,6 +53,12 @@
*/
@Override
protected void test() throws Exception {
+ if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith(
+ "compiled ")) {
+ System.err.printf("Warning: %s is not applicable in %s%n",
+ testCase.name(), CompilerWhiteBoxTest.MODE);
+ return;
+ }
compile();
checkCompiled();
deoptimize();
--- a/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -70,12 +70,10 @@
int compLevel = getCompLevel();
int bci = WHITE_BOX.getMethodEntryBci(method);
- System.out.println("bci = " + bci);
- printInfo();
deoptimize();
- printInfo();
checkNotCompiled();
- printInfo();
+ WHITE_BOX.clearMethodState(method);
+
WHITE_BOX.enqueueMethodForCompilation(method, compLevel, bci);
checkCompiled();
deoptimize();
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -68,6 +68,12 @@
*/
@Override
protected void test() throws Exception {
+ if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith(
+ "compiled ")) {
+ System.err.printf("Warning: %s is not applicable in %s%n",
+ testCase.name(), CompilerWhiteBoxTest.MODE);
+ return;
+ }
if (!isCompilable()) {
throw new RuntimeException(method + " must be compilable");
}
--- a/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -62,6 +62,12 @@
*/
@Override
protected void test() throws Exception {
+ if (testCase.isOsr && CompilerWhiteBoxTest.MODE.startsWith(
+ "compiled ")) {
+ System.err.printf("Warning: %s is not applicable in %s%n",
+ testCase.name(), CompilerWhiteBoxTest.MODE);
+ return;
+ }
checkNotCompiled();
if (!isCompilable()) {
throw new RuntimeException(method + " must be compilable");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/TestObjectAlignment.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test TestObjectAlignment
+ * @key gc
+ * @bug 8021823
+ * @summary G1: Concurrent marking crashes with -XX:ObjectAlignmentInBytes>=32 in 64bit VMs
+ * @library /testlibrary
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=8
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=16
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=64
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=128
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:+ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=256
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=8
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=16
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=64
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=128
+ * @run main/othervm TestObjectAlignment -Xmx20M -XX:-ExplicitGCInvokesConcurrent -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=256
+ */
+
+import com.oracle.java.testlibrary.ProcessTools;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+public class TestObjectAlignment {
+
+ public static byte[] garbage;
+
+ private static boolean runsOn32bit() {
+ return System.getProperty("sun.arch.data.model").equals("32");
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (runsOn32bit()) {
+ // 32 bit VMs do not allow setting ObjectAlignmentInBytes, so there is nothing to test. We still get called.
+ return;
+ }
+ for (int i = 0; i < 10; i++) {
+ garbage = new byte[1000];
+ System.gc();
+ }
+ }
+}
--- a/hotspot/test/gc/TestVerifyDuringStartup.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/gc/TestVerifyDuringStartup.java Thu Oct 03 19:18:54 2013 +0100
@@ -48,7 +48,7 @@
"-XX:+VerifyDuringStartup",
"-version"});
- System.out.print("Testing:\n" + JDKToolFinder.getCurrentJDKTool("java"));
+ System.out.print("Testing:\n" + JDKToolFinder.getJDKTool("java"));
for (int i = 0; i < vmOpts.size(); i += 1) {
System.out.print(" " + vmOpts.get(i));
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestAlignmentToUseLargePages.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test TestAlignmentToUseLargePages
+ * @summary All parallel GC variants may use large pages without the requirement that the
+ * heap alignment is large page aligned. Other collectors also need to start up with odd sized heaps.
+ * @bug 8024396
+ * @key gc
+ * @key regression
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:-UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseSerialGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseSerialGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseConcMarkSweepGC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseConcMarkSweepGC -XX:-UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseG1GC -XX:+UseLargePages TestAlignmentToUseLargePages
+ * @run main/othervm -Xms7M -Xmx9M -XX:+UseG1GC -XX:-UseLargePages TestAlignmentToUseLargePages
+ */
+
+public class TestAlignmentToUseLargePages {
+ public static void main(String args[]) throws Exception {
+ // nothing to do
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestCompressedClassFlags.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.oracle.java.testlibrary.*;
+
+/*
+ * @test
+ * @bug 8015107
+ * @summary Tests that VM prints a warning when -XX:CompressedClassSpaceSize
+ * is used together with -XX:-UseCompressedClassPointers
+ * @library /testlibrary
+ */
+public class TestCompressedClassFlags {
+ public static void main(String[] args) throws Exception {
+ if (Platform.is64bit()) {
+ OutputAnalyzer output = runJava("-XX:CompressedClassSpaceSize=1g",
+ "-XX:-UseCompressedClassPointers",
+ "-version");
+ output.shouldContain("warning");
+ output.shouldNotContain("error");
+ output.shouldHaveExitValue(0);
+ }
+ }
+
+ private static OutputAnalyzer runJava(String ... args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(args);
+ return new OutputAnalyzer(pb.start());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestUseCompressedOopsErgo.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*/
+
+/*
+ * @test TestUseCompressedOopsErgo
+ * @key gc
+ * @bug 8010722
+ * @summary Tests ergonomics for UseCompressedOops.
+ * @library /testlibrary /testlibrary/whitebox
+ * @build TestUseCompressedOopsErgo TestUseCompressedOopsErgoTools
+ * @run main ClassFileInstaller sun.hotspot.WhiteBox
+ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseG1GC
+ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseParallelGC
+ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseParallelGC -XX:-UseParallelOldGC
+ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseConcMarkSweepGC
+ * @run main/othervm TestUseCompressedOopsErgo -XX:+UseSerialGC
+ */
+
+public class TestUseCompressedOopsErgo {
+
+ public static void main(String args[]) throws Exception {
+ if (!TestUseCompressedOopsErgoTools.is64bitVM()) {
+ // this test is relevant for 64 bit VMs only
+ return;
+ }
+ final String[] gcFlags = args;
+ TestUseCompressedOopsErgoTools.checkCompressedOopsErgo(gcFlags);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/arguments/TestUseCompressedOopsErgoTools.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,177 @@
+/*
+* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+*
+* This code is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License version 2 only, as
+* published by the Free Software Foundation.
+*
+* This code is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+* version 2 for more details (a copy is included in the LICENSE file that
+* accompanied this code).
+*
+* You should have received a copy of the GNU General Public License version
+* 2 along with this work; if not, write to the Free Software Foundation,
+* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+*
+* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+* or visit www.oracle.com if you need additional information or have any
+* questions.
+*/
+
+import sun.management.ManagementFactoryHelper;
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import com.oracle.java.testlibrary.*;
+import sun.hotspot.WhiteBox;
+
+class DetermineMaxHeapForCompressedOops {
+ public static void main(String[] args) throws Exception {
+ WhiteBox wb = WhiteBox.getWhiteBox();
+ System.out.print(wb.getCompressedOopsMaxHeapSize());
+ }
+}
+
+class TestUseCompressedOopsErgoTools {
+
+ private static long getCompressedClassSpaceSize() {
+ HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
+
+ VMOption option = diagnostic.getVMOption("CompressedClassSpaceSize");
+ return Long.parseLong(option.getValue());
+ }
+
+
+ public static long getMaxHeapForCompressedOops(String[] vmargs) throws Exception {
+ OutputAnalyzer output = runWhiteBoxTest(vmargs, DetermineMaxHeapForCompressedOops.class.getName(), new String[] {}, false);
+ return Long.parseLong(output.getStdout());
+ }
+
+ public static boolean is64bitVM() {
+ String val = System.getProperty("sun.arch.data.model");
+ if (val == null) {
+ throw new RuntimeException("Could not read sun.arch.data.model");
+ }
+ if (val.equals("64")) {
+ return true;
+ } else if (val.equals("32")) {
+ return false;
+ }
+ throw new RuntimeException("Unexpected value " + val + " of sun.arch.data.model");
+ }
+
+ /**
+ * Executes a new VM process with the given class and parameters.
+ * @param vmargs Arguments to the VM to run
+ * @param classname Name of the class to run
+ * @param arguments Arguments to the class
+ * @param useTestDotJavaDotOpts Use test.java.opts as part of the VM argument string
+ * @return The OutputAnalyzer with the results for the invocation.
+ */
+ public static OutputAnalyzer runWhiteBoxTest(String[] vmargs, String classname, String[] arguments, boolean useTestDotJavaDotOpts) throws Exception {
+ ArrayList<String> finalargs = new ArrayList<String>();
+
+ String[] whiteboxOpts = new String[] {
+ "-Xbootclasspath/a:.",
+ "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI",
+ "-cp", System.getProperty("java.class.path"),
+ };
+
+ if (useTestDotJavaDotOpts) {
+ // System.getProperty("test.java.opts") is '' if no options is set,
+ // we need to skip such a result
+ String[] externalVMOpts = new String[0];
+ if (System.getProperty("test.java.opts") != null && System.getProperty("test.java.opts").length() != 0) {
+ externalVMOpts = System.getProperty("test.java.opts").split(" ");
+ }
+ finalargs.addAll(Arrays.asList(externalVMOpts));
+ }
+
+ finalargs.addAll(Arrays.asList(vmargs));
+ finalargs.addAll(Arrays.asList(whiteboxOpts));
+ finalargs.add(classname);
+ finalargs.addAll(Arrays.asList(arguments));
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(finalargs.toArray(new String[0]));
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(0);
+ return output;
+ }
+
+ private static String[] join(String[] part1, String part2) {
+ ArrayList<String> result = new ArrayList<String>();
+ result.addAll(Arrays.asList(part1));
+ result.add(part2);
+ return result.toArray(new String[0]);
+ }
+
+ public static void checkCompressedOopsErgo(String[] gcflags) throws Exception {
+ long maxHeapForCompressedOops = getMaxHeapForCompressedOops(gcflags);
+
+ checkUseCompressedOops(gcflags, maxHeapForCompressedOops, true);
+ checkUseCompressedOops(gcflags, maxHeapForCompressedOops - 1, true);
+ checkUseCompressedOops(gcflags, maxHeapForCompressedOops + 1, false);
+
+ // the use of HeapBaseMinAddress should not change the outcome
+ checkUseCompressedOops(join(gcflags, "-XX:HeapBaseMinAddress=32G"), maxHeapForCompressedOops, true);
+ checkUseCompressedOops(join(gcflags, "-XX:HeapBaseMinAddress=32G"), maxHeapForCompressedOops - 1, true);
+ checkUseCompressedOops(join(gcflags, "-XX:HeapBaseMinAddress=32G"), maxHeapForCompressedOops + 1, false);
+
+ // use a different object alignment
+ maxHeapForCompressedOops = getMaxHeapForCompressedOops(join(gcflags, "-XX:ObjectAlignmentInBytes=16"));
+
+ checkUseCompressedOops(join(gcflags, "-XX:ObjectAlignmentInBytes=16"), maxHeapForCompressedOops, true);
+ checkUseCompressedOops(join(gcflags, "-XX:ObjectAlignmentInBytes=16"), maxHeapForCompressedOops - 1, true);
+ checkUseCompressedOops(join(gcflags, "-XX:ObjectAlignmentInBytes=16"), maxHeapForCompressedOops + 1, false);
+
+ // use a different CompressedClassSpaceSize
+ String compressedClassSpaceSizeArg = "-XX:CompressedClassSpaceSize=" + 2 * getCompressedClassSpaceSize();
+ maxHeapForCompressedOops = getMaxHeapForCompressedOops(join(gcflags, compressedClassSpaceSizeArg));
+
+ checkUseCompressedOops(join(gcflags, compressedClassSpaceSizeArg), maxHeapForCompressedOops, true);
+ checkUseCompressedOops(join(gcflags, compressedClassSpaceSizeArg), maxHeapForCompressedOops - 1, true);
+ checkUseCompressedOops(join(gcflags, compressedClassSpaceSizeArg), maxHeapForCompressedOops + 1, false);
+ }
+
+ private static void checkUseCompressedOops(String[] args, long heapsize, boolean expectUseCompressedOops) throws Exception {
+ ArrayList<String> finalargs = new ArrayList<String>();
+ finalargs.addAll(Arrays.asList(args));
+ finalargs.add("-Xmx" + heapsize);
+ finalargs.add("-XX:+PrintFlagsFinal");
+ finalargs.add("-version");
+
+ String output = expectValid(finalargs.toArray(new String[0]));
+
+ boolean actualUseCompressedOops = getFlagBoolValue(" UseCompressedOops", output);
+
+ Asserts.assertEQ(expectUseCompressedOops, actualUseCompressedOops);
+ }
+
+ private static boolean getFlagBoolValue(String flag, String where) {
+ Matcher m = Pattern.compile(flag + "\\s+:?= (true|false)").matcher(where);
+ if (!m.find()) {
+ throw new RuntimeException("Could not find value for flag " + flag + " in output string");
+ }
+ return m.group(1).equals("true");
+ }
+
+ private static String expect(String[] flags, boolean hasWarning, boolean hasError, int errorcode) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(flags);
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(errorcode);
+ return output.getStdout();
+ }
+
+ private static String expectValid(String[] flags) throws Exception {
+ return expect(flags, false, false, 0);
+ }
+}
+
--- a/hotspot/test/gc/g1/TestSummarizeRSetStats.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/gc/g1/TestSummarizeRSetStats.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,140 +25,61 @@
* @test TestSummarizeRSetStats.java
* @bug 8013895
* @library /testlibrary
- * @build TestSummarizeRSetStats
+ * @build TestSummarizeRSetStatsTools TestSummarizeRSetStats
* @summary Verify output of -XX:+G1SummarizeRSetStats
* @run main TestSummarizeRSetStats
*
* Test the output of G1SummarizeRSetStats in conjunction with G1SummarizeRSetStatsPeriod.
*/
-import com.oracle.java.testlibrary.*;
-import java.lang.Thread;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-class RunSystemGCs {
- // 4M size, both are directly allocated into the old gen
- static Object[] largeObject1 = new Object[1024 * 1024];
- static Object[] largeObject2 = new Object[1024 * 1024];
-
- static int[] temp;
-
- public static void main(String[] args) {
- // create some cross-references between these objects
- for (int i = 0; i < largeObject1.length; i++) {
- largeObject1[i] = largeObject2;
- }
-
- for (int i = 0; i < largeObject2.length; i++) {
- largeObject2[i] = largeObject1;
- }
-
- int numGCs = Integer.parseInt(args[0]);
-
- if (numGCs > 0) {
- // try to force a minor collection: the young gen is 4M, the
- // amount of data allocated below is roughly that (4*1024*1024 +
- // some header data)
- for (int i = 0; i < 1024 ; i++) {
- temp = new int[1024];
- }
- }
-
- for (int i = 0; i < numGCs - 1; i++) {
- System.gc();
- }
- }
-}
-
public class TestSummarizeRSetStats {
- public static String runTest(String[] additionalArgs, int numGCs) throws Exception {
- ArrayList<String> finalargs = new ArrayList<String>();
- String[] defaultArgs = new String[] {
- "-XX:+UseG1GC",
- "-Xmn4m",
- "-Xmx20m",
- "-XX:InitiatingHeapOccupancyPercent=100", // we don't want the additional GCs due to initial marking
- "-XX:+PrintGC",
- "-XX:+UnlockDiagnosticVMOptions",
- "-XX:G1HeapRegionSize=1M",
- };
-
- finalargs.addAll(Arrays.asList(defaultArgs));
-
- if (additionalArgs != null) {
- finalargs.addAll(Arrays.asList(additionalArgs));
- }
-
- finalargs.add(RunSystemGCs.class.getName());
- finalargs.add(String.valueOf(numGCs));
-
- ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- finalargs.toArray(new String[0]));
- OutputAnalyzer output = new OutputAnalyzer(pb.start());
-
- output.shouldHaveExitValue(0);
-
- String result = output.getStdout();
- return result;
- }
-
- private static void expectStatistics(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
- int actualTotal = result.split("Concurrent RS processed").length - 1;
- int actualCumulative = result.split("Cumulative RS summary").length - 1;
-
- if (expectedCumulative != actualCumulative) {
- throw new Exception("Incorrect amount of RSet summaries at the end. Expected " + expectedCumulative + ", got " + actualCumulative);
- }
-
- if (expectedPeriodic != (actualTotal - actualCumulative)) {
- throw new Exception("Incorrect amount of per-period RSet summaries at the end. Expected " + expectedPeriodic + ", got " + (actualTotal - actualCumulative));
- }
- }
-
public static void main(String[] args) throws Exception {
String result;
- // no RSet statistics output
- result = runTest(null, 0);
- expectStatistics(result, 0, 0);
+ if (!TestSummarizeRSetStatsTools.testingG1GC()) {
+ return;
+ }
- // no RSet statistics output
- result = runTest(null, 2);
- expectStatistics(result, 0, 0);
+ // no remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(null, 0);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 0, 0);
- // no RSet statistics output
- result = runTest(new String[] { "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
- expectStatistics(result, 0, 0);
+ // no remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(null, 2);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 0, 0);
- // single RSet statistics output at the end
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 0);
- expectStatistics(result, 1, 0);
+ // no remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 0, 0);
- // single RSet statistics output at the end
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 2);
- expectStatistics(result, 1, 0);
+ // single remembered set summary output at the end
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 0);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 0);
- // single RSet statistics output
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 0);
- expectStatistics(result, 1, 0);
+ // single remembered set summary output at the end
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 2);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 0);
- // two times RSet statistics output
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 1);
- expectStatistics(result, 1, 1);
+ // single remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 0);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 0);
+
+ // two times remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 1);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 2);
- // four times RSet statistics output
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
- expectStatistics(result, 1, 3);
+ // four times remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 6);
- // three times RSet statistics output
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=2" }, 3);
- expectStatistics(result, 1, 2);
+ // three times remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=2" }, 3);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 4);
- // single RSet statistics output
- result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=100" }, 3);
- expectStatistics(result, 1, 1);
+ // single remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=100" }, 3);
+ TestSummarizeRSetStatsTools.expectRSetSummaries(result, 1, 2);
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/TestSummarizeRSetStatsPerRegion.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestSummarizeRSetStatsPerRegion.java
+ * @bug 8014078
+ * @library /testlibrary
+ * @build TestSummarizeRSetStatsTools TestSummarizeRSetStatsPerRegion
+ * @summary Verify output of -XX:+G1SummarizeRSetStats in regards to per-region type output
+ * @run main TestSummarizeRSetStatsPerRegion
+ */
+
+import com.oracle.java.testlibrary.*;
+import java.lang.Thread;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+public class TestSummarizeRSetStatsPerRegion {
+
+ public static void main(String[] args) throws Exception {
+ String result;
+
+ if (!TestSummarizeRSetStatsTools.testingG1GC()) {
+ return;
+ }
+
+ // single remembered set summary output at the end
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 0);
+ TestSummarizeRSetStatsTools.expectPerRegionRSetSummaries(result, 1, 0);
+
+ // two times remembered set summary output
+ result = TestSummarizeRSetStatsTools.runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 1);
+ TestSummarizeRSetStatsTools.expectPerRegionRSetSummaries(result, 1, 2);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/TestSummarizeRSetStatsThreads.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestSummarizeRSetStatsThreads
+ * @bug 8025441
+ * @summary Ensure that various values of worker threads/concurrent
+ * refinement threads do not crash the VM.
+ * @key gc
+ * @library /testlibrary
+ */
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.oracle.java.testlibrary.ProcessTools;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+public class TestSummarizeRSetStatsThreads {
+
+ private static void runTest(int refinementThreads, int workerThreads) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:+UseG1GC",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+G1SummarizeRSetStats",
+ "-XX:G1ConcRefinementThreads=" + refinementThreads,
+ "-XX:ParallelGCThreads=" + workerThreads,
+ "-version");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ // check output to contain the string "Concurrent RS threads times (s)" followed by
+ // the correct number of values in the next line.
+
+ // a zero in refinement thread numbers indicates that the value in ParallelGCThreads should be used.
+ // Additionally use at least one thread.
+ int expectedNumRefinementThreads = refinementThreads == 0 ? workerThreads : refinementThreads;
+ expectedNumRefinementThreads = Math.max(1, expectedNumRefinementThreads);
+ // create the pattern made up of n copies of a floating point number pattern
+ String numberPattern = String.format("%0" + expectedNumRefinementThreads + "d", 0)
+ .replace("0", "\\s+\\d+\\.\\d+");
+ String pattern = "Concurrent RS threads times \\(s\\)$" + numberPattern + "$";
+ Matcher m = Pattern.compile(pattern, Pattern.MULTILINE).matcher(output.getStdout());
+
+ if (!m.find()) {
+ throw new Exception("Could not find correct output for concurrent RS threads times in stdout," +
+ " should match the pattern \"" + pattern + "\", but stdout is \n" + output.getStdout());
+ }
+ output.shouldHaveExitValue(0);
+ }
+
+ public static void main(String[] args) throws Exception {
+ if (!TestSummarizeRSetStatsTools.testingG1GC()) {
+ return;
+ }
+ // different valid combinations of number of refinement and gc worker threads
+ runTest(0, 0);
+ runTest(0, 5);
+ runTest(5, 0);
+ runTest(10, 10);
+ runTest(1, 2);
+ runTest(4, 3);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/g1/TestSummarizeRSetStatsTools.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Common helpers for TestSummarizeRSetStats* tests
+ */
+
+import sun.management.ManagementFactoryHelper;
+import com.sun.management.HotSpotDiagnosticMXBean;
+import com.sun.management.VMOption;
+
+import com.oracle.java.testlibrary.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.lang.Thread;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+class VerifySummaryOutput {
+ // 4M size, both are directly allocated into the old gen
+ static Object[] largeObject1 = new Object[1024 * 1024];
+ static Object[] largeObject2 = new Object[1024 * 1024];
+
+ static int[] temp;
+
+ public static void main(String[] args) {
+ // create some cross-references between these objects
+ for (int i = 0; i < largeObject1.length; i++) {
+ largeObject1[i] = largeObject2;
+ }
+
+ for (int i = 0; i < largeObject2.length; i++) {
+ largeObject2[i] = largeObject1;
+ }
+
+ int numGCs = Integer.parseInt(args[0]);
+
+ if (numGCs > 0) {
+ // try to force a minor collection: the young gen is 4M, the
+ // amount of data allocated below is roughly that (4*1024*1024 +
+ // some header data)
+ for (int i = 0; i < 1024 ; i++) {
+ temp = new int[1024];
+ }
+ }
+
+ for (int i = 0; i < numGCs - 1; i++) {
+ System.gc();
+ }
+ }
+}
+
+public class TestSummarizeRSetStatsTools {
+
+ // the VM is currently run using G1GC, i.e. trying to test G1 functionality.
+ public static boolean testingG1GC() {
+ HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
+
+ VMOption option = diagnostic.getVMOption("UseG1GC");
+ if (option.getValue().equals("false")) {
+ System.out.println("Skipping this test. It is only a G1 test.");
+ return false;
+ }
+ return true;
+ }
+
+ public static String runTest(String[] additionalArgs, int numGCs) throws Exception {
+ ArrayList<String> finalargs = new ArrayList<String>();
+ String[] defaultArgs = new String[] {
+ "-XX:+UseG1GC",
+ "-XX:+UseCompressedOops",
+ "-Xmn4m",
+ "-Xmx20m",
+ "-XX:InitiatingHeapOccupancyPercent=100", // we don't want the additional GCs due to initial marking
+ "-XX:+PrintGC",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:G1HeapRegionSize=1M",
+ };
+
+ finalargs.addAll(Arrays.asList(defaultArgs));
+
+ if (additionalArgs != null) {
+ finalargs.addAll(Arrays.asList(additionalArgs));
+ }
+
+ finalargs.add(VerifySummaryOutput.class.getName());
+ finalargs.add(String.valueOf(numGCs));
+
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ finalargs.toArray(new String[0]));
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+
+ output.shouldHaveExitValue(0);
+
+ String result = output.getStdout();
+ return result;
+ }
+
+ private static void checkCounts(int expected, int actual, String which) throws Exception {
+ if (expected != actual) {
+ throw new Exception("RSet summaries mention " + which + " regions an incorrect number of times. Expected " + expected + ", got " + actual);
+ }
+ }
+
+ public static void expectPerRegionRSetSummaries(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
+ expectRSetSummaries(result, expectedCumulative, expectedPeriodic);
+ int actualYoung = result.split("Young regions").length - 1;
+ int actualHumonguous = result.split("Humonguous regions").length - 1;
+ int actualFree = result.split("Free regions").length - 1;
+ int actualOther = result.split("Old regions").length - 1;
+
+ // the strings we check for above are printed four times per summary
+ int expectedPerRegionTypeInfo = (expectedCumulative + expectedPeriodic) * 4;
+
+ checkCounts(expectedPerRegionTypeInfo, actualYoung, "Young");
+ checkCounts(expectedPerRegionTypeInfo, actualHumonguous, "Humonguous");
+ checkCounts(expectedPerRegionTypeInfo, actualFree, "Free");
+ checkCounts(expectedPerRegionTypeInfo, actualOther, "Old");
+ }
+
+ public static void expectRSetSummaries(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
+ int actualTotal = result.split("concurrent refinement").length - 1;
+ int actualCumulative = result.split("Cumulative RS summary").length - 1;
+
+ if (expectedCumulative != actualCumulative) {
+ throw new Exception("Incorrect amount of RSet summaries at the end. Expected " + expectedCumulative + ", got " + actualCumulative);
+ }
+
+ if (expectedPeriodic != (actualTotal - actualCumulative)) {
+ throw new Exception("Incorrect amount of per-period RSet summaries at the end. Expected " + expectedPeriodic + ", got " + (actualTotal - actualCumulative));
+ }
+ }
+}
+
--- a/hotspot/test/gc/metaspace/ClassMetaspaceSizeInJmapHeap.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test ClassMetaspaceSizeInJmapHeap
- * @bug 8004924
- * @summary Checks that jmap -heap contains the flag ClassMetaspaceSize
- * @library /testlibrary
- * @run main/othervm -XX:ClassMetaspaceSize=50m ClassMetaspaceSizeInJmapHeap
- */
-
-import com.oracle.java.testlibrary.*;
-import java.nio.file.*;
-import java.io.File;
-import java.nio.charset.Charset;
-import java.util.List;
-
-public class ClassMetaspaceSizeInJmapHeap {
- public static void main(String[] args) throws Exception {
- String pid = Integer.toString(ProcessTools.getProcessId());
-
- JDKToolLauncher jmap = JDKToolLauncher.create("jmap")
- .addToolArg("-heap")
- .addToolArg(pid);
- ProcessBuilder pb = new ProcessBuilder(jmap.getCommand());
-
- File out = new File("ClassMetaspaceSizeInJmapHeap.stdout.txt");
- pb.redirectOutput(out);
-
- File err = new File("ClassMetaspaceSizeInJmapHeap.stderr.txt");
- pb.redirectError(err);
-
- run(pb);
-
- OutputAnalyzer output = new OutputAnalyzer(read(out));
- output.shouldContain("ClassMetaspaceSize = 52428800 (50.0MB)");
- out.delete();
- }
-
- private static void run(ProcessBuilder pb) throws Exception {
- Process p = pb.start();
- p.waitFor();
- int exitValue = p.exitValue();
- if (exitValue != 0) {
- throw new Exception("jmap -heap exited with error code: " + exitValue);
- }
- }
-
- private static String read(File f) throws Exception {
- Path p = f.toPath();
- List<String> lines = Files.readAllLines(p, Charset.defaultCharset());
-
- StringBuilder sb = new StringBuilder();
- for (String line : lines) {
- sb.append(line).append('\n');
- }
- return sb.toString();
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/metaspace/CompressedClassSpaceSizeInJmapHeap.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test CompressedClassSpaceSizeInJmapHeap
+ * @bug 8004924
+ * @summary Checks that jmap -heap contains the flag CompressedClassSpaceSize
+ * @library /testlibrary
+ * @run main/othervm -XX:CompressedClassSpaceSize=50m CompressedClassSpaceSizeInJmapHeap
+ */
+
+import com.oracle.java.testlibrary.*;
+import java.nio.file.*;
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.List;
+
+public class CompressedClassSpaceSizeInJmapHeap {
+ public static void main(String[] args) throws Exception {
+ String pid = Integer.toString(ProcessTools.getProcessId());
+
+ JDKToolLauncher jmap = JDKToolLauncher.create("jmap")
+ .addToolArg("-heap")
+ .addToolArg(pid);
+ ProcessBuilder pb = new ProcessBuilder(jmap.getCommand());
+
+ File out = new File("CompressedClassSpaceSizeInJmapHeap.stdout.txt");
+ pb.redirectOutput(out);
+
+ File err = new File("CompressedClassSpaceSizeInJmapHeap.stderr.txt");
+ pb.redirectError(err);
+
+ run(pb);
+
+ OutputAnalyzer output = new OutputAnalyzer(read(out));
+ output.shouldContain("CompressedClassSpaceSize = 52428800 (50.0MB)");
+ out.delete();
+ }
+
+ private static void run(ProcessBuilder pb) throws Exception {
+ Process p = pb.start();
+ p.waitFor();
+ int exitValue = p.exitValue();
+ if (exitValue != 0) {
+ throw new Exception("jmap -heap exited with error code: " + exitValue);
+ }
+ }
+
+ private static String read(File f) throws Exception {
+ Path p = f.toPath();
+ List<String> lines = Files.readAllLines(p, Charset.defaultCharset());
+
+ StringBuilder sb = new StringBuilder();
+ for (String line : lines) {
+ sb.append(line).append('\n');
+ }
+ return sb.toString();
+ }
+}
--- a/hotspot/test/gc/metaspace/G1AddMetaspaceDependency.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/gc/metaspace/G1AddMetaspaceDependency.java Thu Oct 03 19:18:54 2013 +0100
@@ -107,7 +107,6 @@
Loader f_loader = new Loader(b_name, b_bytes, a_name, a_loader);
Loader g_loader = new Loader(b_name, b_bytes, a_name, a_loader);
- byte[] b = new byte[20 * 2 << 20];
Class<?> c;
c = b_loader.loadClass(b_name);
c = c_loader.loadClass(b_name);
--- a/hotspot/test/gc/metaspace/TestMetaspaceMemoryPool.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/gc/metaspace/TestMetaspaceMemoryPool.java Thu Oct 03 19:18:54 2013 +0100
@@ -22,55 +22,35 @@
*/
import java.util.List;
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryManagerMXBean;
-import java.lang.management.MemoryPoolMXBean;
-import java.lang.management.MemoryUsage;
-
-import java.lang.management.RuntimeMXBean;
-import java.lang.management.ManagementFactory;
+import java.lang.management.*;
+import com.oracle.java.testlibrary.*;
+import static com.oracle.java.testlibrary.Asserts.*;
/* @test TestMetaspaceMemoryPool
* @bug 8000754
* @summary Tests that a MemoryPoolMXBeans is created for metaspace and that a
* MemoryManagerMXBean is created.
+ * @library /testlibrary
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops TestMetaspaceMemoryPool
* @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:MaxMetaspaceSize=60m TestMetaspaceMemoryPool
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers TestMetaspaceMemoryPool
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:ClassMetaspaceSize=60m TestMetaspaceMemoryPool
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers TestMetaspaceMemoryPool
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:CompressedClassSpaceSize=60m TestMetaspaceMemoryPool
*/
public class TestMetaspaceMemoryPool {
public static void main(String[] args) {
verifyThatMetaspaceMemoryManagerExists();
- verifyMemoryPool(getMemoryPool("Metaspace"), isFlagDefined("MaxMetaspaceSize"));
- if (runsOn64bit()) {
- if (usesCompressedOops()) {
+ boolean isMetaspaceMaxDefined = InputArguments.containsPrefix("-XX:MaxMetaspaceSize");
+ verifyMemoryPool(getMemoryPool("Metaspace"), isMetaspaceMaxDefined);
+
+ if (Platform.is64bit()) {
+ if (InputArguments.contains("-XX:+UseCompressedOops")) {
MemoryPoolMXBean cksPool = getMemoryPool("Compressed Class Space");
verifyMemoryPool(cksPool, true);
}
}
}
- private static boolean runsOn64bit() {
- return !System.getProperty("sun.arch.data.model").equals("32");
- }
-
- private static boolean usesCompressedOops() {
- return isFlagDefined("+UseCompressedOops");
- }
-
- private static boolean isFlagDefined(String name) {
- RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
- List<String> args = runtimeMxBean.getInputArguments();
- for (String arg : args) {
- if (arg.startsWith("-XX:" + name)) {
- return true;
- }
- }
- return false;
- }
-
private static void verifyThatMetaspaceMemoryManagerExists() {
List<MemoryManagerMXBean> managers = ManagementFactory.getMemoryManagerMXBeans();
for (MemoryManagerMXBean manager : managers) {
@@ -95,32 +75,19 @@
private static void verifyMemoryPool(MemoryPoolMXBean pool, boolean isMaxDefined) {
MemoryUsage mu = pool.getUsage();
- assertDefined(mu.getInit(), "init");
- assertDefined(mu.getUsed(), "used");
- assertDefined(mu.getCommitted(), "committed");
+ long init = mu.getInit();
+ long used = mu.getUsed();
+ long committed = mu.getCommitted();
+ long max = mu.getMax();
+
+ assertGTE(init, 0L);
+ assertGTE(used, init);
+ assertGTE(committed, used);
if (isMaxDefined) {
- assertDefined(mu.getMax(), "max");
+ assertGTE(max, committed);
} else {
- assertUndefined(mu.getMax(), "max");
- }
- }
-
- private static void assertDefined(long value, String name) {
- assertTrue(value != -1, "Expected " + name + " to be defined");
- }
-
- private static void assertUndefined(long value, String name) {
- assertEquals(value, -1, "Expected " + name + " to be undefined");
- }
-
- private static void assertEquals(long actual, long expected, String msg) {
- assertTrue(actual == expected, msg);
- }
-
- private static void assertTrue(boolean condition, String msg) {
- if (!condition) {
- throw new RuntimeException(msg);
+ assertEQ(max, -1L);
}
}
}
--- a/hotspot/test/gc/metaspace/TestMetaspacePerfCounters.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/gc/metaspace/TestMetaspacePerfCounters.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,13 +33,13 @@
* @summary Tests that performance counters for metaspace and compressed class
* space exists and works.
*
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseSerialGC TestMetaspacePerfCounters
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseG1GC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UseSerialGC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UseG1GC TestMetaspacePerfCounters
*
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseSerialGC TestMetaspacePerfCounters
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UsePerfData -XX:+UseG1GC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UseSerialGC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:+UsePerfData -XX:+UseG1GC TestMetaspacePerfCounters
*/
public class TestMetaspacePerfCounters {
public static Class fooClass = null;
@@ -61,10 +61,15 @@
}
private static void checkPerfCounters(String ns) throws Exception {
- for (PerfCounter counter : countersInNamespace(ns)) {
- String msg = "Expected " + counter.getName() + " to be larger than 0";
- assertGT(counter.longValue(), 0L, msg);
- }
+ long minCapacity = getMinCapacity(ns);
+ long maxCapacity = getMaxCapacity(ns);
+ long capacity = getCapacity(ns);
+ long used = getUsed(ns);
+
+ assertGTE(minCapacity, 0L);
+ assertGTE(used, minCapacity);
+ assertGTE(capacity, used);
+ assertGTE(maxCapacity, capacity);
}
private static void checkEmptyPerfCounters(String ns) throws Exception {
@@ -75,12 +80,10 @@
}
private static void checkUsedIncreasesWhenLoadingClass(String ns) throws Exception {
- PerfCounter used = PerfCounters.findByName(ns + ".used");
-
- long before = used.longValue();
+ long before = getUsed(ns);
fooClass = compileAndLoad("Foo", "public class Foo { }");
System.gc();
- long after = used.longValue();
+ long after = getUsed(ns);
assertGT(after, before);
}
@@ -99,6 +102,22 @@
}
private static boolean isUsingCompressedClassPointers() {
- return Platform.is64bit() && InputArguments.contains("-XX:+UseCompressedKlassPointers");
+ return Platform.is64bit() && InputArguments.contains("-XX:+UseCompressedClassPointers");
+ }
+
+ private static long getMinCapacity(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".minCapacity").longValue();
+ }
+
+ private static long getCapacity(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".capacity").longValue();
+ }
+
+ private static long getMaxCapacity(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".maxCapacity").longValue();
+ }
+
+ private static long getUsed(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".used").longValue();
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/metaspace/TestMetaspaceSizeFlags.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.oracle.java.testlibrary.Asserts;
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+/*
+ * @test TestMetaspaceSizeFlags
+ * @key gc
+ * @bug 8024650
+ * @summary Test that metaspace size flags can be set correctly
+ * @library /testlibrary
+ */
+public class TestMetaspaceSizeFlags {
+ public static final long K = 1024L;
+ public static final long M = 1024L * K;
+
+ // HotSpot uses a number of different values to align memory size flags.
+ // This is currently the largest alignment (unless huge large pages are used).
+ public static final long MAX_ALIGNMENT = 32 * M;
+
+ public static void main(String [] args) throws Exception {
+ testMaxMetaspaceSizeEQMetaspaceSize(MAX_ALIGNMENT, MAX_ALIGNMENT);
+ // 8024650: MaxMetaspaceSize was adjusted instead of MetaspaceSize.
+ testMaxMetaspaceSizeLTMetaspaceSize(MAX_ALIGNMENT, MAX_ALIGNMENT * 2);
+ testMaxMetaspaceSizeGTMetaspaceSize(MAX_ALIGNMENT * 2, MAX_ALIGNMENT);
+ testTooSmallInitialMetaspace(0, 0);
+ testTooSmallInitialMetaspace(0, MAX_ALIGNMENT);
+ testTooSmallInitialMetaspace(MAX_ALIGNMENT, 0);
+ }
+
+ private static void testMaxMetaspaceSizeEQMetaspaceSize(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ MetaspaceFlags mf = runAndGetValue(maxMetaspaceSize, metaspaceSize);
+ Asserts.assertEQ(maxMetaspaceSize, metaspaceSize);
+ Asserts.assertEQ(mf.maxMetaspaceSize, maxMetaspaceSize);
+ Asserts.assertEQ(mf.metaspaceSize, metaspaceSize);
+ }
+
+ private static void testMaxMetaspaceSizeLTMetaspaceSize(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ MetaspaceFlags mf = runAndGetValue(maxMetaspaceSize, metaspaceSize);
+ Asserts.assertEQ(mf.maxMetaspaceSize, maxMetaspaceSize);
+ Asserts.assertEQ(mf.metaspaceSize, maxMetaspaceSize);
+ }
+
+ private static void testMaxMetaspaceSizeGTMetaspaceSize(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ MetaspaceFlags mf = runAndGetValue(maxMetaspaceSize, metaspaceSize);
+ Asserts.assertGT(maxMetaspaceSize, metaspaceSize);
+ Asserts.assertGT(mf.maxMetaspaceSize, mf.metaspaceSize);
+ Asserts.assertEQ(mf.maxMetaspaceSize, maxMetaspaceSize);
+ Asserts.assertEQ(mf.metaspaceSize, metaspaceSize);
+ }
+
+ private static void testTooSmallInitialMetaspace(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ OutputAnalyzer output = run(maxMetaspaceSize, metaspaceSize);
+ output.shouldContain("Too small initial Metaspace size");
+ }
+
+ private static MetaspaceFlags runAndGetValue(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ OutputAnalyzer output = run(maxMetaspaceSize, metaspaceSize);
+ output.shouldNotMatch("Error occurred during initialization of VM\n.*");
+
+ String stringMaxMetaspaceSize = output.firstMatch(".* MaxMetaspaceSize .* := (\\d+).*", 1);
+ String stringMetaspaceSize = output.firstMatch(".* MetaspaceSize .* := (\\d+).*", 1);
+
+ return new MetaspaceFlags(Long.parseLong(stringMaxMetaspaceSize),
+ Long.parseLong(stringMetaspaceSize));
+ }
+
+ private static OutputAnalyzer run(long maxMetaspaceSize, long metaspaceSize) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:MaxMetaspaceSize=" + maxMetaspaceSize,
+ "-XX:MetaspaceSize=" + metaspaceSize,
+ "-XX:-UseLargePages", // Prevent us from using 2GB large pages on solaris + sparc.
+ "-XX:+PrintFlagsFinal",
+ "-version");
+ return new OutputAnalyzer(pb.start());
+ }
+
+ private static class MetaspaceFlags {
+ public long maxMetaspaceSize;
+ public long metaspaceSize;
+ public MetaspaceFlags(long maxMetaspaceSize, long metaspaceSize) {
+ this.maxMetaspaceSize = maxMetaspaceSize;
+ this.metaspaceSize = metaspaceSize;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/gc/metaspace/TestPerfCountersAndMemoryPools.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.List;
+import java.lang.management.*;
+
+import com.oracle.java.testlibrary.*;
+import static com.oracle.java.testlibrary.Asserts.*;
+
+/* @test TestPerfCountersAndMemoryPools
+ * @bug 8023476
+ * @library /testlibrary
+ * @summary Tests that a MemoryPoolMXBeans and PerfCounters for metaspace
+ * report the same data.
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedKlassPointers -XX:+UseSerialGC -XX:+UsePerfData -Xint TestPerfCountersAndMemoryPools
+ * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UseSerialGC -XX:+UsePerfData -Xint TestPerfCountersAndMemoryPools
+ */
+public class TestPerfCountersAndMemoryPools {
+ public static void main(String[] args) throws Exception {
+ checkMemoryUsage("Metaspace", "sun.gc.metaspace");
+
+ if (InputArguments.contains("-XX:+UseCompressedKlassPointers") && Platform.is64bit()) {
+ checkMemoryUsage("Compressed Class Space", "sun.gc.compressedclassspace");
+ }
+ }
+
+ private static MemoryPoolMXBean getMemoryPool(String memoryPoolName) {
+ List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
+ for (MemoryPoolMXBean pool : pools) {
+ if (pool.getName().equals(memoryPoolName)) {
+ return pool;
+ }
+ }
+
+ throw new RuntimeException("Excpted to find a memory pool with name " +
+ memoryPoolName);
+ }
+
+ private static void checkMemoryUsage(String memoryPoolName, String perfNS)
+ throws Exception {
+ MemoryPoolMXBean pool = getMemoryPool(memoryPoolName);
+
+ // Must do a GC to update performance counters
+ System.gc();
+ assertEQ(getMinCapacity(perfNS), pool.getUsage().getInit());
+
+ // Must do a second GC to update the perfomance counters again, since
+ // the call pool.getUsage().getInit() could have allocated some
+ // metadata.
+ System.gc();
+ assertEQ(getUsed(perfNS), pool.getUsage().getUsed());
+ assertEQ(getCapacity(perfNS), pool.getUsage().getCommitted());
+ }
+
+ private static long getMinCapacity(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".minCapacity").longValue();
+ }
+
+ private static long getCapacity(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".capacity").longValue();
+ }
+
+ private static long getUsed(String ns) throws Exception {
+ return PerfCounters.findByName(ns + ".used").longValue();
+ }
+}
--- a/hotspot/test/runtime/6878713/Test6878713.sh Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-
-##
-## @test
-## @bug 6878713
-## @bug 7030610
-## @bug 7037122
-## @bug 7123945
-## @summary Verifier heap corruption, relating to backward jsrs
-## @run shell Test6878713.sh
-##
-## some tests require path to find test source dir
-if [ "${TESTSRC}" = "" ]
-then
- TESTSRC=${PWD}
- echo "TESTSRC not set. Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../test_env.sh
-
-TARGET_CLASS=OOMCrashClass1960_2
-
-echo "INFO: extracting the target class."
-${COMPILEJAVA}${FS}bin${FS}jar xvf \
- ${TESTSRC}${FS}testcase.jar ${TARGET_CLASS}.class
-
-# remove any hs_err_pid that might exist here
-rm -f hs_err_pid*.log
-
-echo "INFO: checking for 32-bit versus 64-bit VM."
-${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -version 2>&1 \
- | grep "64-Bit [^ ][^ ]* VM" > /dev/null 2>&1
-status="$?"
-if [ "$status" = 0 ]; then
- echo "INFO: testing a 64-bit VM."
- is_64_bit=true
-else
- echo "INFO: testing a 32-bit VM."
-fi
-
-if [ "$is_64_bit" = true ]; then
- # limit is 768MB in 8-byte words (1024 * 1024 * 768 / 8) == 100663296
- MALLOC_MAX=100663296
-else
- # limit is 768MB in 4-byte words (1024 * 1024 * 768 / 4) == 201326592
- MALLOC_MAX=201326592
-fi
-echo "INFO: MALLOC_MAX=$MALLOC_MAX"
-
-echo "INFO: executing the target class."
-# -XX:+PrintCommandLineFlags for debugging purposes
-# -XX:+IgnoreUnrecognizedVMOptions so test will run on a VM without
-# the new -XX:MallocMaxTestWords option
-# -XX:+UnlockDiagnosticVMOptions so we can use -XX:MallocMaxTestWords
-# -XX:MallocMaxTestWords limits malloc to $MALLOC_MAX
-${TESTJAVA}${FS}bin${FS}java \
- -XX:+PrintCommandLineFlags \
- -XX:+IgnoreUnrecognizedVMOptions \
- -XX:+UnlockDiagnosticVMOptions \
- -XX:MallocMaxTestWords=$MALLOC_MAX \
- ${TESTVMOPTS} ${TARGET_CLASS} > test.out 2>&1
-
-echo "INFO: begin contents of test.out:"
-cat test.out
-echo "INFO: end contents of test.out."
-
-echo "INFO: checking for memory allocation error message."
-# We are looking for this specific memory allocation failure mesg so
-# we know we exercised the right allocation path with the test class:
-MESG1="Native memory allocation (malloc) failed to allocate 25696531[0-9][0-9] bytes"
-grep "$MESG1" test.out
-status="$?"
-if [ "$status" = 0 ]; then
- echo "INFO: found expected memory allocation error message."
-else
- echo "INFO: did not find expected memory allocation error message."
-
- # If we didn't find MESG1 above, then there are several scenarios:
- # 1) -XX:MallocMaxTestWords is not supported by the current VM and we
- # didn't fail TARGET_CLASS's memory allocation attempt; instead
- # we failed to find TARGET_CLASS's main() method. The TARGET_CLASS
- # is designed to provoke a memory allocation failure during class
- # loading; we actually don't care about running the class which is
- # why it doesn't have a main() method.
- # 2) we failed a memory allocation, but not the one we were looking
- # so it might be that TARGET_CLASS no longer tickles the same
- # memory allocation code path
- # 3) TARGET_CLASS reproduces the failure mode (SIGSEGV) fixed by
- # 6878713 because the test is running on a pre-fix VM.
- echo "INFO: checking for no main() method message."
- MESG2="Error: Main method not found in class"
- grep "$MESG2" test.out
- status="$?"
- if [ "$status" = 0 ]; then
- echo "INFO: found no main() method message."
- else
- echo "FAIL: did not find no main() method message."
- # status is non-zero for exit below
-
- if [ -s hs_err_pid*.log ]; then
- echo "INFO: begin contents of hs_err_pid file:"
- cat hs_err_pid*.log
- echo "INFO: end contents of hs_err_pid file."
- fi
- fi
-fi
-
-if [ "$status" = 0 ]; then
- echo "PASS: test found one of the expected messages."
-fi
-exit "$status"
Binary file hotspot/test/runtime/6878713/testcase.jar has changed
--- a/hotspot/test/runtime/7020373/Test7020373.sh Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-#!/bin/sh
-
-##
-## @test
-## @bug 7020373 7055247 7053586 7185550
-## @key cte_test
-## @summary JSR rewriting can overflow memory address size variables
-## @ignore Ignore it as 7053586 test uses lots of memory. See bug report for detail.
-## @run shell Test7020373.sh
-##
-
-if [ "${TESTSRC}" = "" ]
-then
- TESTSRC=${PWD}
- echo "TESTSRC not set. Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../test_env.sh
-
-${COMPILEJAVA}${FS}bin${FS}jar xvf ${TESTSRC}${FS}testcase.jar
-
-${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} OOMCrashClass4000_1 > test.out 2>&1
-
-cat test.out
-
-egrep "SIGSEGV|An unexpected error has been detected" test.out
-
-if [ $? = 0 ]
-then
- echo "Test Failed"
- exit 1
-else
- egrep "java.lang.LinkageError|java.lang.NoSuchMethodError|Main method not found in class OOMCrashClass4000_1|insufficient memory" test.out
- if [ $? = 0 ]
- then
- echo "Test Passed"
- exit 0
- else
- echo "Test Failed"
- exit 1
- fi
-fi
Binary file hotspot/test/runtime/7020373/testcase.jar has changed
--- a/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrs.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrs.java Thu Oct 03 19:18:54 2013 +0100
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8003424
- * @summary Testing UseCompressedKlassPointers with CDS
+ * @summary Testing UseCompressedClassPointers with CDS
* @library /testlibrary
* @run main CDSCompressedKPtrs
*/
@@ -36,7 +36,7 @@
ProcessBuilder pb;
if (Platform.is64bit()) {
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedKlassPointers", "-XX:+UseCompressedOops",
+ "-XX:+UseCompressedClassPointers", "-XX:+UseCompressedOops",
"-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
try {
@@ -44,7 +44,7 @@
output.shouldHaveExitValue(0);
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedKlassPointers", "-XX:+UseCompressedOops",
+ "-XX:+UseCompressedClassPointers", "-XX:+UseCompressedOops",
"-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldContain("sharing");
--- a/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/runtime/CDSCompressedKPtrs/CDSCompressedKPtrsError.java Thu Oct 03 19:18:54 2013 +0100
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8003424
- * @summary Test that cannot use CDS if UseCompressedKlassPointers is turned off.
+ * @summary Test that cannot use CDS if UseCompressedClassPointers is turned off.
* @library /testlibrary
* @run main CDSCompressedKPtrsError
*/
@@ -36,7 +36,7 @@
ProcessBuilder pb;
if (Platform.is64bit()) {
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedOops", "-XX:+UseCompressedKlassPointers", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+UseCompressedOops", "-XX:+UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
try {
@@ -44,21 +44,21 @@
output.shouldHaveExitValue(0);
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:-UseCompressedKlassPointers", "-XX:-UseCompressedOops",
+ "-XX:-UseCompressedClassPointers", "-XX:-UseCompressedOops",
"-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Unable to use shared archive");
output.shouldHaveExitValue(0);
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:-UseCompressedKlassPointers", "-XX:+UseCompressedOops",
+ "-XX:-UseCompressedClassPointers", "-XX:+UseCompressedOops",
"-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Unable to use shared archive");
output.shouldHaveExitValue(0);
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedKlassPointers", "-XX:-UseCompressedOops",
+ "-XX:+UseCompressedClassPointers", "-XX:-UseCompressedOops",
"-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Unable to use shared archive");
@@ -71,19 +71,19 @@
// Test bad options with -Xshare:dump.
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:-UseCompressedOops", "-XX:+UseCompressedKlassPointers", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:-UseCompressedOops", "-XX:+UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Cannot dump shared archive");
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedOops", "-XX:-UseCompressedKlassPointers", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:+UseCompressedOops", "-XX:-UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Cannot dump shared archive");
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:-UseCompressedOops", "-XX:-UseCompressedKlassPointers", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:-UseCompressedOops", "-XX:-UseCompressedClassPointers", "-XX:+UnlockDiagnosticVMOptions",
"-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
output = new OutputAnalyzer(pb.start());
output.shouldContain("Cannot dump shared archive");
--- a/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,16 +33,9 @@
public class XShareAuto {
public static void main(String[] args) throws Exception {
- if (!Platform.is64bit()) {
- System.out.println("ObjectAlignmentInBytes for CDS is only " +
- "supported on 64bit platforms; this plaform is " +
- System.getProperty("sun.arch.data.model"));
- System.out.println("Skipping the test");
- return;
- }
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa",
- "-Xshare:dump");
+ "-server", "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("Loading classes to share");
output.shouldHaveExitValue(0);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/ClassFile/JsrRewriting.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+
+/*
+ * @test JsrRewriting
+ * @summary JSR (jump local subroutine)
+ * rewriting can overflow memory address size variables
+ * @bug 7020373
+ * @bug 7055247
+ * @bug 7053586
+ * @bug 7185550
+ * @bug 7149464
+ * @key cte_test
+ * @library /testlibrary
+ * @run main JsrRewriting
+ */
+
+import com.oracle.java.testlibrary.*;
+import java.io.File;
+
+public class JsrRewriting {
+
+ public static void main(String[] args) throws Exception {
+
+ // ======= Configure the test
+ String jarFile = System.getProperty("test.src") +
+ File.separator + "JsrRewritingTestCase.jar";
+ String className = "OOMCrashClass4000_1";
+
+ // limit is 768MB in native words
+ int mallocMaxTestWords = (1024 * 1024 * 768 / 4);
+ if (Platform.is64bit())
+ mallocMaxTestWords = (mallocMaxTestWords / 2);
+
+ // ======= extract the test class
+ ProcessBuilder pb = new ProcessBuilder(new String[] {
+ JDKToolFinder.getJDKTool("jar"),
+ "xvf", jarFile } );
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(0);
+
+ // ======= execute the test
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-cp", ".",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:MallocMaxTestWords=" + mallocMaxTestWords,
+ className);
+
+ output = new OutputAnalyzer(pb.start());
+ String[] expectedMsgs = {
+ "java.lang.LinkageError",
+ "java.lang.NoSuchMethodError",
+ "Main method not found in class " + className,
+ "insufficient memory"
+ };
+
+ MultipleOrMatch(output, expectedMsgs);
+ }
+
+ private static void
+ MultipleOrMatch(OutputAnalyzer analyzer, String[] whatToMatch) {
+ String output = analyzer.getOutput();
+
+ for (String expected : whatToMatch)
+ if (output.contains(expected))
+ return;
+
+ String err =
+ " stdout: [" + analyzer.getOutput() + "];\n" +
+ " exitValue = " + analyzer.getExitValue() + "\n";
+ System.err.println(err);
+
+ StringBuilder msg = new StringBuilder("Output did not contain " +
+ "any of the following expected messages: \n");
+ for (String expected : whatToMatch)
+ msg.append(expected).append(System.lineSeparator());
+ throw new RuntimeException(msg.toString());
+ }
+}
+
Binary file hotspot/test/runtime/ClassFile/JsrRewritingTestCase.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/ClassFile/OomWhileParsingRepeatedJsr.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+
+/*
+ * @test OomWhileParsingRepeatedJsr
+ * @summary Testing class file parser; specifically parsing
+ * a file with repeated JSR (jump local subroutine)
+ * bytecode command.
+ * @bug 6878713
+ * @bug 7030610
+ * @bug 7037122
+ * @bug 7123945
+ * @bug 8016029
+ * @library /testlibrary
+ * @run main OomWhileParsingRepeatedJsr
+ */
+
+import com.oracle.java.testlibrary.*;
+
+
+public class OomWhileParsingRepeatedJsr {
+
+ public static void main(String[] args) throws Exception {
+
+ // ======= Configure the test
+ String jarFile = System.getProperty("test.src") + "/testcase.jar";
+ String className = "OOMCrashClass1960_2";
+
+ // limit is 768MB in native words
+ int mallocMaxTestWords = (1024 * 1024 * 768 / 4);
+ if (Platform.is64bit())
+ mallocMaxTestWords = (mallocMaxTestWords / 2);
+
+ // ======= extract the test class
+ ProcessBuilder pb = new ProcessBuilder(new String[] {
+ JDKToolFinder.getJDKTool("jar"),
+ "xvf", jarFile } );
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldHaveExitValue(0);
+
+ // ======= execute the test
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-cp", ".",
+ "-XX:+UnlockDiagnosticVMOptions",
+ "-XX:MallocMaxTestWords=" + mallocMaxTestWords,
+ className );
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Cannot reserve enough memory");
+ }
+}
+
Binary file hotspot/test/runtime/ClassFile/testcase.jar has changed
--- a/hotspot/test/runtime/CompressedOops/CompressedKlassPointerAndOops.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/runtime/CompressedOops/CompressedKlassPointerAndOops.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,7 +25,7 @@
* @test
* @bug 8000968
* @key regression
- * @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
+ * @summary NPG: UseCompressedClassPointers asserts with ObjectAlignmentInBytes=32
* @library /testlibrary
*/
@@ -52,7 +52,7 @@
OutputAnalyzer output;
pb = ProcessTools.createJavaProcessBuilder(
- "-XX:+UseCompressedKlassPointers",
+ "-XX:+UseCompressedClassPointers",
"-XX:+UseCompressedOops",
"-XX:ObjectAlignmentInBytes=" + alignment,
"-version");
--- a/hotspot/test/runtime/InitialThreadOverflow/testme.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/runtime/InitialThreadOverflow/testme.sh Thu Oct 03 19:18:54 2013 +0100
@@ -43,9 +43,9 @@
exit 0
fi
-gcc_cmd=`which gcc`
-if [ "x$gcc_cmd" == "x" ]; then
- echo "WARNING: gcc not found. Cannot execute test." 2>&1
+gcc_cmd=`which g++`
+if [ "x$gcc_cmd" = "x" ]; then
+ echo "WARNING: g++ not found. Cannot execute test." 2>&1
exit 0;
fi
--- a/hotspot/test/testlibrary/AssertsTest.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,237 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import static com.oracle.java.testlibrary.Asserts.*;
-
-/* @test
- * @summary Tests the different assertions in the Assert class
- * @library /testlibrary
- */
-public class AssertsTest {
- private static class Foo implements Comparable<Foo> {
- final int id;
- public Foo(int id) {
- this.id = id;
- }
-
- public int compareTo(Foo f) {
- return new Integer(id).compareTo(new Integer(f.id));
- }
- }
-
- public static void main(String[] args) throws Exception {
- testLessThan();
- testLessThanOrEqual();
- testEquals();
- testGreaterThanOrEqual();
- testGreaterThan();
- testNotEquals();
- testNull();
- testNotNull();
- testTrue();
- testFalse();
- }
-
- private static void testLessThan() throws Exception {
- expectPass(Assertion.LT, 1, 2);
-
- expectFail(Assertion.LT, 2, 2);
- expectFail(Assertion.LT, 2, 1);
- expectFail(Assertion.LT, null, 2);
- expectFail(Assertion.LT, 2, null);
- }
-
- private static void testLessThanOrEqual() throws Exception {
- expectPass(Assertion.LTE, 1, 2);
- expectPass(Assertion.LTE, 2, 2);
-
- expectFail(Assertion.LTE, 3, 2);
- expectFail(Assertion.LTE, null, 2);
- expectFail(Assertion.LTE, 2, null);
- }
-
- private static void testEquals() throws Exception {
- expectPass(Assertion.EQ, 1, 1);
- expectPass(Assertion.EQ, null, null);
-
- Foo f1 = new Foo(1);
- expectPass(Assertion.EQ, f1, f1);
-
- Foo f2 = new Foo(1);
- expectFail(Assertion.EQ, f1, f2);
- expectFail(Assertion.LTE, null, 2);
- expectFail(Assertion.LTE, 2, null);
- }
-
- private static void testGreaterThanOrEqual() throws Exception {
- expectPass(Assertion.GTE, 1, 1);
- expectPass(Assertion.GTE, 2, 1);
-
- expectFail(Assertion.GTE, 1, 2);
- expectFail(Assertion.GTE, null, 2);
- expectFail(Assertion.GTE, 2, null);
- }
-
- private static void testGreaterThan() throws Exception {
- expectPass(Assertion.GT, 2, 1);
-
- expectFail(Assertion.GT, 1, 1);
- expectFail(Assertion.GT, 1, 2);
- expectFail(Assertion.GT, null, 2);
- expectFail(Assertion.GT, 2, null);
- }
-
- private static void testNotEquals() throws Exception {
- expectPass(Assertion.NE, null, 1);
- expectPass(Assertion.NE, 1, null);
-
- Foo f1 = new Foo(1);
- Foo f2 = new Foo(1);
- expectPass(Assertion.NE, f1, f2);
-
- expectFail(Assertion.NE, null, null);
- expectFail(Assertion.NE, f1, f1);
- expectFail(Assertion.NE, 1, 1);
- }
-
- private static void testNull() throws Exception {
- expectPass(Assertion.NULL, null);
-
- expectFail(Assertion.NULL, 1);
- }
-
- private static void testNotNull() throws Exception {
- expectPass(Assertion.NOTNULL, 1);
-
- expectFail(Assertion.NOTNULL, null);
- }
-
- private static void testTrue() throws Exception {
- expectPass(Assertion.TRUE, true);
-
- expectFail(Assertion.TRUE, false);
- }
-
- private static void testFalse() throws Exception {
- expectPass(Assertion.FALSE, false);
-
- expectFail(Assertion.FALSE, true);
- }
-
- private static <T extends Comparable<T>> void expectPass(Assertion assertion, T ... args)
- throws Exception {
- Assertion.run(assertion, args);
- }
-
- private static <T extends Comparable<T>> void expectFail(Assertion assertion, T ... args)
- throws Exception {
- try {
- Assertion.run(assertion, args);
- } catch (RuntimeException e) {
- return;
- }
- throw new Exception("Expected " + Assertion.format(assertion, (Object[]) args) +
- " to throw a RuntimeException");
- }
-
-}
-
-enum Assertion {
- LT, LTE, EQ, GTE, GT, NE, NULL, NOTNULL, FALSE, TRUE;
-
- public static <T extends Comparable<T>> void run(Assertion assertion, T ... args) {
- String msg = "Expected " + format(assertion, args) + " to pass";
- switch (assertion) {
- case LT:
- assertLessThan(args[0], args[1], msg);
- break;
- case LTE:
- assertLessThanOrEqual(args[0], args[1], msg);
- break;
- case EQ:
- assertEquals(args[0], args[1], msg);
- break;
- case GTE:
- assertGreaterThanOrEqual(args[0], args[1], msg);
- break;
- case GT:
- assertGreaterThan(args[0], args[1], msg);
- break;
- case NE:
- assertNotEquals(args[0], args[1], msg);
- break;
- case NULL:
- assertNull(args == null ? args : args[0], msg);
- break;
- case NOTNULL:
- assertNotNull(args == null ? args : args[0], msg);
- break;
- case FALSE:
- assertFalse((Boolean) args[0], msg);
- break;
- case TRUE:
- assertTrue((Boolean) args[0], msg);
- break;
- default:
- // do nothing
- }
- }
-
- public static String format(Assertion assertion, Object ... args) {
- switch (assertion) {
- case LT:
- return asString("assertLessThan", args);
- case LTE:
- return asString("assertLessThanOrEqual", args);
- case EQ:
- return asString("assertEquals", args);
- case GTE:
- return asString("assertGreaterThanOrEquals", args);
- case GT:
- return asString("assertGreaterThan", args);
- case NE:
- return asString("assertNotEquals", args);
- case NULL:
- return asString("assertNull", args);
- case NOTNULL:
- return asString("assertNotNull", args);
- case FALSE:
- return asString("assertFalse", args);
- case TRUE:
- return asString("assertTrue", args);
- default:
- return "";
- }
- }
-
- private static String asString(String assertion, Object ... args) {
- if (args == null) {
- return String.format("%s(null)", assertion);
- }
- if (args.length == 1) {
- return String.format("%s(%s)", assertion, args[0]);
- } else {
- return String.format("%s(%s, %s)", assertion, args[0], args[1]);
- }
- }
-}
--- a/hotspot/test/testlibrary/OutputAnalyzerReportingTest.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-
-/*
- * @test
- * @summary Test the OutputAnalyzer reporting functionality,
- * such as printing additional diagnostic info
- * (exit code, stdout, stderr, command line, etc.)
- * @library /testlibrary
- */
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-import com.oracle.java.testlibrary.OutputAnalyzer;
-import com.oracle.java.testlibrary.ProcessTools;
-
-
-public class OutputAnalyzerReportingTest {
-
- public static void main(String[] args) throws Exception {
- // Create the output analyzer under test
- String stdout = "aaaaaa";
- String stderr = "bbbbbb";
- OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
-
- // Expected summary values should be the same for all cases,
- // since the outputAnalyzer object is the same
- String expectedExitValue = "-1";
- String expectedSummary =
- " stdout: [" + stdout + "];\n" +
- " stderr: [" + stderr + "]\n" +
- " exitValue = " + expectedExitValue + "\n";
-
-
- DiagnosticSummaryTestRunner testRunner =
- new DiagnosticSummaryTestRunner();
-
- // should have exit value
- testRunner.init(expectedSummary);
- int unexpectedExitValue = 2;
- try {
- output.shouldHaveExitValue(unexpectedExitValue);
- } catch (RuntimeException e) { }
- testRunner.closeAndCheckResults();
-
- // should not contain
- testRunner.init(expectedSummary);
- try {
- output.shouldNotContain(stdout);
- } catch (RuntimeException e) { }
- testRunner.closeAndCheckResults();
-
- // should contain
- testRunner.init(expectedSummary);
- try {
- output.shouldContain("unexpected-stuff");
- } catch (RuntimeException e) { }
- testRunner.closeAndCheckResults();
-
- // should not match
- testRunner.init(expectedSummary);
- try {
- output.shouldNotMatch("[a]");
- } catch (RuntimeException e) { }
- testRunner.closeAndCheckResults();
-
- // should match
- testRunner.init(expectedSummary);
- try {
- output.shouldMatch("[qwerty]");
- } catch (RuntimeException e) { }
- testRunner.closeAndCheckResults();
-
- }
-
- private static class DiagnosticSummaryTestRunner {
- private ByteArrayOutputStream byteStream =
- new ByteArrayOutputStream(10000);
-
- private String expectedSummary = "";
- private PrintStream errStream;
-
-
- public void init(String expectedSummary) {
- this.expectedSummary = expectedSummary;
- byteStream.reset();
- errStream = new PrintStream(byteStream);
- System.setErr(errStream);
- }
-
- public void closeAndCheckResults() {
- // check results
- errStream.close();
- String stdErrStr = byteStream.toString();
- if (!stdErrStr.contains(expectedSummary)) {
- throw new RuntimeException("The output does not contain "
- + "the diagnostic message, or the message is incorrect");
- }
- }
- }
-
-}
--- a/hotspot/test/testlibrary/OutputAnalyzerTest.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @summary Test the OutputAnalyzer utility class
- * @library /testlibrary
- */
-
-import com.oracle.java.testlibrary.OutputAnalyzer;
-
-public class OutputAnalyzerTest {
-
- public static void main(String args[]) throws Exception {
-
- String stdout = "aaaaaa";
- String stderr = "bbbbbb";
-
- // Regexps used for testing pattern matching of the test input
- String stdoutPattern = "[a]";
- String stderrPattern = "[b]";
- String nonExistingPattern = "[c]";
-
- OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
-
- if (!stdout.equals(output.getStdout())) {
- throw new Exception("getStdout() returned '" + output.getStdout() + "', expected '" + stdout + "'");
- }
-
- if (!stderr.equals(output.getStderr())) {
- throw new Exception("getStderr() returned '" + output.getStderr() + "', expected '" + stderr + "'");
- }
-
- try {
- output.shouldContain(stdout);
- output.stdoutShouldContain(stdout);
- output.shouldContain(stderr);
- output.stderrShouldContain(stderr);
- } catch (RuntimeException e) {
- throw new Exception("shouldContain() failed", e);
- }
-
- try {
- output.shouldContain("cccc");
- throw new Exception("shouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stdoutShouldContain(stderr);
- throw new Exception("stdoutShouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stderrShouldContain(stdout);
- throw new Exception("stdoutShouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.shouldNotContain("cccc");
- output.stdoutShouldNotContain("cccc");
- output.stderrShouldNotContain("cccc");
- } catch (RuntimeException e) {
- throw new Exception("shouldNotContain() failed", e);
- }
-
- try {
- output.shouldNotContain(stdout);
- throw new Exception("shouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stdoutShouldNotContain(stdout);
- throw new Exception("shouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stderrShouldNotContain(stderr);
- throw new Exception("shouldContain() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- // Should match
- try {
- output.shouldMatch(stdoutPattern);
- output.stdoutShouldMatch(stdoutPattern);
- output.shouldMatch(stderrPattern);
- output.stderrShouldMatch(stderrPattern);
- } catch (RuntimeException e) {
- throw new Exception("shouldMatch() failed", e);
- }
-
- try {
- output.shouldMatch(nonExistingPattern);
- throw new Exception("shouldMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stdoutShouldMatch(stderrPattern);
- throw new Exception(
- "stdoutShouldMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stderrShouldMatch(stdoutPattern);
- throw new Exception(
- "stderrShouldMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- // Should not match
- try {
- output.shouldNotMatch(nonExistingPattern);
- output.stdoutShouldNotMatch(nonExistingPattern);
- output.stderrShouldNotMatch(nonExistingPattern);
- } catch (RuntimeException e) {
- throw new Exception("shouldNotMatch() failed", e);
- }
-
- try {
- output.shouldNotMatch(stdoutPattern);
- throw new Exception("shouldNotMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stdoutShouldNotMatch(stdoutPattern);
- throw new Exception("shouldNotMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
-
- try {
- output.stderrShouldNotMatch(stderrPattern);
- throw new Exception("shouldNotMatch() failed to throw exception");
- } catch (RuntimeException e) {
- // expected
- }
- }
-}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/InputArguments.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/InputArguments.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,6 +41,9 @@
/**
* Returns true if {@code arg} is an input argument to the VM.
*
+ * This is useful for checking boolean flags such as -XX:+UseSerialGC or
+ * -XX:-UsePerfData.
+ *
* @param arg The name of the argument.
* @return {@code true} if the given argument is an input argument,
* otherwise {@code false}.
@@ -48,4 +51,26 @@
public static boolean contains(String arg) {
return args.contains(arg);
}
+
+ /**
+ * Returns true if {@code prefix} is the start of an input argument to the
+ * VM.
+ *
+ * This is useful for checking if flags describing a quantity, such as
+ * -XX:+MaxMetaspaceSize=100m, is set without having to know the quantity.
+ * To check if the flag -XX:MaxMetaspaceSize is set, use
+ * {@code InputArguments.containsPrefix("-XX:MaxMetaspaceSize")}.
+ *
+ * @param prefix The start of the argument.
+ * @return {@code true} if the given argument is the start of an input
+ * argument, otherwise {@code false}.
+ */
+ public static boolean containsPrefix(String prefix) {
+ for (String arg : args) {
+ if (arg.startsWith(prefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/JDKToolFinder.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/JDKToolFinder.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,9 @@
package com.oracle.java.testlibrary;
-import java.io.File;
+import java.io.FileNotFoundException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
public final class JDKToolFinder {
@@ -32,38 +34,73 @@
/**
* Returns the full path to an executable in jdk/bin based on System
- * property {@code compile.jdk} (set by jtreg test suite)
+ * property {@code test.jdk} or {@code compile.jdk} (both are set by the jtreg test suite)
*
* @return Full path to an executable in jdk/bin
*/
public static String getJDKTool(String tool) {
- String binPath = System.getProperty("compile.jdk");
- if (binPath == null) {
- throw new RuntimeException("System property 'compile.jdk' not set. "
- + "This property is normally set by jtreg. "
- + "When running test separately, set this property using "
- + "'-Dcompile.jdk=/path/to/jdk'.");
+
+ // First try to find the executable in test.jdk
+ try {
+ return getTool(tool, "test.jdk");
+ } catch (FileNotFoundException e) {
+
}
- binPath += File.separatorChar + "bin" + File.separatorChar + tool;
- return binPath;
+ // Now see if it's available in compile.jdk
+ try {
+ return getTool(tool, "compile.jdk");
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException("Failed to find " + tool +
+ ", looked in test.jdk (" + System.getProperty("test.jdk") +
+ ") and compile.jdk (" + System.getProperty("compile.jdk") + ")");
+ }
}
+
/**
- * Returns the full path to an executable in <current jdk>/bin based
- * on System property {@code test.jdk} (set by jtreg test suite)
+ * Returns the full path to an executable in jdk/bin based on System
+ * property {@code compile.jdk}
*
* @return Full path to an executable in jdk/bin
*/
- public static String getCurrentJDKTool(String tool) {
- String binPath = System.getProperty("test.jdk");
- if (binPath == null) {
- throw new RuntimeException("System property 'test.jdk' not set. "
- + "This property is normally set by jtreg. "
- + "When running test separately, set this property using "
- + "'-Dtest.jdk=/path/to/jdk'.");
+ public static String getCompileJDKTool(String tool) {
+ try {
+ return getTool(tool, "compile.jdk");
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Returns the full path to an executable in jdk/bin based on System
+ * property {@code test.jdk}
+ *
+ * @return Full path to an executable in jdk/bin
+ */
+ public static String getTestJDKTool(String tool) {
+ try {
+ return getTool(tool, "test.jdk");
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
}
- binPath += File.separatorChar + "bin" + File.separatorChar + tool;
+ }
+
+ private static String getTool(String tool, String property) throws FileNotFoundException {
+ String jdkPath = System.getProperty(property);
- return binPath;
+ if (jdkPath == null) {
+ throw new RuntimeException(
+ "System property '" + property + "' not set. This property is normally set by jtreg. "
+ + "When running test separately, set this property using '-D" + property + "=/path/to/jdk'.");
+ }
+
+ Path toolName = Paths.get("bin", tool + (Platform.isWindows() ? ".exe" : ""));
+
+ Path jdkTool = Paths.get(jdkPath, toolName.toString());
+ if (!jdkTool.toFile().exists()) {
+ throw new FileNotFoundException("Could not find file " + jdkTool.toAbsolutePath());
+ }
+
+ return jdkTool.toAbsolutePath().toString();
}
}
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java Thu Oct 03 19:18:54 2013 +0100
@@ -211,13 +211,13 @@
if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern
- + "' found in stdout \n");
+ + "' found in stdout: '" + matcher.group() + "' \n");
}
matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
if (matcher.find()) {
reportDiagnosticSummary();
throw new RuntimeException("'" + pattern
- + "' found in stderr \n");
+ + "' found in stderr: '" + matcher.group() + "' \n");
}
}
@@ -254,6 +254,37 @@
}
/**
+ * Get the captured group of the first string matching the pattern.
+ * stderr is searched before stdout.
+ *
+ * @param pattern The multi-line pattern to match
+ * @param group The group to capture
+ * @return The matched string or null if no match was found
+ */
+ public String firstMatch(String pattern, int group) {
+ Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr);
+ Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout);
+ if (stderrMatcher.find()) {
+ return stderrMatcher.group(group);
+ }
+ if (stdoutMatcher.find()) {
+ return stdoutMatcher.group(group);
+ }
+ return null;
+ }
+
+ /**
+ * Get the first string matching the pattern.
+ * stderr is searched before stdout.
+ *
+ * @param pattern The multi-line pattern to match
+ * @return The matched string or null if no match was found
+ */
+ public String firstMatch(String pattern) {
+ return firstMatch(pattern, 0);
+ }
+
+ /**
* Verify the exit value of the process
*
* @param expectedExitValue Expected exit value from process
--- a/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Thu Oct 03 19:18:54 2013 +0100
@@ -24,50 +24,80 @@
package com.oracle.java.testlibrary;
public class Platform {
- private static final String osName = System.getProperty("os.name");
- private static final String dataModel = System.getProperty("sun.arch.data.model");
- private static final String vmVersion = System.getProperty("java.vm.version");
- private static final String osArch = System.getProperty("os.arch");
+ private static final String osName = System.getProperty("os.name");
+ private static final String dataModel = System.getProperty("sun.arch.data.model");
+ private static final String vmVersion = System.getProperty("java.vm.version");
+ private static final String osArch = System.getProperty("os.arch");
- public static boolean is64bit() {
- return dataModel.equals("64");
- }
+ public static boolean is32bit() {
+ return dataModel.equals("32");
+ }
+
+ public static boolean is64bit() {
+ return dataModel.equals("64");
+ }
+
+ public static boolean isSolaris() {
+ return isOs("sunos");
+ }
- public static boolean isSolaris() {
- return osName.toLowerCase().startsWith("sunos");
- }
+ public static boolean isWindows() {
+ return isOs("win");
+ }
+
+ public static boolean isOSX() {
+ return isOs("mac");
+ }
- public static boolean isWindows() {
- return osName.toLowerCase().startsWith("win");
- }
+ public static boolean isLinux() {
+ return isOs("linux");
+ }
- public static boolean isOSX() {
- return osName.toLowerCase().startsWith("mac");
- }
+ private static boolean isOs(String osname) {
+ return osName.toLowerCase().startsWith(osname.toLowerCase());
+ }
+
+ public static String getOsName() {
+ return osName;
+ }
- public static boolean isLinux() {
- return osName.toLowerCase().startsWith("linux");
- }
+ public static boolean isDebugBuild() {
+ return vmVersion.toLowerCase().contains("debug");
+ }
+
+ public static String getVMVersion() {
+ return vmVersion;
+ }
- public static String getOsName() {
- return osName;
- }
+ // Returns true for sparc and sparcv9.
+ public static boolean isSparc() {
+ return isArch("sparc");
+ }
- public static boolean isDebugBuild() {
- return vmVersion.toLowerCase().contains("debug");
- }
+ public static boolean isARM() {
+ return isArch("arm");
+ }
- public static String getVMVersion() {
- return vmVersion;
- }
+ public static boolean isPPC() {
+ return isArch("ppc");
+ }
+
+ public static boolean isX86() {
+ // On Linux it's 'i386', Windows 'x86'
+ return (isArch("i386") || isArch("x86"));
+ }
- // Returns true for sparc and sparcv9.
- public static boolean isSparc() {
- return osArch.toLowerCase().startsWith("sparc");
- }
+ public static boolean isX64() {
+ // On OSX it's 'x86_64' and on other (Linux, Windows and Solaris) platforms it's 'amd64'
+ return (isArch("amd64") || isArch("x86_64"));
+ }
- public static String getOsArch() {
- return osArch;
- }
+ private static boolean isArch(String archname) {
+ return osArch.toLowerCase().startsWith(archname.toLowerCase());
+ }
+
+ public static String getOsArch() {
+ return osArch;
+ }
}
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathDirEntry.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathDirEntry.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,8 +36,7 @@
import java.nio.file.attribute.*;
/**
- * * Handler for dirs containing classes to compile.
- * @author igor.ignatyev@oracle.com
+ * Handler for dirs containing classes to compile.
*/
public class ClassPathDirEntry extends PathHandler {
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarEntry.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarEntry.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,6 @@
/**
* Handler for jar-files containing classes to compile.
- * @author igor.ignatyev@oracle.com
*/
public class ClassPathJarEntry extends PathHandler {
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarInDirEntry.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarInDirEntry.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,8 +31,6 @@
/**
* Handler for dirs containing jar-files with classes to compile.
- *
- * @author igor.ignatyev@oracle.com
*/
public class ClassPathJarInDirEntry extends PathHandler {
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassesListInFile.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassesListInFile.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,8 +32,6 @@
/**
* Handler for files containing a list of classes to compile.
- *
- * @author igor.ignatyev@oracle.com
*/
public class ClassesListInFile extends PathHandler {
public ClassesListInFile(Path root, Executor executor) {
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/CompileTheWorld.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/CompileTheWorld.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,9 +32,6 @@
import java.util.List;
import java.util.concurrent.*;
-/**
- * @author igor.ignatyev@oracle.com
- */
public class CompileTheWorld {
/**
* Entry point. Compiles classes in {@code args}, or all classes in
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Compiler.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Compiler.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,8 +36,6 @@
/**
* Provide method to compile whole class.
* Also contains compiled methods and classes counters.
- *
- * @author igor.ignatyev@oracle.com
*/
public class Compiler {
private Compiler() { }
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/PathHandler.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/PathHandler.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,10 +35,7 @@
/**
* Abstract handler for path.
- * <p/>
* Concrete subclasses should implement method {@link #process()}.
- *
- * @author igor.ignatyev@oracle.com
*/
public abstract class PathHandler {
private static final Pattern JAR_IN_DIR_PATTERN
--- a/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Utils.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Utils.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,8 +31,6 @@
/**
* Auxiliary methods.
- *
- * @author igor.ignatyev@oracle.com
*/
public class Utils {
/**
--- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Sat Sep 14 20:43:34 2013 +0100
+++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Thu Oct 03 19:18:54 2013 +0100
@@ -61,6 +61,8 @@
registerNatives();
}
+ // Get the maximum heap size supporting COOPs
+ public native long getCompressedOopsMaxHeapSize();
// Arguments
public native void printHeapSizes();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/AssertsTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import static com.oracle.java.testlibrary.Asserts.*;
+
+/* @test
+ * @summary Tests the different assertions in the Assert class
+ * @library /testlibrary
+ */
+public class AssertsTest {
+ private static class Foo implements Comparable<Foo> {
+ final int id;
+ public Foo(int id) {
+ this.id = id;
+ }
+
+ public int compareTo(Foo f) {
+ return new Integer(id).compareTo(new Integer(f.id));
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ testLessThan();
+ testLessThanOrEqual();
+ testEquals();
+ testGreaterThanOrEqual();
+ testGreaterThan();
+ testNotEquals();
+ testNull();
+ testNotNull();
+ testTrue();
+ testFalse();
+ }
+
+ private static void testLessThan() throws Exception {
+ expectPass(Assertion.LT, 1, 2);
+
+ expectFail(Assertion.LT, 2, 2);
+ expectFail(Assertion.LT, 2, 1);
+ expectFail(Assertion.LT, null, 2);
+ expectFail(Assertion.LT, 2, null);
+ }
+
+ private static void testLessThanOrEqual() throws Exception {
+ expectPass(Assertion.LTE, 1, 2);
+ expectPass(Assertion.LTE, 2, 2);
+
+ expectFail(Assertion.LTE, 3, 2);
+ expectFail(Assertion.LTE, null, 2);
+ expectFail(Assertion.LTE, 2, null);
+ }
+
+ private static void testEquals() throws Exception {
+ expectPass(Assertion.EQ, 1, 1);
+ expectPass(Assertion.EQ, null, null);
+
+ Foo f1 = new Foo(1);
+ expectPass(Assertion.EQ, f1, f1);
+
+ Foo f2 = new Foo(1);
+ expectFail(Assertion.EQ, f1, f2);
+ expectFail(Assertion.LTE, null, 2);
+ expectFail(Assertion.LTE, 2, null);
+ }
+
+ private static void testGreaterThanOrEqual() throws Exception {
+ expectPass(Assertion.GTE, 1, 1);
+ expectPass(Assertion.GTE, 2, 1);
+
+ expectFail(Assertion.GTE, 1, 2);
+ expectFail(Assertion.GTE, null, 2);
+ expectFail(Assertion.GTE, 2, null);
+ }
+
+ private static void testGreaterThan() throws Exception {
+ expectPass(Assertion.GT, 2, 1);
+
+ expectFail(Assertion.GT, 1, 1);
+ expectFail(Assertion.GT, 1, 2);
+ expectFail(Assertion.GT, null, 2);
+ expectFail(Assertion.GT, 2, null);
+ }
+
+ private static void testNotEquals() throws Exception {
+ expectPass(Assertion.NE, null, 1);
+ expectPass(Assertion.NE, 1, null);
+
+ Foo f1 = new Foo(1);
+ Foo f2 = new Foo(1);
+ expectPass(Assertion.NE, f1, f2);
+
+ expectFail(Assertion.NE, null, null);
+ expectFail(Assertion.NE, f1, f1);
+ expectFail(Assertion.NE, 1, 1);
+ }
+
+ private static void testNull() throws Exception {
+ expectPass(Assertion.NULL, null);
+
+ expectFail(Assertion.NULL, 1);
+ }
+
+ private static void testNotNull() throws Exception {
+ expectPass(Assertion.NOTNULL, 1);
+
+ expectFail(Assertion.NOTNULL, null);
+ }
+
+ private static void testTrue() throws Exception {
+ expectPass(Assertion.TRUE, true);
+
+ expectFail(Assertion.TRUE, false);
+ }
+
+ private static void testFalse() throws Exception {
+ expectPass(Assertion.FALSE, false);
+
+ expectFail(Assertion.FALSE, true);
+ }
+
+ private static <T extends Comparable<T>> void expectPass(Assertion assertion, T ... args)
+ throws Exception {
+ Assertion.run(assertion, args);
+ }
+
+ private static <T extends Comparable<T>> void expectFail(Assertion assertion, T ... args)
+ throws Exception {
+ try {
+ Assertion.run(assertion, args);
+ } catch (RuntimeException e) {
+ return;
+ }
+ throw new Exception("Expected " + Assertion.format(assertion, (Object[]) args) +
+ " to throw a RuntimeException");
+ }
+
+}
+
+enum Assertion {
+ LT, LTE, EQ, GTE, GT, NE, NULL, NOTNULL, FALSE, TRUE;
+
+ public static <T extends Comparable<T>> void run(Assertion assertion, T ... args) {
+ String msg = "Expected " + format(assertion, args) + " to pass";
+ switch (assertion) {
+ case LT:
+ assertLessThan(args[0], args[1], msg);
+ break;
+ case LTE:
+ assertLessThanOrEqual(args[0], args[1], msg);
+ break;
+ case EQ:
+ assertEquals(args[0], args[1], msg);
+ break;
+ case GTE:
+ assertGreaterThanOrEqual(args[0], args[1], msg);
+ break;
+ case GT:
+ assertGreaterThan(args[0], args[1], msg);
+ break;
+ case NE:
+ assertNotEquals(args[0], args[1], msg);
+ break;
+ case NULL:
+ assertNull(args == null ? args : args[0], msg);
+ break;
+ case NOTNULL:
+ assertNotNull(args == null ? args : args[0], msg);
+ break;
+ case FALSE:
+ assertFalse((Boolean) args[0], msg);
+ break;
+ case TRUE:
+ assertTrue((Boolean) args[0], msg);
+ break;
+ default:
+ // do nothing
+ }
+ }
+
+ public static String format(Assertion assertion, Object ... args) {
+ switch (assertion) {
+ case LT:
+ return asString("assertLessThan", args);
+ case LTE:
+ return asString("assertLessThanOrEqual", args);
+ case EQ:
+ return asString("assertEquals", args);
+ case GTE:
+ return asString("assertGreaterThanOrEquals", args);
+ case GT:
+ return asString("assertGreaterThan", args);
+ case NE:
+ return asString("assertNotEquals", args);
+ case NULL:
+ return asString("assertNull", args);
+ case NOTNULL:
+ return asString("assertNotNull", args);
+ case FALSE:
+ return asString("assertFalse", args);
+ case TRUE:
+ return asString("assertTrue", args);
+ default:
+ return "";
+ }
+ }
+
+ private static String asString(String assertion, Object ... args) {
+ if (args == null) {
+ return String.format("%s(null)", assertion);
+ }
+ if (args.length == 1) {
+ return String.format("%s(%s)", assertion, args[0]);
+ } else {
+ return String.format("%s(%s, %s)", assertion, args[0], args[1]);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/OutputAnalyzerReportingTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+ * @test
+ * @summary Test the OutputAnalyzer reporting functionality,
+ * such as printing additional diagnostic info
+ * (exit code, stdout, stderr, command line, etc.)
+ * @library /testlibrary
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+import com.oracle.java.testlibrary.ProcessTools;
+
+
+public class OutputAnalyzerReportingTest {
+
+ public static void main(String[] args) throws Exception {
+ // Create the output analyzer under test
+ String stdout = "aaaaaa";
+ String stderr = "bbbbbb";
+ OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
+
+ // Expected summary values should be the same for all cases,
+ // since the outputAnalyzer object is the same
+ String expectedExitValue = "-1";
+ String expectedSummary =
+ " stdout: [" + stdout + "];\n" +
+ " stderr: [" + stderr + "]\n" +
+ " exitValue = " + expectedExitValue + "\n";
+
+
+ DiagnosticSummaryTestRunner testRunner =
+ new DiagnosticSummaryTestRunner();
+
+ // should have exit value
+ testRunner.init(expectedSummary);
+ int unexpectedExitValue = 2;
+ try {
+ output.shouldHaveExitValue(unexpectedExitValue);
+ } catch (RuntimeException e) { }
+ testRunner.closeAndCheckResults();
+
+ // should not contain
+ testRunner.init(expectedSummary);
+ try {
+ output.shouldNotContain(stdout);
+ } catch (RuntimeException e) { }
+ testRunner.closeAndCheckResults();
+
+ // should contain
+ testRunner.init(expectedSummary);
+ try {
+ output.shouldContain("unexpected-stuff");
+ } catch (RuntimeException e) { }
+ testRunner.closeAndCheckResults();
+
+ // should not match
+ testRunner.init(expectedSummary);
+ try {
+ output.shouldNotMatch("[a]");
+ } catch (RuntimeException e) { }
+ testRunner.closeAndCheckResults();
+
+ // should match
+ testRunner.init(expectedSummary);
+ try {
+ output.shouldMatch("[qwerty]");
+ } catch (RuntimeException e) { }
+ testRunner.closeAndCheckResults();
+
+ }
+
+ private static class DiagnosticSummaryTestRunner {
+ private ByteArrayOutputStream byteStream =
+ new ByteArrayOutputStream(10000);
+
+ private String expectedSummary = "";
+ private PrintStream errStream;
+
+
+ public void init(String expectedSummary) {
+ this.expectedSummary = expectedSummary;
+ byteStream.reset();
+ errStream = new PrintStream(byteStream);
+ System.setErr(errStream);
+ }
+
+ public void closeAndCheckResults() {
+ // check results
+ errStream.close();
+ String stdErrStr = byteStream.toString();
+ if (!stdErrStr.contains(expectedSummary)) {
+ throw new RuntimeException("The output does not contain "
+ + "the diagnostic message, or the message is incorrect");
+ }
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/OutputAnalyzerTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Test the OutputAnalyzer utility class
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.OutputAnalyzer;
+
+public class OutputAnalyzerTest {
+
+ public static void main(String args[]) throws Exception {
+
+ String stdout = "aaaaaa";
+ String stderr = "bbbbbb";
+
+ // Regexps used for testing pattern matching of the test input
+ String stdoutPattern = "[a]";
+ String stderrPattern = "[b]";
+ String nonExistingPattern = "[c]";
+
+ OutputAnalyzer output = new OutputAnalyzer(stdout, stderr);
+
+ if (!stdout.equals(output.getStdout())) {
+ throw new Exception("getStdout() returned '" + output.getStdout() + "', expected '" + stdout + "'");
+ }
+
+ if (!stderr.equals(output.getStderr())) {
+ throw new Exception("getStderr() returned '" + output.getStderr() + "', expected '" + stderr + "'");
+ }
+
+ try {
+ output.shouldContain(stdout);
+ output.stdoutShouldContain(stdout);
+ output.shouldContain(stderr);
+ output.stderrShouldContain(stderr);
+ } catch (RuntimeException e) {
+ throw new Exception("shouldContain() failed", e);
+ }
+
+ try {
+ output.shouldContain("cccc");
+ throw new Exception("shouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldContain(stderr);
+ throw new Exception("stdoutShouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stderrShouldContain(stdout);
+ throw new Exception("stdoutShouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.shouldNotContain("cccc");
+ output.stdoutShouldNotContain("cccc");
+ output.stderrShouldNotContain("cccc");
+ } catch (RuntimeException e) {
+ throw new Exception("shouldNotContain() failed", e);
+ }
+
+ try {
+ output.shouldNotContain(stdout);
+ throw new Exception("shouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldNotContain(stdout);
+ throw new Exception("shouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stderrShouldNotContain(stderr);
+ throw new Exception("shouldContain() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ // Should match
+ try {
+ output.shouldMatch(stdoutPattern);
+ output.stdoutShouldMatch(stdoutPattern);
+ output.shouldMatch(stderrPattern);
+ output.stderrShouldMatch(stderrPattern);
+ } catch (RuntimeException e) {
+ throw new Exception("shouldMatch() failed", e);
+ }
+
+ try {
+ output.shouldMatch(nonExistingPattern);
+ throw new Exception("shouldMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldMatch(stderrPattern);
+ throw new Exception(
+ "stdoutShouldMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stderrShouldMatch(stdoutPattern);
+ throw new Exception(
+ "stderrShouldMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ // Should not match
+ try {
+ output.shouldNotMatch(nonExistingPattern);
+ output.stdoutShouldNotMatch(nonExistingPattern);
+ output.stderrShouldNotMatch(nonExistingPattern);
+ } catch (RuntimeException e) {
+ throw new Exception("shouldNotMatch() failed", e);
+ }
+
+ try {
+ output.shouldNotMatch(stdoutPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stdoutShouldNotMatch(stdoutPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ try {
+ output.stderrShouldNotMatch(stderrPattern);
+ throw new Exception("shouldNotMatch() failed to throw exception");
+ } catch (RuntimeException e) {
+ // expected
+ }
+
+ {
+ String aaaa = "aaaa";
+ String result = output.firstMatch(aaaa);
+ if (!aaaa.equals(result)) {
+ throw new Exception("firstMatch(String) faild to match. Expected: " + aaaa + " got: " + result);
+ }
+ }
+
+ {
+ String aa = "aa";
+ String aa_grouped_aa = aa + "(" + aa + ")";
+ String result = output.firstMatch(aa_grouped_aa, 1);
+ if (!aa.equals(result)) {
+ throw new Exception("firstMatch(String, int) failed to match. Expected: " + aa + " got: " + result);
+ }
+ }
+ }
+}
--- a/jaxp/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/jaxp/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
09a46ec11f880154886c70be03aff5ab2ddf0ab7 jdk8-b105
d3be8e3b429df917e72c1c23e7920c651219b587 jdk8-b106
d6a32e3831aab20a9a3bc78cdc0a60aaad725c6c jdk8-b107
+8ade3eed63da87067a7137c111f684a821e9e531 jdk8-b108
+02bfab2aa93899e0f02584f1e85537485a196553 jdk8-b109
+4c84c5b447b09aff27f3b72667ab3a5401e85968 jdk8-b110
--- a/jaxp/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jaxp/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -39,8 +39,8 @@
solaris_x64_5.10-{product|fastdebug}, \
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev
--- a/jaxws/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/jaxws/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
88390df7ed2cf128298a02c5e6d978f0a603cd58 jdk8-b105
6908370afe834ff01739e8ec992d4246c74b7e6e jdk8-b106
e3c9328f75638289a342ce15fbe532f05078946e jdk8-b107
+d1ea68556fd7925a3c7078dd9f77c6ca73d5aa9e jdk8-b108
+df5d4d01642572e77fd3c01e4c8703ed3f6eec87 jdk8-b109
+cc682329886be2fc26220fc30597ee4e5bba43ed jdk8-b110
--- a/jaxws/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jaxws/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -40,8 +40,8 @@
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
macosx_x64_10.7-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev
--- a/jdk/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
1fe211ae3d2b8cc2dfc4f58d9a6eb96418679672 jdk8-b105
c817276bd870dfe1dcc3a3dbbc092436b6907f75 jdk8-b106
eea685b9ccaa1980e0a7e07d6a3a84bcc7e9ab82 jdk8-b107
+006aaa5f069e7dd98fccdc696866c9f8582c087c jdk8-b108
+946f3fd5f8bf0ccd180c258d25e5837fa1bf004c jdk8-b109
+54e099776f08430d3a7f4feabd9f2ba886b55320 jdk8-b110
--- a/jdk/make/bridge/AccessBridgeJava/Makefile Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/make/bridge/AccessBridgeJava/Makefile Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -51,7 +51,7 @@
#
# Java files to compile.
#
-FILES_java = com/sun/java/accessibility/AccessBridge.java
+FILES_java = com/sun/java/accessibility/AccessBridgeLoader.java com/sun/java/accessibility/AccessBridge.java
#
# Location for the newly built classfiles.
@@ -61,14 +61,13 @@
#
# Rules
#
-CLASSDESTDIR = $(TEMPDIR)/classes
FILES_class = $(FILES_java:%.java=$(CLASSDESTDIR)/%.class)
build: prebuild
prebuild:
- $(CP) $(CLOSED_PLATFORM_SRC)/classes/com/sun/java/accessibility/$(ABPLATFORM)/AccessBridge.java \
+ $(CP) $(CLOSED_PLATFORM_SRC)/classes/com/sun/java/accessibility/$(ABPLATFORM)/AccessBridgeLoader.java \
$(CLOSED_PLATFORM_SRC)/classes/com/sun/java/accessibility
all : build $(JARFILE)
--- a/jdk/make/java/security/Makefile Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/make/java/security/Makefile Thu Oct 03 19:18:54 2013 +0100
@@ -70,9 +70,13 @@
CACERTS_SRC = $(CACERTS_FILE)
CACERTS_BUILD = $(LIBDIR)/security/cacerts
+BLACKLISTED_CERTS_SRC = $(TOPDIR)/src/share/lib/security/blacklisted.certs
+BLACKLISTED_CERTS_BUILD = $(LIBDIR)/security/blacklisted.certs
+
ifndef OPENJDK
BLACKLIST_SRC = $(CLOSED_SHARE_SRC)/lib/security/blacklist
BLACKLIST_BUILD = $(LIBDIR)/security/blacklist
+ BLACKLISTED_CERTS_SRC += $(wildcard $(CLOSED_SHARE_SRC)/lib/security/blacklisted.certs)
TRUSTEDLIBS_SRC = $(CLOSED_SHARE_SRC)/lib/security/trusted.libraries
TRUSTEDLIBS_BUILD = $(LIBDIR)/security/trusted.libraries
endif
@@ -85,9 +89,9 @@
include $(BUILDDIR)/common/Rules.gmk
ifdef OPENJDK
-build: properties policy cacerts
+build: properties policy cacerts blacklisted-certs
else
-build: properties policy cacerts blacklist trustedlibs
+build: properties policy cacerts blacklist blacklisted-certs trustedlibs
endif
install: all
@@ -100,6 +104,8 @@
blacklist: classes $(BLACKLIST_BUILD)
+blacklisted-certs: classes $(BLACKLISTED_CERTS_BUILD)
+
trustedlibs: classes $(TRUSTEDLIBS_BUILD)
$(PROPS_BUILD): $(PROPS_SRC)
@@ -114,12 +120,25 @@
$(BLACKLIST_BUILD): $(BLACKLIST_SRC)
$(install-file)
+$(BLACKLISTED_CERTS_BUILD): $(BLACKLISTED_CERTS_SRC)
+ $(MKDIR) -p $(@D)
+ $(CAT) $^ | $(SED) '/^$$/d' | $(SORT) | $(UNIQ) > $@.tmp
+ $(GREP) -i Algorithm $@.tmp > $@
+ if [ `$(SED) -n -e "$$=" $@` != 1 ]; then \
+ $(ECHO) "Different algorithms defined in $^"; \
+ $(RM) $@ $@.tmp; \
+ false; \
+ fi
+ $(GREP) -iv Algorithm $@.tmp >> $@
+ $(RM) $@.tmp
+
$(TRUSTEDLIBS_BUILD): $(TRUSTEDLIBS_SRC)
$(install-file)
clean clobber:: .delete.classlist
$(RM) -r $(CLASSBINDIR)/java/security
- $(RM) $(PROPS_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) $(TRUSTEDLIBS_BUILD)
+ $(RM) $(PROPS_BUILD) $(POLICY_BUILD) $(CACERTS_BUILD) $(BLACKLIST_BUILD) \
+ $(BLACKLISTED_CERTS_BUILD) $(TRUSTEDLIBS_BUILD)
# Additional Rule for building sun.security.util
$(CLASSBINDIR)/%.class: $(SHARE_SRC)/sun/%.java
--- a/jdk/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -40,8 +40,8 @@
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
macosx_x64_10.7-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}
@@ -55,8 +55,8 @@
linux_i586_2.6-product-{c1|c2}-TESTNAME, \
linux_x64_2.6-product-c2-TESTNAME, \
macosx_x64_10.7-product-c2-TESTNAME, \
- windows_i586_5.1-product-c1-TESTNAME, \
- windows_x64_5.2-product-c2-TESTNAME
+ windows_i586_6.1-product-c1-TESTNAME, \
+ windows_x64_6.1-product-c2-TESTNAME
# Default vm test targets (testset=default)
jprt.vm.default.test.targets= \
--- a/jdk/make/sun/lwawt/FILES_export_macosx.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/make/sun/lwawt/FILES_export_macosx.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -110,7 +110,6 @@
sun/lwawt/LWWindowPeer.java \
sun/lwawt/PlatformWindow.java \
sun/lwawt/SecurityWarningWindow.java \
- sun/lwawt/SelectionClearListener.java \
sun/lwawt/macosx/CPrinterDevice.java \
sun/lwawt/macosx/CPrinterDialog.java \
sun/lwawt/macosx/CPrinterDialogPeer.java \
@@ -141,7 +140,6 @@
sun/lwawt/macosx/CMenuBar.java \
sun/lwawt/macosx/CMenuComponent.java \
sun/lwawt/macosx/CMenuItem.java \
- sun/lwawt/macosx/CMouseInfoPeer.java \
sun/lwawt/macosx/CPlatformView.java \
sun/lwawt/macosx/CPlatformWindow.java \
sun/lwawt/macosx/CWarningWindow.java \
--- a/jdk/make/sun/xawt/mapfile-vers Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/make/sun/xawt/mapfile-vers Thu Oct 03 19:18:54 2013 +0100
@@ -305,6 +305,7 @@
Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap;
Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard;
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
+ Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping;
--- a/jdk/makefiles/CompileDemos.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CompileDemos.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -65,14 +65,10 @@
$(eval $(call SetupAppletDemo,DrawTest))
$(eval $(call SetupAppletDemo,Fractal))
$(eval $(call SetupAppletDemo,GraphicsTest))
-$(eval $(call SetupAppletDemo,MoleculeViewer))
$(eval $(call SetupAppletDemo,NervousText))
$(eval $(call SetupAppletDemo,SimpleGraph))
$(eval $(call SetupAppletDemo,SortDemo))
$(eval $(call SetupAppletDemo,SpreadSheet))
-# Build WireFrame without a server since it
-# has a class Matrix3D that also exists in MoleculeViewer.
-$(eval $(call SetupAppletDemo,WireFrame,true))
ifndef OPENJDK
$(eval $(call SetupAppletDemo,Animator,,closed/))
@@ -83,7 +79,7 @@
##################################################################################################
-PATTERNS_TO_COPY=.html .txt .properties .js .gif .jpg .theme .data .opt README .c .h .png .ttf
+PATTERNS_TO_COPY=.html .txt .properties .js .gif .jpg .theme .data .opt README .c .h .png .ttf .xyz .obj
define SetupDemo
# Param 1 = Name of the demo
@@ -161,6 +157,8 @@
BUILD_DEMOS+=$(JDK_OUTPUTDIR)/demo/jfc/CodePointIM/_the.services
+$(eval $(call SetupDemo,MoleculeViewer,applets,,XYZChemModel,,,example*.html XYZApp.java))
+$(eval $(call SetupDemo,WireFrame,applets,,ThreeD,,,example*.html ThreeD.java))
$(eval $(call SetupDemo,FileChooserDemo,jfc,,FileChooserDemo,,,README*))
$(eval $(call SetupDemo,Font2DTest,jfc,,Font2DTest,,,*.html *.txt))
$(eval $(call SetupDemo,Metalworks,jfc,,Metalworks,,,README*))
--- a/jdk/makefiles/CompileJavaClasses.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CompileJavaClasses.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -62,6 +62,7 @@
# AccessBridge is compiled separately below.
EXFILES += AccessBridge.java \
+ AccessBridgeLoader.java \
com/sun/java/accessibility/util/java/awt/ChoiceTranslator.java
# This seems to never be built
EXCLUDES += com/sun/java/accessibility/extensions
--- a/jdk/makefiles/CompileLaunchers.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CompileLaunchers.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
# questions.
#
-defalt: all
+default: all
include $(SPEC)
include MakeBase.gmk
--- a/jdk/makefiles/CompileNativeLibraries.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CompileNativeLibraries.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
# questions.
#
-defalt: all
+default: all
include $(SPEC)
include MakeBase.gmk
--- a/jdk/makefiles/CopyFiles.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CopyFiles.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -382,11 +382,16 @@
##########################################################################################
+BLACKLISTED_CERTS_SRC := $(JDK_TOPDIR)/src/share/lib/security/blacklisted.certs
+BLACKLISTED_CERTS_DST := $(JDK_OUTPUTDIR)/lib/security/blacklisted.certs
+
ifndef OPENJDK
BLACKLIST_SRC := $(JDK_TOPDIR)/src/closed/share/lib/security/blacklist
BLACKLIST_DST := $(JDK_OUTPUTDIR)/lib/security/blacklist
+BLACKLISTED_CERTS_SRC += $(wildcard $(JDK_TOPDIR)/src/closed/share/lib/security/blacklisted.certs)
+
TRUSTEDLIBS_SRC := $(JDK_TOPDIR)/src/closed/share/lib/security/trusted.libraries
TRUSTEDLIBS_DST := $(JDK_OUTPUTDIR)/lib/security/trusted.libraries
@@ -402,6 +407,20 @@
endif
+$(BLACKLISTED_CERTS_DST): $(BLACKLISTED_CERTS_SRC)
+ $(MKDIR) -p $(@D)
+ $(CAT) $^ | $(SED) '/^$$/d' | $(SORT) | $(UNIQ) > $@.tmp
+ $(GREP) -i Algorithm $@.tmp > $@
+ if [ `$(SED) -n -e "$$=" $@` != 1 ]; then \
+ $(ECHO) "Different algorithms defined in $^"; \
+ $(RM) $@ $@.tmp; \
+ false; \
+ fi
+ $(GREP) -iv Algorithm $@.tmp >> $@
+ $(RM) $@.tmp
+
+COPY_FILES += $(BLACKLISTED_CERTS_DST)
+
##########################################################################################
ifndef OPENJDK
--- a/jdk/makefiles/CreateJars.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/CreateJars.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -863,26 +863,13 @@
com/sun/java_cup \
com/sun/javadoc \
com/sun/java/swing \
- com/sun/jlex \
com/sun/jmx \
com/sun/naming \
com/sun/org/apache \
com/sun/security/auth \
com/sun/security/jgss \
com/sun/source \
- java/applet \
- java/awt \
- java/beans \
- java/io \
- java/lang \
- java/math \
- java/net \
- java/nio \
- java/rmi \
- java/security \
- java/sql \
- java/text \
- java/util \
+ java \
javax/accessibility \
javax/annotation \
javax/imageio \
@@ -902,7 +889,7 @@
org/omg \
org/w3c/dom \
org/xml/sax \
- sunw
+ #
SRC_ZIP_SRCS = $(JDK_TOPDIR)/src/share/classes $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/classes
SRC_ZIP_SRCS += $(JDK_OUTPUTDIR)/gensrc
@@ -953,13 +940,13 @@
ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
$(eval $(call SetupArchive,BUILD_ACCESSBRIDGE_32_JAR,,\
- SRCS:=$(JDK_OUTPUTDIR)/classes_ab/32bit $(JDK_OUTPUTDIR)/classes,\
+ SRCS:=$(JDK_OUTPUTDIR)/classes_ab/32bit,\
INCLUDES:=com/sun/java/accessibility,\
JAR:=$(IMAGES_OUTPUTDIR)/lib/ext/access-bridge-32.jar,\
SKIP_METAINF:=true))
$(eval $(call SetupArchive,BUILD_ACCESSBRIDGE_LEGACY_JAR,,\
- SRCS:=$(JDK_OUTPUTDIR)/classes_ab/legacy $(JDK_OUTPUTDIR)/classes,\
+ SRCS:=$(JDK_OUTPUTDIR)/classes_ab/legacy,\
INCLUDES:=com/sun/java/accessibility,\
JAR:=$(IMAGES_OUTPUTDIR)/lib/ext/access-bridge.jar,\
SKIP_METAINF:=true))
@@ -968,9 +955,8 @@
$(IMAGES_OUTPUTDIR)/lib/ext/access-bridge.jar
else
$(eval $(call SetupArchive,BUILD_ACCESSBRIDGE_64_JAR,,\
- SRCS:=$(JDK_OUTPUTDIR)/classes_ab/64bit $(JDK_OUTPUTDIR)/classes,\
+ SRCS:=$(JDK_OUTPUTDIR)/classes_ab/64bit,\
INCLUDES:=com/sun/java/accessibility,\
- EXCLUDES:=com/sun/java/accessibility/util/java,\
JAR:=$(IMAGES_OUTPUTDIR)/lib/ext/access-bridge-64.jar,\
SKIP_METAINF:=true))
--- a/jdk/makefiles/GensrcMisc.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/GensrcMisc.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -200,26 +200,42 @@
AB_SRC_DIR := $(JDK_TOPDIR)/src/closed/windows/classes/com/sun/java/accessibility
ifeq ($(OPENJDK_TARGET_CPU_BITS), 32)
+ $(AB_GENSRC_DIR)/32bit/com/sun/java/accessibility/AccessBridgeLoader.java: \
+ $(AB_SRC_DIR)/32bit/AccessBridgeLoader.java
+ $(install-file)
+
$(AB_GENSRC_DIR)/32bit/com/sun/java/accessibility/AccessBridge.java: \
- $(AB_SRC_DIR)/32bit/AccessBridge.java
+ $(AB_SRC_DIR)/AccessBridge.java
+ $(install-file)
+
+ $(AB_GENSRC_DIR)/legacy/com/sun/java/accessibility/AccessBridgeLoader.java: \
+ $(AB_SRC_DIR)/legacy/AccessBridgeLoader.java
$(install-file)
$(AB_GENSRC_DIR)/legacy/com/sun/java/accessibility/AccessBridge.java: \
- $(AB_SRC_DIR)/legacy/AccessBridge.java
+ $(AB_SRC_DIR)/AccessBridge.java
$(install-file)
- GENSRC_MISC += $(AB_GENSRC_DIR)/32bit/com/sun/java/accessibility/AccessBridge.java \
- $(AB_GENSRC_DIR)/legacy/com/sun/java/accessibility/AccessBridge.java
+ GENSRC_MISC += $(AB_GENSRC_DIR)/32bit/com/sun/java/accessibility/AccessBridgeLoader.java \
+ $(AB_GENSRC_DIR)/legacy/com/sun/java/accessibility/AccessBridgeLoader.java \
+ $(AB_GENSRC_DIR)/32bit/com/sun/java/accessibility/AccessBridge.java \
+ $(AB_GENSRC_DIR)/legacy/com/sun/java/accessibility/AccessBridge.java
else
- $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridge.java: \
- $(AB_SRC_DIR)/64bit/AccessBridge.java
+ $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridgeLoader.java: \
+ $(AB_SRC_DIR)/64bit/AccessBridgeLoader.java
$(install-file)
- GENSRC_MISC += $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridge.java
+ $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridge.java: \
+ $(AB_SRC_DIR)/AccessBridge.java
+ $(install-file)
+
+ GENSRC_MISC += $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridgeLoader.java \
+ $(AB_GENSRC_DIR)/64bit/com/sun/java/accessibility/AccessBridge.java
endif
+
endif
endif
-##########################################################################################
\ No newline at end of file
+##########################################################################################
--- a/jdk/makefiles/GensrcProperties.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/GensrcProperties.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -253,6 +253,13 @@
$(call CacheFind,$(JDK_TOPDIR)/src/windows/classes/sun/awt/windows)),\
ListResourceBundle,%zh_TW,%zh_HK))
endif
+# os x specific awt properties
+ifeq ($(OPENJDK_TARGET_OS),macosx)
+$(eval $(call add_properties_to_compile,SUN_AWT,\
+ $(filter $(JDK_TOPDIR)/src/macosx/classes/sun/awt/resources/%.properties,\
+ $(call CacheFind,$(JDK_TOPDIR)/src/macosx/classes/sun/awt/resources)),\
+ ListResourceBundle))
+endif
#sun/launcher/resources
$(eval $(call add_properties_to_compile,SUN_LAUNCHER,\
--- a/jdk/makefiles/Images.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/Images.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -190,6 +190,26 @@
$(foreach f,$(filter $(OVERLAY_FILTER),$(JDKJRE_BIN_LIST)),\
$(eval $(call AddFileToCopy,$(JDK_OUTPUTDIR),$(JDK_OVERLAY_IMAGE_DIR)/jre,$f,JDKJRE_BIN_TARGETS)))
+ifeq ($(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU_BITS),solaris-64)
+ define AddIsadirLink
+ # Param 1 - src file
+ # Param 2 - variable to add targets to
+
+ $1_LINK := $$(dir $1)$(OPENJDK_TARGET_CPU_ISADIR)/$$(notdir $1)
+
+ $$($1_LINK):
+ $(ECHO) $(LOG_INFO) Creating link $$(patsubst $(OUTPUT_ROOT)/%,%,$$@)
+ $(MKDIR) -p $$(@D)
+ $(LN) -s ../$$(@F) $$@
+
+ $2 += $$($1_LINK)
+ endef
+
+ $(foreach f,$(JRE_BIN_TARGETS),$(eval $(call AddIsadirLink,$f,JRE_BIN_ISADIR_LINK_TARGETS)))
+ $(foreach f,$(JDK_BIN_TARGETS),$(eval $(call AddIsadirLink,$f,JDK_BIN_ISADIR_LINK_TARGETS)))
+ $(foreach f,$(JDKJRE_BIN_TARGETS),$(eval $(call AddIsadirLink,$f,JDKJRE_BIN_ISADIR_LINK_TARGETS)))
+endif
+
################################################################################
# /lib dir
ifneq ($(OPENJDK_TARGET_OS), macosx)
@@ -730,7 +750,8 @@
jre-image: $(JRE_BIN_TARGETS) $(JRE_LIB_TARGETS) $(JRE_IMAGE_DIR)/lib/applet \
$(JRE_IMAGE_DIR)/lib/meta-index $(JRE_IMAGE_DIR)/lib/ext/meta-index \
- $(JRE_MAN_PAGE_LIST) $(JRE_DOC_TARGETS) $(JRE_INFO_FILE) $(JRE_STRIP_LIST)
+ $(JRE_MAN_PAGE_LIST) $(JRE_DOC_TARGETS) $(JRE_INFO_FILE) $(JRE_STRIP_LIST) \
+ $(JRE_BIN_ISADIR_LINK_TARGETS)
jdk-image: $(JDK_BIN_TARGETS) $(JDKJRE_BIN_TARGETS) \
$(JDK_LIB_TARGETS) $(JDKJRE_LIB_TARGETS) \
@@ -741,7 +762,8 @@
$(JDK_DB_TARGETS) $(JDK_INCLUDE_TARGETS) \
$(JDKJRE_DOC_TARGETS) $(JDK_DOC_TARGETS) \
$(JDK_INFO_FILE) $(JDKJRE_STRIP_LIST) $(JDK_BIN_STRIP_LIST) \
- $(JDK_IMAGE_DIR)/src.zip
+ $(JDK_IMAGE_DIR)/src.zip \
+ $(JDK_BIN_ISADIR_LINK_TARGETS) $(JDKJRE_BIN_ISADIR_LINK_TARGETS)
jre-overlay-image: $(JRE_OVERLAY_BIN_TARGETS) $(JRE_OVERLAY_LIB_TARGETS) \
$(JRE_OVERLAY_INFO_FILE) $(JRE_OVERLAY_STRIP_LIST)
--- a/jdk/makefiles/Tools.gmk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/Tools.gmk Thu Oct 03 19:18:54 2013 +0100
@@ -25,7 +25,6 @@
# Cache all finds needed for this file. Only used on windows.
$(eval $(call FillCacheFind,$(JDK_TOPDIR)/make/tools \
- $(JDK_TOPDIR)/src/solaris/classes \
$(JDK_TOPDIR)/makefiles/sun))
TOOLS_SRC:=$(JDK_TOPDIR)/make/tools/src \
--- a/jdk/makefiles/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -39,8 +39,8 @@
solaris_x64_5.10-{product|fastdebug}, \
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}
@@ -53,8 +53,8 @@
solaris_x64_5.10-product-c2-jvm98, \
linux_i586_2.6-product-{c1|c2}-jvm98, \
linux_x64_2.6-product-c2-jvm98, \
- windows_i586_5.1-product-c1-jvm98, \
- windows_x64_5.2-product-c2-jvm98
+ windows_i586_6.1-product-c1-jvm98, \
+ windows_x64_6.1-product-c2-jvm98
# Select vm testlist to use (allow for testset to be empty too)
jprt.vm.all.test.targets=${jprt.vm.default.test.targets}
@@ -70,8 +70,8 @@
solaris_x64_5.10-product-c2-jdk_beans1, \
linux_i586_2.6-product-{c1|c2}-jdk_beans1, \
linux_x64_2.6-product-c2-jdk_beans1, \
- windows_i586_5.1-product-c1-jdk_beans1, \
- windows_x64_5.2-product-c2-jdk_beans1, \
+ windows_i586_6.1-product-c1-jdk_beans1, \
+ windows_x64_6.1-product-c2-jdk_beans1, \
\
solaris_sparc_5.10-product-c1-jdk_io, \
solaris_sparcv9_5.10-product-c2-jdk_io, \
@@ -79,8 +79,8 @@
solaris_x64_5.10-product-c2-jdk_io, \
linux_i586_2.6-product-{c1|c2}-jdk_io, \
linux_x64_2.6-product-c2-jdk_io, \
- windows_i586_5.1-product-c1-jdk_io, \
- windows_x64_5.2-product-c2-jdk_io, \
+ windows_i586_6.1-product-c1-jdk_io, \
+ windows_x64_6.1-product-c2-jdk_io, \
\
solaris_sparc_5.10-product-c1-jdk_lang, \
solaris_sparcv9_5.10-product-c2-jdk_lang, \
@@ -88,8 +88,8 @@
solaris_x64_5.10-product-c2-jdk_lang, \
linux_i586_2.6-product-{c1|c2}-jdk_lang, \
linux_x64_2.6-product-c2-jdk_lang, \
- windows_i586_5.1-product-c1-jdk_lang, \
- windows_x64_5.2-product-c2-jdk_lang, \
+ windows_i586_6.1-product-c1-jdk_lang, \
+ windows_x64_6.1-product-c2-jdk_lang, \
\
solaris_sparc_5.10-product-c1-jdk_math, \
solaris_sparcv9_5.10-product-c2-jdk_math, \
@@ -97,8 +97,8 @@
solaris_x64_5.10-product-c2-jdk_math, \
linux_i586_2.6-product-{c1|c2}-jdk_math, \
linux_x64_2.6-product-c2-jdk_math, \
- windows_i586_5.1-product-c1-jdk_math, \
- windows_x64_5.2-product-c2-jdk_math, \
+ windows_i586_6.1-product-c1-jdk_math, \
+ windows_x64_6.1-product-c2-jdk_math, \
\
solaris_sparc_5.10-product-c1-jdk_misc, \
solaris_sparcv9_5.10-product-c2-jdk_misc, \
@@ -106,8 +106,8 @@
solaris_x64_5.10-product-c2-jdk_misc, \
linux_i586_2.6-product-{c1|c2}-jdk_misc, \
linux_x64_2.6-product-c2-jdk_misc, \
- windows_i586_5.1-product-c1-jdk_misc, \
- windows_x64_5.2-product-c2-jdk_misc, \
+ windows_i586_6.1-product-c1-jdk_misc, \
+ windows_x64_6.1-product-c2-jdk_misc, \
\
solaris_sparc_5.10-product-c1-jdk_net, \
solaris_sparcv9_5.10-product-c2-jdk_net, \
@@ -115,8 +115,8 @@
solaris_x64_5.10-product-c2-jdk_net, \
linux_i586_2.6-product-{c1|c2}-jdk_net, \
linux_x64_2.6-product-c2-jdk_net, \
- windows_i586_5.1-product-c1-jdk_net, \
- windows_x64_5.2-product-c2-jdk_net, \
+ windows_i586_6.1-product-c1-jdk_net, \
+ windows_x64_6.1-product-c2-jdk_net, \
\
solaris_sparc_5.10-product-c1-jdk_nio1, \
solaris_sparcv9_5.10-product-c2-jdk_nio1, \
@@ -124,8 +124,8 @@
solaris_x64_5.10-product-c2-jdk_nio1, \
linux_i586_2.6-product-{c1|c2}-jdk_nio1, \
linux_x64_2.6-product-c2-jdk_nio1, \
- windows_i586_5.1-product-c1-jdk_nio1, \
- windows_x64_5.2-product-c2-jdk_nio1, \
+ windows_i586_6.1-product-c1-jdk_nio1, \
+ windows_x64_6.1-product-c2-jdk_nio1, \
\
solaris_sparc_5.10-product-c1-jdk_nio2, \
solaris_sparcv9_5.10-product-c2-jdk_nio2, \
@@ -133,8 +133,8 @@
solaris_x64_5.10-product-c2-jdk_nio2, \
linux_i586_2.6-product-{c1|c2}-jdk_nio2, \
linux_x64_2.6-product-c2-jdk_nio2, \
- windows_i586_5.1-product-c1-jdk_nio2, \
- windows_x64_5.2-product-c2-jdk_nio2, \
+ windows_i586_6.1-product-c1-jdk_nio2, \
+ windows_x64_6.1-product-c2-jdk_nio2, \
\
solaris_sparc_5.10-product-c1-jdk_nio3, \
solaris_sparcv9_5.10-product-c2-jdk_nio3, \
@@ -142,8 +142,8 @@
solaris_x64_5.10-product-c2-jdk_nio3, \
linux_i586_2.6-product-{c1|c2}-jdk_nio3, \
linux_x64_2.6-product-c2-jdk_nio3, \
- windows_i586_5.1-product-c1-jdk_nio3, \
- windows_x64_5.2-product-c2-jdk_nio3, \
+ windows_i586_6.1-product-c1-jdk_nio3, \
+ windows_x64_6.1-product-c2-jdk_nio3, \
\
solaris_sparc_5.10-product-c1-jdk_security1, \
solaris_sparcv9_5.10-product-c2-jdk_security1, \
@@ -151,8 +151,8 @@
solaris_x64_5.10-product-c2-jdk_security1, \
linux_i586_2.6-product-{c1|c2}-jdk_security1, \
linux_x64_2.6-product-c2-jdk_security1, \
- windows_i586_5.1-product-c1-jdk_security1, \
- windows_x64_5.2-product-c2-jdk_security1, \
+ windows_i586_6.1-product-c1-jdk_security1, \
+ windows_x64_6.1-product-c2-jdk_security1, \
\
solaris_sparc_5.10-product-c1-jdk_text, \
solaris_sparcv9_5.10-product-c2-jdk_text, \
@@ -160,8 +160,8 @@
solaris_x64_5.10-product-c2-jdk_text, \
linux_i586_2.6-product-{c1|c2}-jdk_text, \
linux_x64_2.6-product-c2-jdk_text, \
- windows_i586_5.1-product-c1-jdk_text, \
- windows_x64_5.2-product-c2-jdk_text, \
+ windows_i586_6.1-product-c1-jdk_text, \
+ windows_x64_6.1-product-c2-jdk_text, \
\
solaris_sparc_5.10-product-c1-jdk_tools1, \
solaris_sparcv9_5.10-product-c2-jdk_tools1, \
@@ -169,8 +169,8 @@
solaris_x64_5.10-product-c2-jdk_tools1, \
linux_i586_2.6-product-{c1|c2}-jdk_tools1, \
linux_x64_2.6-product-c2-jdk_tools1, \
- windows_i586_5.1-product-c1-jdk_tools1, \
- windows_x64_5.2-product-c2-jdk_tools1, \
+ windows_i586_6.1-product-c1-jdk_tools1, \
+ windows_x64_6.1-product-c2-jdk_tools1, \
\
solaris_sparc_5.10-product-c1-jdk_util, \
solaris_sparcv9_5.10-product-c2-jdk_util, \
@@ -178,8 +178,8 @@
solaris_x64_5.10-product-c2-jdk_util, \
linux_i586_2.6-product-{c1|c2}-jdk_util, \
linux_x64_2.6-product-c2-jdk_util, \
- windows_i586_5.1-product-c1-jdk_util, \
- windows_x64_5.2-product-c2-jdk_util
+ windows_i586_6.1-product-c1-jdk_util, \
+ windows_x64_6.1-product-c2-jdk_util
# All jdk test targets in test/Makefile (still no fastdebug & limited c2)
jprt.make.rule.all.test.targets= \
@@ -192,8 +192,8 @@
solaris_x64_5.10-product-c2-jdk_awt, \
linux_i586_2.6-product-{c1|c2}-jdk_awt, \
linux_x64_2.6-product-c2-jdk_awt, \
- windows_i586_5.1-product-c1-jdk_awt, \
- windows_x64_5.2-product-c2-jdk_awt, \
+ windows_i586_6.1-product-c1-jdk_awt, \
+ windows_x64_6.1-product-c2-jdk_awt, \
\
solaris_sparc_5.10-product-c1-jdk_beans2, \
solaris_sparcv9_5.10-product-c2-jdk_beans2, \
@@ -201,8 +201,8 @@
solaris_x64_5.10-product-c2-jdk_beans2, \
linux_i586_2.6-product-{c1|c2}-jdk_beans2, \
linux_x64_2.6-product-c2-jdk_beans2, \
- windows_i586_5.1-product-c1-jdk_beans2, \
- windows_x64_5.2-product-c2-jdk_beans2, \
+ windows_i586_6.1-product-c1-jdk_beans2, \
+ windows_x64_6.1-product-c2-jdk_beans2, \
\
solaris_sparc_5.10-product-c1-jdk_beans3, \
solaris_sparcv9_5.10-product-c2-jdk_beans3, \
@@ -210,8 +210,8 @@
solaris_x64_5.10-product-c2-jdk_beans3, \
linux_i586_2.6-product-{c1|c2}-jdk_beans3, \
linux_x64_2.6-product-c2-jdk_beans3, \
- windows_i586_5.1-product-c1-jdk_beans3, \
- windows_x64_5.2-product-c2-jdk_beans3, \
+ windows_i586_6.1-product-c1-jdk_beans3, \
+ windows_x64_6.1-product-c2-jdk_beans3, \
\
solaris_sparc_5.10-product-c1-jdk_management1, \
solaris_sparcv9_5.10-product-c2-jdk_management1, \
@@ -219,8 +219,8 @@
solaris_x64_5.10-product-c2-jdk_management1, \
linux_i586_2.6-product-{c1|c2}-jdk_management1, \
linux_x64_2.6-product-c2-jdk_management1, \
- windows_i586_5.1-product-c1-jdk_management1, \
- windows_x64_5.2-product-c2-jdk_management1, \
+ windows_i586_6.1-product-c1-jdk_management1, \
+ windows_x64_6.1-product-c2-jdk_management1, \
\
solaris_sparc_5.10-product-c1-jdk_management2, \
solaris_sparcv9_5.10-product-c2-jdk_management2, \
@@ -228,8 +228,8 @@
solaris_x64_5.10-product-c2-jdk_management2, \
linux_i586_2.6-product-{c1|c2}-jdk_management2, \
linux_x64_2.6-product-c2-jdk_management2, \
- windows_i586_5.1-product-c1-jdk_management2, \
- windows_x64_5.2-product-c2-jdk_management2, \
+ windows_i586_6.1-product-c1-jdk_management2, \
+ windows_x64_6.1-product-c2-jdk_management2, \
\
solaris_sparc_5.10-product-c1-jdk_rmi, \
solaris_sparcv9_5.10-product-c2-jdk_rmi, \
@@ -237,8 +237,8 @@
solaris_x64_5.10-product-c2-jdk_rmi, \
linux_i586_2.6-product-{c1|c2}-jdk_rmi, \
linux_x64_2.6-product-c2-jdk_rmi, \
- windows_i586_5.1-product-c1-jdk_rmi, \
- windows_x64_5.2-product-c2-jdk_rmi, \
+ windows_i586_6.1-product-c1-jdk_rmi, \
+ windows_x64_6.1-product-c2-jdk_rmi, \
\
solaris_sparc_5.10-product-c1-jdk_security2, \
solaris_sparcv9_5.10-product-c2-jdk_security2, \
@@ -246,8 +246,8 @@
solaris_x64_5.10-product-c2-jdk_security2, \
linux_i586_2.6-product-{c1|c2}-jdk_security2, \
linux_x64_2.6-product-c2-jdk_security2, \
- windows_i586_5.1-product-c1-jdk_security2, \
- windows_x64_5.2-product-c2-jdk_security2, \
+ windows_i586_6.1-product-c1-jdk_security2, \
+ windows_x64_6.1-product-c2-jdk_security2, \
\
solaris_sparc_5.10-product-c1-jdk_security3, \
solaris_sparcv9_5.10-product-c2-jdk_security3, \
@@ -255,8 +255,8 @@
solaris_x64_5.10-product-c2-jdk_security3, \
linux_i586_2.6-product-{c1|c2}-jdk_security3, \
linux_x64_2.6-product-c2-jdk_security3, \
- windows_i586_5.1-product-c1-jdk_security3, \
- windows_x64_5.2-product-c2-jdk_security3, \
+ windows_i586_6.1-product-c1-jdk_security3, \
+ windows_x64_6.1-product-c2-jdk_security3, \
\
solaris_sparc_5.10-product-c1-jdk_sound, \
solaris_sparcv9_5.10-product-c2-jdk_sound, \
@@ -264,8 +264,8 @@
solaris_x64_5.10-product-c2-jdk_sound, \
linux_i586_2.6-product-{c1|c2}-jdk_sound, \
linux_x64_2.6-product-c2-jdk_sound, \
- windows_i586_5.1-product-c1-jdk_sound, \
- windows_x64_5.2-product-c2-jdk_sound, \
+ windows_i586_6.1-product-c1-jdk_sound, \
+ windows_x64_6.1-product-c2-jdk_sound, \
\
solaris_sparc_5.10-product-c1-jdk_swing, \
solaris_sparcv9_5.10-product-c2-jdk_swing, \
@@ -273,8 +273,8 @@
solaris_x64_5.10-product-c2-jdk_swing, \
linux_i586_2.6-product-{c1|c2}-jdk_swing, \
linux_x64_2.6-product-c2-jdk_swing, \
- windows_i586_5.1-product-c1-jdk_swing, \
- windows_x64_5.2-product-c2-jdk_swing, \
+ windows_i586_6.1-product-c1-jdk_swing, \
+ windows_x64_6.1-product-c2-jdk_swing, \
\
solaris_sparc_5.10-product-c1-jdk_tools2, \
solaris_sparcv9_5.10-product-c2-jdk_tools2, \
@@ -282,8 +282,8 @@
solaris_x64_5.10-product-c2-jdk_tools2, \
linux_i586_2.6-product-{c1|c2}-jdk_tools2, \
linux_x64_2.6-product-c2-jdk_tools2, \
- windows_i586_5.1-product-c1-jdk_tools2, \
- windows_x64_5.2-product-c2-jdk_tools2
+ windows_i586_6.1-product-c1-jdk_tools2, \
+ windows_x64_6.1-product-c2-jdk_tools2
# JCK test targets in test/Makefile (no fastdebug & limited c2, windows broken)
jprt.my.jck.test.target.set= \
--- a/jdk/makefiles/mapfiles/libawt_xawt/mapfile-vers Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/makefiles/mapfiles/libawt_xawt/mapfile-vers Thu Oct 03 19:18:54 2013 +0100
@@ -305,6 +305,7 @@
Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap;
Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard;
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
+ Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping;
--- a/jdk/src/macosx/classes/apple/applescript/AppleScriptEngineFactory.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/apple/applescript/AppleScriptEngineFactory.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,14 +30,9 @@
import javax.script.*;
public class AppleScriptEngineFactory implements ScriptEngineFactory {
- private static native void initNative();
+ private static volatile boolean initialized = false;
- static {
- java.awt.Toolkit.getDefaultToolkit();
- System.loadLibrary("AppleScriptEngine");
- initNative();
- TRACE("<static-init>");
- }
+ private static native void initNative();
static void TRACE(final String str) {
// System.out.println(AppleScriptEngineFactory.class.getName() + "." + str);
@@ -80,6 +75,7 @@
*
* @return full name of the ScriptEngine
*/
+ @Override
public String getEngineName() {
TRACE("getEngineName()");
return ENGINE_NAME;
@@ -90,6 +86,7 @@
*
* @return version of the ScriptEngine
*/
+ @Override
public String getEngineVersion() {
TRACE("getEngineVersion()");
return ENGINE_VERSION;
@@ -100,6 +97,7 @@
*
* @return name of the language supported by the ScriptEngine(Factory)
*/
+ @Override
public String getLanguageName() {
TRACE("getLanguageName()");
return LANGUAGE;
@@ -110,11 +108,12 @@
*
* @return language version supported by the ScriptEngine(Factory)
*/
+ @Override
public String getLanguageVersion() {
TRACE("getLanguageVersion()");
return AccessController.doPrivileged(new PrivilegedAction<String>() {
public String run() {
- final AppleScriptEngine engine = new AppleScriptEngine(AppleScriptEngineFactory.this);
+ final AppleScriptEngine engine = getScriptEngine();
return engine.getLanguageVersion();
}
});
@@ -126,6 +125,7 @@
*
* @return ArrayList of file extensions AppleScript associates with
*/
+ @Override
public List<String> getExtensions() {
TRACE("getExtensions()");
return Arrays.asList("scpt", "applescript", "app");
@@ -137,6 +137,7 @@
*
* @return ArrayList of mimetypes that AppleScript associates with
*/
+ @Override
public List<String> getMimeTypes() {
TRACE("getMimeTypes()");
return Arrays.asList("application/x-applescript", "text/plain", "text/applescript");
@@ -148,6 +149,7 @@
*
* @return
*/
+ @Override
public List<String> getNames() {
TRACE("getNames()");
return Arrays.asList("AppleScriptEngine", "AppleScript", "OSA");
@@ -165,6 +167,7 @@
* arguments to the function
* @return the AppleScript string calling the method
*/
+ @Override
public String getMethodCallSyntax(final String obj, final String fname, final String ... args) {
// StringBuilder builder = new StringBuilder();
// builder.append("my " + fname + "(");
@@ -181,6 +184,7 @@
* @param toDisplay
* @return
*/
+ @Override
public String getOutputStatement(final String toDisplay) {
// TODO -- this might even be good enough? XD
return getMethodCallSyntax(null, "print", toDisplay);
@@ -193,8 +197,9 @@
* the key to look up
* @return the static preseeded value for the key in the ScriptEngine, if it exists, otherwise <code>null</code>
*/
+ @Override
public Object getParameter(final String key) {
- final AppleScriptEngine engine = new AppleScriptEngine(this);
+ final AppleScriptEngine engine = getScriptEngine();
if (!engine.getBindings(ScriptContext.ENGINE_SCOPE).containsKey(key)) return null;
return engine.getBindings(ScriptContext.ENGINE_SCOPE).get(key);
}
@@ -205,6 +210,7 @@
* @param statements
* @return
*/
+ @Override
public String getProgram(final String ... statements) {
final StringBuilder program = new StringBuilder();
for (final String statement : statements) {
@@ -218,8 +224,21 @@
*
* @return new AppleScriptEngine with this factory as it's parent
*/
- public ScriptEngine getScriptEngine() {
+ @Override
+ public AppleScriptEngine getScriptEngine() {
AppleScriptEngine.checkSecurity();
+ ensureInitialized();
+
return new AppleScriptEngine(this);
}
+
+ private static synchronized void ensureInitialized() {
+ if (!initialized) {
+ initialized = true;
+
+ java.awt.Toolkit.getDefaultToolkit();
+ System.loadLibrary("AppleScriptEngine");
+ initNative();
+ }
+ }
}
--- a/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,6 +42,7 @@
import javax.swing.plaf.*;
import javax.swing.table.*;
+import sun.swing.AbstractFilterComboBoxModel;
import sun.swing.SwingUtilities2;
public class AquaFileChooserUI extends FileChooserUI {
@@ -1266,64 +1267,9 @@
/**
* Data model for a type-face selection combo-box.
*/
- protected class FilterComboBoxModel extends DefaultListModel implements ComboBoxModel, PropertyChangeListener {
- int selectedIndex = -1;
-
- protected FilterComboBoxModel() {
- super();
- final FileFilter filters[] = getFileChooser().getChoosableFileFilters();
- for (int i = 0; i < filters.length; i++) {
- this.add(i, filters[i]);
- }
- }
-
- public void propertyChange(final PropertyChangeEvent e) {
- final String prop = e.getPropertyName();
- if (prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
- this.clear();
- final FileFilter filters[] = (FileFilter[])e.getNewValue();
-
- for (int i = 0; i < filters.length; i++) {
- this.add(i, filters[i]);
- }
-
- fireContentsChanged(this, -1, -1);
- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
- final FileFilter currentFilter = (FileFilter)e.getNewValue();
- FileFilter filters[] = getFileChooser().getChoosableFileFilters();
-
- boolean found = false;
- if (currentFilter != null) {
- for (final FileFilter element : filters) {
- if (element == currentFilter) {
- found = true;
- }
- }
- if (found == false) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
-
- filters = getFileChooser().getChoosableFileFilters();
- setSelectedItem(e.getNewValue());
- }
- }
-
- public void setSelectedItem(final Object filter) {
- if (filter != null) {
- selectedIndex = this.indexOf(filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- final Object returnValue = null;
-
- if (this.size() > 0) {
- if ((selectedIndex != -1) && (selectedIndex < size())) { return this.get(selectedIndex); }
- }
-
- return returnValue;
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return AquaFileChooserUI.this.getFileChooser();
}
}
--- a/jdk/src/macosx/classes/com/apple/laf/resources/aqua_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/com/apple/laf/resources/aqua_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -46,7 +46,7 @@
FileChooser.openButton.textAndMnemonic=\uC5F4\uAE30
FileChooser.saveDialogTitle.textAndMnemonic=\uC800\uC7A5
FileChooser.openDialogTitle.textAndMnemonic=\uC5F4\uAE30
-FileChooser.updateButton.textAndMnemonic=\uAC31\uC2E0
+FileChooser.updateButton.textAndMnemonic=\uC5C5\uB370\uC774\uD2B8
FileChooser.helpButton.textAndMnemonic=\uB3C4\uC6C0\uB9D0
FileChooser.directoryOpenButton.textAndMnemonic=\uC5F4\uAE30
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/macosx/classes/sun/awt/resources/awtosx.properties Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,71 @@
+#
+# OS X specific AWT properties
+#
+
+# Modifier names
+AWT.shift=\u21e7
+AWT.control=\u2303
+AWT.alt=\u2325
+AWT.meta=\u2318
+AWT.altGraph=\u2325
+
+# Key names
+AWT.enter=\u23ce
+AWT.backSpace=\u232b
+AWT.tab=\u21e5
+AWT.cancel=\u238b
+AWT.clear=\u2327
+AWT.capsLock=\u21ea
+AWT.escape=\u238b
+AWT.space=\u2423
+AWT.pgup=\u21de
+AWT.pgdn=\u21df
+AWT.end=\u2198
+AWT.home=\u2196
+AWT.left=\u2190
+AWT.up=\u2191
+AWT.right=\u2192
+AWT.down=\u2193
+AWT.comma=,
+AWT.period=.
+AWT.slash=/
+AWT.semicolon=;
+AWT.equals=\u003d
+AWT.openBracket=[
+AWT.backSlash=\\
+AWT.closeBracket=]
+AWT.multiply=\u2328 *
+AWT.add=\u2328 +
+AWT.separator=\u2328 ,
+AWT.separater=\u2328 ,
+AWT.subtract=\u2328 -
+AWT.decimal=\u2328 .
+AWT.divide=\u2328 /
+AWT.delete=\u2326
+AWT.printScreen=\u2399
+AWT.backQuote=`
+AWT.quote='
+AWT.ampersand=&
+AWT.asterisk=*
+AWT.quoteDbl="
+AWT.Less=<
+AWT.greater=>
+AWT.braceLeft=[
+AWT.braceRight=]
+AWT.at=@
+AWT.colon=:
+AWT.circumflex=^
+AWT.dollar=$
+AWT.euro=\u20ac
+AWT.exclamationMark=!
+AWT.invertedExclamationMark=\u00a1
+AWT.leftParenthesis=(
+AWT.numberSign=#
+AWT.plus=+
+AWT.minus=-
+AWT.rightParenthesis=)
+AWT.underscore=_
+
+# Numeric Keypad
+AWT.numpad=\u2328
+
--- a/jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,10 @@
import javax.swing.JButton;
+/**
+ * Lightweight implementation of {@link ButtonPeer}. Delegates most of the work
+ * to the {@link JButton}.
+ */
final class LWButtonPeer extends LWComponentPeer<Button, JButton>
implements ButtonPeer, ActionListener {
@@ -42,7 +46,7 @@
}
@Override
- protected JButton createDelegate() {
+ JButton createDelegate() {
return new JButtonDelegate();
}
@@ -74,6 +78,7 @@
return true;
}
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
private final class JButtonDelegate extends JButton {
// Empty non private constructor was added because access to this
--- a/jdk/src/macosx/classes/sun/lwawt/LWCanvasPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCanvasPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,10 @@
import javax.swing.JComponent;
+/**
+ * Lightweight implementation of {@link CanvasPeer}. This peer is empty, because
+ * all the components in lwawt use graphic object from the top level window.
+ */
class LWCanvasPeer<T extends Component, D extends JComponent>
extends LWComponentPeer<T, D> implements CanvasPeer {
--- a/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,11 @@
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
+/**
+ * Lightweight implementation of {@link CheckboxPeer}. Delegates most of the
+ * work to the {@link JCheckBox} and {@link JRadioButton}, which are placed
+ * inside an empty {@link JComponent}.
+ */
final class LWCheckboxPeer
extends LWComponentPeer<Checkbox, LWCheckboxPeer.CheckboxDelegate>
implements CheckboxPeer, ItemListener {
@@ -51,12 +56,12 @@
}
@Override
- protected CheckboxDelegate createDelegate() {
+ CheckboxDelegate createDelegate() {
return new CheckboxDelegate();
}
@Override
- protected Component getDelegateFocusOwner() {
+ Component getDelegateFocusOwner() {
return getDelegate().getCurrentButton();
}
@@ -137,6 +142,7 @@
return true;
}
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
final class CheckboxDelegate extends JComponent {
private final JCheckBox cb;
--- a/jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,14 +26,18 @@
package sun.lwawt;
-import java.awt.Choice;
-import java.awt.Point;
+import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.peer.ChoicePeer;
-import javax.swing.JComboBox;
+import javax.accessibility.Accessible;
+import javax.swing.*;
+/**
+ * Lightweight implementation of {@link ChoicePeer}. Delegates most of the work
+ * to the {@link JComboBox}.
+ */
final class LWChoicePeer extends LWComponentPeer<Choice, JComboBox<String>>
implements ChoicePeer, ItemListener {
@@ -50,7 +54,7 @@
}
@Override
- protected JComboBox<String> createDelegate() {
+ JComboBox<String> createDelegate() {
return new JComboBoxDelegate();
}
@@ -128,6 +132,7 @@
return true;
}
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
private final class JComboBoxDelegate extends JComboBox<String> {
// Empty non private constructor was added because access to this
@@ -159,5 +164,32 @@
}
super.setSelectedItem(anObject);
}
+
+ @Override
+ public void firePopupMenuWillBecomeVisible() {
+ super.firePopupMenuWillBecomeVisible();
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ JPopupMenu popupMenu = getPopupMenu();
+ if (popupMenu != null) {
+ if (popupMenu.getInvoker() != LWChoicePeer.this.getTarget()) {
+ popupMenu.setVisible(false);
+ popupMenu.show(LWChoicePeer.this.getTarget(), 0, 0);
+ }
+ }
+ }
+ });
+ }
+
+ private JPopupMenu getPopupMenu() {
+ for (int i = 0; i < getAccessibleContext().getAccessibleChildrenCount(); i++) {
+ Accessible child = getAccessibleContext().getAccessibleChild(i);
+ if (child instanceof JPopupMenu) {
+ return (JPopupMenu) child;
+ }
+ }
+ return null;
+ }
}
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -72,19 +72,23 @@
{
private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.lwawt.focus.LWComponentPeer");
- // State lock is to be used for modifications to this
- // peer's fields (e.g. bounds, background, font, etc.)
- // It should be the last lock in the lock chain
- private final Object stateLock =
- new StringBuilder("LWComponentPeer.stateLock");
+ /**
+ * State lock is to be used for modifications to this peer's fields (e.g.
+ * bounds, background, font, etc.) It should be the last lock in the lock
+ * chain
+ */
+ private final Object stateLock = new Object();
- // The lock to operate with the peers hierarchy. AWT tree
- // lock is not used as there are many peers related ops
- // to be done on the toolkit thread, and we don't want to
- // depend on a public lock on this thread
- private static final Object peerTreeLock =
- new StringBuilder("LWComponentPeer.peerTreeLock");
+ /**
+ * The lock to operate with the peers hierarchy. AWT tree lock is not used
+ * as there are many peers related ops to be done on the toolkit thread, and
+ * we don't want to depend on a public lock on this thread
+ */
+ private static final Object peerTreeLock = new Object();
+ /**
+ * The associated AWT object.
+ */
private final T target;
/**
@@ -95,7 +99,7 @@
* the hierarchy. The exception is LWWindowPeers: their containers are
* always null
*/
- private final LWContainerPeer containerPeer;
+ private final LWContainerPeer<?, ?> containerPeer;
/**
* Handy reference to the top-level window peer. Window peer is borrowed
@@ -147,11 +151,18 @@
*/
private Image backBuffer;
+ /**
+ * All Swing delegates use delegateContainer as a parent. This container
+ * intentionally do not use parent of the peer.
+ */
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
private final class DelegateContainer extends Container {
{
enableEvents(0xFFFFFFFF);
}
+ // Empty non private constructor was added because access to this
+ // class shouldn't be emulated by a synthetic accessor method.
DelegateContainer() {
super();
}
@@ -182,7 +193,7 @@
}
}
- public LWComponentPeer(T target, PlatformComponent platformComponent) {
+ LWComponentPeer(final T target, final PlatformComponent platformComponent) {
targetPaintArea = new LWRepaintArea();
this.target = target;
this.platformComponent = platformComponent;
@@ -276,15 +287,18 @@
* This method is called under getDelegateLock().
* Overridden in subclasses.
*/
- protected D createDelegate() {
+ D createDelegate() {
return null;
}
- protected final D getDelegate() {
+ final D getDelegate() {
return delegate;
}
- protected Component getDelegateFocusOwner() {
+ /**
+ * This method should be called under getDelegateLock().
+ */
+ Component getDelegateFocusOwner() {
return getDelegate();
}
@@ -356,7 +370,7 @@
}
// Just a helper method
- protected final LWContainerPeer getContainerPeer() {
+ protected final LWContainerPeer<?, ?> getContainerPeer() {
return containerPeer;
}
@@ -390,7 +404,7 @@
protected void disposeImpl() {
destroyBuffers();
- LWContainerPeer cp = getContainerPeer();
+ LWContainerPeer<?, ?> cp = getContainerPeer();
if (cp != null) {
cp.removeChildPeer(this);
}
@@ -462,12 +476,13 @@
sg2d.constrain(size.x, size.y, size.width, size.height, getVisibleRegion());
}
- public Region getVisibleRegion() {
+ Region getVisibleRegion() {
return computeVisibleRect(this, getRegion());
}
- static final Region computeVisibleRect(LWComponentPeer c, Region region) {
- final LWContainerPeer p = c.getContainerPeer();
+ static final Region computeVisibleRect(final LWComponentPeer<?, ?> c,
+ Region region) {
+ final LWContainerPeer<?, ?> p = c.getContainerPeer();
if (p != null) {
final Rectangle r = c.getBounds();
region = region.getTranslatedRegion(r.x, r.y);
@@ -612,7 +627,7 @@
* @param p Point relative to the peer.
* @return Cursor of the peer or null if default cursor should be used.
*/
- protected Cursor getCursor(final Point p) {
+ Cursor getCursor(final Point p) {
return getTarget().getCursor();
}
@@ -717,7 +732,7 @@
@Override
public void setEnabled(final boolean e) {
boolean status = e;
- final LWComponentPeer cp = getContainerPeer();
+ final LWComponentPeer<?, ?> cp = getContainerPeer();
if (cp != null) {
status &= cp.isEnabled();
}
@@ -802,12 +817,12 @@
}
@Override
- public void setZOrder(ComponentPeer above) {
- LWContainerPeer cp = getContainerPeer();
+ public void setZOrder(final ComponentPeer above) {
+ LWContainerPeer<?, ?> cp = getContainerPeer();
// Don't check containerPeer for null as it can only happen
// for windows, but this method is overridden in
// LWWindowPeer and doesn't call super()
- cp.setChildPeerZOrder(this, (LWComponentPeer) above);
+ cp.setChildPeerZOrder(this, (LWComponentPeer<?, ?>) above);
}
@Override
@@ -923,7 +938,9 @@
LWKeyboardFocusManagerPeer.removeLastFocusRequest(getTarget());
return false;
}
- LWWindowPeer parentPeer = (LWWindowPeer) parentWindow.getPeer();
+ final LWWindowPeer parentPeer =
+ (LWWindowPeer) AWTAccessor.getComponentAccessor()
+ .getPeer(parentWindow);
if (parentPeer == null) {
focusLog.fine("request rejected, parentPeer is null");
LWKeyboardFocusManagerPeer.removeLastFocusRequest(getTarget());
@@ -1138,7 +1155,7 @@
}
protected final void repaintParent(final Rectangle oldB) {
- final LWContainerPeer cp = getContainerPeer();
+ final LWContainerPeer<?, ?> cp = getContainerPeer();
if (cp != null) {
// Repaint unobscured part of the parent
cp.repaintPeer(cp.getContentSize().intersection(oldB));
@@ -1254,6 +1271,8 @@
KeyEvent ke = (KeyEvent) e;
delegateEvent = new KeyEvent(getDelegateFocusOwner(), ke.getID(), ke.getWhen(),
ke.getModifiers(), ke.getKeyCode(), ke.getKeyChar(), ke.getKeyLocation());
+ AWTAccessor.getKeyEventAccessor().setExtendedKeyCode((KeyEvent) delegateEvent,
+ ke.getExtendedKeyCode());
} else if (e instanceof FocusEvent) {
FocusEvent fe = (FocusEvent) e;
delegateEvent = new FocusEvent(getDelegateFocusOwner(), fe.getID(), fe.isTemporary());
@@ -1273,7 +1292,7 @@
/**
* Handler for FocusEvents.
*/
- protected void handleJavaFocusEvent(FocusEvent e) {
+ void handleJavaFocusEvent(final FocusEvent e) {
// Note that the peer receives all the FocusEvents from
// its lightweight children as well
KeyboardFocusManagerPeer kfmPeer = LWKeyboardFocusManagerPeer.getInstance();
@@ -1309,7 +1328,7 @@
* Finds a top-most visible component for the given point. The location is
* specified relative to the peer's parent.
*/
- public LWComponentPeer findPeerAt(final int x, final int y) {
+ LWComponentPeer<?, ?> findPeerAt(final int x, final int y) {
final Rectangle r = getBounds();
final Region sh = getRegion();
final boolean found = isVisible() && sh.contains(x - r.x, y - r.y);
@@ -1326,7 +1345,7 @@
}
public Point windowToLocal(Point p, LWWindowPeer wp) {
- LWComponentPeer cp = this;
+ LWComponentPeer<?, ?> cp = this;
while (cp != wp) {
Rectangle cpb = cp.getBounds();
p.x -= cpb.x;
@@ -1347,7 +1366,7 @@
}
public Point localToWindow(Point p) {
- LWComponentPeer cp = getContainerPeer();
+ LWComponentPeer<?, ?> cp = getContainerPeer();
Rectangle r = getBounds();
while (cp != null) {
p.x += r.x;
@@ -1368,7 +1387,7 @@
repaintPeer(getSize());
}
- public void repaintPeer(final Rectangle r) {
+ void repaintPeer(final Rectangle r) {
final Rectangle toPaint = getSize().intersection(r);
if (!isShowing() || toPaint.isEmpty()) {
return;
@@ -1387,7 +1406,7 @@
protected final boolean isShowing() {
synchronized (getPeerTreeLock()) {
if (isVisible()) {
- final LWContainerPeer container = getContainerPeer();
+ final LWContainerPeer<?, ?> container = getContainerPeer();
return (container == null) || container.isShowing();
}
}
@@ -1395,8 +1414,7 @@
}
/**
- * Paints the peer. Overridden in subclasses to delegate the actual painting
- * to Swing components.
+ * Paints the peer. Delegate the actual painting to Swing components.
*/
protected final void paintPeer(final Graphics g) {
final D delegate = getDelegate();
--- a/jdk/src/macosx/classes/sun/lwawt/LWContainerPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWContainerPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,32 +41,25 @@
import javax.swing.JComponent;
abstract class LWContainerPeer<T extends Container, D extends JComponent>
- extends LWCanvasPeer<T, D>
- implements ContainerPeer
-{
- // List of child peers sorted by z-order from bottom-most
- // to top-most
- private List<LWComponentPeer> childPeers =
- new LinkedList<LWComponentPeer>();
+ extends LWCanvasPeer<T, D> implements ContainerPeer {
- LWContainerPeer(T target, PlatformComponent platformComponent) {
+ /**
+ * List of child peers sorted by z-order from bottom-most to top-most.
+ */
+ private final List<LWComponentPeer<?, ?>> childPeers = new LinkedList<>();
+
+ LWContainerPeer(final T target, final PlatformComponent platformComponent) {
super(target, platformComponent);
}
- void addChildPeer(LWComponentPeer child) {
+ final void addChildPeer(final LWComponentPeer<?, ?> child) {
synchronized (getPeerTreeLock()) {
- addChildPeer(child, childPeers.size());
+ childPeers.add(childPeers.size(), child);
+ // TODO: repaint
}
}
- void addChildPeer(LWComponentPeer child, int index) {
- synchronized (getPeerTreeLock()) {
- childPeers.add(index, child);
- }
- // TODO: repaint
- }
-
- void removeChildPeer(LWComponentPeer child) {
+ final void removeChildPeer(final LWComponentPeer<?, ?> child) {
synchronized (getPeerTreeLock()) {
childPeers.remove(child);
}
@@ -74,7 +67,8 @@
}
// Used by LWComponentPeer.setZOrder()
- void setChildPeerZOrder(LWComponentPeer peer, LWComponentPeer above) {
+ final void setChildPeerZOrder(final LWComponentPeer<?, ?> peer,
+ final LWComponentPeer<?, ?> above) {
synchronized (getPeerTreeLock()) {
childPeers.remove(peer);
int index = (above != null) ? childPeers.indexOf(above) : childPeers.size();
@@ -98,25 +92,27 @@
}
@Override
- public void beginValidate() {
- // TODO: it seems that begin/endValidate() is only useful
- // for heavyweight windows, when a batch movement for
- // child windows occurs. That's why no-op
- }
- @Override
- public void endValidate() {
+ public final void beginValidate() {
// TODO: it seems that begin/endValidate() is only useful
// for heavyweight windows, when a batch movement for
// child windows occurs. That's why no-op
}
@Override
- public void beginLayout() {
+ public final void endValidate() {
+ // TODO: it seems that begin/endValidate() is only useful
+ // for heavyweight windows, when a batch movement for
+ // child windows occurs. That's why no-op
+ }
+
+ @Override
+ public final void beginLayout() {
// Skip all painting till endLayout()
setLayouting(true);
}
+
@Override
- public void endLayout() {
+ public final void endLayout() {
setLayouting(false);
// Post an empty event to flush all the pending target paints
@@ -125,18 +121,19 @@
// ---- PEER NOTIFICATIONS ---- //
- /*
+ /**
* Returns a copy of the childPeer collection.
*/
- protected List<LWComponentPeer> getChildren() {
+ @SuppressWarnings("unchecked")
+ final List<LWComponentPeer<?, ?>> getChildren() {
synchronized (getPeerTreeLock()) {
- Object copy = ((LinkedList)childPeers).clone();
- return (List<LWComponentPeer>)copy;
+ Object copy = ((LinkedList<?>) childPeers).clone();
+ return (List<LWComponentPeer<?, ?>>) copy;
}
}
@Override
- public final Region getVisibleRegion() {
+ final Region getVisibleRegion() {
return cutChildren(super.getVisibleRegion(), null);
}
@@ -144,9 +141,9 @@
* Removes bounds of children above specific child from the region. If above
* is null removes all bounds of children.
*/
- protected final Region cutChildren(Region r, final LWComponentPeer above) {
+ final Region cutChildren(Region r, final LWComponentPeer<?, ?> above) {
boolean aboveFound = above == null;
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
if (!aboveFound && child == above) {
aboveFound = true;
continue;
@@ -170,8 +167,8 @@
* specified relative to the peer's parent.
*/
@Override
- public final LWComponentPeer findPeerAt(int x, int y) {
- LWComponentPeer peer = super.findPeerAt(x, y);
+ final LWComponentPeer<?, ?> findPeerAt(int x, int y) {
+ LWComponentPeer<?, ?> peer = super.findPeerAt(x, y);
final Rectangle r = getBounds();
// Translate to this container's coordinates to pass to children
x -= r.x;
@@ -179,7 +176,7 @@
if (peer != null && getContentSize().contains(x, y)) {
synchronized (getPeerTreeLock()) {
for (int i = childPeers.size() - 1; i >= 0; --i) {
- LWComponentPeer p = childPeers.get(i).findPeerAt(x, y);
+ LWComponentPeer<?, ?> p = childPeers.get(i).findPeerAt(x, y);
if (p != null) {
peer = p;
break;
@@ -195,7 +192,7 @@
* peers should be repainted
*/
@Override
- public final void repaintPeer(final Rectangle r) {
+ final void repaintPeer(final Rectangle r) {
final Rectangle toPaint = getSize().intersection(r);
if (!isShowing() || toPaint.isEmpty()) {
return;
@@ -208,13 +205,13 @@
repaintChildren(toPaint);
}
- /*
- * Paints all the child peers in the straight z-order, so the
- * bottom-most ones are painted first.
- */
+ /**
+ * Paints all the child peers in the straight z-order, so the
+ * bottom-most ones are painted first.
+ */
private void repaintChildren(final Rectangle r) {
final Rectangle content = getContentSize();
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
final Rectangle childBounds = child.getBounds();
Rectangle toPaint = r.intersection(childBounds);
toPaint = toPaint.intersection(content);
@@ -223,21 +220,21 @@
}
}
- protected Rectangle getContentSize() {
+ Rectangle getContentSize() {
return getSize();
}
@Override
public void setEnabled(final boolean e) {
super.setEnabled(e);
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
child.setEnabled(e && child.getTarget().isEnabled());
}
}
@Override
public void setBackground(final Color c) {
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
if (!child.getTarget().isBackgroundSet()) {
child.setBackground(c);
}
@@ -247,7 +244,7 @@
@Override
public void setForeground(final Color c) {
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
if (!child.getTarget().isForegroundSet()) {
child.setForeground(c);
}
@@ -257,7 +254,7 @@
@Override
public void setFont(final Font f) {
- for (final LWComponentPeer child : getChildren()) {
+ for (final LWComponentPeer<?, ?> child : getChildren()) {
if (!child.getTarget().isFontSet()) {
child.setFont(f);
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWCursorManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCursorManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,6 +32,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
+import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
public abstract class LWCursorManager {
@@ -105,11 +106,13 @@
c = peer.getTarget();
if (c instanceof Container) {
final Point p = peer.getLocationOnScreen();
- c = ((Container) c).findComponentAt(cursorPos.x - p.x,
- cursorPos.y - p.y);
+ c = AWTAccessor.getContainerAccessor().findComponentAt(
+ (Container) c, cursorPos.x - p.x, cursorPos.y - p.y, false);
+
}
while (c != null) {
- if (c.isVisible() && c.isEnabled() && (c.getPeer() != null)) {
+ final Object p = AWTAccessor.getComponentAccessor().getPeer(c);
+ if (c.isVisible() && c.isEnabled() && p != null) {
break;
}
c = c.getParent();
--- a/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
}
@Override
- protected JLabel createDelegate() {
+ JLabel createDelegate() {
return new JLabel();
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,6 +34,8 @@
import sun.awt.CausedFocusEvent;
import sun.awt.LightweightFrame;
+import sun.swing.JLightweightFrame;
+import sun.swing.SwingAccessor;
public class LWLightweightFramePeer extends LWWindowPeer {
@@ -91,11 +93,6 @@
}
@Override
- public void updateCursorImmediately() {
- // TODO: tries to switch to the awt/fx toolkit thread and causes a deadlock on macosx
- }
-
- @Override
public void addDropTarget(DropTarget dt) {
}
@@ -112,4 +109,9 @@
public void ungrab() {
getLwTarget().ungrabFocus();
}
+
+ @Override
+ public void updateCursorImmediately() {
+ SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget());
+ }
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,8 @@
import java.util.Arrays;
/**
- * Lightweight implementation of {@link ListPeer}.
+ * Lightweight implementation of {@link ListPeer}. Delegates most of the work to
+ * the {@link JList}, which is placed inside {@link JScrollPane}.
*/
final class LWListPeer extends LWComponentPeer<List, LWListPeer.ScrollableJList>
implements ListPeer {
@@ -56,7 +57,7 @@
}
@Override
- protected ScrollableJList createDelegate() {
+ ScrollableJList createDelegate() {
return new ScrollableJList();
}
@@ -78,7 +79,7 @@
}
@Override
- protected Component getDelegateFocusOwner() {
+ Component getDelegateFocusOwner() {
return getDelegate().getView();
}
@@ -193,6 +194,7 @@
}
}
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
final class ScrollableJList extends JScrollPane implements ListSelectionListener {
private boolean skipStateChangedEvent;
@@ -234,9 +236,10 @@
}
@Override
+ @SuppressWarnings("unchecked")
public void valueChanged(final ListSelectionEvent e) {
if (!e.getValueIsAdjusting() && !isSkipStateChangedEvent()) {
- final JList source = (JList) e.getSource();
+ final JList<?> source = (JList<?>) e.getSource();
for(int i = 0 ; i < source.getModel().getSize(); i++) {
final boolean wasSelected = Arrays.binarySearch(oldSelectedIndices, i) >= 0;
@@ -255,6 +258,7 @@
}
}
+ @SuppressWarnings("unchecked")
public JList<String> getView() {
return (JList<String>) getViewport().getView();
}
@@ -289,7 +293,7 @@
private final class JListDelegate extends JList<String> {
JListDelegate() {
- super(ScrollableJList.this.model);
+ super(model);
}
@Override
--- a/jdk/src/macosx/classes/sun/lwawt/LWMouseInfoPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWMouseInfoPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,10 +30,9 @@
import java.awt.peer.MouseInfoPeer;
-public class LWMouseInfoPeer implements MouseInfoPeer {
+import sun.awt.AWTAccessor;
- public LWMouseInfoPeer() {
- }
+public class LWMouseInfoPeer implements MouseInfoPeer {
@Override
public int fillPointWithCoords(Point point) {
@@ -52,7 +51,7 @@
return false;
}
- LWWindowPeer windowPeer = (LWWindowPeer)w.getPeer();
+ final Object windowPeer = AWTAccessor.getComponentAccessor().getPeer(w);
return LWWindowPeer.getWindowUnderCursor() == windowPeer;
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWPanelPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWPanelPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,10 @@
import javax.swing.JPanel;
+/**
+ * Lightweight implementation of {@link PanelPeer}. Delegates most of the work
+ * to the {@link JPanel}.
+ */
final class LWPanelPeer extends LWContainerPeer<Panel, JPanel>
implements PanelPeer {
@@ -39,7 +43,7 @@
}
@Override
- public JPanel createDelegate() {
+ JPanel createDelegate() {
return new JPanel();
}
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWRepaintArea.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWRepaintArea.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,39 +26,38 @@
package sun.lwawt;
-import sun.awt.RepaintArea;
-
import java.awt.Component;
import java.awt.Graphics;
+import sun.awt.AWTAccessor;
+import sun.awt.RepaintArea;
+
/**
+ * Emulates appearance of heavyweight components before call of the user code.
+ *
* @author Sergey Bylokhov
*/
final class LWRepaintArea extends RepaintArea {
@Override
protected void updateComponent(final Component comp, final Graphics g) {
+ // We shouldn't paint native component as a result of UPDATE events,
+ // just flush onscreen back-buffer.
if (comp != null) {
super.updateComponent(comp, g);
- flushBuffers((LWComponentPeer) comp.getPeer());
+ LWComponentPeer.flushOnscreenGraphics();
}
}
@Override
protected void paintComponent(final Component comp, final Graphics g) {
if (comp != null) {
- final LWComponentPeer peer = (LWComponentPeer) comp.getPeer();
+ Object peer = AWTAccessor.getComponentAccessor().getPeer(comp);
if (peer != null) {
- peer.paintPeer(g);
+ ((LWComponentPeer<?, ?>) peer).paintPeer(g);
}
super.paintComponent(comp, g);
- flushBuffers(peer);
- }
- }
-
- private static void flushBuffers(final LWComponentPeer peer) {
- if (peer != null) {
- peer.flushOnscreenGraphics();
+ LWComponentPeer.flushOnscreenGraphics();
}
}
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,10 +34,14 @@
import javax.swing.JScrollBar;
+/**
+ * Lightweight implementation of {@link ScrollbarPeer}. Delegates most of the
+ * work to the {@link JScrollBar}.
+ */
final class LWScrollBarPeer extends LWComponentPeer<Scrollbar, JScrollBar>
implements ScrollbarPeer, AdjustmentListener {
- //JScrollBar fires two changes with firePropertyChange (one for old value
+ // JScrollBar fires two changes with firePropertyChange (one for old value
// and one for new one.
// We save the last value and don't fire event if not changed.
private int currentValue;
@@ -48,7 +52,7 @@
}
@Override
- protected JScrollBar createDelegate() {
+ JScrollBar createDelegate() {
return new JScrollBar();
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,10 @@
import java.awt.peer.ScrollPanePeer;
import java.util.List;
+/**
+ * Lightweight implementation of {@link ScrollPanePeer}. Delegates most of the
+ * work to the {@link JScrollPane}.
+ */
final class LWScrollPanePeer extends LWContainerPeer<ScrollPane, JScrollPane>
implements ScrollPanePeer, ChangeListener {
@@ -41,7 +45,8 @@
super(target, platformComponent);
}
- protected JScrollPane createDelegate() {
+ @Override
+ JScrollPane createDelegate() {
final JScrollPane sp = new JScrollPane();
final JPanel panel = new JPanel();
panel.setOpaque(false);
@@ -72,7 +77,7 @@
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
- final LWComponentPeer viewPeer = getViewPeer();
+ final LWComponentPeer<?, ?> viewPeer = getViewPeer();
if (viewPeer != null) {
final Rectangle r;
synchronized (getDelegateLock()) {
@@ -96,14 +101,13 @@
}
}
- LWComponentPeer getViewPeer() {
- List<LWComponentPeer> peerList = getChildren();
+ LWComponentPeer<?, ?> getViewPeer() {
+ final List<LWComponentPeer<?, ?>> peerList = getChildren();
return peerList.isEmpty() ? null : peerList.get(0);
}
-
@Override
- protected Rectangle getContentSize() {
+ Rectangle getContentSize() {
Rectangle viewRect = getDelegate().getViewport().getViewRect();
return new Rectangle(viewRect.width, viewRect.height);
}
@@ -112,7 +116,7 @@
public void layout() {
super.layout();
synchronized (getDelegateLock()) {
- LWComponentPeer viewPeer = getViewPeer();
+ final LWComponentPeer<?, ?> viewPeer = getViewPeer();
if (viewPeer != null) {
Component view = getDelegate().getViewport().getView();
view.setBounds(viewPeer.getBounds());
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
/**
* Lightweight implementation of {@link TextAreaPeer}. Delegates most of the
- * work to the {@link JTextArea} inside JScrollPane.
+ * work to the {@link JTextArea} inside {@link JScrollPane}.
*/
final class LWTextAreaPeer
extends LWTextComponentPeer<TextArea, LWTextAreaPeer.ScrollableJTextArea>
@@ -66,7 +66,7 @@
}
@Override
- protected ScrollableJTextArea createDelegate() {
+ ScrollableJTextArea createDelegate() {
return new ScrollableJTextArea();
}
@@ -85,7 +85,7 @@
}
@Override
- protected Cursor getCursor(final Point p) {
+ Cursor getCursor(final Point p) {
final boolean isContains;
synchronized (getDelegateLock()) {
isContains = getDelegate().getViewport().getBounds().contains(p);
@@ -94,7 +94,7 @@
}
@Override
- protected Component getDelegateFocusOwner() {
+ Component getDelegateFocusOwner() {
return getTextComponent();
}
@@ -200,7 +200,7 @@
}
}
- @SuppressWarnings("serial")
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
final class ScrollableJTextArea extends JScrollPane {
ScrollableJTextArea() {
@@ -218,7 +218,6 @@
super.setEnabled(enabled);
}
- @SuppressWarnings("serial")
private final class JTextAreaDelegate extends JTextArea {
// Empty non private constructor was added because access to this
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,11 +44,14 @@
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
+/**
+ * Lightweight implementation of {@link TextComponentPeer}. Provides useful
+ * methods for {@link LWTextAreaPeer} and {@link LWTextFieldPeer}
+ */
abstract class LWTextComponentPeer<T extends TextComponent, D extends JComponent>
extends LWComponentPeer<T, D>
implements DocumentListener, TextComponentPeer, InputMethodListener {
-
private volatile boolean firstChangeSkipped;
LWTextComponentPeer(final T target,
@@ -218,14 +221,14 @@
}
@Override
- public void inputMethodTextChanged(InputMethodEvent event) {
+ public void inputMethodTextChanged(final InputMethodEvent event) {
synchronized (getDelegateLock()) {
AWTAccessor.getComponentAccessor().processEvent(getTextComponent(), event);
}
}
@Override
- public void caretPositionChanged(InputMethodEvent event) {
+ public void caretPositionChanged(final InputMethodEvent event) {
synchronized (getDelegateLock()) {
AWTAccessor.getComponentAccessor().processEvent(getTextComponent(), event);
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,6 +37,10 @@
import javax.swing.*;
import javax.swing.text.JTextComponent;
+/**
+ * Lightweight implementation of {@link TextFieldPeer}. Delegates most of the
+ * work to the {@link JPasswordField}.
+ */
final class LWTextFieldPeer
extends LWTextComponentPeer<TextField, JPasswordField>
implements TextFieldPeer, ActionListener {
@@ -47,7 +51,7 @@
}
@Override
- protected JPasswordField createDelegate() {
+ JPasswordField createDelegate() {
return new JPasswordFieldDelegate();
}
@@ -107,7 +111,7 @@
* @param e the focus event
*/
@Override
- protected void handleJavaFocusEvent(final FocusEvent e) {
+ void handleJavaFocusEvent(final FocusEvent e) {
if (e.getID() == FocusEvent.FOCUS_LOST) {
// In order to de-select the selection
setCaretPosition(0);
@@ -115,6 +119,7 @@
super.handleJavaFocusEvent(e);
}
+ @SuppressWarnings("serial")// Safe: outer class is non-serializable.
private final class JPasswordFieldDelegate extends JPasswordField {
// Empty non private constructor was added because access to this
--- a/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Thu Oct 03 19:18:54 2013 +0100
@@ -557,16 +557,18 @@
}
@Override
- public void grab(Window w) {
- if (w.getPeer() != null) {
- ((LWWindowPeer)w.getPeer()).grab();
+ public void grab(final Window w) {
+ final Object peer = AWTAccessor.getComponentAccessor().getPeer(w);
+ if (peer != null) {
+ ((LWWindowPeer) peer).grab();
}
}
@Override
- public void ungrab(Window w) {
- if (w.getPeer() != null) {
- ((LWWindowPeer)w.getPeer()).ungrab(false);
+ public void ungrab(final Window w) {
+ final Object peer = AWTAccessor.getComponentAccessor().getPeer(w);
+ if (peer != null) {
+ ((LWWindowPeer) peer).ungrab(false);
}
}
--- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -43,7 +43,7 @@
extends LWContainerPeer<Window, JComponent>
implements FramePeer, DialogPeer, FullScreenCapable, DisplayChangedListener, PlatformEventNotifier
{
- public static enum PeerType {
+ public enum PeerType {
SIMPLEWINDOW,
FRAME,
DIALOG,
@@ -83,15 +83,15 @@
// A peer where the last mouse event came to. Used by cursor manager to
// find the component under cursor
- private static volatile LWComponentPeer lastCommonMouseEventPeer = null;
+ private static volatile LWComponentPeer<?, ?> lastCommonMouseEventPeer;
// A peer where the last mouse event came to. Used to generate
// MOUSE_ENTERED/EXITED notifications
- private volatile LWComponentPeer lastMouseEventPeer;
+ private volatile LWComponentPeer<?, ?> lastMouseEventPeer;
// Peers where all dragged/released events should come to,
// depending on what mouse button is being dragged according to Cocoa
- private static LWComponentPeer mouseDownTarget[] = new LWComponentPeer[3];
+ private static final LWComponentPeer<?, ?>[] mouseDownTarget = new LWComponentPeer<?, ?>[3];
// A bitmask that indicates what mouse buttons produce MOUSE_CLICKED events
// on MOUSE_RELEASE. Click events are only generated if there were no drag
@@ -129,7 +129,8 @@
this.peerType = peerType;
Window owner = target.getOwner();
- LWWindowPeer ownerPeer = (owner != null) ? (LWWindowPeer)owner.getPeer() : null;
+ LWWindowPeer ownerPeer = owner == null ? null :
+ (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(owner);
PlatformWindow ownerDelegate = (ownerPeer != null) ? ownerPeer.getPlatformWindow() : null;
// The delegate.initialize() needs a non-null GC on X11.
@@ -163,10 +164,10 @@
// Init warning window(for applets)
SecurityWarningWindow warn = null;
- if (((Window)target).getWarningString() != null) {
+ if (target.getWarningString() != null) {
// accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
// and TrayIcon balloon windows without a warning window.
- if (!AWTAccessor.getWindowAccessor().isTrayIconWindow((Window)target)) {
+ if (!AWTAccessor.getWindowAccessor().isTrayIconWindow(target)) {
LWToolkit toolkit = (LWToolkit)Toolkit.getDefaultToolkit();
warn = toolkit.createSecurityWarning(target, this);
}
@@ -210,6 +211,7 @@
}
// Just a helper method
+ @Override
public PlatformWindow getPlatformWindow() {
return platformWindow;
}
@@ -391,7 +393,8 @@
@Override
public void setModalBlocked(Dialog blocker, boolean blocked) {
synchronized (getPeerTreeLock()) {
- this.blocker = blocked ? (LWWindowPeer)blocker.getPeer() : null;
+ this.blocker = !blocked ? null :
+ (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(blocker);
}
platformWindow.setModalBlocked(blocked);
@@ -458,6 +461,7 @@
textured = isTextured;
}
+ @Override
public final boolean isTranslucent() {
synchronized (getStateLock()) {
/*
@@ -537,7 +541,8 @@
public void blockWindows(List<Window> windows) {
//TODO: LWX will probably need some collectJavaToplevels to speed this up
for (Window w : windows) {
- WindowPeer wp = (WindowPeer)w.getPeer();
+ WindowPeer wp =
+ (WindowPeer) AWTAccessor.getComponentAccessor().getPeer(w);
if (wp != null) {
wp.setModalBlocked((Dialog)getTarget(), true);
}
@@ -694,7 +699,7 @@
// TODO: fill "bdata" member of AWTEvent
Rectangle r = getBounds();
// findPeerAt() expects parent coordinates
- LWComponentPeer targetPeer = findPeerAt(r.x + x, r.y + y);
+ LWComponentPeer<?, ?> targetPeer = findPeerAt(r.x + x, r.y + y);
if (id == MouseEvent.MOUSE_EXITED) {
isMouseOver = false;
@@ -743,7 +748,7 @@
screenX, screenY, modifiers, clickCount, popupTrigger,
targetPeer);
} else {
- LWComponentPeer topmostTargetPeer =
+ LWComponentPeer<?, ?> topmostTargetPeer =
topmostWindowPeer != null ? topmostWindowPeer.findPeerAt(r.x + x, r.y + y) : null;
topmostWindowPeer.generateMouseEnterExitEventsForComponents(when, button, x, y,
screenX, screenY, modifiers, clickCount, popupTrigger,
@@ -840,7 +845,7 @@
private void generateMouseEnterExitEventsForComponents(long when,
int button, int x, int y, int screenX, int screenY,
int modifiers, int clickCount, boolean popupTrigger,
- LWComponentPeer targetPeer) {
+ final LWComponentPeer<?, ?> targetPeer) {
if (!isMouseOver || targetPeer == lastMouseEventPeer) {
return;
@@ -899,7 +904,7 @@
// TODO: could we just use the last mouse event target here?
Rectangle r = getBounds();
// findPeerAt() expects parent coordinates
- final LWComponentPeer targetPeer = findPeerAt(r.x + x, r.y + y);
+ final LWComponentPeer<?, ?> targetPeer = findPeerAt(r.x + x, r.y + y);
if (targetPeer == null || !targetPeer.isEnabled()) {
return;
}
@@ -933,7 +938,12 @@
focusOwner = this.getTarget();
}
}
- postEvent(new KeyEvent(focusOwner, id, when, modifiers, keyCode, keyChar, keyLocation));
+
+ KeyEvent keyEvent = new KeyEvent(focusOwner, id, when, modifiers,
+ keyCode, keyChar, keyLocation);
+ AWTAccessor.getKeyEventAccessor().setExtendedKeyCode(keyEvent,
+ ExtendedKeyCodes.getExtendedKeyCodeForChar(keyChar));
+ postEvent(keyEvent);
}
// ---- UTILITY METHODS ---- //
@@ -1152,8 +1162,9 @@
if (focusLog.isLoggable(PlatformLogger.Level.FINE)) {
focusLog.fine("requesting native focus to the owner " + owner);
}
- LWWindowPeer currentActivePeer = (currentActive != null ?
- (LWWindowPeer)currentActive.getPeer() : null);
+ LWWindowPeer currentActivePeer = currentActive == null ? null :
+ (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(
+ currentActive);
// Ensure the opposite is natively active and suppress sending events.
if (currentActivePeer != null && currentActivePeer.platformWindow.isActive()) {
@@ -1265,7 +1276,8 @@
while (owner != null && !(owner instanceof Frame || owner instanceof Dialog)) {
owner = owner.getOwner();
}
- return owner != null ? (LWWindowPeer)owner.getPeer() : null;
+ return owner == null ? null :
+ (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(owner);
}
/**
@@ -1284,11 +1296,13 @@
}
}
+ @Override
public void enterFullScreenMode() {
platformWindow.enterFullScreenMode();
updateSecurityWarningVisibility();
}
+ @Override
public void exitFullScreenMode() {
platformWindow.exitFullScreenMode();
updateSecurityWarningVisibility();
--- a/jdk/src/macosx/classes/sun/lwawt/SelectionClearListener.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.lwawt;
-
-/*
- * Every time the TextField (or TextArea) change selection, every other text components
- * must immediately clear their selections.
- */
-interface SelectionClearListener {
- void clearSelection();
-}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMenu.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMenu.java Thu Oct 03 19:18:54 2013 +0100
@@ -26,9 +26,11 @@
package sun.lwawt.macosx;
import java.awt.*;
+import java.awt.peer.MenuItemPeer;
import java.awt.peer.MenuPeer;
public class CMenu extends CMenuItem implements MenuPeer {
+
public CMenu(Menu target) {
super(target);
}
@@ -41,6 +43,20 @@
}
@Override
+ public final void setEnabled(final boolean b) {
+ super.setEnabled(b);
+ final Menu target = (Menu) getTarget();
+ final int count = target.getItemCount();
+ for (int i = 0; i < count; ++i) {
+ MenuItem item = target.getItem(i);
+ MenuItemPeer p = (MenuItemPeer) LWCToolkit.targetToPeer(item);
+ if (p != null) {
+ p.setEnabled(b && item.isEnabled());
+ }
+ }
+ }
+
+ @Override
protected long createModel() {
CMenuComponent parent = (CMenuComponent)
LWCToolkit.targetToPeer(getTarget().getParent());
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMenuItem.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMenuItem.java Thu Oct 03 19:18:54 2013 +0100
@@ -28,17 +28,20 @@
import sun.awt.SunToolkit;
import sun.lwawt.LWToolkit;
+import java.awt.MenuContainer;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.event.*;
import java.awt.peer.MenuItemPeer;
+import java.util.concurrent.atomic.AtomicBoolean;
public class CMenuItem extends CMenuComponent implements MenuItemPeer {
+ private final AtomicBoolean enabled = new AtomicBoolean(true);
+
public CMenuItem(MenuItem target) {
super(target);
initialize(target);
-
}
// This way we avoiding invocation of the setters twice
@@ -124,9 +127,19 @@
setEnabled(false);
}
+ public final boolean isEnabled() {
+ return enabled.get();
+ }
+
@Override
public void setEnabled(boolean b) {
- nativeSetEnabled(getModel(), b);
+ final Object parent = LWToolkit.targetToPeer(getTarget().getParent());
+ if (parent instanceof CMenuItem) {
+ b &= ((CMenuItem) parent).isEnabled();
+ }
+ if (enabled.compareAndSet(!b, b)) {
+ nativeSetEnabled(getModel(), b);
+ }
}
private native long nativeCreate(long parentMenu, boolean isSeparator);
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.lwawt.macosx;
-
-import java.awt.Window;
-import sun.lwawt.LWMouseInfoPeer;
-import sun.lwawt.LWWindowPeer;
-
-public class CMouseInfoPeer extends LWMouseInfoPeer
-{
- //If a new window is to appear under the cursor,
- //we get wrong window.
- //This is a workaround for macosx.
- @Override
- public boolean isWindowUnderMouse(Window w) {
- if (w == null) {
- return false;
- }
-
- return ((LWWindowPeer)w.getPeer()).getPlatformWindow().isUnderMouse();
- }
-}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Oct 03 19:18:54 2013 +0100
@@ -820,6 +820,7 @@
}
nativeSetEnabled(getNSWindowPtr(), !blocked);
+ checkBlockingAndOrder();
}
public final void invalidateShadow(){
@@ -984,7 +985,7 @@
setStyleBits(SHOULD_BECOME_KEY | SHOULD_BECOME_MAIN, isFocusable); // set both bits at once
}
- private boolean checkBlocking() {
+ private boolean checkBlockingAndOrder() {
LWWindowPeer blocker = (peer == null)? null : peer.getBlocker();
if (blocker == null) {
return false;
@@ -1040,7 +1041,7 @@
private void windowDidBecomeMain() {
assert CThreading.assertAppKit();
- if (checkBlocking()) return;
+ if (checkBlockingAndOrder()) return;
// If it's not blocked, make sure it's above its siblings
orderAboveSiblings();
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Oct 03 19:18:54 2013 +0100
@@ -44,6 +44,8 @@
import sun.lwawt.LWWindowPeer.PeerType;
import sun.security.action.GetBooleanAction;
+import sun.util.CoreResourceBundleControl;
+
class NamedCursor extends Cursor {
NamedCursor(String name) {
super(name);
@@ -67,13 +69,28 @@
static {
System.err.flush();
- java.security.AccessController.doPrivileged(new java.security.PrivilegedAction<Object>() {
- public Object run() {
+
+ ResourceBundle platformResources = java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<ResourceBundle>() {
+ public ResourceBundle run() {
+ ResourceBundle platformResources = null;
+ try {
+ platformResources =
+ ResourceBundle.getBundle("sun.awt.resources.awtosx",
+ CoreResourceBundleControl.getRBControlInstance());
+ } catch (MissingResourceException e) {
+ // No resource file; defaults will be used.
+ }
+
System.loadLibrary("awt");
System.loadLibrary("fontmanager");
- return null;
+
+ return platformResources;
}
});
+
+ AWTAccessor.getToolkitAccessor().setPlatformResources(platformResources);
+
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
@@ -207,9 +224,9 @@
@Override
public MenuBarPeer createMenuBar(MenuBar target) {
- MenuBarPeer peer = new CMenuBar(target);
- targetCreatedPeer(target, peer);
- return peer;
+ MenuBarPeer peer = new CMenuBar(target);
+ targetCreatedPeer(target, peer);
+ return peer;
}
@Override
@@ -303,11 +320,6 @@
}
@Override
- protected MouseInfoPeer createMouseInfoPeerImpl() {
- return new CMouseInfoPeer();
- }
-
- @Override
protected int getScreenHeight() {
return GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice().getDefaultConfiguration().getBounds().height;
--- a/jdk/src/macosx/native/sun/awt/AWTEvent.m Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTEvent.m Thu Oct 03 19:18:54 2013 +0100
@@ -759,7 +759,7 @@
*/
JNIEXPORT jint JNICALL
Java_sun_lwawt_macosx_event_NSEvent_nsToJavaChar
-(JNIEnv *env, jclass cls, char nsChar, jint modifierFlags)
+(JNIEnv *env, jclass cls, jchar nsChar, jint modifierFlags)
{
jchar javaChar = 0;
--- a/jdk/src/macosx/native/sun/awt/AWTView.m Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTView.m Thu Oct 03 19:18:54 2013 +0100
@@ -126,7 +126,7 @@
self.cglLayer = nil;
- JNIEnv *env = [ThreadUtilities getJNIEnv];
+ JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
(*env)->DeleteGlobalRef(env, m_cPlatformView);
m_cPlatformView = NULL;
@@ -387,7 +387,7 @@
[rolloverTrackingArea release];
}
- int options = (NSTrackingActiveInActiveApp | NSTrackingMouseEnteredAndExited |
+ int options = (NSTrackingActiveAlways | NSTrackingMouseEnteredAndExited |
NSTrackingMouseMoved | NSTrackingEnabledDuringMouseDrag);
rolloverTrackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
--- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Thu Oct 03 19:18:54 2013 +0100
@@ -350,7 +350,7 @@
- (void) dealloc {
AWT_ASSERT_APPKIT_THREAD;
- JNIEnv *env = [ThreadUtilities getJNIEnv];
+ JNIEnv *env = [ThreadUtilities getJNIEnvUncached];
[self.javaPlatformWindow setJObject:nil withEnv:env];
self.nsWindow = nil;
@@ -366,6 +366,22 @@
- (BOOL) canBecomeMainWindow {
AWT_ASSERT_APPKIT_THREAD;
+ if(!self.isEnabled){
+ // Native system can bring up the NSWindow to
+ // the top even if the window is not main.
+ // We should bring up the modal dialog manually
+ [AWTToolkit eventCountPlusPlus];
+
+ JNIEnv *env = [ThreadUtilities getJNIEnv];
+ jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
+ if (platformWindow != NULL) {
+ static JNF_MEMBER_CACHE(jm_checkBlockingAndOrder, jc_CPlatformWindow,
+ "checkBlockingAndOrder", "()Z");
+ JNFCallVoidMethod(env, platformWindow, jm_checkBlockingAndOrder);
+ (*env)->DeleteLocalRef(env, platformWindow);
+ }
+ }
+
return self.isEnabled && IS(self.styleBits, SHOULD_BECOME_MAIN);
}
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=ein-/ausblenden
+toggleexpand=einblenden umschalten
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_es.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_es.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=activar/desactivar ampliaci\u00F3n
+toggleexpand=conmutar ampliaci\u00F3n
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_fr.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_fr.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=basculer le d\u00E9veloppement
+toggleexpand=activer/d\u00E9sactiver d\u00E9veloppement
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_it.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_it.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=abilita/disabilita espansione
+toggleexpand=attiva/disattiva espansione
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_pt_BR.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_pt_BR.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=alternar expans\u00E3o
+toggleexpand=alternar expandir
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_sv.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/accessibility/internal/resources/accessibility_sv.properties Thu Oct 03 19:18:54 2013 +0100
@@ -102,7 +102,7 @@
#
# accessible actions
#
-toggleexpand=v\u00E4xla ut\u00F6ka
+toggleexpand=v\u00E4xla expandering
# new relations, roles and states for J2SE 1.5.0
--- a/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -278,10 +278,11 @@
(JFIFMarkerSegment) findMarkerSegment
(JFIFMarkerSegment.class, true);
if (jfif == null) {
- throw new IIOException
- ("ICC APP2 encountered without prior JFIF!");
+ newGuy = new MarkerSegment(buffer);
+ newGuy.loadData(buffer);
+ } else {
+ jfif.addICC(buffer);
}
- jfif.addICC(buffer);
// newGuy remains null
} else {
newGuy = new MarkerSegment(buffer);
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,6 +41,7 @@
import javax.swing.table.*;
import javax.accessibility.*;
+import sun.swing.AbstractFilterComboBoxModel;
import sun.swing.SwingUtilities2;
import sun.swing.plaf.synth.*;
@@ -1328,71 +1329,9 @@
/**
* Data model for filter combo-box.
*/
- protected class FilterComboBoxModel extends AbstractListModel
- implements ComboBoxModel, PropertyChangeListener {
- protected FileFilter[] filters;
-
- protected FilterComboBoxModel() {
- super();
- filters = getFileChooser().getChoosableFileFilters();
- }
-
- public void propertyChange(PropertyChangeEvent e) {
- String prop = e.getPropertyName();
- if (prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
- filters = (FileFilter[]) e.getNewValue();
- fireContentsChanged(this, -1, -1);
- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public void setSelectedItem(Object filter) {
- if (filter != null) {
- getFileChooser().setFileFilter((FileFilter) filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- // Ensure that the current filter is in the list.
- // NOTE: we shouldnt' have to do this, since JFileChooser adds
- // the filter to the choosable filters list when the filter
- // is set. Lets be paranoid just in case someone overrides
- // setFileFilter in JFileChooser.
- FileFilter currentFilter = getFileChooser().getFileFilter();
- boolean found = false;
- if (currentFilter != null) {
- for (FileFilter filter : filters) {
- if (filter == currentFilter) {
- found = true;
- }
- }
- if (found == false) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
- return getFileChooser().getFileFilter();
- }
-
- public int getSize() {
- if (filters != null) {
- return filters.length;
- } else {
- return 0;
- }
- }
-
- public Object getElementAt(int index) {
- if (index > getSize() - 1) {
- // This shouldn't happen. Try to recover gracefully.
- return getFileChooser().getFileFilter();
- }
- if (filters != null) {
- return filters[index];
- } else {
- return null;
- }
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return GTKFileChooserUI.this.getFileChooser();
}
}
}
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -38,6 +38,7 @@
import java.io.IOException;
import java.util.*;
import sun.awt.shell.ShellFolder;
+import sun.swing.AbstractFilterComboBoxModel;
import sun.swing.SwingUtilities2;
/**
@@ -777,70 +778,9 @@
/**
* Data model for a type-face selection combo-box.
*/
- protected class FilterComboBoxModel extends AbstractListModel<FileFilter> implements ComboBoxModel<FileFilter>,
- PropertyChangeListener {
- protected FileFilter[] filters;
- protected FilterComboBoxModel() {
- super();
- filters = getFileChooser().getChoosableFileFilters();
- }
-
- public void propertyChange(PropertyChangeEvent e) {
- String prop = e.getPropertyName();
- if(prop.equals(JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY)) {
- filters = (FileFilter[]) e.getNewValue();
- fireContentsChanged(this, -1, -1);
- } else if (prop.equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) {
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public void setSelectedItem(Object filter) {
- if(filter != null) {
- getFileChooser().setFileFilter((FileFilter) filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- // Ensure that the current filter is in the list.
- // NOTE: we shouldnt' have to do this, since JFileChooser adds
- // the filter to the choosable filters list when the filter
- // is set. Lets be paranoid just in case someone overrides
- // setFileFilter in JFileChooser.
- FileFilter currentFilter = getFileChooser().getFileFilter();
- boolean found = false;
- if(currentFilter != null) {
- for (FileFilter filter : filters) {
- if (filter == currentFilter) {
- found = true;
- }
- }
- if (!found) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
- return getFileChooser().getFileFilter();
- }
-
- public int getSize() {
- if(filters != null) {
- return filters.length;
- } else {
- return 0;
- }
- }
-
- public FileFilter getElementAt(int index) {
- if(index > getSize() - 1) {
- // This shouldn't happen. Try to recover gracefully.
- return getFileChooser().getFileFilter();
- }
- if(filters != null) {
- return filters[index];
- } else {
- return null;
- }
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return MotifFileChooserUI.this.getFileChooser();
}
}
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/resources/motif_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/resources/motif_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -30,7 +30,7 @@
FileChooser.filterLabel.textAndMnemonic=Filte&r
FileChooser.foldersLabel.textAndMnemonic=Ord&ner
FileChooser.filesLabel.textAndMnemonic=Date&ien
-FileChooser.enterFileNameLabel.textAndMnemonic=Dateiname ei&ngeben:
+FileChooser.enterFileNameLabel.textAndMnemonic=Dateina&me eingeben:
FileChooser.enterFolderNameLabel.textAndMnemonic=Ordnernamen eingeben:
FileChooser.cancelButtonToolTip.textAndMnemonic=Dialogfeld f\u00FCr Dateiauswahl schlie\u00DFen.
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/motif/resources/motif_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/resources/motif_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -24,7 +24,7 @@
FileChooser.openButton.textAndMnemonic=\uD655\uC778
FileChooser.saveDialogTitle.textAndMnemonic=\uC800\uC7A5
FileChooser.openDialogTitle.textAndMnemonic=\uC5F4\uAE30
-FileChooser.updateButton.textAndMnemonic=\uAC31\uC2E0
+FileChooser.updateButton.textAndMnemonic=\uC5C5\uB370\uC774\uD2B8
FileChooser.helpButton.textAndMnemonic=\uB3C4\uC6C0\uB9D0
FileChooser.pathLabel.textAndMnemonic=\uACBD\uB85C \uB610\uB294 \uD3F4\uB354 \uC774\uB984 \uC785\uB825(&P):
FileChooser.filterLabel.textAndMnemonic=\uD544\uD130(&R)
@@ -36,5 +36,5 @@
FileChooser.cancelButtonToolTip.textAndMnemonic=\uD30C\uC77C \uC120\uD0DD\uAE30 \uB300\uD654\uC0C1\uC790\uB97C \uC911\uB2E8\uD569\uB2C8\uB2E4.
FileChooser.saveButtonToolTip.textAndMnemonic=\uC120\uD0DD\uB41C \uD30C\uC77C\uC744 \uC800\uC7A5\uD569\uB2C8\uB2E4.
FileChooser.openButtonToolTip.textAndMnemonic=\uC120\uD0DD\uB41C \uD30C\uC77C\uC744 \uC5FD\uB2C8\uB2E4.
-FileChooser.updateButtonToolTip.textAndMnemonic=\uB514\uB809\uD1A0\uB9AC \uBAA9\uB85D\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4.
+FileChooser.updateButtonToolTip.textAndMnemonic=\uB514\uB809\uD1A0\uB9AC \uBAA9\uB85D\uC744 \uC5C5\uB370\uC774\uD2B8\uD569\uB2C8\uB2E4.
FileChooser.helpButtonToolTip.textAndMnemonic=FileChooser \uB3C4\uC6C0\uB9D0\uC785\uB2C8\uB2E4.
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -1193,70 +1193,9 @@
/**
* Data model for a type-face selection combo-box.
*/
- protected class FilterComboBoxModel extends AbstractListModel<FileFilter> implements ComboBoxModel<FileFilter>,
- PropertyChangeListener {
- protected FileFilter[] filters;
- protected FilterComboBoxModel() {
- super();
- filters = getFileChooser().getChoosableFileFilters();
- }
-
- public void propertyChange(PropertyChangeEvent e) {
- String prop = e.getPropertyName();
- if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
- filters = (FileFilter[]) e.getNewValue();
- fireContentsChanged(this, -1, -1);
- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public void setSelectedItem(Object filter) {
- if(filter != null) {
- getFileChooser().setFileFilter((FileFilter) filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- // Ensure that the current filter is in the list.
- // NOTE: we shouldnt' have to do this, since JFileChooser adds
- // the filter to the choosable filters list when the filter
- // is set. Lets be paranoid just in case someone overrides
- // setFileFilter in JFileChooser.
- FileFilter currentFilter = getFileChooser().getFileFilter();
- boolean found = false;
- if(currentFilter != null) {
- for (FileFilter filter : filters) {
- if (filter == currentFilter) {
- found = true;
- }
- }
- if(found == false) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
- return getFileChooser().getFileFilter();
- }
-
- public int getSize() {
- if(filters != null) {
- return filters.length;
- } else {
- return 0;
- }
- }
-
- public FileFilter getElementAt(int index) {
- if(index > getSize() - 1) {
- // This shouldn't happen. Try to recover gracefully.
- return getFileChooser().getFileFilter();
- }
- if(filters != null) {
- return filters[index];
- } else {
- return null;
- }
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return WindowsFileChooserUI.this.getFileChooser();
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/DriverResource_ja.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.util.jar.pack;
+
+import java.util.ListResourceBundle;
+
+public class DriverResource_ja extends ListResourceBundle {
+ public static final String VERSION ="VERSION";
+ public static final String BAD_ARGUMENT ="BAD_ARGUMENT";
+ public static final String BAD_OPTION ="BAD_OPTION";
+ public static final String BAD_REPACK_OUTPUT="BAD_REPACK_OUTPUT";
+ public static final String DETECTED_ZIP_COMMENT="DETECTED_ZIP_COMMENT";
+ public static final String SKIP_FOR_REPACKED ="SKIP_FOR_REPACKED";
+ public static final String WRITE_PACK_FILE ="WRITE_PACK_FILE";
+ public static final String WIRTE_PACKGZ_FILE="WIRTE_PACKGZ_FILE";
+ public static final String SKIP_FOR_MOVE_FAILED="SKIP_FOR_MOVE_FAILED";
+ public static final String PACK_HELP="PACK_HELP";
+ public static final String UNPACK_HELP ="UNPACK_HELP";
+ public static final String MORE_INFO = "MORE_INFO";
+ public static final String DUPLICATE_OPTION = "DUPLICATE_OPTION";
+ public static final String BAD_SPEC = "BAD_SPEC";
+
+ //The following string is duplicate in PACK and UNPACK comment,which was draw out to ruduce translation work.
+ private static final String PARAMETER_V = " -v, --verbose increase program verbosity";
+ private static final String PARAMETER_Q = " -q, --quiet set verbosity to lowest level";
+ private static final String PARAMETER_LF = " -l{F}, --log-file={F} output to the given log file, or '-' for System.out";
+ private static final String PARAMETER_H = " -?, -h, --help print this message";
+ private static final String PARAMETER_VER = " -V, --version print program version";
+ private static final String PARAMETER_J = " -J{X} pass option X to underlying Java VM";
+
+
+ //The following are outputs of command 'pack200' and 'unpack200'.
+ //Don't translate command arguments ,words with a prefix of '-' or '--'.
+ //
+ private static final Object[][] resource= {
+ {VERSION,"{0}\u30D0\u30FC\u30B8\u30E7\u30F3{1}"},//parameter 0:class name;parameter 1: version value
+ {BAD_ARGUMENT,"\u7121\u52B9\u306A\u5F15\u6570: {0}"},
+ {BAD_OPTION,"\u7121\u52B9\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0}={1}"},//parameter 0:option name;parameter 1:option value
+ {BAD_REPACK_OUTPUT,"\u7121\u52B9\u306A--repack\u51FA\u529B: {0}"},//parameter 0:filename
+ {DETECTED_ZIP_COMMENT,"\u691C\u51FA\u3055\u308C\u305FZIP\u30B3\u30E1\u30F3\u30C8: {0}"},//parameter 0:comment
+ {SKIP_FOR_REPACKED,"\u3059\u3067\u306B\u518D\u5727\u7E2E\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u3044\u307E\u3059: {0}"},//parameter 0:filename
+ {WRITE_PACK_FILE,"*.pack\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\u306B\u306F\u3001--no-gzip\u3092\u6307\u5B9A\u3057\u307E\u3059: {0}"},//parameter 0:filename
+ {WIRTE_PACKGZ_FILE,"*.pack.gz\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\u306B\u306F\u3001--gzip\u3092\u6307\u5B9A\u3057\u307E\u3059: {0}"},//parameter 0:filename
+ {SKIP_FOR_MOVE_FAILED,"\u79FB\u52D5\u304C\u5931\u6557\u3057\u305F\u305F\u3081\u89E3\u51CD\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u3066\u3044\u307E\u3059: {0}"},//parameter 0:filename
+ {PACK_HELP,new String[]{
+ "\u4F7F\u7528\u65B9\u6CD5: pack200 [-opt... | --option=value]... x.pack[.gz] y.jar",
+ "",
+ "\u5727\u7E2E\u30AA\u30D7\u30B7\u30E7\u30F3",
+ " -g\u3001--no-gzip \u30D7\u30EC\u30FC\u30F3\u306A*.pack\u30D5\u30A1\u30A4\u30EB\u3092\u5727\u7E2E\u305B\u305A\u306B\u51FA\u529B\u3057\u307E\u3059",
+ " --gzip (\u30C7\u30D5\u30A9\u30EB\u30C8)\u5727\u7E2E\u51FA\u529B\u3092gzip\u3067\u5F8C\u51E6\u7406\u3057\u307E\u3059",
+ " -G\u3001--strip-debug \u5727\u7E2E\u4E2D\u306B\u30C7\u30D0\u30C3\u30B0\u5C5E\u6027\u3092\u524A\u9664\u3057\u307E\u3059",
+ " -O\u3001--no-keep-file-order \u30D5\u30A1\u30A4\u30EB\u306E\u9806\u5E8F\u4ED8\u3051\u60C5\u5831\u3092\u8EE2\u9001\u3057\u307E\u305B\u3093",
+ " --keep-file-order (\u30C7\u30D5\u30A9\u30EB\u30C8)\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u9806\u5E8F\u4ED8\u3051\u3092\u4FDD\u6301\u3057\u307E\u3059",
+ " -S{N}\u3001--segment-limit={N} \u30BB\u30B0\u30E1\u30F3\u30C8\u5236\u9650\u3092\u51FA\u529B\u3057\u307E\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8N=1Mb)",
+ " -E{N}\u3001--effort={N} \u5727\u7E2E\u306E\u8A66\u884C(\u30C7\u30D5\u30A9\u30EB\u30C8N=5)",
+ " -H{h}\u3001--deflate-hint={h} \u30C7\u30D5\u30EC\u30FC\u30C8\u30FB\u30D2\u30F3\u30C8\u3092\u8EE2\u9001\u3057\u307E\u3059: true\u3001false\u307E\u305F\u306Fkeep(\u30C7\u30D5\u30A9\u30EB\u30C8)",
+ " -m{V}\u3001--modification-time={V} \u5909\u66F4\u6642\u9593\u3092\u8EE2\u9001\u3057\u307E\u3059: latest\u307E\u305F\u306Fkeep(\u30C7\u30D5\u30A9\u30EB\u30C8)",
+ " -P{F}\u3001--pass-file={F} \u6307\u5B9A\u3055\u308C\u305F\u5727\u7E2E\u3055\u308C\u3066\u3044\u306A\u3044\u5165\u529B\u8981\u7D20\u3092\u8EE2\u9001\u3057\u307E\u3059",
+ " -U{a}\u3001--unknown-attribute={a} \u4E0D\u660E\u306E\u5C5E\u6027\u30A2\u30AF\u30B7\u30E7\u30F3: error\u3001strip\u307E\u305F\u306Fpass(\u30C7\u30D5\u30A9\u30EB\u30C8)",
+ " -C{N}={L}\u3001--class-attribute={N}={L} (\u30E6\u30FC\u30B6\u30FC\u5B9A\u7FA9\u5C5E\u6027)",
+ " -F{N}={L}\u3001--field-attribute={N}={L} (\u30E6\u30FC\u30B6\u30FC\u5B9A\u7FA9\u5C5E\u6027)",
+ " -M{N}={L}\u3001--method-attribute={N}={L} (\u30E6\u30FC\u30B6\u30FC\u5B9A\u7FA9\u5C5E\u6027)",
+ " -D{N}={L}\u3001--code-attribute={N}={L} (\u30E6\u30FC\u30B6\u30FC\u5B9A\u7FA9\u5C5E\u6027)",
+ " -f{F}\u3001--config-file={F} Pack200.Packer\u30D7\u30ED\u30D1\u30C6\u30A3\u306B\u30D5\u30A1\u30A4\u30EBF\u3092\u8AAD\u307F\u8FBC\u307F\u307E\u3059",
+ PARAMETER_V ,
+ PARAMETER_Q ,
+ PARAMETER_LF ,
+ PARAMETER_H ,
+ PARAMETER_VER ,
+ PARAMETER_J,
+ "",
+ "\u6CE8\u610F:",
+ " -P\u3001-C\u3001-F\u3001-M\u304A\u3088\u3073-D\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u7D2F\u7A4D\u3055\u308C\u307E\u3059\u3002",
+ " \u5C5E\u6027\u5B9A\u7FA9\u306E\u4F8B: -C SourceFile=RUH .",
+ " Config.\u30D5\u30A1\u30A4\u30EB\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u306F\u3001Pack200 API\u306B\u3088\u3063\u3066\u5B9A\u7FA9\u3055\u308C\u307E\u3059\u3002",
+ " -S\u3001-E\u3001-H\u3001-m\u3001-U\u306E\u5024\u306E\u610F\u5473\u306F\u3001Pack200 API\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
+ " \u30EC\u30A4\u30A2\u30A6\u30C8\u5B9A\u7FA9(RUH\u306A\u3069)\u306FJSR 200\u306B\u3088\u3063\u3066\u5B9A\u7FA9\u3055\u308C\u307E\u3059\u3002",
+ "",
+ "\u518D\u5727\u7E2E\u30E2\u30FC\u30C9\u3067\u306F\u3001JAR\u30D5\u30A1\u30A4\u30EB\u304C\u5727\u7E2E/\u89E3\u51CD\u30B5\u30A4\u30AF\u30EB\u3067\u66F4\u65B0\u3055\u308C\u307E\u3059:",
+ " pack200 [-r|--repack] [-opt | --option=value]... [repackedy.jar] y.jar\n"
+ }
+ },
+ {UNPACK_HELP,new String[]{
+ "\u4F7F\u7528\u65B9\u6CD5: unpack200 [-opt... | --option=value]... x.pack[.gz] y.jar\n",
+ "",
+ "\u89E3\u51CD\u30AA\u30D7\u30B7\u30E7\u30F3",
+ " -H{h}\u3001--deflate-hint={h} \u8EE2\u9001\u3055\u308C\u305F\u30C7\u30D5\u30EC\u30FC\u30C8\u30FB\u30D2\u30F3\u30C8\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3057\u307E\u3059: true\u3001false\u307E\u305F\u306Fkeep(\u30C7\u30D5\u30A9\u30EB\u30C8)",
+ " -r\u3001--remove-pack-file \u89E3\u51CD\u5F8C\u306B\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u307E\u3059",
+ PARAMETER_V ,
+ PARAMETER_Q ,
+ PARAMETER_LF ,
+ PARAMETER_H ,
+ PARAMETER_VER ,
+ PARAMETER_J,
+ }
+ },
+
+ {MORE_INFO,"(\u8A73\u7D30\u306F\u3001{0} --help\u3092\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002)"},//parameter 0:command name
+ {DUPLICATE_OPTION,"\u91CD\u8907\u30AA\u30D7\u30B7\u30E7\u30F3: {0}"},//parameter 0:option
+ {BAD_SPEC,"{0}\u306E\u7121\u52B9\u306A\u4ED5\u69D8: {1}"},//parameter 0:option;parameter 1:specifier
+ };
+
+ protected Object[][] getContents() {
+ return resource;
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/com/sun/java/util/jar/pack/DriverResource_zh_CN.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.java.util.jar.pack;
+
+import java.util.ListResourceBundle;
+
+public class DriverResource_zh_CN extends ListResourceBundle {
+ public static final String VERSION ="VERSION";
+ public static final String BAD_ARGUMENT ="BAD_ARGUMENT";
+ public static final String BAD_OPTION ="BAD_OPTION";
+ public static final String BAD_REPACK_OUTPUT="BAD_REPACK_OUTPUT";
+ public static final String DETECTED_ZIP_COMMENT="DETECTED_ZIP_COMMENT";
+ public static final String SKIP_FOR_REPACKED ="SKIP_FOR_REPACKED";
+ public static final String WRITE_PACK_FILE ="WRITE_PACK_FILE";
+ public static final String WIRTE_PACKGZ_FILE="WIRTE_PACKGZ_FILE";
+ public static final String SKIP_FOR_MOVE_FAILED="SKIP_FOR_MOVE_FAILED";
+ public static final String PACK_HELP="PACK_HELP";
+ public static final String UNPACK_HELP ="UNPACK_HELP";
+ public static final String MORE_INFO = "MORE_INFO";
+ public static final String DUPLICATE_OPTION = "DUPLICATE_OPTION";
+ public static final String BAD_SPEC = "BAD_SPEC";
+
+ //The following string is duplicate in PACK and UNPACK comment,which was draw out to ruduce translation work.
+ private static final String PARAMETER_V = " -v, --verbose increase program verbosity";
+ private static final String PARAMETER_Q = " -q, --quiet set verbosity to lowest level";
+ private static final String PARAMETER_LF = " -l{F}, --log-file={F} output to the given log file, or '-' for System.out";
+ private static final String PARAMETER_H = " -?, -h, --help print this message";
+ private static final String PARAMETER_VER = " -V, --version print program version";
+ private static final String PARAMETER_J = " -J{X} pass option X to underlying Java VM";
+
+
+ //The following are outputs of command 'pack200' and 'unpack200'.
+ //Don't translate command arguments ,words with a prefix of '-' or '--'.
+ //
+ private static final Object[][] resource= {
+ {VERSION,"{0}\u7248\u672C{1}"},//parameter 0:class name;parameter 1: version value
+ {BAD_ARGUMENT,"\u9519\u8BEF\u53C2\u6570: {0}"},
+ {BAD_OPTION,"\u9519\u8BEF\u9009\u9879: {0}={1}"},//parameter 0:option name;parameter 1:option value
+ {BAD_REPACK_OUTPUT,"--repack \u8F93\u51FA\u9519\u8BEF: {0}"},//parameter 0:filename
+ {DETECTED_ZIP_COMMENT,"\u68C0\u6D4B\u5230 ZIP \u6CE8\u91CA: {0}"},//parameter 0:comment
+ {SKIP_FOR_REPACKED,"\u7531\u4E8E\u5DF2\u91CD\u65B0\u6253\u5305\u800C\u8DF3\u8FC7: {0}"},//parameter 0:filename
+ {WRITE_PACK_FILE,"\u8981\u5199\u5165 *.pack \u6587\u4EF6, \u8BF7\u6307\u5B9A --no-gzip: {0}"},//parameter 0:filename
+ {WIRTE_PACKGZ_FILE,"\u8981\u5199\u5165 *.pack.gz \u6587\u4EF6, \u8BF7\u6307\u5B9A --gzip: {0}"},//parameter 0:filename
+ {SKIP_FOR_MOVE_FAILED,"\u7531\u4E8E\u79FB\u52A8\u5931\u8D25\u800C\u8DF3\u8FC7\u91CD\u65B0\u6253\u5305: {0}"},//parameter 0:filename
+ {PACK_HELP,new String[]{
+ "\u7528\u6CD5: pack200 [-opt... | --option=value]... x.pack[.gz] y.jar",
+ "",
+ "\u6253\u5305\u9009\u9879",
+ " -g, --no-gzip \u8F93\u51FA\u65E0\u683C\u5F0F\u7684 *.pack \u6587\u4EF6, \u4E0D\u538B\u7F29",
+ " --gzip (\u9ED8\u8BA4\u503C) \u4F7F\u7528 gzip \u5BF9\u6253\u5305\u8FDB\u884C\u540E\u5904\u7406",
+ " -G, --strip-debug \u6253\u5305\u65F6\u5220\u9664\u8C03\u8BD5\u5C5E\u6027",
+ " -O, --no-keep-file-order \u4E0D\u4F20\u8F93\u6587\u4EF6\u6392\u5E8F\u4FE1\u606F",
+ " --keep-file-order (\u9ED8\u8BA4\u503C) \u4FDD\u7559\u8F93\u5165\u6587\u4EF6\u6392\u5E8F",
+ " -S{N}, --segment-limit={N} \u8F93\u51FA\u6BB5\u9650\u5236 (\u9ED8\u8BA4\u503C N=1Mb)",
+ " -E{N}, --effort={N} \u6253\u5305\u6548\u679C (\u9ED8\u8BA4\u503C N=5)",
+ " -H{h}, --deflate-hint={h} \u4F20\u8F93\u538B\u7F29\u63D0\u793A: true, false \u6216 keep (\u9ED8\u8BA4\u503C)",
+ " -m{V}, --modification-time={V} \u4F20\u8F93 modtimes: latest \u6216 keep (\u9ED8\u8BA4\u503C)",
+ " -P{F}, --pass-file={F} \u4F20\u8F93\u672A\u89E3\u538B\u7F29\u7684\u7ED9\u5B9A\u8F93\u5165\u5143\u7D20",
+ " -U{a}, --unknown-attribute={a} \u672A\u77E5\u5C5E\u6027\u64CD\u4F5C: error, strip \u6216 pass (\u9ED8\u8BA4\u503C)",
+ " -C{N}={L}, --class-attribute={N}={L} (\u7528\u6237\u5B9A\u4E49\u7684\u5C5E\u6027)",
+ " -F{N}={L}, --field-attribute={N}={L} (\u7528\u6237\u5B9A\u4E49\u7684\u5C5E\u6027)",
+ " -M{N}={L}, --method-attribute={N}={L} (\u7528\u6237\u5B9A\u4E49\u7684\u5C5E\u6027)",
+ " -D{N}={L}, --code-attribute={N}={L} (\u7528\u6237\u5B9A\u4E49\u7684\u5C5E\u6027)",
+ " -f{F}, --config-file={F} \u8BFB\u53D6\u6587\u4EF6 F \u7684 Pack200.Packer \u5C5E\u6027",
+ PARAMETER_V ,
+ PARAMETER_Q ,
+ PARAMETER_LF ,
+ PARAMETER_H ,
+ PARAMETER_VER ,
+ PARAMETER_J,
+ "",
+ "\u6CE8:",
+ " -P, -C, -F, -M \u548C -D \u9009\u9879\u7D2F\u8BA1\u3002",
+ " \u793A\u4F8B\u5C5E\u6027\u5B9A\u4E49: -C SourceFile=RUH\u3002",
+ " Config. \u6587\u4EF6\u5C5E\u6027\u7531 Pack200 API \u5B9A\u4E49\u3002",
+ " \u6709\u5173 -S, -E, -H-, -m, -U \u503C\u7684\u542B\u4E49, \u8BF7\u53C2\u9605 Pack200 API\u3002",
+ " \u5E03\u5C40\u5B9A\u4E49 (\u4F8B\u5982 RUH) \u7531 JSR 200 \u5B9A\u4E49\u3002",
+ "",
+ "\u91CD\u65B0\u6253\u5305\u6A21\u5F0F\u901A\u8FC7\u6253\u5305/\u89E3\u5305\u5468\u671F\u66F4\u65B0 JAR \u6587\u4EF6:",
+ " pack200 [-r|--repack] [-opt | --option=value]... [repackedy.jar] y.jar\n"
+ }
+ },
+ {UNPACK_HELP,new String[]{
+ "\u7528\u6CD5: unpack200 [-opt... | --option=value]... x.pack[.gz] y.jar\n",
+ "",
+ "\u89E3\u5305\u9009\u9879",
+ " -H{h}, --deflate-hint={h} \u8986\u76D6\u5DF2\u4F20\u8F93\u7684\u538B\u7F29\u63D0\u793A: true, false \u6216 keep (\u9ED8\u8BA4\u503C)",
+ " -r, --remove-pack-file \u89E3\u5305\u4E4B\u540E\u5220\u9664\u8F93\u5165\u6587\u4EF6",
+ PARAMETER_V ,
+ PARAMETER_Q ,
+ PARAMETER_LF ,
+ PARAMETER_H ,
+ PARAMETER_VER ,
+ PARAMETER_J,
+ }
+ },
+
+ {MORE_INFO,"(\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u8FD0\u884C {0} --help\u3002)"},//parameter 0:command name
+ {DUPLICATE_OPTION,"\u91CD\u590D\u7684\u9009\u9879: {0}"},//parameter 0:option
+ {BAD_SPEC,"{0}\u7684\u89C4\u8303\u9519\u8BEF: {1}"},//parameter 0:option;parameter 1:specifier
+ };
+
+ protected Object[][] getContents() {
+ return resource;
+ }
+
+
+}
--- a/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/rowset/RowSetResourceBundle_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -44,7 +44,7 @@
cachedrowsetimpl.dtypemismt = \uB370\uC774\uD130 \uC720\uD615\uC774 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
cachedrowsetimpl.datefail = {1} \uC5F4\uC758 \uAC12({0})\uC5D0\uC11C getDate\uB97C \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uBCC0\uD658\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
cachedrowsetimpl.timefail = {1} \uC5F4\uC758 \uAC12({0})\uC5D0\uC11C getTime\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uBCC0\uD658\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
-cachedrowsetimpl.posupdate = \uC704\uCE58\uAC00 \uC9C0\uC815\uB41C \uAC31\uC2E0\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
+cachedrowsetimpl.posupdate = \uC704\uCE58\uAC00 \uC9C0\uC815\uB41C \uC5C5\uB370\uC774\uD2B8\uAC00 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
cachedrowsetimpl.unableins = \uC778\uC2A4\uD134\uC2A4\uD654\uD560 \uC218 \uC5C6\uC74C: {0}
cachedrowsetimpl.beforefirst = beforeFirst: \uCEE4\uC11C \uC791\uC5C5\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4.
cachedrowsetimpl.first = \uCC98\uC74C: \uCEE4\uC11C \uC791\uC5C5\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4.
@@ -110,7 +110,7 @@
jdbcrowsetimpl.unsetmatch = \uC124\uC815\uC744 \uD574\uC81C\uD558\uB824\uB294 \uC5F4\uC774 \uC124\uC815\uB41C \uC5F4\uACFC \uB2E4\uB985\uB2C8\uB2E4.
jdbcrowsetimpl.usecolname = \uC5F4 \uC774\uB984\uC744 unsetMatchColumn\uC758 \uC778\uC218\uB85C \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC624.
jdbcrowsetimpl.usecolid = \uC5F4 ID\uB97C unsetMatchColumn\uC758 \uC778\uC218\uB85C \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC624.
-jdbcrowsetimpl.resnotupd = ResultSet\uB97C \uAC31\uC2E0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+jdbcrowsetimpl.resnotupd = ResultSet\uB97C \uC5C5\uB370\uC774\uD2B8\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
jdbcrowsetimpl.opnotysupp = \uC791\uC5C5\uC774 \uC544\uC9C1 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
jdbcrowsetimpl.featnotsupp = \uAE30\uB2A5\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
@@ -157,7 +157,7 @@
xmlrch.errinsert = insert \uD589\uC744 \uC0DD\uC131\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: {0}
xmlrch.errinsdel = insdel \uD589\uC744 \uC0DD\uC131\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: {0}
xmlrch.errupdate = update \uD589\uC744 \uC0DD\uC131\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: {0}
-xmlrch.errupdrow = \uD589\uC744 \uAC31\uC2E0\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: {0}
+xmlrch.errupdrow = \uD589\uC744 \uC5C5\uB370\uC774\uD2B8\uD558\uB294 \uC911 \uC624\uB958 \uBC1C\uC0DD: {0}
xmlrch.chars = \uBB38\uC790:
xmlrch.badvalue = \uC798\uBABB\uB41C \uAC12: \uB110\uC77C \uC218 \uC5C6\uB294 \uC18D\uC131\uC785\uB2C8\uB2E4.
xmlrch.badvalue1 = \uC798\uBABB\uB41C \uAC12: \uB110\uC77C \uC218 \uC5C6\uB294 \uBA54\uD0C0 \uB370\uC774\uD130\uC785\uB2C8\uB2E4.
--- a/jdk/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/swing/internal/plaf/basic/resources/basic_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -46,7 +46,7 @@
FileChooser.openButton.textAndMnemonic=\uC5F4\uAE30(&O)
FileChooser.saveDialogTitle.textAndMnemonic=\uC800\uC7A5
FileChooser.openDialogTitle.textAndMnemonic=\uC5F4\uAE30
-FileChooser.updateButton.textAndMnemonic=\uAC31\uC2E0(&U)
+FileChooser.updateButton.textAndMnemonic=\uC5C5\uB370\uC774\uD2B8(&U)
FileChooser.helpButton.textAndMnemonic=\uB3C4\uC6C0\uB9D0(&H)
FileChooser.directoryOpenButton.textAndMnemonic=\uC5F4\uAE30(&O)
@@ -66,7 +66,7 @@
FileChooser.cancelButtonToolTip.textAndMnemonic=\uD30C\uC77C \uC120\uD0DD\uAE30 \uB300\uD654\uC0C1\uC790 \uC911\uB2E8
FileChooser.saveButtonToolTip.textAndMnemonic=\uC120\uD0DD\uB41C \uD30C\uC77C \uC800\uC7A5
FileChooser.openButtonToolTip.textAndMnemonic=\uC120\uD0DD\uB41C \uD30C\uC77C \uC5F4\uAE30
-FileChooser.updateButtonToolTip.textAndMnemonic=\uB514\uB809\uD1A0\uB9AC \uBAA9\uB85D \uAC31\uC2E0
+FileChooser.updateButtonToolTip.textAndMnemonic=\uB514\uB809\uD1A0\uB9AC \uBAA9\uB85D \uC5C5\uB370\uC774\uD2B8
FileChooser.helpButtonToolTip.textAndMnemonic=FileChooser \uB3C4\uC6C0\uB9D0
FileChooser.directoryOpenButtonToolTip.textAndMnemonic=\uC120\uD0DD\uB41C \uB514\uB809\uD1A0\uB9AC \uC5F4\uAE30
--- a/jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/swing/internal/plaf/metal/resources/metal_sv.properties Thu Oct 03 19:18:54 2013 +0100
@@ -20,8 +20,8 @@
FileChooser.lookInLabel.textAndMnemonic=Leta &i:
FileChooser.saveInLabel.textAndMnemonic=Spara i:
-FileChooser.fileNameLabel.textAndMnemonic=Fil&namn:
-FileChooser.folderNameLabel.textAndMnemonic=Mapp&namn:
+FileChooser.fileNameLabel.textAndMnemonic=&Fil:
+FileChooser.folderNameLabel.textAndMnemonic=&Mapp:
FileChooser.filesOfTypeLabel.textAndMnemonic=Mapp&namn:
FileChooser.upFolderToolTip.textAndMnemonic=Upp en niv\u00E5
FileChooser.upFolderAccessibleName=Upp
--- a/jdk/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -196,19 +196,7 @@
try {
if (home.length() > 0) {
- /*
- * A wrinkle in the environment:
- * 64-bit executables are stored under $JAVA_HOME/bin/os_arch
- * 32-bit executables are stored under $JAVA_HOME/bin
- */
- String os_arch = System.getProperty("os.arch");
- if ("SunOS".equals(System.getProperty("os.name")) &&
- ("sparcv9".equals(os_arch) || "amd64".equals(os_arch))) {
- exePath = home + File.separator + "bin" + File.separator +
- os_arch + File.separator + exe;
- } else {
- exePath = home + File.separator + "bin" + File.separator + exe;
- }
+ exePath = home + File.separator + "bin" + File.separator + exe;
} else {
exePath = exe;
}
--- a/jdk/src/share/classes/java/awt/AWTKeyStroke.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/AWTKeyStroke.java Thu Oct 03 19:18:54 2013 +0100
@@ -67,7 +67,7 @@
public class AWTKeyStroke implements Serializable {
static final long serialVersionUID = -6430539691155161871L;
- private static Map modifierKeywords;
+ private static Map<String, Integer> modifierKeywords;
/**
* Associates VK_XXX (as a String) with code (as Integer). This is
* done to avoid the overhead of the reflective call to find the
@@ -85,8 +85,8 @@
* AWTKeyStroke class.
* Must be called under locked AWTKeyStro
*/
- private static Class getAWTKeyStrokeClass() {
- Class clazz = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
+ private static Class<AWTKeyStroke> getAWTKeyStrokeClass() {
+ Class<AWTKeyStroke> clazz = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
if (clazz == null) {
clazz = AWTKeyStroke.class;
AppContext.getAppContext().put(AWTKeyStroke.class, AWTKeyStroke.class);
@@ -182,7 +182,7 @@
throw new IllegalArgumentException("subclass cannot be null");
}
synchronized (AWTKeyStroke.class) {
- Class keyStrokeClass = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
+ Class<AWTKeyStroke> keyStrokeClass = (Class)AppContext.getAppContext().get(AWTKeyStroke.class);
if (keyStrokeClass != null && keyStrokeClass.equals(subclass)){
// Already registered
return;
@@ -229,8 +229,8 @@
*/
private static Constructor getCtor(final Class clazz)
{
- Object ctor = AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+ Constructor ctor = AccessController.doPrivileged(new PrivilegedAction<Constructor>() {
+ public Constructor run() {
try {
Constructor ctor = clazz.getDeclaredConstructor((Class[]) null);
if (ctor != null) {
@@ -249,17 +249,17 @@
private static synchronized AWTKeyStroke getCachedStroke
(char keyChar, int keyCode, int modifiers, boolean onKeyRelease)
{
- Map cache = (Map)AppContext.getAppContext().get(APP_CONTEXT_CACHE_KEY);
+ Map<AWTKeyStroke, AWTKeyStroke> cache = (Map)AppContext.getAppContext().get(APP_CONTEXT_CACHE_KEY);
AWTKeyStroke cacheKey = (AWTKeyStroke)AppContext.getAppContext().get(APP_CONTEXT_KEYSTROKE_KEY);
if (cache == null) {
- cache = new HashMap();
+ cache = new HashMap<>();
AppContext.getAppContext().put(APP_CONTEXT_CACHE_KEY, cache);
}
if (cacheKey == null) {
try {
- Class clazz = getAWTKeyStrokeClass();
+ Class<AWTKeyStroke> clazz = getAWTKeyStrokeClass();
cacheKey = (AWTKeyStroke)getCtor(clazz).newInstance((Object[]) null);
AppContext.getAppContext().put(APP_CONTEXT_KEYSTROKE_KEY, cacheKey);
} catch (InstantiationException e) {
@@ -485,11 +485,11 @@
* If typed, pressed or released is not specified, pressed is assumed. Here
* are some examples:
* <pre>
- * "INSERT" => getAWTKeyStroke(KeyEvent.VK_INSERT, 0);
- * "control DELETE" => getAWTKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
- * "alt shift X" => getAWTKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
- * "alt shift released X" => getAWTKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
- * "typed a" => getAWTKeyStroke('a');
+ * "INSERT" => getAWTKeyStroke(KeyEvent.VK_INSERT, 0);
+ * "control DELETE" => getAWTKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
+ * "alt shift X" => getAWTKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
+ * "alt shift released X" => getAWTKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
+ * "typed a" => getAWTKeyStroke('a');
* </pre>
*
* @param s a String formatted as described above
@@ -513,7 +513,7 @@
synchronized (AWTKeyStroke.class) {
if (modifierKeywords == null) {
- Map uninitializedMap = new HashMap(8, 1.0f);
+ Map<String, Integer> uninitializedMap = new HashMap<>(8, 1.0f);
uninitializedMap.put("shift",
Integer.valueOf(InputEvent.SHIFT_DOWN_MASK
|InputEvent.SHIFT_MASK));
@@ -861,12 +861,12 @@
}
class VKCollection {
- Map code2name;
- Map name2code;
+ Map<Integer, String> code2name;
+ Map<String, Integer> name2code;
public VKCollection() {
- code2name = new HashMap();
- name2code = new HashMap();
+ code2name = new HashMap<>();
+ name2code = new HashMap<>();
}
public synchronized void put(String name, Integer code) {
--- a/jdk/src/share/classes/java/awt/CardLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/CardLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,7 +66,7 @@
* pairs of components and their names.
* @see java.util.Vector
*/
- Vector vector = new Vector();
+ Vector<Card> vector = new Vector<>();
/*
* A pair of Component and String that represents its name.
@@ -570,10 +570,10 @@
if (f.defaulted("vector")) {
// pre-1.4 stream
- Hashtable tab = (Hashtable)f.get("tab", null);
- vector = new Vector();
+ Hashtable<String, Component> tab = (Hashtable)f.get("tab", null);
+ vector = new Vector<>();
if (tab != null && !tab.isEmpty()) {
- for (Enumeration e = tab.keys() ; e.hasMoreElements() ; ) {
+ for (Enumeration<String> e = tab.keys() ; e.hasMoreElements() ; ) {
String key = (String)e.nextElement();
Component comp = (Component)tab.get(key);
vector.add(new Card(key, comp));
@@ -594,7 +594,7 @@
private void writeObject(ObjectOutputStream s)
throws IOException
{
- Hashtable tab = new Hashtable();
+ Hashtable<String, Component> tab = new Hashtable<>();
int ncomponents = vector.size();
for (int i = 0; i < ncomponents; i++) {
Card card = (Card)vector.get(i);
--- a/jdk/src/share/classes/java/awt/Component.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Component.java Thu Oct 03 19:18:54 2013 +0100
@@ -972,6 +972,10 @@
public AccessControlContext getAccessControlContext(Component comp) {
return comp.getAccessControlContext();
}
+
+ public void revalidateSynchronously(Component comp) {
+ comp.revalidateSynchronously();
+ }
});
}
@@ -2022,7 +2026,7 @@
* @return an instance of <code>Point</code> representing
* the top-left corner of the component's bounds in the
* coordinate space of the screen
- * @throws <code>IllegalComponentStateException</code> if the
+ * @throws IllegalComponentStateException if the
* component is not showing on the screen
* @see #setLocation
* @see #getLocation
@@ -2977,6 +2981,13 @@
* @since 1.7
*/
public void revalidate() {
+ revalidateSynchronously();
+ }
+
+ /**
+ * Revalidates the component synchronously.
+ */
+ final void revalidateSynchronously() {
synchronized (getTreeLock()) {
invalidate();
--- a/jdk/src/share/classes/java/awt/Container.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Container.java Thu Oct 03 19:18:54 2013 +0100
@@ -258,6 +258,12 @@
public void validateUnconditionally(Container cont) {
cont.validateUnconditionally();
}
+
+ @Override
+ public Component findComponentAt(Container cont, int x, int y,
+ boolean ignoreEnabled) {
+ return cont.findComponentAt(x, y, ignoreEnabled);
+ }
});
}
@@ -2651,7 +2657,6 @@
* behavior. Setting 'ignoreEnabled' to 'false' bypasses disabled
* Components during the search. This behavior is used by the
* lightweight cursor support in sun.awt.GlobalCursorManager.
- * The cursor code calls this function directly via native code.
*
* The addition of this feature is temporary, pending the
* adoption of new, public API which exports this feature.
--- a/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Thu Oct 03 19:18:54 2013 +0100
@@ -85,7 +85,7 @@
* list should be reused if possible.
*/
transient private Container cachedRoot;
- transient private List cachedCycle;
+ transient private List<Component> cachedCycle;
/*
* We suppose to use getFocusTraversalCycle & getComponentIndex methods in order
@@ -111,7 +111,7 @@
return cycle.indexOf(aComponent);
}
- private void enumerateCycle(Container container, List cycle) {
+ private void enumerateCycle(Container container, List<Component> cycle) {
if (!(container.isVisible() && container.isDisplayable())) {
return;
}
--- a/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -808,13 +808,13 @@
}
}
boolean stopPostProcessing = false;
- java.util.List processors = getKeyEventPostProcessors();
+ java.util.List<KeyEventPostProcessor> processors = getKeyEventPostProcessors();
if (processors != null) {
- for (java.util.Iterator iter = processors.iterator();
+ for (java.util.Iterator<KeyEventPostProcessor> iter = processors.iterator();
!stopPostProcessing && iter.hasNext(); )
{
- stopPostProcessing = (((KeyEventPostProcessor)(iter.next())).
- postProcessKeyEvent(e));
+ stopPostProcessing = iter.next().
+ postProcessKeyEvent(e);
}
}
if (!stopPostProcessing) {
@@ -1059,12 +1059,12 @@
return true;
}
- java.util.List dispatchers = getKeyEventDispatchers();
+ java.util.List<KeyEventDispatcher> dispatchers = getKeyEventDispatchers();
if (dispatchers != null) {
- for (java.util.Iterator iter = dispatchers.iterator();
+ for (java.util.Iterator<KeyEventDispatcher> iter = dispatchers.iterator();
iter.hasNext(); )
{
- if (((KeyEventDispatcher)(iter.next())).
+ if (iter.next().
dispatchKeyEvent(ke))
{
return true;
@@ -1131,7 +1131,7 @@
oppStroke = AWTKeyStroke.getAWTKeyStroke(stroke.getKeyCode(),
stroke.getModifiers(),
!stroke.isOnKeyRelease());
- Set toTest;
+ Set<AWTKeyStroke> toTest;
boolean contains, containsOpp;
toTest = focusedComponent.getFocusTraversalKeys(
@@ -1246,7 +1246,7 @@
* any) should be cancelled.
*
* @param after the timestamp specified in the call to
- * <code>enqueueKeyEvents</code>, or any value < 0
+ * <code>enqueueKeyEvents</code>, or any value < 0
* @param untilFocused the Component specified in the call to
* <code>enqueueKeyEvents</code>
* @see #enqueueKeyEvents
--- a/jdk/src/share/classes/java/awt/Dialog.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Dialog.java Thu Oct 03 19:18:54 2013 +0100
@@ -61,7 +61,7 @@
* <p>
* The default layout for a dialog is <code>BorderLayout</code>.
* <p>
- * A dialog may have its native decorations (i.e. Frame & Titlebar) turned off
+ * A dialog may have its native decorations (i.e. Frame & Titlebar) turned off
* with <code>setUndecorated</code>. This can only be done while the dialog
* is not {@link Component#isDisplayable() displayable}.
* <p>
--- a/jdk/src/share/classes/java/awt/Event.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Event.java Thu Oct 03 19:18:54 2013 +0100
@@ -524,7 +524,7 @@
* This field has been replaced by MouseEvent.getClickCount().
*
* @serial
- * @see java.awt.event.MouseEvent#getClickCount().
+ * @see java.awt.event.MouseEvent#getClickCount()
*/
public int clickCount;
--- a/jdk/src/share/classes/java/awt/EventQueue.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/EventQueue.java Thu Oct 03 19:18:54 2013 +0100
@@ -690,7 +690,10 @@
final Object src = event.getSource();
final PrivilegedAction<Void> action = new PrivilegedAction<Void>() {
public Void run() {
- if (fwDispatcher == null) {
+ // In case fwDispatcher is installed and we're already on the
+ // dispatch thread (e.g. performing DefaultKeyboardFocusManager.sendMessage),
+ // dispatch the event straight away.
+ if (fwDispatcher == null || isDispatchThreadImpl()) {
dispatchEventImpl(event, src);
} else {
fwDispatcher.scheduleDispatch(new Runnable() {
--- a/jdk/src/share/classes/java/awt/Frame.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Frame.java Thu Oct 03 19:18:54 2013 +0100
@@ -265,12 +265,12 @@
*
* <p>Note that the correct test for frame being fully maximized is
* <pre>
- * (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH
+ * (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH
* </pre>
*
* <p>To test is frame is maximized in <em>some</em> direction use
* <pre>
- * (state & Frame.MAXIMIZED_BOTH) != 0
+ * (state & Frame.MAXIMIZED_BOTH) != 0
* </pre>
*
* @see #setExtendedState(int)
--- a/jdk/src/share/classes/java/awt/GradientPaintContext.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GradientPaintContext.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,7 +41,7 @@
new DirectColorModel(24, 0x000000ff, 0x0000ff00, 0x00ff0000);
static ColorModel cachedModel;
- static WeakReference cached;
+ static WeakReference<Raster> cached;
static synchronized Raster getCachedRaster(ColorModel cm, int w, int h) {
if (cm == cachedModel) {
@@ -76,7 +76,7 @@
}
}
cachedModel = cm;
- cached = new WeakReference(ras);
+ cached = new WeakReference<>(ras);
}
double x1;
--- a/jdk/src/share/classes/java/awt/GraphicsEnvironment.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GraphicsEnvironment.java Thu Oct 03 19:18:54 2013 +0100
@@ -95,18 +95,18 @@
String nm = AccessController.doPrivileged(new GetPropertyAction("java.awt.graphicsenv", null));
try {
// long t0 = System.currentTimeMillis();
- Class geCls;
+ Class<GraphicsEnvironment> geCls;
try {
// First we try if the bootclassloader finds the requested
// class. This way we can avoid to run in a privileged block.
- geCls = Class.forName(nm);
+ geCls = (Class<GraphicsEnvironment>)Class.forName(nm);
} catch (ClassNotFoundException ex) {
// If the bootclassloader fails, we try again with the
// application classloader.
ClassLoader cl = ClassLoader.getSystemClassLoader();
- geCls = Class.forName(nm, true, cl);
+ geCls = (Class<GraphicsEnvironment>)Class.forName(nm, true, cl);
}
- ge = (GraphicsEnvironment) geCls.newInstance();
+ ge = geCls.newInstance();
// long t1 = System.currentTimeMillis();
// System.out.println("GE creation took " + (t1-t0)+ "ms.");
if (isHeadless()) {
@@ -161,7 +161,7 @@
private static boolean getHeadlessProperty() {
if (headless == null) {
java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
+ new java.security.PrivilegedAction<Object>() {
public Object run() {
String nm = System.getProperty("java.awt.headless");
--- a/jdk/src/share/classes/java/awt/GridBagConstraints.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridBagConstraints.java Thu Oct 03 19:18:54 2013 +0100
@@ -30,7 +30,7 @@
* <code>GridBagLayout</code> class.
*
* @author Doug Stein
- * @author Bill Spitzak (orignial NeWS & OLIT implementation)
+ * @author Bill Spitzak (orignial NeWS & OLIT implementation)
* @see java.awt.GridBagLayout
* @since JDK1.0
*/
--- a/jdk/src/share/classes/java/awt/GridBagLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridBagLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -120,9 +120,9 @@
* Orientation relative values are interpreted relative to the container's
* <code>ComponentOrientation</code> property while absolute values
* are not. Baseline relative values are calculated relative to the
- * baseline. Valid values are:</dd>
+ * baseline. Valid values are:
* <p>
- * <center><table BORDER=0 COLS=3 WIDTH=800
+ * <center><table BORDER=0 WIDTH=800
* SUMMARY="absolute, relative and baseline values as described above">
* <tr>
* <th><P ALIGN="LEFT">Absolute Values</th>
@@ -131,6 +131,7 @@
* </tr>
* <tr>
* <td>
+ * <ul style="list-style-type:none">
* <li><code>GridBagConstraints.NORTH</code></li>
* <li><code>GridBagConstraints.SOUTH</code></li>
* <li><code>GridBagConstraints.WEST</code></li>
@@ -140,8 +141,10 @@
* <li><code>GridBagConstraints.SOUTHWEST</code></li>
* <li><code>GridBagConstraints.SOUTHEAST</code></li>
* <li><code>GridBagConstraints.CENTER</code> (the default)</li>
+ * </ul>
* </td>
* <td>
+ * <ul style="list-style-type:none">
* <li><code>GridBagConstraints.PAGE_START</code></li>
* <li><code>GridBagConstraints.PAGE_END</code></li>
* <li><code>GridBagConstraints.LINE_START</code></li>
@@ -150,8 +153,10 @@
* <li><code>GridBagConstraints.FIRST_LINE_END</code></li>
* <li><code>GridBagConstraints.LAST_LINE_START</code></li>
* <li><code>GridBagConstraints.LAST_LINE_END</code></li>
+ * </ul>
* </td>
* <td>
+ * <ul style="list-style-type:none">
* <li><code>GridBagConstraints.BASELINE</code></li>
* <li><code>GridBagConstraints.BASELINE_LEADING</code></li>
* <li><code>GridBagConstraints.BASELINE_TRAILING</code></li>
@@ -161,9 +166,10 @@
* <li><code>GridBagConstraints.BELOW_BASELINE</code></li>
* <li><code>GridBagConstraints.BELOW_BASELINE_LEADING</code></li>
* <li><code>GridBagConstraints.BELOW_BASELINE_TRAILING</code></li>
+ * </ul>
* </td>
* </tr>
- * </table></center><p>
+ * </table></center>
* <dt>{@link GridBagConstraints#weightx},
* {@link GridBagConstraints#weighty}
* <dd>Used to determine how to distribute space, which is
@@ -246,7 +252,7 @@
* left-to-right container and Figure 3 shows the layout for a horizontal,
* right-to-left container.
* <p>
- * <center><table COLS=2 WIDTH=600 summary="layout">
+ * <center><table WIDTH=600 summary="layout">
* <tr ALIGN=CENTER>
* <td>
* <img src="doc-files/GridBagLayout-1.gif" alt="The preceeding text describes this graphic (Figure 1)." ALIGN=center HSPACE=10 VSPACE=7>
@@ -349,7 +355,7 @@
* </pre></blockquote><hr>
* <p>
* @author Doug Stein
- * @author Bill Spitzak (orignial NeWS & OLIT implementation)
+ * @author Bill Spitzak (orignial NeWS & OLIT implementation)
* @see java.awt.GridBagConstraints
* @see java.awt.GridBagLayoutInfo
* @see java.awt.ComponentOrientation
--- a/jdk/src/share/classes/java/awt/GridLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -55,7 +55,7 @@
* If the container's <code>ComponentOrientation</code> property is horizontal
* and right-to-left, the example produces the output shown in Figure 2.
* <p>
- * <center><table COLS=2 WIDTH=600 summary="layout">
+ * <center><table WIDTH=600 summary="layout">
* <tr ALIGN=CENTER>
* <td><img SRC="doc-files/GridLayout-1.gif"
* alt="Shows 6 buttons in rows of 2. Row 1 shows buttons 1 then 2.
--- a/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -348,7 +348,7 @@
* Component of those Windows that has no such array of its own explicitly
* set.
*/
- private Set[] defaultFocusTraversalKeys = new Set[4];
+ private Set<AWTKeyStroke>[] defaultFocusTraversalKeys = new Set[4];
/**
* The current focus cycle root. If the focus owner is itself a focus cycle
@@ -376,7 +376,7 @@
* KeyEventDispatchers are registered, this field may be null or refer to
* a List of length 0.
*/
- private java.util.LinkedList keyEventDispatchers;
+ private java.util.LinkedList<KeyEventDispatcher> keyEventDispatchers;
/**
* This KeyboardFocusManager's KeyEventPostProcessor chain. The List does
@@ -385,12 +385,12 @@
* If no other KeyEventPostProcessors are registered, this field may be
* null or refer to a List of length 0.
*/
- private java.util.LinkedList keyEventPostProcessors;
+ private java.util.LinkedList<KeyEventPostProcessor> keyEventPostProcessors;
/**
* Maps Windows to those Windows' most recent focus owners.
*/
- private static java.util.Map mostRecentFocusOwners = new WeakHashMap();
+ private static java.util.Map<Window, WeakReference<Component>> mostRecentFocusOwners = new WeakHashMap<>();
/**
* We cache the permission used to verify that the calling thread is
@@ -431,7 +431,7 @@
*/
public KeyboardFocusManager() {
for (int i = 0; i < TRAVERSAL_KEY_LENGTH; i++) {
- Set work_set = new HashSet();
+ Set<AWTKeyStroke> work_set = new HashSet<>();
for (int j = 0; j < defaultFocusTraversalKeyStrokes[i].length; j++) {
work_set.add(defaultFocusTraversalKeyStrokes[i][j]);
}
@@ -1125,7 +1125,7 @@
throw new IllegalArgumentException("cannot set null Set of default focus traversal keys");
}
- Set oldKeys;
+ Set<AWTKeyStroke> oldKeys;
synchronized (this) {
for (AWTKeyStroke keystroke : keystrokes) {
@@ -1153,7 +1153,7 @@
oldKeys = defaultFocusTraversalKeys[id];
defaultFocusTraversalKeys[id] =
- Collections.unmodifiableSet(new HashSet(keystrokes));
+ Collections.unmodifiableSet(new HashSet<>(keystrokes));
}
firePropertyChange(defaultFocusTraversalKeyPropertyNames[id],
@@ -1699,7 +1699,7 @@
if (dispatcher != null) {
synchronized (this) {
if (keyEventDispatchers == null) {
- keyEventDispatchers = new java.util.LinkedList();
+ keyEventDispatchers = new java.util.LinkedList<>();
}
keyEventDispatchers.add(dispatcher);
}
@@ -1787,7 +1787,7 @@
if (processor != null) {
synchronized (this) {
if (keyEventPostProcessors == null) {
- keyEventPostProcessors = new java.util.LinkedList();
+ keyEventPostProcessors = new java.util.LinkedList<>();
}
keyEventPostProcessors.add(processor);
}
@@ -1865,9 +1865,9 @@
// of Component.parent fields. Since WeakHasMap refers to its
// values strongly, we need to break the strong link from the
// value (component) back to its key (window).
- WeakReference weakValue = null;
+ WeakReference<Component> weakValue = null;
if (component != null) {
- weakValue = new WeakReference(component);
+ weakValue = new WeakReference<>(component);
}
mostRecentFocusOwners.put(window, weakValue);
}
@@ -1906,7 +1906,7 @@
* javax.swing.JComponent.runInputVerifier() using reflection.
*/
static synchronized Component getMostRecentFocusOwner(Window window) {
- WeakReference weakValue =
+ WeakReference<Component> weakValue =
(WeakReference)mostRecentFocusOwners.get(window);
return weakValue == null ? null : (Component)weakValue.get();
}
@@ -2034,7 +2034,7 @@
* oldest</b> timestamp (if any) should be cancelled.
*
* @param after the timestamp specified in the call to
- * <code>enqueueKeyEvents</code>, or any value < 0
+ * <code>enqueueKeyEvents</code>, or any value < 0
* @param untilFocused the Component specified in the call to
* <code>enqueueKeyEvents</code>
* @see #enqueueKeyEvents
@@ -2649,11 +2649,11 @@
Component lastFocusOwner = null;
Component currentFocusOwner = null;
- for (Iterator iter = localLightweightRequests.iterator(); iter.hasNext(); ) {
+ for (Iterator<KeyboardFocusManager.LightweightFocusRequest> iter = localLightweightRequests.iterator(); iter.hasNext(); ) {
currentFocusOwner = manager.getGlobalFocusOwner();
LightweightFocusRequest lwFocusRequest =
- (LightweightFocusRequest)iter.next();
+ iter.next();
/*
* WARNING: This is based on DKFM's logic solely!
@@ -2978,12 +2978,12 @@
if (hwFocusRequest != null) {
heavyweightRequests.removeFirst();
if (hwFocusRequest.lightweightRequests != null) {
- for (Iterator lwIter = hwFocusRequest.lightweightRequests.
+ for (Iterator<KeyboardFocusManager.LightweightFocusRequest> lwIter = hwFocusRequest.lightweightRequests.
iterator();
lwIter.hasNext(); )
{
manager.dequeueKeyEvents
- (-1, ((LightweightFocusRequest)lwIter.next()).
+ (-1, lwIter.next().
component);
}
}
@@ -3063,8 +3063,8 @@
// Accessor to private field isProxyActive of KeyEvent
private static boolean isProxyActiveImpl(KeyEvent e) {
if (proxyActive == null) {
- proxyActive = (Field) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+ proxyActive = AccessController.doPrivileged(new PrivilegedAction<Field>() {
+ public Field run() {
Field field = null;
try {
field = KeyEvent.class.getDeclaredField("isProxyActive");
--- a/jdk/src/share/classes/java/awt/MenuBar.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/MenuBar.java Thu Oct 03 19:18:54 2013 +0100
@@ -43,7 +43,7 @@
* This is what a menu bar might look like:
* <p>
* <img src="doc-files/MenuBar-1.gif"
- * <alt="Diagram of MenuBar containing 2 menus: Examples and Options.
+ * alt="Diagram of MenuBar containing 2 menus: Examples and Options.
* Examples menu is expanded showing items: Basic, Simple, Check, and More Examples."
* ALIGN=center HSPACE=10 VSPACE=7>
* <p>
--- a/jdk/src/share/classes/java/awt/ScrollPane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ScrollPane.java Thu Oct 03 19:18:54 2013 +0100
@@ -247,7 +247,7 @@
* component is removed and the new one is added.
* @param comp the component to be added
* @param constraints not applicable
- * @param index position of child component (must be <= 0)
+ * @param index position of child component (must be <= 0)
*/
protected final void addImpl(Component comp, Object constraints, int index) {
synchronized (getTreeLock()) {
--- a/jdk/src/share/classes/java/awt/ScrollPaneAdjustable.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ScrollPaneAdjustable.java Thu Oct 03 19:18:54 2013 +0100
@@ -220,7 +220,7 @@
* This method is public for this class to properly implement
* <code>Adjustable</code> interface.
*
- * @throws <code>AWTError</code> Always throws an error when called.
+ * @throws AWTError Always throws an error when called.
*/
public void setMinimum(int min) {
throw new AWTError(SCROLLPANE_ONLY);
@@ -237,7 +237,7 @@
* This method is public for this class to properly implement
* <code>Adjustable</code> interface.
*
- * @throws <code>AWTError</code> Always throws an error when called.
+ * @throws AWTError Always throws an error when called.
*/
public void setMaximum(int max) {
throw new AWTError(SCROLLPANE_ONLY);
@@ -274,7 +274,7 @@
* This method is public for this class to properly implement
* <code>Adjustable</code> interface.
*
- * @throws <code>AWTError</code> Always throws an error when called.
+ * @throws AWTError Always throws an error when called.
*/
public void setVisibleAmount(int v) {
throw new AWTError(SCROLLPANE_ONLY);
--- a/jdk/src/share/classes/java/awt/Scrollbar.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Scrollbar.java Thu Oct 03 19:18:54 2013 +0100
@@ -715,6 +715,9 @@
* The unit increment must be greater than zero.
* Attepts to set the unit increment to a value lower than 1
* will result in a value of 1 being set.
+ * <p>
+ * In some operating systems, this property
+ * can be ignored by the underlying controls.
*
* @param v the amount by which to increment or decrement
* the scroll bar's value
@@ -752,6 +755,9 @@
* scroll bar, generally through a mouse or keyboard gesture
* that the scroll bar receives as an adjustment event.
* The unit increment must be greater than zero.
+ * <p>
+ * In some operating systems, this property
+ * can be ignored by the underlying controls.
*
* @return the unit increment of this scroll bar
* @see java.awt.Scrollbar#setUnitIncrement
--- a/jdk/src/share/classes/java/awt/SequencedEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/SequencedEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -49,7 +49,7 @@
private static final int ID =
java.awt.event.FocusEvent.FOCUS_LAST + 1;
- private static final LinkedList list = new LinkedList();
+ private static final LinkedList<SequencedEvent> list = new LinkedList<>();
private final AWTEvent nested;
private AppContext appContext;
--- a/jdk/src/share/classes/java/awt/SystemTray.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/SystemTray.java Thu Oct 03 19:18:54 2013 +0100
@@ -63,8 +63,8 @@
*
* <p>The following code snippet demonstrates how to access
* and customize the system tray:
+ * <pre>
* <code>
- * <pre>
* {@link TrayIcon} trayIcon = null;
* if (SystemTray.isSupported()) {
* // get the SystemTray instance
@@ -109,8 +109,8 @@
* trayIcon.{@link TrayIcon#setImage(java.awt.Image) setImage}(updatedImage);
* }
* // ...
+ * </code>
* </pre>
- * </code>
*
* @since 1.6
* @see TrayIcon
--- a/jdk/src/share/classes/java/awt/TextComponent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TextComponent.java Thu Oct 03 19:18:54 2013 +0100
@@ -972,7 +972,7 @@
* coordinates. If the index is invalid a null rectangle
* is returned.
*
- * @param i the index into the String >= 0
+ * @param i the index into the String >= 0
* @return the screen coordinates of the character's bounding box
*/
public Rectangle getCharacterBounds(int i) {
@@ -982,7 +982,7 @@
/**
* Returns the number of characters (valid indicies)
*
- * @return the number of characters >= 0
+ * @return the number of characters >= 0
*/
public int getCharCount() {
return TextComponent.this.getText().length();
@@ -1018,7 +1018,7 @@
* Return 0 if the text is empty, or the caret position
* if no selection.
*
- * @return the index into the text of the start of the selection >= 0
+ * @return the index into the text of the start of the selection >= 0
*/
public int getSelectionStart() {
return TextComponent.this.getSelectionStart();
@@ -1031,7 +1031,7 @@
* Return 0 if the text is empty, or the caret position
* if no selection.
*
- * @return the index into teh text of the end of the selection >= 0
+ * @return the index into teh text of the end of the selection >= 0
*/
public int getSelectionEnd() {
return TextComponent.this.getSelectionEnd();
@@ -1056,7 +1056,7 @@
*
* @param part the AccessibleText.CHARACTER, AccessibleText.WORD,
* or AccessibleText.SENTENCE to retrieve
- * @param index an index within the text >= 0
+ * @param index an index within the text >= 0
* @return the letter, word, or sentence,
* null for an invalid index or part
*/
@@ -1122,7 +1122,7 @@
*
* @param part the AccessibleText.CHARACTER, AccessibleText.WORD,
* or AccessibleText.SENTENCE to retrieve
- * @param index an index within the text >= 0
+ * @param index an index within the text >= 0
* @return the letter, word, or sentence, null for an invalid
* index or part
*/
@@ -1175,7 +1175,7 @@
*
* @param part the AccessibleText.CHARACTER, AccessibleText.WORD,
* or AccessibleText.SENTENCE to retrieve
- * @param index an index within the text >= 0
+ * @param index an index within the text >= 0
* @return the letter, word, or sentence, null for an invalid index
* or part
*/
--- a/jdk/src/share/classes/java/awt/TextField.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TextField.java Thu Oct 03 19:18:54 2013 +0100
@@ -503,7 +503,7 @@
*
* @see #addActionListener
* @see #removeActionListener
- * @see java.awt.event#ActionListener
+ * @see java.awt.event.ActionListener
* @since 1.4
*/
public synchronized ActionListener[] getActionListeners() {
--- a/jdk/src/share/classes/java/awt/TexturePaintContext.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TexturePaintContext.java Thu Oct 03 19:18:54 2013 +0100
@@ -73,11 +73,11 @@
WritableRaster raster = bufImg.getRaster();
ColorModel cm = bufImg.getColorModel();
int maxw = devBounds.width;
- Object val = hints.get(hints.KEY_INTERPOLATION);
+ Object val = hints.get(RenderingHints.KEY_INTERPOLATION);
boolean filter =
(val == null
- ? (hints.get(hints.KEY_RENDERING) == hints.VALUE_RENDER_QUALITY)
- : (val != hints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR));
+ ? (hints.get(RenderingHints.KEY_RENDERING) == RenderingHints.VALUE_RENDER_QUALITY)
+ : (val != RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR));
if (raster instanceof IntegerInterleavedRaster &&
(!filter || isFilterableDCM(cm)))
{
@@ -234,8 +234,8 @@
return outRas;
}
- private static WeakReference xrgbRasRef;
- private static WeakReference argbRasRef;
+ private static WeakReference<Raster> xrgbRasRef;
+ private static WeakReference<Raster> argbRasRef;
synchronized static WritableRaster makeRaster(ColorModel cm,
Raster srcRas,
@@ -278,13 +278,13 @@
return;
}
if (xrgbmodel == cm) {
- xrgbRasRef = new WeakReference(outRas);
+ xrgbRasRef = new WeakReference<>(outRas);
} else if (argbmodel == cm) {
- argbRasRef = new WeakReference(outRas);
+ argbRasRef = new WeakReference<>(outRas);
}
}
- private static WeakReference byteRasRef;
+ private static WeakReference<Raster> byteRasRef;
synchronized static WritableRaster makeByteRaster(Raster srcRas,
int w, int h)
@@ -307,7 +307,7 @@
if (outRas == null) {
return;
}
- byteRasRef = new WeakReference(outRas);
+ byteRasRef = new WeakReference<>(outRas);
}
public abstract WritableRaster makeRaster(int w, int h);
--- a/jdk/src/share/classes/java/awt/Toolkit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Toolkit.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -56,6 +56,7 @@
import sun.awt.NullComponentPeer;
import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
+import sun.awt.AWTAccessor;
import sun.security.util.SecurityConstants;
import sun.util.CoreResourceBundleControl;
@@ -467,7 +468,7 @@
GraphicsEnvironment.checkHeadless();
}
-/**
+ /**
* Controls whether the layout of Containers is validated dynamically
* during resizing, or statically, after resizing is complete.
* Use {@code isDynamicLayoutActive()} to detect if this feature enabled
@@ -497,9 +498,12 @@
* @see java.awt.GraphicsEnvironment#isHeadless
* @since 1.4
*/
- public void setDynamicLayout(boolean dynamic)
+ public void setDynamicLayout(final boolean dynamic)
throws HeadlessException {
GraphicsEnvironment.checkHeadless();
+ if (this != getDefaultToolkit()) {
+ getDefaultToolkit().setDynamicLayout(dynamic);
+ }
}
/**
@@ -1239,7 +1243,8 @@
}
/**
- * Emits an audio beep.
+ * Emits an audio beep depending on native system settings and hardware
+ * capabilities.
* @since JDK1.1
*/
public abstract void beep();
@@ -1598,6 +1603,12 @@
* here, so that only one copy is maintained.
*/
private static ResourceBundle resources;
+ private static ResourceBundle platformResources;
+
+ // called by platform toolkit
+ private static void setPlatformResources(ResourceBundle bundle) {
+ platformResources = bundle;
+ }
/**
* Initialize JNI field and method ids
@@ -1646,6 +1657,14 @@
}
static {
+ AWTAccessor.setToolkitAccessor(
+ new AWTAccessor.ToolkitAccessor() {
+ @Override
+ public void setPlatformResources(ResourceBundle bundle) {
+ Toolkit.setPlatformResources(bundle);
+ }
+ });
+
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Void>() {
public Void run() {
@@ -1673,6 +1692,15 @@
* This method returns defaultValue if the property is not found.
*/
public static String getProperty(String key, String defaultValue) {
+ // first try platform specific bundle
+ if (platformResources != null) {
+ try {
+ return platformResources.getString(key);
+ }
+ catch (MissingResourceException e) {}
+ }
+
+ // then shared one
if (resources != null) {
try {
return resources.getString(key);
--- a/jdk/src/share/classes/java/awt/WaitDispatchSupport.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/WaitDispatchSupport.java Thu Oct 03 19:18:54 2013 +0100
@@ -224,8 +224,8 @@
// starts. Thus, the enter() method will not hang.
//
// Event pump should be privileged. See 6300270.
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
run.run();
return null;
}
--- a/jdk/src/share/classes/java/awt/Window.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Window.java Thu Oct 03 19:18:54 2013 +0100
@@ -1075,7 +1075,6 @@
* Hide this Window, its subcomponents, and all of its owned children.
* The Window and its subcomponents can be made visible again
* with a call to {@code show}.
- * </p>
* @see #show
* @see #dispose
* @deprecated As of JDK version 1.5, replaced by
@@ -3373,27 +3372,27 @@
* this property of the Window.
* <p>
* For example, after the following code is executed:
- * <pre><blockquote>
+ * <pre>
* setLocationByPlatform(true);
* setVisible(true);
* boolean flag = isLocationByPlatform();
- * </blockquote></pre>
+ * </pre>
* The window will be shown at platform's default location and
* {@code flag} will be {@code false}.
* <p>
* In the following sample:
- * <pre><blockquote>
+ * <pre>
* setLocationByPlatform(true);
* setLocation(10, 10);
* boolean flag = isLocationByPlatform();
* setVisible(true);
- * </blockquote></pre>
+ * </pre>
* The window will be shown at (10, 10) and {@code flag} will be
* {@code false}.
*
* @param locationByPlatform {@code true} if this Window should appear
* at the default location, {@code false} if at the current location
- * @throws {@code IllegalComponentStateException} if the window
+ * @throws IllegalComponentStateException if the window
* is showing on screen and locationByPlatform is {@code true}.
* @see #setLocation
* @see #isShowing
--- a/jdk/src/share/classes/java/awt/datatransfer/DataFlavor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/datatransfer/DataFlavor.java Thu Oct 03 19:18:54 2013 +0100
@@ -454,7 +454,7 @@
/**
* Constructs a <code>DataFlavor</code> from a <code>mimeType</code> string.
- * The string can specify a "class=<fully specified Java class name>"
+ * The string can specify a "class=<fully specified Java class name>"
* parameter to create a <code>DataFlavor</code> with the desired
* representation class. If the string does not contain "class=" parameter,
* <code>java.io.InputStream</code> is used as default.
--- a/jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Thu Oct 03 19:18:54 2013 +0100
@@ -70,7 +70,7 @@
/**
* System singleton which maps a thread's ClassLoader to a SystemFlavorMap.
*/
- private static final WeakHashMap flavorMaps = new WeakHashMap();
+ private static final WeakHashMap<ClassLoader, FlavorMap> flavorMaps = new WeakHashMap<>();
/**
* Copied from java.util.Properties.
@@ -139,7 +139,7 @@
* native Strings.
* Do not use the field directly, use getFlavorToNative() instead.
*/
- private final Map flavorToNative = new HashMap();
+ private final Map<DataFlavor, List<String>> flavorToNative = new HashMap<>();
/**
* Accessor to flavorToNative map. Since we use lazy initialization we must
@@ -148,7 +148,7 @@
*
* @return flavorToNative
*/
- private synchronized Map getFlavorToNative() {
+ private synchronized Map<DataFlavor, List<String>> getFlavorToNative() {
if (!isMapInitialized) {
initSystemFlavorMap();
}
@@ -164,13 +164,13 @@
* Caches the result of getNativesForFlavor(). Maps DataFlavors to
* SoftReferences which reference Lists of String natives.
*/
- private Map getNativesForFlavorCache = new HashMap();
+ private Map<DataFlavor, SoftReference<List<String>>> getNativesForFlavorCache = new HashMap<>();
/**
* Caches the result getFlavorsForNative(). Maps String natives to
* SoftReferences which reference Lists of DataFlavors.
*/
- private Map getFlavorsForNativeCache = new HashMap();
+ private Map<String, SoftReference<List<DataFlavor>>> getFlavorsForNativeCache = new HashMap<>();
/**
* Dynamic mapping generation used for text mappings should not be applied
@@ -193,7 +193,7 @@
FlavorMap fm;
synchronized(flavorMaps) {
- fm = (FlavorMap)flavorMaps.get(contextClassLoader);
+ fm = flavorMaps.get(contextClassLoader);
if (fm == null) {
fm = new SystemFlavorMap();
flavorMaps.put(contextClassLoader, fm);
@@ -520,10 +520,10 @@
* the appropriate Map location, but rather will be appended to a List
* stored in that location.
*/
- private void store(Object hashed, Object listed, Map map) {
- List list = (List)map.get(hashed);
+ private <H, L> void store(H hashed, L listed, Map<H, List<L>> map) {
+ List<L> list = map.get(hashed);
if (list == null) {
- list = new ArrayList(1);
+ list = new ArrayList<>(1);
map.put(hashed, list);
}
if (!list.contains(listed)) {
@@ -537,17 +537,17 @@
* case, a new DataFlavor is synthesized, stored, and returned, if and
* only if the specified native is encoded as a Java MIME type.
*/
- private List nativeToFlavorLookup(String nat) {
+ private List<DataFlavor> nativeToFlavorLookup(String nat) {
List<DataFlavor> flavors = getNativeToFlavor().get(nat);
if (nat != null && !disabledMappingGenerationKeys.contains(nat)) {
DataTransferer transferer = DataTransferer.getInstance();
if (transferer != null) {
- List platformFlavors =
+ List<DataFlavor> platformFlavors =
transferer.getPlatformMappingsForNative(nat);
if (!platformFlavors.isEmpty()) {
if (flavors != null) {
- platformFlavors.removeAll(new HashSet(flavors));
+ platformFlavors.removeAll(new HashSet<>(flavors));
// Prepending the platform-specific mappings ensures
// that the flavors added with
// addFlavorForUnencodedNative() are at the end of
@@ -573,15 +573,15 @@
}
if (flavor != null) {
- flavors = new ArrayList(1);
+ flavors = new ArrayList<>(1);
getNativeToFlavor().put(nat, flavors);
flavors.add(flavor);
getFlavorsForNativeCache.remove(nat);
getFlavorsForNativeCache.remove(null);
- List natives = (List)getFlavorToNative().get(flavor);
+ List<String> natives = getFlavorToNative().get(flavor);
if (natives == null) {
- natives = new ArrayList(1);
+ natives = new ArrayList<>(1);
getFlavorToNative().put(flavor, natives);
}
natives.add(nat);
@@ -590,7 +590,7 @@
}
}
- return (flavors != null) ? flavors : new ArrayList(0);
+ return (flavors != null) ? flavors : new ArrayList<>(0);
}
/**
@@ -601,18 +601,18 @@
* encoding the DataFlavor's MIME type. Otherwise an empty List is returned
* and 'flavorToNative' remains unaffected.
*/
- private List flavorToNativeLookup(final DataFlavor flav,
- final boolean synthesize) {
- List natives = (List)getFlavorToNative().get(flav);
+ private List<String> flavorToNativeLookup(final DataFlavor flav,
+ final boolean synthesize) {
+ List<String> natives = getFlavorToNative().get(flav);
if (flav != null && !disabledMappingGenerationKeys.contains(flav)) {
DataTransferer transferer = DataTransferer.getInstance();
if (transferer != null) {
- List platformNatives =
+ List<String> platformNatives =
transferer.getPlatformMappingsForFlavor(flav);
if (!platformNatives.isEmpty()) {
if (natives != null) {
- platformNatives.removeAll(new HashSet(natives));
+ platformNatives.removeAll(new HashSet<>(natives));
// Prepend the platform-specific mappings to ensure
// that the natives added with
// addUnencodedNativeForFlavor() are at the end of
@@ -627,7 +627,7 @@
if (natives == null) {
if (synthesize) {
String encoded = encodeDataFlavor(flav);
- natives = new ArrayList(1);
+ natives = new ArrayList<>(1);
getFlavorToNative().put(flav, natives);
natives.add(encoded);
getNativesForFlavorCache.remove(flav);
@@ -635,14 +635,14 @@
List<DataFlavor> flavors = getNativeToFlavor().get(encoded);
if (flavors == null) {
- flavors = new ArrayList(1);
+ flavors = new ArrayList<>(1);
getNativeToFlavor().put(encoded, flavors);
}
flavors.add(flav);
getFlavorsForNativeCache.remove(encoded);
getFlavorsForNativeCache.remove(null);
} else {
- natives = new ArrayList(0);
+ natives = new ArrayList<>(0);
}
}
@@ -675,21 +675,21 @@
* @since 1.4
*/
public synchronized List<String> getNativesForFlavor(DataFlavor flav) {
- List retval = null;
+ List<String> retval = null;
// Check cache, even for null flav
- SoftReference ref = (SoftReference)getNativesForFlavorCache.get(flav);
+ SoftReference<List<String>> ref = getNativesForFlavorCache.get(flav);
if (ref != null) {
- retval = (List)ref.get();
+ retval = ref.get();
if (retval != null) {
// Create a copy, because client code can modify the returned
// list.
- return new ArrayList(retval);
+ return new ArrayList<>(retval);
}
}
if (flav == null) {
- retval = new ArrayList<String>(getNativeToFlavor().keySet());
+ retval = new ArrayList<>(getNativeToFlavor().keySet());
} else if (disabledMappingGenerationKeys.contains(flav)) {
// In this case we shouldn't synthesize a native for this flavor,
// since its mappings were explicitly specified.
@@ -699,7 +699,7 @@
// For text/* flavors, flavor-to-native mappings specified in
// flavormap.properties are stored per flavor's base type.
if ("text".equals(flav.getPrimaryType())) {
- retval = (List)getFlavorToNative().get(flav.mimeType.getBaseType());
+ retval = getAllNativesForType(flav.mimeType.getBaseType());
if (retval != null) {
// To prevent the List stored in the map from modification.
retval = new ArrayList(retval);
@@ -707,15 +707,15 @@
}
// Also include text/plain natives, but don't duplicate Strings
- List textPlainList = (List)getFlavorToNative().get(TEXT_PLAIN_BASE_TYPE);
+ List<String> textPlainList = getAllNativesForType(TEXT_PLAIN_BASE_TYPE);
if (textPlainList != null && !textPlainList.isEmpty()) {
// To prevent the List stored in the map from modification.
// This also guarantees that removeAll() is supported.
- textPlainList = new ArrayList(textPlainList);
+ textPlainList = new ArrayList<>(textPlainList);
if (retval != null && !retval.isEmpty()) {
// Use HashSet to get constant-time performance for search.
- textPlainList.removeAll(new HashSet(retval));
+ textPlainList.removeAll(new HashSet<>(retval));
retval.addAll(textPlainList);
} else {
retval = textPlainList;
@@ -728,7 +728,7 @@
// In this branch it is guaranteed that natives explicitly
// listed for flav's MIME type were added with
// addUnencodedNativeForFlavor(), so they have lower priority.
- List explicitList =
+ List<String> explicitList =
flavorToNativeLookup(flav, !SYNTHESIZE_IF_NOT_FOUND);
// flavorToNativeLookup() never returns null.
@@ -736,14 +736,14 @@
if (!explicitList.isEmpty()) {
// To prevent the List stored in the map from modification.
// This also guarantees that removeAll() is supported.
- explicitList = new ArrayList(explicitList);
+ explicitList = new ArrayList<>(explicitList);
// Use HashSet to get constant-time performance for search.
- explicitList.removeAll(new HashSet(retval));
+ explicitList.removeAll(new HashSet<>(retval));
retval.addAll(explicitList);
}
}
} else if (DataTransferer.isFlavorNoncharsetTextType(flav)) {
- retval = (List)getFlavorToNative().get(flav.mimeType.getBaseType());
+ retval = getAllNativesForType(flav.mimeType.getBaseType());
if (retval == null || retval.isEmpty()) {
retval = flavorToNativeLookup(flav, SYNTHESIZE_IF_NOT_FOUND);
@@ -751,7 +751,7 @@
// In this branch it is guaranteed that natives explicitly
// listed for flav's MIME type were added with
// addUnencodedNativeForFlavor(), so they have lower priority.
- List explicitList =
+ List<String> explicitList =
flavorToNativeLookup(flav, !SYNTHESIZE_IF_NOT_FOUND);
// flavorToNativeLookup() never returns null.
@@ -759,10 +759,10 @@
if (!explicitList.isEmpty()) {
// To prevent the List stored in the map from modification.
// This also guarantees that add/removeAll() are supported.
- retval = new ArrayList(retval);
- explicitList = new ArrayList(explicitList);
+ retval = new ArrayList<>(retval);
+ explicitList = new ArrayList<>(explicitList);
// Use HashSet to get constant-time performance for search.
- explicitList.removeAll(new HashSet(retval));
+ explicitList.removeAll(new HashSet<>(retval));
retval.addAll(explicitList);
}
}
@@ -770,9 +770,9 @@
retval = flavorToNativeLookup(flav, SYNTHESIZE_IF_NOT_FOUND);
}
- getNativesForFlavorCache.put(flav, new SoftReference(retval));
+ getNativesForFlavorCache.put(flav, new SoftReference<>(retval));
// Create a copy, because client code can modify the returned list.
- return new ArrayList(retval);
+ return new ArrayList<>(retval);
}
/**
@@ -809,11 +809,11 @@
public synchronized List<DataFlavor> getFlavorsForNative(String nat) {
// Check cache, even for null nat
- SoftReference ref = (SoftReference)getFlavorsForNativeCache.get(nat);
+ SoftReference<List<DataFlavor>> ref = getFlavorsForNativeCache.get(nat);
if (ref != null) {
- ArrayList retval = (ArrayList)ref.get();
+ List<DataFlavor> retval = ref.get();
if (retval != null) {
- return (List)retval.clone();
+ return new ArrayList<>(retval);
}
}
@@ -859,16 +859,15 @@
}
- final ArrayList arrayList = new ArrayList(returnValue);
- getFlavorsForNativeCache.put(nat, new SoftReference(arrayList));
- return (List)arrayList.clone();
+ final List<DataFlavor> arrayList = new ArrayList<>(returnValue);
+ getFlavorsForNativeCache.put(nat, new SoftReference<>(arrayList));
+ return new ArrayList<>(arrayList);
}
- private static LinkedHashSet<DataFlavor> convertMimeTypeToDataFlavors(
+ private static Set<DataFlavor> convertMimeTypeToDataFlavors(
final String baseType) {
- final LinkedHashSet<DataFlavor> returnValue =
- new LinkedHashSet<DataFlavor>();
+ final Set<DataFlavor> returnValue = new LinkedHashSet<>();
String subType = null;
@@ -1009,11 +1008,11 @@
flavor_list.toArray(flavors);
}
- HashMap retval = new HashMap(flavors.length, 1.0f);
- for (int i = 0; i < flavors.length; i++) {
- List natives = getNativesForFlavor(flavors[i]);
- String nat = (natives.isEmpty()) ? null : (String)natives.get(0);
- retval.put(flavors[i], nat);
+ Map<DataFlavor, String> retval = new HashMap<>(flavors.length, 1.0f);
+ for (DataFlavor flavor : flavors) {
+ List<String> natives = getNativesForFlavor(flavor);
+ String nat = (natives.isEmpty()) ? null : natives.get(0);
+ retval.put(flavor, nat);
}
return retval;
@@ -1054,12 +1053,11 @@
native_list.toArray(natives);
}
- HashMap retval = new HashMap(natives.length, 1.0f);
- for (int i = 0; i < natives.length; i++) {
- List flavors = getFlavorsForNative(natives[i]);
- DataFlavor flav = (flavors.isEmpty())
- ? null : (DataFlavor)flavors.get(0);
- retval.put(natives[i], flav);
+ Map<String, DataFlavor> retval = new HashMap<>(natives.length, 1.0f);
+ for (String aNative : natives) {
+ List<DataFlavor> flavors = getFlavorsForNative(aNative);
+ DataFlavor flav = (flavors.isEmpty())? null : flavors.get(0);
+ retval.put(aNative, flav);
}
return retval;
@@ -1091,9 +1089,9 @@
throw new NullPointerException("null arguments not permitted");
}
- List natives = (List)getFlavorToNative().get(flav);
+ List<String> natives = getFlavorToNative().get(flav);
if (natives == null) {
- natives = new ArrayList(1);
+ natives = new ArrayList<>(1);
getFlavorToNative().put(flav, natives);
} else if (natives.contains(nat)) {
return;
@@ -1138,8 +1136,8 @@
}
getFlavorToNative().remove(flav);
- for (int i = 0; i < natives.length; i++) {
- addUnencodedNativeForFlavor(flav, natives[i]);
+ for (String aNative : natives) {
+ addUnencodedNativeForFlavor(flav, aNative);
}
disabledMappingGenerationKeys.add(flav);
// Clear the cache to handle the case of empty natives.
@@ -1171,9 +1169,9 @@
throw new NullPointerException("null arguments not permitted");
}
- List flavors = (List)getNativeToFlavor().get(nat);
+ List<DataFlavor> flavors = getNativeToFlavor().get(nat);
if (flavors == null) {
- flavors = new ArrayList(1);
+ flavors = new ArrayList<>(1);
getNativeToFlavor().put(nat, flavors);
} else if (flavors.contains(flav)) {
return;
@@ -1217,8 +1215,8 @@
}
getNativeToFlavor().remove(nat);
- for (int i = 0; i < flavors.length; i++) {
- addFlavorForUnencodedNative(nat, flavors[i]);
+ for (DataFlavor flavor : flavors) {
+ addFlavorForUnencodedNative(nat, flavor);
}
disabledMappingGenerationKeys.add(nat);
// Clear the cache to handle the case of empty flavors.
@@ -1321,4 +1319,18 @@
? new DataFlavor(retval_str)
: null;
}
+
+ private List<String> getAllNativesForType(String type) {
+ List<String> retval = null;
+ for (DataFlavor dataFlavor : convertMimeTypeToDataFlavors(type)) {
+ List<String> natives = getFlavorToNative().get(dataFlavor);
+ if (!natives.isEmpty()) {
+ if (retval == null) {
+ retval = new ArrayList<>();
+ }
+ retval.addAll(natives);
+ }
+ }
+ return retval;
+ }
}
--- a/jdk/src/share/classes/java/awt/dnd/DragGestureRecognizer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragGestureRecognizer.java Thu Oct 03 19:18:54 2013 +0100
@@ -114,7 +114,7 @@
* @param dgl the <code>DragGestureRecognizer</code>
* to notify when a drag gesture is detected
* <P>
- * @throws <code>IllegalArgumentException</code>
+ * @throws IllegalArgumentException
* if ds is <code>null</code>.
*/
@@ -157,7 +157,7 @@
* @param sa the set (logical OR) of the <code>DnDConstants</code>
* that this Drag and Drop operation will support
* <P>
- * @throws <code>IllegalArgumentException</code>
+ * @throws IllegalArgumentException
* if ds is <code>null</code>.
*/
@@ -185,7 +185,7 @@
* the <code>DragGestureRecognizer</code>
* is not associated with any <code>Component</code>.
* <P>
- * @throws <code>IllegalArgumentException</code>
+ * @throws IllegalArgumentException
* if ds is <code>null</code>.
*/
@@ -202,7 +202,7 @@
* <code>DragGestureRecognizer</code> will
* use to process the Drag and Drop operation
* <P>
- * @throws <code>IllegalArgumentException</code>
+ * @throws IllegalArgumentException
* if ds is <code>null</code>.
*/
@@ -332,7 +332,7 @@
* @param dgl the <code>DragGestureListener</code> to unregister
* from this <code>DragGestureRecognizer</code>
* <P>
- * @throws <code>IllegalArgumentException</code> if
+ * @throws IllegalArgumentException if
* dgl is not (equal to) the currently registered <code>DragGestureListener</code>.
*/
--- a/jdk/src/share/classes/java/awt/dnd/DragSource.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSource.java Thu Oct 03 19:18:54 2013 +0100
@@ -676,7 +676,7 @@
* <code><em>Foo</em>Listener</code>s on this
* <code>DragSource</code>, or an empty array if no such listeners
* have been added
- * @exception <code>ClassCastException</code> if <code>listenerType</code>
+ * @exception ClassCastException if <code>listenerType</code>
* doesn't specify a class or interface that implements
* <code>java.util.EventListener</code>
*
--- a/jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Thu Oct 03 19:18:54 2013 +0100
@@ -63,7 +63,7 @@
* itself between the platform and the
* listeners provided by the initiator of the drag operation.
* <p>
- * <a name="defaultCursor" />
+ * <a name="defaultCursor"></a>
* By default, {@code DragSourceContext} sets the cursor as appropriate
* for the current state of the drag and drop operation. For example, if
* the user has chosen {@linkplain DnDConstants#ACTION_MOVE the move action},
--- a/jdk/src/share/classes/java/awt/dnd/DragSourceDragEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceDragEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -47,9 +47,9 @@
* source and the drop action selected by the user. The user can select a drop
* action by pressing modifier keys during the drag operation:
* <pre>
- * Ctrl + Shift -> ACTION_LINK
- * Ctrl -> ACTION_COPY
- * Shift -> ACTION_MOVE
+ * Ctrl + Shift -> ACTION_LINK
+ * Ctrl -> ACTION_COPY
+ * Shift -> ACTION_MOVE
* </pre>
* If the user selects a drop action, the <i>user drop action</i> is one of
* <code>DnDConstants</code> that represents the selected drop action if this
@@ -103,7 +103,7 @@
* in one event. Use of the extended modifiers is
* preferred.
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @see java.awt.event.InputEvent
* @see DragSourceEvent#getLocation
@@ -154,7 +154,7 @@
* @param x the horizontal coordinate for the cursor location
* @param y the vertical coordinate for the cursor location
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @see java.awt.event.InputEvent
* @since 1.4
--- a/jdk/src/share/classes/java/awt/dnd/DragSourceDropEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceDropEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -63,7 +63,7 @@
* @param action the drop action
* @param success a boolean indicating if the drop was successful
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @see DragSourceEvent#getLocation
*/
@@ -91,7 +91,7 @@
* @param x the horizontal coordinate for the cursor location
* @param y the vertical coordinate for the cursor location
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @since 1.4
*/
@@ -112,7 +112,7 @@
*
* @param dsc the <code>DragSourceContext</code>
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @see DragSourceEvent#getLocation
*/
--- a/jdk/src/share/classes/java/awt/dnd/DragSourceEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -96,7 +96,7 @@
*
* @param dsc the <code>DragSourceContext</code>
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @see #getLocation
*/
@@ -117,7 +117,7 @@
* @param x the horizontal coordinate for the cursor location
* @param y the vertical coordinate for the cursor location
*
- * @throws <code>IllegalArgumentException</code> if <code>dsc</code> is <code>null</code>.
+ * @throws IllegalArgumentException if <code>dsc</code> is <code>null</code>.
*
* @since 1.4
*/
--- a/jdk/src/share/classes/java/awt/dnd/DropTarget.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTarget.java Thu Oct 03 19:18:54 2013 +0100
@@ -305,7 +305,7 @@
* <P>
* @param dtl The new <code>DropTargetListener</code>
* <P>
- * @throws <code>TooManyListenersException</code> if a
+ * @throws TooManyListenersException if a
* <code>DropTargetListener</code> is already added to this
* <code>DropTarget</code>.
*/
@@ -351,6 +351,8 @@
* @see #isActive
*/
public synchronized void dragEnter(DropTargetDragEvent dtde) {
+ isDraggingInside = true;
+
if (!active) return;
if (dtListener != null) {
@@ -421,6 +423,8 @@
* @see #isActive
*/
public synchronized void dragExit(DropTargetEvent dte) {
+ isDraggingInside = false;
+
if (!active) return;
if (dtListener != null && active) dtListener.dragExit(dte);
@@ -444,6 +448,8 @@
* @see #isActive
*/
public synchronized void drop(DropTargetDropEvent dtde) {
+ isDraggingInside = false;
+
clearAutoscroll();
if (dtListener != null && active)
@@ -533,6 +539,12 @@
((DropTargetPeer)nativePeer).removeDropTarget(this);
componentPeer = nativePeer = null;
+
+ synchronized (this) {
+ if (isDraggingInside) {
+ dragExit(new DropTargetEvent(getDropTargetContext()));
+ }
+ }
}
/**
@@ -832,7 +844,7 @@
int actions = DnDConstants.ACTION_COPY_OR_MOVE;
/**
- * <code>true</code> if the DropTarget is accepting Drag & Drop operations.
+ * <code>true</code> if the DropTarget is accepting Drag & Drop operations.
*
* @serial
*/
@@ -855,4 +867,9 @@
*/
private transient FlavorMap flavorMap;
+
+ /*
+ * If the dragging is currently inside this drop target
+ */
+ private transient boolean isDraggingInside;
}
--- a/jdk/src/share/classes/java/awt/dnd/DropTargetDragEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTargetDragEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -49,9 +49,9 @@
* source and the drop action selected by the user. The user can select a drop
* action by pressing modifier keys during the drag operation:
* <pre>
- * Ctrl + Shift -> ACTION_LINK
- * Ctrl -> ACTION_COPY
- * Shift -> ACTION_MOVE
+ * Ctrl + Shift -> ACTION_LINK
+ * Ctrl -> ACTION_COPY
+ * Shift -> ACTION_MOVE
* </pre>
* If the user selects a drop action, the <i>user drop action</i> is one of
* <code>DnDConstants</code> that represents the selected drop action if this
@@ -88,11 +88,11 @@
* @param srcActions The source drop actions
*
* @throws NullPointerException if cursorLocn is null
- * @throws <code>IllegalArgumentException</code> if dropAction is not one of
+ * @throws IllegalArgumentException if dropAction is not one of
* <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if srcActions is not
+ * @throws IllegalArgumentException if srcActions is not
* a bitwise mask of <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if dtc is <code>null</code>.
+ * @throws IllegalArgumentException if dtc is <code>null</code>.
*/
public DropTargetDragEvent(DropTargetContext dtc, Point cursorLocn, int dropAction, int srcActions) {
--- a/jdk/src/share/classes/java/awt/dnd/DropTargetDropEvent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTargetDropEvent.java Thu Oct 03 19:18:54 2013 +0100
@@ -48,9 +48,9 @@
* source and the drop action selected by the user. The user can select a drop
* action by pressing modifier keys during the drag operation:
* <pre>
- * Ctrl + Shift -> ACTION_LINK
- * Ctrl -> ACTION_COPY
- * Shift -> ACTION_MOVE
+ * Ctrl + Shift -> ACTION_LINK
+ * Ctrl -> ACTION_COPY
+ * Shift -> ACTION_MOVE
* </pre>
* If the user selects a drop action, the <i>user drop action</i> is one of
* <code>DnDConstants</code> that represents the selected drop action if this
@@ -92,13 +92,13 @@
* @param dropAction the user drop action.
* @param srcActions the source drop actions.
*
- * @throws <code>NullPointerException</code>
+ * @throws NullPointerException
* if cursorLocn is <code>null</code>
- * @throws <code>IllegalArgumentException</code> if dropAction is not one of
- * <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if srcActions is not
- * a bitwise mask of <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if dtc is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if dropAction is not one of <code>DnDConstants</code>.
+ * @throws IllegalArgumentException
+ * if srcActions is not a bitwise mask of <code>DnDConstants</code>.
+ * @throws IllegalArgumentException if dtc is <code>null</code>.
*/
public DropTargetDropEvent(DropTargetContext dtc, Point cursorLocn, int dropAction, int srcActions) {
@@ -136,13 +136,12 @@
* @param srcActions the source drop actions.
* @param isLocal True if the source is in the same JVM as the target
*
- * @throws <code>NullPointerException</code> if cursorLocn is
- * <code>null</code>
- * @throws <code>IllegalArgumentException</code> if dropAction is not one of
- * <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if srcActions is not
- * a bitwise mask of <code>DnDConstants</code>.
- * @throws <code>IllegalArgumentException</code> if dtc is <code>null</code>.
+ * @throws NullPointerException
+ * if cursorLocn is <code>null</code>
+ * @throws IllegalArgumentException
+ * if dropAction is not one of <code>DnDConstants</code>.
+ * @throws IllegalArgumentException if srcActions is not a bitwise mask of <code>DnDConstants</code>.
+ * @throws IllegalArgumentException if dtc is <code>null</code>.
*/
public DropTargetDropEvent(DropTargetContext dtc, Point cursorLocn, int dropAction, int srcActions, boolean isLocal) {
--- a/jdk/src/share/classes/java/awt/event/MouseMotionListener.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/event/MouseMotionListener.java Thu Oct 03 19:18:54 2013 +0100
@@ -60,9 +60,9 @@
* mouse button is released (regardless of whether the mouse position
* is within the bounds of the component).
* <p>
- * Due to platform-dependent Drag&Drop implementations,
+ * Due to platform-dependent Drag&Drop implementations,
* <code>MOUSE_DRAGGED</code> events may not be delivered during a native
- * Drag&Drop operation.
+ * Drag&Drop operation.
*/
public void mouseDragged(MouseEvent e);
--- a/jdk/src/share/classes/java/awt/font/TransformAttribute.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/awt/font/TransformAttribute.java Thu Oct 03 19:18:54 2013 +0100
@@ -141,14 +141,16 @@
* @since 1.6
*/
public boolean equals(Object rhs) {
- try {
- TransformAttribute that = (TransformAttribute)rhs;
- if (transform == null) {
- return that.transform == null;
+ if (rhs != null) {
+ try {
+ TransformAttribute that = (TransformAttribute)rhs;
+ if (transform == null) {
+ return that.transform == null;
+ }
+ return transform.equals(that.transform);
}
- return transform.equals(that.transform);
- }
- catch (ClassCastException e) {
+ catch (ClassCastException e) {
+ }
}
return false;
}
--- a/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java Thu Oct 03 19:18:54 2013 +0100
@@ -149,6 +149,7 @@
* @return An expression whose value is <code>oldInstance</code>.
*
* @throws NullPointerException if {@code out} is {@code null}
+ * and this value is used in the method
*
* @see #DefaultPersistenceDelegate(String[])
*/
--- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,8 +41,8 @@
public class IndexedPropertyDescriptor extends PropertyDescriptor {
private Reference<? extends Class<?>> indexedPropertyTypeRef;
- private Reference<Method> indexedReadMethodRef;
- private Reference<Method> indexedWriteMethodRef;
+ private final MethodRef indexedReadMethodRef = new MethodRef();
+ private final MethodRef indexedWriteMethodRef = new MethodRef();
private String indexedReadMethodName;
private String indexedWriteMethodName;
@@ -173,11 +173,11 @@
* May return null if the property isn't indexed or is write-only.
*/
public synchronized Method getIndexedReadMethod() {
- Method indexedReadMethod = getIndexedReadMethod0();
+ Method indexedReadMethod = this.indexedReadMethodRef.get();
if (indexedReadMethod == null) {
Class<?> cls = getClass0();
if (cls == null ||
- (indexedReadMethodName == null && indexedReadMethodRef == null)) {
+ (indexedReadMethodName == null && !this.indexedReadMethodRef.isSet())) {
// the Indexed readMethod was explicitly set to null.
return null;
}
@@ -215,20 +215,19 @@
// the indexed property type is set by the reader.
setIndexedPropertyType(findIndexedPropertyType(readMethod,
- getIndexedWriteMethod0()));
+ this.indexedWriteMethodRef.get()));
setIndexedReadMethod0(readMethod);
}
private void setIndexedReadMethod0(Method readMethod) {
+ this.indexedReadMethodRef.set(readMethod);
if (readMethod == null) {
indexedReadMethodName = null;
- indexedReadMethodRef = null;
return;
}
setClass0(readMethod.getDeclaringClass());
indexedReadMethodName = readMethod.getName();
- this.indexedReadMethodRef = getSoftReference(readMethod);
setTransient(readMethod.getAnnotation(Transient.class));
}
@@ -241,11 +240,11 @@
* May return null if the property isn't indexed or is read-only.
*/
public synchronized Method getIndexedWriteMethod() {
- Method indexedWriteMethod = getIndexedWriteMethod0();
+ Method indexedWriteMethod = this.indexedWriteMethodRef.get();
if (indexedWriteMethod == null) {
Class<?> cls = getClass0();
if (cls == null ||
- (indexedWriteMethodName == null && indexedWriteMethodRef == null)) {
+ (indexedWriteMethodName == null && !this.indexedWriteMethodRef.isSet())) {
// the Indexed writeMethod was explicitly set to null.
return null;
}
@@ -301,15 +300,14 @@
}
private void setIndexedWriteMethod0(Method writeMethod) {
+ this.indexedWriteMethodRef.set(writeMethod);
if (writeMethod == null) {
indexedWriteMethodName = null;
- indexedWriteMethodRef = null;
return;
}
setClass0(writeMethod.getDeclaringClass());
indexedWriteMethodName = writeMethod.getName();
- this.indexedWriteMethodRef = getSoftReference(writeMethod);
setTransient(writeMethod.getAnnotation(Transient.class));
}
@@ -349,18 +347,6 @@
: null;
}
- private Method getIndexedReadMethod0() {
- return (this.indexedReadMethodRef != null)
- ? this.indexedReadMethodRef.get()
- : null;
- }
-
- private Method getIndexedWriteMethod0() {
- return (this.indexedWriteMethodRef != null)
- ? this.indexedWriteMethodRef.get()
- : null;
- }
-
private Class<?> findIndexedPropertyType(Method indexedReadMethod,
Method indexedWriteMethod)
throws IntrospectionException {
@@ -492,8 +478,8 @@
*/
IndexedPropertyDescriptor(IndexedPropertyDescriptor old) {
super(old);
- indexedReadMethodRef = old.indexedReadMethodRef;
- indexedWriteMethodRef = old.indexedWriteMethodRef;
+ this.indexedReadMethodRef.set(old.indexedReadMethodRef.get());
+ this.indexedWriteMethodRef.set(old.indexedWriteMethodRef.get());
indexedPropertyTypeRef = old.indexedPropertyTypeRef;
indexedWriteMethodName = old.indexedWriteMethodName;
indexedReadMethodName = old.indexedReadMethodName;
@@ -502,7 +488,7 @@
void updateGenericsFor(Class<?> type) {
super.updateGenericsFor(type);
try {
- setIndexedPropertyType(findIndexedPropertyType(getIndexedReadMethod0(), getIndexedWriteMethod0()));
+ setIndexedPropertyType(findIndexedPropertyType(this.indexedReadMethodRef.get(), this.indexedWriteMethodRef.get()));
}
catch (IntrospectionException exception) {
setIndexedPropertyType(null);
@@ -532,7 +518,7 @@
void appendTo(StringBuilder sb) {
super.appendTo(sb);
appendTo(sb, "indexedPropertyType", this.indexedPropertyTypeRef);
- appendTo(sb, "indexedReadMethod", this.indexedReadMethodRef);
- appendTo(sb, "indexedWriteMethod", this.indexedWriteMethodRef);
+ appendTo(sb, "indexedReadMethod", this.indexedReadMethodRef.get());
+ appendTo(sb, "indexedWriteMethod", this.indexedWriteMethodRef.get());
}
}
--- a/jdk/src/share/classes/java/beans/MethodDescriptor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/MethodDescriptor.java Thu Oct 03 19:18:54 2013 +0100
@@ -38,7 +38,7 @@
public class MethodDescriptor extends FeatureDescriptor {
- private Reference<Method> methodRef;
+ private final MethodRef methodRef = new MethodRef();
private String[] paramNames;
@@ -81,7 +81,7 @@
* @return The low-level description of the method
*/
public synchronized Method getMethod() {
- Method method = getMethod0();
+ Method method = this.methodRef.get();
if (method == null) {
Class<?> cls = getClass0();
String name = getName();
@@ -114,13 +114,7 @@
setClass0(method.getDeclaringClass());
}
setParams(getParameterTypes(getClass0(), method));
- this.methodRef = getSoftReference(method);
- }
-
- private Method getMethod0() {
- return (this.methodRef != null)
- ? this.methodRef.get()
- : null;
+ this.methodRef.set(method);
}
private synchronized void setParams(Class<?>[] param) {
@@ -177,12 +171,10 @@
*/
MethodDescriptor(MethodDescriptor x, MethodDescriptor y) {
- super(x,y);
+ super(x, y);
- methodRef = x.methodRef;
- if (y.methodRef != null) {
- methodRef = y.methodRef;
- }
+ Method method = y.methodRef.get();
+ this.methodRef.set(null != method ? method : x.methodRef.get());
params = x.params;
if (y.params != null) {
params = y.params;
@@ -205,7 +197,7 @@
MethodDescriptor(MethodDescriptor old) {
super(old);
- methodRef = old.methodRef;
+ this.methodRef.set(old.getMethod());
params = old.params;
paramNames = old.paramNames;
@@ -219,7 +211,7 @@
}
void appendTo(StringBuilder sb) {
- appendTo(sb, "method", this.methodRef);
+ appendTo(sb, "method", this.methodRef.get());
if (this.parameterDescriptors != null) {
sb.append("; parameterDescriptors={");
for (ParameterDescriptor pd : this.parameterDescriptors) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/java/beans/MethodRef.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.beans;
+
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Method;
+
+import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
+
+final class MethodRef {
+ private String signature;
+ private SoftReference<Method> methodRef;
+ private WeakReference<Class<?>> typeRef;
+
+ void set(Method method) {
+ if (method == null) {
+ this.signature = null;
+ this.methodRef = null;
+ this.typeRef = null;
+ }
+ else {
+ this.signature = method.toGenericString();
+ this.methodRef = new SoftReference<>(method);
+ this.typeRef = new WeakReference<Class<?>>(method.getDeclaringClass());
+ }
+ }
+
+ boolean isSet() {
+ return this.methodRef != null;
+ }
+
+ Method get() {
+ if (this.methodRef == null) {
+ return null;
+ }
+ Method method = this.methodRef.get();
+ if (method == null) {
+ method = find(this.typeRef.get(), this.signature);
+ if (method == null) {
+ this.signature = null;
+ this.methodRef = null;
+ this.typeRef = null;
+ }
+ else {
+ this.methodRef = new SoftReference<>(method);
+ }
+ }
+ return isPackageAccessible(method.getDeclaringClass()) ? method : null;
+ }
+
+ private static Method find(Class<?> type, String signature) {
+ if (type != null) {
+ for (Method method : type.getMethods()) {
+ if (type.equals(method.getDeclaringClass())) {
+ if (method.toGenericString().equals(signature)) {
+ return method;
+ }
+ }
+ }
+ }
+ return null;
+ }
+}
--- a/jdk/src/share/classes/java/beans/PersistenceDelegate.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/PersistenceDelegate.java Thu Oct 03 19:18:54 2013 +0100
@@ -162,6 +162,7 @@
* @return An expression whose value is <code>oldInstance</code>.
*
* @throws NullPointerException if {@code out} is {@code null}
+ * and this value is used in the method
*/
protected abstract Expression instantiate(Object oldInstance, Encoder out);
--- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,8 +36,8 @@
public class PropertyDescriptor extends FeatureDescriptor {
private Reference<? extends Class<?>> propertyTypeRef;
- private Reference<Method> readMethodRef;
- private Reference<Method> writeMethodRef;
+ private final MethodRef readMethodRef = new MethodRef();
+ private final MethodRef writeMethodRef = new MethodRef();
private Reference<? extends Class<?>> propertyEditorClassRef;
private boolean bound;
@@ -68,8 +68,8 @@
public PropertyDescriptor(String propertyName, Class<?> beanClass)
throws IntrospectionException {
this(propertyName, beanClass,
- Introspector.IS_PREFIX + NameGenerator.capitalize(propertyName),
- Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName));
+ Introspector.IS_PREFIX + NameGenerator.capitalize(propertyName),
+ Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName));
}
/**
@@ -203,10 +203,10 @@
* May return null if the property can't be read.
*/
public synchronized Method getReadMethod() {
- Method readMethod = getReadMethod0();
+ Method readMethod = this.readMethodRef.get();
if (readMethod == null) {
Class<?> cls = getClass0();
- if (cls == null || (readMethodName == null && readMethodRef == null)) {
+ if (cls == null || (readMethodName == null && !this.readMethodRef.isSet())) {
// The read method was explicitly set to null.
return null;
}
@@ -247,17 +247,16 @@
*/
public synchronized void setReadMethod(Method readMethod)
throws IntrospectionException {
+ this.readMethodRef.set(readMethod);
if (readMethod == null) {
readMethodName = null;
- readMethodRef = null;
return;
}
// The property type is determined by the read method.
- setPropertyType(findPropertyType(readMethod, getWriteMethod0()));
+ setPropertyType(findPropertyType(readMethod, this.writeMethodRef.get()));
setClass0(readMethod.getDeclaringClass());
readMethodName = readMethod.getName();
- this.readMethodRef = getSoftReference(readMethod);
setTransient(readMethod.getAnnotation(Transient.class));
}
@@ -268,10 +267,10 @@
* May return null if the property can't be written.
*/
public synchronized Method getWriteMethod() {
- Method writeMethod = getWriteMethod0();
+ Method writeMethod = this.writeMethodRef.get();
if (writeMethod == null) {
Class<?> cls = getClass0();
- if (cls == null || (writeMethodName == null && writeMethodRef == null)) {
+ if (cls == null || (writeMethodName == null && !this.writeMethodRef.isSet())) {
// The write method was explicitly set to null.
return null;
}
@@ -318,9 +317,9 @@
*/
public synchronized void setWriteMethod(Method writeMethod)
throws IntrospectionException {
+ this.writeMethodRef.set(writeMethod);
if (writeMethod == null) {
writeMethodName = null;
- writeMethodRef = null;
return;
}
// Set the property type - which validates the method
@@ -328,22 +327,9 @@
setClass0(writeMethod.getDeclaringClass());
writeMethodName = writeMethod.getName();
- this.writeMethodRef = getSoftReference(writeMethod);
setTransient(writeMethod.getAnnotation(Transient.class));
}
- private Method getReadMethod0() {
- return (this.readMethodRef != null)
- ? this.readMethodRef.get()
- : null;
- }
-
- private Method getWriteMethod0() {
- return (this.writeMethodRef != null)
- ? this.writeMethodRef.get()
- : null;
- }
-
/**
* Overridden to ensure that a super class doesn't take precedent
*/
@@ -617,8 +603,8 @@
PropertyDescriptor(PropertyDescriptor old) {
super(old);
propertyTypeRef = old.propertyTypeRef;
- readMethodRef = old.readMethodRef;
- writeMethodRef = old.writeMethodRef;
+ this.readMethodRef.set(old.readMethodRef.get());
+ this.writeMethodRef.set(old.writeMethodRef.get());
propertyEditorClassRef = old.propertyEditorClassRef;
writeMethodName = old.writeMethodName;
@@ -632,7 +618,7 @@
void updateGenericsFor(Class<?> type) {
setClass0(type);
try {
- setPropertyType(findPropertyType(getReadMethod0(), getWriteMethod0()));
+ setPropertyType(findPropertyType(this.readMethodRef.get(), this.writeMethodRef.get()));
}
catch (IntrospectionException exception) {
setPropertyType(null);
@@ -723,8 +709,8 @@
appendTo(sb, "constrained", this.constrained);
appendTo(sb, "propertyEditorClass", this.propertyEditorClassRef);
appendTo(sb, "propertyType", this.propertyTypeRef);
- appendTo(sb, "readMethod", this.readMethodRef);
- appendTo(sb, "writeMethod", this.writeMethodRef);
+ appendTo(sb, "readMethod", this.readMethodRef.get());
+ appendTo(sb, "writeMethod", this.writeMethodRef.get());
}
private boolean isAssignable(Method m1, Method m2) {
--- a/jdk/src/share/classes/java/beans/ThreadGroupContext.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/ThreadGroupContext.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,24 +41,20 @@
*/
final class ThreadGroupContext {
- private static final WeakIdentityMap<ThreadGroupContext> contexts = new WeakIdentityMap<>();
+ private static final WeakIdentityMap<ThreadGroupContext> contexts = new WeakIdentityMap<ThreadGroupContext>() {
+ protected ThreadGroupContext create(Object key) {
+ return new ThreadGroupContext();
+ }
+ };
/**
- * Returns the appropriate {@code AppContext} for the caller,
+ * Returns the appropriate {@code ThreadGroupContext} for the caller,
* as determined by its {@code ThreadGroup}.
*
* @return the application-dependent context
*/
static ThreadGroupContext getContext() {
- ThreadGroup group = Thread.currentThread().getThreadGroup();
- synchronized (contexts) {
- ThreadGroupContext context = contexts.get(group);
- if (context == null) {
- context = new ThreadGroupContext();
- contexts.put(group, context);
- }
- return context;
- }
+ return contexts.get(Thread.currentThread().getThreadGroup());
}
private volatile boolean isDesignTime;
--- a/jdk/src/share/classes/java/beans/WeakIdentityMap.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/beans/WeakIdentityMap.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,18 +33,22 @@
* and reference-equality in place of object-equality to compare them.
* An entry will automatically be removed when its key is no longer
* in ordinary use. Both null values and the null key are supported.
+ * This class does not require additional synchronization.
+ * A thread-safety is provided by a fragile combination
+ * of synchronized blocks and volatile fields.
+ * Be very careful during editing!
*
* @see java.util.IdentityHashMap
* @see java.util.WeakHashMap
*/
-final class WeakIdentityMap<T> {
+abstract class WeakIdentityMap<T> {
private static final int MAXIMUM_CAPACITY = 1 << 30; // it MUST be a power of two
private static final Object NULL = new Object(); // special object for null key
private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
- private Entry<T>[] table = newTable(1<<3); // table's length MUST be a power of two
+ private volatile Entry<T>[] table = newTable(1<<3); // table's length MUST be a power of two
private int threshold = 6; // the next size value at which to resize
private int size = 0; // the number of key-value mappings
@@ -54,78 +58,83 @@
key = NULL;
}
int hash = key.hashCode();
- int index = getIndex(this.table, hash);
- for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) {
+ Entry<T>[] table = this.table;
+ // unsynchronized search improves performance
+ // the null value does not mean that there are no needed entry
+ int index = getIndex(table, hash);
+ for (Entry<T> entry = table[index]; entry != null; entry = entry.next) {
if (entry.isMatched(key, hash)) {
return entry.value;
}
}
- return null;
+ synchronized (NULL) {
+ // synchronized search improves stability
+ // we must create and add new value if there are no needed entry
+ index = getIndex(this.table, hash);
+ for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) {
+ if (entry.isMatched(key, hash)) {
+ return entry.value;
+ }
+ }
+ T value = create(key);
+ this.table[index] = new Entry<T>(key, hash, value, this.queue, this.table[index]);
+ if (++this.size >= this.threshold) {
+ if (this.table.length == MAXIMUM_CAPACITY) {
+ this.threshold = Integer.MAX_VALUE;
+ }
+ else {
+ removeStaleEntries();
+ table = newTable(this.table.length * 2);
+ transfer(this.table, table);
+ // If ignoring null elements and processing ref queue caused massive
+ // shrinkage, then restore old table. This should be rare, but avoids
+ // unbounded expansion of garbage-filled tables.
+ if (this.size >= this.threshold / 2) {
+ this.table = table;
+ this.threshold *= 2;
+ }
+ else {
+ transfer(table, this.table);
+ }
+ }
+ }
+ return value;
+ }
}
- public T put(Object key, T value) {
- removeStaleEntries();
- if (key == null) {
- key = NULL;
- }
- int hash = key.hashCode();
- int index = getIndex(this.table, hash);
- for (Entry<T> entry = this.table[index]; entry != null; entry = entry.next) {
- if (entry.isMatched(key, hash)) {
- T oldValue = entry.value;
- entry.value = value;
- return oldValue;
- }
- }
- this.table[index] = new Entry<T>(key, hash, value, this.queue, this.table[index]);
- if (++this.size >= this.threshold) {
- if (this.table.length == MAXIMUM_CAPACITY) {
- this.threshold = Integer.MAX_VALUE;
- }
- else {
- removeStaleEntries();
- Entry<T>[] table = newTable(this.table.length * 2);
- transfer(this.table, table);
-
- // If ignoring null elements and processing ref queue caused massive
- // shrinkage, then restore old table. This should be rare, but avoids
- // unbounded expansion of garbage-filled tables.
- if (this.size >= this.threshold / 2) {
- this.table = table;
- this.threshold *= 2;
- }
- else {
- transfer(table, this.table);
- }
- }
- }
- return null;
- }
+ protected abstract T create(Object key);
private void removeStaleEntries() {
- for (Object ref = this.queue.poll(); ref != null; ref = this.queue.poll()) {
- @SuppressWarnings("unchecked")
- Entry<T> entry = (Entry<T>) ref;
- int index = getIndex(this.table, entry.hash);
+ Object ref = this.queue.poll();
+ if (ref != null) {
+ synchronized (NULL) {
+ do {
+ @SuppressWarnings("unchecked")
+ Entry<T> entry = (Entry<T>) ref;
+ int index = getIndex(this.table, entry.hash);
- Entry<T> prev = this.table[index];
- Entry<T> current = prev;
- while (current != null) {
- Entry<T> next = current.next;
- if (current == entry) {
- if (prev == entry) {
- this.table[index] = next;
+ Entry<T> prev = this.table[index];
+ Entry<T> current = prev;
+ while (current != null) {
+ Entry<T> next = current.next;
+ if (current == entry) {
+ if (prev == entry) {
+ this.table[index] = next;
+ }
+ else {
+ prev.next = next;
+ }
+ entry.value = null; // Help GC
+ entry.next = null; // Help GC
+ this.size--;
+ break;
+ }
+ prev = current;
+ current = next;
}
- else {
- prev.next = next;
- }
- entry.value = null; // Help GC
- entry.next = null; // Help GC
- this.size--;
- break;
+ ref = this.queue.poll();
}
- prev = current;
- current = next;
+ while (ref != null);
}
}
}
@@ -164,8 +173,8 @@
private static class Entry<T> extends WeakReference<Object> {
private final int hash;
- private T value;
- private Entry<T> next;
+ private volatile T value;
+ private volatile Entry<T> next;
Entry(Object key, int hash, T value, ReferenceQueue<Object> queue, Entry<T> next) {
super(key, queue);
--- a/jdk/src/share/classes/java/lang/CharSequence.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/lang/CharSequence.java Thu Oct 03 19:18:54 2013 +0100
@@ -228,7 +228,7 @@
Spliterators.spliteratorUnknownSize(
new CodePointIterator(),
Spliterator.ORDERED),
- Spliterator.SUBSIZED | Spliterator.SIZED | Spliterator.ORDERED,
+ Spliterator.ORDERED,
false);
}
}
--- a/jdk/src/share/classes/java/lang/Class.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/lang/Class.java Thu Oct 03 19:18:54 2013 +0100
@@ -48,6 +48,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import java.util.Map;
@@ -2370,11 +2371,14 @@
private static final long reflectionDataOffset;
// offset of Class.annotationType instance field
private static final long annotationTypeOffset;
+ // offset of Class.annotationData instance field
+ private static final long annotationDataOffset;
static {
Field[] fields = Class.class.getDeclaredFields0(false); // bypass caches
reflectionDataOffset = objectFieldOffset(fields, "reflectionData");
annotationTypeOffset = objectFieldOffset(fields, "annotationType");
+ annotationDataOffset = objectFieldOffset(fields, "annotationData");
}
private static long objectFieldOffset(Field[] fields, String fieldName) {
@@ -2396,6 +2400,12 @@
AnnotationType newType) {
return unsafe.compareAndSwapObject(clazz, annotationTypeOffset, oldType, newType);
}
+
+ static <T> boolean casAnnotationData(Class<?> clazz,
+ AnnotationData oldData,
+ AnnotationData newData) {
+ return unsafe.compareAndSwapObject(clazz, annotationDataOffset, oldData, newData);
+ }
}
/**
@@ -2406,7 +2416,7 @@
private static boolean useCaches = true;
// reflection data that might get invalidated when JVM TI RedefineClasses() is called
- static class ReflectionData<T> {
+ private static class ReflectionData<T> {
volatile Field[] declaredFields;
volatile Field[] publicFields;
volatile Method[] declaredMethods;
@@ -3253,8 +3263,7 @@
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
Objects.requireNonNull(annotationClass);
- initAnnotationsIfNecessary();
- return (A) annotations.get(annotationClass);
+ return (A) annotationData().annotations.get(annotationClass);
}
/**
@@ -3275,16 +3284,14 @@
public <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationClass) {
Objects.requireNonNull(annotationClass);
- initAnnotationsIfNecessary();
- return AnnotationSupport.getMultipleAnnotations(annotations, annotationClass);
+ return AnnotationSupport.getMultipleAnnotations(annotationData().annotations, annotationClass);
}
/**
* @since 1.5
*/
public Annotation[] getAnnotations() {
- initAnnotationsIfNecessary();
- return AnnotationParser.toArray(annotations);
+ return AnnotationParser.toArray(annotationData().annotations);
}
/**
@@ -3296,8 +3303,7 @@
public <A extends Annotation> A getDeclaredAnnotation(Class<A> annotationClass) {
Objects.requireNonNull(annotationClass);
- initAnnotationsIfNecessary();
- return (A) declaredAnnotations.get(annotationClass);
+ return (A) annotationData().declaredAnnotations.get(annotationClass);
}
/**
@@ -3308,52 +3314,85 @@
public <A extends Annotation> A[] getDeclaredAnnotationsByType(Class<A> annotationClass) {
Objects.requireNonNull(annotationClass);
- initAnnotationsIfNecessary();
- return AnnotationSupport.getMultipleAnnotations(declaredAnnotations, annotationClass);
+ return AnnotationSupport.getMultipleAnnotations(annotationData().declaredAnnotations, annotationClass);
}
/**
* @since 1.5
*/
public Annotation[] getDeclaredAnnotations() {
- initAnnotationsIfNecessary();
- return AnnotationParser.toArray(declaredAnnotations);
+ return AnnotationParser.toArray(annotationData().declaredAnnotations);
}
- // Annotations cache
- private transient Map<Class<? extends Annotation>, Annotation> annotations;
- private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
- // Value of classRedefinedCount when we last cleared the cached annotations and declaredAnnotations fields
- private transient int lastAnnotationsRedefinedCount = 0;
+ // annotation data that might get invalidated when JVM TI RedefineClasses() is called
+ private static class AnnotationData {
+ final Map<Class<? extends Annotation>, Annotation> annotations;
+ final Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
- // Clears cached values that might possibly have been obsoleted by
- // a class redefinition.
- private void clearAnnotationCachesOnClassRedefinition() {
- if (lastAnnotationsRedefinedCount != classRedefinedCount) {
- annotations = declaredAnnotations = null;
- lastAnnotationsRedefinedCount = classRedefinedCount;
+ // Value of classRedefinedCount when we created this AnnotationData instance
+ final int redefinedCount;
+
+ AnnotationData(Map<Class<? extends Annotation>, Annotation> annotations,
+ Map<Class<? extends Annotation>, Annotation> declaredAnnotations,
+ int redefinedCount) {
+ this.annotations = annotations;
+ this.declaredAnnotations = declaredAnnotations;
+ this.redefinedCount = redefinedCount;
}
}
- private synchronized void initAnnotationsIfNecessary() {
- clearAnnotationCachesOnClassRedefinition();
- if (annotations != null)
- return;
- declaredAnnotations = AnnotationParser.parseAnnotations(
- getRawAnnotations(), getConstantPool(), this);
+ // Annotations cache
+ @SuppressWarnings("UnusedDeclaration")
+ private volatile transient AnnotationData annotationData;
+
+ private AnnotationData annotationData() {
+ while (true) { // retry loop
+ AnnotationData annotationData = this.annotationData;
+ int classRedefinedCount = this.classRedefinedCount;
+ if (annotationData != null &&
+ annotationData.redefinedCount == classRedefinedCount) {
+ return annotationData;
+ }
+ // null or stale annotationData -> optimistically create new instance
+ AnnotationData newAnnotationData = createAnnotationData(classRedefinedCount);
+ // try to install it
+ if (Atomic.casAnnotationData(this, annotationData, newAnnotationData)) {
+ // successfully installed new AnnotationData
+ return newAnnotationData;
+ }
+ }
+ }
+
+ private AnnotationData createAnnotationData(int classRedefinedCount) {
+ Map<Class<? extends Annotation>, Annotation> declaredAnnotations =
+ AnnotationParser.parseAnnotations(getRawAnnotations(), getConstantPool(), this);
Class<?> superClass = getSuperclass();
- if (superClass == null) {
+ Map<Class<? extends Annotation>, Annotation> annotations = null;
+ if (superClass != null) {
+ Map<Class<? extends Annotation>, Annotation> superAnnotations =
+ superClass.annotationData().annotations;
+ for (Map.Entry<Class<? extends Annotation>, Annotation> e : superAnnotations.entrySet()) {
+ Class<? extends Annotation> annotationClass = e.getKey();
+ if (AnnotationType.getInstance(annotationClass).isInherited()) {
+ if (annotations == null) { // lazy construction
+ annotations = new LinkedHashMap<>((Math.max(
+ declaredAnnotations.size(),
+ Math.min(12, declaredAnnotations.size() + superAnnotations.size())
+ ) * 4 + 2) / 3
+ );
+ }
+ annotations.put(annotationClass, e.getValue());
+ }
+ }
+ }
+ if (annotations == null) {
+ // no inherited annotations -> share the Map with declaredAnnotations
annotations = declaredAnnotations;
} else {
- annotations = new HashMap<>();
- superClass.initAnnotationsIfNecessary();
- for (Map.Entry<Class<? extends Annotation>, Annotation> e : superClass.annotations.entrySet()) {
- Class<? extends Annotation> annotationClass = e.getKey();
- if (AnnotationType.getInstance(annotationClass).isInherited())
- annotations.put(annotationClass, e.getValue());
- }
+ // at least one inherited annotation -> declared may override inherited
annotations.putAll(declaredAnnotations);
}
+ return new AnnotationData(annotations, declaredAnnotations, classRedefinedCount);
}
// Annotation types cache their internal (AnnotationType) form
--- a/jdk/src/share/classes/java/security/cert/Certificate.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/security/cert/Certificate.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,6 +66,9 @@
// the certificate type
private final String type;
+ /** Cache the hash code for the certiticate */
+ private int hash = -1; // Default to -1
+
/**
* Creates a certificate of the specified type.
*
@@ -123,16 +126,16 @@
* @return the hashcode value.
*/
public int hashCode() {
- int retval = 0;
- try {
- byte[] certData = X509CertImpl.getEncodedInternal(this);
- for (int i = 1; i < certData.length; i++) {
- retval += certData[i] * i;
+ int h = hash;
+ if (h == -1) {
+ try {
+ h = Arrays.hashCode(X509CertImpl.getEncodedInternal(this));
+ } catch (CertificateException e) {
+ h = 0;
}
- return retval;
- } catch (CertificateException e) {
- return retval;
+ hash = h;
}
+ return h;
}
/**
--- a/jdk/src/share/classes/java/util/HashMap.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/HashMap.java Thu Oct 03 19:18:54 2013 +0100
@@ -624,8 +624,7 @@
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
- if (size > threshold || (tab = table) == null ||
- (n = tab.length) == 0)
+ if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
@@ -659,7 +658,8 @@
}
}
++modCount;
- ++size;
+ if (++size > threshold)
+ resize();
afterNodeInsertion(evict);
return null;
}
@@ -1132,6 +1132,8 @@
public V computeIfPresent(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+ if (remappingFunction == null)
+ throw new NullPointerException();
Node<K,V> e; V oldValue;
int hash = hash(key);
if ((e = getNode(hash, key)) != null &&
--- a/jdk/src/share/classes/java/util/Map.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/Map.java Thu Oct 03 19:18:54 2013 +0100
@@ -934,6 +934,7 @@
*/
default V computeIfAbsent(K key,
Function<? super K, ? extends V> mappingFunction) {
+ Objects.requireNonNull(mappingFunction);
V v, newValue;
return ((v = get(key)) == null &&
(newValue = mappingFunction.apply(key)) != null &&
@@ -992,6 +993,7 @@
*/
default V computeIfPresent(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
V oldValue;
while ((oldValue = get(key)) != null) {
V newValue = remappingFunction.apply(key, oldValue);
@@ -1068,6 +1070,7 @@
*/
default V compute(K key,
BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
V oldValue = get(key);
for (;;) {
V newValue = remappingFunction.apply(key, oldValue);
@@ -1174,6 +1177,7 @@
*/
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+ Objects.requireNonNull(remappingFunction);
V oldValue = get(key);
for (;;) {
if (oldValue != null) {
--- a/jdk/src/share/classes/java/util/Spliterator.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/Spliterator.java Thu Oct 03 19:18:54 2013 +0100
@@ -539,7 +539,7 @@
* Spliterator is expected to have a documented policy concerning the impact
* of modifications during traversal.
*
- * <p>A top-level Spliterator should not report {@code CONCURRENT} and
+ * <p>A top-level Spliterator should not report both {@code CONCURRENT} and
* {@code SIZED}, since the finite size, if known, may change if the source
* is concurrently modified during traversal. Such a Spliterator is
* inconsistent and no guarantees can be made about any computation using
--- a/jdk/src/share/classes/java/util/Spliterators.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/Spliterators.java Thu Oct 03 19:18:54 2013 +0100
@@ -409,16 +409,16 @@
*
* @param <T> Type of elements
* @param c The collection
- * @param additionalCharacteristics Additional spliterator characteristics
- * of this spliterator's source or elements beyond {@code SIZED} and
- * {@code SUBSIZED} which are are always reported
+ * @param characteristics Characteristics of this spliterator's source or
+ * elements. The characteristics {@code SIZED} and {@code SUBSIZED}
+ * are additionally reported unless {@code CONCURRENT} is supplied.
* @return A spliterator from an iterator
* @throws NullPointerException if the given collection is {@code null}
*/
public static <T> Spliterator<T> spliterator(Collection<? extends T> c,
- int additionalCharacteristics) {
+ int characteristics) {
return new IteratorSpliterator<>(Objects.requireNonNull(c),
- additionalCharacteristics);
+ characteristics);
}
/**
@@ -439,17 +439,17 @@
* @param iterator The iterator for the source
* @param size The number of elements in the source, to be reported as
* initial {@code estimateSize}
- * @param additionalCharacteristics Additional spliterator characteristics
- * of this spliterator's source or elements beyond {@code SIZED} and
- * {@code SUBSIZED} which are are always reported
+ * @param characteristics Characteristics of this spliterator's source or
+ * elements. The characteristics {@code SIZED} and {@code SUBSIZED}
+ * are additionally reported unless {@code CONCURRENT} is supplied.
* @return A spliterator from an iterator
* @throws NullPointerException if the given iterator is {@code null}
*/
public static <T> Spliterator<T> spliterator(Iterator<? extends T> iterator,
long size,
- int additionalCharacteristics) {
+ int characteristics) {
return new IteratorSpliterator<>(Objects.requireNonNull(iterator), size,
- additionalCharacteristics);
+ characteristics);
}
/**
@@ -467,7 +467,7 @@
*
* @param <T> Type of elements
* @param iterator The iterator for the source
- * @param characteristics Properties of this spliterator's source
+ * @param characteristics Characteristics of this spliterator's source
* or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are
* ignored and are not reported.)
* @return A spliterator from an iterator
@@ -496,17 +496,17 @@
* @param iterator The iterator for the source
* @param size The number of elements in the source, to be reported as
* initial {@code estimateSize}.
- * @param additionalCharacteristics Additional spliterator characteristics
- * of this spliterator's source or elements beyond {@code SIZED} and
- * {@code SUBSIZED} which are are always reported
+ * @param characteristics Characteristics of this spliterator's source or
+ * elements. The characteristics {@code SIZED} and {@code SUBSIZED}
+ * are additionally reported unless {@code CONCURRENT} is supplied.
* @return A spliterator from an iterator
* @throws NullPointerException if the given iterator is {@code null}
*/
public static Spliterator.OfInt spliterator(PrimitiveIterator.OfInt iterator,
long size,
- int additionalCharacteristics) {
+ int characteristics) {
return new IntIteratorSpliterator(Objects.requireNonNull(iterator),
- size, additionalCharacteristics);
+ size, characteristics);
}
/**
@@ -524,7 +524,7 @@
* operated on after the spliterator is returned.
*
* @param iterator The iterator for the source
- * @param characteristics Properties of this spliterator's source
+ * @param characteristics Characteristics of this spliterator's source
* or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are
* ignored and are not reported.)
* @return A spliterator from an iterator
@@ -553,17 +553,17 @@
* @param iterator The iterator for the source
* @param size The number of elements in the source, to be reported as
* initial {@code estimateSize}.
- * @param additionalCharacteristics Additional spliterator characteristics
- * of this spliterator's source or elements beyond {@code SIZED} and
- * {@code SUBSIZED} which are are always reported
+ * @param characteristics Characteristics of this spliterator's source or
+ * elements. The characteristics {@code SIZED} and {@code SUBSIZED}
+ * are additionally reported unless {@code CONCURRENT} is supplied.
* @return A spliterator from an iterator
* @throws NullPointerException if the given iterator is {@code null}
*/
public static Spliterator.OfLong spliterator(PrimitiveIterator.OfLong iterator,
long size,
- int additionalCharacteristics) {
+ int characteristics) {
return new LongIteratorSpliterator(Objects.requireNonNull(iterator),
- size, additionalCharacteristics);
+ size, characteristics);
}
/**
@@ -581,7 +581,7 @@
* operated on after the spliterator is returned.
*
* @param iterator The iterator for the source
- * @param characteristics Properties of this spliterator's source
+ * @param characteristics Characteristics of this spliterator's source
* or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are
* ignored and are not reported.)
* @return A spliterator from an iterator
@@ -610,17 +610,17 @@
* @param iterator The iterator for the source
* @param size The number of elements in the source, to be reported as
* initial {@code estimateSize}
- * @param additionalCharacteristics Additional spliterator characteristics
- * of this spliterator's source or elements beyond {@code SIZED} and
- * {@code SUBSIZED} which are are always reported
+ * @param characteristics Characteristics of this spliterator's source or
+ * elements. The characteristics {@code SIZED} and {@code SUBSIZED}
+ * are additionally reported unless {@code CONCURRENT} is supplied.
* @return A spliterator from an iterator
* @throws NullPointerException if the given iterator is {@code null}
*/
public static Spliterator.OfDouble spliterator(PrimitiveIterator.OfDouble iterator,
long size,
- int additionalCharacteristics) {
+ int characteristics) {
return new DoubleIteratorSpliterator(Objects.requireNonNull(iterator),
- size, additionalCharacteristics);
+ size, characteristics);
}
/**
@@ -638,7 +638,7 @@
* operated on after the spliterator is returned.
*
* @param iterator The iterator for the source
- * @param characteristics Properties of this spliterator's source
+ * @param characteristics Characteristics of this spliterator's source
* or elements ({@code SIZED} and {@code SUBSIZED}, if supplied, are
* ignored and are not reported.)
* @return A spliterator from an iterator
@@ -1710,7 +1710,9 @@
public IteratorSpliterator(Collection<? extends T> collection, int characteristics) {
this.collection = collection;
this.it = null;
- this.characteristics = characteristics | Spliterator.SIZED | Spliterator.SUBSIZED;
+ this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
+ ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
+ : characteristics;
}
/**
@@ -1727,7 +1729,9 @@
this.collection = null;
this.it = iterator;
this.est = size;
- this.characteristics = characteristics | Spliterator.SIZED | Spliterator.SUBSIZED;
+ this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
+ ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
+ : characteristics;
}
/**
@@ -1857,7 +1861,9 @@
public IntIteratorSpliterator(PrimitiveIterator.OfInt iterator, long size, int characteristics) {
this.it = iterator;
this.est = size;
- this.characteristics = characteristics | Spliterator.SIZED | Spliterator.SUBSIZED;
+ this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
+ ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
+ : characteristics;
}
/**
@@ -1949,7 +1955,9 @@
public LongIteratorSpliterator(PrimitiveIterator.OfLong iterator, long size, int characteristics) {
this.it = iterator;
this.est = size;
- this.characteristics = characteristics | Spliterator.SIZED | Spliterator.SUBSIZED;
+ this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
+ ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
+ : characteristics;
}
/**
@@ -2041,7 +2049,9 @@
public DoubleIteratorSpliterator(PrimitiveIterator.OfDouble iterator, long size, int characteristics) {
this.it = iterator;
this.est = size;
- this.characteristics = characteristics | Spliterator.SIZED | Spliterator.SUBSIZED;
+ this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
+ ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
+ : characteristics;
}
/**
--- a/jdk/src/share/classes/java/util/SplittableRandom.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/SplittableRandom.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,8 +25,7 @@
package java.util;
-import java.security.SecureRandom;
-import java.net.InetAddress;
+import java.net.NetworkInterface;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.IntConsumer;
import java.util.function.LongConsumer;
@@ -242,12 +241,34 @@
s = (s << 8) | ((long)(seedBytes[i]) & 0xffL);
return s;
}
- int hh = 0; // hashed host address
+ long h = 0L;
try {
- hh = InetAddress.getLocalHost().hashCode();
+ Enumeration<NetworkInterface> ifcs =
+ NetworkInterface.getNetworkInterfaces();
+ boolean retry = false; // retry once if getHardwareAddress is null
+ while (ifcs.hasMoreElements()) {
+ NetworkInterface ifc = ifcs.nextElement();
+ if (!ifc.isVirtual()) { // skip fake addresses
+ byte[] bs = ifc.getHardwareAddress();
+ if (bs != null) {
+ int n = bs.length;
+ int m = Math.min(n >>> 1, 4);
+ for (int i = 0; i < m; ++i)
+ h = (h << 16) ^ (bs[i] << 8) ^ bs[n-1-i];
+ if (m < 4)
+ h = (h << 8) ^ bs[n-1-m];
+ h = mix64(h);
+ break;
+ }
+ else if (!retry)
+ retry = true;
+ else
+ break;
+ }
+ }
} catch (Exception ignore) {
}
- return (mix64((((long)hh) << 32) ^ System.currentTimeMillis()) ^
+ return (h ^ mix64(System.currentTimeMillis()) ^
mix64(System.nanoTime()));
}
--- a/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/concurrent/ThreadLocalRandom.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,6 +36,8 @@
package java.util.concurrent;
import java.io.ObjectStreamField;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
import java.util.Random;
import java.util.Spliterator;
import java.util.concurrent.atomic.AtomicInteger;
@@ -71,7 +73,10 @@
*
* <p>Instances of {@code ThreadLocalRandom} are not cryptographically
* secure. Consider instead using {@link java.security.SecureRandom}
- * in security-sensitive applications.
+ * in security-sensitive applications. Additionally,
+ * default-constructed instances do not use a cryptographically random
+ * seed unless the {@linkplain System#getProperty system property}
+ * {@code java.util.secureRandomSeed} is set to {@code true}.
*
* @since 1.7
* @author Doug Lea
@@ -129,9 +134,49 @@
/**
* The next seed for default constructors.
*/
- private static final AtomicLong seeder =
- new AtomicLong(mix64(System.currentTimeMillis()) ^
- mix64(System.nanoTime()));
+ private static final AtomicLong seeder = new AtomicLong(initialSeed());
+
+ private static long initialSeed() {
+ String pp = java.security.AccessController.doPrivileged(
+ new sun.security.action.GetPropertyAction(
+ "java.util.secureRandomSeed"));
+ if (pp != null && pp.equalsIgnoreCase("true")) {
+ byte[] seedBytes = java.security.SecureRandom.getSeed(8);
+ long s = (long)(seedBytes[0]) & 0xffL;
+ for (int i = 1; i < 8; ++i)
+ s = (s << 8) | ((long)(seedBytes[i]) & 0xffL);
+ return s;
+ }
+ long h = 0L;
+ try {
+ Enumeration<NetworkInterface> ifcs =
+ NetworkInterface.getNetworkInterfaces();
+ boolean retry = false; // retry once if getHardwareAddress is null
+ while (ifcs.hasMoreElements()) {
+ NetworkInterface ifc = ifcs.nextElement();
+ if (!ifc.isVirtual()) { // skip fake addresses
+ byte[] bs = ifc.getHardwareAddress();
+ if (bs != null) {
+ int n = bs.length;
+ int m = Math.min(n >>> 1, 4);
+ for (int i = 0; i < m; ++i)
+ h = (h << 16) ^ (bs[i] << 8) ^ bs[n-1-i];
+ if (m < 4)
+ h = (h << 8) ^ bs[n-1-m];
+ h = mix64(h);
+ break;
+ }
+ else if (!retry)
+ retry = true;
+ else
+ break;
+ }
+ }
+ } catch (Exception ignore) {
+ }
+ return (h ^ mix64(System.currentTimeMillis()) ^
+ mix64(System.nanoTime()));
+ }
/**
* The seed increment
--- a/jdk/src/share/classes/java/util/regex/Pattern.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/java/util/regex/Pattern.java Thu Oct 03 19:18:54 2013 +0100
@@ -5755,7 +5755,8 @@
* input sequence that is terminated by another subsequence that matches
* this pattern or is terminated by the end of the input sequence. The
* substrings in the stream are in the order in which they occur in the
- * input.
+ * input. Trailing empty strings will be discarded and not encountered in
+ * the stream.
*
* <p> If this pattern does not match any subsequence of the input then
* the resulting stream has just one element, namely the input sequence in
@@ -5781,6 +5782,8 @@
private int current;
// null if the next element, if any, needs to obtained
private String nextElement;
+ // > 0 if there are N next empty elements
+ private int emptyElementCount;
MatcherIterator() {
this.matcher = matcher(input);
@@ -5790,26 +5793,46 @@
if (!hasNext())
throw new NoSuchElementException();
- String n = nextElement;
- nextElement = null;
- return n;
+ if (emptyElementCount == 0) {
+ String n = nextElement;
+ nextElement = null;
+ return n;
+ } else {
+ emptyElementCount--;
+ return "";
+ }
}
public boolean hasNext() {
- if (nextElement != null)
+ if (nextElement != null || emptyElementCount > 0)
return true;
if (current == input.length())
return false;
- if (matcher.find()) {
+ // Consume the next matching element
+ // Count sequence of matching empty elements
+ while (matcher.find()) {
nextElement = input.subSequence(current, matcher.start()).toString();
current = matcher.end();
+ if (!nextElement.isEmpty()) {
+ return true;
+ } else {
+ emptyElementCount++;
+ }
+ }
+
+ // Consume last matching element
+ nextElement = input.subSequence(current, input.length()).toString();
+ current = input.length();
+ if (!nextElement.isEmpty()) {
+ return true;
} else {
- nextElement = input.subSequence(current, input.length()).toString();
- current = input.length();
+ // Ignore a terminal sequence of matching empty elements
+ emptyElementCount = 0;
+ nextElement = null;
+ return false;
}
- return true;
}
}
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(
--- a/jdk/src/share/classes/javax/management/MBeanAttributeInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanAttributeInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -286,10 +286,10 @@
if (!(o instanceof MBeanAttributeInfo))
return false;
MBeanAttributeInfo p = (MBeanAttributeInfo) o;
- return (p.getName().equals(getName()) &&
- p.getType().equals(getType()) &&
- p.getDescription().equals(getDescription()) &&
- p.getDescriptor().equals(getDescriptor()) &&
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getType(), getType()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
+ Objects.equals(p.getDescriptor(), getDescriptor()) &&
p.isReadable() == isReadable() &&
p.isWritable() == isWritable() &&
p.isIs() == isIs());
--- a/jdk/src/share/classes/javax/management/MBeanConstructorInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanConstructorInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -191,10 +191,10 @@
if (!(o instanceof MBeanConstructorInfo))
return false;
MBeanConstructorInfo p = (MBeanConstructorInfo) o;
- return (p.getName().equals(getName()) &&
- p.getDescription().equals(getDescription()) &&
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
Arrays.equals(p.fastGetSignature(), fastGetSignature()) &&
- p.getDescriptor().equals(getDescriptor()));
+ Objects.equals(p.getDescriptor(), getDescriptor()));
}
/* Unlike attributes and operations, it's quite likely we'll have
--- a/jdk/src/share/classes/javax/management/MBeanFeatureInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanFeatureInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -30,6 +30,7 @@
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.StreamCorruptedException;
+import java.util.Objects;
/**
* <p>Provides general information for an MBean descriptor object.
@@ -147,9 +148,9 @@
if (!(o instanceof MBeanFeatureInfo))
return false;
MBeanFeatureInfo p = (MBeanFeatureInfo) o;
- return (p.getName().equals(getName()) &&
- p.getDescription().equals(getDescription()) &&
- p.getDescriptor().equals(getDescriptor()));
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
+ Objects.equals(p.getDescriptor(), getDescriptor()));
}
public int hashCode() {
--- a/jdk/src/share/classes/javax/management/MBeanNotificationInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanNotificationInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -26,6 +26,7 @@
package javax.management;
import java.util.Arrays;
+import java.util.Objects;
/**
* <p>The <CODE>MBeanNotificationInfo</CODE> class is used to describe the
@@ -191,9 +192,9 @@
if (!(o instanceof MBeanNotificationInfo))
return false;
MBeanNotificationInfo p = (MBeanNotificationInfo) o;
- return (p.getName().equals(getName()) &&
- p.getDescription().equals(getDescription()) &&
- p.getDescriptor().equals(getDescriptor()) &&
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
+ Objects.equals(p.getDescriptor(), getDescriptor()) &&
Arrays.equals(p.fastGetNotifTypes(), fastGetNotifTypes()));
}
--- a/jdk/src/share/classes/javax/management/MBeanOperationInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanOperationInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -294,12 +294,12 @@
if (!(o instanceof MBeanOperationInfo))
return false;
MBeanOperationInfo p = (MBeanOperationInfo) o;
- return (p.getName().equals(getName()) &&
- p.getReturnType().equals(getReturnType()) &&
- p.getDescription().equals(getDescription()) &&
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getReturnType(), getReturnType()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
p.getImpact() == getImpact() &&
Arrays.equals(p.fastGetSignature(), fastGetSignature()) &&
- p.getDescriptor().equals(getDescriptor()));
+ Objects.equals(p.getDescriptor(), getDescriptor()));
}
/* We do not include everything in the hashcode. We assume that
--- a/jdk/src/share/classes/javax/management/MBeanParameterInfo.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/management/MBeanParameterInfo.java Thu Oct 03 19:18:54 2013 +0100
@@ -27,6 +27,7 @@
import java.util.Objects;
+
/**
* Describes an argument of an operation exposed by an MBean.
* Instances of this class are immutable. Subclasses may be mutable
@@ -137,10 +138,10 @@
if (!(o instanceof MBeanParameterInfo))
return false;
MBeanParameterInfo p = (MBeanParameterInfo) o;
- return (p.getName().equals(getName()) &&
- p.getType().equals(getType()) &&
- p.getDescription().equals(getDescription()) &&
- p.getDescriptor().equals(getDescriptor()));
+ return (Objects.equals(p.getName(), getName()) &&
+ Objects.equals(p.getType(), getType()) &&
+ Objects.equals(p.getDescription(), getDescription()) &&
+ Objects.equals(p.getDescriptor(), getDescriptor()));
}
public int hashCode() {
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java Thu Oct 03 19:18:54 2013 +0100
@@ -57,7 +57,7 @@
* be used in implementations:
*
* <table border=1>
- * <caption>Audio File Format Property Keys</caption>
+ * <caption>Audio File Format Properties</caption>
* <tr>
* <th>Property key</th>
* <th>Value type</th>
--- a/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java Thu Oct 03 19:18:54 2013 +0100
@@ -85,7 +85,7 @@
* service providers should use, if applicable:
*
* <table border=0>
- * <caption>Audio Format Property Keys</caption>
+ * <caption>Audio Format Properties</caption>
* <tr>
* <th>Property key</th>
* <th>Value type</th>
--- a/jdk/src/share/classes/javax/swing/JButton.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JButton.java Thu Oct 03 19:18:54 2013 +0100
@@ -149,7 +149,7 @@
/**
- * Returns a string that specifies the name of the L&F class
+ * Returns a string that specifies the name of the L&F class
* that renders this component.
*
* @return the string "ButtonUI"
@@ -157,7 +157,7 @@
* @see UIDefaults#getUI
* @beaninfo
* expert: true
- * description: A string that specifies the name of the L&F class.
+ * description: A string that specifies the name of the L&F class.
*/
public String getUIClassID() {
return uiClassID;
--- a/jdk/src/share/classes/javax/swing/JCheckBox.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JCheckBox.java Thu Oct 03 19:18:54 2013 +0100
@@ -230,7 +230,7 @@
/**
- * Returns a string that specifies the name of the L&F class
+ * Returns a string that specifies the name of the L&F class
* that renders this component.
*
* @return the string "CheckBoxUI"
@@ -238,7 +238,7 @@
* @see UIDefaults#getUI
* @beaninfo
* expert: true
- * description: A string that specifies the name of the L&F class
+ * description: A string that specifies the name of the L&F class
*/
public String getUIClassID() {
return uiClassID;
--- a/jdk/src/share/classes/javax/swing/JCheckBoxMenuItem.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JCheckBoxMenuItem.java Thu Oct 03 19:18:54 2013 +0100
@@ -168,7 +168,7 @@
}
/**
- * Returns the name of the L&F class
+ * Returns the name of the L&F class
* that renders this component.
*
* @return "CheckBoxMenuItemUI"
--- a/jdk/src/share/classes/javax/swing/JColorChooser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JColorChooser.java Thu Oct 03 19:18:54 2013 +0100
@@ -216,7 +216,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the <code>ColorChooserUI</code> object that renders
* this component
@@ -226,9 +226,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>ColorChooserUI</code> L&F object
+ * @param ui the <code>ColorChooserUI</code> L&F object
* @see UIDefaults#getUI
*
* @beaninfo
@@ -241,7 +241,7 @@
}
/**
- * Notification from the <code>UIManager</code> that the L&F has changed.
+ * Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the
* <code>UIManager</code>.
*
@@ -252,7 +252,7 @@
}
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "ColorChooserUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JComboBox.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JComboBox.java Thu Oct 03 19:18:54 2013 +0100
@@ -242,9 +242,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>ComboBoxUI</code> L&F object
+ * @param ui the <code>ComboBoxUI</code> L&F object
* @see UIDefaults#getUI
*
* @beaninfo
@@ -273,7 +273,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "ComboBoxUI"
* @see JComponent#getUIClassID
@@ -285,7 +285,7 @@
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the ComboBoxUI object that renders this component
*/
@@ -607,7 +607,7 @@
*
* @param anIndex an integer specifying the list item to select,
* where 0 specifies the first item in the list and -1 indicates no selection
- * @exception IllegalArgumentException if <code>anIndex</code> < -1 or
+ * @exception IllegalArgumentException if <code>anIndex</code> < -1 or
* <code>anIndex</code> is greater than or equal to size
* @beaninfo
* preferred: true
--- a/jdk/src/share/classes/javax/swing/JComponent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JComponent.java Thu Oct 03 19:18:54 2013 +0100
@@ -86,7 +86,7 @@
* <ul>
* <li>The base class for both standard and custom components
* that use the Swing architecture.
- * <li>A "pluggable look and feel" (L&F) that can be specified by the
+ * <li>A "pluggable look and feel" (L&F) that can be specified by the
* programmer or (optionally) selected by the user at runtime.
* The look and feel for each component is provided by a
* <em>UI delegate</em> -- an object that descends from
@@ -4523,7 +4523,7 @@
* @param propertyName the name of the property that was listened on
* @param oldValue the old value of the property
* @param newValue the new value of the property
- * @exception PropertyVetoException when the attempt to set the
+ * @exception java.beans.PropertyVetoException when the attempt to set the
* property is vetoed by the component
*/
protected void fireVetoableChange(String propertyName, Object oldValue, Object newValue)
--- a/jdk/src/share/classes/javax/swing/JDesktopPane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JDesktopPane.java Thu Oct 03 19:18:54 2013 +0100
@@ -50,13 +50,13 @@
* <code>JLayeredPane</code> to manage the potentially overlapping internal
* frames. It also maintains a reference to an instance of
* <code>DesktopManager</code> that is set by the UI
- * class for the current look and feel (L&F). Note that <code>JDesktopPane</code>
+ * class for the current look and feel (L&F). Note that <code>JDesktopPane</code>
* does not support borders.
* <p>
* This class is normally used as the parent of <code>JInternalFrames</code>
* to provide a pluggable <code>DesktopManager</code> object to the
* <code>JInternalFrames</code>. The <code>installUI</code> of the
- * L&F specific implementation is responsible for setting the
+ * L&F specific implementation is responsible for setting the
* <code>desktopManager</code> variable appropriately.
* When the parent of a <code>JInternalFrame</code> is a <code>JDesktopPane</code>,
* it should delegate most of its behavior to the <code>desktopManager</code>
@@ -146,7 +146,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the <code>DesktopPaneUI</code> object that
* renders this component
@@ -156,9 +156,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the DesktopPaneUI L&F object
+ * @param ui the DesktopPaneUI L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -232,7 +232,7 @@
}
/**
- * Notification from the <code>UIManager</code> that the L&F has changed.
+ * Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the
* <code>UIManager</code>.
*
@@ -244,7 +244,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "DesktopPaneUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JFileChooser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JFileChooser.java Thu Oct 03 19:18:54 2013 +0100
@@ -362,6 +362,7 @@
*/
protected void setup(FileSystemView view) {
installShowFilesListener();
+ installHierarchyListener();
if(view == null) {
view = FileSystemView.getFileSystemView();
@@ -374,6 +375,22 @@
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
}
+ private void installHierarchyListener() {
+ addHierarchyListener(new HierarchyListener() {
+ @Override
+ public void hierarchyChanged(HierarchyEvent e) {
+ if ((e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED)
+ == HierarchyEvent.PARENT_CHANGED) {
+ JFileChooser fc = JFileChooser.this;
+ JRootPane rootPane = SwingUtilities.getRootPane(fc);
+ if (rootPane != null) {
+ rootPane.setDefaultButton(fc.getUI().getDefaultButton(fc));
+ }
+ }
+ }
+ });
+ }
+
private void installShowFilesListener() {
// Track native setting for showing hidden files
Toolkit tk = Toolkit.getDefaultToolkit();
@@ -801,7 +818,6 @@
dialog.getRootPane().setWindowDecorationStyle(JRootPane.FILE_CHOOSER_DIALOG);
}
}
- dialog.getRootPane().setDefaultButton(ui.getDefaultButton(this));
dialog.pack();
dialog.setLocationRelativeTo(parent);
--- a/jdk/src/share/classes/javax/swing/JLayer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JLayer.java Thu Oct 03 19:18:54 2013 +0100
@@ -44,16 +44,16 @@
* {@code JLayer} is a universal decorator for Swing components
* which enables you to implement various advanced painting effects as well as
* receive notifications of all {@code AWTEvent}s generated within its borders.
- * <p/>
+ * <p>
* {@code JLayer} delegates the handling of painting and input events to a
* {@link javax.swing.plaf.LayerUI} object, which performs the actual decoration.
- * <p/>
+ * <p>
* The custom painting implemented in the {@code LayerUI} and events notification
* work for the JLayer itself and all its subcomponents.
* This combination enables you to enrich existing components
* by adding new advanced functionality such as temporary locking of a hierarchy,
* data tips for compound components, enhanced mouse scrolling etc and so on.
- * <p/>
+ * <p>
* {@code JLayer} is a good solution if you only need to do custom painting
* over compound component or catch input events from its subcomponents.
* <pre>
@@ -202,7 +202,7 @@
/**
* Returns the {@code JLayer}'s view component or {@code null}.
- * <br/>This is a bound property.
+ * <br>This is a bound property.
*
* @return the {@code JLayer}'s view component
* or {@code null} if none exists
@@ -215,7 +215,7 @@
/**
* Sets the {@code JLayer}'s view component, which can be {@code null}.
- * <br/>This is a bound property.
+ * <br>This is a bound property.
*
* @param view the view component for this {@code JLayer}
*
@@ -257,7 +257,7 @@
/**
* Returns the {@code JLayer}'s glassPane component or {@code null}.
- * <br/>This is a bound property.
+ * <br>This is a bound property.
*
* @return the {@code JLayer}'s glassPane component
* or {@code null} if none exists
@@ -270,7 +270,7 @@
/**
* Sets the {@code JLayer}'s glassPane component, which can be {@code null}.
- * <br/>This is a bound property.
+ * <br>This is a bound property.
*
* @param glassPane the glassPane component of this {@code JLayer}
*
@@ -309,7 +309,7 @@
/**
* Sets the layout manager for this container. This method is
* overridden to prevent the layout manager from being set.
- * <p/>Note: If {@code mgr} is non-{@code null}, this
+ * <p>Note: If {@code mgr} is non-{@code null}, this
* method will throw an exception as layout managers are not supported on
* a {@code JLayer}.
*
@@ -327,7 +327,7 @@
* of this component from becoming complex enough to inhibit
* subclassing of {@code LayerUI} class. To create a {@code JLayer} with a border,
* add it to a {@code JPanel} that has a border.
- * <p/>Note: If {@code border} is non-{@code null}, this
+ * <p>Note: If {@code border} is non-{@code null}, this
* method will throw an exception as borders are not supported on
* a {@code JLayer}.
*
@@ -471,11 +471,11 @@
* defined by the specified event mask parameter
* to be delivered to the
* {@link LayerUI#eventDispatched(AWTEvent, JLayer)} method.
- * <p/>
+ * <p>
* Events are delivered provided that {@code LayerUI} is set
* for this {@code JLayer} and the {@code JLayer}
* is displayable.
- * <p/>
+ * <p>
* The following example shows how to correctly use this method
* in the {@code LayerUI} implementations:
* <pre>
@@ -519,10 +519,10 @@
/**
* Returns the bitmap of event mask to receive by this {@code JLayer}
* and its {@code LayerUI}.
- * <p/>
+ * <p>
* It means that {@link javax.swing.plaf.LayerUI#eventDispatched(AWTEvent, JLayer)} method
* will only receive events that match the event mask.
- * <p/>
+ * <p>
* By default {@code JLayer} receives no events.
*
* @return the bitmask of event types to receive for this {@code JLayer}
@@ -543,7 +543,7 @@
/**
* Returns the preferred size of the viewport for a view component.
- * <p/>
+ * <p>
* If the view component of this layer implements {@link Scrollable}, this method delegates its
* implementation to the view component.
*
@@ -562,7 +562,7 @@
* Returns a scroll increment, which is required for components
* that display logical rows or columns in order to completely expose
* one block of rows or columns, depending on the value of orientation.
- * <p/>
+ * <p>
* If the view component of this layer implements {@link Scrollable}, this method delegates its
* implementation to the view component.
*
@@ -584,7 +584,7 @@
* Returns {@code false} to indicate that the height of the viewport does not
* determine the height of the layer, unless the preferred height
* of the layer is smaller than the height of the viewport.
- * <p/>
+ * <p>
* If the view component of this layer implements {@link Scrollable}, this method delegates its
* implementation to the view component.
*
@@ -603,7 +603,7 @@
* Returns {@code false} to indicate that the width of the viewport does not
* determine the width of the layer, unless the preferred width
* of the layer is smaller than the width of the viewport.
- * <p/>
+ * <p>
* If the view component of this layer implements {@link Scrollable}, this method delegates its
* implementation to the view component.
*
@@ -624,10 +624,10 @@
* one new row or column, depending on the value of orientation.
* Ideally, components should handle a partially exposed row or column
* by returning the distance required to completely expose the item.
- * <p/>
+ * <p>
* Scrolling containers, like {@code JScrollPane}, will use this method
* each time the user requests a unit scroll.
- * <p/>
+ * <p>
* If the view component of this layer implements {@link Scrollable}, this method delegates its
* implementation to the view component.
*
--- a/jdk/src/share/classes/javax/swing/JMenuItem.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JMenuItem.java Thu Oct 03 19:18:54 2013 +0100
@@ -229,7 +229,7 @@
/**
* Sets the look and feel object that renders this component.
*
- * @param ui the <code>JMenuItemUI</code> L&F object
+ * @param ui the <code>JMenuItemUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -252,7 +252,7 @@
/**
- * Returns the suffix used to construct the name of the L&F class used to
+ * Returns the suffix used to construct the name of the L&F class used to
* render this component.
*
* @return the string "MenuItemUI"
--- a/jdk/src/share/classes/javax/swing/JPanel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPanel.java Thu Oct 03 19:18:54 2013 +0100
@@ -127,7 +127,7 @@
}
/**
- * Returns the look and feel (L&F) object that renders this component.
+ * Returns the look and feel (L&amp;F) object that renders this component.
*
* @return the PanelUI object that renders this component
* @since 1.4
@@ -138,9 +138,9 @@
/**
- * Sets the look and feel (L&F) object that renders this component.
+ * Sets the look and feel (L&F) object that renders this component.
*
- * @param ui the PanelUI L&F object
+ * @param ui the PanelUI L&F object
* @see UIDefaults#getUI
* @since 1.4
* @beaninfo
@@ -154,7 +154,7 @@
}
/**
- * Returns a string that specifies the name of the L&F class
+ * Returns a string that specifies the name of the L&F class
* that renders this component.
*
* @return "PanelUI"
@@ -162,7 +162,7 @@
* @see UIDefaults#getUI
* @beaninfo
* expert: true
- * description: A string that specifies the name of the L&F class.
+ * description: A string that specifies the name of the L&F class.
*/
public String getUIClassID() {
return uiClassID;
--- a/jdk/src/share/classes/javax/swing/JPasswordField.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPasswordField.java Thu Oct 03 19:18:54 2013 +0100
@@ -101,7 +101,7 @@
* number of columns. A default model is created, and the initial string
* is set to <code>null</code>.
*
- * @param columns the number of columns >= 0
+ * @param columns the number of columns >= 0
*/
public JPasswordField(int columns) {
this(null, null, columns);
@@ -113,7 +113,7 @@
* the default.
*
* @param text the text to be displayed, <code>null</code> if none
- * @param columns the number of columns >= 0
+ * @param columns the number of columns >= 0
*/
public JPasswordField(String text, int columns) {
this(null, text, columns);
@@ -130,7 +130,7 @@
* @param doc the text storage to use
* @param txt the text to be displayed, <code>null</code> if none
* @param columns the number of columns to use to calculate
- * the preferred width >= 0; if columns is set to zero, the
+ * the preferred width >= 0; if columns is set to zero, the
* preferred width will be whatever naturally results from
* the component implementation
*/
@@ -143,7 +143,7 @@
}
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "PasswordFieldUI"
* @see JComponent#getUIClassID
@@ -271,8 +271,8 @@
* <code>getPassword</code> method instead.
* @deprecated As of Java 2 platform v1.2,
* replaced by <code>getPassword</code>.
- * @param offs the offset >= 0
- * @param len the length >= 0
+ * @param offs the offset >= 0
+ * @param len the length >= 0
* @return the text
* @exception BadLocationException if the offset or length are invalid
*/
--- a/jdk/src/share/classes/javax/swing/JPopupMenu.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPopupMenu.java Thu Oct 03 19:18:54 2013 +0100
@@ -196,7 +196,7 @@
/**
- * Returns the look and feel (L&F) object that renders this component.
+ * Returns the look and feel (L&F) object that renders this component.
*
* @return the <code>PopupMenuUI</code> object that renders this component
*/
@@ -205,9 +205,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the new <code>PopupMenuUI</code> L&F object
+ * @param ui the new <code>PopupMenuUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -230,7 +230,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "PopupMenuUI"
* @see JComponent#getUIClassID
@@ -461,7 +461,7 @@
*
* @param pos the position of the item to be removed
* @exception IllegalArgumentException if the value of
- * <code>pos</code> < 0, or if the value of
+ * <code>pos</code> < 0, or if the value of
* <code>pos</code> is greater than the
* number of items
*/
@@ -560,7 +560,7 @@
* @param a the <code>Action</code> object to insert
* @param index specifies the position at which to insert the
* <code>Action</code>, where 0 is the first
- * @exception IllegalArgumentException if <code>index</code> < 0
+ * @exception IllegalArgumentException if <code>index</code> < 0
* @see Action
*/
public void insert(Action a, int index) {
@@ -576,7 +576,7 @@
* @param component the <code>Component</code> to insert
* @param index specifies the position at which
* to insert the component, where 0 is the first
- * @exception IllegalArgumentException if <code>index</code> < 0
+ * @exception IllegalArgumentException if <code>index</code> < 0
*/
public void insert(Component component, int index) {
if (index < 0) {
@@ -1535,7 +1535,7 @@
}
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "PopupMenuSeparatorUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JRadioButton.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRadioButton.java Thu Oct 03 19:18:54 2013 +0100
@@ -193,7 +193,7 @@
/**
- * Returns the name of the L&F class
+ * Returns the name of the L&F class
* that renders this component.
*
* @return String "RadioButtonUI"
@@ -201,7 +201,7 @@
* @see UIDefaults#getUI
* @beaninfo
* expert: true
- * description: A string that specifies the name of the L&F class.
+ * description: A string that specifies the name of the L&F class.
*/
public String getUIClassID() {
return uiClassID;
--- a/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Thu Oct 03 19:18:54 2013 +0100
@@ -181,7 +181,7 @@
}
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "RadioButtonMenuItemUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JRootPane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRootPane.java Thu Oct 03 19:18:54 2013 +0100
@@ -448,7 +448,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return <code>LabelUI</code> object
* @since 1.3
@@ -458,9 +458,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>LabelUI</code> L&F object
+ * @param ui the <code>LabelUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -486,7 +486,7 @@
/**
- * Returns a string that specifies the name of the L&F class
+ * Returns a string that specifies the name of the L&F class
* that renders this component.
*
* @return the string "RootPaneUI"
--- a/jdk/src/share/classes/javax/swing/JScrollBar.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JScrollBar.java Thu Oct 03 19:18:54 2013 +0100
@@ -344,6 +344,9 @@
* that override this method and delegate to the viewports
* Scrollable view, if it has one. The Scrollable interface
* provides a more specialized version of this method.
+ * <p>
+ * Some look and feels implement custom scrolling behavior
+ * and ignore this property.
*
* @param direction is -1 or 1 for up/down respectively
* @return the value of the unitIncrement property
@@ -361,6 +364,10 @@
* <p>
* Note, that if the argument is equal to the value of Integer.MIN_VALUE,
* the most look and feels will not provide the scrolling to the right/down.
+ * <p>
+ * Some look and feels implement custom scrolling behavior
+ * and ignore this property.
+ *
* @see #getUnitIncrement
* @beaninfo
* preferred: true
@@ -387,6 +394,9 @@
* that override this method and delegate to the viewports
* Scrollable view, if it has one. The Scrollable interface
* provides a more specialized version of this method.
+ * <p>
+ * Some look and feels implement custom scrolling behavior
+ * and ignore this property.
*
* @param direction is -1 or 1 for up/down respectively
* @return the value of the blockIncrement property
@@ -404,6 +414,10 @@
* <p>
* Note, that if the argument is equal to the value of Integer.MIN_VALUE,
* the most look and feels will not provide the scrolling to the right/down.
+ * <p>
+ * Some look and feels implement custom scrolling behavior
+ * and ignore this property.
+ *
* @see #getBlockIncrement()
* @beaninfo
* preferred: true
--- a/jdk/src/share/classes/javax/swing/JScrollPane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JScrollPane.java Thu Oct 03 19:18:54 2013 +0100
@@ -353,7 +353,7 @@
/**
- * Returns the look and feel (L&F) object that renders this component.
+ * Returns the look and feel (L&F) object that renders this component.
*
* @return the <code>ScrollPaneUI</code> object that renders this
* component
@@ -371,9 +371,9 @@
/**
* Sets the <code>ScrollPaneUI</code> object that provides the
- * look and feel (L&F) for this component.
+ * look and feel (L&F) for this component.
*
- * @param ui the <code>ScrollPaneUI</code> L&F object
+ * @param ui the <code>ScrollPaneUI</code> L&F object
* @see #getUI
*/
public void setUI(ScrollPaneUI ui) {
@@ -395,7 +395,7 @@
/**
- * Returns the suffix used to construct the name of the L&F class used to
+ * Returns the suffix used to construct the name of the L&F class used to
* render this component.
*
* @return the string "ScrollPaneUI"
--- a/jdk/src/share/classes/javax/swing/JSeparator.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSeparator.java Thu Oct 03 19:18:54 2013 +0100
@@ -108,7 +108,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the SeparatorUI object that renders this component
*/
@@ -117,9 +117,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the SeparatorUI L&F object
+ * @param ui the SeparatorUI L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -142,7 +142,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "SeparatorUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JSlider.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSlider.java Thu Oct 03 19:18:54 2013 +0100
@@ -289,9 +289,9 @@
/**
- * Gets the UI object which implements the L&F for this component.
+ * Gets the UI object which implements the L&F for this component.
*
- * @return the SliderUI object that implements the Slider L&F
+ * @return the SliderUI object that implements the Slider L&F
*/
public SliderUI getUI() {
return(SliderUI)ui;
@@ -299,9 +299,9 @@
/**
- * Sets the UI object which implements the L&F for this component.
+ * Sets the UI object which implements the L&F for this component.
*
- * @param ui the SliderUI L&F object
+ * @param ui the SliderUI L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -330,7 +330,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return "SliderUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JSpinner.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSpinner.java Thu Oct 03 19:18:54 2013 +0100
@@ -171,7 +171,7 @@
/**
- * Returns the look and feel (L&F) object that renders this component.
+ * Returns the look and feel (L&F) object that renders this component.
*
* @return the <code>SpinnerUI</code> object that renders this component
*/
@@ -181,9 +181,9 @@
/**
- * Sets the look and feel (L&F) object that renders this component.
+ * Sets the look and feel (L&F) object that renders this component.
*
- * @param ui the <code>SpinnerUI</code> L&F object
+ * @param ui the <code>SpinnerUI</code> L&F object
* @see UIDefaults#getUI
*/
public void setUI(SpinnerUI ui) {
@@ -193,7 +193,7 @@
/**
* Returns the suffix used to construct the name of the look and feel
- * (L&F) class used to render this component.
+ * (L&F) class used to render this component.
*
* @return the string "SpinnerUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JSplitPane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSplitPane.java Thu Oct 03 19:18:54 2013 +0100
@@ -359,9 +359,9 @@
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>SplitPaneUI</code> L&F object
+ * @param ui the <code>SplitPaneUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -384,7 +384,7 @@
* @return the <code>SplitPaneUI</code> object that renders this component
* @beaninfo
* expert: true
- * description: The L&F object that renders this component.
+ * description: The L&F object that renders this component.
*/
public SplitPaneUI getUI() {
return (SplitPaneUI)ui;
@@ -392,7 +392,7 @@
/**
- * Notification from the <code>UIManager</code> that the L&F has changed.
+ * Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the
* <code>UIManager</code>.
*
@@ -405,14 +405,14 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "SplitPaneUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
* @beaninfo
* expert: true
- * description: A string that specifies the name of the L&F class.
+ * description: A string that specifies the name of the L&F class.
*/
public String getUIClassID() {
return uiClassID;
@@ -714,7 +714,7 @@
* extra space.
*
* @param value as described above
- * @exception IllegalArgumentException if <code>value</code> is < 0 or > 1
+ * @exception IllegalArgumentException if <code>value</code> is < 0 or > 1
* @since 1.3
* @beaninfo
* bound: true
@@ -769,8 +769,8 @@
* @param proportionalLocation a double-precision floating point value
* that specifies a percentage, from zero (top/left) to 1.0
* (bottom/right)
- * @exception IllegalArgumentException if the specified location is < 0
- * or > 1.0
+ * @exception IllegalArgumentException if the specified location is < 0
+ * or > 1.0
* @beaninfo
* description: The location of the divider.
*/
@@ -845,7 +845,7 @@
* location (typically a pixel count); or -1 if the UI is
* <code>null</code>
* @beaninfo
- * description: The minimum location of the divider from the L&F.
+ * description: The minimum location of the divider from the L&F.
*/
public int getMinimumDividerLocation() {
SplitPaneUI ui = getUI();
--- a/jdk/src/share/classes/javax/swing/JTable.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTable.java Thu Oct 03 19:18:54 2013 +0100
@@ -1945,7 +1945,7 @@
* Sets the table's selection mode to allow only single selections, a single
* contiguous interval, or multiple intervals.
* <P>
- * <bold>Note:</bold>
+ * <b>Note:</b>
* <code>JTable</code> provides all the methods for handling
* column and row selection. When setting states,
* such as <code>setSelectionMode</code>, it not only
@@ -2061,7 +2061,7 @@
/**
* Returns true if both row and column selection models are enabled.
- * Equivalent to <code>getRowSelectionAllowed() &&
+ * Equivalent to <code>getRowSelectionAllowed() &&
* getColumnSelectionAllowed()</code>.
*
* @return true if both row and column selection models are enabled
@@ -3034,7 +3034,7 @@
* adjusted.
* </ul>
* <p>
- * <bold>Note:</bold> When a <code>JTable</code> makes adjustments
+ * <b>Note:</b> When a <code>JTable</code> makes adjustments
* to the widths of the columns it respects their minimum and
* maximum values absolutely. It is therefore possible that,
* even after this method is called, the total width of the columns
@@ -3086,14 +3086,14 @@
* </pre>
* where each individual delta[i] is calculated according to:
* <p>
- * If (DELTA < 0) we are in shrink mode where:
+ * If (DELTA < 0) we are in shrink mode where:
* <p>
* <PRE>
* DELTA
* delta[i] = ------------ * (pref[i] - min[i])
* (PREF - MIN)
* </PRE>
- * If (DELTA > 0) we are in expand mode where:
+ * If (DELTA > 0) we are in expand mode where:
* <p>
* <PRE>
* DELTA
@@ -3368,7 +3368,7 @@
* method in order to allow the renderer's tips to be used
* if it has text set.
* <p>
- * <bold>Note:</bold> For <code>JTable</code> to properly display
+ * <b>Note:</b> For <code>JTable</code> to properly display
* tooltips of its renderers
* <code>JTable</code> must be a registered component with the
* <code>ToolTipManager</code>.
@@ -3580,7 +3580,7 @@
//
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the <code>TableUI</code> object that renders this component
*/
@@ -3589,9 +3589,9 @@
}
/**
- * Sets the L&F object that renders this component and repaints.
- *
- * @param ui the TableUI L&F object
+ * Sets the L&F object that renders this component and repaints.
+ *
+ * @param ui the TableUI L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -3607,7 +3607,7 @@
}
/**
- * Notification from the <code>UIManager</code> that the L&F has changed.
+ * Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the
* <code>UIManager</code>.
*
@@ -3647,7 +3647,7 @@
}
/**
- * Returns the suffix used to construct the name of the L&F class used to
+ * Returns the suffix used to construct the name of the L&F class used to
* render this component.
*
* @return the string "TableUI"
--- a/jdk/src/share/classes/javax/swing/JTextArea.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTextArea.java Thu Oct 03 19:18:54 2013 +0100
@@ -155,8 +155,8 @@
* rows and columns. A default model is created, and the initial
* string is null.
*
- * @param rows the number of rows >= 0
- * @param columns the number of columns >= 0
+ * @param rows the number of rows >= 0
+ * @param columns the number of columns >= 0
* @exception IllegalArgumentException if the rows or columns
* arguments are negative.
*/
@@ -169,8 +169,8 @@
* of rows and columns. A default model is created.
*
* @param text the text to be displayed, or null
- * @param rows the number of rows >= 0
- * @param columns the number of columns >= 0
+ * @param rows the number of rows >= 0
+ * @param columns the number of columns >= 0
* @exception IllegalArgumentException if the rows or columns
* arguments are negative.
*/
@@ -195,8 +195,8 @@
*
* @param doc the model to use, or create a default one if null
* @param text the text to be displayed, null if none
- * @param rows the number of rows >= 0
- * @param columns the number of columns >= 0
+ * @param rows the number of rows >= 0
+ * @param columns the number of columns >= 0
* @exception IllegalArgumentException if the rows or columns
* arguments are negative.
*/
@@ -364,8 +364,8 @@
* Translates an offset into the components text to a
* line number.
*
- * @param offset the offset >= 0
- * @return the line number >= 0
+ * @param offset the offset >= 0
+ * @return the line number >= 0
* @exception BadLocationException thrown if the offset is
* less than zero or greater than the document length.
*/
@@ -384,7 +384,7 @@
/**
* Determines the number of lines contained in the area.
*
- * @return the number of lines > 0
+ * @return the number of lines > 0
*/
public int getLineCount() {
Element map = getDocument().getDefaultRootElement();
@@ -394,8 +394,8 @@
/**
* Determines the offset of the start of the given line.
*
- * @param line the line number to translate >= 0
- * @return the offset >= 0
+ * @param line the line number to translate >= 0
+ * @return the offset >= 0
* @exception BadLocationException thrown if the line is
* less than zero or greater or equal to the number of
* lines contained in the document (as reported by
@@ -417,8 +417,8 @@
/**
* Determines the offset of the end of the given line.
*
- * @param line the line >= 0
- * @return the offset >= 0
+ * @param line the line >= 0
+ * @return the offset >= 0
* @exception BadLocationException Thrown if the line is
* less than zero or greater or equal to the number of
* lines contained in the document (as reported by
@@ -446,7 +446,7 @@
* if the model is null or if the text is null or empty.
*
* @param str the text to insert
- * @param pos the position at which to insert >= 0
+ * @param pos the position at which to insert >= 0
* @exception IllegalArgumentException if pos is an
* invalid position in the model
* @see TextComponent#setText
@@ -486,8 +486,8 @@
* does a delete if the new string is null or empty.
*
* @param str the text to use as the replacement
- * @param start the start position >= 0
- * @param end the end position >= start
+ * @param start the start position >= 0
+ * @param end the end position >= start
* @exception IllegalArgumentException if part of the range is an
* invalid position in the model
* @see #insert
@@ -517,7 +517,7 @@
/**
* Returns the number of rows in the TextArea.
*
- * @return the number of rows >= 0
+ * @return the number of rows >= 0
*/
public int getRows() {
return rows;
@@ -527,7 +527,7 @@
* Sets the number of rows for this TextArea. Calls invalidate() after
* setting the new value.
*
- * @param rows the number of rows >= 0
+ * @param rows the number of rows >= 0
* @exception IllegalArgumentException if rows is less than 0
* @see #getRows
* @beaninfo
@@ -548,7 +548,7 @@
* Defines the meaning of the height of a row. This defaults to
* the height of the font.
*
- * @return the height >= 1
+ * @return the height >= 1
*/
protected int getRowHeight() {
if (rowHeight == 0) {
@@ -561,7 +561,7 @@
/**
* Returns the number of columns in the TextArea.
*
- * @return number of columns >= 0
+ * @return number of columns >= 0
*/
public int getColumns() {
return columns;
@@ -571,7 +571,7 @@
* Sets the number of columns for this TextArea. Does an invalidate()
* after setting the new value.
*
- * @param columns the number of columns >= 0
+ * @param columns the number of columns >= 0
* @exception IllegalArgumentException if columns is less than 0
* @see #getColumns
* @beaninfo
@@ -596,7 +596,7 @@
* character <em>m</em> for the font used. This method can be
* redefined to be some alternative amount.
*
- * @return the column width >= 1
+ * @return the column width >= 1
*/
protected int getColumnWidth() {
if (columnWidth == 0) {
--- a/jdk/src/share/classes/javax/swing/JTextField.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTextField.java Thu Oct 03 19:18:54 2013 +0100
@@ -128,7 +128,7 @@
return;
}
char[] upper = str.toCharArray();
- for (int i = 0; i < upper.length; i++) {
+ for (int i = 0; i < upper.length; i++) {
upper[i] = Character.toUpperCase(upper[i]);
}
super.insertString(offs, new String(upper), a);
@@ -223,10 +223,10 @@
* <code>createDefaultModel</code> method
* @param text the initial string to display, or <code>null</code>
* @param columns the number of columns to use to calculate
- * the preferred width >= 0; if <code>columns</code>
+ * the preferred width >= 0; if <code>columns</code>
* is set to zero, the preferred width will be whatever
* naturally results from the component implementation
- * @exception IllegalArgumentException if <code>columns</code> < 0
+ * @exception IllegalArgumentException if <code>columns</code> < 0
*/
public JTextField(Document doc, String text, int columns) {
if (columns < 0) {
--- a/jdk/src/share/classes/javax/swing/JToggleButton.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToggleButton.java Thu Oct 03 19:18:54 2013 +0100
@@ -186,14 +186,14 @@
}
/**
- * Returns a string that specifies the name of the l&f class
+ * Returns a string that specifies the name of the l&f class
* that renders this component.
*
* @return String "ToggleButtonUI"
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
* @beaninfo
- * description: A string that specifies the name of the L&F class
+ * description: A string that specifies the name of the L&F class
*/
public String getUIClassID() {
return uiClassID;
--- a/jdk/src/share/classes/javax/swing/JToolBar.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToolBar.java Thu Oct 03 19:18:54 2013 +0100
@@ -167,9 +167,9 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>ToolBarUI</code> L&F object
+ * @param ui the <code>ToolBarUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -182,7 +182,7 @@
}
/**
- * Notification from the <code>UIFactory</code> that the L&F has changed.
+ * Notification from the <code>UIFactory</code> that the L&F has changed.
* Called to replace the UI with the latest version from the
* <code>UIFactory</code>.
*
@@ -202,7 +202,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "ToolBarUI"
* @see JComponent#getUIClassID
@@ -613,7 +613,7 @@
}
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "ToolBarSeparatorUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JToolTip.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToolTip.java Thu Oct 03 19:18:54 2013 +0100
@@ -85,7 +85,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the <code>ToolTipUI</code> object that renders this component
*/
@@ -104,7 +104,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "ToolTipUI"
* @see JComponent#getUIClassID
--- a/jdk/src/share/classes/javax/swing/JTree.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTree.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,7 +41,7 @@
/**
- * <a name="jtree_description">
+ * <a name="jtree_description"></a>
* A control that displays a set of hierarchical data as an outline.
* You can find task-oriented documentation and examples of using trees in
* <a href="http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html">How to Use Trees</a>,
@@ -59,7 +59,7 @@
* under a collapsed ancestor. All of a <i>viewable</i> nodes parents
* are expanded, but may or may not be displayed. A <i>displayed</i> node
* is both viewable and in the display area, where it can be seen.
- * <p>
+ * </p>
* The following <code>JTree</code> methods use "visible" to mean "displayed":
* <ul>
* <li><code>isRootVisible()</code>
@@ -69,14 +69,12 @@
* <li><code>getVisibleRowCount()</code>
* <li><code>setVisibleRowCount()</code>
* </ul>
- * <p>
* The next group of <code>JTree</code> methods use "visible" to mean
* "viewable" (under an expanded parent):
* <ul>
* <li><code>isVisible()</code>
* <li><code>makeVisible()</code>
* </ul>
- * <p>
* If you are interested in knowing when the selection changes implement
* the <code>TreeSelectionListener</code> interface and add the instance
* using the method <code>addTreeSelectionListener</code>.
@@ -87,6 +85,7 @@
* If you are interested in detecting either double-click events or when
* a user clicks on a node, regardless of whether or not it was selected,
* we recommend you do the following:
+ * </p>
* <pre>
* final JTree tree = ...;
*
@@ -114,12 +113,13 @@
* a graphic icon and text), subclass {@link TreeCellRenderer} and use
* {@link #setCellRenderer} to tell the tree to use it. To edit such nodes,
* subclass {@link TreeCellEditor} and use {@link #setCellEditor}.
+ * </p>
* <p>
* Like all <code>JComponent</code> classes, you can use {@link InputMap} and
* {@link ActionMap}
* to associate an {@link Action} object with a {@link KeyStroke}
* and execute the action under specified conditions.
- * <p>
+ * </p>
* <strong>Warning:</strong> Swing is not thread safe. For more
* information see <a
* href="package-summary.html#threading">Swing's Threading
@@ -133,7 +133,7 @@
* of all JavaBeans<sup><font size="-2">TM</font></sup>
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
- *
+ *</p>
* @beaninfo
* attribute: isContainer false
* description: A component that displays a set of hierarchical data as an outline.
@@ -174,7 +174,7 @@
transient protected TreeCellRenderer cellRenderer;
/**
- * Height to use for each display row. If this is <= 0 the renderer
+ * Height to use for each display row. If this is <= 0 the renderer
* determines the height for each row.
*/
protected int rowHeight;
@@ -671,7 +671,7 @@
}
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return the <code>TreeUI</code> object that renders this component
*/
@@ -680,11 +680,11 @@
}
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
* <p>
* This is a bound property.
*
- * @param ui the <code>TreeUI</code> L&F object
+ * @param ui the <code>TreeUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -706,7 +706,7 @@
}
/**
- * Notification from the <code>UIManager</code> that the L&F has changed.
+ * Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the
* <code>UIManager</code>.
*
@@ -721,7 +721,7 @@
/**
- * Returns the name of the L&F class that renders this component.
+ * Returns the name of the L&F class that renders this component.
*
* @return the string "TreeUI"
* @see JComponent#getUIClassID
@@ -1701,7 +1701,7 @@
/**
* Selects the nodes corresponding to each of the specified rows
* in the display. If a particular element of <code>rows</code> is
- * < 0 or >= <code>getRowCount</code>, it will be ignored.
+ * < 0 or >= <code>getRowCount</code>, it will be ignored.
* If none of the elements
* in <code>rows</code> are valid rows, the selection will
* be cleared. That is it will be as if <code>clearSelection</code>
@@ -2162,8 +2162,8 @@
*
* @param row an integer specifying a row
* @return the <code>TreePath</code> to the specified node,
- * <code>null</code> if <code>row < 0</code>
- * or <code>row >= getRowCount()</code>
+ * <code>null</code> if <code>row < 0</code>
+ * or <code>row >= getRowCount()</code>
*/
public TreePath getPathForRow(int row) {
TreeUI tree = getUI();
@@ -2211,7 +2211,7 @@
* Ensures that the node in the specified row is expanded and
* viewable.
* <p>
- * If <code>row</code> is < 0 or >= <code>getRowCount</code> this
+ * If <code>row</code> is < 0 or >= <code>getRowCount</code> this
* will have no effect.
*
* @param row an integer specifying a display row, where 0 is the
@@ -2234,7 +2234,7 @@
/**
* Ensures that the node in the specified row is collapsed.
* <p>
- * If <code>row</code> is < 0 or >= <code>getRowCount</code> this
+ * If <code>row</code> is < 0 or >= <code>getRowCount</code> this
* will have no effect.
*
* @param row an integer specifying a display row, where 0 is the
--- a/jdk/src/share/classes/javax/swing/JViewport.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JViewport.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,8 @@
package javax.swing;
+import sun.swing.JLightweightFrame;
+
import java.awt.*;
import java.awt.event.*;
import java.awt.peer.ComponentPeer;
@@ -283,7 +285,7 @@
/**
- * Returns the L&F object that renders this component.
+ * Returns the L&F object that renders this component.
*
* @return a <code>ViewportUI</code> object
* @since 1.3
@@ -294,9 +296,9 @@
/**
- * Sets the L&F object that renders this component.
+ * Sets the L&F object that renders this component.
*
- * @param ui the <code>ViewportUI</code> L&F object
+ * @param ui the <code>ViewportUI</code> L&F object
* @see UIDefaults#getUI
* @beaninfo
* bound: true
@@ -321,7 +323,7 @@
/**
- * Returns a string that specifies the name of the L&F class
+ * Returns a string that specifies the name of the L&F class
* that renders this component.
*
* @return the string "ViewportUI"
@@ -361,6 +363,17 @@
super.remove(child);
}
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ // JLightweightFrame does not support BLIT_SCROLL_MODE, so it should be replaced
+ Window rootWindow = SwingUtilities.getWindowAncestor(this);
+ if (rootWindow instanceof JLightweightFrame
+ && getScrollMode() == BLIT_SCROLL_MODE) {
+ setScrollMode(BACKINGSTORE_SCROLL_MODE);
+ }
+ }
+
/**
* Scrolls the view so that <code>Rectangle</code>
--- a/jdk/src/share/classes/javax/swing/KeyStroke.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/KeyStroke.java Thu Oct 03 19:18:54 2013 +0100
@@ -284,11 +284,11 @@
* If typed, pressed or released is not specified, pressed is assumed. Here
* are some examples:
* <pre>
- * "INSERT" => getKeyStroke(KeyEvent.VK_INSERT, 0);
- * "control DELETE" => getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
- * "alt shift X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
- * "alt shift released X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
- * "typed a" => getKeyStroke('a');
+ * "INSERT" => getKeyStroke(KeyEvent.VK_INSERT, 0);
+ * "control DELETE" => getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK);
+ * "alt shift X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK);
+ * "alt shift released X" => getKeyStroke(KeyEvent.VK_X, InputEvent.ALT_MASK | InputEvent.SHIFT_MASK, true);
+ * "typed a" => getKeyStroke('a');
* </pre>
*
* In order to maintain backward-compatibility, specifying a null String,
--- a/jdk/src/share/classes/javax/swing/OverlayLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/OverlayLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -190,7 +190,7 @@
* Returns the alignment along the x axis for the container.
*
* @param target the container
- * @return the alignment >= 0.0f && <= 1.0f
+ * @return the alignment >= 0.0f && <= 1.0f
*/
public float getLayoutAlignmentX(Container target) {
checkContainer(target);
@@ -202,7 +202,7 @@
* Returns the alignment along the y axis for the container.
*
* @param target the container
- * @return the alignment >= 0.0f && <= 1.0f
+ * @return the alignment >= 0.0f && <= 1.0f
*/
public float getLayoutAlignmentY(Container target) {
checkContainer(target);
--- a/jdk/src/share/classes/javax/swing/ProgressMonitor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/ProgressMonitor.java Thu Oct 03 19:18:54 2013 +0100
@@ -251,7 +251,7 @@
/**
* Indicate the progress of the operation being monitored.
- * If the specified value is >= the maximum, the progress
+ * If the specified value is >= the maximum, the progress
* monitor is closed.
* @param nv an int specifying the current value, between the
* maximum and minimum specified for this component
@@ -302,7 +302,7 @@
/**
* Indicate that the operation is complete. This happens automatically
- * when the value set by setProgress is >= max, but it may be called
+ * when the value set by setProgress is >= max, but it may be called
* earlier if the operation ends early.
*/
public void close() {
--- a/jdk/src/share/classes/javax/swing/RowFilter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/RowFilter.java Thu Oct 03 19:18:54 2013 +0100
@@ -357,7 +357,7 @@
*
* @param index the index of the value to get
* @return value at the specified index
- * @throws <code>IndexOutOfBoundsException</code> if index < 0 or
+ * @throws IndexOutOfBoundsException if index < 0 or
* >= getValueCount
*/
public abstract Object getValue(int index);
@@ -376,7 +376,7 @@
*
* @param index the index of the value to get
* @return {@code non-null} string at the specified index
- * @throws <code>IndexOutOfBoundsException</code> if index < 0 ||
+ * @throws IndexOutOfBoundsException if index < 0 ||
* >= getValueCount
*/
public String getStringValue(int index) {
--- a/jdk/src/share/classes/javax/swing/SizeRequirements.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SizeRequirements.java Thu Oct 03 19:18:54 2013 +0100
@@ -142,10 +142,10 @@
* Creates a SizeRequirements object with the specified minimum, preferred,
* and maximum sizes and the specified alignment.
*
- * @param min the minimum size >= 0
- * @param pref the preferred size >= 0
- * @param max the maximum size >= 0
- * @param a the alignment >= 0.0f && <= 1.0f
+ * @param min the minimum size >= 0
+ * @param pref the preferred size >= 0
+ * @param max the maximum size >= 0
+ * @param a the alignment >= 0.0f && <= 1.0f
*/
public SizeRequirements(int min, int pref, int max, float a) {
minimum = min;
@@ -246,7 +246,7 @@
* by invoking the getTiledSizeRequirements method. The components
* will be tiled in the forward direction with offsets increasing from 0.
*
- * @param allocated the total span to be allocated >= 0.
+ * @param allocated the total span to be allocated >= 0.
* @param total the total of the children requests. This argument
* is optional and may be null.
* @param children the size requirements for each component.
@@ -282,7 +282,7 @@
* reverse direction represents components tiled from right to left
* or bottom to top.
*
- * @param allocated the total span to be allocated >= 0.
+ * @param allocated the total span to be allocated >= 0.
* @param total the total of the children requests. This argument
* is optional and may be null.
* @param children the size requirements for each component.
@@ -405,7 +405,7 @@
* Normal alignment will be done with an alignment value of 0.0f
* representing the left/top edge of a component.
*
- * @param allocated the total span to be allocated >= 0.
+ * @param allocated the total span to be allocated >= 0.
* @param total the total of the children requests.
* @param children the size requirements for each component.
* @param offsets the offset from 0 for each child where
@@ -441,7 +441,7 @@
* to be aligned. With reverse alignment, 0.0f represents the
* right/bottom edge.
*
- * @param allocated the total span to be allocated >= 0.
+ * @param allocated the total span to be allocated >= 0.
* @param total the total of the children requests.
* @param children the size requirements for each component.
* @param offsets the offset from 0 for each child where
--- a/jdk/src/share/classes/javax/swing/SizeSequence.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SizeSequence.java Thu Oct 03 19:18:54 2013 +0100
@@ -78,7 +78,7 @@
*
* <p>
*
- * <h4>Implementation Notes</h4>
+ * <h3>Implementation Notes</h3>
*
* Normally when storing the size and position of entries,
* one would choose between
@@ -145,7 +145,7 @@
*
* @param numEntries the number of sizes to track
* @exception NegativeArraySizeException if
- * <code>numEntries < 0</code>
+ * <code>numEntries < 0</code>
*/
public SizeSequence(int numEntries) {
this(numEntries, 0);
@@ -306,7 +306,7 @@
/**
* Returns the size of the specified entry.
* If <code>index</code> is out of the range
- * <code>(0 <= index < getSizes().length)</code>
+ * <code>(0 <= index < getSizes().length)</code>
* the behavior is unspecified.
*
* @param index the index corresponding to the entry
@@ -320,7 +320,7 @@
* Sets the size of the specified entry.
* Note that if the value of <code>index</code>
* does not fall in the range:
- * <code>(0 <= index < getSizes().length)</code>
+ * <code>(0 <= index < getSizes().length)</code>
* the behavior is unspecified.
*
* @param index the index corresponding to the entry
@@ -348,8 +348,8 @@
* Adds a contiguous group of entries to this <code>SizeSequence</code>.
* Note that the values of <code>start</code> and
* <code>length</code> must satisfy the following
- * conditions: <code>(0 <= start < getSizes().length)
- * AND (length >= 0)</code>. If these conditions are
+ * conditions: <code>(0 <= start < getSizes().length)
+ * AND (length >= 0)</code>. If these conditions are
* not met, the behavior is unspecified and an exception
* may be thrown.
*
@@ -359,7 +359,7 @@
* @param value the size to be assigned to each new entry
* @exception ArrayIndexOutOfBoundsException if the parameters
* are outside of the range:
- * (<code>0 <= start < (getSizes().length)) AND (length >= 0)</code>
+ * (<code>0 <= start < (getSizes().length)) AND (length >= 0)</code>
*/
public void insertEntries(int start, int length, int value) {
int sizes[] = getSizes();
@@ -383,8 +383,8 @@
* from this <code>SizeSequence</code>.
* Note that the values of <code>start</code> and
* <code>length</code> must satisfy the following
- * conditions: <code>(0 <= start < getSizes().length)
- * AND (length >= 0)</code>. If these conditions are
+ * conditions: <code>(0 <= start < getSizes().length)
+ * AND (length >= 0)</code>. If these conditions are
* not met, the behavior is unspecified and an exception
* may be thrown.
*
--- a/jdk/src/share/classes/javax/swing/SpinnerDateModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerDateModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -221,7 +221,7 @@
* MyStartDate implements Comparable {
* long t = 12345;
* public int compareTo(Date d) {
- * return (t < d.getTime() ? -1 : (t == d.getTime() ? 0 : 1));
+ * return (t < d.getTime() ? -1 : (t == d.getTime() ? 0 : 1));
* }
* public int compareTo(Object o) {
* return compareTo((Date)o);
@@ -435,7 +435,7 @@
* If <code>value</code> is <code>null</code>,
* an <code>IllegalArgumentException</code> is thrown. No bounds
* checking is done here:
- * the new value may invalidate the <code>(start <= value < end)</code>
+ * the new value may invalidate the <code>(start <= value < end)</code>
* invariant enforced by the constructors. Naturally, one should ensure
* that the <code>(start <= value <= maximum)</code> invariant is true
* before calling the <code>nextValue</code>, <code>previousValue</code>,
--- a/jdk/src/share/classes/javax/swing/SpinnerListModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerListModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -71,7 +71,7 @@
* size, an <code>IllegalArugmentException</code> is thrown.
*
* @param values the sequence this model represents
- * @throws IllegalArugmentException if <code>values</code> is
+ * @throws IllegalArgumentException if <code>values</code> is
* <code>null</code> or zero size
*/
public SpinnerListModel(List<?> values) {
@@ -88,10 +88,10 @@
* is defined by the specified array. The initial value of the model
* will be <code>values[0]</code>. If <code>values</code> is
* <code>null</code> or has zero length, an
- * <code>IllegalArugmentException</code> is thrown.
+ * <code>IllegalArgumentException</code> is thrown.
*
* @param values the sequence this model represents
- * @throws IllegalArugmentException if <code>values</code> is
+ * @throws IllegalArgumentException if <code>values</code> is
* <code>null</code> or zero length
*/
public SpinnerListModel(Object[] values) {
--- a/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -180,7 +180,7 @@
* If <code>minimum</code> is <code>null</code>,
* then there is no lower bound. No bounds checking is done here;
* the new <code>minimum</code> value may invalidate the
- * <code>(minimum <= value <= maximum)</code>
+ * <code>(minimum <= value <= maximum)</code>
* invariant enforced by the constructors. This is to simplify updating
* the model, naturally one should ensure that the invariant is true
* before calling the <code>getNextValue</code>,
@@ -196,7 +196,7 @@
* MyDate extends Date { // Date already implements Comparable
* public int compareTo(Long o) {
* long t = getTime();
- * return (t < o.longValue() ? -1 : (t == o.longValue() ? 0 : 1));
+ * return (t < o.longValue() ? -1 : (t == o.longValue() ? 0 : 1));
* }
* }
* </pre>
@@ -235,7 +235,7 @@
* If <code>maximum</code> is <code>null</code>, then there
* is no upper bound. No bounds checking is done here; the new
* <code>maximum</code> value may invalidate the
- * <code>(minimum <= value < maximum)</code>
+ * <code>(minimum <= value < maximum)</code>
* invariant enforced by the constructors. This is to simplify updating
* the model, naturally one should ensure that the invariant is true
* before calling the <code>next</code>, <code>previous</code>,
--- a/jdk/src/share/classes/javax/swing/SpringLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpringLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -727,7 +727,7 @@
* For any other <code>String</code> value passed as the edge,
* no action is taken. For a <code>null</code> edge, a
* <code>NullPointerException</code> is thrown.
- * <p/>
+ * <p>
* <b>Note:</b> This method can affect {@code x} and {@code y} values
* previously set for this {@code Constraints}.
*
--- a/jdk/src/share/classes/javax/swing/TransferHandler.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/TransferHandler.java Thu Oct 03 19:18:54 2013 +0100
@@ -502,7 +502,7 @@
* the action with the source drop actions, and then compare the result
* against the original action. For example:
* <pre>
- * boolean copySupported = (COPY & getSourceDropActions()) == COPY;
+ * boolean copySupported = (COPY & getSourceDropActions()) == COPY;
* </pre>
* <p>
* This method is only for use with drag and drop transfers.
@@ -1268,6 +1268,14 @@
}
}
}
+ if (!isActive()) {
+ // If the Drop target is inactive the dragExit will not be dispatched to the dtListener,
+ // so make sure that we clean up the dtListener anyway.
+ DropTargetListener dtListener = getDropTargetListener();
+ if (dtListener != null && dtListener instanceof DropHandler) {
+ ((DropHandler)dtListener).cleanup(false);
+ }
+ }
}
public void drop(DropTargetDropEvent e) {
--- a/jdk/src/share/classes/javax/swing/UIDefaults.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/UIDefaults.java Thu Oct 03 19:18:54 2013 +0100
@@ -706,7 +706,7 @@
/**
- * Returns the L&F class that renders this component.
+ * Returns the L&F class that renders this component.
*
* @param uiClassID a string containing the class ID
* @return the Class object returned by
--- a/jdk/src/share/classes/javax/swing/UnsupportedLookAndFeelException.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/UnsupportedLookAndFeelException.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,7 +25,7 @@
package javax.swing;
/**
- * An exception that indicates the requested look & feel
+ * An exception that indicates the requested look & feel
* management classes are not present on the user's system.
* <p>
* <strong>Warning:</strong>
--- a/jdk/src/share/classes/javax/swing/ViewportLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/ViewportLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,7 @@
package javax.swing;
+import java.awt.AWTError;
import java.awt.LayoutManager;
import java.awt.Component;
import java.awt.Container;
@@ -116,7 +117,7 @@
*
* @param parent the container to lay out
*
- * @exception AWTError if the target isn't the container specified to the
+ * @throws AWTError if the target isn't the container specified to the
* <code>BoxLayout</code> constructor
*/
public void layoutContainer(Container parent)
--- a/jdk/src/share/classes/javax/swing/plaf/LayerUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/LayerUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,17 +35,17 @@
/**
* The base class for all {@link javax.swing.JLayer}'s UI delegates.
- * <p/>
+ * <p>
* {@link #paint(java.awt.Graphics, javax.swing.JComponent)} method performs the
* painting of the {@code JLayer}
* and {@link #eventDispatched(AWTEvent, JLayer)} method is notified
* about any {@code AWTEvent}s which have been generated by a {@code JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* The {@code LayerUI} differs from the UI delegates of the other components,
* because it is LookAndFeel independent and is not updated by default when
* the system LookAndFeel is changed.
- * <p/>
+ * <p>
* The subclasses of {@code LayerUI} can either be stateless and shareable
* by multiple {@code JLayer}s or not shareable.
*
@@ -69,7 +69,7 @@
* Subclasses should override this method and use
* the specified {@code Graphics} object to
* render the content of the component.
- * <p/>
+ * <p>
* The default implementation paints the passed component as is.
*
* @param g the {@code Graphics} context in which to paint
@@ -82,7 +82,7 @@
/**
* Processes {@code AWTEvent}s for {@code JLayer}
* and <b>all its descendants</b> to this {@code LayerUI} instance.
- * <p/>
+ * <p>
* To enable the {@code AWTEvent}s of a particular type,
* you call {@link JLayer#setLayerEventMask}
* in {@link #installUI(javax.swing.JComponent)}
@@ -91,7 +91,7 @@
* By default this method calls the appropriate
* {@code process<event type>Event}
* method for the given class of event.
- * <p/>
+ * <p>
* <b>Note:</b> Events are processed only for displayable {@code JLayer}s.
*
* @param e the event to be dispatched
@@ -151,7 +151,7 @@
/**
* Processes component events occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless component events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Component events are enabled in the overridden {@link #installUI} method
@@ -183,7 +183,7 @@
/**
* Processes focus events occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless focus events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Focus events are enabled in the overridden {@link #installUI} method
@@ -215,7 +215,7 @@
/**
* Processes key events occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless key events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Key events are enabled in the overridden {@link #installUI} method
@@ -247,7 +247,7 @@
/**
* Processes mouse events occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless mouse events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse events are enabled in the overridden {@link #installUI} method
@@ -279,7 +279,7 @@
/**
* Processes mouse motion event occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless mouse motion events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse motion events are enabled in the overridden {@link #installUI} method
@@ -311,7 +311,7 @@
/**
* Processes mouse wheel event occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless mouse wheel events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse wheel events are enabled in the overridden {@link #installUI} method
@@ -343,7 +343,7 @@
/**
* Processes input event occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless input events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Input events are enabled in the overridden {@link #installUI} method
@@ -375,7 +375,7 @@
/**
* Processes hierarchy event occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless hierarchy events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Hierarchy events are enabled in the overridden {@link #installUI} method
@@ -407,7 +407,7 @@
/**
* Processes hierarchy bounds event occurring on the {@link JLayer}
* or any of its subcomponents.
- * <p/>
+ * <p>
* This method is not called unless hierarchy bounds events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Hierarchy bounds events are enabled in the overridden {@link #installUI}
@@ -471,7 +471,7 @@
/**
* Adds a PropertyChangeListener to the listener list. The listener is
* registered for all bound properties of this class.
- * <p/>
+ * <p>
* If {@code listener} is {@code null},
* no exception is thrown and no action is performed.
*
@@ -488,7 +488,7 @@
* Removes a PropertyChangeListener from the listener list. This method
* should be used to remove PropertyChangeListeners that were registered
* for all bound properties of this class.
- * <p/>
+ * <p>
* If {@code listener} is {@code null},
* no exception is thrown and no action is performed.
*
@@ -519,7 +519,7 @@
/**
* Adds a PropertyChangeListener to the listener list for a specific
* property.
- * <p/>
+ * <p>
* If {@code propertyName} or {@code listener} is {@code null},
* no exception is thrown and no action is taken.
*
@@ -539,7 +539,7 @@
* list for a specific property. This method should be used to remove
* {@code PropertyChangeListener}s
* that were registered for a specific bound property.
- * <p/>
+ * <p>
* If {@code propertyName} or {@code listener} is {@code null},
* no exception is thrown and no action is taken.
*
@@ -702,7 +702,7 @@
/**
* Paints the specified region in the {@code JLayer} this {@code LayerUI} is set to, immediately.
- * <p/>
+ * <p>
* This method is to be overridden when the dirty region needs to be changed.
* The default implementation delegates its functionality to {@link JComponent#paintImmediately(int, int, int, int)}.
*
--- a/jdk/src/share/classes/javax/swing/plaf/TextUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/TextUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,7 +42,7 @@
* Converts the given location in the model to a place in
* the view coordinate system.
*
- * @param pos the local location in the model to translate >= 0
+ * @param pos the local location in the model to translate >= 0
* @return the coordinates as a rectangle
* @exception BadLocationException if the given position does not
* represent a valid location in the associated document
@@ -53,7 +53,7 @@
* Converts the given location in the model to a place in
* the view coordinate system.
*
- * @param pos the local location in the model to translate >= 0
+ * @param pos the local location in the model to translate >= 0
* @return the coordinates as a rectangle
* @exception BadLocationException if the given position does not
* represent a valid location in the associated document
@@ -67,7 +67,7 @@
* @param pt the location in the view to translate. This
* should be in the same coordinate system as the mouse
* events.
- * @return the offset from the start of the document >= 0
+ * @return the offset from the start of the document >= 0
*/
public abstract int viewToModel(JTextComponent t, Point pt);
@@ -84,7 +84,7 @@
* character in the model
*
* @return the location within the model that best represents the
- * given point in the view >= 0
+ * given point in the view >= 0
*/
public abstract int viewToModel(JTextComponent t, Point pt,
Position.Bias[] biasReturn);
@@ -96,7 +96,7 @@
* might not allow access to some of the locations in the model.
*
* @param t the text component for which this UI is installed
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param b the bias for the position
* @param direction the direction from the current position that can
* be thought of as the arrow keys typically found on a keyboard.
@@ -117,8 +117,8 @@
* Causes the portion of the view responsible for the
* given part of the model to be repainted.
*
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
*/
public abstract void damageRange(JTextComponent t, int p0, int p1);
@@ -126,8 +126,8 @@
* Causes the portion of the view responsible for the
* given part of the model to be repainted.
*
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
*/
public abstract void damageRange(JTextComponent t, int p0, int p1,
Position.Bias firstBias,
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicBorders.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicBorders.java Thu Oct 03 19:18:54 2013 +0100
@@ -38,7 +38,7 @@
import java.awt.Graphics;
/**
- * Factory object that can vend Borders appropriate for the basic L & F.
+ * Factory object that can vend Borders appropriate for the basic L & F.
* @author Georges Saab
* @author Amy Fowler
*/
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -971,14 +971,16 @@
// cells, if not, this needs to loop through all.
value = comboBox.getModel().getElementAt(0);
}
- if (value == null) {
- value = " ";
- } else if (value instanceof String && "".equals(value)) {
- value = " ";
- }
Component component = renderer.
getListCellRendererComponent(listBox, value, -1,
false, false);
+ if (component instanceof JLabel) {
+ JLabel label = (JLabel) component;
+ String text = label.getText();
+ if ((text == null) || text.isEmpty()) {
+ label.setText(" ");
+ }
+ }
if (component instanceof JComponent) {
component.setFont(comboBox.getFont());
}
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopIconUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopIconUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
import java.beans.*;
/**
- * Basic L&F for a minimized window on a desktop.
+ * Basic L&F for a minimized window on a desktop.
*
* @author David Kloba
* @author Steve Wilson
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,7 +42,7 @@
import sun.awt.AppContext;
/**
- * Basic L&F for a desktop.
+ * Basic L&F for a desktop.
*
* @author Steve Wilson
*/
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -43,7 +43,7 @@
import sun.swing.SwingUtilities2;
/**
- * Basic L&F implementation of a FileChooser.
+ * Basic L&F implementation of a FileChooser.
*
* @author Jeff Dinkins
*/
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java Thu Oct 03 19:18:54 2013 +0100
@@ -231,7 +231,7 @@
* just like <code>g.drawString</code> would.
* The character at index <code>underlinedIndex</code>
* in text will be underlined. If <code>index</code> is beyond the
- * bounds of <code>text</code> (including < 0), nothing will be
+ * bounds of <code>text</code> (including < 0), nothing will be
* underlined.
*
* @param g Graphics to draw with
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicIconFactory.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicIconFactory.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
import java.io.Serializable;
/**
- * Factory object that can vend Icons appropriate for the basic L & F.
+ * Factory object that can vend Icons appropriate for the basic L & F.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Thu Oct 03 19:18:54 2013 +0100
@@ -553,7 +553,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class PropertyChangeHandler implements PropertyChangeListener {
// NOTE: This class exists only for backward compatability. All
@@ -567,7 +567,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class TitlePaneLayout implements LayoutManager {
// NOTE: This class exists only for backward compatability. All
@@ -597,7 +597,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class CloseAction extends AbstractAction {
public CloseAction() {
@@ -614,7 +614,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class MaximizeAction extends AbstractAction {
public MaximizeAction() {
@@ -643,7 +643,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class IconifyAction extends AbstractAction {
public IconifyAction() {
@@ -664,7 +664,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class RestoreAction extends AbstractAction {
public RestoreAction() {
@@ -691,7 +691,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class MoveAction extends AbstractAction {
public MoveAction() {
@@ -725,7 +725,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class SizeAction extends AbstractAction {
public SizeAction() {
@@ -741,7 +741,7 @@
/**
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class SystemMenuBar extends JMenuBar {
public boolean isFocusTraversable() { return false; }
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
import sun.swing.UIAction;
/**
- * A basic L&F implementation of JInternalFrame.
+ * A basic L&F implementation of JInternalFrame.
*
* @author David Kloba
* @author Rich Schiavi
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,7 @@
import java.beans.PropertyChangeListener;
/**
- * A Windows L&F implementation of LabelUI. This implementation
+ * A Windows L&F implementation of LabelUI. This implementation
* is completely static, i.e. there's only one UIView implementation
* that's shared by all JLabel objects.
*
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -537,7 +537,7 @@
* <td>JList.VERTICAL_WRAP
* <td>If the visible row count is greater than zero, the preferredHeight
* is the maximum cell height * visibleRowCount. If the visible row
- * count is <= 0, the preferred height is either the current height
+ * count is <= 0, the preferred height is either the current height
* of the list, or the maximum cell height, whichever is
* bigger. The preferred width is than the maximum cell width *
* number of columns needed. Where the number of columns needs is
@@ -556,7 +556,7 @@
* longer need 8 rows to display this, you only need 5, thus
* the adjustedRowCount is 5.
* <p>If the visible row
- * count is <= 0, the preferred height is dictated by the
+ * count is <= 0, the preferred height is dictated by the
* number of columns, which will be as many as can fit in the width
* of the <code>JList</code> (width / max cell width), with at
* least one column. The preferred height then becomes the
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -46,7 +46,7 @@
/**
- * A default L&F implementation of MenuBarUI. This implementation
+ * A default L&F implementation of MenuBarUI. This implementation
* is a "combined" view/controller.
*
* @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -39,7 +39,7 @@
/**
- * A default L&F implementation of MenuUI. This implementation
+ * A default L&F implementation of MenuUI. This implementation
* is a "combined" view/controller.
*
* @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -131,7 +131,7 @@
}
/**
- * Installs the receiver as the L&F for the passed in
+ * Installs the receiver as the L&F for the passed in
* <code>JOptionPane</code>.
*/
public void installUI(JComponent c) {
@@ -144,7 +144,7 @@
}
/**
- * Removes the receiver from the L&F controller of the passed in split
+ * Removes the receiver from the L&F controller of the passed in split
* pane.
*/
public void uninstallUI(JComponent c) {
@@ -827,7 +827,7 @@
}
/**
- * Returns true, basic L&F wants all the buttons to have the same
+ * Returns true, basic L&F wants all the buttons to have the same
* width.
*/
protected boolean getSizeButtonsToSameWidth() {
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
import javax.swing.plaf.ComponentUI;
/**
- * A Basic L&F implementation of PopupMenuSeparatorUI. This implementation
+ * A Basic L&F implementation of PopupMenuSeparatorUI. This implementation
* is a "combined" view/controller.
*
* @author Jeff Shapiro
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -53,7 +53,7 @@
import sun.awt.AppContext;
/**
- * A Windows L&F implementation of PopupMenuUI. This implementation
+ * A Windows L&F implementation of PopupMenuUI. This implementation
* is a "combined" view/controller.
*
* @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicProgressBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicProgressBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -38,7 +38,7 @@
import sun.swing.DefaultLookup;
/**
- * A Basic L&F implementation of ProgressBarUI.
+ * A Basic L&F implementation of ProgressBarUI.
*
* @author Michael C. Albers
* @author Kathy Walrath
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -45,7 +45,7 @@
import java.awt.event.*;
/**
- * A default L&F implementation of ScrollPaneUI.
+ * A default L&F implementation of ScrollPaneUI.
*
* @author Hans Muller
*/
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
/**
- * A Basic L&F implementation of SeparatorUI. This implementation
+ * A Basic L&F implementation of SeparatorUI. This implementation
* is a "combined" view/controller.
*
* @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -39,7 +39,7 @@
/**
- * A Basic L&F implementation of SliderUI.
+ * A Basic L&F implementation of SliderUI.
*
* @author Tom Santos
*/
@@ -1542,7 +1542,7 @@
* Data model listener.
*
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class ChangeHandler implements ChangeListener {
// NOTE: This class exists only for backward compatability. All
@@ -1561,7 +1561,7 @@
* Track mouse movements.
*
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class TrackListener extends MouseInputAdapter {
protected transient int offset;
@@ -1805,7 +1805,7 @@
* Scroll-event listener.
*
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class ScrollListener implements ActionListener {
// changed this class to public to avoid bogus IllegalAccessException
@@ -1849,7 +1849,7 @@
* Listener for resizing events.
* <p>
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class ComponentHandler extends ComponentAdapter {
// NOTE: This class exists only for backward compatability. All
@@ -1865,7 +1865,7 @@
* Focus-change listener.
* <p>
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class FocusHandler implements FocusListener {
// NOTE: This class exists only for backward compatability. All
@@ -1892,7 +1892,7 @@
* Please refer to the key bindings specification for further details.
* <p>
* This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <Foo>.
+ * Instantiate it only within subclasses of <code>Foo</code>.
*/
public class ActionScroller extends AbstractAction {
// NOTE: This class exists only for backward compatability. All
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -44,7 +44,7 @@
/**
- * A Basic L&F implementation of the SplitPaneUI.
+ * A Basic L&F implementation of the SplitPaneUI.
*
* @author Scott Violet
* @author Steve Wilson
@@ -1060,7 +1060,7 @@
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
public void paint(Graphics g, JComponent jc) {
if (!painted && splitPane.getDividerLocation()<0) {
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -43,7 +43,7 @@
import sun.swing.UIAction;
/**
- * A Basic L&F implementation of TabbedPaneUI.
+ * A Basic L&F implementation of TabbedPaneUI.
*
* @author Amy Fowler
* @author Philip Milne
@@ -669,7 +669,7 @@
*
* @param tab index of tab to get baseline for
* @exception IndexOutOfBoundsException if index is out of range
- * (index < 0 || index >= tab count)
+ * (index < 0 || index >= tab count)
* @return baseline or a value < 0 indicating there is no reasonable
* baseline
* @since 1.6
@@ -2620,7 +2620,7 @@
// Never move a TAB down a run if it is in the first column.
// Even if there isn't enough room, moving it to a fresh
// line won't help.
- if (rect.x != 2 + insets.left && rect.x + rect.width > returnAt) {
+ if (rect.x != x && rect.x + rect.width > returnAt) {
if (runCount > tabRuns.length - 1) {
expandTabRunsArray();
}
@@ -2648,7 +2648,7 @@
// Never move a TAB over a run if it is in the first run.
// Even if there isn't enough room, moving it to a fresh
// column won't help.
- if (rect.y != 2 + insets.top && rect.y + rect.height > returnAt) {
+ if (rect.y != y && rect.y + rect.height > returnAt) {
if (runCount > tabRuns.length - 1) {
expandTabRunsArray();
}
@@ -3350,6 +3350,7 @@
private void updateView() {
int tabPlacement = tabPane.getTabPlacement();
int tabCount = tabPane.getTabCount();
+ assureRectsCreated(tabCount);
Rectangle vpRect = viewport.getBounds();
Dimension viewSize = viewport.getViewSize();
Rectangle viewRect = viewport.getViewRect();
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -1012,7 +1012,7 @@
* this translation to be computed.
*
* @param tc the text component for which this UI is installed
- * @param pos the local location in the model to translate >= 0
+ * @param pos the local location in the model to translate >= 0
* @return the coordinates as a rectangle, null if the model is not painted
* @exception BadLocationException if the given position does not
* represent a valid location in the associated document
@@ -1029,7 +1029,7 @@
* this translation to be computed.
*
* @param tc the text component for which this UI is installed
- * @param pos the local location in the model to translate >= 0
+ * @param pos the local location in the model to translate >= 0
* @return the coordinates as a rectangle, null if the model is not painted
* @exception BadLocationException if the given position does not
* represent a valid location in the associated document
@@ -1066,7 +1066,7 @@
* @param tc the text component for which this UI is installed
* @param pt the location in the view to translate. This
* should be in the same coordinate system as the mouse events.
- * @return the offset from the start of the document >= 0,
+ * @return the offset from the start of the document >= 0,
* -1 if not painted
* @see TextUI#viewToModel
*/
@@ -1083,7 +1083,7 @@
* @param tc the text component for which this UI is installed
* @param pt the location in the view to translate. This
* should be in the same coordinate system as the mouse events.
- * @return the offset from the start of the document >= 0,
+ * @return the offset from the start of the document >= 0,
* -1 if the component doesn't yet have a positive size.
* @see TextUI#viewToModel
*/
@@ -1141,8 +1141,8 @@
* the view is not currently painted.
*
* @param tc the text component for which this UI is installed
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
* @see TextUI#damageRange
*/
public void damageRange(JTextComponent tc, int p0, int p1) {
@@ -1153,8 +1153,8 @@
* Causes the portion of the view responsible for the
* given part of the model to be repainted.
*
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
*/
public void damageRange(JTextComponent t, int p0, int p1,
Position.Bias p0Bias, Position.Bias p1Bias) {
@@ -1271,8 +1271,8 @@
* it is unable to represent the part of the element.
*
* @param elem the element
- * @param p0 the starting offset >= 0
- * @param p1 the ending offset >= p0
+ * @param p0 the starting offset >= 0
+ * @param p1 the ending offset >= p0
* @return the view
*/
public View create(Element elem, int p0, int p1) {
@@ -1471,7 +1471,7 @@
* the model. This is implemented to return the index of the only
* child.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
* @since 1.3
@@ -1515,11 +1515,11 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param p0 the position to convert >= 0
+ * @param p0 the position to convert >= 0
* @param b0 the bias toward the previous character or the
* next character represented by p0, in case the
* position is a boundary of two views.
- * @param p1 the position to convert >= 0
+ * @param p1 the position to convert >= 0
* @param b1 the bias toward the previous character or the
* next character represented by p1, in case the
* position is a boundary of two views.
@@ -1561,7 +1561,7 @@
* they might not be in the same order found in the model, or they just
* might not allow access to some of the locations in the model.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @param direction the direction from the current position that can
* be thought of as the arrow keys typically found on a keyboard.
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
/**
- * A Basic L&F implementation of ToolBarSeparatorUI. This implementation
+ * A Basic L&F implementation of ToolBarSeparatorUI. This implementation
* is a "combined" view/controller.
* <p>
*
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,7 +42,7 @@
/**
- * A Basic L&F implementation of ToolBarUI. This implementation
+ * A Basic L&F implementation of ToolBarUI. This implementation
* is a "combined" view/controller.
* <p>
*
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolTipUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolTipUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,7 +40,7 @@
/**
- * Standard tool tip L&F.
+ * Standard tool tip L&F.
* <p>
*
* @author Dave Moore
--- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,13 +42,14 @@
import javax.swing.tree.*;
import javax.swing.text.Position;
import javax.swing.plaf.basic.DragRecognitionSupport.BeforeDrag;
+import sun.awt.AWTAccessor;
import sun.swing.SwingUtilities2;
import sun.swing.DefaultLookup;
import sun.swing.UIAction;
/**
- * The basic L&F for a hierarchical data structure.
+ * The basic L&F for a hierarchical data structure.
* <p>
*
* @author Scott Violet
@@ -2165,11 +2166,7 @@
nodeBounds.width,
nodeBounds.height);
editingPath = path;
- if (editingComponent instanceof JComponent) {
- ((JComponent)editingComponent).revalidate();
- } else {
- editingComponent.validate();
- }
+ AWTAccessor.getComponentAccessor().revalidateSynchronously(editingComponent);
editingComponent.repaint();
if(cellEditor.shouldSelectCell(event)) {
stopEditingInCompleteEditing = false;
--- a/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
/**
* The default layout manager for Popup menus and menubars. This
* class is an extension of BoxLayout which adds the UIResource tag
- * so that pluggable L&Fs can distinguish it from user-installed
+ * so that pluggable L&Fs can distinguish it from user-installed
* layout managers on menus.
*
* @author Georges Saab
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalBorders.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalBorders.java Thu Oct 03 19:18:54 2013 +0100
@@ -43,7 +43,7 @@
/**
- * Factory object that can vend Borders appropriate for the metal L & F.
+ * Factory object that can vend Borders appropriate for the metal L & F.
* @author Steve Wilson
*/
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -46,7 +46,7 @@
import sun.swing.*;
/**
- * Metal L&F implementation of a FileChooser.
+ * Metal L&F implementation of a FileChooser.
*
* @author Jeff Dinkins
*/
@@ -1067,69 +1067,9 @@
/**
* Data model for a type-face selection combo-box.
*/
- protected class FilterComboBoxModel extends AbstractListModel<Object> implements ComboBoxModel<Object>, PropertyChangeListener {
- protected FileFilter[] filters;
- protected FilterComboBoxModel() {
- super();
- filters = getFileChooser().getChoosableFileFilters();
- }
-
- public void propertyChange(PropertyChangeEvent e) {
- String prop = e.getPropertyName();
- if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
- filters = (FileFilter[]) e.getNewValue();
- fireContentsChanged(this, -1, -1);
- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public void setSelectedItem(Object filter) {
- if(filter != null) {
- getFileChooser().setFileFilter((FileFilter) filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- // Ensure that the current filter is in the list.
- // NOTE: we shouldnt' have to do this, since JFileChooser adds
- // the filter to the choosable filters list when the filter
- // is set. Lets be paranoid just in case someone overrides
- // setFileFilter in JFileChooser.
- FileFilter currentFilter = getFileChooser().getFileFilter();
- boolean found = false;
- if(currentFilter != null) {
- for (FileFilter filter : filters) {
- if (filter == currentFilter) {
- found = true;
- }
- }
- if(found == false) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
- return getFileChooser().getFileFilter();
- }
-
- public int getSize() {
- if(filters != null) {
- return filters.length;
- } else {
- return 0;
- }
- }
-
- public Object getElementAt(int index) {
- if(index > getSize() - 1) {
- // This shouldn't happen. Try to recover gracefully.
- return getFileChooser().getFileFilter();
- }
- if(filters != null) {
- return filters[index];
- } else {
- return null;
- }
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return MetalFileChooserUI.this.getFileChooser();
}
}
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
/**
- * A Windows L&F implementation of LabelUI. This implementation
+ * A Windows L&F implementation of LabelUI. This implementation
* is completely static, i.e. there's only one UIView implementation
* that's shared by all JLabel objects.
*
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Thu Oct 03 19:18:54 2013 +0100
@@ -291,8 +291,7 @@
* Populates {@code table} with system colors. The following values are
* added to {@code table}:
* <table border="1" cellpadding="1" cellspacing="0"
- * summary="Metal's system color mapping"
- * valign="top" >
+ * summary="Metal's system color mapping">
* <tr valign="top" align="left">
* <th bgcolor="#CCCCFF" align="left">Key
* <th bgcolor="#CCCCFF" align="left">Value
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
/**
- * A Metal L&F implementation of PopupMenuSeparatorUI. This implementation
+ * A Metal L&F implementation of PopupMenuSeparatorUI. This implementation
* is a "combined" view/controller.
*
* @author Jeff Shapiro
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalScrollPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalScrollPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
/**
- * A Metal L&F implementation of ScrollPaneUI.
+ * A Metal L&F implementation of ScrollPaneUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
/**
- * A Metal L&F implementation of SeparatorUI. This implementation
+ * A Metal L&F implementation of SeparatorUI. This implementation
* is a "combined" view/controller.
* <p>
* <strong>Warning:</strong>
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalSliderUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalSliderUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
import javax.swing.plaf.*;
/**
- * A Java L&F implementation of SliderUI.
+ * A Java L&F implementation of SliderUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalTabbedPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalTabbedPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -776,7 +776,7 @@
}
/**
- * Overridden to do nothing for the Java L&F.
+ * Overridden to do nothing for the Java L&F.
*/
protected int getTabLabelShiftX( int tabPlacement, int tabIndex, boolean isSelected ) {
return 0;
@@ -784,7 +784,7 @@
/**
- * Overridden to do nothing for the Java L&F.
+ * Overridden to do nothing for the Java L&F.
*/
protected int getTabLabelShiftY( int tabPlacement, int tabIndex, boolean isSelected ) {
return 0;
--- a/jdk/src/share/classes/javax/swing/plaf/metal/MetalToolTipUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalToolTipUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -38,7 +38,7 @@
/**
- * A Metal L&F extension of BasicToolTipUI.
+ * A Metal L&F extension of BasicToolTipUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java Thu Oct 03 19:18:54 2013 +0100
@@ -137,7 +137,7 @@
protected AbstractRegionPainter() { }
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public final void paint(Graphics2D g, JComponent c, int w, int h) {
@@ -535,11 +535,11 @@
* @param maxH The maximium scale in the horizontal direction to use before punting and redrawing from scratch.
* For example, if maxH is 2, then we will attempt to scale any cached images up to 2x the canvas
* width before redrawing from scratch. Reasonable maxH values may improve painting performance.
- * If set too high, then you may get poor looking graphics at higher zoom levels. Must be >= 1.
+ * If set too high, then you may get poor looking graphics at higher zoom levels. Must be >= 1.
* @param maxV The maximium scale in the vertical direction to use before punting and redrawing from scratch.
* For example, if maxV is 2, then we will attempt to scale any cached images up to 2x the canvas
* height before redrawing from scratch. Reasonable maxV values may improve painting performance.
- * If set too high, then you may get poor looking graphics at higher zoom levels. Must be >= 1.
+ * If set too high, then you may get poor looking graphics at higher zoom levels. Must be >= 1.
*/
public PaintContext(Insets insets, Dimension canvasSize, boolean inverted,
CacheMode cacheMode, double maxH, double maxV) {
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java Thu Oct 03 19:18:54 2013 +0100
@@ -124,7 +124,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override public UIDefaults getDefaults() {
if (uiDefaults == null){
@@ -261,7 +261,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
* @return {@code true}
*/
@Override public boolean shouldUpdateStyleOnAncestorChanged() {
@@ -269,7 +269,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* <p>Overridden to return {@code true} when one of the following
* properties change:
--- a/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java Thu Oct 03 19:18:54 2013 +0100
@@ -218,7 +218,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary.
@@ -472,7 +472,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary.
@@ -519,7 +519,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* <p>Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary.</p>
@@ -562,7 +562,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary. If a value named "font" is not found in
@@ -590,7 +590,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Returns the SynthPainter for this style, which ends up delegating to
* the Painters installed in this style.
@@ -600,7 +600,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary. If opacity is not specified in UI defaults,
@@ -616,7 +616,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* <p>Overridden to cause this style to populate itself with data from
* UIDefaults, if necessary.</p>
@@ -628,7 +628,7 @@
* Button.opacity
* Button.Enabled.foreground
* Button.Enabled+Selected.background
- * </pre></p>
+ * </pre>
*
* <p>In this example, suppose you were in the Enabled+Selected state and
* searched for "foreground". In this case, we first check for
--- a/jdk/src/share/classes/javax/swing/plaf/synth/Region.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/Region.java Thu Oct 03 19:18:54 2013 +0100
@@ -62,10 +62,10 @@
* The following <a href="doc-files/synthFileFormat.html">xml</a>
* accomplishes the same thing:
* <pre>
- * <style id="splitPaneStyle">
+ * <style id="splitPaneStyle">
* ...
- * </style>
- * <bind style="splitPaneStyle" type="region" key="SplitPane"/>
+ * </style>
+ * <bind style="splitPaneStyle" type="region" key="SplitPane"/>
* </pre>
*
* @since 1.5
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
import javax.swing.text.View;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JButton}.
*
* @author Scott Violet
@@ -55,7 +55,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(AbstractButton b) {
@@ -65,7 +65,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners(AbstractButton b) {
@@ -109,7 +109,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners(AbstractButton b) {
@@ -118,7 +118,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(AbstractButton b) {
@@ -130,7 +130,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -182,7 +182,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int getBaseline(JComponent c, int width, int height) {
@@ -305,7 +305,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -449,7 +449,7 @@
// ********************************
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMinimumSize(JComponent c) {
@@ -470,7 +470,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
@@ -491,7 +491,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMaximumSize(JComponent c) {
@@ -525,7 +525,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JCheckBoxMenuItem}.
*
* @author Leif Samuelsson
@@ -54,7 +54,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected String getPropertyPrefix() {
@@ -68,7 +68,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,7 +31,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JCheckBox}.
*
* @author Jeff Dinkins
@@ -53,7 +53,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected String getPropertyPrefix() {
@@ -67,7 +67,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JColorChooser}.
*
* @author Tom Santos
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected AbstractColorChooserPanel[] createDefaultChoosers() {
@@ -74,7 +74,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -89,7 +89,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -102,7 +102,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -111,7 +111,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -120,7 +120,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -188,7 +188,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -197,7 +197,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
import java.beans.PropertyChangeEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JComboBox}.
*
* @author Scott Violet
@@ -103,7 +103,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to ensure that ButtonHandler is created prior to any of
* the other installXXX methods, since several of them reference
@@ -152,7 +152,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -163,7 +163,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -175,7 +175,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -187,7 +187,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -200,7 +200,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -251,7 +251,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected ComboPopup createPopup() {
@@ -261,7 +261,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected ListCellRenderer createRenderer() {
@@ -269,7 +269,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected ComboBoxEditor createEditor() {
@@ -281,7 +281,7 @@
//======================
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -291,7 +291,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected JButton createArrowButton() {
@@ -360,7 +360,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
/**
- * Provides the Synth L&F UI delegate for a minimized internal frame on a desktop.
+ * Provides the Synth L&F UI delegate for a minimized internal frame on a desktop.
*
* @author Joshua Outwater
* @since 1.7
@@ -55,7 +55,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installComponents() {
@@ -82,7 +82,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -96,7 +96,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -109,7 +109,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -123,7 +123,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -134,7 +134,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -202,7 +202,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
import java.awt.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JDesktopPane}.
*
* @author Joshua Outwater
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -73,7 +73,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -123,7 +123,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -136,7 +136,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -164,7 +164,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDesktopManager() {
@@ -180,7 +180,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDesktopManager() {
@@ -422,7 +422,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -489,7 +489,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -498,7 +498,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,7 +33,7 @@
import java.beans.PropertyChangeEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JEditorPane}.
*
* @author Shannon Hickey
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -74,7 +74,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -131,7 +131,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -181,7 +181,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintBackground(Graphics g) {
@@ -194,7 +194,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,7 @@
import javax.swing.plaf.ComponentUI;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JFormattedTextField}.
*
* @since 1.7
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
void paintBackground(SynthContext context, Graphics g, JComponent c) {
@@ -67,7 +67,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JInternalFrame}.
*
* @author David Kloba
@@ -61,7 +61,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void installDefaults() {
@@ -70,7 +70,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -79,7 +79,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallComponents() {
@@ -90,7 +90,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -118,7 +118,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -133,7 +133,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -150,7 +150,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected JComponent createNorthPane(JInternalFrame w) {
@@ -160,7 +160,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected ComponentListener createComponentListener() {
@@ -244,7 +244,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -254,7 +254,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
import java.beans.PropertyChangeEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JLabel}.
*
* @author Scott Violet
@@ -57,7 +57,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JLabel c) {
@@ -71,7 +71,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(JLabel c){
@@ -83,7 +83,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -105,7 +105,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int getBaseline(JComponent c, int width, int height) {
@@ -218,7 +218,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -227,7 +227,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
@@ -248,7 +248,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMinimumSize(JComponent c) {
@@ -269,7 +269,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMaximumSize(JComponent c) {
@@ -290,7 +290,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
import java.beans.PropertyChangeEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JList}.
*
* @author Scott Violet
@@ -80,7 +80,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -89,7 +89,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -98,7 +98,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -108,7 +108,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -117,7 +117,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -166,7 +166,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -180,7 +180,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
import javax.swing.plaf.basic.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JMenuBar}.
*
* @author Scott Violet
@@ -53,7 +53,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -65,7 +65,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -87,7 +87,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -99,7 +99,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -108,7 +108,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -175,7 +175,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -184,7 +184,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JMenuItem}.
*
* @author Georges Saab
@@ -59,7 +59,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -73,7 +73,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -81,7 +81,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -134,7 +134,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -153,7 +153,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -162,7 +162,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -206,7 +206,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Dimension getPreferredMenuItemSize(JComponent c,
@@ -290,7 +290,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -299,7 +299,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,7 +31,7 @@
import java.awt.Dimension;
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* @author Georges Saab
*/
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
import sun.swing.MenuItemLayoutHelper;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JMenu}.
*
* @author Georges Saab
@@ -56,7 +56,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -64,7 +64,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -120,7 +120,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -134,7 +134,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -153,7 +153,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -162,7 +162,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -207,7 +207,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Dimension getPreferredMenuItemSize(JComponent c,
@@ -286,7 +286,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -295,7 +295,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,7 +33,7 @@
import sun.swing.DefaultLookup;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JOptionPane}.
*
* @author James Gosling
@@ -56,7 +56,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -64,7 +64,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -92,7 +92,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -104,7 +104,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -113,7 +113,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installComponents() {
@@ -132,7 +132,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -199,7 +199,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -208,7 +208,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -218,7 +218,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected boolean getSizeButtonsToSameWidth() {
@@ -273,7 +273,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Container createSeparator() {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,12 +41,12 @@
* example registers a painter for all <code>JButton</code>s that will
* render the image <code>myImage.png</code>:
* <pre>
- * <style id="buttonStyle">
+ * <style id="buttonStyle">
* <imagePainter path="myImage.png" sourceInsets="2 2 2 2"
- * paintCenter="true" stretch="true"/>
- * <insets top="2" bottom="2" left="2" right="2"/>
- * </style>
- * <bind style="buttonStyle" type="REGION" key="button"/>
+ * paintCenter="true" stretch="true"/>
+ * <insets top="2" bottom="2" left="2" right="2"/>
+ * </style>
+ * <bind style="buttonStyle" type="REGION" key="button"/>
*</pre>
* <p>
* <code>SynthPainter</code> is abstract in so far as it does no painting,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
import java.beans.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JPanel}.
*
* @author Steve Wilson
@@ -53,7 +53,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void installUI(JComponent c) {
@@ -64,7 +64,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -93,7 +93,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JPanel p) {
@@ -101,7 +101,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(JPanel p) {
@@ -119,7 +119,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -187,7 +187,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -196,7 +196,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent pce) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,7 +31,7 @@
import javax.swing.plaf.ComponentUI;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JPasswordField}.
*
* @author Shannon Hickey
@@ -73,7 +73,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
void paintBackground(SynthContext context, Graphics g, JComponent c) {
@@ -82,7 +82,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -91,7 +91,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installKeyboardActions() {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,7 +33,7 @@
import java.beans.PropertyChangeEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JPopupMenu}.
*
* @author Georges Saab
@@ -56,7 +56,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void installDefaults() {
@@ -81,7 +81,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -90,7 +90,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -106,7 +106,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -115,7 +115,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -182,7 +182,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -191,7 +191,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
import sun.swing.SwingUtilities2;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JProgressBar}.
*
* @author Joshua Outwater
@@ -61,7 +61,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -70,7 +70,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -79,7 +79,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -118,7 +118,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -130,7 +130,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -147,7 +147,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int getBaseline(JComponent c, int width, int height) {
@@ -165,7 +165,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Rectangle getBox(Rectangle r) {
@@ -177,7 +177,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void setAnimationIndex(int newValue) {
@@ -386,7 +386,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -396,7 +396,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -407,7 +407,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -30,7 +30,7 @@
import javax.swing.plaf.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JRadioButtonMenuItem}.
*
* @author Georges Saab
@@ -50,7 +50,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected String getPropertyPrefix() {
@@ -64,7 +64,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -30,7 +30,7 @@
import javax.swing.plaf.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JRadioButton}.
*
* @author Jeff Dinkins
@@ -52,7 +52,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected String getPropertyPrefix() {
@@ -75,7 +75,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
import javax.swing.plaf.basic.BasicRootPaneUI;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JRootPane}.
*
* @author Scott Violet
@@ -52,7 +52,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JRootPane c){
@@ -60,7 +60,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(JRootPane root) {
@@ -72,7 +72,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -152,7 +152,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,7 +33,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JScrollBar}.
*
* @author Scott Violet
@@ -53,7 +53,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -68,7 +68,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void configureScrollBarColors() {
@@ -136,7 +136,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -145,7 +145,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -154,7 +154,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(){
@@ -177,7 +177,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -212,7 +212,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public boolean getSupportsAbsolutePositioning() {
@@ -283,7 +283,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -354,7 +354,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Dimension getMinimumThumbSize() {
@@ -371,7 +371,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected JButton createDecreaseButton(int orientation) {
@@ -400,7 +400,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected JButton createIncreaseButton(int orientation) {
@@ -431,7 +431,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void setThumbRollover(boolean active) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,7 +41,7 @@
import java.awt.event.FocusEvent;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JScrollPane}.
*
* @author Scott Violet
@@ -119,7 +119,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -128,7 +128,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JScrollPane scrollpane) {
@@ -154,7 +154,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners(JScrollPane c) {
@@ -171,7 +171,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(JScrollPane c) {
@@ -186,7 +186,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners(JComponent c) {
@@ -203,7 +203,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
import javax.swing.plaf.DimensionUIResource;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JSeparator}.
*
* @author Shannon Hickey
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void installUI(JComponent c) {
@@ -67,7 +67,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -191,7 +191,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -202,7 +202,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
@@ -224,7 +224,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMinimumSize(JComponent c) {
@@ -232,7 +232,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMaximumSize(JComponent c) {
@@ -240,7 +240,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,7 +42,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link JSlider}.
*
* @author Joshua Outwater
@@ -98,7 +98,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JSlider slider) {
@@ -127,7 +127,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners(JSlider slider) {
@@ -136,7 +136,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners(JSlider slider) {
@@ -200,7 +200,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected TrackListener createTrackListener(JSlider s) {
@@ -231,7 +231,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int getBaseline(JComponent c, int width, int height) {
@@ -302,7 +302,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
@@ -320,7 +320,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getMinimumSize(JComponent c) {
@@ -335,7 +335,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void calculateGeometry() {
@@ -534,7 +534,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void calculateThumbLocation() {
@@ -551,7 +551,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void setThumbLocation(int x, int y) {
@@ -564,7 +564,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int xPositionForValue(int value) {
@@ -593,7 +593,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int yPositionForValue(int value, int trackY, int trackHeight) {
@@ -622,7 +622,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int valueForYPosition(int yPos) {
@@ -651,7 +651,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public int valueForXPosition(int xPos) {
@@ -680,7 +680,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Dimension getThumbSize() {
@@ -697,7 +697,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void recalculateIfInsetsChanged() {
@@ -714,7 +714,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -851,7 +851,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -899,7 +899,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
import java.beans.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JSpinner}.
*
* @author Hans Muller
@@ -65,7 +65,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -81,7 +81,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -156,7 +156,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected LayoutManager createLayout() {
@@ -165,7 +165,7 @@
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Component createPreviousButton() {
@@ -177,7 +177,7 @@
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Component createNextButton() {
@@ -270,7 +270,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -334,7 +334,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -439,7 +439,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JSplitPane}.
*
* @author Scott Violet
@@ -201,7 +201,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -236,7 +236,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -257,7 +257,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Component createDefaultNonContinuousLayoutDivider() {
@@ -322,7 +322,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -343,7 +343,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void finishedPaintingChildren(JSplitPane jc, Graphics g) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
import sun.swing.SwingUtilities2;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JTabbedPane}.
*
* <p>Looks up the {@code selectedTabPadInsets} property from the Style,
@@ -120,7 +120,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -183,7 +183,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -192,7 +192,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -201,7 +201,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -227,7 +227,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -256,7 +256,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected JButton createScrollButton(int direction) {
@@ -272,7 +272,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
@@ -282,7 +282,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to keep track of whether the selected tab is also pressed.
*/
@@ -333,7 +333,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int getTabLabelShiftX(int tabPlacement, int tabIndex, boolean isSelected) {
@@ -345,7 +345,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int getTabLabelShiftY(int tabPlacement, int tabIndex, boolean isSelected) {
@@ -380,7 +380,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int getBaseline(int tab) {
@@ -404,7 +404,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -556,7 +556,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void setRolloverTab(int index) {
@@ -750,7 +750,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int calculateMaxTabHeight(int tabPlacement) {
@@ -766,7 +766,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int calculateTabWidth(int tabPlacement, int tabIndex,
@@ -797,7 +797,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int calculateMaxTabWidth(int tabPlacement) {
@@ -813,7 +813,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected Insets getTabInsets(int tabPlacement, int tabIndex) {
@@ -823,7 +823,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected FontMetrics getFontMetrics() {
@@ -867,7 +867,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to create a TabbedPaneLayout subclass which takes into
* account tabOverlap.
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
import sun.swing.table.*;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.table.JTableHeader}.
*
* @author Alan Chung
@@ -64,7 +64,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -89,7 +89,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -98,7 +98,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -114,7 +114,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -174,7 +174,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -185,7 +185,7 @@
// SynthUI
//
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -198,7 +198,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void rolloverColumnUpdated(int oldColumn, int newColumn) {
@@ -207,7 +207,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent evt) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -54,7 +54,7 @@
import javax.swing.table.TableColumnModel;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JTable}.
*
* @author Philip Milne
@@ -202,7 +202,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -225,7 +225,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -238,7 +238,7 @@
//
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -278,7 +278,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -696,7 +696,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,7 +66,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -77,7 +77,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -110,7 +110,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -157,7 +157,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* Overridden to do nothing.
*/
@@ -167,7 +167,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -36,7 +36,7 @@
/**
- * Provides the Synth L&F UI delegate for {@link javax.swing.JTextField}.
+ * Provides the Synth L&F UI delegate for {@link javax.swing.JTextField}.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
@@ -148,7 +148,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -204,7 +204,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -213,7 +213,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
* Overridden to do nothing.
*/
@Override
@@ -241,7 +241,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -252,7 +252,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -185,7 +185,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,7 +31,7 @@
import javax.swing.plaf.ComponentUI;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JToggleButton}.
*
* @author Jeff Dinkins
@@ -53,7 +53,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected String getPropertyPrefix() {
@@ -70,7 +70,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -44,7 +44,7 @@
import sun.swing.plaf.synth.SynthIcon;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JToolBar}.
*
* @since 1.7
@@ -69,7 +69,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -78,7 +78,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -87,7 +87,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -121,7 +121,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -149,13 +149,13 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installComponents() {}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallComponents() {}
@@ -170,7 +170,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -239,7 +239,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -314,7 +314,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintDragWindow(Graphics g) {
@@ -337,7 +337,7 @@
//
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,7 +37,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JToolTip}.
*
* @author Joshua Outwater
@@ -58,7 +58,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults(JComponent c) {
@@ -72,7 +72,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults(JComponent c) {
@@ -83,7 +83,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners(JComponent c) {
@@ -91,7 +91,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners(JComponent c) {
@@ -99,7 +99,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -144,7 +144,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -196,7 +196,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Dimension getPreferredSize(JComponent c) {
@@ -224,7 +224,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,7 @@
import sun.swing.plaf.synth.SynthIcon;
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JTree}.
*
* @author Scott Violet
@@ -85,7 +85,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public Icon getExpandedIcon() {
@@ -93,7 +93,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installDefaults() {
@@ -156,7 +156,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void installListeners() {
@@ -165,7 +165,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -193,7 +193,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected TreeCellEditor createDefaultCellEditor() {
@@ -211,7 +211,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected TreeCellRenderer createDefaultCellRenderer() {
@@ -219,7 +219,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallDefaults() {
@@ -241,7 +241,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void uninstallListeners() {
@@ -273,7 +273,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void paintBorder(SynthContext context, Graphics g, int x,
@@ -472,7 +472,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintHorizontalPartOfLeg(Graphics g, Rectangle clipBounds,
@@ -489,7 +489,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintHorizontalLine(Graphics g, JComponent c, int y,
@@ -499,7 +499,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintVerticalPartOfLeg(Graphics g,
@@ -511,7 +511,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintVerticalLine(Graphics g, JComponent c, int x, int top,
@@ -586,7 +586,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintExpandControl(Graphics g, Rectangle clipBounds,
@@ -607,7 +607,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void drawCentered(Component c, Graphics graphics, Icon icon,
@@ -621,7 +621,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent event) {
@@ -637,7 +637,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected void paintDropLine(Graphics g) {
@@ -677,7 +677,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
protected int getRowX(int row, int depth) {
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Thu Oct 03 19:18:54 2013 +0100
@@ -32,7 +32,7 @@
/**
- * Provides the Synth L&F UI delegate for
+ * Provides the Synth L&F UI delegate for
* {@link javax.swing.JViewport}.
*
* @since 1.7
@@ -52,7 +52,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void installUI(JComponent c) {
@@ -62,7 +62,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void uninstallUI(JComponent c) {
@@ -133,7 +133,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public SynthContext getContext(JComponent c) {
@@ -217,7 +217,7 @@
}
/**
- * @inheritDoc
+ * {@inheritDoc}
*/
@Override
public void propertyChange(PropertyChangeEvent e) {
--- a/jdk/src/share/classes/javax/swing/text/AbstractDocument.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/AbstractDocument.java Thu Oct 03 19:18:54 2013 +0100
@@ -934,16 +934,18 @@
* Returns true if the text in the range <code>p0</code> to
* <code>p1</code> is left to right.
*/
- boolean isLeftToRight(int p0, int p1) {
- if(!getProperty(I18NProperty).equals(Boolean.TRUE)) {
- return true;
- }
- Element bidiRoot = getBidiRootElement();
- int index = bidiRoot.getElementIndex(p0);
- Element bidiElem = bidiRoot.getElement(index);
- if(bidiElem.getEndOffset() >= p1) {
- AttributeSet bidiAttrs = bidiElem.getAttributes();
- return ((StyleConstants.getBidiLevel(bidiAttrs) % 2) == 0);
+ static boolean isLeftToRight(Document doc, int p0, int p1) {
+ if (Boolean.TRUE.equals(doc.getProperty(I18NProperty))) {
+ if (doc instanceof AbstractDocument) {
+ AbstractDocument adoc = (AbstractDocument) doc;
+ Element bidiRoot = adoc.getBidiRootElement();
+ int index = bidiRoot.getElementIndex(p0);
+ Element bidiElem = bidiRoot.getElement(index);
+ if (bidiElem.getEndOffset() >= p1) {
+ AttributeSet bidiAttrs = bidiElem.getAttributes();
+ return ((StyleConstants.getBidiLevel(bidiAttrs) % 2) == 0);
+ }
+ }
}
return true;
}
--- a/jdk/src/share/classes/javax/swing/text/AttributeSet.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/AttributeSet.java Thu Oct 03 19:18:54 2013 +0100
@@ -71,7 +71,7 @@
* This interface is the type signature that is expected
* to be present on any attribute key that contributes to
* character level presentation. This would be any attribute
- * that applies to a so-called <term>run</term> of
+ * that applies to a so-called <i>run</i> of
* style.
*/
public interface CharacterAttribute {
--- a/jdk/src/share/classes/javax/swing/text/BadLocationException.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/BadLocationException.java Thu Oct 03 19:18:54 2013 +0100
@@ -46,7 +46,7 @@
* Creates a new BadLocationException object.
*
* @param s a string indicating what was wrong with the arguments
- * @param offs offset within the document that was requested >= 0
+ * @param offs offset within the document that was requested >= 0
*/
public BadLocationException(String s, int offs) {
super(s);
@@ -56,7 +56,7 @@
/**
* Returns the offset into the document that was not legal.
*
- * @return the offset >= 0
+ * @return the offset >= 0
*/
public int offsetRequested() {
return offs;
--- a/jdk/src/share/classes/javax/swing/text/BoxView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/BoxView.java Thu Oct 03 19:18:54 2013 +0100
@@ -154,7 +154,7 @@
*
* @param g the graphics context
* @param alloc the allocated region to paint into
- * @param index the child index, >= 0 && < getViewCount()
+ * @param index the child index, >= 0 && < getViewCount()
*/
protected void paintChild(Graphics g, Rectangle alloc, int index) {
View child = getView(index);
@@ -170,9 +170,9 @@
* will have an offset and span of 0.
*
* @param index the starting index into the child views to insert
- * the new views; this should be a value >= 0 and <= getViewCount
+ * the new views; this should be a value >= 0 and <= getViewCount
* @param length the number of existing child views to remove;
- * This should be a value >= 0 and <= (getViewCount() - offset)
+ * This should be a value >= 0 and <= (getViewCount() - offset)
* @param elems the child views to add; this value can be
* <code>null</code>to indicate no children are being added
* (useful to remove)
@@ -390,8 +390,8 @@
* information. This is implemented to call the
* layout method with the sizes inside of the insets.
*
- * @param width the width >= 0
- * @param height the height >= 0
+ * @param width the width >= 0
+ * @param height the height >= 0
*/
public void setSize(float width, float height) {
layout(Math.max(0, (int)(width - getLeftInset() - getRightInset())),
@@ -442,7 +442,7 @@
* <code>null</code> if the layout is invalid,
* otherwise the superclass behavior is executed.
*
- * @param index the index of the child, >= 0 && < getViewCount()
+ * @param index the index of the child, >= 0 && > getViewCount()
* @param a the allocation to this view
* @return the allocation to the child; or <code>null</code>
* if <code>a</code> is <code>null</code>;
@@ -469,7 +469,7 @@
* to the coordinate space of the view mapped to it. This makes
* sure the allocation is valid before calling the superclass.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @return the bounding box of the given position
* @exception BadLocationException if the given position does
@@ -488,11 +488,11 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param x x coordinate of the view location to convert >= 0
- * @param y y coordinate of the view location to convert >= 0
+ * @param x x coordinate of the view location to convert >= 0
+ * @param y y coordinate of the view location to convert >= 0
* @param a the allocated region to render into
* @return the location within the model that best represents the
- * given point in the view >= 0
+ * given point in the view >= 0
* @see View#viewToModel
*/
public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
@@ -513,7 +513,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the desired alignment >= 0.0f && <= 1.0f; this should
+ * @return the desired alignment >= 0.0f && <= 1.0f; this should
* be a value between 0.0 and 1.0 where 0 indicates alignment at the
* origin and 1.0 indicates alignment to the full span
* away from the origin; an alignment of 0.5 would be the
@@ -535,7 +535,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
@@ -558,7 +558,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
@@ -581,7 +581,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
@@ -613,8 +613,8 @@
/**
* Determines if a point falls before an allocated region.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param innerAlloc the allocated region; this is the area
* inside of the insets
* @return true if the point lies before the region else false
@@ -630,8 +630,8 @@
/**
* Determines if a point falls after an allocated region.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param innerAlloc the allocated region; this is the area
* inside of the insets
* @return true if the point lies after the region else false
@@ -647,8 +647,8 @@
/**
* Fetches the child view at the given coordinates.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the parents inner allocation on entry, which should
* be changed to the childs allocation on exit
* @return the view
@@ -688,7 +688,7 @@
* Allocates a region for a child view.
*
* @param index the index of the child view to
- * allocate, >= 0 && < getViewCount()
+ * allocate, >= 0 && < getViewCount()
* @param alloc the allocated region
*/
protected void childAllocation(int index, Rectangle alloc) {
@@ -701,8 +701,8 @@
/**
* Perform layout on the box
*
- * @param width the width (inside of the insets) >= 0
- * @param height the height (inside of the insets) >= 0
+ * @param width the width (inside of the insets) >= 0
+ * @param height the height (inside of the insets) >= 0
*/
protected void layout(int width, int height) {
setSpanOnAxis(X_AXIS, width);
--- a/jdk/src/share/classes/javax/swing/text/Caret.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Caret.java Thu Oct 03 19:18:54 2013 +0100
@@ -149,7 +149,7 @@
* and how fast the caret blinks, commonly used as one
* way to attract attention to the caret.
*
- * @param rate the delay in milliseconds >= 0. If this is
+ * @param rate the delay in milliseconds >=0. If this is
* zero the caret will not blink.
*/
public void setBlinkRate(int rate);
@@ -159,7 +159,7 @@
* and how fast the caret blinks, commonly used as one
* way to attract attention to the caret.
*
- * @return the delay in milliseconds >= 0. If this is
+ * @return the delay in milliseconds >=0. If this is
* zero the caret will not blink.
*/
public int getBlinkRate();
@@ -167,7 +167,7 @@
/**
* Fetches the current position of the caret.
*
- * @return the position >= 0
+ * @return the position >=0
*/
public int getDot();
@@ -176,7 +176,7 @@
* is a selection, the mark will not be the same as
* the dot.
*
- * @return the position >= 0
+ * @return the position >=0
*/
public int getMark();
@@ -197,7 +197,7 @@
* leaving behind the mark. This is useful for
* making selections.
*
- * @param dot the new position to move the caret to >= 0
+ * @param dot the new position to move the caret to >=0
*/
public void moveDot(int dot);
--- a/jdk/src/share/classes/javax/swing/text/ComponentView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ComponentView.java Thu Oct 03 19:18:54 2013 +0100
@@ -125,7 +125,7 @@
* axis of interest.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >=0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -153,7 +153,7 @@
* axis of interest.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >=0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -181,7 +181,7 @@
* axis of interest.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >=0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -319,7 +319,7 @@
* Provides a mapping from the coordinate space of the model to
* that of the view.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >=0
* @param a the allocated region to render into
* @return the bounding box of the given position is returned
* @exception BadLocationException if the given position does not
@@ -344,8 +344,8 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >=0
+ * @param y the Y coordinate >=0
* @param a the allocated region to render into
* @return the location within the model that best represents
* the given point in the view
--- a/jdk/src/share/classes/javax/swing/text/CompositeView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/CompositeView.java Thu Oct 03 19:18:54 2013 +0100
@@ -143,7 +143,7 @@
/**
* Returns the number of child views of this view.
*
- * @return the number of views >= 0
+ * @return the number of views >= 0
* @see #getView
*/
public int getViewCount() {
@@ -153,7 +153,7 @@
/**
* Returns the n-th view in this container.
*
- * @param n the number of the desired view, >= 0 && < getViewCount()
+ * @param n the number of the desired view, >= 0 && < getViewCount()
* @return the view at index <code>n</code>
*/
public View getView(int n) {
@@ -169,9 +169,9 @@
* may be garbage collected.
*
* @param offset the starting index into the child views to insert
- * the new views; >= 0 and <= getViewCount
+ * the new views; >= 0 and <= getViewCount
* @param length the number of existing child views to remove;
- * this should be a value >= 0 and <= (getViewCount() - offset)
+ * this should be a value >= 0 and <= (getViewCount() - offset)
* @param views the child views to add; this value can be
* <code>null</code>
* to indicate no children are being added (useful to remove)
@@ -223,7 +223,7 @@
* render into. This enables finding out where various views
* are located.
*
- * @param index the index of the child, >= 0 && < getViewCount()
+ * @param index the index of the child, >= 0 && < getViewCount()
* @param a the allocation to this view
* @return the allocation to the child
*/
@@ -237,7 +237,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @param b a bias value of either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
@@ -280,13 +280,13 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param p0 the position to convert >= 0
+ * @param p0 the position to convert >= 0
* @param b0 the bias toward the previous character or the
* next character represented by p0, in case the
* position is a boundary of two views; either
* <code>Position.Bias.Forward</code> or
* <code>Position.Bias.Backward</code>
- * @param p1 the position to convert >= 0
+ * @param p1 the position to convert >= 0
* @param b1 the bias toward the previous character or the
* next character represented by p1, in case the
* position is a boundary of two views
@@ -378,13 +378,13 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param x x coordinate of the view location to convert >= 0
- * @param y y coordinate of the view location to convert >= 0
+ * @param x x coordinate of the view location to convert >= 0
+ * @param y y coordinate of the view location to convert >= 0
* @param a the allocated region to render into
* @param bias either <code>Position.Bias.Forward</code> or
* <code>Position.Bias.Backward</code>
* @return the location within the model that best represents the
- * given point in the view >= 0
+ * given point in the view >= 0
* @see View#viewToModel
*/
public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
@@ -436,7 +436,7 @@
* This is a convenience method for {@link #getNextNorthSouthVisualPositionFrom}
* and {@link #getNextEastWestVisualPositionFrom}.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param b a bias value of either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
* @param a the allocated region to render into
@@ -484,7 +484,7 @@
* <code>getViewIndexByPosition</code>
* method for backward compatibility.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
* @since 1.3
@@ -505,8 +505,8 @@
/**
* Tests whether a point lies before the rectangle range.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the rectangle
* @return true if the point is before the specified range
*/
@@ -515,8 +515,8 @@
/**
* Tests whether a point lies after the rectangle range.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the rectangle
* @return true if the point is after the specified range
*/
@@ -525,8 +525,8 @@
/**
* Fetches the child view at the given coordinates.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the parent's allocation on entry, which should
* be changed to the child's allocation on exit
* @return the child view
@@ -536,7 +536,7 @@
/**
* Returns the allocation for a given child.
*
- * @param index the index of the child, >= 0 && < getViewCount()
+ * @param index the index of the child, >= 0 && < getViewCount()
* @param a the allocation to the interior of the box on entry,
* and the allocation of the child view at the index on exit.
*/
@@ -547,7 +547,7 @@
* the model. This is implemented to fetch the view in the case
* where there is a child view for each child element.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @param a the allocation to the interior of the box on entry,
* and the allocation of the view containing the position on exit
* @return the view representing the given position, or
@@ -570,7 +570,7 @@
* the model. This is implemented to fetch the view in the case
* where there is a child view for each child element.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
*/
@@ -639,10 +639,10 @@
/**
* Sets the insets for the view.
*
- * @param top the top inset >= 0
- * @param left the left inset >= 0
- * @param bottom the bottom inset >= 0
- * @param right the right inset >= 0
+ * @param top the top inset >= 0
+ * @param left the left inset >= 0
+ * @param bottom the bottom inset >= 0
+ * @param right the right inset >= 0
*/
protected void setInsets(short top, short left, short bottom, short right) {
this.top = top;
@@ -654,7 +654,7 @@
/**
* Gets the left inset.
*
- * @return the inset >= 0
+ * @return the inset >= 0
*/
protected short getLeftInset() {
return left;
@@ -663,7 +663,7 @@
/**
* Gets the right inset.
*
- * @return the inset >= 0
+ * @return the inset >= 0
*/
protected short getRightInset() {
return right;
@@ -672,7 +672,7 @@
/**
* Gets the top inset.
*
- * @return the inset >= 0
+ * @return the inset >= 0
*/
protected short getTopInset() {
return top;
@@ -681,7 +681,7 @@
/**
* Gets the bottom inset.
*
- * @return the inset >= 0
+ * @return the inset >= 0
*/
protected short getBottomInset() {
return bottom;
@@ -691,7 +691,7 @@
* Returns the next visual position for the cursor, in either the
* north or south direction.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param b a bias value of either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
* @param a the allocated region to render into
@@ -723,7 +723,7 @@
* Returns the next visual position for the cursor, in either the
* east or west direction.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param b a bias value of either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
* @param a the allocated region to render into
--- a/jdk/src/share/classes/javax/swing/text/DefaultCaret.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultCaret.java Thu Oct 03 19:18:54 2013 +0100
@@ -962,8 +962,8 @@
// focus lost notification can come in later after the
// caret has been deinstalled, in which case the component
// will be null.
+ active = e;
if (component != null) {
- active = e;
TextUI mapper = component.getUI();
if (visible != e) {
visible = e;
@@ -1211,12 +1211,9 @@
boolean isPositionLTR(int position, Position.Bias bias) {
Document doc = component.getDocument();
- if(doc instanceof AbstractDocument ) {
- if(bias == Position.Bias.Backward && --position < 0)
- position = 0;
- return ((AbstractDocument)doc).isLeftToRight(position, position);
- }
- return true;
+ if(bias == Position.Bias.Backward && --position < 0)
+ position = 0;
+ return AbstractDocument.isLeftToRight(doc, position, position);
}
Position.Bias guessBiasForOffset(int offset, Position.Bias lastBias,
--- a/jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java Thu Oct 03 19:18:54 2013 +0100
@@ -140,7 +140,7 @@
* @param in The stream to read from
* @param doc The destination for the insertion.
* @param pos The location in the document to place the
- * content >= 0.
+ * content >=0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -158,8 +158,8 @@
* @param out The stream to write to
* @param doc The source for the write.
* @param pos The location in the document to fetch the
- * content >= 0.
- * @param len The amount to write out >= 0.
+ * content >=0.
+ * @param len The amount to write out >=0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -191,7 +191,7 @@
* @param in The stream to read from
* @param doc The destination for the insertion.
* @param pos The location in the document to place the
- * content >= 0.
+ * content >=0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -300,8 +300,8 @@
* @param out The stream to write to
* @param doc The source for the write.
* @param pos The location in the document to fetch the
- * content from >= 0.
- * @param len The amount to write out >= 0.
+ * content from >=0.
+ * @param len The amount to write out >=0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos is not within 0 and
* the length of the document.
--- a/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Thu Oct 03 19:18:54 2013 +0100
@@ -105,8 +105,8 @@
* Adds a highlight to the view. Returns a tag that can be used
* to refer to the highlight.
*
- * @param p0 the start offset of the range to highlight >= 0
- * @param p1 the end offset of the range to highlight >= p0
+ * @param p0 the start offset of the range to highlight >= 0
+ * @param p1 the end offset of the range to highlight >= p0
* @param p the painter to use to actually render the highlight
* @return an object that can be used as a tag
* to refer to the highlight
@@ -220,8 +220,8 @@
* Changes a highlight.
*
* @param tag the highlight tag
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
* @exception BadLocationException if the specified location is invalid
*/
public void changeHighlight(Object tag, int p0, int p1) throws BadLocationException {
@@ -395,8 +395,8 @@
* Paints a highlight.
*
* @param g the graphics context
- * @param offs0 the starting model offset >= 0
- * @param offs1 the ending model offset >= offs1
+ * @param offs0 the starting model offset >= 0
+ * @param offs1 the ending model offset >= offs1
* @param bounds the bounding box for the highlight
* @param c the editor
*/
@@ -441,8 +441,8 @@
* Paints a portion of a highlight.
*
* @param g the graphics context
- * @param offs0 the starting model offset >= 0
- * @param offs1 the ending model offset >= offs1
+ * @param offs0 the starting model offset >= 0
+ * @param offs1 the ending model offset >= offs1
* @param bounds the bounding box of the view, which is not
* necessarily the region to paint.
* @param c the editor
--- a/jdk/src/share/classes/javax/swing/text/DefaultStyledDocument.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultStyledDocument.java Thu Oct 03 19:18:54 2013 +0100
@@ -176,7 +176,7 @@
* <A HREF="http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
* in Swing</A> for more information.
*
- * @param offset the starting offset >= 0
+ * @param offset the starting offset >= 0
* @param data the element data
* @exception BadLocationException for an invalid starting offset
*/
@@ -429,7 +429,7 @@
* <A HREF="http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
* in Swing</A> for more information.
*
- * @param pos the offset from the start of the document >= 0
+ * @param pos the offset from the start of the document >= 0
* @param s the logical style to assign to the paragraph, null if none
*/
public void setLogicalStyle(int pos, Style s) {
@@ -458,7 +458,7 @@
* represented by the given position.
*
* @param p the location to translate to a paragraph
- * and determine the logical style assigned >= 0. This
+ * and determine the logical style assigned >= 0. This
* is an offset from the start of the document.
* @return the style, null if none
*/
@@ -486,8 +486,8 @@
* <A HREF="http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
* in Swing</A> for more information.
*
- * @param offset the offset in the document >= 0
- * @param length the length >= 0
+ * @param offset the offset in the document >= 0
+ * @param length the length >= 0
* @param s the attributes
* @param replace true if the previous attributes should be replaced
* before setting the new attributes
@@ -539,8 +539,8 @@
* <A HREF="http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
* in Swing</A> for more information.
*
- * @param offset the offset into the paragraph >= 0
- * @param length the number of characters affected >= 0
+ * @param offset the offset into the paragraph >= 0
+ * @param length the number of characters affected >= 0
* @param s the attributes
* @param replace whether to replace existing attributes, or merge them
*/
@@ -589,7 +589,7 @@
* A paragraph consists of at least one child Element, which is usually
* a leaf.
*
- * @param pos the starting offset >= 0
+ * @param pos the starting offset >= 0
* @return the element
*/
public Element getParagraphElement(int pos) {
@@ -606,7 +606,7 @@
/**
* Gets a character element based on a position.
*
- * @param pos the position in the document >= 0
+ * @param pos the position in the document >= 0
* @return the element
*/
public Element getCharacterElement(int pos) {
@@ -1233,7 +1233,7 @@
* @param a the attributes for the element
* @param type the type of the element (StartTagType, EndTagType,
* ContentType)
- * @param len the length >= 0
+ * @param len the length >= 0
*/
public ElementSpec(AttributeSet a, short type, int len) {
this(a, type, null, 0, len);
@@ -1247,8 +1247,8 @@
* @param type the type of the element (StartTagType, EndTagType,
* ContentType)
* @param txt the text for the element
- * @param offs the offset into the text >= 0
- * @param len the length of the text >= 0
+ * @param offs the offset into the text >= 0
+ * @param len the length of the text >= 0
*/
public ElementSpec(AttributeSet a, short type, char[] txt,
int offs, int len) {
@@ -1321,7 +1321,7 @@
/**
* Gets the starting offset.
*
- * @return the offset >= 0
+ * @return the offset >= 0
*/
public int getOffset() {
return offs;
@@ -1330,7 +1330,7 @@
/**
* Gets the length.
*
- * @return the length >= 0
+ * @return the length >= 0
*/
public int getLength() {
return len;
@@ -1420,8 +1420,8 @@
/**
* Inserts new content.
*
- * @param offset the starting offset >= 0
- * @param length the length >= 0
+ * @param offset the starting offset >= 0
+ * @param length the length >= 0
* @param data the data to insert
* @param de the event capturing this edit
*/
@@ -1500,8 +1500,8 @@
/**
* Removes content.
*
- * @param offset the starting offset >= 0
- * @param length the length >= 0
+ * @param offset the starting offset >= 0
+ * @param length the length >= 0
* @param de the event capturing this edit
*/
public void remove(int offset, int length, DefaultDocumentEvent de) {
@@ -1513,8 +1513,8 @@
/**
* Changes content.
*
- * @param offset the starting offset >= 0
- * @param length the length >= 0
+ * @param offset the starting offset >= 0
+ * @param length the length >= 0
* @param de the event capturing this edit
*/
public void change(int offset, int length, DefaultDocumentEvent de) {
--- a/jdk/src/share/classes/javax/swing/text/Document.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Document.java Thu Oct 03 19:18:54 2013 +0100
@@ -58,9 +58,9 @@
* <p>The following methods give access to the character data
* that makes up the content.
* <ul>
- * <li><a href="#getLength()">getLength()</a>
- * <li><a href="#getText(int, int)">getText(int, int)</a>
- * <li><a href="#getText(int, int, javax.swing.text.Segment)">getText(int, int, Segment)</a>
+ * <li>{@link #getLength()}
+ * <li>{@link #getText(int, int)}
+ * <li>{@link #getText(int, int, javax.swing.text.Segment)}
* </ul>
* <p><b><font size=+1>Structure</font></b>
* <p>
@@ -79,8 +79,8 @@
* <a href="AttributeSet.html">AttributeSet</a> interface.
* <p>The following methods give access to the document structure.
* <ul>
- * <li><a href="#getDefaultRootElement()">getDefaultRootElement</a>
- * <li><a href="#getRootElements()">getRootElements</a>
+ * <li>{@link #getDefaultRootElement()}
+ * <li>{@link #getRootElements()}
* </ul>
*
* <p><b><font size=+1>Mutations</font></b>
@@ -93,9 +93,9 @@
* <p>The following methods are related to mutation of the
* document content:
* <ul>
- * <li><a href="#insertString(int, java.lang.String, javax.swing.text.AttributeSet)">insertString(int, String, AttributeSet)</a>
- * <li><a href="#remove(int, int)">remove(int, int)</a>
- * <li><a href="#createPosition(int)">createPosition(int)</a>
+ * <li>{@link #insertString(int, java.lang.String, javax.swing.text.AttributeSet)}
+ * <li>{@link #remove(int, int)}
+ * <li>{@link #createPosition(int)}
* </ul>
*
* <p><b><font size=+1>Notification</font></b>
@@ -161,8 +161,8 @@
* and the <a href="#TitleProperty">TitleProperty</a>, which can be used to
* name the <code>Document</code>. The methods related to the properties are:
* <ul>
- * <li><a href="#getProperty(java.lang.Object)">getProperty(Object)</a>
- * <li><a href="#putProperty(java.lang.Object, java.lang.Object)">putProperty(Object, Object)</a>
+ * <li>{@link #getProperty(java.lang.Object)}
+ * <li>{@link #putProperty(java.lang.Object, java.lang.Object)}
* </ul>
*
* <p>For more information on the <code>Document</code> class, see
--- a/jdk/src/share/classes/javax/swing/text/DocumentFilter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DocumentFilter.java Thu Oct 03 19:18:54 2013 +0100
@@ -68,8 +68,8 @@
* necessary.
*
* @param fb FilterBypass that can be used to mutate Document
- * @param offset the offset from the beginning >= 0
- * @param length the number of characters to remove >= 0
+ * @param offset the offset from the beginning >= 0
+ * @param length the number of characters to remove >= 0
* @exception BadLocationException some portion of the removal range
* was not a valid part of the document. The location in the exception
* is the first bad position encountered.
@@ -86,7 +86,7 @@
* necessary, or call directly into the FilterBypass.
*
* @param fb FilterBypass that can be used to mutate Document
- * @param offset the offset into the document to insert the content >= 0.
+ * @param offset the offset into the document to insert the content >= 0.
* All positions that track change at or after the given location
* will move.
* @param string the string to insert
@@ -141,8 +141,8 @@
* Removes the specified region of text, bypassing the
* DocumentFilter.
*
- * @param offset the offset from the beginning >= 0
- * @param length the number of characters to remove >= 0
+ * @param offset the offset from the beginning >= 0
+ * @param length the number of characters to remove >= 0
* @exception BadLocationException some portion of the removal range
* was not a valid part of the document. The location in the
* exception is the first bad position encountered.
@@ -154,7 +154,7 @@
* Inserts the specified text, bypassing the
* DocumentFilter.
* @param offset the offset into the document to insert the
- * content >= 0. All positions that track change at or after the
+ * content >= 0. All positions that track change at or after the
* given location will move.
* @param string the string to insert
* @param attr the attributes to associate with the inserted
--- a/jdk/src/share/classes/javax/swing/text/EditorKit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/EditorKit.java Thu Oct 03 19:18:54 2013 +0100
@@ -55,7 +55,7 @@
/**
* Creates a copy of the editor kit. This is implemented
- * to use Object.clone</em>. If the kit cannot be cloned,
+ * to use <code>Object.clone()</code>. If the kit cannot be cloned,
* null is returned.
*
* @return the copy
@@ -139,7 +139,7 @@
* @param in The stream to read from
* @param doc The destination for the insertion.
* @param pos The location in the document to place the
- * content >= 0.
+ * content >= 0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -154,8 +154,8 @@
* @param out The stream to write to
* @param doc The source for the write.
* @param pos The location in the document to fetch the
- * content from >= 0.
- * @param len The amount to write out >= 0.
+ * content from >= 0.
+ * @param len The amount to write out >= 0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -176,7 +176,7 @@
* @param in The stream to read from
* @param doc The destination for the insertion.
* @param pos The location in the document to place the
- * content >= 0.
+ * content >= 0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
@@ -196,8 +196,8 @@
* @param out The stream to write to
* @param doc The source for the write.
* @param pos The location in the document to fetch the
- * content >= 0.
- * @param len The amount to write out >= 0.
+ * content >= 0.
+ * @param len The amount to write out >= 0.
* @exception IOException on any I/O error
* @exception BadLocationException if pos represents an invalid
* location within the document.
--- a/jdk/src/share/classes/javax/swing/text/FieldView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/FieldView.java Thu Oct 03 19:18:54 2013 +0100
@@ -200,7 +200,7 @@
* axis.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >= 0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -241,7 +241,7 @@
* given axis. A value of 0 or less is not resizable.
*
* @param axis View.X_AXIS or View.Y_AXIS
- * @return the weight -> 1 for View.X_AXIS, else 0
+ * @return the weight -> 1 for View.X_AXIS, else 0
*/
public int getResizeWeight(int axis) {
if (axis == View.X_AXIS) {
@@ -254,7 +254,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @return the bounding box of the given position
* @exception BadLocationException if the given position does not
@@ -269,8 +269,8 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param fx the X coordinate >= 0.0f
- * @param fy the Y coordinate >= 0.0f
+ * @param fx the X coordinate >= 0.0f
+ * @param fy the Y coordinate >= 0.0f
* @param a the allocated region to render into
* @return the location within the model that best represents the
* given point in the view
--- a/jdk/src/share/classes/javax/swing/text/FlowView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/FlowView.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -88,7 +88,7 @@
* is returned.
*
* @param index the index of the row being updated.
- * This should be a value >= 0 and < getViewCount().
+ * This should be a value >= 0 and < getViewCount().
* @see #getFlowStart
*/
public int getFlowSpan(int index) {
@@ -103,7 +103,7 @@
* for the row constraints.
* @param index the index of the row being updated.
- * This should be a value >= 0 and < getViewCount().
+ * This should be a value >= 0 and < getViewCount().
* @see #getFlowSpan
*/
public int getFlowStart(int index) {
@@ -147,7 +147,7 @@
* Fetches the child view index representing the given position in
* the model.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
*/
@@ -175,9 +175,9 @@
* a preferenceChanged is called. Following all of that,
* the normal box layout of the superclass is performed.
*
- * @param width the width to lay out against >= 0. This is
+ * @param width the width to lay out against >= 0. This is
* the width inside of the inset area.
- * @param height the height to lay out against >= 0 This
+ * @param height the height to lay out against >= 0 This
* is the height inside of the inset area.
*/
protected void layout(int width, int height) {
@@ -580,7 +580,7 @@
*
* @param rowIndex the row to adjust to the current layout
* span.
- * @param desiredSpan the current layout span >= 0
+ * @param desiredSpan the current layout span >= 0
* @param x the location r starts at.
*/
protected void adjustRow(FlowView fv, int rowIndex, int desiredSpan, int x) {
@@ -796,6 +796,22 @@
v.setParent(parent);
}
+ /** {@inheritDoc} */
+ @Override
+ protected void forwardUpdate(DocumentEvent.ElementChange ec,
+ DocumentEvent e, Shape a, ViewFactory f) {
+ calculateUpdateIndexes(e);
+ // Send update event to all views followed by the changed place.
+ lastUpdateIndex = Math.max((getViewCount() - 1), 0);
+ for (int i = firstUpdateIndex; i <= lastUpdateIndex; i++) {
+ View v = getView(i);
+ if (v != null) {
+ Shape childAlloc = getChildAllocation(i, a);
+ forwardUpdateToView(v, e, childAlloc, f);
+ }
+ }
+ }
+
// The following methods don't do anything useful, they
// simply keep the class from being abstract.
@@ -816,8 +832,8 @@
* Implemented to return false, as hit detection is not
* performed on the logical view.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the rectangle
* @return true if the point is before the specified range
*/
@@ -830,8 +846,8 @@
* Implemented to return false, as hit detection is not
* performed on the logical view.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the rectangle
* @return true if the point is after the specified range
*/
@@ -844,8 +860,8 @@
* Implemented to return null, as hit detection is not
* performed on the logical view.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param alloc the parent's allocation on entry, which should
* be changed to the child's allocation on exit
* @return the child view
@@ -859,7 +875,7 @@
* Implemented to do nothing, as the logical view doesn't
* perform layout on the children.
*
- * @param index the index of the child, >= 0 && < getViewCount()
+ * @param index the index of the child, >= 0 && < getViewCount()
* @param a the allocation to the interior of the box on entry,
* and the allocation of the child view at the index on exit.
*/
--- a/jdk/src/share/classes/javax/swing/text/GapContent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GapContent.java Thu Oct 03 19:18:54 2013 +0100
@@ -107,7 +107,7 @@
/**
* Returns the length of the content.
*
- * @return the length >= 1
+ * @return the length >= 1
* @see AbstractDocument.Content#length
*/
public int length() {
@@ -118,7 +118,7 @@
/**
* Inserts a string into the content.
*
- * @param where the starting position >= 0, < length()
+ * @param where the starting position >= 0, < length()
* @param str the non-null string to insert
* @return an UndoableEdit object for undoing
* @exception BadLocationException if the specified position is invalid
@@ -136,8 +136,8 @@
/**
* Removes part of the content.
*
- * @param where the starting position >= 0, where + nitems < length()
- * @param nitems the number of characters to remove >= 0
+ * @param where the starting position >= 0, where + nitems < length()
+ * @param nitems the number of characters to remove >= 0
* @return an UndoableEdit object for undoing
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#remove
@@ -156,8 +156,8 @@
/**
* Retrieves a portion of the content.
*
- * @param where the starting position >= 0
- * @param len the length to retrieve >= 0
+ * @param where the starting position >= 0
+ * @param len the length to retrieve >= 0
* @return a string representing the content
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#getString
@@ -174,8 +174,8 @@
* span the gap, the actual store is returned to avoid the copy since
* it is contiguous.
*
- * @param where the starting position >= 0, where + len <= length()
- * @param len the number of characters to retrieve >= 0
+ * @param where the starting position >= 0, where + len <= length()
+ * @param len the number of characters to retrieve >= 0
* @param chars the Segment object to return the characters in
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#getChars
@@ -222,7 +222,7 @@
* Creates a position within the content that will
* track change as the content is mutated.
*
- * @param offset the offset to track >= 0
+ * @param offset the offset to track >= 0
* @return the position
* @exception BadLocationException if the specified position is invalid
*/
@@ -705,8 +705,8 @@
* there. The vector with the resulting Positions are returned.
*
* @param v the Vector to use, with a new one created on null
- * @param offset the starting offset >= 0
- * @param length the length >= 0
+ * @param offset the starting offset >= 0
+ * @param length the length >= 0
* @return the set of instances
*/
protected Vector getPositionsInRange(Vector v, int offset, int length) {
--- a/jdk/src/share/classes/javax/swing/text/GlyphPainter2.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GlyphPainter2.java Thu Oct 03 19:18:54 2013 +0100
@@ -239,10 +239,10 @@
Position.Bias[] biasRet)
throws BadLocationException {
+ Document doc = v.getDocument();
int startOffset = v.getStartOffset();
int endOffset = v.getEndOffset();
Segment text;
- AbstractDocument doc;
boolean viewIsLeftToRight;
TextHitInfo currentHit, nextHit;
@@ -252,8 +252,7 @@
case View.SOUTH:
break;
case View.EAST:
- doc = (AbstractDocument)v.getDocument();
- viewIsLeftToRight = doc.isLeftToRight(startOffset, endOffset);
+ viewIsLeftToRight = AbstractDocument.isLeftToRight(doc, startOffset, endOffset);
if(startOffset == doc.getLength()) {
if(pos == -1) {
@@ -313,8 +312,7 @@
}
return pos;
case View.WEST:
- doc = (AbstractDocument)v.getDocument();
- viewIsLeftToRight = doc.isLeftToRight(startOffset, endOffset);
+ viewIsLeftToRight = AbstractDocument.isLeftToRight(doc, startOffset, endOffset);
if(startOffset == doc.getLength()) {
if(pos == -1) {
--- a/jdk/src/share/classes/javax/swing/text/GlyphView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java Thu Oct 03 19:18:54 2013 +0100
@@ -121,8 +121,8 @@
* the GlyphPainter to determine what characters
* it should render glyphs for.
*
- * @param p0 the starting document offset >= 0
- * @param p1 the ending document offset >= p0
+ * @param p0 the starting document offset >= 0
+ * @param p1 the ending document offset >= p0
* @return the <code>Segment</code> containing the text
*/
public Segment getText(int p0, int p1) {
@@ -282,9 +282,9 @@
* tab expansion implementation.
*
* @param x the position the view would be located
- * at for the purpose of tab expansion >= 0.
+ * at for the purpose of tab expansion >= 0.
* @param e how to expand the tabs when encountered.
- * @return the desired span >= 0
+ * @return the desired span >= 0
* @see TabableView#getTabbedSpan
*/
public float getTabbedSpan(float x, TabExpander e) {
@@ -321,9 +321,9 @@
* arrange for its own text buffer to make the
* measurements.
*
- * @param p0 the starting document offset >= 0
- * @param p1 the ending document offset >= p0
- * @return the span >= 0
+ * @param p0 the starting document offset >= 0
+ * @param p1 the ending document offset >= p0
+ * @return the span >= 0
*/
public float getPartialSpan(int p0, int p1) {
checkPainter();
@@ -572,7 +572,7 @@
* axis.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >= 0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -639,7 +639,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @param b either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
@@ -657,14 +657,14 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param a the allocated region to render into
* @param biasReturn either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code> is returned as the
* zero-th element of this array
* @return the location within the model that best represents the
- * given point of view >= 0
+ * given point of view >= 0
* @see View#viewToModel
*/
public int viewToModel(float x, float y, Shape a, Position.Bias[] biasReturn) {
@@ -702,10 +702,10 @@
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
* @param pos the potential location of the start of the
- * broken view >= 0. This may be useful for calculating tab
+ * broken view >= 0. This may be useful for calculating tab
* positions.
* @param len specifies the relative length from <em>pos</em>
- * where a potential break is desired >= 0.
+ * where a potential break is desired >= 0.
* @return the weight, which should be a value between
* View.ForcedBreakWeight and View.BadBreakWeight.
* @see LabelView
@@ -736,12 +736,12 @@
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
* @param p0 the location in the model where the
- * fragment should start it's representation >= 0.
+ * fragment should start it's representation >= 0.
* @param pos the position along the axis that the
- * broken view would occupy >= 0. This may be useful for
+ * broken view would occupy >= 0. This may be useful for
* things like tab calculations.
* @param len specifies the distance along the axis
- * where a potential break is desired >= 0.
+ * where a potential break is desired >= 0.
* @return the fragment of the view that represents the
* given span, if the view can be broken. If the view
* doesn't support breaking behavior, the view itself is
@@ -852,10 +852,10 @@
* to return a nested class that shares state in this view
* representing only a portion of the view.
*
- * @param p0 the starting offset >= 0. This should be a value
+ * @param p0 the starting offset >= 0. This should be a value
* greater or equal to the element starting offset and
* less than the element ending offset.
- * @param p1 the ending offset > p0. This should be a value
+ * @param p1 the ending offset > p0. This should be a value
* less than or equal to the elements end offset and
* greater than the elements starting offset.
* @return the view fragment, or itself if the view doesn't
@@ -880,7 +880,7 @@
* they just might not allow access to some of the locations in the
* model.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @param direction the direction from the current position that can
* be thought of as the arrow keys typically found on a keyboard.
@@ -1196,12 +1196,12 @@
*
* @param v the view to find the model location to break at.
* @param p0 the location in the model where the
- * fragment should start it's representation >= 0.
+ * fragment should start it's representation >= 0.
* @param x the graphic location along the axis that the
- * broken view would occupy >= 0. This may be useful for
+ * broken view would occupy >= 0. This may be useful for
* things like tab calculations.
* @param len specifies the distance into the view
- * where a potential break is desired >= 0.
+ * where a potential break is desired >= 0.
* @return the maximum model location possible for a break.
* @see View#breakView
*/
@@ -1214,8 +1214,8 @@
* the painter doesn't hold any significant state, it can
* return itself. The default behavior is to return itself.
* @param v the <code>GlyphView</code> to provide a painter for
- * @param p0 the starting document offset >= 0
- * @param p1 the ending document offset >= p0
+ * @param p0 the starting document offset >= 0
+ * @param p1 the ending document offset >= p0
*/
public GlyphPainter getPainter(GlyphView v, int p0, int p1) {
return this;
@@ -1229,7 +1229,7 @@
* model.
*
* @param v the view to use
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param b either <code>Position.Bias.Forward</code>
* or <code>Position.Bias.Backward</code>
* @param a the allocated region to render into
--- a/jdk/src/share/classes/javax/swing/text/Highlighter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Highlighter.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,8 +66,8 @@
* Adds a highlight to the view. Returns a tag that can be used
* to refer to the highlight.
*
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
* @param p the painter to use for the actual highlighting
* @return an object that refers to the highlight
* @exception BadLocationException for an invalid range specification
@@ -93,8 +93,8 @@
* with a mouse) by damaging only what changed.
*
* @param tag which highlight to change
- * @param p0 the beginning of the range >= 0
- * @param p1 the end of the range >= p0
+ * @param p0 the beginning of the range >= 0
+ * @param p1 the end of the range >= p0
* @exception BadLocationException for an invalid range specification
*/
public void changeHighlight(Object tag, int p0, int p1) throws BadLocationException;
@@ -115,8 +115,8 @@
* Renders the highlight.
*
* @param g the graphics context
- * @param p0 the starting offset in the model >= 0
- * @param p1 the ending offset in the model >= p0
+ * @param p0 the starting offset in the model >= 0
+ * @param p1 the ending offset in the model >= p0
* @param bounds the bounding box for the highlight
* @param c the editor
*/
@@ -129,14 +129,14 @@
/**
* Gets the starting model offset for the highlight.
*
- * @return the starting offset >= 0
+ * @return the starting offset >= 0
*/
public int getStartOffset();
/**
* Gets the ending model offset for the highlight.
*
- * @return the ending offset >= 0
+ * @return the ending offset >= 0
*/
public int getEndOffset();
--- a/jdk/src/share/classes/javax/swing/text/IconView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/IconView.java Thu Oct 03 19:18:54 2013 +0100
@@ -101,7 +101,7 @@
* along the x axis.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the desired alignment >= 0.0f && <= 1.0f. This should be
+ * @return the desired alignment >= 0.0f && <= 1.0f. This should be
* a value between 0.0 and 1.0 where 0 indicates alignment at the
* origin and 1.0 indicates alignment to the full span
* away from the origin. An alignment of 0.5 would be the
@@ -120,7 +120,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @return the bounding box of the given position
* @exception BadLocationException if the given position does not
@@ -145,11 +145,11 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param x the X coordinate >= 0
- * @param y the Y coordinate >= 0
+ * @param x the X coordinate >= 0
+ * @param y the Y coordinate >= 0
* @param a the allocated region to render into
* @return the location within the model that best represents the
- * given point of view >= 0
+ * given point of view >= 0
* @see View#viewToModel
*/
public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
--- a/jdk/src/share/classes/javax/swing/text/JTextComponent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java Thu Oct 03 19:18:54 2013 +0100
@@ -1562,8 +1562,10 @@
/**
* Sets the key accelerator that will cause the receiving text
* component to get the focus. The accelerator will be the
- * key combination of the <em>alt</em> key and the character
- * given (converted to upper case). By default, there is no focus
+ * key combination of the platform-specific modifier key and
+ * the character given (converted to upper case). For example,
+ * the ALT key is used as a modifier on Windows and the CTRL+ALT
+ * combination is used on Mac. By default, there is no focus
* accelerator key. Any previous key accelerator setting will be
* superseded. A '\0' key setting will be registered, and has the
* effect of turning off the focus accelerator. When the new key
--- a/jdk/src/share/classes/javax/swing/text/NavigationFilter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/NavigationFilter.java Thu Oct 03 19:18:54 2013 +0100
@@ -57,7 +57,7 @@
* on the <code>FilterBypass</code>
*
* @param fb FilterBypass that can be used to mutate caret position
- * @param dot the position >= 0
+ * @param dot the position >= 0
* @param bias Bias to place the dot at
*/
public void setDot(FilterBypass fb, int dot, Position.Bias bias) {
@@ -72,7 +72,7 @@
* methods on the <code>FilterBypass</code>.
*
* @param fb FilterBypass that can be used to mutate caret position
- * @param dot the position >= 0
+ * @param dot the position >= 0
* @param bias Bias for new location
*/
public void moveDot(FilterBypass fb, int dot, Position.Bias bias) {
@@ -131,7 +131,7 @@
/**
* Sets the caret location, bypassing the NavigationFilter.
*
- * @param dot the position >= 0
+ * @param dot the position >= 0
* @param bias Bias to place the dot at
*/
public abstract void setDot(int dot, Position.Bias bias);
@@ -139,7 +139,7 @@
/**
* Moves the caret location, bypassing the NavigationFilter.
*
- * @param dot the position >= 0
+ * @param dot the position >= 0
* @param bias Bias for new location
*/
public abstract void moveDot(int dot, Position.Bias bias);
--- a/jdk/src/share/classes/javax/swing/text/ParagraphView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ParagraphView.java Thu Oct 03 19:18:54 2013 +0100
@@ -267,8 +267,6 @@
throws BadLocationException {
JTextComponent text = (JTextComponent)getContainer();
Document doc = getDocument();
- AbstractDocument aDoc = (doc instanceof AbstractDocument) ?
- (AbstractDocument)doc : null;
View row = getView(rowIndex);
int lastPos = -1;
// This could be made better to check backward positions too.
@@ -276,8 +274,7 @@
for(int vc = 0, numViews = row.getViewCount(); vc < numViews; vc++) {
View v = row.getView(vc);
int start = v.getStartOffset();
- boolean ltr = (aDoc != null) ? aDoc.isLeftToRight
- (start, start + 1) : true;
+ boolean ltr = AbstractDocument.isLeftToRight(doc, start, start + 1);
if(ltr) {
lastPos = start;
for(int end = v.getEndOffset(); lastPos < end; lastPos++) {
@@ -338,12 +335,8 @@
protected boolean flipEastAndWestAtEnds(int position,
Position.Bias bias) {
Document doc = getDocument();
- if(doc instanceof AbstractDocument &&
- !((AbstractDocument)doc).isLeftToRight(getStartOffset(),
- getStartOffset() + 1)) {
- return true;
- }
- return false;
+ position = getStartOffset();
+ return !AbstractDocument.isLeftToRight(doc, position, position + 1);
}
// --- FlowView methods ---------------------------------------------
@@ -416,8 +409,8 @@
*
* @param x the X reference position
* @param tabOffset the position within the text stream
- * that the tab occurred at >= 0
- * @return the trailing end of the tab expansion >= 0
+ * that the tab occurred at >= 0
+ * @return the trailing end of the tab expansion >= 0
* @see TabSet
* @see TabStop
* @see LabelView
@@ -496,9 +489,9 @@
* the <code>TabableView</code> interface,
* the <code>preferredSpan</code> will be used.
*
- * @param startOffset the starting document offset >= 0
- * @param endOffset the ending document offset >= startOffset
- * @return the size >= 0
+ * @param startOffset the starting document offset >= 0
+ * @param endOffset the ending document offset >= startOffset
+ * @return the size >= 0
*/
protected float getPartialSize(int startOffset, int endOffset) {
float size = 0.0f;
@@ -536,7 +529,7 @@
* there are no characters found, -1 will be returned.
*
* @param string the string of characters
- * @param start where to start in the model >= 0
+ * @param start where to start in the model >= 0
* @return the document offset, or -1 if no characters found
*/
protected int findOffsetToCharactersInString(char[] string,
@@ -649,7 +642,7 @@
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
* @param len specifies where a potential break is desired
- * along the given axis >= 0
+ * along the given axis >= 0
* @param a the current allocation of the view
* @return the fragment of the view that represents the
* given span, if the view can be broken; if the view
@@ -682,7 +675,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @param len specifies where a potential break is desired >= 0
+ * @param len specifies where a potential break is desired >= 0
* @return a value indicating the attractiveness of breaking here;
* either <code>GoodBreakWeight</code> or <code>BadBreakWeight</code>
* @see View#getBreakWeight
@@ -1148,7 +1141,7 @@
* Fetches the child view index representing the given position in
* the model.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
*/
--- a/jdk/src/share/classes/javax/swing/text/PasswordView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PasswordView.java Thu Oct 03 19:18:54 2013 +0100
@@ -55,11 +55,11 @@
* using the value returned by getEchoChar().
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the starting offset in the model >= 0
- * @param p1 the ending offset in the model >= p0
- * @return the X location of the end of the range >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the starting offset in the model >= 0
+ * @param p1 the ending offset in the model >= p0
+ * @return the X location of the end of the range >= 0
* @exception BadLocationException if p0 or p1 are out of range
*/
protected int drawUnselectedText(Graphics g, int x, int y,
@@ -94,11 +94,11 @@
* display the characters.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the starting offset in the model >= 0
- * @param p1 the ending offset in the model >= p0
- * @return the X location of the end of the range >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the starting offset in the model >= 0
+ * @param p1 the ending offset in the model >= p0
+ * @return the X location of the end of the range >= 0
* @exception BadLocationException if p0 or p1 are out of range
*/
protected int drawSelectedText(Graphics g, int x,
@@ -126,10 +126,10 @@
* or unselected text.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
* @param c the echo character
- * @return the updated X position >= 0
+ * @return the updated X position >= 0
*/
protected int drawEchoCharacter(Graphics g, int x, int y, char c) {
ONE[0] = c;
@@ -142,7 +142,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @return the bounding box of the given position
* @exception BadLocationException if the given position does not
@@ -172,8 +172,8 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param fx the X coordinate >= 0.0f
- * @param fy the Y coordinate >= 0.0f
+ * @param fx the X coordinate >= 0.0f
+ * @param fy the Y coordinate >= 0.0f
* @param a the allocated region to render into
* @return the location within the model that best represents the
* given point in the view
@@ -210,7 +210,7 @@
* axis.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >= 0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
--- a/jdk/src/share/classes/javax/swing/text/PlainDocument.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PlainDocument.java Thu Oct 03 19:18:54 2013 +0100
@@ -103,7 +103,7 @@
* <A HREF="http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
* in Swing</A> for more information.
*
- * @param offs the starting offset >= 0
+ * @param offs the starting offset >= 0
* @param str the string to insert; does nothing with null/empty strings
* @param a the attributes for the inserted content
* @exception BadLocationException the given insert position is not a valid
--- a/jdk/src/share/classes/javax/swing/text/PlainView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PlainView.java Thu Oct 03 19:18:54 2013 +0100
@@ -66,10 +66,10 @@
* <code>drawSelectedText</code> so that the way selected and
* unselected text are rendered can be customized.
*
- * @param lineIndex the line to draw >= 0
+ * @param lineIndex the line to draw >= 0
* @param g the <code>Graphics</code> context
- * @param x the starting X position >= 0
- * @param y the starting Y position >= 0
+ * @param x the starting X position >= 0
+ * @param y the starting Y position >= 0
* @see #drawUnselectedText
* @see #drawSelectedText
*/
@@ -138,11 +138,11 @@
* text. Uses the foreground or disabled color to render the text.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the beginning position in the model >= 0
- * @param p1 the ending position in the model >= 0
- * @return the X location of the end of the range >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the beginning position in the model >= 0
+ * @param p1 the ending position in the model >= 0
+ * @return the X location of the end of the range >= 0
* @exception BadLocationException if the range is invalid
*/
protected int drawUnselectedText(Graphics g, int x, int y,
@@ -163,10 +163,10 @@
* the selected background.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the beginning position in the model >= 0
- * @param p1 the ending position in the model >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the beginning position in the model >= 0
+ * @param p1 the ending position in the model >= 0
* @return the location of the end of the range
* @exception BadLocationException if the range is invalid
*/
@@ -218,7 +218,7 @@
* axis.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >= 0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
@@ -332,7 +332,7 @@
* Provides a mapping from the document model coordinate space
* to the coordinate space of the view mapped to it.
*
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @return the bounding box of the given position
* @exception BadLocationException if the given position does not
@@ -369,11 +369,11 @@
* Provides a mapping from the view coordinate space to the logical
* coordinate space of the model.
*
- * @param fx the X coordinate >= 0
- * @param fy the Y coordinate >= 0
+ * @param fx the X coordinate >= 0
+ * @param fy the Y coordinate >= 0
* @param a the allocated region to render into
* @return the location within the model that best represents the
- * given point in the view >= 0
+ * given point in the view >= 0
* @see View#viewToModel
*/
public int viewToModel(float fx, float fy, Shape a, Position.Bias[] bias) {
@@ -482,8 +482,8 @@
* layout of the view along the given axis, if it
* has any layout duties.
*
- * @param width the width >= 0
- * @param height the height >= 0
+ * @param width the width >= 0
+ * @param height the height >= 0
*/
public void setSize(float width, float height) {
super.setSize(width, height);
@@ -497,10 +497,10 @@
* This implementation does not support things like centering so it
* ignores the tabOffset argument.
*
- * @param x the current position >= 0
+ * @param x the current position >= 0
* @param tabOffset the position within the text stream
- * that the tab occurred at >= 0.
- * @return the tab stop, measured in points >= 0
+ * that the tab occurred at >= 0.
+ * @return the tab stop, measured in points >= 0
*/
public float nextTabStop(float x, int tabOffset) {
if (tabSize == 0) {
--- a/jdk/src/share/classes/javax/swing/text/Position.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Position.java Thu Oct 03 19:18:54 2013 +0100
@@ -51,7 +51,7 @@
/**
* Fetches the current offset within the document.
*
- * @return the offset >= 0
+ * @return the offset >= 0
*/
public int getOffset();
--- a/jdk/src/share/classes/javax/swing/text/StringContent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StringContent.java Thu Oct 03 19:18:54 2013 +0100
@@ -61,7 +61,7 @@
/**
* Creates a new StringContent object, with the initial
- * size specified. If the length is < 1, a size of 1 is used.
+ * size specified. If the length is < 1, a size of 1 is used.
*
* @param initialLength the initial size
*/
@@ -77,7 +77,7 @@
/**
* Returns the length of the content.
*
- * @return the length >= 1
+ * @return the length >= 1
* @see AbstractDocument.Content#length
*/
public int length() {
@@ -87,7 +87,7 @@
/**
* Inserts a string into the content.
*
- * @param where the starting position >= 0 && < length()
+ * @param where the starting position >= 0 && < length()
* @param str the non-null string to insert
* @return an UndoableEdit object for undoing
* @exception BadLocationException if the specified position is invalid
@@ -106,10 +106,10 @@
}
/**
- * Removes part of the content. where + nitems must be < length().
+ * Removes part of the content. where + nitems must be < length().
*
- * @param where the starting position >= 0
- * @param nitems the number of characters to remove >= 0
+ * @param where the starting position >= 0
+ * @param nitems the number of characters to remove >= 0
* @return an UndoableEdit object for undoing
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#remove
@@ -129,10 +129,10 @@
}
/**
- * Retrieves a portion of the content. where + len must be <= length().
+ * Retrieves a portion of the content. where + len must be <= length().
*
- * @param where the starting position >= 0
- * @param len the length to retrieve >= 0
+ * @param where the starting position >= 0
+ * @param len the length to retrieve >= 0
* @return a string representing the content; may be empty
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#getString
@@ -145,10 +145,10 @@
}
/**
- * Retrieves a portion of the content. where + len must be <= length()
+ * Retrieves a portion of the content. where + len must be <= length()
*
- * @param where the starting position >= 0
- * @param len the number of characters to retrieve >= 0
+ * @param where the starting position >= 0
+ * @param len the number of characters to retrieve >= 0
* @param chars the Segment object to return the characters in
* @exception BadLocationException if the specified position is invalid
* @see AbstractDocument.Content#getChars
@@ -166,7 +166,7 @@
* Creates a position within the content that will
* track change as the content is mutated.
*
- * @param offset the offset to create a position for >= 0
+ * @param offset the offset to create a position for >= 0
* @return the position
* @exception BadLocationException if the specified position is invalid
*/
@@ -266,8 +266,8 @@
* to subclasses.
*
* @param v the Vector to use, with a new one created on null
- * @param offset the starting offset >= 0
- * @param length the length >= 0
+ * @param offset the starting offset >= 0
+ * @param length the length >= 0
* @return the set of instances
*/
protected Vector getPositionsInRange(Vector v, int offset,
--- a/jdk/src/share/classes/javax/swing/text/StyleContext.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyleContext.java Thu Oct 03 19:18:54 2013 +0100
@@ -241,7 +241,7 @@
*
* @param family the font family (such as "Monospaced")
* @param style the style of the font (such as Font.PLAIN)
- * @param size the point size >= 1
+ * @param size the point size >= 1
* @return the new font
*/
public Font getFont(String family, int style, int size) {
@@ -1387,7 +1387,7 @@
/**
* Gets the number of attributes that are defined.
*
- * @return the number of attributes >= 0
+ * @return the number of attributes >= 0
* @see AttributeSet#getAttributeCount
*/
public int getAttributeCount() {
--- a/jdk/src/share/classes/javax/swing/text/StyledDocument.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyledDocument.java Thu Oct 03 19:18:54 2013 +0100
@@ -76,8 +76,8 @@
* giving an Attributes argument that has no attributes defined
* and setting replace to true.
*
- * @param offset the start of the change >= 0
- * @param length the length of the change >= 0
+ * @param offset the start of the change >= 0
+ * @param length the length of the change >= 0
* @param s the non-null attributes to change to. Any attributes
* defined will be applied to the text for the given range.
* @param replace indicates whether or not the previous
@@ -91,8 +91,8 @@
/**
* Sets paragraph attributes.
*
- * @param offset the start of the change >= 0
- * @param length the length of the change >= 0
+ * @param offset the start of the change >= 0
+ * @param length the length of the change >= 0
* @param s the non-null attributes to change to. Any attributes
* defined will be applied to the text for the given range.
* @param replace indicates whether or not the previous
@@ -111,7 +111,7 @@
* in turn may resolve through some hierarchy completely
* independent of the element hierarchy in the document.
*
- * @param pos the starting position >= 0
+ * @param pos the starting position >= 0
* @param s the style to set
*/
public void setLogicalStyle(int pos, Style s);
@@ -119,7 +119,7 @@
/**
* Gets a logical style for a given position in a paragraph.
*
- * @param p the position >= 0
+ * @param p the position >= 0
* @return the style
*/
public Style getLogicalStyle(int p);
@@ -128,7 +128,7 @@
* Gets the element that represents the paragraph that
* encloses the given offset within the document.
*
- * @param pos the offset >= 0
+ * @param pos the offset >= 0
* @return the element
*/
public Element getParagraphElement(int pos);
@@ -137,7 +137,7 @@
* Gets the element that represents the character that
* is at the given offset within the document.
*
- * @param pos the offset >= 0
+ * @param pos the offset >= 0
* @return the element
*/
public Element getCharacterElement(int pos);
--- a/jdk/src/share/classes/javax/swing/text/StyledEditorKit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyledEditorKit.java Thu Oct 03 19:18:54 2013 +0100
@@ -689,7 +689,7 @@
* Creates a new AlignmentAction.
*
* @param nm the action name
- * @param a the alignment >= 0
+ * @param a the alignment >= 0
*/
public AlignmentAction(String nm, int a) {
super(nm);
--- a/jdk/src/share/classes/javax/swing/text/TabExpander.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TabExpander.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,10 +37,10 @@
* Returns the next tab stop position given a reference
* position. Values are expressed in points.
*
- * @param x the position in points >= 0
+ * @param x the position in points >= 0
* @param tabOffset the position within the text stream
- * that the tab occurred at >= 0.
- * @return the next tab stop >= 0
+ * that the tab occurred at >= 0.
+ * @return the next tab stop >= 0
*/
float nextTabStop(float x, int tabOffset);
--- a/jdk/src/share/classes/javax/swing/text/TabableView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TabableView.java Thu Oct 03 19:18:54 2013 +0100
@@ -46,9 +46,9 @@
* along the axis of tab expansion.
*
* @param x the position the view would be located
- * at for the purpose of tab expansion >= 0.
+ * at for the purpose of tab expansion >= 0.
* @param e how to expand the tabs when encountered.
- * @return the desired span >= 0
+ * @return the desired span >= 0
*/
float getTabbedSpan(float x, TabExpander e);
@@ -62,9 +62,9 @@
* an assumption that the range given does not
* contain tabs.
*
- * @param p0 the starting location in the text document >= 0
- * @param p1 the ending location in the text document >= p0
- * @return the span >= 0
+ * @param p0 the starting location in the text document >= 0
+ * @param p1 the ending location in the text document >= p0
+ * @return the span >= 0
*/
float getPartialSpan(int p0, int p1);
}
--- a/jdk/src/share/classes/javax/swing/text/TableView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TableView.java Thu Oct 03 19:18:54 2013 +0100
@@ -542,7 +542,7 @@
* view the children do not necessarily have a one to one mapping
* with the child elements.
*
- * @param pos the search position >= 0
+ * @param pos the search position >= 0
* @param a the allocation to the table on entry, and the
* allocation of the view containing the position on exit
* @return the view representing the given position, or
@@ -755,7 +755,7 @@
* view the children do not necessarily have a one to one mapping
* with the child elements.
*
- * @param pos the search position >= 0
+ * @param pos the search position >= 0
* @param a the allocation to the table on entry, and the
* allocation of the view containing the position on exit
* @return the view representing the given position, or
@@ -833,8 +833,8 @@
/**
* Sets the grid location.
*
- * @param row the row >= 0
- * @param col the column >= 0
+ * @param row the row >= 0
+ * @param col the column >= 0
*/
public void setGridLocation(int row, int col) {
this.row = row;
@@ -871,8 +871,8 @@
/**
* Sets the grid location.
*
- * @param row the row >= 0
- * @param col the column >= 0
+ * @param row the row >= 0
+ * @param col the column >= 0
*/
public void setGridLocation(int row, int col);
--- a/jdk/src/share/classes/javax/swing/text/Utilities.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Utilities.java Thu Oct 03 19:18:54 2013 +0100
@@ -71,12 +71,12 @@
* where ints are used and 72dpi is assumed.
*
* @param s the source of the text
- * @param x the X origin >= 0
- * @param y the Y origin >= 0
+ * @param x the X origin >= 0
+ * @param y the Y origin >= 0
* @param g the graphics context
* @param e how to expand the tabs. If this value is null,
* tabs will be expanded as a space character.
- * @param startOffset starting offset of the text in the document >= 0
+ * @param startOffset starting offset of the text in the document >= 0
* @return the X location at the end of the rendered text
*/
public static final int drawTabbedText(Segment s, int x, int y, Graphics g,
@@ -92,12 +92,12 @@
*
* @param view View requesting rendering, may be null.
* @param s the source of the text
- * @param x the X origin >= 0
- * @param y the Y origin >= 0
+ * @param x the X origin >= 0
+ * @param y the Y origin >= 0
* @param g the graphics context
* @param e how to expand the tabs. If this value is null,
* tabs will be expanded as a space character.
- * @param startOffset starting offset of the text in the document >= 0
+ * @param startOffset starting offset of the text in the document >= 0
* @return the X location at the end of the rendered text
*/
static final int drawTabbedText(View view,
@@ -197,10 +197,10 @@
*
* @param s the source of the text
* @param metrics the font metrics to use for the calculation
- * @param x the X origin >= 0
+ * @param x the X origin >= 0
* @param e how to expand the tabs. If this value is null,
* tabs will be expanded as a space character.
- * @param startOffset starting offset of the text in the document >= 0
+ * @param startOffset starting offset of the text in the document >= 0
* @return the width of the text
*/
public static final int getTabbedTextWidth(Segment s, FontMetrics metrics, int x,
@@ -289,13 +289,13 @@
* @param s the source of the text
* @param metrics the font metrics to use for the calculation
* @param x0 the starting view location representing the start
- * of the given text >= 0.
+ * of the given text >= 0.
* @param x the target view location to translate to an
- * offset into the text >= 0.
+ * offset into the text >= 0.
* @param e how to expand the tabs. If this value is null,
* tabs will be expanded as a space character.
- * @param startOffset starting offset of the text in the document >= 0
- * @return the offset into the text >= 0
+ * @param startOffset starting offset of the text in the document >= 0
+ * @return the offset into the text >= 0
*/
public static final int getTabbedTextOffset(Segment s, FontMetrics metrics,
int x0, int x, TabExpander e,
@@ -488,8 +488,8 @@
* a value of -1 will be returned.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the position >= 0 if the request can be computed, otherwise
+ * @param offs the offset in the document >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
* a value of -1 will be returned.
* @exception BadLocationException if the offset is out of range
*/
@@ -518,8 +518,8 @@
* a value of -1 will be returned.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the position >= 0 if the request can be computed, otherwise
+ * @param offs the offset in the document >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
* a value of -1 will be returned.
* @exception BadLocationException if the offset is out of range
*/
@@ -549,9 +549,9 @@
* a value of -1 will be returned.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @param x the X coordinate >= 0
- * @return the position >= 0 if the request can be computed, otherwise
+ * @param offs the offset in the document >= 0
+ * @param x the X coordinate >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
* a value of -1 will be returned.
* @exception BadLocationException if the offset is out of range
*/
@@ -586,9 +586,9 @@
* a value of -1 will be returned.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @param x the X coordinate >= 0
- * @return the position >= 0 if the request can be computed, otherwise
+ * @param offs the offset in the document >= 0
+ * @param x the X coordinate >= 0
+ * @return the position >= 0 if the request can be computed, otherwise
* a value of -1 will be returned.
* @exception BadLocationException if the offset is out of range
*/
@@ -622,8 +622,8 @@
* Uses BreakIterator.getWordInstance() to actually get the words.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the location in the model of the word start >= 0
+ * @param offs the offset in the document >= 0
+ * @return the location in the model of the word start >= 0
* @exception BadLocationException if the offset is out of range
*/
public static final int getWordStart(JTextComponent c, int offs) throws BadLocationException {
@@ -656,8 +656,8 @@
* Uses BreakIterator.getWordInstance() to actually get the words.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the location in the model of the word end >= 0
+ * @param offs the offset in the document >= 0
+ * @return the location in the model of the word end >= 0
* @exception BadLocationException if the offset is out of range
*/
public static final int getWordEnd(JTextComponent c, int offs) throws BadLocationException {
@@ -689,8 +689,8 @@
* Uses BreakIterator.getWordInstance() to actually get the words.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the location in the model of the word start >= 0
+ * @param offs the offset in the document >= 0
+ * @return the location in the model of the word start >= 0
* @exception BadLocationException if the offset is out of range
*/
public static final int getNextWord(JTextComponent c, int offs) throws BadLocationException {
@@ -767,8 +767,8 @@
* Uses BreakIterator.getWordInstance() to actually get the words.
*
* @param c the editor
- * @param offs the offset in the document >= 0
- * @return the location in the model of the word start >= 0
+ * @param offs the offset in the document >= 0
+ * @return the location in the model of the word start >= 0
* @exception BadLocationException if the offset is out of range
*/
public static final int getPreviousWord(JTextComponent c, int offs) throws BadLocationException {
@@ -841,7 +841,7 @@
* Determines the element to use for a paragraph/line.
*
* @param c the editor
- * @param offs the starting offset in the document >= 0
+ * @param offs the starting offset in the document >= 0
* @return the element
*/
public static final Element getParagraphElement(JTextComponent c, int offs) {
@@ -972,7 +972,7 @@
* must then override the <code>flipEastAndWestAtEnds</code> method.
*
* @param v View to query
- * @param pos the position to convert >= 0
+ * @param pos the position to convert >= 0
* @param a the allocated region to render into
* @param direction the direction from the current position that can
* be thought of as the arrow keys typically found on a keyboard;
--- a/jdk/src/share/classes/javax/swing/text/View.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/View.java Thu Oct 03 19:18:54 2013 +0100
@@ -72,12 +72,12 @@
alt="The above text describes this graphic.">
<p>The minimum set of methods for layout are:
<ul>
- <li><a href="#getMinimumSpan(int)">getMinimumSpan</a>
- <li><a href="#getPreferredSpan(int)">getPreferredSpan</a>
- <li><a href="#getMaximumSpan(int)">getMaximumSpan</a>
- <li><a href="#getAlignment(int)">getAlignment</a>
- <li><a href="#preferenceChanged(javax.swing.text.View, boolean, boolean)">preferenceChanged</a>
- <li><a href="#setSize(float, float)">setSize</a>
+ <li>{@link #getMinimumSpan(int) getMinimumSpan}
+ <li>{@link #getPreferredSpan(int) getPreferredSpan}
+ <li>{@link #getMaximumSpan(int) getMaximumSpan}
+ <li>{@link #getAlignment(int) getAlignment}
+ <li>{@link #preferenceChanged(javax.swing.text.View, boolean, boolean) preferenceChanged}
+ <li>{@link #setSize(float, float) setSize}
</ul>
<p>The <code>setSize</code> method should be prepared to be called a number of times
@@ -142,7 +142,7 @@
</ul>
<p>The methods for rendering are:
<ul>
- <li><a href="#paint(java.awt.Graphics, java.awt.Shape)">paint</a>
+ <li>{@link #paint(java.awt.Graphics, java.awt.Shape) paint}
</ul>
<p>
@@ -153,12 +153,12 @@
to perform translation to properly locate spatial representation of the model.
The methods for doing this are:
<ul>
- <li><a href="#modelToView(int, javax.swing.text.Position.Bias, int, javax.swing.text.Position.Bias, java.awt.Shape)">modelToView</a>
- <li><a href="#viewToModel(float, float, java.awt.Shape, javax.swing.text.Position.Bias[])">viewToModel</a>
- <li><a href="#getDocument()">getDocument</a>
- <li><a href="#getElement()">getElement</a>
- <li><a href="#getStartOffset()">getStartOffset</a>
- <li><a href="#getEndOffset()">getEndOffset</a>
+ <li>{@link #modelToView(int, javax.swing.text.Position.Bias, int, javax.swing.text.Position.Bias, java.awt.Shape) modelToView}
+ <li>{@link #viewToModel(float, float, java.awt.Shape, javax.swing.text.Position.Bias[]) viewToModel}
+ <li>{@link #getDocument() getDocument}
+ <li>{@link #getElement() getElement}
+ <li>{@link #getStartOffset() getStartOffset}
+ <li>{@link #getEndOffset() getEndOffset}
</ul>
<p>The layout must be valid prior to attempting to make the translation.
The translation is not valid, and must not be attempted while changes
@@ -1137,32 +1137,9 @@
*/
protected void forwardUpdate(DocumentEvent.ElementChange ec,
DocumentEvent e, Shape a, ViewFactory f) {
- Element elem = getElement();
- int pos = e.getOffset();
- int index0 = getViewIndex(pos, Position.Bias.Forward);
- if (index0 == -1 && e.getType() == DocumentEvent.EventType.REMOVE &&
- pos >= getEndOffset()) {
- // Event beyond our offsets. We may have represented this, that is
- // the remove may have removed one of our child Elements that
- // represented this, so, we should foward to last element.
- index0 = getViewCount() - 1;
- }
- int index1 = index0;
- View v = (index0 >= 0) ? getView(index0) : null;
- if (v != null) {
- if ((v.getStartOffset() == pos) && (pos > 0)) {
- // If v is at a boundary, forward the event to the previous
- // view too.
- index0 = Math.max(index0 - 1, 0);
- }
- }
- if (e.getType() != DocumentEvent.EventType.REMOVE) {
- index1 = getViewIndex(pos + e.getLength(), Position.Bias.Forward);
- if (index1 < 0) {
- index1 = getViewCount() - 1;
- }
- }
- int hole0 = index1 + 1;
+ calculateUpdateIndexes(e);
+
+ int hole0 = lastUpdateIndex + 1;
int hole1 = hole0;
Element[] addedElems = (ec != null) ? ec.getChildrenAdded() : null;
if ((addedElems != null) && (addedElems.length > 0)) {
@@ -1173,11 +1150,9 @@
// forward to any view not in the forwarding hole
// formed by added elements (i.e. they will be updated
// by initialization.
- index0 = Math.max(index0, 0);
- index1 = Math.max((getViewCount() - 1), 0);
- for (int i = index0; i <= index1; i++) {
+ for (int i = firstUpdateIndex; i <= lastUpdateIndex; i++) {
if (! ((i >= hole0) && (i <= hole1))) {
- v = getView(i);
+ View v = getView(i);
if (v != null) {
Shape childAlloc = getChildAllocation(i, a);
forwardUpdateToView(v, e, childAlloc, f);
@@ -1187,6 +1162,39 @@
}
/**
+ * Calculates the first and the last indexes of the child views
+ * that need to be notified of the change to the model.
+ * @param e the change information from the associated document
+ */
+ void calculateUpdateIndexes(DocumentEvent e) {
+ int pos = e.getOffset();
+ firstUpdateIndex = getViewIndex(pos, Position.Bias.Forward);
+ if (firstUpdateIndex == -1 && e.getType() == DocumentEvent.EventType.REMOVE &&
+ pos >= getEndOffset()) {
+ // Event beyond our offsets. We may have represented this, that is
+ // the remove may have removed one of our child Elements that
+ // represented this, so, we should forward to last element.
+ firstUpdateIndex = getViewCount() - 1;
+ }
+ lastUpdateIndex = firstUpdateIndex;
+ View v = (firstUpdateIndex >= 0) ? getView(firstUpdateIndex) : null;
+ if (v != null) {
+ if ((v.getStartOffset() == pos) && (pos > 0)) {
+ // If v is at a boundary, forward the event to the previous
+ // view too.
+ firstUpdateIndex = Math.max(firstUpdateIndex - 1, 0);
+ }
+ }
+ if (e.getType() != DocumentEvent.EventType.REMOVE) {
+ lastUpdateIndex = getViewIndex(pos + e.getLength(), Position.Bias.Forward);
+ if (lastUpdateIndex < 0) {
+ lastUpdateIndex = getViewCount() - 1;
+ }
+ }
+ firstUpdateIndex = Math.max(firstUpdateIndex, 0);
+ }
+
+ /**
* Forwards the <code>DocumentEvent</code> to the give child view. This
* simply messages the view with a call to <code>insertUpdate</code>,
* <code>removeUpdate</code>, or <code>changedUpdate</code> depending
@@ -1345,4 +1353,14 @@
private View parent;
private Element elem;
+ /**
+ * The index of the first child view to be notified.
+ */
+ int firstUpdateIndex;
+
+ /**
+ * The index of the last child view to be notified.
+ */
+ int lastUpdateIndex;
+
};
--- a/jdk/src/share/classes/javax/swing/text/WrappedPlainView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/WrappedPlainView.java Thu Oct 03 19:18:54 2013 +0100
@@ -93,11 +93,11 @@
* <code>drawSelectedText</code> so that the way selected and
* unselected text are rendered can be customized.
*
- * @param p0 the starting document location to use >= 0
- * @param p1 the ending document location to use >= p1
+ * @param p0 the starting document location to use >= 0
+ * @param p1 the ending document location to use >= p1
* @param g the graphics context
- * @param x the starting X position >= 0
- * @param y the starting Y position >= 0
+ * @param x the starting X position >= 0
+ * @param y the starting Y position >= 0
* @see #drawUnselectedText
* @see #drawSelectedText
*/
@@ -165,11 +165,11 @@
* text.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the beginning position in the model >= 0
- * @param p1 the ending position in the model >= p0
- * @return the X location of the end of the range >= 0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the beginning position in the model >= 0
+ * @param p1 the ending position in the model >= p0
+ * @return the X location of the end of the range >= 0
* @exception BadLocationException if the range is invalid
*/
protected int drawUnselectedText(Graphics g, int x, int y,
@@ -190,10 +190,10 @@
* the selected background.
*
* @param g the graphics context
- * @param x the starting X coordinate >= 0
- * @param y the starting Y coordinate >= 0
- * @param p0 the beginning position in the model >= 0
- * @param p1 the ending position in the model >= p0
+ * @param x the starting X coordinate >= 0
+ * @param y the starting Y coordinate >= 0
+ * @param p0 the beginning position in the model >= 0
+ * @param p1 the ending position in the model >= p0
* @return the location of the end of the range.
* @exception BadLocationException if the range is invalid
*/
@@ -326,10 +326,10 @@
* This implementation does not support things like centering so it
* ignores the tabOffset argument.
*
- * @param x the current position >= 0
+ * @param x the current position >= 0
* @param tabOffset the position within the text stream
- * that the tab occurred at >= 0.
- * @return the tab stop, measured in points >= 0
+ * that the tab occurred at >= 0.
+ * @return the tab stop, measured in points >= 0
*/
public float nextTabStop(float x, int tabOffset) {
if (tabSize == 0)
@@ -374,8 +374,8 @@
* layout of the view along the given axis, if it
* has any layout duties.
*
- * @param width the width >= 0
- * @param height the height >= 0
+ * @param width the width >= 0
+ * @param height the height >= 0
*/
public void setSize(float width, float height) {
updateMetrics();
--- a/jdk/src/share/classes/javax/swing/text/ZoneView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ZoneView.java Thu Oct 03 19:18:54 2013 +0100
@@ -130,7 +130,7 @@
*
* @param mzl the desired maximum number of zones
* to be actively loaded, must be greater than 0
- * @exception IllegalArgumentException if <code>mzl</code> is < 1
+ * @exception IllegalArgumentException if <code>mzl</code> is < 1
*/
public void setMaxZonesLoaded(int mzl) {
if (mzl < 1) {
@@ -198,11 +198,11 @@
* implementation for a zone by changing this method.
*
* @param p0 the start of the desired zone. This should
- * be >= getStartOffset() and < getEndOffset(). This
- * value should also be < p1.
+ * be >= getStartOffset() and < getEndOffset(). This
+ * value should also be < p1.
* @param p1 the end of the desired zone. This should
- * be > getStartOffset() and <= getEndOffset(). This
- * value should also be > p0.
+ * be > getStartOffset() and <= getEndOffset(). This
+ * value should also be > p0.
*/
protected View createZone(int p0, int p1) {
Document doc = getDocument();
@@ -242,7 +242,7 @@
* Returns the child view index representing the given position in
* the model.
*
- * @param pos the position >= 0
+ * @param pos the position >= 0
* @return index of the view representing the given position, or
* -1 if no view represents that position
*/
--- a/jdk/src/share/classes/javax/swing/text/html/BlockView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/BlockView.java Thu Oct 03 19:18:54 2013 +0100
@@ -352,7 +352,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
@@ -368,7 +368,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
@@ -384,7 +384,7 @@
*
* @param axis may be either <code>View.X_AXIS</code>
* or <code>View.Y_AXIS</code>
- * @return the span the view would like to be rendered into >= 0;
+ * @return the span the view would like to be rendered into >= 0;
* typically the view is told to render into the span
* that is returned, although there is no guarantee;
* the parent may choose to resize or break the view
--- a/jdk/src/share/classes/javax/swing/text/html/CSS.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/CSS.java Thu Oct 03 19:18:54 2013 +0100
@@ -117,7 +117,7 @@
* </ul>
* <p><b>Note: for the time being we do not fully support relative units,
* unless noted, so that
- * p { margin-top: 10% } will be treated as if no margin-top was specified.
+ * p { margin-top: 10% } will be treated as if no margin-top was specified.</b>
*
* @author Timothy Prinzing
* @author Scott Violet
--- a/jdk/src/share/classes/javax/swing/text/html/FormView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/FormView.java Thu Oct 03 19:18:54 2013 +0100
@@ -380,7 +380,7 @@
* axis of interest.
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
- * @return the span the view would like to be rendered into >= 0.
+ * @return the span the view would like to be rendered into >= 0.
* Typically the view is told to render into the span
* that is returned, although there is no guarantee.
* The parent may choose to resize or break the view.
--- a/jdk/src/share/classes/javax/swing/text/html/HTMLDocument.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/HTMLDocument.java Thu Oct 03 19:18:54 2013 +0100
@@ -107,21 +107,21 @@
* <p>With the following HTML content:</p>
*
* <pre>
- * <html>
- * <head>
- * <title>An example HTMLDocument</title>
- * <style type="text/css">
+ * <html>
+ * <head>
+ * <title>An example HTMLDocument</title>
+ * <style type="text/css">
* div { background-color: silver; }
* ul { color: red; }
- * </style>
- * </head>
- * <body>
- * <div id="BOX">
- * <p>Paragraph 1</p>
- * <p>Paragraph 2</p>
- * </div>
- * </body>
- * </html>
+ * </style>
+ * </head>
+ * <body>
+ * <div id="BOX">
+ * <p>Paragraph 1</p>
+ * <p>Paragraph 2</p>
+ * </div>
+ * </body>
+ * </html>
* </pre>
*
* <p>All the methods for modifying an HTML document require an {@link
@@ -149,10 +149,10 @@
* of any non-leaf element by using the methods
* <code>insertAfterStart</code> and <code>insertBeforeEnd</code>.
* For example, if <code>e</code> is the <code>DIV</code> element,
- * <code>d.insertAfterStart(e, "<ul><li>List
- * Item</li></ul>")</code> inserts the list before the first
- * paragraph, and <code>d.insertBeforeEnd(e, "<ul><li>List
- * Item</li></ul>")</code> inserts the list after the last
+ * <code>d.insertAfterStart(e, "<ul><li>List
+ * Item</li></ul>")</code> inserts the list before the first
+ * paragraph, and <code>d.insertBeforeEnd(e, "<ul><li>List
+ * Item</li></ul>")</code> inserts the list after the last
* paragraph. The <code>DIV</code> block becomes the parent of the
* newly inserted elements.</p>
*
@@ -160,9 +160,9 @@
* using the methods <code>insertBeforeStart</code> and
* <code>insertAfterEnd</code>. For example, if <code>e</code> is the
* <code>DIV</code> element, <code>d.insertBeforeStart(e,
- * "<ul><li>List Item</li></ul>")</code> inserts the list
+ * "<ul><li>List Item</li></ul>")</code> inserts the list
* before the <code>DIV</code> element, and <code>d.insertAfterEnd(e,
- * "<ul><li>List Item</li></ul>")</code> inserts the list
+ * "<ul><li>List Item</li></ul>")</code> inserts the list
* after the <code>DIV</code> element. The newly inserted elements
* become siblings of the <code>DIV</code> element.</p>
*
@@ -171,10 +171,10 @@
* <p>Elements and all their descendants can be replaced by using the
* methods <code>setInnerHTML</code> and <code>setOuterHTML</code>.
* For example, if <code>e</code> is the <code>DIV</code> element,
- * <code>d.setInnerHTML(e, "<ul><li>List
- * Item</li></ul>")</code> replaces all children paragraphs with
- * the list, and <code>d.setOuterHTML(e, "<ul><li>List
- * Item</li></ul>")</code> replaces the <code>DIV</code> element
+ * <code>d.setInnerHTML(e, "<ul><li>List
+ * Item</li></ul>")</code> replaces all children paragraphs with
+ * the list, and <code>d.setOuterHTML(e, "<ul><li>List
+ * Item</li></ul>")</code> replaces the <code>DIV</code> element
* itself. In latter case the parent of the list is the
* <code>BODY</code> element.
*
@@ -184,6 +184,7 @@
* of various methods described above.</p>
*
* <table border=1 cellspacing=0>
+ * <caption></caption>
* <tr>
* <th>Example</th>
* <th><code>insertAfterStart</code></th>
@@ -985,25 +986,25 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
- * <p>Invoking <code>setInnerHTML(elem, "<ul><li>")</code>
+ * <p>Invoking <code>setInnerHTML(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* \
- * <font color="red"><ul></font>
+ * <font color="red"><ul></font>
* \
- * <font color="red"><li></font>
+ * <font color="red"><li></font>
* </pre>
*
* <p>Parameter <code>elem</code> must not be a leaf element,
@@ -1066,23 +1067,23 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
- * <p>Invoking <code>setOuterHTML(elem, "<ul><li>")</code>
+ * <p>Invoking <code>setOuterHTML(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <font color="red"><ul></font>
+ * <font color="red"><ul></font>
* \
- * <font color="red"><li></font>
+ * <font color="red"><li></font>
* </pre>
*
* <p>If either <code>elem</code> or <code>htmlText</code>
@@ -1136,25 +1137,25 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
* <p>Invoking <code>insertAfterStart(elem,
- * "<ul><li>")</code> results in the following structure
+ * "<ul><li>")</code> results in the following structure
* (new elements are <font color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / | \
- * <font color="red"><ul></font> <p> <p>
+ * <font color="red"><ul></font> <p> <p>
* /
- * <font color="red"><li></font>
+ * <font color="red"><li></font>
* </pre>
*
* <p>Unlike the <code>insertBeforeStart</code> method, new
@@ -1206,25 +1207,25 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
- * <p>Invoking <code>insertBeforeEnd(elem, "<ul><li>")</code>
+ * <p>Invoking <code>insertBeforeEnd(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / | \
- * <p> <p> <font color="red"><ul></font>
+ * <p> <p> <font color="red"><ul></font>
* \
- * <font color="red"><li></font>
+ * <font color="red"><li></font>
* </pre>
*
* <p>Unlike the <code>insertAfterEnd</code> method, new elements
@@ -1273,23 +1274,23 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
* <p>Invoking <code>insertBeforeStart(elem,
- * "<ul><li>")</code> results in the following structure
+ * "<ul><li>")</code> results in the following structure
* (new elements are <font color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* / \
- * <font color="red"><ul></font> <b><div></b>
+ * <font color="red"><ul></font> <b><div></b>
* / / \
- * <font color="red"><li></font> <p> <p>
+ * <font color="red"><li></font> <p> <p>
* </pre>
*
* <p>Unlike the <code>insertAfterStart</code> method, new
@@ -1331,23 +1332,23 @@
* parameter is <b>in bold</b>).</p>
*
* <pre>
- * <body>
+ * <body>
* |
- * <b><div></b>
+ * <b><div></b>
* / \
- * <p> <p>
+ * <p> <p>
* </pre>
*
- * <p>Invoking <code>insertAfterEnd(elem, "<ul><li>")</code>
+ * <p>Invoking <code>insertAfterEnd(elem, "<ul><li>")</code>
* results in the following structure (new elements are <font
* color="red">in red</font>).</p>
*
* <pre>
- * <body>
+ * <body>
* / \
- * <b><div></b> <font color="red"><ul></font>
+ * <b><div></b> <font color="red"><ul></font>
* / \ \
- * <p> <p> <font color="red"><li></font>
+ * <p> <p> <font color="red"><li></font>
* </pre>
*
* <p>Unlike the <code>insertBeforeEnd</code> method, new elements
@@ -2166,7 +2167,7 @@
* <tr><td><code>HTML.Tag.VAR</code> <td>CharacterAction
* </table>
* <p>
- * Once </html> is encountered, the Actions are no longer notified.
+ * Once </html> is encountered, the Actions are no longer notified.
*/
public class HTMLReader extends HTMLEditorKit.ParserCallback {
--- a/jdk/src/share/classes/javax/swing/text/html/HTMLEditorKit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/HTMLEditorKit.java Thu Oct 03 19:18:54 2013 +0100
@@ -55,7 +55,6 @@
* an effect upon the way that HTML is modeled. These
* have influenced its design in a substantial way.
* <dl>
- * <p>
* <dt>
* Support editing
* <dd>
--- a/jdk/src/share/classes/javax/swing/text/html/ImageView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/ImageView.java Thu Oct 03 19:18:54 2013 +0100
@@ -554,8 +554,8 @@
* Sets the size of the view. This should cause
* layout of the view if it has any layout duties.
*
- * @param width the width >= 0
- * @param height the height >= 0
+ * @param width the width >= 0
+ * @param height the height >= 0
*/
public void setSize(float width, float height) {
sync();
--- a/jdk/src/share/classes/javax/swing/text/html/InlineView.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/InlineView.java Thu Oct 03 19:18:54 2013 +0100
@@ -130,10 +130,10 @@
*
* @param axis may be either View.X_AXIS or View.Y_AXIS
* @param pos the potential location of the start of the
- * broken view >= 0. This may be useful for calculating tab
+ * broken view >= 0. This may be useful for calculating tab
* positions.
* @param len specifies the relative length from <em>pos</em>
- * where a potential break is desired >= 0.
+ * where a potential break is desired >= 0.
* @return the weight, which should be a value between
* ForcedBreakWeight and BadBreakWeight.
* @see LabelView
@@ -162,14 +162,14 @@
* @param axis may be either <code>View.X_AXIS</code> or
* <code>View.Y_AXIS</code>
* @param offset the location in the document model
- * that a broken fragment would occupy >= 0. This
+ * that a broken fragment would occupy >= 0. This
* would be the starting offset of the fragment
* returned
* @param pos the position along the axis that the
- * broken view would occupy >= 0. This may be useful for
+ * broken view would occupy >= 0. This may be useful for
* things like tab calculations
* @param len specifies the distance along the axis
- * where a potential break is desired >= 0
+ * where a potential break is desired >= 0
* @return the fragment of the view that represents the
* given span.
* @since 1.5
--- a/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java Thu Oct 03 19:18:54 2013 +0100
@@ -74,7 +74,7 @@
* is stored to translate the context of an element to a
* rule quickly. The following code fragment will display
* the named styles, and therefore the CSS rules contained.
- * <code><pre>
+ * <pre><code>
*
* import java.util.*;
* import javax.swing.text.*;
@@ -97,7 +97,7 @@
* }
* }
*
- * </pre></code>
+ * </code></pre>
* <p>
* The semantics for when a CSS style should overide visual attributes
* defined by an element are not well defined. For example, the html
--- a/jdk/src/share/classes/javax/swing/text/html/parser/ContentModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/ContentModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,7 +42,7 @@
*/
public final class ContentModel implements Serializable {
/**
- * Type. Either '*', '?', '+', ',', '|', '&'.
+ * Type. Either '*', '?', '+', ',', '|', '&'.
*/
public int type;
@@ -52,7 +52,7 @@
public Object content;
/**
- * The next content model (in a ',', '|' or '&' expression).
+ * The next content model (in a ',', '|' or '&' expression).
*/
public ContentModel next;
--- a/jdk/src/share/classes/javax/swing/text/html/parser/DocumentParser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/DocumentParser.java Thu Oct 03 19:18:54 2013 +0100
@@ -48,8 +48,8 @@
* <li><i>handleStartTag(head, ...)</i></li>
* <li><i>handleEndTag(head)</i></li>
* <li><i>handleStartTag(body, ...)</i></li>
- * <li>handleStartTag(p, ...)</i></li>
- * <li>handleText(...)</li>
+ * <li><i>handleStartTag(p, ...)</i></li>
+ * <li><i>handleText(...)</i></li>
* <li><i>handleEndTag(p)</i></li>
* <li><i>handleEndTag(body)</i></li>
* <li><i>handleEndTag(html)</i></li>
--- a/jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Thu Oct 03 19:18:54 2013 +0100
@@ -58,12 +58,12 @@
* space should be used here, but I am using &nbsp to force the space to
* be displayed):
* <p>
- * '<b>blah <i> <strike> foo' which can be treated as:
- * '<b>blah <i><strike>foo'
+ * '<b>blah <i> <strike> foo' which can be treated as:
+ * '<b>blah <i><strike>foo'
* <p>as well as:
- * '<p><a href="xx"> <em>Using</em></a></p>'
+ * '<p><a href="xx"> <em>Using</em></a></p>'
* which appears to be treated as:
- * '<p><a href="xx"><em>Using</em></a></p>'
+ * '<p><a href="xx"><em>Using</em></a></p>'
* <p>
* If <code>strict</code> is false, when a tag that breaks flow,
* (<code>TagElement.breaksFlows</code>) or trailing whitespace is
--- a/jdk/src/share/classes/javax/swing/tree/AbstractLayoutCache.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/AbstractLayoutCache.java Thu Oct 03 19:18:54 2013 +0100
@@ -60,7 +60,7 @@
protected boolean rootVisible;
/**
- * Height to use for each row. If this is <= 0 the renderer will be
+ * Height to use for each row. If this is <= 0 the renderer will be
* used to determine the height for each row.
*/
protected int rowHeight;
--- a/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellEditor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellEditor.java Thu Oct 03 19:18:54 2013 +0100
@@ -430,7 +430,7 @@
/**
* Returns true if <code>event</code> is <code>null</code>,
- * or it is a <code>MouseEvent</code> with a click count > 2
+ * or it is a <code>MouseEvent</code> with a click count > 2
* and <code>inHitRegion</code> returns true.
* @param event the event being studied
*/
@@ -448,7 +448,7 @@
/**
* Returns true if the passed in location is a valid mouse location
* to start editing from. This is implemented to return false if
- * <code>x</code> is <= the width of the icon and icon gap displayed
+ * <code>x</code> is <= the width of the icon and icon gap displayed
* by the renderer. In other words this returns true if the user
* clicks over the text part displayed by the renderer, and false
* otherwise.
--- a/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java Thu Oct 03 19:18:54 2013 +0100
@@ -60,8 +60,7 @@
* that have a value of type {@code UIResource} are refreshed from the
* defaults table. The following table lists the mapping between
* {@code DefaultTreeCellRenderer} property and defaults table key:
- * <table border="1" cellpadding="1" cellspacing="0"
- * valign="top" >
+ * <table border="1" cellpadding="1" cellspacing="0" summary="">
* <tr valign="top" align="left">
* <th bgcolor="#CCCCFF" align="left">Property:
* <th bgcolor="#CCCCFF" align="left">Key:
--- a/jdk/src/share/classes/javax/swing/tree/DefaultTreeModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -164,8 +164,8 @@
* Returns the child of <I>parent</I> at index <I>index</I> in the parent's
* child array. <I>parent</I> must be a node previously obtained from
* this data source. This should not return null if <i>index</i>
- * is a valid index for <i>parent</i> (that is <i>index</i> >= 0 &&
- * <i>index</i> < getChildCount(<i>parent</i>)).
+ * is a valid index for <i>parent</i> (that is <i>index</i> >= 0 &&
+ * <i>index</i> < getChildCount(<i>parent</i>)).
*
* @param parent a node in the tree, obtained from this data source
* @return the child of <I>parent</I> at index <I>index</I>
--- a/jdk/src/share/classes/javax/swing/tree/TreeCellRenderer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/TreeCellRenderer.java Thu Oct 03 19:18:54 2013 +0100
@@ -59,8 +59,8 @@
* <pre>
* JTree.DropLocation dropLocation = tree.getDropLocation();
* if (dropLocation != null
- * && dropLocation.getChildIndex() == -1
- * && tree.getRowForPath(dropLocation.getPath()) == row) {
+ * && dropLocation.getChildIndex() == -1
+ * && tree.getRowForPath(dropLocation.getPath()) == row) {
*
* // this row represents the current drop location
* // so render it specially, perhaps with a different color
--- a/jdk/src/share/classes/javax/swing/tree/TreeModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/TreeModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -76,8 +76,8 @@
* child array. <code>parent</code> must be a node previously obtained
* from this data source. This should not return <code>null</code>
* if <code>index</code>
- * is a valid index for <code>parent</code> (that is <code>index >= 0 &&
- * index < getChildCount(parent</code>)).
+ * is a valid index for <code>parent</code> (that is <code>index >= 0 &&
+ * index < getChildCount(parent</code>)).
*
* @param parent a node in the tree, obtained from this data source
* @return the child of <code>parent</code> at index <code>index</code>
--- a/jdk/src/share/classes/javax/swing/undo/UndoManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/undo/UndoManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -57,9 +57,9 @@
* and italicized are insignificant.
* <p>
* <a name="figure1"></a>
- * <table border=0>
+ * <table border=0 summary="">
* <tr><td>
- * <img src="doc-files/UndoManager-1.gif">
+ * <img src="doc-files/UndoManager-1.gif" alt="">
* <tr><td align=center>Figure 1
* </table>
* <p>
@@ -70,9 +70,9 @@
* figure.
* <p>
* <a name="figure2"></a>
- * <table border=0>
+ * <table border=0 summary="">
* <tr><td>
- * <img src="doc-files/UndoManager-2.gif">
+ * <img src="doc-files/UndoManager-2.gif" alt="">
* <tr><td align=center>Figure 2
* </table>
* <p>
@@ -82,9 +82,9 @@
* next edit to 0, as shown in the following figure.
* <p>
* <a name="figure3"></a>
- * <table border=0>
+ * <table border=0 summary="">
* <tr><td>
- * <img src="doc-files/UndoManager-3.gif">
+ * <img src="doc-files/UndoManager-3.gif" alt="">
* <tr><td align=center>Figure 3
* </table>
* <p>
@@ -108,9 +108,9 @@
* figure.
* <p>
* <a name="figure4"></a>
- * <table border=0>
+ * <table border=0 summary="">
* <tr><td>
- * <img src="doc-files/UndoManager-4.gif">
+ * <img src="doc-files/UndoManager-4.gif" alt="">
* <tr><td align=center>Figure 4
* </table>
* <p>
--- a/jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_de.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/applet/resources/MsgAppletViewer_de.java Thu Oct 03 19:18:54 2013 +0100
@@ -73,7 +73,7 @@
{"appletviewer.parse.warning.embed.requiresheight", "Warnung: F\u00FCr <embed>-Tag ist ein \"height\"-Attribut erforderlich."},
{"appletviewer.parse.warning.embed.requireswidth", "Warnung: F\u00FCr <embed>-Tag ist ein \"width\"-Attribut erforderlich."},
{"appletviewer.parse.warning.appnotLongersupported", "Warnung: <app>-Tag wird nicht mehr unterst\u00FCtzt. Verwenden Sie stattdessen <applet>:"},
- {"appletviewer.usage", "Verwendung: appletviewer <Optionen> url(s)\n\nwobei die <Optionen> Folgendes umfassen:\n -debug Applet Viewer im Java-Debugger starten\n -encoding <Codierung> Zeichencodierung f\u00FCr HTML-Dateien angeben\n -J <Laufzeitkennzeichen> Argument an den Java-Interpreter \u00FCbergeben\n\nDie Option \"-J\" ist nicht standardm\u00E4\u00DFig und kann ohne vorherige Ank\u00FCndigung ge\u00E4ndert werden."},
+ {"appletviewer.usage", "Verwendung: appletviewer <Optionen> url(s)\n\nwobei die <Optionen> Folgendes umfassen:\n -debug Applet Viewer im Java-Debugger starten\n -encoding <Codierung> Zeichencodierung f\u00FCr HTML-Dateien angeben\n -J<Laufzeitkennzeichen> Argument an den Java-Interpreter \u00FCbergeben\n\nDie Option \"-J\" ist nicht standardm\u00E4\u00DFig und kann ohne vorherige Ank\u00FCndigung ge\u00E4ndert werden."},
{"appletviewer.main.err.unsupportedopt", "Nicht unterst\u00FCtzte Option: {0}"},
{"appletviewer.main.err.unrecognizedarg", "Unbekanntes Argument: {0}"},
{"appletviewer.main.err.dupoption", "Doppelte Verwendung von Option: {0}"},
--- a/jdk/src/share/classes/sun/awt/AWTAccessor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,6 +39,7 @@
import java.security.AccessControlContext;
import java.io.File;
+import java.util.ResourceBundle;
import java.util.Vector;
/**
@@ -236,6 +237,11 @@
*/
AccessControlContext getAccessControlContext(Component comp);
+ /**
+ * Revalidates the component synchronously.
+ */
+ void revalidateSynchronously(Component comp);
+
}
/*
@@ -246,6 +252,14 @@
* Validates the container unconditionally.
*/
void validateUnconditionally(Container cont);
+
+ /**
+ *
+ * Access to the private version of findComponentAt method which has
+ * a controllable behavior. Setting 'ignoreEnabled' to 'false'
+ * bypasses disabled Components during the search.
+ */
+ Component findComponentAt(Container cont, int x, int y, boolean ignoreEnabled);
}
/*
@@ -700,6 +714,13 @@
}
/*
+ * An accessor for the Toolkit class
+ */
+ public interface ToolkitAccessor {
+ void setPlatformResources(ResourceBundle bundle);
+ }
+
+ /*
* Accessor instances are initialized in the static initializers of
* corresponding AWT classes by using setters defined below.
*/
@@ -726,6 +747,7 @@
private static TrayIconAccessor trayIconAccessor;
private static DefaultKeyboardFocusManagerAccessor defaultKeyboardFocusManagerAccessor;
private static SequencedEventAccessor sequencedEventAccessor;
+ private static ToolkitAccessor toolkitAccessor;
/*
* Set an accessor object for the java.awt.Component class.
@@ -1119,4 +1141,22 @@
// (so not a single instance of the event has been created).
return sequencedEventAccessor;
}
+
+ /*
+ * Set an accessor object for the java.awt.Toolkit class.
+ */
+ public static void setToolkitAccessor(ToolkitAccessor ta) {
+ toolkitAccessor = ta;
+ }
+
+ /*
+ * Get the accessor object for the java.awt.Toolkit class.
+ */
+ public static ToolkitAccessor getToolkitAccessor() {
+ if (toolkitAccessor == null) {
+ unsafe.ensureClassInitialized(Toolkit.class);
+ }
+
+ return toolkitAccessor;
+ }
}
--- a/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -134,7 +134,6 @@
*/
protected abstract void getCursorPos(Point p);
- protected abstract Component findComponentAt(Container con, int x, int y);
protected abstract Point getLocationOnScreen(Component com);
/**
@@ -190,9 +189,10 @@
if (p != null) {
queryPos = new Point();
getCursorPos(queryPos);
- Component c = findComponentAt((Container)comp,
- queryPos.x - p.x,
- queryPos.y - p.y);
+ Component c = AWTAccessor.getContainerAccessor().
+ findComponentAt((Container) comp,
+ queryPos.x - p.x, queryPos.y - p.y, false);
+
// If findComponentAt returns null, then something bad has
// happened. For example, the heavyweight Component may
// have been hidden or disabled by another thread. In that
--- a/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1765,7 +1765,14 @@
Reader reader = new InputStreamReader(is, unicode);
theObject = constructFlavoredObject(reader, flavor, Reader.class);
-
+ // Target data is a byte array
+ } else if (byteArrayClass.equals(flavor.getRepresentationClass())) {
+ if(isFlavorCharsetTextType(flavor) && isTextFormat(format)) {
+ theObject = translateBytesToString(inputStreamToByteArray(str), format, localeTransferable)
+ .getBytes(DataTransferer.getTextCharset(flavor));
+ } else {
+ theObject = inputStreamToByteArray(str);
+ }
// Target data is an RMI object
} else if (flavor.isRepresentationClassRemote()) {
--- a/jdk/src/share/classes/sun/launcher/LauncherHelper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/LauncherHelper.java Thu Oct 03 19:18:54 2013 +0100
@@ -51,6 +51,7 @@
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.text.Normalizer;
import java.util.ResourceBundle;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -493,7 +494,19 @@
try {
mainClass = scloader.loadClass(cn);
} catch (NoClassDefFoundError | ClassNotFoundException cnfe) {
- abort(cnfe, "java.launcher.cls.error1", cn);
+ if (System.getProperty("os.name", "").contains("OS X")
+ && Normalizer.isNormalized(cn, Normalizer.Form.NFD)) {
+ try {
+ // On Mac OS X since all names with diacretic symbols are given as decomposed it
+ // is possible that main class name comes incorrectly from the command line
+ // and we have to re-compose it
+ mainClass = scloader.loadClass(Normalizer.normalize(cn, Normalizer.Form.NFC));
+ } catch (NoClassDefFoundError | ClassNotFoundException cnfe1) {
+ abort(cnfe, "java.launcher.cls.error1", cn);
+ }
+ } else {
+ abort(cnfe, "java.launcher.cls.error1", cn);
+ }
}
// set to mainClass
appClass = mainClass;
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
java.launcher.ergo.message2 =\ weil die Ausf\u00FChrung auf einem Server-Class-Rechner erfolgt.\n
# Translators please note do not translate the options themselves
-java.launcher.opt.footer =\ -cp <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch {0} getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven zur Suche nach Klassendateien.\n -D<name>=<value>\n Legt eine Systemeigenschaft fest\n -verbose[:class|gc|jni]\n Aktiviert die Verbose-Ausgabe\n -version Druckt Produktversion und beendet das Programm\n -version:<value>\n Erfordert die angegebene Version zur Ausf\u00FChrung\n -showversion Druckt Produktversion und f\u00E4hrt fort\n -jre-restrict-search | -no-jre-restrict-search\n Bezieht private JREs des Benutzers in Versionssuche ein bzw. schlie\u00DFt sie aus\n -? -help Druckt diese Hilfemeldung\n -X Druckt Hilfe zu Nicht-Standardoptionen\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertionen mit angegebener Granularit\u00E4t\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertionen mit angegebener Granularit\u00E4t\n -esa | -enablesystemassertions\n Aktiviert Systemassertionen\n -dsa | -disablesystemassertions\n Deaktiviert Systemassertionen\n -agentlib:<libname>[=<options>]\n L\u00E4dt native Agent Library <libname>, z.B. -agentlib:hprof\n siehe auch -agentlib:jdwp=help und -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n L\u00E4dt native Agent Library nach vollem Pfadnamen\n -javaagent:<jarpath>[=<options>]\n L\u00E4dt Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt Startbildschirm mit angegebenem Bild\nWeitere Einzelheiten finden Sie unter http://www.oracle.com/technetwork/java/javase/documentation/index.html
+java.launcher.opt.footer =\ -cp <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n -classpath <Klassensuchpfad von Verzeichnissen und ZIP-/JAR-Dateien>\n Eine durch {0} getrennte Liste mit Verzeichnissen, JAR-Archiven\n und ZIP-Archiven zur Suche nach Klassendateien.\n -D<name>=<value>\n Legt eine Systemeigenschaft fest\n -verbose:[class|gc|jni]\n Aktiviert die Verbose-Ausgabe\n -version Druckt Produktversion und beendet das Programm\n -version:<value>\n Erfordert die angegebene Version zur Ausf\u00FChrung\n -showversion Druckt Produktversion und f\u00E4hrt fort\n -jre-restrict-search | -no-jre-restrict-search\n Bezieht private JREs des Benutzers in Versionssuche ein bzw. schlie\u00DFt sie aus\n -? -help Druckt diese Hilfemeldung\n -X Druckt Hilfe zu Nicht-Standardoptionen\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n Aktiviert Assertionen mit angegebener Granularit\u00E4t\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n Deaktiviert Assertionen mit angegebener Granularit\u00E4t\n -esa | -enablesystemassertions\n Aktiviert Systemassertionen\n -dsa | -disablesystemassertions\n Deaktiviert Systemassertionen\n -agentlib:<libname>[=<options>]\n L\u00E4dt native Agent Library <libname>, z.B. -agentlib:hprof\n siehe auch -agentlib:jdwp=help und -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n L\u00E4dt native Agent Library nach vollem Pfadnamen\n -javaagent:<jarpath>[=<options>]\n L\u00E4dt Java-Programmiersprachen-Agent, siehe java.lang.instrument\n -splash:<imagepath>\n Zeigt Startbildschirm mit angegebenem Bild\nWeitere Einzelheiten finden Sie unter http://www.oracle.com/technetwork/java/javase/documentation/index.html
# Translators please note do not translate the options themselves
java.launcher.X.usage=\ -Xmixed Ausf\u00FChrung im gemischten Modus (Standard)\n -Xint Nur Ausf\u00FChrung im interpretierten Modus\n -Xbootclasspath:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Legt Suchpfad f\u00FCr Bootstrap-Klassen und Ressourcen fest\n -Xbootclasspath/a:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n H\u00E4ngt an das Ende des Bootstrap Classpath an\n -Xbootclasspath/p:<Verzeichnisse und ZIP-/JAR-Dateien durch {0} getrennt>\n Stellt Bootstrap Classpath voran\n -Xdiag Zeigt zus\u00E4tzliche Diagnosemeldungen an\n -Xnoclassgc Deaktiviert Klassen-Garbage Collection\n -Xincgc Aktiviert inkrementelle Garbage Collection\n -Xloggc:<file> Loggt GC-Status in einer Datei mit Zeitstempeln\n -Xbatch Deaktiviert Hintergrundkompilierung\n -Xms<size> Legt anf\u00E4ngliche Java Heap-Gr\u00F6\u00DFe fest\n -Xmx<size> Legt maximale Java Heap-Gr\u00F6\u00DFe fest\n -Xss<size> Legt Java-Thread-Stackgr\u00F6\u00DFe fest\n -Xprof Gibt CPU-Profiling-Daten aus\n -Xfuture Aktiviert strengste Pr\u00FCfungen, antizipiert zuk\u00FCnftigen Standardwert\n -Xrs Reduziert Verwendung von BS-Signalen durch Java/VM (siehe Dokumentation)\n -Xcheck:jni F\u00FChrt zus\u00E4tzliche Pr\u00FCfungen f\u00FCr JNI-Funktionen durch\n -Xshare:off Kein Versuch, gemeinsame Klassendaten zu verwenden\n -Xshare:auto Verwendet gemeinsame Klassendaten, wenn m\u00F6glich (Standard)\n -Xshare:on Erfordert die Verwendung gemeinsamer Klassendaten, sonst verl\u00E4uft der Vorgang nicht erfolgreich.\n -XshowSettings Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:all\n Zeigt alle Einstellungen und f\u00E4hrt fort\n -XshowSettings:vm Zeigt alle VM-bezogenen Einstellungen und f\u00E4hrt fort\n -XshowSettings:properties\n Zeigt alle Eigenschaftseinstellungen und f\u00E4hrt fort\n -XshowSettings:locale\n Zeigt alle gebietsschemabezogenen Einstellungen und f\u00E4hrt fort\n\nDie -X-Optionen sind keine Standardoptionen und k\u00F6nnen ohne Vorank\u00FCndigung ge\u00E4ndert werden.\n
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Fehler: Beim Versuch, Datei {0} zu \u00F6ffnen, ist ein unerwarteter Fehler aufgetreten
java.launcher.jar.error2=Manifest in {0} nicht gefunden
java.launcher.jar.error3=kein Hauptmanifestattribut, in {0}
-java.launcher.jar.error4=kein Profilmanifestattribut in {0}
-java.launcher.jar.error5=Das f\u00FCr {1} erforderliche Profil {0} wird von dieser Runtime-Anwendung nicht unterst\u00FCtzt
java.launcher.init.error=Initialisierungsfehler
java.launcher.javafx.error1=Fehler: Die JavaFX-Methode launchApplication hat die falsche Signatur, sie\nmuss als statisch deklariert werden und einen Wert vom Typ VOID zur\u00FCckgeben
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_es.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_es.properties Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Error: se ha producido un error inesperado al intentar abrir el archivo {0}
java.launcher.jar.error2=no se ha encontrado el manifiesto en {0}
java.launcher.jar.error3=no hay ning\u00FAn atributo de manifiesto principal en {0}
-java.launcher.jar.error4=no hay ning\u00FAn atributo de manifiesto de perfil en {0}
-java.launcher.jar.error5=El perfil {0} que necesita {1} no est\u00E1 soportado por este tiempo de ejecuci\u00F3n
java.launcher.init.error=error de inicializaci\u00F3n
java.launcher.javafx.error1=Error: el m\u00E9todo launchApplication de JavaFX tiene una firma que no es correcta.\\nSe debe declarar est\u00E1tico y devolver un valor de tipo nulo
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_fr.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_fr.properties Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
java.launcher.ergo.message2 =\ car vous ex\u00E9cutez une machine de classe de serveur.\n
# Translators please note do not translate the options themselves
-java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\n -classpath <class search path of directories and zip/jar files>\n Liste de r\u00E9pertoires, d''archives JAR et\n d''archives ZIP s\u00E9par\u00E9s par des {0}, dans laquelle rechercher les fichiers de classe.\n -D<name>=<value>\n d\u00E9finition d''une propri\u00E9t\u00E9 syst\u00E8me\n -verbose[:class|gc|jni]\n activation de la sortie en mode verbose\n -version impression de la version du produit et fin de l''op\u00E9ration\n -version:<value>\n ex\u00E9cution de la version sp\u00E9cifi\u00E9e obligatoire\n -showversion impression de la version du produit et poursuite de l''op\u00E9ration\n -jre-restrict-search | -no-jre-restrict-search\n inclusion/exclusion des environnements JRE priv\u00E9s de l''utilisateur dans la recherche de version\n -? -help impression du message d''aide\n -X impression de l''aide sur les options non standard\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n activation des assertions avec la granularit\u00E9 sp\u00E9cifi\u00E9e\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n d\u00E9sactivation des assertions avec la granularit\u00E9 sp\u00E9cifi\u00E9e\n -esa | -enablesystemassertions\n activation des assertions syst\u00E8me\n -dsa | -disablesystemassertions\n d\u00E9sactivation des assertions syst\u00E8me\n -agentlib:<libname>[=<options>]\n chargement de la biblioth\u00E8que d''agent natif <libname>, par exemple -agentlib:hprof\n voir \u00E9galement, -agentlib:jdwp=help et -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n chargement de la biblioth\u00E8que d''agent natif via le chemin d''acc\u00E8s complet\n -javaagent:<jarpath>[=<options>]\n chargement de l''agent du langage de programmation Java, voir java.lang.instrument\n -splash:<imagepath>\n affichage de l''\u00E9cran d''accueil avec l''image sp\u00E9cifi\u00E9e\nVoir http://www.oracle.com/technetwork/java/javase/documentation/index.html pour plus de d\u00E9tails.
+java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\n -classpath <class search path of directories and zip/jar files>\n Liste de r\u00E9pertoires, d''archives JAR et\n d''archives ZIP s\u00E9par\u00E9s par des {0}, dans laquelle rechercher les fichiers de classe.\n -D<name>=<value>\n d\u00E9finition d''une propri\u00E9t\u00E9 syst\u00E8me\n -verbose:[class|gc|jni]\n activation de la sortie en mode verbose\n -version impression de la version du produit et fin de l''op\u00E9ration\n -version:<value>\n ex\u00E9cution de la version sp\u00E9cifi\u00E9e obligatoire\n -showversion impression de la version du produit et poursuite de l''op\u00E9ration\n -jre-restrict-search | -no-jre-restrict-search\n inclusion/exclusion des environnements JRE priv\u00E9s de l''utilisateur dans la recherche de version\n -? -help impression du message d''aide\n -X impression de l''aide sur les options non standard\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n activation des assertions avec la granularit\u00E9 sp\u00E9cifi\u00E9e\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n d\u00E9sactivation des assertions avec la granularit\u00E9 sp\u00E9cifi\u00E9e\n -esa | -enablesystemassertions\n activation des assertions syst\u00E8me\n -dsa | -disablesystemassertions\n d\u00E9sactivation des assertions syst\u00E8me\n -agentlib:<libname>[=<options>]\n chargement de la biblioth\u00E8que d''agent natif <libname>, par exemple -agentlib:hprof\n voir \u00E9galement, -agentlib:jdwp=help et -agentlib:hprof=help\n -agentpath:<pathname>[=<options>]\n chargement de la biblioth\u00E8que d''agent natif via le chemin d''acc\u00E8s complet\n -javaagent:<jarpath>[=<options>]\n chargement de l''agent du langage de programmation Java, voir java.lang.instrument\n -splash:<imagepath>\n affichage de l''\u00E9cran d''accueil avec l''image sp\u00E9cifi\u00E9e\nVoir http://www.oracle.com/technetwork/java/javase/documentation/index.html pour plus de d\u00E9tails.
# Translators please note do not translate the options themselves
java.launcher.X.usage=\ -Xmixed ex\u00E9cution en mode mixte (valeur par d\u00E9faut)\n -Xint ex\u00E9cution en mode interpr\u00E9t\u00E9 uniquement\n -Xbootclasspath:<directories and zip/jar files separated by {0}>\n d\u00E9finition du chemin de recherche pour les ressources et classes bootstrap\n -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n ajout \u00E0 la fin du chemin de classe bootstrap\n -Xbootclasspath/p:<directories and zip/jar files separated by {0}>\n ajout au d\u00E9but du chemin de classe bootstrap\n -Xdiag affichage de messages de diagnostic suppl\u00E9mentaires\n -Xnoclassgc d\u00E9sactivation de l''op\u00E9ration de ramasse-miette (garbage collection) de la classe\n -Xincgc activation de l''op\u00E9ration de ramasse-miette (garbage collection) incr\u00E9mentielle\n -Xloggc:<file> journalisation du statut de l''op\u00E9ration de ramasse-miette (garbage collection) dans un fichier avec horodatages\n -Xbatch d\u00E9sactivation de la compilation en arri\u00E8re-plan\n -Xms<size> d\u00E9finition de la taille initiale des portions de m\u00E9moire Java\n -Xmx<size> d\u00E9finition de la taille maximale des portions de m\u00E9moire Java\n -Xss<size> d\u00E9finition de la taille de pile de thread Java\n -Xprof sortie des donn\u00E9es de profilage de l''unit\u00E9 centrale\n -Xfuture activation des contr\u00F4les les plus stricts en vue d''anticiper la future valeur par d\u00E9faut\n -Xrs r\u00E9duction de l''utilisation des signaux OS par Java/la machine virtuelle (voir documentation)\n -Xcheck:jni ex\u00E9cution de contr\u00F4les suppl\u00E9mentaires pour les fonctions JNI\n -Xshare:off aucune tentative d''utilisation des donn\u00E9es de classe partag\u00E9es\n -Xshare:auto utilisation des donn\u00E9es de classe partag\u00E9es si possible (valeur par d\u00E9faut)\n -Xshare:on utilisation des donn\u00E9es de classe partag\u00E9es obligatoire ou \u00E9chec de l''op\u00E9ration\n -XshowSettings affichage de tous les param\u00E8tres et poursuite de l''op\u00E9ration\n -XshowSettings:all\n affichage de tous les param\u00E8tres et poursuite de l''op\u00E9ration\n -XshowSettings:vm affichage de tous les param\u00E8tres de machine virtuelle et poursuite de l''op\u00E9ration\n -XshowSettings:properties\n affichage de tous les param\u00E8tres de propri\u00E9t\u00E9 et poursuite de l''op\u00E9ration\n -XshowSettings:locale\n affichage de tous les param\u00E8tres d''environnement local et poursuite de l''op\u00E9ration\n\nLes options -X ne sont pas des options standard et peuvent faire l''objet de modifications sans pr\u00E9avis.\n
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Erreur : une erreur inattendue est survenue lors de la tentative d''ouverture du fichier {0}
java.launcher.jar.error2=fichier manifeste introuvable dans {0}
java.launcher.jar.error3=aucun attribut manifest principal dans {0}
-java.launcher.jar.error4=aucun attribut manifest ''Profile'' dans {0}
-java.launcher.jar.error5=Profil {0} requis par {1} non pris en charge par cette ex\u00E9cution
java.launcher.init.error=erreur d'initialisation
java.launcher.javafx.error1=Erreur : la signature de la m\u00E9thode launchApplication JavaFX est incorrecte, la\nm\u00E9thode doit \u00EAtre d\u00E9clar\u00E9e statique et renvoyer une valeur de type void
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_it.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_it.properties Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Errore: si \u00E8 verificato un errore imprevisto durante il tentativo di aprire il file {0}
java.launcher.jar.error2=manifest non trovato in {0}
java.launcher.jar.error3=nessun attributo manifest principale in {0}
-java.launcher.jar.error4=nessun attributo manifest di profilo in {0}
-java.launcher.jar.error5=Il profilo {0} richiesto da {1} non \u00E8 supportato da questo runtime
java.launcher.init.error=errore di inizializzazione
java.launcher.javafx.error1=Errore: il metodo JavaFX launchApplication dispone di una firma errata, \nla firma deve essere dichiarata static e restituire un valore di tipo void
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -34,11 +34,11 @@
java.launcher.ergo.message2 =\ \u3053\u308C\u306F\u30B5\u30FC\u30D0\u30FC\u30AF\u30E9\u30B9\u306E\u30DE\u30B7\u30F3\u3067\u5B9F\u884C\u3057\u3066\u3044\u308B\u305F\u3081\u3067\u3059\u3002\n
# Translators please note do not translate the options themselves
-java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\n -classpath <class search path of directories and zip/jar files>\n \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3001\n JAR\u30A2\u30FC\u30AB\u30A4\u30D6\u304A\u3088\u3073ZIP\u30A2\u30FC\u30AB\u30A4\u30D6\u306E{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30EA\u30B9\u30C8\u3067\u3059\u3002\n -D<name>=<value>\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8A2D\u5B9A\u3059\u308B\n -verbose:[class|gc|jni]\n \u8A73\u7D30\u306A\u51FA\u529B\u3092\u884C\u3046\n -version \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3057\u3066\u7D42\u4E86\u3059\u308B\n -version:<value>\n \u6307\u5B9A\u3057\u305F\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u5B9F\u884C\u306B\u5FC5\u9808\u306B\u3059\u308B\n -showversion \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3057\u3066\u7D9A\u884C\u3059\u308B\n -jre-restrict-search | -no-jre-restrict-search\n \u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30E9\u30A4\u30D9\u30FC\u30C8JRE\u3092\u30D0\u30FC\u30B8\u30E7\u30F3\u691C\u7D22\u306B\u542B\u3081\u308B/\u9664\u5916\u3059\u308B\n -? -help \u3053\u306E\u30D8\u30EB\u30D7\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u95A2\u3059\u308B\u30D8\u30EB\u30D7\u3092\u51FA\u529B\u3059\u308B\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n \u6307\u5B9A\u3057\u305F\u7C92\u5EA6\u3067\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n \u6307\u5B9A\u3057\u305F\u7C92\u5EA6\u3067\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -esa | -enablesystemassertions\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -dsa | -disablesystemassertions\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -agentlib:<libname>[=<options>]\n \u30CD\u30A4\u30C6\u30A3\u30D6\u30FB\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA<libname>\u3092\u30ED\u30FC\u30C9\u3059\u308B\u3002\u4F8B: -agentlib:hprof\n -agentlib:jdwp=help\u3068-agentlib:hprof=help\u3082\u53C2\u7167\n -agentpath:<pathname>[=<options>]\n \u30D5\u30EB\u30D1\u30B9\u540D\u3067\u30CD\u30A4\u30C6\u30A3\u30D6\u30FB\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u30ED\u30FC\u30C9\u3059\u308B\n -javaagent:<jarpath>[=<options>]\n Java\u30D7\u30ED\u30B0\u30E9\u30DF\u30F3\u30B0\u8A00\u8A9E\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3092\u30ED\u30FC\u30C9\u3059\u308B\u3002java.lang.instrument\u3092\u53C2\u7167\n -splash:<imagepath>\n \u6307\u5B9A\u3057\u305F\u30A4\u30E1\u30FC\u30B8\u3067\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5\u753B\u9762\u3092\u8868\u793A\u3059\u308B\n\u8A73\u7D30\u306Fhttp://www.oracle.com/technetwork/java/javase/documentation/index.html\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+java.launcher.opt.footer =\ -cp <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB\u306E\u30AF\u30E9\u30B9\u691C\u7D22\u30D1\u30B9>\n -classpath <\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB\u306E\u30AF\u30E9\u30B9\u691C\u7D22\u30D1\u30B9>\n \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3001\n JAR\u30A2\u30FC\u30AB\u30A4\u30D6\u304A\u3088\u3073ZIP\u30A2\u30FC\u30AB\u30A4\u30D6\u306E{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30EA\u30B9\u30C8\u3067\u3059\u3002\n -D<name>=<value>\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30D7\u30ED\u30D1\u30C6\u30A3\u3092\u8A2D\u5B9A\u3059\u308B\n -verbose:[class|gc|jni]\n \u8A73\u7D30\u306A\u51FA\u529B\u3092\u884C\u3046\n -version \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3057\u3066\u7D42\u4E86\u3059\u308B\n -version:<value>\n \u6307\u5B9A\u3057\u305F\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u5B9F\u884C\u306B\u5FC5\u9808\u306B\u3059\u308B\n -showversion \u88FD\u54C1\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u51FA\u529B\u3057\u3066\u7D9A\u884C\u3059\u308B\n -jre-restrict-search | -no-jre-restrict-search\n \u30E6\u30FC\u30B6\u30FC\u306E\u30D7\u30E9\u30A4\u30D9\u30FC\u30C8JRE\u3092\u30D0\u30FC\u30B8\u30E7\u30F3\u691C\u7D22\u306B\u542B\u3081\u308B/\u9664\u5916\u3059\u308B\n -? -help \u3053\u306E\u30D8\u30EB\u30D7\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u95A2\u3059\u308B\u30D8\u30EB\u30D7\u3092\u51FA\u529B\u3059\u308B\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n \u6307\u5B9A\u3057\u305F\u7C92\u5EA6\u3067\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n \u6307\u5B9A\u3057\u305F\u7C92\u5EA6\u3067\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -esa | -enablesystemassertions\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -dsa | -disablesystemassertions\n \u30B7\u30B9\u30C6\u30E0\u30FB\u30A2\u30B5\u30FC\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -agentlib:<libname>[=<options>]\n \u30CD\u30A4\u30C6\u30A3\u30D6\u30FB\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA<libname>\u3092\u30ED\u30FC\u30C9\u3059\u308B\u3002\u4F8B: -agentlib:hprof\n -agentlib:jdwp=help\u3068-agentlib:hprof=help\u3082\u53C2\u7167\n -agentpath:<pathname>[=<options>]\n \u30D5\u30EB\u30D1\u30B9\u540D\u3067\u30CD\u30A4\u30C6\u30A3\u30D6\u30FB\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30FB\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u30ED\u30FC\u30C9\u3059\u308B\n -javaagent:<jarpath>[=<options>]\n Java\u30D7\u30ED\u30B0\u30E9\u30DF\u30F3\u30B0\u8A00\u8A9E\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3092\u30ED\u30FC\u30C9\u3059\u308B\u3002java.lang.instrument\u3092\u53C2\u7167\n -splash:<imagepath>\n \u6307\u5B9A\u3057\u305F\u30A4\u30E1\u30FC\u30B8\u3067\u30B9\u30D7\u30E9\u30C3\u30B7\u30E5\u753B\u9762\u3092\u8868\u793A\u3059\u308B\n\u8A73\u7D30\u306Fhttp://www.oracle.com/technetwork/java/javase/documentation/index.html\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002
# Translators please note do not translate the options themselves
-java.launcher.X.usage=\ -Xmixed \u6DF7\u5408\u30E2\u30FC\u30C9\u306E\u5B9F\u884C(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xint \u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u30FB\u30E2\u30FC\u30C9\u306E\u5B9F\u884C\u306E\u307F\n -Xbootclasspath:<directories and zip/jar files separated by {0}>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u306E\u30AF\u30E9\u30B9\u3068\u30EA\u30BD\u30FC\u30B9\u306E\u691C\u7D22\u30D1\u30B9\u3092\u8A2D\u5B9A\u3059\u308B\n -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u6700\u5F8C\u306B\u8FFD\u52A0\u3059\u308B\n -Xbootclasspath/p:<directories and zip/jar files separated by {0}>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u524D\u306B\u4ED8\u52A0\u3059\u308B\n -Xdiag \u8FFD\u52A0\u306E\u8A3A\u65AD\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3059\u308B\n -Xnoclassgc \u30AF\u30E9\u30B9\u306E\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xincgc \u5897\u5206\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -Xloggc:<file> \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u306BGC\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30ED\u30B0\u3092\u8A18\u9332\u3059\u308B\n -Xbatch \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xms<size> Java\u306E\u521D\u671F\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xmx<size> Java\u306E\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xss<size> Java\u306E\u30B9\u30EC\u30C3\u30C9\u30FB\u30B9\u30BF\u30C3\u30AF\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xprof CPU\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u30FB\u30C7\u30FC\u30BF\u3092\u51FA\u529B\u3059\u308B\n -Xfuture \u5C06\u6765\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u898B\u8D8A\u3057\u3066\u3001\u6700\u3082\u53B3\u5BC6\u306A\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3059\u308B\n -Xrs Java/VM\u306B\u3088\u308BOS\u30B7\u30B0\u30CA\u30EB\u306E\u4F7F\u7528\u3092\u524A\u6E1B\u3059\u308B(\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167)\n -Xcheck:jni JNI\u95A2\u6570\u306B\u5BFE\u3059\u308B\u8FFD\u52A0\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u5B9F\u884C\u3059\u308B\n -Xshare:off \u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u306A\u3044\n -Xshare:auto \u53EF\u80FD\u3067\u3042\u308C\u3070\u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xshare:on \u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u306E\u4F7F\u7528\u3092\u5FC5\u9808\u306B\u3057\u3001\u3067\u304D\u306A\u3051\u308C\u3070\u5931\u6557\u3059\u308B\u3002\n -XshowSettings \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:all\n \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:vm \u3059\u3079\u3066\u306EVM\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:properties\n \u3059\u3079\u3066\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:locale\n \
-\u3059\u3079\u3066\u306E\u30ED\u30B1\u30FC\u30EB\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n\n-X\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u975E\u6A19\u6E96\u306A\u306E\u3067\u3001\u4E88\u544A\u306A\u304F\u5909\u66F4\u3055\u308C\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002\n
+java.launcher.X.usage=\ -Xmixed \u6DF7\u5408\u30E2\u30FC\u30C9\u306E\u5B9F\u884C(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xint \u30A4\u30F3\u30BF\u30D7\u30EA\u30BF\u30FB\u30E2\u30FC\u30C9\u306E\u5B9F\u884C\u306E\u307F\n -Xbootclasspath:<{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u306E\u30AF\u30E9\u30B9\u3068\u30EA\u30BD\u30FC\u30B9\u306E\u691C\u7D22\u30D1\u30B9\u3092\u8A2D\u5B9A\u3059\u308B\n -Xbootclasspath/a:<{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u6700\u5F8C\u306B\u8FFD\u52A0\u3059\u308B\n -Xbootclasspath/p:<{0}\u3067\u533A\u5207\u3089\u308C\u305F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304A\u3088\u3073zip/jar\u30D5\u30A1\u30A4\u30EB>\n \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D1\u30B9\u306E\u524D\u306B\u4ED8\u52A0\u3059\u308B\n -Xdiag \u8FFD\u52A0\u306E\u8A3A\u65AD\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3059\u308B\n -Xnoclassgc \u30AF\u30E9\u30B9\u306E\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xincgc \u5897\u5206\u30AC\u30D9\u30FC\u30B8\u30FB\u30B3\u30EC\u30AF\u30B7\u30E7\u30F3\u3092\u6709\u52B9\u306B\u3059\u308B\n -Xloggc:<file> \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u304C\u4ED8\u3044\u305F\u30D5\u30A1\u30A4\u30EB\u306BGC\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u30ED\u30B0\u3092\u8A18\u9332\u3059\u308B\n -Xbatch \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3092\u7121\u52B9\u306B\u3059\u308B\n -Xms<size> Java\u306E\u521D\u671F\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xmx<size> Java\u306E\u6700\u5927\u30D2\u30FC\u30D7\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xss<size> Java\u306E\u30B9\u30EC\u30C3\u30C9\u30FB\u30B9\u30BF\u30C3\u30AF\u30FB\u30B5\u30A4\u30BA\u3092\u8A2D\u5B9A\u3059\u308B\n -Xprof CPU\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u30FB\u30C7\u30FC\u30BF\u3092\u51FA\u529B\u3059\u308B\n -Xfuture \u5C06\u6765\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u898B\u8D8A\u3057\u3066\u3001\u6700\u3082\u53B3\u5BC6\u306A\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3059\u308B\n -Xrs Java/VM\u306B\u3088\u308BOS\u30B7\u30B0\u30CA\u30EB\u306E\u4F7F\u7528\u3092\u524A\u6E1B\u3059\u308B(\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u53C2\u7167)\n -Xcheck:jni JNI\u95A2\u6570\u306B\u5BFE\u3059\u308B\u8FFD\u52A0\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u5B9F\u884C\u3059\u308B\n -Xshare:off \u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u306A\u3044\n -Xshare:auto \u53EF\u80FD\u3067\u3042\u308C\u3070\u5171\u6709\u30AF\u30E9\u30B9\u306E\u30C7\u30FC\u30BF\u3092\u4F7F\u7528\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -Xshare:on \u5171\u6709\u30AF\u30E9\u30B9\u30FB\u30C7\u30FC\u30BF\u306E\u4F7F\u7528\u3092\u5FC5\u9808\u306B\u3057\u3001\u3067\u304D\u306A\u3051\u308C\u3070\u5931\u6557\u3059\u308B\u3002\n -XshowSettings \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:all\n \u3059\u3079\u3066\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:vm \u3059\u3079\u3066\u306EVM\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:properties\n \
+\u3059\u3079\u3066\u306E\u30D7\u30ED\u30D1\u30C6\u30A3\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n -XshowSettings:locale\n \u3059\u3079\u3066\u306E\u30ED\u30B1\u30FC\u30EB\u95A2\u9023\u306E\u8A2D\u5B9A\u3092\u8868\u793A\u3057\u3066\u7D9A\u884C\u3059\u308B\n\n-X\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u975E\u6A19\u6E96\u306A\u306E\u3067\u3001\u4E88\u544A\u306A\u304F\u5909\u66F4\u3055\u308C\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\u3002\n
# Translators please note do not translate the options themselves
java.launcher.X.macosx.usage=\n\u6B21\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u306FMac OS X\u56FA\u6709\u3067\u3059\u3002\n -XstartOnFirstThread\n main()\u30E1\u30BD\u30C3\u30C9\u3092\u6700\u521D(AppKit)\u306E\u30B9\u30EC\u30C3\u30C9\u3067\u5B9F\u884C\u3059\u308B\n -Xdock:name=<application name>"\n Dock\u306B\u8868\u793A\u3055\u308C\u308B\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u540D\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -Xdock:icon=<path to icon file>\n Dock\u306B\u8868\u793A\u3055\u308C\u308B\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30A2\u30A4\u30B3\u30F3\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n\n
@@ -51,7 +51,5 @@
java.launcher.jar.error1=\u30A8\u30E9\u30FC: \u30D5\u30A1\u30A4\u30EB{0}\u3092\u958B\u3053\u3046\u3068\u3057\u3066\u3044\u308B\u3068\u304D\u306B\u3001\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
java.launcher.jar.error2={0}\u306B\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
java.launcher.jar.error3={0}\u306B\u30E1\u30A4\u30F3\u30FB\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093
-java.launcher.jar.error4={0}\u306B\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u30FB\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093
-java.launcher.jar.error5={1}\u306B\u5FC5\u8981\u306A\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB{0}\u306F\u3053\u306E\u30E9\u30F3\u30BF\u30A4\u30E0\u3067\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093
java.launcher.init.error=\u521D\u671F\u5316\u30A8\u30E9\u30FC
java.launcher.javafx.error1=\u30A8\u30E9\u30FC: JavaFX launchApplication\u30E1\u30BD\u30C3\u30C9\u306B\u8AA4\u3063\u305F\u30B7\u30B0\u30CD\u30C1\u30E3\u304C\u3042\u308A\u3001\nstatic\u3092\u5BA3\u8A00\u3057\u3066void\u578B\u306E\u5024\u3092\u8FD4\u3059\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -34,10 +34,11 @@
java.launcher.ergo.message2 =\ \uC11C\uBC84\uAE09 \uC2DC\uC2A4\uD15C\uC5D0\uC11C \uC2E4\uD589 \uC911\uC774\uAE30 \uB54C\uBB38\uC785\uB2C8\uB2E4.\n
# Translators please note do not translate the options themselves
-java.launcher.opt.footer =\ -cp <class search path of directories and zip/jar files>\\n -classpath <class search path of directories and zip/jar files>\\n \uD074\uB798\uC2A4 \uD30C\uC77C\uC744 \uAC80\uC0C9\uD560 {0}(\uC73C)\uB85C \uAD6C\uBD84\uB41C \uB514\uB809\uD1A0\uB9AC,\\n JAR \uC544\uCE74\uC774\uBE0C \uBC0F ZIP \uC544\uCE74\uC774\uBE0C \uBAA9\uB85D\uC785\uB2C8\uB2E4.\\n -D<name>=<value>\\n \uC2DC\uC2A4\uD15C \uC18D\uC131\uC744 \uC124\uC815\uD569\uB2C8\uB2E4.\\n -verbose:[class|gc|jni]\\n \uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\\n -version \uC81C\uD488 \uBC84\uC804\uC744 \uC778\uC1C4\uD55C \uD6C4 \uC885\uB8CC\uD569\uB2C8\uB2E4.\\n -version:<value>\\n \uC2E4\uD589\uD560 \uBC84\uC804\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.\\n -showversion \uC81C\uD488 \uBC84\uC804\uC744 \uC778\uC1C4\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\\n -jre-restrict-search | -no-jre-restrict-search\\n \uBC84\uC804 \uAC80\uC0C9\uC5D0\uC11C \uC0AC\uC6A9\uC790 \uC804\uC6A9 JRE\uB97C \uD3EC\uD568/\uC81C\uC678\uD569\uB2C8\uB2E4.\\n -? -help \uC774 \uB3C4\uC6C0\uB9D0 \uBA54\uC2DC\uC9C0\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4.\\n -X \uBE44\uD45C\uC900 \uC635\uC158\uC5D0 \uB300\uD55C \uB3C4\uC6C0\uB9D0\uC744 \uC778\uC1C4\uD569\uB2C8\uB2E4.\\n -ea[:<packagename>...|:<classname>]\\n -enableassertions[:<packagename>...|:<classname>]\\n \uC138\uBD84\uC131\uC774 \uC9C0\uC815\uB41C \uAC80\uC99D\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\\n -da[:<packagename>...|:<classname>]\\n -disableassertions[:<packagename>...|:<classname>]\\n \uC138\uBD84\uC131\uC774 \uC9C0\uC815\uB41C \uAC80\uC99D\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\\n -esa | -enablesystemassertions\\n \uC2DC\uC2A4\uD15C \uAC80\uC99D\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\\n -dsa | -disablesystemassertions\\n \uC2DC\uC2A4\uD15C \uAC80\uC99D\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\\n -agentlib:<libname>[=<options>]\\n <libname> \uACE0\uC720 \uC5D0\uC774\uC804\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4(\uC608: -agentlib:hprof).\\n -agentlib:jdwp=help \uBC0F -agentlib:hprof=help\uB3C4 \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.\\n -agentpath:<pathname>[=<options>]\\n \uC804\uCCB4 \uACBD\uB85C\uBA85\uC744 \uC0AC\uC6A9\uD558\uC5EC \uACE0\uC720 \uC5D0\uC774\uC804\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4.\\n -javaagent:<jarpath>[=<options>]\\n Java \uD504\uB85C\uADF8\uB798\uBC0D \uC5B8\uC5B4 \uC5D0\uC774\uC804\uD2B8\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4. java.lang.instrument\uB97C \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.\\n -splash:<imagepath>\\n \uC774\uBBF8\uC9C0\uAC00 \uC9C0\uC815\uB41C \uC2A4\uD50C\uB798\uC2DC \uD654\uBA74\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.\\n\uC790\uC138\uD55C \uB0B4\uC6A9\uC740 http://www.oracle.com/technetwork/java/javase/documentation/index.html\uC744 \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.
+java.launcher.opt.footer =\ -cp <\uB514\uB809\uD1A0\uB9AC \uBC0F zip/jar \uD30C\uC77C\uC758 \uD074\uB798\uC2A4 \uAC80\uC0C9 \uACBD\uB85C>\n -classpath <\uB514\uB809\uD1A0\uB9AC \uBC0F zip/jar \uD30C\uC77C\uC758 \uD074\uB798\uC2A4 \uAC80\uC0C9 \uACBD\uB85C>\n \uD074\uB798\uC2A4 \uD30C\uC77C\uC744 \uAC80\uC0C9\uD560 {0}(\uC73C)\uB85C \uAD6C\uBD84\uB41C \uB514\uB809\uD1A0\uB9AC,\n JAR \uC544\uCE74\uC774\uBE0C \uBC0F ZIP \uC544\uCE74\uC774\uBE0C \uBAA9\uB85D\uC785\uB2C8\uB2E4.\n -D<name>=<value>\n \uC2DC\uC2A4\uD15C \uC18D\uC131\uC744 \uC124\uC815\uD569\uB2C8\uB2E4.\n -verbose:[class|gc|jni]\n \uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -version \uC81C\uD488 \uBC84\uC804\uC744 \uC778\uC1C4\uD55C \uD6C4 \uC885\uB8CC\uD569\uB2C8\uB2E4.\n -version:<value>\n \uC2E4\uD589\uD560 \uBC84\uC804\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.\n -showversion \uC81C\uD488 \uBC84\uC804\uC744 \uC778\uC1C4\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -jre-restrict-search | -no-jre-restrict-search\n \uBC84\uC804 \uAC80\uC0C9\uC5D0\uC11C \uC0AC\uC6A9\uC790 \uC804\uC6A9 JRE\uB97C \uD3EC\uD568/\uC81C\uC678\uD569\uB2C8\uB2E4.\n -? -help \uC774 \uB3C4\uC6C0\uB9D0 \uBA54\uC2DC\uC9C0\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4.\n -X \uBE44\uD45C\uC900 \uC635\uC158\uC5D0 \uB300\uD55C \uB3C4\uC6C0\uB9D0\uC744 \uC778\uC1C4\uD569\uB2C8\uB2E4.\n -ea[:<packagename>...|:<classname>]\n -enableassertions[:<packagename>...|:<classname>]\n \uC138\uBD84\uC131\uC774 \uC9C0\uC815\uB41C \uAC80\uC99D\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -da[:<packagename>...|:<classname>]\n -disableassertions[:<packagename>...|:<classname>]\n \uC138\uBD84\uC131\uC774 \uC9C0\uC815\uB41C \uAC80\uC99D\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -esa | -enablesystemassertions\n \uC2DC\uC2A4\uD15C \uAC80\uC99D\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -dsa | -disablesystemassertions\n \uC2DC\uC2A4\uD15C \uAC80\uC99D\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -agentlib:<libname>[=<options>]\n <libname> \uACE0\uC720 \uC5D0\uC774\uC804\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4(\uC608: -agentlib:hprof).\n -agentlib:jdwp=help \uBC0F -agentlib:hprof=help\uB3C4 \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.\n -agentpath:<pathname>[=<options>]\n \uC804\uCCB4 \uACBD\uB85C\uBA85\uC744 \uC0AC\uC6A9\uD558\uC5EC \uACE0\uC720 \uC5D0\uC774\uC804\uD2B8 \uB77C\uC774\uBE0C\uB7EC\uB9AC\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4.\n -javaagent:<jarpath>[=<options>]\n Java \uD504\uB85C\uADF8\uB798\uBC0D \uC5B8\uC5B4 \uC5D0\uC774\uC804\uD2B8\uB97C \uB85C\uB4DC\uD569\uB2C8\uB2E4. java.lang.instrument\uB97C \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.\n -splash:<imagepath>\n \uC774\uBBF8\uC9C0\uAC00 \uC9C0\uC815\uB41C \uC2A4\uD50C\uB798\uC2DC \uD654\uBA74\uC744 \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n\uC790\uC138\uD55C \uB0B4\uC6A9\uC740 http://www.oracle.com/technetwork/java/javase/documentation/index.html\uC744 \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.
# Translators please note do not translate the options themselves
-java.launcher.X.usage=\ -Xmixed \uD63C\uD569 \uBAA8\uB4DC\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4(\uAE30\uBCF8\uAC12).\n -Xint \uD574\uC11D\uB41C \uBAA8\uB4DC\uB9CC \uC2E4\uD589\uD569\uB2C8\uB2E4.\n -Xbootclasspath:<directories and zip/jar files separated by {0}>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uBC0F \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACBD\uB85C\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xbootclasspath/a:<directories and zip/jar files separated by {0}>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uACBD\uB85C \uB05D\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4.\n -Xbootclasspath/p:<directories and zip/jar files separated by {0}>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uACBD\uB85C \uC55E\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4.\n -Xdiag \uCD94\uAC00 \uC9C4\uB2E8 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n -Xnoclassgc \uD074\uB798\uC2A4\uC758 \uBD88\uD544\uC694\uD55C \uC815\uBCF4 \uBAA8\uC74C\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xincgc \uC99D\uBD84\uC801\uC778 \uBD88\uD544\uC694\uD55C \uC815\uBCF4 \uBAA8\uC74C\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xloggc:<file> \uC2DC\uAC04 \uAE30\uB85D\uACFC \uD568\uAED8 \uD30C\uC77C\uC5D0 GC \uC0C1\uD0DC\uB97C \uAE30\uB85D\uD569\uB2C8\uB2E4.\n -Xbatch \uBC31\uADF8\uB77C\uC6B4\uB4DC \uCEF4\uD30C\uC77C\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xms<size> \uCD08\uAE30 Java \uD799 \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xmx<size> \uCD5C\uB300 Java \uD799 \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xss<size> Java \uC2A4\uB808\uB4DC \uC2A4\uD0DD \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xprof CPU \uD504\uB85C\uD30C\uC77C \uC791\uC131 \uB370\uC774\uD130\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4.\n -Xfuture \uBBF8\uB798 \uAE30\uBCF8\uAC12\uC744 \uC608\uCE21\uD558\uC5EC \uAC00\uC7A5 \uC5C4\uACA9\uD55C \uAC80\uC0AC\uB97C \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xrs Java/VM\uC5D0 \uC758\uD55C OS \uC2E0\uD638 \uC0AC\uC6A9\uC744 \uC904\uC785\uB2C8\uB2E4(\uC124\uBA85\uC11C \uCC38\uC870).\n -Xcheck:jni JNI \uD568\uC218\uC5D0 \uB300\uD55C \uCD94\uAC00 \uAC80\uC0AC\uB97C \uC218\uD589\uD569\uB2C8\uB2E4.\n -Xshare:off \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130 \uC0AC\uC6A9\uC744 \uC2DC\uB3C4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -Xshare:auto \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4(\uAE30\uBCF8\uAC12).\n -Xshare:on \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC744 \uACBD\uC6B0 \uC2E4\uD328\uD569\uB2C8\uB2E4.\n -XshowSettings \uBAA8\uB4E0 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:all\n \uBAA8\uB4E0 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:vm \uBAA8\uB4E0 VM \uAD00\uB828 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:properties\n \uBAA8\uB4E0 \uC18D\uC131 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:locale\n \uBAA8\uB4E0 \uB85C\uCF00\uC77C \uAD00\uB828 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n\n-X \uC635\uC158\uC740 \uBE44\uD45C\uC900 \uC635\uC158\uC774\uBBC0\uB85C \uD1B5\uC9C0 \uC5C6\uC774 \uBCC0\uACBD\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\n
+java.launcher.X.usage=\ -Xmixed \uD63C\uD569 \uBAA8\uB4DC\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4(\uAE30\uBCF8\uAC12).\n -Xint \uD574\uC11D\uB41C \uBAA8\uB4DC\uB9CC \uC2E4\uD589\uD569\uB2C8\uB2E4.\n -Xbootclasspath:<{0}(\uC73C)\uB85C \uAD6C\uBD84\uB41C \uB514\uB809\uD1A0\uB9AC \uBC0F zip/jar \uD30C\uC77C>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uBC0F \uB9AC\uC18C\uC2A4\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACBD\uB85C\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xbootclasspath/a:<{0}(\uC73C)\uB85C \uAD6C\uBD84\uB41C \uB514\uB809\uD1A0\uB9AC \uBC0F zip/jar \uD30C\uC77C>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uACBD\uB85C \uB05D\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4.\n -Xbootclasspath/p:<{0}(\uC73C)\uB85C \uAD6C\uBD84\uB41C \uB514\uB809\uD1A0\uB9AC \uBC0F zip/jar \uD30C\uC77C>\n \uBD80\uD2B8\uC2A4\uD2B8\uB7A9 \uD074\uB798\uC2A4 \uACBD\uB85C \uC55E\uC5D0 \uCD94\uAC00\uD569\uB2C8\uB2E4.\n -Xdiag \uCD94\uAC00 \uC9C4\uB2E8 \uBA54\uC2DC\uC9C0\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.\n -Xnoclassgc \uD074\uB798\uC2A4\uC758 \uBD88\uD544\uC694\uD55C \uC815\uBCF4 \uBAA8\uC74C\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xincgc \uC99D\uBD84\uC801\uC778 \uBD88\uD544\uC694\uD55C \uC815\uBCF4 \uBAA8\uC74C\uC744 \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xloggc:<file> \uC2DC\uAC04 \uAE30\uB85D\uACFC \uD568\uAED8 \uD30C\uC77C\uC5D0 GC \uC0C1\uD0DC\uB97C \uAE30\uB85D\uD569\uB2C8\uB2E4.\n -Xbatch \uBC31\uADF8\uB77C\uC6B4\uB4DC \uCEF4\uD30C\uC77C\uC744 \uC0AC\uC6A9 \uC548\uD568\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xms<size> \uCD08\uAE30 Java \uD799 \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xmx<size> \uCD5C\uB300 Java \uD799 \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xss<size> Java \uC2A4\uB808\uB4DC \uC2A4\uD0DD \uD06C\uAE30\uB97C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xprof CPU \uD504\uB85C\uD30C\uC77C \uC791\uC131 \uB370\uC774\uD130\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4.\n -Xfuture \uBBF8\uB798 \uAE30\uBCF8\uAC12\uC744 \uC608\uCE21\uD558\uC5EC \uAC00\uC7A5 \uC5C4\uACA9\uD55C \uAC80\uC0AC\uB97C \uC0AC\uC6A9\uC73C\uB85C \uC124\uC815\uD569\uB2C8\uB2E4.\n -Xrs Java/VM\uC5D0 \uC758\uD55C OS \uC2E0\uD638 \uC0AC\uC6A9\uC744 \uC904\uC785\uB2C8\uB2E4(\uC124\uBA85\uC11C \uCC38\uC870).\n -Xcheck:jni JNI \uD568\uC218\uC5D0 \uB300\uD55C \uCD94\uAC00 \uAC80\uC0AC\uB97C \uC218\uD589\uD569\uB2C8\uB2E4.\n -Xshare:off \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130 \uC0AC\uC6A9\uC744 \uC2DC\uB3C4\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -Xshare:auto \uAC00\uB2A5\uD55C \uACBD\uC6B0 \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4(\uAE30\uBCF8\uAC12).\n -Xshare:on \uACF5\uC720 \uD074\uB798\uC2A4 \uB370\uC774\uD130\uB97C \uC0AC\uC6A9\uD574\uC57C \uD569\uB2C8\uB2E4. \uADF8\uB807\uC9C0 \uC54A\uC744 \uACBD\uC6B0 \uC2E4\uD328\uD569\uB2C8\uB2E4.\n -XshowSettings \uBAA8\uB4E0 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:all\n \uBAA8\uB4E0 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:vm \uBAA8\uB4E0 VM \uAD00\uB828 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:properties\n \uBAA8\uB4E0 \uC18D\uC131 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n -XshowSettings:locale\n \uBAA8\uB4E0 \uB85C\uCF00\uC77C \uAD00\uB828 \uC124\uC815\uC744 \uD45C\uC2DC\uD55C \uD6C4 \uACC4\uC18D\uD569\uB2C8\uB2E4.\n\n-X \uC635\uC158\uC740 \uBE44\uD45C\uC900 \uC635\uC158\uC774\uBBC0\uB85C \uD1B5\uC9C0 \uC5C6\uC774 \uBCC0\uACBD\uB420 \uC218 \
+\uC788\uC2B5\uB2C8\uB2E4.\n
# Translators please note do not translate the options themselves
java.launcher.X.macosx.usage=\n\uB2E4\uC74C\uC740 Mac OS X\uC5D0 \uD2B9\uC815\uB41C \uC635\uC158\uC785\uB2C8\uB2E4.\n -XstartOnFirstThread\n \uCCAB\uBC88\uC9F8 (AppKit) \uC2A4\uB808\uB4DC\uC5D0 main() \uBA54\uC18C\uB4DC\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.\n -Xdock:name=<application name>"\n \uACE0\uC815\uC73C\uB85C \uD45C\uC2DC\uB41C \uAE30\uBCF8 \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8 \uC774\uB984\uC744 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\n -Xdock:icon=<path to icon file>\n \uACE0\uC815\uC73C\uB85C \uD45C\uC2DC\uB41C \uAE30\uBCF8 \uC544\uC774\uCF58\uC744 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\n\n
@@ -50,7 +51,5 @@
java.launcher.jar.error1=\uC624\uB958: {0} \uD30C\uC77C\uC744 \uC5F4\uB824\uACE0 \uC2DC\uB3C4\uD558\uB294 \uC911 \uC608\uC0C1\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.
java.launcher.jar.error2={0}\uC5D0\uC11C Manifest\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
java.launcher.jar.error3={0}\uC5D0 \uAE30\uBCF8 Manifest \uC18D\uC131\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.
-java.launcher.jar.error4={0}\uC5D0 Profile manifest \uC18D\uC131\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.
-java.launcher.jar.error5={1}\uC5D0 \uD544\uC694\uD55C {0} \uD504\uB85C\uD30C\uC77C\uC740 \uC774 \uB7F0\uD0C0\uC784\uC5D0\uC11C \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
java.launcher.init.error=\uCD08\uAE30\uD654 \uC624\uB958
java.launcher.javafx.error1=\uC624\uB958: JavaFX launchApplication \uBA54\uC18C\uB4DC\uC5D0 \uC798\uBABB\uB41C \uC11C\uBA85\uC774 \uC788\uC2B5\uB2C8\uB2E4.\\n\uB530\uB77C\uC11C static\uC73C\uB85C \uC120\uC5B8\uD558\uACE0 void \uC720\uD615\uC758 \uAC12\uC744 \uBC18\uD658\uD574\uC57C \uD569\uB2C8\uB2E4.
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_pt_BR.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_pt_BR.properties Thu Oct 03 19:18:54 2013 +0100
@@ -34,7 +34,7 @@
java.launcher.ergo.message2 =\ porque a execu\u00E7\u00E3o est\u00E1 sendo feita em uma m\u00E1quina de classe de servidor.\n
# Translators please note do not translate the options themselves
-java.launcher.opt.footer =\ -cp <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n -classpath <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n Uma lista separada por {0} de diret\u00F3rios, archives JAR\n e archives ZIP nos quais ser\u00E3o procurados os arquivos de classe.\n -D<nome>=<valor>\n define uma propriedade do sistema\n -verbose[:classe|gc|jni]\n ativa a sa\u00EDda detalhada\n -version imprime a vers\u00E3o do produto e sai do programa\n -version:<valor>\n requer a execu\u00E7\u00E3o da vers\u00E3o especificada\n -showversion imprime a vers\u00E3o do produto e continua\n -jre-restrict-search | -no-jre-restrict-search\n inclui/exclui JREs privados do usu\u00E1rio na pesquisa de vers\u00E3o\n -? -help imprime esta mensagem de ajuda\n -X imprime a ajuda sobre op\u00E7\u00F5es n\u00E3o padronizadas\n -ea[:<nome do pacote>...|:<nome da classe>]\n -enableassertions[:<nome do pacote>...|:<nome da classe>]\n ativa asser\u00E7\u00F5es com granularidade especificada\n -da[:<nome do pacote>...|:<nome da classe>]\n -disableassertions[:<nome do pacote>...|:<nome da classe>]\n desativa asser\u00E7\u00F5es com granularidade especificada\n -esa | -enablesystemassertions\n ativa asser\u00E7\u00F5es do sistema\n -dsa | -disablesystemassertions\n desativa asser\u00E7\u00F5es do sistema\n -agentlib:<nome da biblioteca>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa <nome da biblioteca>, por exemplo: -agentlib:hprof\n consulte tamb\u00E9m: -agentlib:jdwp=help e -agentlib:hprof=help\n -agentpath:<nome do caminho>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa com base no nome do caminho completo\n -javaagent:<caminho do arquivo jar>[=<op\u00E7\u00F5es>]\n carrega o agente da linguagem de programa\u00E7\u00E3o Java; consulte java.lang.instrument\n -splash:<caminho da imagem>\n mostra a tela de abertura com a imagem especificada\nConsulte http://www.oracle.com/technetwork/java/javase/documentation/index.html para obter mais detalhes.
+java.launcher.opt.footer =\ -cp <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n -classpath <caminho de pesquisa da classe dos diret\u00F3rios e arquivos zip/jar>\n Uma lista separada por {0} de diret\u00F3rios, archives JAR\n e archives ZIP nos quais ser\u00E3o procurados os arquivos de classe.\n -D<nome>=<valor>\n define uma propriedade do sistema\n -verbose:[classe|gc|jni]\n ativa a sa\u00EDda detalhada\n -version imprime a vers\u00E3o do produto e sai do programa\n -version:<valor>\n requer a execu\u00E7\u00E3o da vers\u00E3o especificada\n -showversion imprime a vers\u00E3o do produto e continua\n -jre-restrict-search | -no-jre-restrict-search\n inclui/exclui JREs privados do usu\u00E1rio na pesquisa de vers\u00E3o\n -? -help imprime esta mensagem de ajuda\n -X imprime a ajuda sobre op\u00E7\u00F5es n\u00E3o padronizadas\n -ea[:<nome do pacote>...|:<nome da classe>]\n -enableassertions[:<nome do pacote>...|:<nome da classe>]\n ativa asser\u00E7\u00F5es com granularidade especificada\n -da[:<nome do pacote>...|:<nome da classe>]\n -disableassertions[:<nome do pacote>...|:<nome da classe>]\n desativa asser\u00E7\u00F5es com granularidade especificada\n -esa | -enablesystemassertions\n ativa asser\u00E7\u00F5es do sistema\n -dsa | -disablesystemassertions\n desativa asser\u00E7\u00F5es do sistema\n -agentlib:<nome da biblioteca>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa <nome da biblioteca>, por exemplo: -agentlib:hprof\n consulte tamb\u00E9m: -agentlib:jdwp=help e -agentlib:hprof=help\n -agentpath:<nome do caminho>[=<op\u00E7\u00F5es>]\n carrega a biblioteca de agentes nativa com base no nome do caminho completo\n -javaagent:<caminho do arquivo jar>[=<op\u00E7\u00F5es>]\n carrega o agente da linguagem de programa\u00E7\u00E3o Java; consulte java.lang.instrument\n -splash:<caminho da imagem>\n mostra a tela de abertura com a imagem especificada\nConsulte http://www.oracle.com/technetwork/java/javase/documentation/index.html para obter mais detalhes.
# Translators please note do not translate the options themselves
java.launcher.X.usage=\ -Xmixed execu\u00E7\u00E3o no modo misto (default)\n -Xint execu\u00E7\u00E3o somente no modo interpretado\n -Xbootclasspath:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n define o caminho de pesquisa para classes e recursos de inicializa\u00E7\u00E3o\n -Xbootclasspath/a:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no final do caminho da classe de inicializa\u00E7\u00E3o\n -Xbootclasspath/p:<diret\u00F3rios e arquivos zip/jar separados por {0}>\n anexa no in\u00EDcio do caminho da classe de inicializa\u00E7\u00E3o\n -Xdiag mostra mensagens de diagn\u00F3stico adicionais\n -Xnoclassgc desativa a coleta de lixo da classe\n -Xincgc ativa a coleta de lixo incremental\n -Xloggc:<arquivo> registra o status do GC status em um arquivo com marca\u00E7\u00F5es de data e hor\u00E1rio\n -Xbatch desativa a compila\u00E7\u00E3o em segundo plano\n -Xms<tamanho> define o tamanho inicial do heap Java\n -Xmx<tamanho> define o tamanho m\u00E1ximo do heap Java\n -Xss<tamanho> define o tamanho da pilha de threads java\n -Xprof produz dados de perfil da cpu\n -Xfuture ativa verifica\u00E7\u00F5es de n\u00EDvel m\u00E1ximo de exig\u00EAncia, prevendo o valor default futuro\n -Xrs reduz o uso de sinais do SO pelo(a) Java/VM (consulte a documenta\u00E7\u00E3o)\n -Xcheck:jni executa verifica\u00E7\u00F5es adicionais de fun\u00E7\u00F5es da JNI\n -Xshare:off n\u00E3o tenta usar dados da classe compartilhada\n -Xshare:auto se poss\u00EDvel, usa dados da classe compartilhada (default)\n -Xshare:on requer o uso de dados da classe compartilhada, caso contr\u00E1rio haver\u00E1 falha.\n -XshowSettings mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:all\n mostra todas as defini\u00E7\u00F5es e continua\n -XshowSettings:vm mostra todas as defini\u00E7\u00F5es relacionadas \u00E0 vm e continua\n -XshowSettings:properties\n mostra todas as defini\u00E7\u00F5es da propriedade e continua\n -XshowSettings:locale\n mostra todas as defini\u00E7\u00F5es relativas \u00E0s configura\u00E7\u00F5es regionais e continua\n\nAs -X options n\u00E3o s\u00E3o padronizadas e est\u00E3o sujeitas a altera\u00E7\u00F5es sem aviso.\n
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Erro: ocorreu um erro inesperado ao tentar abrir o arquivo {0}
java.launcher.jar.error2=manifesto n\u00E3o encontrado em {0}
java.launcher.jar.error3=nenhum atributo de manifesto principal em {0}
-java.launcher.jar.error4=nenhum atributo de manifesto de Perfil em {0}
-java.launcher.jar.error5=O perfil {0} exigido por {1} n\u00E3o \u00E9 suportado por este runtime
java.launcher.init.error=erro de inicializa\u00E7\u00E3o
java.launcher.javafx.error1=Erro: O m\u00E9todo launchApplication do JavaFX tem a assinatura errada. Ele\\ndeve ser declarado como est\u00E1tico e retornar um valor do tipo void
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_sv.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_sv.properties Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,5 @@
java.launcher.jar.error1=Fel: Ett ov\u00E4ntat fel intr\u00E4ffade n\u00E4r filen {0} skulle \u00F6ppnas
java.launcher.jar.error2=manifest finns inte i {0}
java.launcher.jar.error3=inget huvudmanifestattribut i {0}
-java.launcher.jar.error4=inget profilmanifestattribut i {0}
-java.launcher.jar.error5=Profil {0} som kr\u00E4vs av {1} kan inte anv\u00E4ndas av den h\u00E4r k\u00F6rningen
java.launcher.init.error=initieringsfel
java.launcher.javafx.error1=Fel: JavaFX launchApplication-metoden har fel signatur, den \nm\u00E5ste ha deklarerats som statisk och returnera ett v\u00E4rde av typen void
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,5 @@
java.launcher.jar.error1=\u9519\u8BEF: \u5C1D\u8BD5\u6253\u5F00\u6587\u4EF6{0}\u65F6\u51FA\u73B0\u610F\u5916\u9519\u8BEF
java.launcher.jar.error2=\u5728{0}\u4E2D\u627E\u4E0D\u5230\u6E05\u5355
java.launcher.jar.error3={0}\u4E2D\u6CA1\u6709\u4E3B\u6E05\u5355\u5C5E\u6027
-java.launcher.jar.error4={0}\u4E2D\u6CA1\u6709\u914D\u7F6E\u6587\u4EF6\u6E05\u5355\u5C5E\u6027
-java.launcher.jar.error5=\u6B64\u8FD0\u884C\u65F6\u4E0D\u652F\u6301{1}\u6240\u9700\u7684\u914D\u7F6E\u6587\u4EF6{0}
java.launcher.init.error=\u521D\u59CB\u5316\u9519\u8BEF
java.launcher.javafx.error1=\u9519\u8BEF: JavaFX launchApplication \u65B9\u6CD5\u5177\u6709\u9519\u8BEF\u7684\u7B7E\u540D, \u5FC5\u987B\n\u5C06\u65B9\u6CD5\u58F0\u660E\u4E3A\u9759\u6001\u65B9\u6CD5\u5E76\u8FD4\u56DE\u7A7A\u7C7B\u578B\u7684\u503C
--- a/jdk/src/share/classes/sun/launcher/resources/launcher_zh_TW.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/launcher/resources/launcher_zh_TW.properties Thu Oct 03 19:18:54 2013 +0100
@@ -50,7 +50,5 @@
java.launcher.jar.error1=\u932F\u8AA4: \u5617\u8A66\u958B\u555F\u6A94\u6848 {0} \u6642\u767C\u751F\u672A\u9810\u671F\u7684\u932F\u8AA4
java.launcher.jar.error2=\u5728 {0} \u4E2D\u627E\u4E0D\u5230\u8CC7\u8A0A\u6E05\u55AE
java.launcher.jar.error3={0} \u4E2D\u6C92\u6709\u4E3B\u8981\u8CC7\u8A0A\u6E05\u55AE\u5C6C\u6027
-java.launcher.jar.error4={0} \u4E2D\u6C92\u6709 Profile \u8CC7\u8A0A\u6E05\u55AE\u5C6C\u6027
-java.launcher.jar.error5=\u6B64\u7A0B\u5F0F\u5BE6\u969B\u57F7\u884C\u4E0D\u652F\u63F4 {1} \u6240\u9700\u7684\u8A2D\u5B9A\u6A94 {0}
java.launcher.init.error=\u521D\u59CB\u5316\u932F\u8AA4
java.launcher.javafx.error1=\u932F\u8AA4: JavaFX launchApplication \u65B9\u6CD5\u7684\u7C3D\u7AE0\u932F\u8AA4\uFF0C\u5B83\n\u5FC5\u9808\u5BA3\u544A\u70BA\u975C\u614B\u4E26\u50B3\u56DE void \u985E\u578B\u7684\u503C
--- a/jdk/src/share/classes/sun/print/resources/serviceui_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -17,8 +17,8 @@
button.properties=E&igenschaften...
#
checkbox.collate=&Sortieren
-checkbox.jobsheets=&Bannerseite
-checkbox.printtofile=Ausgabe in &Datei
+checkbox.jobsheets=Banner&seite
+checkbox.printtofile=Aus&gabe in Datei
#
dialog.printtitle=Drucken
dialog.pstitle=Seite einrichten
@@ -29,7 +29,7 @@
dialog.writeerror=Schreiben in Datei nicht m\u00F6glich:
#
label.info=Info:
-label.jobname=&Job-Name:
+label.jobname=&Jobname:
label.numcopies=Anzahl &Kopien:
label.priority=P&riorit\u00E4t:
label.psname=&Name:
@@ -42,21 +42,21 @@
label.millimetres=(mm)
label.inches=(Zoll)
label.topmargin=&oben
-label.bottommargin=&unten
+label.bottommargin=u&nten
label.leftmargin=&links
-label.rightmargin=&rechts
+label.rightmargin=re&chts
#
radiobutton.color=&Farbe
radiobutton.draftq=Ent&wurf
-radiobutton.duplex=&Duplex
+radiobutton.duplex=Du&plex
radiobutton.highq=&Hoch
-radiobutton.landscape=&Querformat
+radiobutton.landscape=Querforma&t
radiobutton.monochrome=&Monochrom
radiobutton.normalq=&Normal
-radiobutton.oneside=&Einseitig
+radiobutton.oneside=E&inseitig
radiobutton.portrait=Hochfor&mat
radiobutton.rangeall=A&lle
-radiobutton.rangepages=S&eiten
+radiobutton.rangepages=Sei&ten
radiobutton.revlandscape=Umgekehrtes Q&uerformat
radiobutton.revportrait=Umgekehrtes &Hochformat
radiobutton.tumble=&Kalenderdruck
--- a/jdk/src/share/classes/sun/print/resources/serviceui_es.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_es.properties Thu Oct 03 19:18:54 2013 +0100
@@ -36,29 +36,29 @@
label.pstype=Tipo:
label.rangeto=A
label.size=Tama&\u00F1o:
-label.source=Ori&gen:
+label.source=Orig&en:
label.status=Estado:
label.username=&Usuario:
label.millimetres=(mm)
label.inches=(pulg.)
-label.topmargin=&superior
+label.topmargin=s&uperior
label.bottommargin=in&ferior
label.leftmargin=iz&quierdo
label.rightmargin=d&erecho
#
radiobutton.color=&Color
-radiobutton.draftq=Bo&rrador
+radiobutton.draftq=B&orrador
radiobutton.duplex=&D\u00FAplex
-radiobutton.highq=&Alta
+radiobutton.highq=Al&ta
radiobutton.landscape=Hori&zontal
radiobutton.monochrome=&Monocromo
radiobutton.normalq=&Normal
radiobutton.oneside=Una Ca&ra
radiobutton.portrait=&Vertical
radiobutton.rangeall=&Todo
-radiobutton.rangepages=P\u00E1&ginas
+radiobutton.rangepages=P\u00E1gina&s
radiobutton.revlandscape=&Horizontal Inverso
-radiobutton.revportrait=Vertical Inver&so
+radiobutton.revportrait=Vertical I&nverso
radiobutton.tumble=Cam&bio de Cara
# The vkMnemonics correspond with the constants defined in KeyEvent, eg
# 65 = KeyEvent.VK_A
--- a/jdk/src/share/classes/sun/print/resources/serviceui_fr.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_fr.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,7 @@
dialog.writeerror=Impossible d'\u00E9crire dans le fichier :
#
label.info=Infos :
-label.jobname=Nom du &travail :
+label.jobname=Nom du tra&vail :
label.numcopies=Nombre de c&opies :
label.priority=P&riorit\u00E9 :
label.psname=&Nom :
@@ -38,22 +38,22 @@
label.size=Tai&lle :
label.source=Sour&ce :
label.status=Statut :
-label.username=Nom &utilisateur :
+label.username=Nom ut&ilisateur :
label.millimetres=(mm)
label.inches=(po)
label.topmargin=&haut
label.bottommargin=&bas
-label.leftmargin=&gauche
+label.leftmargin=gauc&he
label.rightmargin=&droite
#
-radiobutton.color=Coule&ur
+radiobutton.color=Coul&eur
radiobutton.draftq=Broui&llon
radiobutton.duplex=&Duplex
radiobutton.highq=Ma&x.
-radiobutton.landscape=Pay&sage
-radiobutton.monochrome=&Monochrome
+radiobutton.landscape=Pa&ysage
+radiobutton.monochrome=Monoc&hrome
radiobutton.normalq=&Normal
-radiobutton.oneside=&Un c\u00F4t\u00E9
+radiobutton.oneside=Un &c\u00F4t\u00E9
radiobutton.portrait=&Portrait
radiobutton.rangeall=&Tout
radiobutton.rangepages=Pag&es
@@ -64,7 +64,7 @@
# 65 = KeyEvent.VK_A
tab.appearance=&Apparence
tab.general=&G\u00E9n\u00E9ral
-tab.pagesetup=Mi&se en page
+tab.pagesetup=&Mise en page
#
error.pagerange=Plage de pages non valide. Sp\u00E9cifiez les valeurs de nouveau (ex. : 1-3,5,7-10)
error.destination=Nom de fichier non valide ; recommencez
--- a/jdk/src/share/classes/sun/print/resources/serviceui_it.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_it.properties Thu Oct 03 19:18:54 2013 +0100
@@ -47,8 +47,8 @@
label.rightmargin=&destro
#
radiobutton.color=&Colore
-radiobutton.draftq=&Bozza
-radiobutton.duplex=F&ronte retro
+radiobutton.draftq=Bo&zza
+radiobutton.duplex=&Fronte retro
radiobutton.highq=A<a
radiobutton.landscape=Orizzonta&le
radiobutton.monochrome=Monocrom&atico
@@ -62,7 +62,7 @@
radiobutton.tumble=La&to corto
# The vkMnemonics correspond with the constants defined in KeyEvent, eg
# 65 = KeyEvent.VK_A
-tab.appearance=&Aspetto
+tab.appearance=As&petto
tab.general=&Generale
tab.pagesetup=Impo&sta pagina
#
--- a/jdk/src/share/classes/sun/print/resources/serviceui_pt_BR.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_pt_BR.properties Thu Oct 03 19:18:54 2013 +0100
@@ -31,7 +31,7 @@
label.info=Informa\u00E7\u00F5es:
label.jobname=Nome do &Job:
label.numcopies=N\u00FAmer&o de c\u00F3pias:
-label.priority=P&rioridade:
+label.priority=Pri&oridade:
label.psname=&Nome:
label.pstype=Tipo:
label.rangeto=At\u00E9
@@ -44,27 +44,27 @@
label.topmargin=&superior
label.bottommargin=&inferior
label.leftmargin=es&querda:
-label.rightmargin=di&reita
+label.rightmargin=&direita
#
-radiobutton.color=C&or
-radiobutton.draftq=&Rascunho
-radiobutton.duplex=&Duplex
-radiobutton.highq=&Alta
+radiobutton.color=&Cor
+radiobutton.draftq=Rascun&ho
+radiobutton.duplex=Duple&x
+radiobutton.highq=A<a
radiobutton.landscape=&Paisagem
radiobutton.monochrome=&Monocrom\u00E1tico
radiobutton.normalq=&Normal
-radiobutton.oneside=Um Lad&o
-radiobutton.portrait=&Retrato
+radiobutton.oneside=Um La&do
+radiobutton.portrait=Re&trato
radiobutton.rangeall=T&udo
radiobutton.rangepages=&P\u00E1ginas
radiobutton.revlandscape=Paisagem I&nvertida
-radiobutton.revportrait=Retrato &Invertido
+radiobutton.revportrait=Retrato In&vertido
radiobutton.tumble=&Virar
# The vkMnemonics correspond with the constants defined in KeyEvent, eg
# 65 = KeyEvent.VK_A
-tab.appearance=&Apar\u00EAncia
+tab.appearance=Apa&r\u00EAncia
tab.general=&Geral
-tab.pagesetup=Configura\u00E7\u00E3o de &P\u00E1gina
+tab.pagesetup=Con&figura\u00E7\u00E3o da P\u00E1gina
#
error.pagerange=Faixa de p\u00E1ginas inv\u00E1lida; insira novamente os valores (por exemplo, 1-3,5,7-10)
error.destination=Nome de arquivo inv\u00E1lido; tente novamente
--- a/jdk/src/share/classes/sun/print/resources/serviceui_sv.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/print/resources/serviceui_sv.properties Thu Oct 03 19:18:54 2013 +0100
@@ -17,7 +17,7 @@
button.properties=&Egenskaper...
#
checkbox.collate=&Sortera
-checkbox.jobsheets=&F\u00F6rs\u00E4ttsblad
+checkbox.jobsheets=F&\u00F6rs\u00E4ttsblad
checkbox.printtofile=Skriv ut till &fil
#
dialog.printtitle=Skriv ut
@@ -30,13 +30,13 @@
#
label.info=Information:
label.jobname=&Utskrift:
-label.numcopies=Antal &exemplar:
+label.numcopies=Antal e&xemplar:
label.priority=P&rioritet:
label.psname=&Namn:
label.pstype=Typ:
label.rangeto=Till
label.size=Stor&lek:
-label.source=K\u00E4l&la:
+label.source=&K\u00E4lla:
label.status=Status:
label.username=A&nv\u00E4ndarnamn:
label.millimetres=(mm)
@@ -50,7 +50,7 @@
radiobutton.draftq=Utka&st
radiobutton.duplex=&Dubbelsidig
radiobutton.highq=&H\u00F6g
-radiobutton.landscape=&Liggande
+radiobutton.landscape=Liggan&de
radiobutton.monochrome=&Monokrom
radiobutton.normalq=&Normal
radiobutton.oneside=&Ensidig
@@ -62,9 +62,9 @@
radiobutton.tumble=&V\u00E4nd
# The vkMnemonics correspond with the constants defined in KeyEvent, eg
# 65 = KeyEvent.VK_A
-tab.appearance=&Format
+tab.appearance=Fo&rmat
tab.general=&Allm\u00E4nt
-tab.pagesetup=Utskrifts&format
+tab.pagesetup=&Utskriftsformat
#
error.pagerange=Ogiltigt sidintervall. Skriv in v\u00E4rdena igen (t ex 1-3,5,7-10)
error.destination=Ogiltigt filnamn. F\u00F6rs\u00F6k igen.
--- a/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/rmi/registry/resources/rmiregistry_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -24,5 +24,5 @@
# questions.
#
-rmiregistry.usage=Verwendung: {0} <Optionen> <Port>\n\nwobei die <Optionen> Folgendes beinhalten:\n -J <Laufzeitkennzeichen> Argument an den Java-Interpreter \u00FCbergeben
+rmiregistry.usage=Verwendung: {0} <Optionen> <Port>\n\nwobei die <Optionen> Folgendes beinhalten:\n -J<Laufzeitkennzeichen> Argument an den Java-Interpreter \u00FCbergeben
rmiregistry.port.badnumber=Portargument {0} ist keine Zahl.
--- a/jdk/src/share/classes/sun/rmi/server/resources/rmid_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/rmi/server/resources/rmid_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -87,7 +87,7 @@
rmid.restart.service.warning=\nrmid: (\uACBD\uACE0) \uC11C\uBE44\uC2A4 \uC7AC\uC2DC\uC791\uC73C\uB85C \uC778\uD574 \uBC1C\uC0DD\uD55C \uC624\uB958:
# "rmid" should not be translated
-rmid.log.update.warning=\nrmid: (\uACBD\uACE0) \uB85C\uADF8 \uAC31\uC2E0\uC73C\uB85C \uC778\uD574 \uBC1C\uC0DD\uD55C \uC624\uB958:
+rmid.log.update.warning=\nrmid: (\uACBD\uACE0) \uB85C\uADF8 \uC5C5\uB370\uC774\uD2B8\uB85C \uC778\uD574 \uBC1C\uC0DD\uD55C \uC624\uB958:
# "rmid" should not be translated
rmid.log.snapshot.warning=\nrmid: (\uC2EC\uAC01) \uB85C\uADF8 \uC2A4\uB0C5\uC0F7\uC73C\uB85C \uC778\uD574 \uBC1C\uC0DD\uD55C \uC624\uB958:
--- a/jdk/src/share/classes/sun/security/krb5/Config.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/krb5/Config.java Thu Oct 03 19:18:54 2013 +0100
@@ -225,19 +225,19 @@
* and has no sub-key at all (given "forwardable" is defined, otherwise,
* this method has no knowledge if it's a value name or a section name),
*/
- @SuppressWarnings("unchecked")
public String get(String... keys) {
- Vector<String> v = get0(keys);
+ Vector<String> v = getString0(keys);
if (v == null) return null;
return v.lastElement();
}
/**
* Gets all values for the specified keys.
- * @see #get(java.lang.String[])
+ * @throws IllegalArgumentException if any of the keys is illegal
+ * (See {@link #get})
*/
public String getAll(String... keys) {
- Vector<String> v = get0(keys);
+ Vector<String> v = getString0(keys);
if (v == null) return null;
StringBuilder sb = new StringBuilder();
boolean first = true;
@@ -252,17 +252,37 @@
return sb.toString();
}
- // Internal method. Returns the vector of strings for keys.
+ /**
+ * Returns true if keys exists, can be either final string(s) or sub-stanza
+ * @throws IllegalArgumentException if any of the keys is illegal
+ * (See {@link #get})
+ */
+ public boolean exists(String... keys) {
+ return get0(keys) != null;
+ }
+
+ // Returns final string value(s) for given keys.
+ @SuppressWarnings("unchecked")
+ private Vector<String> getString0(String... keys) {
+ try {
+ return (Vector<String>)get0(keys);
+ } catch (ClassCastException cce) {
+ throw new IllegalArgumentException(cce);
+ }
+ }
+
+ // Internal method. Returns the value for keys, which can be a sub-stanza
+ // or final string value(s).
// The only method (except for toString) that reads stanzaTable directly.
@SuppressWarnings("unchecked")
- private Vector<String> get0(String... keys) {
+ private Object get0(String... keys) {
Object current = stanzaTable;
try {
for (String key: keys) {
current = ((Hashtable<String,Object>)current).get(key);
if (current == null) return null;
}
- return (Vector<String>)current;
+ return current;
} catch (ClassCastException cce) {
throw new IllegalArgumentException(cce);
}
--- a/jdk/src/share/classes/sun/security/krb5/Realm.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/krb5/Realm.java Thu Oct 03 19:18:54 2013 +0100
@@ -34,10 +34,8 @@
import sun.security.krb5.internal.Krb5;
import sun.security.util.*;
import java.io.IOException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.Stack;
-import java.util.EmptyStackException;
+import java.util.*;
+
import sun.security.krb5.internal.util.KerberosString;
/**
@@ -50,7 +48,6 @@
*/
public class Realm implements Cloneable {
private final String realm; // not null nor empty
- private static boolean DEBUG = Krb5.DEBUG;
public Realm(String name) throws RealmException {
realm = parseRealm(name);
@@ -233,90 +230,53 @@
}
}
- /*
- * First leg of realms parsing. Used by getRealmsList.
- */
- private static String[] doInitialParse(String cRealm, String sRealm)
- throws KrbException {
- if (cRealm == null || sRealm == null){
- throw new KrbException(Krb5.API_INVALID_ARG);
- }
- if (DEBUG) {
- System.out.println(">>> Realm doInitialParse: cRealm=["
- + cRealm + "], sRealm=[" +sRealm + "]");
- }
- if (cRealm.equals(sRealm)) {
- String[] retList = null;
- retList = new String[1];
- retList[0] = new String(cRealm);
-
- if (DEBUG) {
- System.out.println(">>> Realm doInitialParse: "
- + retList[0]);
- }
- return retList;
- }
- return null;
- }
-
/**
* Returns an array of realms that may be traversed to obtain
* a TGT from the initiating realm cRealm to the target realm
* sRealm.
* <br>
- * There may be an arbitrary number of intermediate realms
- * between cRealm and sRealm. The realms may be organized
- * organized hierarchically, or the paths between them may be
- * specified in the [capaths] stanza of the caller's
- * Kerberos configuration file. The configuration file is consulted
- * first. Then a hirarchical organization is assumed if no realms
- * are found in the configuration file.
+ * This method would read [capaths] to create a path, or generate a
+ * hierarchical path if [capaths] does not contain a sub-stanza for cRealm
+ * or the sub-stanza does not contain a tag for sRealm.
* <br>
- * The returned list, if not null, contains cRealm as the first
- * entry. sRealm is not included unless it is mistakenly listed
- * in the configuration file as an intermediary realm.
+ * The returned list would never be null, and it always contains
+ * cRealm as the head entry. sRealm is not included as the tail.
*
- * @param cRealm the initiating realm
- * @param sRealm the target realm
- * @returns array of realms
- * @thows KrbException
+ * @param cRealm the initiating realm, not null
+ * @param sRealm the target realm, not null, not equals to cRealm
+ * @returns array of realms including at least cRealm as the first
+ * element
*/
- public static String[] getRealmsList(String cRealm, String sRealm)
- throws KrbException {
- String[] retList = doInitialParse(cRealm, sRealm);
- if (retList != null && retList.length != 0) {
- return retList;
- }
- /*
- * Try [capaths].
- */
- retList = parseCapaths(cRealm, sRealm);
- if (retList != null && retList.length != 0) {
- return retList;
- }
- /*
- * Now assume the realms are organized hierarchically.
- */
- retList = parseHierarchy(cRealm, sRealm);
- return retList;
+ public static String[] getRealmsList(String cRealm, String sRealm) {
+ try {
+ // Try [capaths]
+ return parseCapaths(cRealm, sRealm);
+ } catch (KrbException ke) {
+ // Now assume the realms are organized hierarchically.
+ return parseHierarchy(cRealm, sRealm);
}
+ }
/**
- * Parses the [capaths] stanza of the configuration file
- * for a list of realms to traverse
- * to obtain credentials from the initiating realm cRealm to
- * the target realm sRealm.
- * @param cRealm the initiating realm
- * @param sRealm the target realm
- * @returns array of realms
- * @ throws KrbException
- */
-
- /*
- * parseCapaths works for a capaths organized such that
- * for a given client realm C there is a tag C that
- * contains subtags Ci ... Cn that completely define intermediate
- * realms from C to target T. For example:
+ * Parses the [capaths] stanza of the configuration file for a
+ * list of realms to traverse to obtain credentials from the
+ * initiating realm cRealm to the target realm sRealm.
+ *
+ * For a given client realm C there is a tag C in [capaths] whose
+ * subtag S has a value which is a (possibly partial) path from C
+ * to S. When the path is partial, it contains only the tail of the
+ * full path. Values of other subtags will be used to build the full
+ * path. The value "." means a direct path from C to S. If realm S
+ * does not appear as a subtag, there is no path defined here.
+ *
+ * The implementation ignores all values which equals to C or S, or
+ * a "." in multiple values, or any duplicated realm names.
+ *
+ * When a path value has more than two realms, they can be specified
+ * with multiple key-value pairs each having a single value, but the
+ * order must not change.
+ *
+ * For example:
*
* [capaths]
* TIVOLI.COM = {
@@ -325,357 +285,130 @@
* LDAPCENTRAL.NET = .
* }
*
- * The tag TIVOLI.COM contains subtags IBM.COM, IBM_LDAPCENTRAL.COM
- * and LDAPCENTRAL.NET that completely define the path from TIVOLI.COM
- * to IBM.COM (TIVOLI.COM->LADAPCENTRAL.NET->IBM_LDAPCENTRAL.COM->IBM
- * or TIVOLI.COM->MOONLITE.ORG->IBM.COM).
+ * TIVOLI.COM has a direct path to LDAPCENTRAL.NET, which has a direct
+ * path to IBM_LDAPCENTRAL.COM. It also has a partial path to IBM.COM
+ * being "IBM_LDAPCENTRAL.COM MOONLITE.ORG". Merging these info together,
+ * a full path from TIVOLI.COM to IBM.COM will be
+ *
+ * TIVOLI.COM -> LDAPCENTRAL.NET -> IBM_LDAPCENTRAL.COM
+ * -> IBM_LDAPCENTRAL.COM -> MOONLITE.ORG
+ *
+ * Please note the sRealm IBM.COM does not appear in the path.
*
- * A direct path is assumed for an intermediary whose entry is not
- * "closed" by a "." In the above example, TIVOLI.COM is assumed
- * to have a direct path to MOONLITE.ORG and MOONLITE.COM
- * in turn to IBM.COM.
+ * @param cRealm the initiating realm
+ * @param sRealm the target realm, not the same as cRealm
+ * @returns array of realms including at least cRealm as the first
+ * element
+ * @throws KrbException if the config does not contain a sub-stanza
+ * for cRealm in [capaths] or the sub-stanza does not contain
+ * sRealm as a tag
*/
-
- private static String[] parseCapaths(String cRealm, String sRealm) throws KrbException {
- String[] retList = null;
+ private static String[] parseCapaths(String cRealm, String sRealm)
+ throws KrbException {
- Config cfg = null;
- try {
- cfg = Config.getInstance();
- } catch (Exception exc) {
- if (DEBUG) {
- System.out.println ("Configuration information can not be " +
- "obtained " + exc.getMessage());
- }
- return null;
- }
+ // This line could throw a KrbException
+ Config cfg = Config.getInstance();
- String intermediaries = cfg.getAll("capaths", cRealm, sRealm);
-
- if (intermediaries == null) {
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: no cfg entry");
- }
- return null;
+ if (!cfg.exists("capaths", cRealm, sRealm)) {
+ throw new KrbException("No conf");
}
- String tempTarget = null, tempRealm = null;
- Stack<String> iStack = new Stack<>();
-
- /*
- * The half-established reversed-path, starting from the final target
- * (sRealm), each item can be connected to by the next one.
- * Might contains wrong item, if found, a bad track is performed
- */
- Vector<String> tempList = new Vector<>(8, 8);
- tempList.add(sRealm);
-
- int count = 0; // For debug only
- tempTarget = sRealm;
-
- out: do {
- if (DEBUG) {
- count++;
- System.out.println(">>> Realm parseCapaths: loop " +
- count + ": target=" + tempTarget);
- }
-
- if (intermediaries != null &&
- !intermediaries.equals(".") &&
- !intermediaries.equals(cRealm)) {
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: loop " +
- count + ": intermediaries=[" +
- intermediaries + "]");
- }
+ LinkedList<String> path = new LinkedList<>();
- /*
- * We have one or more space-separated intermediary realms.
- * Stack them. A null is always added between intermedies of
- * different targets. When this null is popped, it means none
- * of the intermedies for this target is useful (because of
- * infinite loop), the target is then removed from the partial
- * tempList, and the next possible intermediary is tried.
- */
- iStack.push(null);
- String[] ints = intermediaries.split("\\s+");
- for (int i = ints.length-1; i>=0; i--)
- {
- tempRealm = ints[i];
- if (tempRealm.equals(PrincipalName.REALM_COMPONENT_SEPARATOR_STR)) {
- break out;
- }
- if (!tempList.contains(tempRealm)) {
- iStack.push(tempRealm);
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: loop " +
- count +
- ": pushed realm on to stack: " +
- tempRealm);
- }
- } else if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: loop " +
- count +
- ": ignoring realm: [" +
- tempRealm + "]");
- }
- }
- } else {
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: loop " +
- count +
- ": no intermediaries");
- }
+ String head = sRealm;
+ while (true) {
+ String value = cfg.getAll("capaths", cRealm, head);
+ if (value == null) {
break;
}
-
- /*
- * Get next intermediary realm from the stack
- */
-
- try {
- while ((tempTarget = iStack.pop()) == null) {
- tempList.removeElementAt(tempList.size()-1);
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: backtrack, remove tail");
- }
+ String[] more = value.split("\\s+");
+ boolean changed = false;
+ for (int i=more.length-1; i>=0; i--) {
+ if (path.contains(more[i])
+ || more[i].equals(".")
+ || more[i].equals(cRealm)
+ || more[i].equals(sRealm)
+ || more[i].equals(head)) {
+ // Ignore invalid values
+ continue;
}
- } catch (EmptyStackException exc) {
- tempTarget = null;
- }
-
- if (tempTarget == null) {
- /*
- * No more intermediaries. We're done.
- */
- break;
+ changed = true;
+ path.addFirst(more[i]);
}
-
- tempList.add(tempTarget);
-
- if (DEBUG) {
- System.out.println(">>> Realm parseCapaths: loop " + count +
- ": added intermediary to list: " +
- tempTarget);
- }
-
- intermediaries = cfg.getAll("capaths", cRealm, tempTarget);
-
- } while (true);
-
- if (tempList.isEmpty()) {
- return null;
+ if (!changed) break;
+ head = path.getFirst();
}
-
- // From (SREALM, T1, T2) to (CREALM, T2, T1)
- retList = new String[tempList.size()];
- retList[0] = cRealm;
- for (int i=1; i<tempList.size(); i++) {
- retList[i] = tempList.elementAt(tempList.size()-i);
- }
-
- if (DEBUG && retList != null) {
- for (int i = 0; i < retList.length; i++) {
- System.out.println(">>> Realm parseCapaths [" + i +
- "]=" + retList[i]);
- }
- }
-
- return retList;
- }
+ path.addFirst(cRealm);
+ return path.toArray(new String[path.size()]);
+ }
/**
* Build a list of realm that can be traversed
* to obtain credentials from the initiating realm cRealm
* for a service in the target realm sRealm.
* @param cRealm the initiating realm
- * @param sRealm the target realm
- * @returns array of realms
- * @throws KrbException
+ * @param sRealm the target realm, not the same as cRealm
+ * @returns array of realms including cRealm as the first element
*/
- private static String[] parseHierarchy(String cRealm, String sRealm)
- throws KrbException
- {
- String[] retList = null;
-
- // Parse the components and determine common part, if any.
-
- String[] cComponents = null;
- String[] sComponents = null;
-
- StringTokenizer strTok =
- new StringTokenizer(cRealm,
- PrincipalName.REALM_COMPONENT_SEPARATOR_STR);
-
- // Parse cRealm
+ private static String[] parseHierarchy(String cRealm, String sRealm) {
- int cCount = strTok.countTokens();
- cComponents = new String[cCount];
-
- for (cCount = 0; strTok.hasMoreTokens(); cCount++) {
- cComponents[cCount] = strTok.nextToken();
- }
-
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy: cRealm has " +
- cCount + " components:");
- int j = 0;
- while (j < cCount) {
- System.out.println(">>> Realm parseHierarchy: " +
- "cComponents["+j+"]=" + cComponents[j++]);
- }
- }
-
- // Parse sRealm
-
- strTok = new StringTokenizer(sRealm,
- PrincipalName.REALM_COMPONENT_SEPARATOR_STR);
+ String[] cComponents = cRealm.split("\\.");
+ String[] sComponents = sRealm.split("\\.");
- int sCount = strTok.countTokens();
- sComponents = new String[sCount];
-
- for (sCount = 0; strTok.hasMoreTokens(); sCount++) {
- sComponents[sCount] = strTok.nextToken();
- }
-
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy: sRealm has " +
- sCount + " components:");
- int j = 0;
- while (j < sCount) {
- System.out.println(">>> Realm parseHierarchy: sComponents["+j+
- "]=" + sComponents[j++]);
- }
- }
-
- // Determine common components, if any.
-
- int commonComponents = 0;
+ int cPos = cComponents.length;
+ int sPos = sComponents.length;
- //while (sCount > 0 && cCount > 0 &&
- // sComponents[--sCount].equals(cComponents[--cCount]))
-
- for (sCount--, cCount--; sCount >=0 && cCount >= 0 &&
- sComponents[sCount].equals(cComponents[cCount]);
- sCount--, cCount--) {
- commonComponents++;
- }
-
- int cCommonStart = -1;
- int sCommonStart = -1;
-
- int links = 0;
-
- if (commonComponents > 0) {
- sCommonStart = sCount+1;
- cCommonStart = cCount+1;
-
- // components from common to ancestors
- links += sCommonStart;
- links += cCommonStart;
- } else {
- links++;
+ boolean hasCommon = false;
+ for (sPos--, cPos--; sPos >=0 && cPos >= 0 &&
+ sComponents[sPos].equals(cComponents[cPos]);
+ sPos--, cPos--) {
+ hasCommon = true;
}
- if (DEBUG) {
- if (commonComponents > 0) {
- System.out.println(">>> Realm parseHierarchy: " +
- commonComponents + " common component" +
- (commonComponents > 1 ? "s" : " "));
+ // For those with common components:
+ // length pos
+ // SITES1.SALES.EXAMPLE.COM 4 1
+ // EVERYWHERE.EXAMPLE.COM 3 0
- System.out.println(">>> Realm parseHierarchy: common part "
- +
- "in cRealm (starts at index " +
- cCommonStart + ")");
- System.out.println(">>> Realm parseHierarchy: common part in sRealm (starts at index " +
- sCommonStart + ")");
-
+ // For those without common components:
+ // length pos
+ // DEVEL.EXAMPLE.COM 3 2
+ // PROD.EXAMPLE.ORG 3 2
- String commonPart = substring(cRealm, cCommonStart);
- System.out.println(">>> Realm parseHierarchy: common part in cRealm=" +
- commonPart);
+ LinkedList<String> path = new LinkedList<>();
- commonPart = substring(sRealm, sCommonStart);
- System.out.println(">>> Realm parseHierarchy: common part in sRealm=" +
- commonPart);
-
- } else
- System.out.println(">>> Realm parseHierarchy: no common part");
+ // Un-common ones for client side
+ for (int i=0; i<=cPos; i++) {
+ path.addLast(subStringFrom(cComponents, i));
}
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy: total links=" + links);
- }
-
- retList = new String[links];
-
- retList[0] = new String(cRealm);
-
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy A: retList[0]=" +
- retList[0]);
+ // Common one
+ if (hasCommon) {
+ path.addLast(subStringFrom(cComponents, cPos+1));
}
- // For an initiator realm A.B.C.D.COM,
- // build a list krbtgt/B.C.D.COM@A.B.C.D.COM up to the common part,
- // ie the issuer realm is the immediate descendant
- // of the target realm.
-
- String cTemp = null, sTemp = null;
- int i;
- for (i = 1, cCount = 0; i < links && cCount < cCommonStart; cCount++) {
- sTemp = substring(cRealm, cCount+1);
- //cTemp = substring(cRealm, cCount);
- retList[i++] = new String(sTemp);
-
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy B: retList[" +
- (i-1) +"]="+retList[i-1]);
- }
+ // Un-common ones for server side
+ for (int i=sPos; i>=0; i--) {
+ path.addLast(subStringFrom(sComponents, i));
}
+ // Remove sRealm from path. Note that it might be added at last loop
+ // or as a common component, if sRealm is a parent of cRealm
+ path.removeLast();
- for (sCount = sCommonStart; i < links && sCount - 1 > 0; sCount--) {
- sTemp = substring(sRealm, sCount-1);
- //cTemp = substring(sRealm, sCount);
- retList[i++] = new String(sTemp);
- if (DEBUG) {
- System.out.println(">>> Realm parseHierarchy D: retList[" +
- (i-1) +"]="+retList[i-1]);
- }
- }
-
- return retList;
+ return path.toArray(new String[path.size()]);
}
- private static String substring(String realm, int componentIndex)
- {
- int i = 0 , j = 0, len = realm.length();
-
- while(i < len && j != componentIndex) {
- if (realm.charAt(i++) != PrincipalName.REALM_COMPONENT_SEPARATOR)
- continue;
- j++;
+ /**
+ * Creates a realm name using components from the given postion.
+ * For example, subStringFrom({"A", "B", "C"}, 1) is "B.C".
+ */
+ private static String subStringFrom(String[] components, int from) {
+ StringBuilder sb = new StringBuilder();
+ for (int i=from; i<components.length; i++) {
+ if (sb.length() != 0) sb.append('.');
+ sb.append(components[i]);
}
-
- return realm.substring(i);
- }
-
- static int getRandIndex(int arraySize) {
- return (int)(Math.random() * 16384.0) % arraySize;
+ return sb.toString();
}
-
- static void printNames(String[] names) {
- if (names == null || names.length == 0)
- return;
-
- int len = names.length;
- int i = 0;
- System.out.println("List length = " + len);
- while (i < names.length) {
- System.out.println("["+ i +"]=" + names[i]);
- i++;
- }
- }
-
}
--- a/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/krb5/internal/CredentialsUtil.java Thu Oct 03 19:18:54 2013 +0100
@@ -160,7 +160,7 @@
/**
* Gets a TGT to another realm
* @param localRealm this realm
- * @param serviceRealm the other realm
+ * @param serviceRealm the other realm, cannot equals to localRealm
* @param ccreds TGT in this realm
* @param okAsDelegate an [out] argument to receive the okAsDelegate
* property. True only if all realms allow delegation.
@@ -174,14 +174,6 @@
// Get a list of realms to traverse
String[] realms = Realm.getRealmsList(localRealm, serviceRealm);
- if (realms == null || realms.length == 0) {
- if (DEBUG) {
- System.out.println(
- ">>> Credentials acquireServiceCreds: no realms list");
- }
- return null;
- }
-
int i = 0, k = 0;
Credentials cTgt = null, newTgt = null, theTgt = null;
PrincipalName tempService = null;
@@ -206,16 +198,14 @@
if (newTgt == null) {
if (DEBUG) {
System.out.println(">>> Credentials acquireServiceCreds: "
- + "no tgt; searching backwards");
+ + "no tgt; searching thru capath");
}
/*
- * No tgt found. Try to get one for a
- * realm as close to the target as possible.
- * That means traversing the realms list backwards.
+ * No tgt found. Let's go thru the realms list one by one.
*/
- for (newTgt = null, k = realms.length - 1;
- newTgt == null && k > i; k--) {
+ for (newTgt = null, k = i+1;
+ newTgt == null && k < realms.length; k++) {
tempService = PrincipalName.tgsService(realms[k], realms[i]);
if (DEBUG) {
System.out.println(
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java Thu Oct 03 19:18:54 2013 +0100
@@ -57,49 +57,51 @@
{".jarsigner.verify.options.jar.file.alias.",
" jarsigner -verify [options] jar-file [alias...]"},
{".keystore.url.keystore.location",
- "[-keystore <url>] \u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4F4D\u7F6E"},
+ "[-keystore <url>] \u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4F4D\u7F6E"},
{".storepass.password.password.for.keystore.integrity",
- "[-storepass <password>] \u30AD\u30FC\u30B9\u30C8\u30A2\u6574\u5408\u6027\u306E\u305F\u3081\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"},
+ "[-storepass <password>] \u30AD\u30FC\u30B9\u30C8\u30A2\u6574\u5408\u6027\u306E\u305F\u3081\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"},
{".storetype.type.keystore.type",
- "[-storetype <type>] \u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u578B"},
+ "[-storetype <type>] \u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u578B"},
{".keypass.password.password.for.private.key.if.different.",
- "[-keypass <password>] \u79D8\u5BC6\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9(\u7570\u306A\u308B\u5834\u5408)"},
+ "[-keypass <password>] \u79D8\u5BC6\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9(\u7570\u306A\u308B\u5834\u5408)"},
{".certchain.file.name.of.alternative.certchain.file",
"[-certchain <file>] \u4EE3\u66FF\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D"},
{".sigfile.file.name.of.SF.DSA.file",
- "[-sigfile <file>] .SF/.DSA\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D"},
+ "[-sigfile <file>] .SF/.DSA\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D"},
{".signedjar.file.name.of.signed.JAR.file",
- "[-signedjar <file>] \u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D"},
+ "[-signedjar <file>] \u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u306E\u540D\u524D"},
{".digestalg.algorithm.name.of.digest.algorithm",
- "[-digestalg <algorithm>] \u30C0\u30A4\u30B8\u30A7\u30B9\u30C8\u30FB\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u540D\u524D"},
+ "[-digestalg <algorithm>] \u30C0\u30A4\u30B8\u30A7\u30B9\u30C8\u30FB\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u540D\u524D"},
{".sigalg.algorithm.name.of.signature.algorithm",
- "[-sigalg <algorithm>] \u30B7\u30B0\u30CD\u30C1\u30E3\u30FB\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u540D\u524D"},
+ "[-sigalg <algorithm>] \u30B7\u30B0\u30CD\u30C1\u30E3\u30FB\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u306E\u540D\u524D"},
{".verify.verify.a.signed.JAR.file",
- "[-verify] \u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u306E\u691C\u8A3C"},
+ "[-verify] \u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u306E\u691C\u8A3C"},
{".verbose.suboptions.verbose.output.when.signing.verifying.",
"[-verbose[:suboptions]] \u7F72\u540D/\u691C\u8A3C\u6642\u306E\u8A73\u7D30\u51FA\u529B\u3002"},
{".suboptions.can.be.all.grouped.or.summary",
" \u30B5\u30D6\u30AA\u30D7\u30B7\u30E7\u30F3\u3068\u3057\u3066\u3001\u3059\u3079\u3066\u3001\u30B0\u30EB\u30FC\u30D7\u307E\u305F\u306F\u30B5\u30DE\u30EA\u30FC\u3092\u4F7F\u7528\u3067\u304D\u307E\u3059"},
{".certs.display.certificates.when.verbose.and.verifying",
- "[-certs] \u8A73\u7D30\u51FA\u529B\u304A\u3088\u3073\u691C\u8A3C\u6642\u306B\u8A3C\u660E\u66F8\u3092\u8868\u793A"},
+ "[-certs] \u8A73\u7D30\u51FA\u529B\u304A\u3088\u3073\u691C\u8A3C\u6642\u306B\u8A3C\u660E\u66F8\u3092\u8868\u793A"},
{".tsa.url.location.of.the.Timestamping.Authority",
- "[-tsa <url>] \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u5C40\u306E\u5834\u6240"},
+ "[-tsa <url>] \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u5C40\u306E\u5834\u6240"},
{".tsacert.alias.public.key.certificate.for.Timestamping.Authority",
- "[-tsacert <alias>] \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u5C40\u306E\u516C\u958B\u9375\u8A3C\u660E\u66F8"},
+ "[-tsacert <alias>] \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u5C40\u306E\u516C\u958B\u9375\u8A3C\u660E\u66F8"},
+ {".tsapolicyid.tsapolicyid.for.Timestamping.Authority",
+ "[-tsapolicyid <oid>] \u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u5C40\u306ETSAPolicyID"},
{".altsigner.class.class.name.of.an.alternative.signing.mechanism",
- "[-altsigner <class>] \u4EE3\u66FF\u7F72\u540D\u30E1\u30AB\u30CB\u30BA\u30E0\u306E\u30AF\u30E9\u30B9\u540D"},
+ "[-altsigner <class>] \u4EE3\u66FF\u7F72\u540D\u30E1\u30AB\u30CB\u30BA\u30E0\u306E\u30AF\u30E9\u30B9\u540D"},
{".altsignerpath.pathlist.location.of.an.alternative.signing.mechanism",
- "[-altsignerpath <pathlist>]\u4EE3\u66FF\u7F72\u540D\u30E1\u30AB\u30CB\u30BA\u30E0\u306E\u4F4D\u7F6E"},
+ "[-altsignerpath <pathlist>] \u4EE3\u66FF\u7F72\u540D\u30E1\u30AB\u30CB\u30BA\u30E0\u306E\u5834\u6240"},
{".internalsf.include.the.SF.file.inside.the.signature.block",
- "[-internalsf] \u30B7\u30B0\u30CD\u30C1\u30E3\u30FB\u30D6\u30ED\u30C3\u30AF\u306B.SF\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3081\u308B"},
+ "[-internalsf] \u30B7\u30B0\u30CD\u30C1\u30E3\u30FB\u30D6\u30ED\u30C3\u30AF\u306B.SF\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3081\u308B"},
{".sectionsonly.don.t.compute.hash.of.entire.manifest",
- "[-sectionsonly] \u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u5168\u4F53\u306E\u30CF\u30C3\u30B7\u30E5\u306F\u8A08\u7B97\u3057\u306A\u3044"},
+ "[-sectionsonly] \u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u5168\u4F53\u306E\u30CF\u30C3\u30B7\u30E5\u306F\u8A08\u7B97\u3057\u306A\u3044"},
{".protected.keystore.has.protected.authentication.path",
- "[-protected] \u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F\u4FDD\u8B77\u3055\u308C\u305F\u8A8D\u8A3C\u30D1\u30B9\u304C\u3042\u308B"},
+ "[-protected] \u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F\u4FDD\u8B77\u3055\u308C\u305F\u8A8D\u8A3C\u30D1\u30B9\u304C\u3042\u308B"},
{".providerName.name.provider.name",
- "[-providerName <name>] \u30D7\u30ED\u30D0\u30A4\u30C0\u540D"},
+ "[-providerName <name>] \u30D7\u30ED\u30D0\u30A4\u30C0\u540D"},
{".providerClass.class.name.of.cryptographic.service.provider.s",
- "[-providerClass <class> \u6697\u53F7\u5316\u30B5\u30FC\u30D3\u30B9\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u306E\u540D\u524D"},
+ "[-providerClass <class> \u6697\u53F7\u5316\u30B5\u30FC\u30D3\u30B9\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u306E\u540D\u524D"},
{".providerArg.arg.master.class.file.and.constructor.argument",
" [-providerArg <arg>]] ... \u30DE\u30B9\u30BF\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3068\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u306E\u5F15\u6570"},
{".strict.treat.warnings.as.errors",
--- a/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java Thu Oct 03 19:18:54 2013 +0100
@@ -71,9 +71,9 @@
{".signedjar.file.name.of.signed.JAR.file",
"[-signedjar <\u6587\u4EF6>] \u5DF2\u7B7E\u540D\u7684 JAR \u6587\u4EF6\u7684\u540D\u79F0"},
{".digestalg.algorithm.name.of.digest.algorithm",
- "[-digestalg <\u7B97\u6CD5>] \u6458\u8981\u7B97\u6CD5\u7684\u540D\u79F0"},
+ "[-digestalg <\u7B97\u6CD5>] \u6458\u8981\u7B97\u6CD5\u7684\u540D\u79F0"},
{".sigalg.algorithm.name.of.signature.algorithm",
- "[-sigalg <\u7B97\u6CD5>] \u7B7E\u540D\u7B97\u6CD5\u7684\u540D\u79F0"},
+ "[-sigalg <\u7B97\u6CD5>] \u7B7E\u540D\u7B97\u6CD5\u7684\u540D\u79F0"},
{".verify.verify.a.signed.JAR.file",
"[-verify] \u9A8C\u8BC1\u5DF2\u7B7E\u540D\u7684 JAR \u6587\u4EF6"},
{".verbose.suboptions.verbose.output.when.signing.verifying.",
@@ -86,6 +86,8 @@
"[-tsa <url>] \u65F6\u95F4\u6233\u9881\u53D1\u673A\u6784\u7684\u4F4D\u7F6E"},
{".tsacert.alias.public.key.certificate.for.Timestamping.Authority",
"[-tsacert <\u522B\u540D>] \u65F6\u95F4\u6233\u9881\u53D1\u673A\u6784\u7684\u516C\u5171\u5BC6\u94A5\u8BC1\u4E66"},
+ {".tsapolicyid.tsapolicyid.for.Timestamping.Authority",
+ "[-tsapolicyid <oid>] \u65F6\u95F4\u6233\u9881\u53D1\u673A\u6784\u7684 TSAPolicyID"},
{".altsigner.class.class.name.of.an.alternative.signing.mechanism",
"[-altsigner <\u7C7B>] \u66FF\u4EE3\u7684\u7B7E\u540D\u673A\u5236\u7684\u7C7B\u540D"},
{".altsignerpath.pathlist.location.of.an.alternative.signing.mechanism",
@@ -132,7 +134,7 @@
{".Signature.related.entries.","(\u4E0E\u7B7E\u540D\u76F8\u5173\u7684\u6761\u76EE)"},
{".Unsigned.entries.", "(\u672A\u7B7E\u540D\u6761\u76EE)"},
{"jar.is.unsigned.signatures.missing.or.not.parsable.",
- "jar \u672A\u7B7E\u540D\u3002(\u7F3A\u5C11\u7B7E\u540D\u6216\u65E0\u6CD5\u5BF9\u7B7E\u540D\u8FDB\u884C\u8BED\u6CD5\u5206\u6790)"},
+ "jar \u672A\u7B7E\u540D\u3002(\u7F3A\u5C11\u7B7E\u540D\u6216\u65E0\u6CD5\u89E3\u6790\u7B7E\u540D)"},
{"jar.verified.", "jar \u5DF2\u9A8C\u8BC1\u3002"},
{"jarsigner.", "jarsigner: "},
{"signature.filename.must.consist.of.the.following.characters.A.Z.0.9.or.",
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Option]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Optionen:"},
{"Use.keytool.help.for.all.available.commands",
"\"keytool -help\" f\u00FCr alle verf\u00FCgbaren Befehle verwenden"},
@@ -61,7 +60,6 @@
"Exportiert ein Zertifikat"}, //-exportcert
{"Generates.a.key.pair",
"Generiert ein Schl\u00FCsselpaar"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"Generiert einen Secret Key"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"Zertifizierungsanforderung in Datei <{0}> gespeichert"},
{"Submit.this.to.your.CA", "Leiten Sie dies an die CA weiter"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "Wenn kein Alias angegeben ist, d\u00FCrfen destalias, srckeypass und destkeypass nicht angegeben werden"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "Wenn kein Alias angegeben ist, d\u00FCrfen destalias und srckeypass nicht angegeben werden"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "Der Ziel-Keystore pkcs12 hat unterschiedliche Kennw\u00F6rter f\u00FCr storepass und keypass. Wiederholen Sie den Vorgang, indem Sie -destkeypass angeben."},
{"Certificate.stored.in.file.filename.",
"Zertifikat in Datei <{0}> gespeichert"},
{"Certificate.reply.was.installed.in.keystore",
@@ -324,7 +324,7 @@
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
"M\u00F6chten Sie es trotzdem zu Ihrem eigenen Keystore hinzuf\u00FCgen? [Nein]: "},
{"Trust.this.certificate.no.", "Diesem Zertifikat vertrauen? [Nein]: "},
- {"YES", "Ja"},
+ {"YES", "JA"},
{"New.prompt.", "Neues {0}: "},
{"Passwords.must.differ", "Kennw\u00F6rter m\u00FCssen sich unterscheiden"},
{"Re.enter.new.prompt.", "Neues {0} erneut eingeben: "},
@@ -361,7 +361,7 @@
"Alias <{0}> verweist auf einen Eintragstyp, der kein Private Key-Eintrag ist. Der Befehl -keyclone unterst\u00FCtzt nur das Clonen von Private Key-Eintr\u00E4gen"},
{".WARNING.WARNING.WARNING.",
- "***************** Warnung Warnung Warnung *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "Signaturgeber #%d:"},
{"Timestamp.", "Zeitstempel:"},
{"Signature.", "Signatur:"},
@@ -386,7 +386,7 @@
"Zertifikat der obersten Ebene in Antwort:\n"},
{".is.not.trusted.", "... ist nicht vertrauensw\u00FCrdig. "},
{"Install.reply.anyway.no.", "Antwort trotzdem installieren? [Nein]: "},
- {"NO", "Nein"},
+ {"NO", "NEIN"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"Public Keys in Antwort und Keystore stimmen nicht \u00FCberein"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Geben Sie -keysize zum Erstellen eines Secret Keys an"},
+ {"verified.by.s.in.s", "Gepr\u00FCft von %s in %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "WARNUNG: Nicht gepr\u00FCft. Stellen Sie sicher, dass -keystore korrekt ist."},
+
{"Extensions.", "Erweiterungen: "},
{".Empty.value.", "(Leerer Wert)"},
{"Extension.Request.", "Erweiterungsanforderung:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_es.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_es.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Opci\u00F3n]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Opciones:"},
{"Use.keytool.help.for.all.available.commands",
"Utilice\"keytool -help\" para todos los comandos disponibles"},
@@ -61,7 +60,6 @@
"Exporta el certificado"}, //-exportcert
{"Generates.a.key.pair",
"Genera un par de claves"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"Genera un clave secreta"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"Solicitud de certificaci\u00F3n almacenada en el archivo <{0}>"},
{"Submit.this.to.your.CA", "Enviar a la CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "si no se especifica el alias, no se puede especificar destalias, srckeypass ni destkeypass"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "si no se especifica el alias, no se debe especificar destalias ni srckeypass"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "El almac\u00E9n de claves pkcs12 de destino tiene storepass y keypass diferentes. Vuelva a intentarlo con -destkeypass especificado."},
{"Certificate.stored.in.file.filename.",
"Certificado almacenado en el archivo <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -324,7 +324,7 @@
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
"\u00BFA\u00FAn desea agregarlo a su propio almac\u00E9n de claves? [no]: "},
{"Trust.this.certificate.no.", "\u00BFConfiar en este certificado? [no]: "},
- {"YES", "S\u00ED"},
+ {"YES", "S\u00CD"},
{"New.prompt.", "Nuevo {0}: "},
{"Passwords.must.differ", "Las contrase\u00F1as deben ser distintas"},
{"Re.enter.new.prompt.", "Vuelva a escribir el nuevo {0}: "},
@@ -361,7 +361,7 @@
"El alias <{0}> hace referencia a un tipo de entrada que no es una clave privada. El comando -keyclone s\u00F3lo permite la clonaci\u00F3n de entradas de claves privadas"},
{".WARNING.WARNING.WARNING.",
- "***************** Advertencia Advertencia Advertencia *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "#%d de Firmante:"},
{"Timestamp.", "Registro de Hora:"},
{"Signature.", "Firma:"},
@@ -386,7 +386,7 @@
"Certificado de nivel superior en la respuesta:\n"},
{".is.not.trusted.", "... no es de confianza. "},
{"Install.reply.anyway.no.", "\u00BFInstalar respuesta de todos modos? [no]: "},
- {"NO", "No"},
+ {"NO", "NO"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"Las claves p\u00FAblicas en la respuesta y en el almac\u00E9n de claves no coinciden"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Proporcione el valor de -keysize para la generaci\u00F3n de claves secretas"},
+ {"verified.by.s.in.s", "Verificado por %s en %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "ADVERTENCIA: no se ha verificado. Aseg\u00FArese de que el valor de -keystore es correcto."},
+
{"Extensions.", "Extensiones: "},
{".Empty.value.", "(Valor vac\u00EDo)"},
{"Extension.Request.", "Solicitud de Extensi\u00F3n:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_fr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_fr.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Option]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Options :"},
{"Use.keytool.help.for.all.available.commands",
"Utiliser \"keytool -help\" pour toutes les commandes disponibles"},
@@ -61,7 +60,6 @@
"Exporte le certificat"}, //-exportcert
{"Generates.a.key.pair",
"G\u00E9n\u00E8re une paire de cl\u00E9s"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"G\u00E9n\u00E8re une cl\u00E9 secr\u00E8te"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"Demande de certification stock\u00E9e dans le fichier <{0}>"},
{"Submit.this.to.your.CA", "Soumettre \u00E0 votre CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "si l'alias n'est pas sp\u00E9cifi\u00E9, destalias, srckeypass et destkeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "si l'alias n'est pas sp\u00E9cifi\u00E9, destalias et srckeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "Le fichier de cl\u00E9s pkcs12 de destination contient un mot de passe de fichier de cl\u00E9s et un mot de passe de cl\u00E9 diff\u00E9rents. R\u00E9essayez en sp\u00E9cifiant -destkeypass."},
{"Certificate.stored.in.file.filename.",
"Certificat stock\u00E9 dans le fichier <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -324,7 +324,7 @@
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
"Voulez-vous toujours l'ajouter \u00E0 votre fichier de cl\u00E9s ? [non] : "},
{"Trust.this.certificate.no.", "Faire confiance \u00E0 ce certificat ? [non] : "},
- {"YES", "Oui"},
+ {"YES", "OUI"},
{"New.prompt.", "Nouveau {0} : "},
{"Passwords.must.differ", "Les mots de passe doivent diff\u00E9rer"},
{"Re.enter.new.prompt.", "Indiquez encore le nouveau {0} : "},
@@ -361,7 +361,7 @@
"L''entr\u00E9e \u00E0 laquelle l''alias <{0}> fait r\u00E9f\u00E9rence n''est pas une entr\u00E9e de type cl\u00E9 priv\u00E9e. La commande -keyclone prend uniquement en charge le clonage des cl\u00E9s priv\u00E9es"},
{".WARNING.WARNING.WARNING.",
- "***************** Avertissement Avertissement Avertissement *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "Signataire n\u00B0%d :"},
{"Timestamp.", "Horodatage :"},
{"Signature.", "Signature :"},
@@ -386,7 +386,7 @@
"Certificat de niveau sup\u00E9rieur dans la r\u00E9ponse :\n"},
{".is.not.trusted.", "... non s\u00E9curis\u00E9. "},
{"Install.reply.anyway.no.", "Installer la r\u00E9ponse quand m\u00EAme ? [non] : "},
- {"NO", "Non"},
+ {"NO", "NON"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"Les cl\u00E9s publiques de la r\u00E9ponse et du fichier de cl\u00E9s ne concordent pas"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Indiquez -keysize pour la g\u00E9n\u00E9ration de la cl\u00E9 secr\u00E8te"},
+ {"verified.by.s.in.s", "V\u00E9rifi\u00E9 par %s dans %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "AVERTISSEMENT : non v\u00E9rifi\u00E9. Assurez-vous que -keystore est correct."},
+
{"Extensions.", "Extensions\u00A0: "},
{".Empty.value.", "(Valeur vide)"},
{"Extension.Request.", "Demande d'extension :"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_it.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_it.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Opzione]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Opzioni:"},
{"Use.keytool.help.for.all.available.commands",
"Utilizzare \"keytool -help\" per visualizzare tutti i comandi disponibili"},
@@ -61,7 +60,6 @@
"Esporta il certificato"}, //-exportcert
{"Generates.a.key.pair",
"Genera una coppia di chiavi"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"Genera una chiave segreta"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"La richiesta di certificazione \u00E8 memorizzata nel file <{0}>"},
{"Submit.this.to.your.CA", "Sottomettere alla propria CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "Se l'alias non \u00E8 specificato, destalias, srckeypass e destkeypass non dovranno essere specificati"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "Se l'alias non \u00E8 specificato, destalias e srckeypass non dovranno essere specificati"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "Keystore pkcs12 di destinazione con storepass e keypass differenti. Riprovare con -destkeypass specificato."},
{"Certificate.stored.in.file.filename.",
"Il certificato \u00E8 memorizzato nel file <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -361,7 +361,7 @@
"L''alias <{0}> fa riferimento a un tipo di voce che non \u00E8 una voce di chiave privata. Il comando -keyclone supporta solo la copia delle voci di chiave private."},
{".WARNING.WARNING.WARNING.",
- "***************** Avvertenza Avvertenza Avvertenza *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "Firmatario #%d:"},
{"Timestamp.", "Indicatore orario:"},
{"Signature.", "Firma:"},
@@ -386,7 +386,7 @@
"Certificato di primo livello nella risposta:\n"},
{".is.not.trusted.", "...non \u00E8 considerato sicuro. "},
{"Install.reply.anyway.no.", "Installare la risposta? [no]: "},
- {"NO", "No"},
+ {"NO", "NO"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"Le chiavi pubbliche nella risposta e nel keystore non corrispondono"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Specificare il valore -keysize per la generazione della chiave segreta"},
+ {"verified.by.s.in.s", "Verificato da %s in %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "AVVERTENZA: non verificato. Assicurarsi che -keystore sia corretto."},
+
{"Extensions.", "Estensioni: "},
{".Empty.value.", "(valore vuoto)"},
{"Extension.Request.", "Richiesta di estensione:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [\u30AA\u30D7\u30B7\u30E7\u30F3]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "\u30AA\u30D7\u30B7\u30E7\u30F3:"},
{"Use.keytool.help.for.all.available.commands",
"\u4F7F\u7528\u53EF\u80FD\u306A\u3059\u3079\u3066\u306E\u30B3\u30DE\u30F3\u30C9\u306B\u3064\u3044\u3066\u306F\"keytool -help\"\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044"},
@@ -61,7 +60,6 @@
"\u8A3C\u660E\u66F8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-exportcert
{"Generates.a.key.pair",
"\u9375\u30DA\u30A2\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"\u79D8\u5BC6\u9375\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"},
{"Submit.this.to.your.CA", "\u3053\u308C\u3092CA\u306B\u63D0\u51FA\u3057\u3066\u304F\u3060\u3055\u3044"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "\u5225\u540D\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u5225\u540D\u3001\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304A\u3088\u3073\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "\u5225\u540D\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u5225\u540D\u304A\u3088\u3073\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "\u51FA\u529B\u5148pkcs12\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u3001\u7570\u306A\u308Bstorepass\u304A\u3088\u3073keypass\u304C\u3042\u308A\u307E\u3059\u3002-destkeypass\u3092\u6307\u5B9A\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002"},
{"Certificate.stored.in.file.filename.",
"\u8A3C\u660E\u66F8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"},
{"Certificate.reply.was.installed.in.keystore",
@@ -361,7 +361,7 @@
"\u5225\u540D<{0}>\u304C\u53C2\u7167\u3057\u3066\u3044\u308B\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002-keyclone\u30B3\u30DE\u30F3\u30C9\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u4F5C\u6210\u306E\u307F\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059"},
{".WARNING.WARNING.WARNING.",
- "*****************\u8B66\u544A \u8B66\u544A \u8B66\u544A*****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "\u7F72\u540D\u8005\u756A\u53F7%d:"},
{"Timestamp.", "\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7:"},
{"Signature.", "\u7F72\u540D:"},
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"\u79D8\u5BC6\u9375\u306E\u751F\u6210\u6642\u306B\u306F -keysize\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"},
+ {"verified.by.s.in.s", "%s(%s\u5185)\u306B\u3088\u308A\u691C\u8A3C\u3055\u308C\u307E\u3057\u305F"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "\u8B66\u544A: \u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002-keystore\u304C\u6B63\u3057\u3044\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"},
+
{"Extensions.", "\u62E1\u5F35: "},
{".Empty.value.", "(\u7A7A\u306E\u5024)"},
{"Extension.Request.", "\u62E1\u5F35\u30EA\u30AF\u30A8\u30B9\u30C8:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_ko.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ko.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [\uC635\uC158]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "\uC635\uC158:"},
{"Use.keytool.help.for.all.available.commands",
"\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBAA8\uB4E0 \uBA85\uB839\uC5D0 \"keytool -help\" \uC0AC\uC6A9"},
@@ -61,7 +60,6 @@
"\uC778\uC99D\uC11C\uB97C \uC775\uC2A4\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-exportcert
{"Generates.a.key.pair",
"\uD0A4 \uC30D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -174,7 +172,7 @@
"\uCCA0\uD68C\uD560 \uC778\uC99D\uC11C\uC758 \uC77C\uB828 ID"}, //-id
// keytool: Running part
{"keytool.error.", "keytool \uC624\uB958: "},
- {"Illegal.option.", "\uC798\uBABB\uB41C \uC635\uC158: "},
+ {"Illegal.option.", "\uC798\uBABB\uB41C \uC635\uC158: "},
{"Illegal.value.", "\uC798\uBABB\uB41C \uAC12: "},
{"Unknown.password.type.", "\uC54C \uC218 \uC5C6\uB294 \uBE44\uBC00\uBC88\uD638 \uC720\uD615: "},
{"Cannot.find.environment.variable.",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"\uC778\uC99D \uC694\uCCAD\uC774 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."},
{"Submit.this.to.your.CA", "CA\uC5D0\uAC8C \uC81C\uCD9C\uD558\uC2ED\uC2DC\uC624."},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 destalias, srckeypass \uBC0F destkeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 destalias \uBC0F srckeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "\uB300\uC0C1 pkcs12 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uB2E4\uB978 storepass \uBC0F keypass\uAC00 \uC788\uC2B5\uB2C8\uB2E4. \uC9C0\uC815\uB41C -destkeypass\uB85C \uC7AC\uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."},
{"Certificate.stored.in.file.filename.",
"\uC778\uC99D\uC11C\uAC00 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."},
{"Certificate.reply.was.installed.in.keystore",
@@ -361,7 +361,7 @@
"<{0}> \uBCC4\uCE6D\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC774 \uC544\uB2CC \uD56D\uBAA9 \uC720\uD615\uC744 \uCC38\uC870\uD569\uB2C8\uB2E4. -keyclone \uBA85\uB839\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC758 \uBCF5\uC81C\uB9CC \uC9C0\uC6D0\uD569\uB2C8\uB2E4."},
{".WARNING.WARNING.WARNING.",
- "***************** \uACBD\uACE0 \uACBD\uACE0 \uACBD\uACE0 *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "\uC11C\uBA85\uC790 #%d:"},
{"Timestamp.", "\uC2DC\uAC04 \uAE30\uB85D:"},
{"Signature.", "\uC11C\uBA85:"},
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD558\uB824\uBA74 -keysize\uB97C \uC81C\uACF5\uD558\uC2ED\uC2DC\uC624."},
+ {"verified.by.s.in.s", "%s(%s)\uC5D0 \uC758\uD574 \uD655\uC778\uB428"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "\uACBD\uACE0: \uD655\uC778\uB418\uC9C0 \uC54A\uC74C. -keystore\uAC00 \uC62C\uBC14\uB978\uC9C0 \uD655\uC778\uD558\uC2ED\uC2DC\uC624."},
+
{"Extensions.", "\uD655\uC7A5: "},
{".Empty.value.", "(\uBE44\uC5B4 \uC788\uB294 \uAC12)"},
{"Extension.Request.", "\uD655\uC7A5 \uC694\uCCAD:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Op\u00E7\u00E3o]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Op\u00E7\u00F5es:"},
{"Use.keytool.help.for.all.available.commands",
"Use \"keytool -help\" para todos os comandos dispon\u00EDveis"},
@@ -61,9 +60,8 @@
"Exporta o certificado"}, //-exportcert
{"Generates.a.key.pair",
"Gera um par de chaves"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
- "Gera uma chave Secreta"}, //-genseckey
+ "Gera uma chave secreta"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
"Gera um certificado de uma solicita\u00E7\u00E3o de certificado"}, //-gencert
{"Generates.CRL", "Gera CRL"}, //-gencrl
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"Solicita\u00E7\u00E3o de certificado armazenada no arquivo <{0}>"},
{"Submit.this.to.your.CA", "Submeter \u00E0 CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "se o alias n\u00E3o estiver especificado, destalias, srckeypass e destkeypass n\u00E3o dever\u00E3o ser especificados"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "se o alias n\u00E3o estiver especificado, destalias e srckeypass n\u00E3o dever\u00E3o ser especificados"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "O armazenamento de chaves pkcs12 de destino tem storepass e keypass diferentes. Tente novamente especificando -destkeypass."},
{"Certificate.stored.in.file.filename.",
"Certificado armazenado no arquivo <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -298,14 +298,14 @@
{"Entry.type.type.", "Tipo de entrada: {0}"},
{"Certificate.chain.length.", "Comprimento da cadeia de certificados: "},
{"Certificate.i.1.", "Certificado[{0,number,integer}]:"},
- {"Certificate.fingerprint.SHA1.", "Fingerprint (MD5) do certificado: "},
+ {"Certificate.fingerprint.SHA1.", "Fingerprint (SHA1) do certificado: "},
{"Keystore.type.", "Tipo de \u00E1rea de armazenamento de chaves: "},
{"Keystore.provider.", "Fornecedor da \u00E1rea de armazenamento de chaves: "},
{"Your.keystore.contains.keyStore.size.entry",
"Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entrada"},
{"Your.keystore.contains.keyStore.size.entries",
"Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entradas"},
- {"Failed.to.parse.input", "Falha durante o parse da entrada"},
+ {"Failed.to.parse.input", "Falha durante o parsing da entrada"},
{"Empty.input", "Entrada vazia"},
{"Not.X.509.certificate", "N\u00E3o \u00E9 um certificado X.509"},
{"alias.has.no.public.key", "{0} n\u00E3o tem chave p\u00FAblica"},
@@ -324,7 +324,7 @@
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
"Ainda deseja adicion\u00E1-lo \u00E0 sua \u00E1rea de armazenamento de chaves? [n\u00E3o]: "},
{"Trust.this.certificate.no.", "Confiar neste certificado? [n\u00E3o]: "},
- {"YES", "Sim"},
+ {"YES", "SIM"},
{"New.prompt.", "Nova {0}: "},
{"Passwords.must.differ", "As senhas devem ser diferentes"},
{"Re.enter.new.prompt.", "Informe novamente a nova {0}: "},
@@ -361,7 +361,7 @@
"O alias <{0}> faz refer\u00EAncia a um tipo de entrada que n\u00E3o \u00E9 uma entrada de chave privada. O comando -keyclone oferece suporte somente \u00E0 clonagem de entradas de chave privada"},
{".WARNING.WARNING.WARNING.",
- "***************** Advert\u00EAncia Advert\u00EAncia Advert\u00EAncia *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "Signat\u00E1rio #%d:"},
{"Timestamp.", "Timestamp:"},
{"Signature.", "Assinatura:"},
@@ -386,7 +386,7 @@
"Certificado de n\u00EDvel superior na resposta:\n"},
{".is.not.trusted.", "... n\u00E3o \u00E9 confi\u00E1vel. "},
{"Install.reply.anyway.no.", "Instalar resposta assim mesmo? [n\u00E3o]: "},
- {"NO", "N\u00E3o"},
+ {"NO", "N\u00C3O"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"As chaves p\u00FAblicas da resposta e da \u00E1rea de armazenamento de chaves n\u00E3o correspondem"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Forne\u00E7a o -keysize para a gera\u00E7\u00E3o da chave secreta"},
+ {"verified.by.s.in.s", "Verificado por %s em %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "ADVERT\u00CANCIA: n\u00E3o verificado. Certifique-se que -keystore esteja correto."},
+
{"Extensions.", "Extens\u00F5es: "},
{".Empty.value.", "(Valor vazio)"},
{"Extension.Request.", "Solicita\u00E7\u00E3o de Extens\u00E3o:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_sv.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_sv.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [Alternativ]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "Alternativ:"},
{"Use.keytool.help.for.all.available.commands",
"L\u00E4s \"Hj\u00E4lp - Nyckelverktyg\" f\u00F6r alla tillg\u00E4ngliga kommandon"},
@@ -61,7 +60,6 @@
"Exporterar certifikat"}, //-exportcert
{"Generates.a.key.pair",
"Genererar nyckelpar"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"Genererar hemlig nyckel"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -178,7 +176,7 @@
{"Illegal.value.", "Otill\u00E5tet v\u00E4rde: "},
{"Unknown.password.type.", "Ok\u00E4nd l\u00F6senordstyp: "},
{"Cannot.find.environment.variable.",
- "Kan inte hitta milj\u00F6variabel: "},
+ "Hittar inte milj\u00F6variabel: "},
{"Cannot.find.file.", "Hittar inte fil: "},
{"Command.option.flag.needs.an.argument.", "Kommandoalternativet {0} beh\u00F6ver ett argument."},
{"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"Certifikatbeg\u00E4ran har lagrats i filen <{0}>"},
{"Submit.this.to.your.CA", "Skicka detta till certifikatutf\u00E4rdaren"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "om n\u00E5got alias inte anges f\u00E5r destalias, srckeypass och destkeypass inte anges"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "om alias inte angivits ska inte heller destalias och srckeypass anges"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "Destinationsnyckellagret pkcs12 har olika storepass och keypass. F\u00F6rs\u00F6k igen med -destkeypass angivet."},
{"Certificate.stored.in.file.filename.",
"Certifikatet har lagrats i filen <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -324,7 +324,7 @@
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
"Vill du fortfarande l\u00E4gga till det i ditt eget nyckellagret? [nej]: "},
{"Trust.this.certificate.no.", "Litar du p\u00E5 det h\u00E4r certifikatet? [nej]: "},
- {"YES", "Ja"},
+ {"YES", "JA"},
{"New.prompt.", "Nytt {0}: "},
{"Passwords.must.differ", "L\u00F6senorden m\u00E5ste vara olika"},
{"Re.enter.new.prompt.", "Ange nytt {0} igen: "},
@@ -361,7 +361,7 @@
"Aliaset <{0}> refererar till en posttyp som inte \u00E4r n\u00E5gon privat nyckelpost. Kommandot -keyclone har endast st\u00F6d f\u00F6r kloning av privata nyckelposter"},
{".WARNING.WARNING.WARNING.",
- "***************** Varning Varning Varning *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "Signerare #%d:"},
{"Timestamp.", "Tidsst\u00E4mpel:"},
{"Signature.", "Underskrift:"},
@@ -386,7 +386,7 @@
"Toppniv\u00E5certifikatet i svaret:\n"},
{".is.not.trusted.", "... \u00E4r inte betrott. "},
{"Install.reply.anyway.no.", "Vill du installera svaret \u00E4nd\u00E5? [nej]: "},
- {"NO", "Nej"},
+ {"NO", "NEJ"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"De offentliga nycklarna i svaret och nyckellagret matchar inte varandra"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"Ange -keysize f\u00F6r att skapa hemlig nyckel"},
+ {"verified.by.s.in.s", "Verifierad av %s i %s"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "VARNING: ej verifierad. Se till att -nyckellager \u00E4r korrekt."},
+
{"Extensions.", "Till\u00E4gg: "},
{".Empty.value.", "(Tomt v\u00E4rde)"},
{"Extension.Request.", "Till\u00E4ggsbeg\u00E4ran:"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_CN.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_CN.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [\u9009\u9879]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "\u9009\u9879:"},
{"Use.keytool.help.for.all.available.commands",
"\u4F7F\u7528 \"keytool -help\" \u83B7\u53D6\u6240\u6709\u53EF\u7528\u547D\u4EE4"},
@@ -61,9 +60,8 @@
"\u5BFC\u51FA\u8BC1\u4E66"}, //-exportcert
{"Generates.a.key.pair",
"\u751F\u6210\u5BC6\u94A5\u5BF9"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
- "\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"}, //-genseckey
+ "\u751F\u6210\u5BC6\u94A5"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
"\u6839\u636E\u8BC1\u4E66\u8BF7\u6C42\u751F\u6210\u8BC1\u4E66"}, //-gencert
{"Generates.CRL", "\u751F\u6210 CRL"}, //-gencrl
@@ -182,7 +180,7 @@
{"Cannot.find.file.", "\u627E\u4E0D\u5230\u6587\u4EF6: "},
{"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9009\u9879{0}\u9700\u8981\u4E00\u4E2A\u53C2\u6570\u3002"},
{"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.",
- "\u8B66\u544A: PKCS12 KeyStore \u4E0D\u652F\u6301\u5176\u4ED6\u5B58\u50A8\u548C\u5BC6\u94A5\u53E3\u4EE4\u3002\u6B63\u5728\u5FFD\u7565\u7528\u6237\u6307\u5B9A\u7684{0}\u503C\u3002"},
+ "\u8B66\u544A: PKCS12 \u5BC6\u94A5\u5E93\u4E0D\u652F\u6301\u5176\u4ED6\u5B58\u50A8\u548C\u5BC6\u94A5\u53E3\u4EE4\u3002\u6B63\u5728\u5FFD\u7565\u7528\u6237\u6307\u5B9A\u7684{0}\u503C\u3002"},
{".keystore.must.be.NONE.if.storetype.is.{0}",
"\u5982\u679C -storetype \u4E3A {0}, \u5219 -keystore \u5FC5\u987B\u4E3A NONE"},
{"Too.many.retries.program.terminated",
@@ -203,13 +201,13 @@
"\u5982\u679C\u6E90\u5BC6\u94A5\u5E93\u672A\u53D7\u53E3\u4EE4\u4FDD\u62A4, \u5219\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"},
{"Illegal.startdate.value", "\u975E\u6CD5\u5F00\u59CB\u65E5\u671F\u503C"},
{"Validity.must.be.greater.than.zero",
- "\u6709\u6548\u671F\u5FC5\u987B\u5927\u4E8E\u96F6"},
+ "\u6709\u6548\u6027\u5FC5\u987B\u5927\u4E8E\u96F6"},
{"provName.not.a.provider", "{0}\u4E0D\u662F\u63D0\u4F9B\u65B9"},
{"Usage.error.no.command.provided", "\u7528\u6CD5\u9519\u8BEF: \u6CA1\u6709\u63D0\u4F9B\u547D\u4EE4"},
{"Source.keystore.file.exists.but.is.empty.", "\u6E90\u5BC6\u94A5\u5E93\u6587\u4EF6\u5B58\u5728, \u4F46\u4E3A\u7A7A: "},
{"Please.specify.srckeystore", "\u8BF7\u6307\u5B9A -srckeystore"},
{"Must.not.specify.both.v.and.rfc.with.list.command",
- "'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u65F6\u6307\u5B9A -v \u53CA -rfc"},
+ "\u4E0D\u80FD\u4F7F\u7528 'list' \u547D\u4EE4\u6765\u6307\u5B9A -v \u53CA -rfc"},
{"Key.password.must.be.at.least.6.characters",
"\u5BC6\u94A5\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"},
{"New.password.must.be.at.least.6.characters",
@@ -239,13 +237,15 @@
{"Warning.Overwriting.existing.alias.alias.in.destination.keystore",
"\u8B66\u544A: \u6B63\u5728\u8986\u76D6\u76EE\u6807\u5BC6\u94A5\u5E93\u4E2D\u7684\u73B0\u6709\u522B\u540D {0}"},
{"Existing.entry.alias.alias.exists.overwrite.no.",
- "\u5B58\u5728\u73B0\u6709\u6761\u76EE\u522B\u540D {0}, \u662F\u5426\u8986\u76D6? [no]: "},
+ "\u5B58\u5728\u73B0\u6709\u6761\u76EE\u522B\u540D {0}, \u662F\u5426\u8986\u76D6? [\u5426]: "},
{"Too.many.failures.try.later", "\u6545\u969C\u592A\u591A - \u8BF7\u7A0D\u540E\u518D\u8BD5"},
{"Certification.request.stored.in.file.filename.",
"\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BA4\u8BC1\u8BF7\u6C42"},
{"Submit.this.to.your.CA", "\u5C06\u6B64\u63D0\u4EA4\u7ED9\u60A8\u7684 CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "\u5982\u679C\u6CA1\u6709\u6307\u5B9A\u522B\u540D, \u5219\u4E0D\u80FD\u6307\u5B9A\u76EE\u6807\u522B\u540D, \u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4\u548C\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "\u5982\u679C\u6CA1\u6709\u6307\u5B9A\u522B\u540D, \u5219\u4E0D\u80FD\u6307\u5B9A\u76EE\u6807\u522B\u540D\u548C\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "\u76EE\u6807 pkcs12 \u5BC6\u94A5\u5E93\u5177\u6709\u4E0D\u540C\u7684 storepass \u548C keypass\u3002\u8BF7\u5728\u6307\u5B9A\u4E86 -destkeypass \u65F6\u91CD\u8BD5\u3002"},
{"Certificate.stored.in.file.filename.",
"\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BC1\u4E66"},
{"Certificate.reply.was.installed.in.keystore",
@@ -305,7 +305,7 @@
"\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"},
{"Your.keystore.contains.keyStore.size.entries",
"\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"},
- {"Failed.to.parse.input", "\u65E0\u6CD5\u5BF9\u8F93\u5165\u8FDB\u884C\u8BED\u6CD5\u5206\u6790"},
+ {"Failed.to.parse.input", "\u65E0\u6CD5\u89E3\u6790\u8F93\u5165"},
{"Empty.input", "\u7A7A\u8F93\u5165"},
{"Not.X.509.certificate", "\u975E X.509 \u8BC1\u4E66"},
{"alias.has.no.public.key", "{0}\u6CA1\u6709\u516C\u5171\u5BC6\u94A5"},
@@ -318,13 +318,13 @@
{"Certificate.already.exists.in.keystore.under.alias.trustalias.",
"\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u5BC6\u94A5\u5E93\u4E2D"},
{"Do.you.still.want.to.add.it.no.",
- "\u662F\u5426\u4ECD\u8981\u6DFB\u52A0? [no]: "},
+ "\u662F\u5426\u4ECD\u8981\u6DFB\u52A0? [\u5426]: "},
{"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.",
"\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u7CFB\u7EDF\u8303\u56F4\u7684 CA \u5BC6\u94A5\u5E93\u4E2D"},
{"Do.you.still.want.to.add.it.to.your.own.keystore.no.",
- "\u662F\u5426\u4ECD\u8981\u5C06\u5B83\u6DFB\u52A0\u5230\u81EA\u5DF1\u7684\u5BC6\u94A5\u5E93? [no]: "},
- {"Trust.this.certificate.no.", "\u662F\u5426\u4FE1\u4EFB\u6B64\u8BC1\u4E66? [no]: "},
- {"YES", "\u662F"},
+ "\u662F\u5426\u4ECD\u8981\u5C06\u5B83\u6DFB\u52A0\u5230\u81EA\u5DF1\u7684\u5BC6\u94A5\u5E93? [\u5426]: "},
+ {"Trust.this.certificate.no.", "\u662F\u5426\u4FE1\u4EFB\u6B64\u8BC1\u4E66? [\u5426]: "},
+ {"YES", "YES"},
{"New.prompt.", "\u65B0{0}: "},
{"Passwords.must.differ", "\u53E3\u4EE4\u4E0D\u80FD\u76F8\u540C"},
{"Re.enter.new.prompt.", "\u91CD\u65B0\u8F93\u5165\u65B0{0}: "},
@@ -332,7 +332,7 @@
{"They.don.t.match.Try.again", "\u5B83\u4EEC\u4E0D\u5339\u914D\u3002\u8BF7\u91CD\u8BD5"},
{"Enter.prompt.alias.name.", "\u8F93\u5165{0}\u522B\u540D: "},
{"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.",
- "\u8F93\u5165\u65B0\u7684\u522B\u540D\t(\u6309\u56DE\u8F66\u4EE5\u53D6\u6D88\u5BF9\u6B64\u6761\u76EE\u7684\u5BFC\u5165): "},
+ "\u5BFC\u5165\u65B0\u7684\u522B\u540D\t(\u6309\u56DE\u8F66\u4EE5\u53D6\u6D88\u5BF9\u6B64\u6761\u76EE\u7684\u5BFC\u5165): "},
{"Enter.alias.name.", "\u8F93\u5165\u522B\u540D: "},
{".RETURN.if.same.as.for.otherAlias.",
"\t(\u5982\u679C\u548C <{0}> \u76F8\u540C, \u5219\u6309\u56DE\u8F66)"},
@@ -361,7 +361,7 @@
"\u522B\u540D <{0}> \u5F15\u7528\u4E86\u4E0D\u5C5E\u4E8E\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u6761\u76EE\u7C7B\u578B\u3002-keyclone \u547D\u4EE4\u4EC5\u652F\u6301\u5BF9\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u514B\u9686"},
{".WARNING.WARNING.WARNING.",
- "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "\u7B7E\u540D\u8005 #%d:"},
{"Timestamp.", "\u65F6\u95F4\u6233:"},
{"Signature.", "\u7B7E\u540D:"},
@@ -385,8 +385,8 @@
{"Top.level.certificate.in.reply.",
"\u56DE\u590D\u4E2D\u7684\u9876\u7EA7\u8BC1\u4E66:\n"},
{".is.not.trusted.", "... \u662F\u4E0D\u53EF\u4FE1\u7684\u3002"},
- {"Install.reply.anyway.no.", "\u662F\u5426\u4ECD\u8981\u5B89\u88C5\u56DE\u590D? [no]: "},
- {"NO", "\u5426"},
+ {"Install.reply.anyway.no.", "\u662F\u5426\u4ECD\u8981\u5B89\u88C5\u56DE\u590D? [\u5426]: "},
+ {"NO", "NO"},
{"Public.keys.in.reply.and.keystore.don.t.match",
"\u56DE\u590D\u4E2D\u7684\u516C\u5171\u5BC6\u94A5\u4E0E\u5BC6\u94A5\u5E93\u4E0D\u5339\u914D"},
{"Certificate.reply.and.certificate.in.keystore.are.identical",
@@ -398,7 +398,11 @@
{"Secret.key.not.generated.alias.alias.already.exists",
"\u6CA1\u6709\u751F\u6210\u5BC6\u94A5, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"},
{"Please.provide.keysize.for.secret.key.generation",
- "\u8BF7\u63D0\u4F9B -keysize \u4EE5\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"},
+ "\u8BF7\u63D0\u4F9B -keysize \u4EE5\u751F\u6210\u5BC6\u94A5"},
+
+ {"verified.by.s.in.s", "\u7531 %s \u9A8C\u8BC1(\u5728 %s \u4E2D)"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "\u8B66\u544A: \u672A\u9A8C\u8BC1\u3002\u8BF7\u786E\u4FDD\u5BC6\u94A5\u5E93\u662F\u6B63\u786E\u7684\u3002"},
{"Extensions.", "\u6269\u5C55: "},
{".Empty.value.", "(\u7A7A\u503C)"},
--- a/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_TW.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_TW.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,8 +40,7 @@
"*******************************************\n\n"},
// keytool: Help part
-// "Option" should be translated.
- {".OPTION.", " [\u9078\u9805]..."},
+ {".OPTION.", " [OPTION]..."},
{"Options.", "\u9078\u9805:"},
{"Use.keytool.help.for.all.available.commands",
"\u4F7F\u7528 \"keytool -help\" \u53D6\u5F97\u6240\u6709\u53EF\u7528\u7684\u547D\u4EE4"},
@@ -61,7 +60,6 @@
"\u532F\u51FA\u6191\u8B49"}, //-exportcert
{"Generates.a.key.pair",
"\u7522\u751F\u91D1\u9470\u7D44"}, //-genkeypair
-// translation of "secret" key should be different to "private" key.
{"Generates.a.secret.key",
"\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, //-genseckey
{"Generates.certificate.from.a.certificate.request",
@@ -244,8 +242,10 @@
{"Certification.request.stored.in.file.filename.",
"\u8A8D\u8B49\u8981\u6C42\u5132\u5B58\u5728\u6A94\u6848 <{0}>"},
{"Submit.this.to.your.CA", "\u5C07\u6B64\u9001\u51FA\u81F3\u60A8\u7684 CA"},
- {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified",
- "\u5982\u679C\u672A\u6307\u5B9A\u5225\u540D\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A destalias\u3001srckeypass \u53CA destkeypass"},
+ {"if.alias.not.specified.destalias.and.srckeypass.must.not.be.specified",
+ "\u5982\u679C\u672A\u6307\u5B9A\u5225\u540D\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A destalias \u548C srckeypass"},
+ {"The.destination.pkcs12.keystore.has.different.storepass.and.keypass.Please.retry.with.destkeypass.specified.",
+ "\u76EE\u7684\u5730 pkcs12 \u91D1\u9470\u5132\u5B58\u5EAB\u7684 storepass \u548C keypass \u4E0D\u540C\u3002\u8ACB\u91CD\u65B0\u4EE5 -destkeypass \u6307\u5B9A\u3002"},
{"Certificate.stored.in.file.filename.",
"\u6191\u8B49\u5132\u5B58\u5728\u6A94\u6848 <{0}>"},
{"Certificate.reply.was.installed.in.keystore",
@@ -361,7 +361,7 @@
"\u5225\u540D <{0}> \u6240\u53C3\u7167\u7684\u9805\u76EE\u4E0D\u662F\u79C1\u5BC6\u91D1\u9470\u985E\u578B\u3002-keyclone \u547D\u4EE4\u50C5\u652F\u63F4\u79C1\u5BC6\u91D1\u9470\u9805\u76EE\u7684\u8907\u88FD"},
{".WARNING.WARNING.WARNING.",
- "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"},
+ "***************** WARNING WARNING WARNING *****************"},
{"Signer.d.", "\u7C3D\u7F72\u8005 #%d:"},
{"Timestamp.", "\u6642\u6233:"},
{"Signature.", "\u7C3D\u7AE0:"},
@@ -383,7 +383,7 @@
{"Certificate.chain.in.reply.does.not.verify.",
"\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u672A\u9A57\u8B49: "},
{"Top.level.certificate.in.reply.",
- "\u56DE\u8986\u6642\u7684\u6700\u9AD8\u7D1A\u6191\u8B49:\\n"},
+ "\u56DE\u8986\u6642\u7684\u6700\u9AD8\u7D1A\u6191\u8B49:\n"},
{".is.not.trusted.", "... \u662F\u4E0D\u88AB\u4FE1\u4EFB\u7684\u3002"},
{"Install.reply.anyway.no.", "\u9084\u662F\u8981\u5B89\u88DD\u56DE\u8986\uFF1F [\u5426]: "},
{"NO", "\u5426"},
@@ -400,6 +400,10 @@
{"Please.provide.keysize.for.secret.key.generation",
"\u8ACB\u63D0\u4F9B -keysize \u4EE5\u7522\u751F\u79D8\u5BC6\u91D1\u9470"},
+ {"verified.by.s.in.s", "\u7531 %s \u9A57\u8B49 (\u5728 %s \u4E2D)"},
+ {"warning.not.verified.make.sure.keystore.is.correct",
+ "\u8B66\u544A: \u672A\u9A57\u8B49\u3002\u8ACB\u78BA\u5B9A -keystore \u6B63\u78BA\u3002"},
+
{"Extensions.", "\u64F4\u5145\u5957\u4EF6: "},
{".Empty.value.", "(\u7A7A\u767D\u503C)"},
{"Extension.Request.", "\u64F4\u5145\u5957\u4EF6\u8981\u6C42:"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java Thu Oct 03 19:18:54 2013 +0100
@@ -57,7 +57,7 @@
{"Retain", "Beibehalten"},
{"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes",
- "Warnung: M\u00F6glicherweise enth\u00E4lt der Dateiname Escape-Zeichen mit Backslash. Es ist nicht notwendig, Backslash-Zeichen zu escapen (das Tool f\u00FChrt dies automatisch beim Schreiben des Policy-Contents in den persistenten Speicher aus).\n\nKlicken Sie auf \"Beibehalten\", um den eingegebenen Namen beizubehalten oder auf \"Bearbeiten\", um den Namen zu bearbeiten."},
+ "Warnung: M\u00F6glicherweise enth\u00E4lt der Dateiname Escapezeichen mit Backslash. Es ist nicht notwendig, Backslash-Zeichen zu escapen (das Tool f\u00FChrt dies automatisch beim Schreiben des Policy-Contents in den persistenten Speicher aus).\n\nKlicken Sie auf \"Beibehalten\", um den eingegebenen Namen beizubehalten oder auf \"Bearbeiten\", um den Namen zu bearbeiten."},
{"Add.Public.Key.Alias", "Public Key-Alias hinzuf\u00FCgen"},
{"Remove.Public.Key.Alias", "Public Key-Alias entfernen"},
@@ -134,6 +134,9 @@
{"policy.type", "Policy-Typ"},
{"property.name", "Eigenschaftsname"},
{"provider.name", "Providername"},
+ {"url", "URL"},
+ {"method.list", "Methodenliste"},
+ {"request.headers.list", "Headerliste anfordern"},
{"Principal.List", "Principal-Liste"},
{"Permission.List", "Berechtigungsliste"},
{"Code.Base", "Codebase"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_es.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_es.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "tipo de pol\u00EDtica"},
{"property.name", "nombre de la propiedad"},
{"provider.name", "nombre del proveedor"},
+ {"url", "url"},
+ {"method.list", "lista de m\u00E9todos"},
+ {"request.headers.list", "lista de cabeceras de solicitudes"},
{"Principal.List", "Lista de Principales"},
{"Permission.List", "Lista de Permisos"},
{"Code.Base", "Base de C\u00F3digo"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_fr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_fr.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "type de r\u00E8gle"},
{"property.name", "nom de propri\u00E9t\u00E9"},
{"provider.name", "nom du fournisseur"},
+ {"url", "url"},
+ {"method.list", "liste des m\u00E9thodes"},
+ {"request.headers.list", "liste des en-t\u00EAtes de demande"},
{"Principal.List", "Liste de principaux"},
{"Permission.List", "Liste de droits"},
{"Code.Base", "Base de code"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_it.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_it.java Thu Oct 03 19:18:54 2013 +0100
@@ -41,7 +41,7 @@
"Avvertenza: argomento o argomenti non validi per il costruttore {0}"},
{"Illegal.Principal.Type.type", "Tipo principal non valido: {0}"},
{"Illegal.option.option", "Opzione non valida: {0}"},
- {"Usage.policytool.options.", "Utilizzo: policytool [opzioni]"},
+ {"Usage.policytool.options.", "Uso: policytool [opzioni]"},
{".file.file.policy.file.location",
" [-file <file>] posizione del file dei criteri"},
{"New", "Nuovo"},
@@ -134,6 +134,9 @@
{"policy.type", "tipo di criteri"},
{"property.name", "nome propriet\u00E0"},
{"provider.name", "nome provider"},
+ {"url", "url"},
+ {"method.list", "lista metodi"},
+ {"request.headers.list", "lista intestazioni di richiesta"},
{"Principal.List", "Lista principal"},
{"Permission.List", "Lista autorizzazioni"},
{"Code.Base", "Codebase"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_ja.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ja.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30BF\u30A4\u30D7"},
{"property.name", "\u30D7\u30ED\u30D1\u30C6\u30A3\u540D"},
{"provider.name", "\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"},
+ {"url", "URL"},
+ {"method.list", "\u30E1\u30BD\u30C3\u30C9\u30FB\u30EA\u30B9\u30C8"},
+ {"request.headers.list", "\u30EA\u30AF\u30A8\u30B9\u30C8\u30FB\u30D8\u30C3\u30C0\u30FC\u30FB\u30EA\u30B9\u30C8"},
{"Principal.List", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30EA\u30B9\u30C8"},
{"Permission.List", "\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u30EA\u30B9\u30C8"},
{"Code.Base", "\u30B3\u30FC\u30C9\u30FB\u30D9\u30FC\u30B9"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_ko.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ko.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "\uC815\uCC45 \uC720\uD615"},
{"property.name", "\uC18D\uC131 \uC774\uB984"},
{"provider.name", "\uC81C\uACF5\uC790 \uC774\uB984"},
+ {"url", "URL"},
+ {"method.list", "\uBA54\uC18C\uB4DC \uBAA9\uB85D"},
+ {"request.headers.list", "\uC694\uCCAD \uD5E4\uB354 \uBAA9\uB85D"},
{"Principal.List", "\uC8FC\uCCB4 \uBAA9\uB85D"},
{"Permission.List", "\uAD8C\uD55C \uBAA9\uB85D"},
{"Code.Base", "\uCF54\uB4DC \uBCA0\uC774\uC2A4"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_pt_BR.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_pt_BR.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "tipo de pol\u00EDtica"},
{"property.name", "nome da propriedade"},
{"provider.name", "nome do fornecedor"},
+ {"url", "url"},
+ {"method.list", "lista de m\u00E9todos"},
+ {"request.headers.list", "solicitar lista de cabe\u00E7alhos"},
{"Principal.List", "Lista de Principais"},
{"Permission.List", "Lista de Permiss\u00F5es"},
{"Code.Base", "Base de C\u00F3digo"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_sv.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_sv.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "policytyp"},
{"property.name", "egenskapsnamn"},
{"provider.name", "leverant\u00F6rsnamn"},
+ {"url", "url"},
+ {"method.list", "metodlista"},
+ {"request.headers.list", "beg\u00E4ranrubriklista"},
{"Principal.List", "Lista \u00F6ver identitetshavare"},
{"Permission.List", "Beh\u00F6righetslista"},
{"Code.Base", "Kodbas"},
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_CN.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_CN.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,7 +35,7 @@
private static final Object[][] contents = {
{"NEWLINE", "\n"},
{"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.",
- "\u8B66\u544A: \u522B\u540D {0} \u7684\u516C\u5171\u5BC6\u94A5\u4E0D\u5B58\u5728\u3002\u8BF7\u786E\u4FDD\u5DF2\u6B63\u786E\u914D\u7F6E KeyStore\u3002"},
+ "\u8B66\u544A: \u522B\u540D {0} \u7684\u516C\u5171\u5BC6\u94A5\u4E0D\u5B58\u5728\u3002\u8BF7\u786E\u4FDD\u5DF2\u6B63\u786E\u914D\u7F6E\u5BC6\u94A5\u5E93\u3002"},
{"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u7C7B: {0}"},
{"Warning.Invalid.argument.s.for.constructor.arg",
"\u8B66\u544A: \u6784\u9020\u5668\u7684\u53C2\u6570\u65E0\u6548: {0}"},
@@ -62,7 +62,7 @@
{"Add.Public.Key.Alias", "\u6DFB\u52A0\u516C\u5171\u5BC6\u94A5\u522B\u540D"},
{"Remove.Public.Key.Alias", "\u5220\u9664\u516C\u5171\u5BC6\u94A5\u522B\u540D"},
{"File", "\u6587\u4EF6"},
- {"KeyStore", "KeyStore"},
+ {"KeyStore", "\u5BC6\u94A5\u5E93"},
{"Policy.File.", "\u7B56\u7565\u6587\u4EF6:"},
{"Could.not.open.policy.file.policyFile.e.toString.",
"\u65E0\u6CD5\u6253\u5F00\u7B56\u7565\u6587\u4EF6: {0}: {1}"},
@@ -94,10 +94,10 @@
{".Edit.Permission", " \u7F16\u8F91\u6743\u9650"},
{"Remove.Permission", "\u5220\u9664\u6743\u9650"},
{"Done", "\u5B8C\u6210"},
- {"KeyStore.URL.", "KeyStore URL:"},
- {"KeyStore.Type.", "KeyStore \u7C7B\u578B:"},
- {"KeyStore.Provider.", "KeyStore \u63D0\u4F9B\u65B9:"},
- {"KeyStore.Password.URL.", "KeyStore \u53E3\u4EE4 URL:"},
+ {"KeyStore.URL.", "\u5BC6\u94A5\u5E93 URL:"},
+ {"KeyStore.Type.", "\u5BC6\u94A5\u5E93\u7C7B\u578B:"},
+ {"KeyStore.Provider.", "\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9:"},
+ {"KeyStore.Password.URL.", "\u5BC6\u94A5\u5E93\u53E3\u4EE4 URL:"},
{"Principals", "\u4E3B\u7528\u6237"},
{".Edit.Principal.", " \u7F16\u8F91\u4E3B\u7528\u6237:"},
{".Add.New.Principal.", " \u6DFB\u52A0\u65B0\u4E3B\u7528\u6237:"},
@@ -123,7 +123,7 @@
{"Save.Changes", "\u4FDD\u5B58\u66F4\u6539"},
{"No.Policy.Entry.selected", "\u6CA1\u6709\u9009\u62E9\u7B56\u7565\u6761\u76EE"},
{"Unable.to.open.KeyStore.ex.toString.",
- "\u65E0\u6CD5\u6253\u5F00 KeyStore: {0}"},
+ "\u65E0\u6CD5\u6253\u5F00\u5BC6\u94A5\u5E93: {0}"},
{"No.principal.selected", "\u672A\u9009\u62E9\u4E3B\u7528\u6237"},
{"No.permission.selected", "\u6CA1\u6709\u9009\u62E9\u6743\u9650"},
{"name", "\u540D\u79F0"},
@@ -134,11 +134,14 @@
{"policy.type", "\u7B56\u7565\u7C7B\u578B"},
{"property.name", "\u5C5E\u6027\u540D\u79F0"},
{"provider.name", "\u63D0\u4F9B\u65B9\u540D\u79F0"},
+ {"url", "URL"},
+ {"method.list", "\u65B9\u6CD5\u5217\u8868"},
+ {"request.headers.list", "\u8BF7\u6C42\u6807\u5934\u5217\u8868"},
{"Principal.List", "\u4E3B\u7528\u6237\u5217\u8868"},
{"Permission.List", "\u6743\u9650\u5217\u8868"},
{"Code.Base", "\u4EE3\u7801\u5E93"},
- {"KeyStore.U.R.L.", "KeyStore URL:"},
- {"KeyStore.Password.U.R.L.", "KeyStore \u53E3\u4EE4 URL:"}
+ {"KeyStore.U.R.L.", "\u5BC6\u94A5\u5E93 URL:"},
+ {"KeyStore.Password.U.R.L.", "\u5BC6\u94A5\u5E93\u53E3\u4EE4 URL:"}
};
--- a/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_TW.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_TW.java Thu Oct 03 19:18:54 2013 +0100
@@ -134,6 +134,9 @@
{"policy.type", "\u539F\u5247\u985E\u578B"},
{"property.name", "\u5C6C\u6027\u540D\u7A31"},
{"provider.name", "\u63D0\u4F9B\u8005\u540D\u7A31"},
+ {"url", "URL"},
+ {"method.list", "\u65B9\u6CD5\u6E05\u55AE"},
+ {"request.headers.list", "\u8981\u6C42\u6A19\u982D\u6E05\u55AE"},
{"Principal.List", "Principal \u6E05\u55AE"},
{"Permission.List", "\u6B0A\u9650\u6E05\u55AE"},
{"Code.Base", "\u4EE3\u78BC\u57FA\u6E96"},
--- a/jdk/src/share/classes/sun/security/util/Resources_fr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/util/Resources_fr.java Thu Oct 03 19:18:54 2013 +0100
@@ -65,12 +65,12 @@
{"invalid.null.Class.provided", "classe NULL fournie non valide"},
{"Subject.", "Objet :\n"},
{".Principal.", "\tPrincipal : "},
- {".Public.Credential.", "\tInformations d'identification et de connexion publiques : "},
+ {".Public.Credential.", "\tInformations d'identification publiques : "},
{".Private.Credentials.inaccessible.",
- "\tInformations d'identification et de connexion priv\u00E9es inaccessibles\n"},
- {".Private.Credential.", "\tInformations d'identification et de connexion priv\u00E9es : "},
+ "\tInformations d'identification priv\u00E9es inaccessibles\n"},
+ {".Private.Credential.", "\tInformations d'identification priv\u00E9es : "},
{".Private.Credential.inaccessible.",
- "\tInformations d'identification et de connexion priv\u00E9es inaccessibles\n"},
+ "\tInformations d'identification priv\u00E9es inaccessibles\n"},
{"Subject.is.read.only", "Sujet en lecture seule"},
{"attempting.to.add.an.object.which.is.not.an.instance.of.java.security.Principal.to.a.Subject.s.Principal.Set",
"tentative d'ajout d'un objet qui n'est pas une instance de java.security.Principal dans un ensemble de principaux du sujet"},
--- a/jdk/src/share/classes/sun/security/util/UntrustedCertificates.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/util/UntrustedCertificates.java Thu Oct 03 19:18:54 2013 +0100
@@ -24,13 +24,15 @@
*/
package sun.security.util;
-import java.io.IOException;
-import java.io.ByteArrayInputStream;
+import java.io.*;
+import java.security.AccessController;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivilegedAction;
import java.security.cert.X509Certificate;
-import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException;
-import java.util.Set;
-import java.util.HashSet;
+import java.util.*;
+import sun.security.x509.X509CertImpl;
/**
* A utility class to check if a certificate is untrusted. This is an internal
@@ -42,8 +44,50 @@
*/
public final class UntrustedCertificates {
- private final static Set<X509Certificate> untrustedCerts = new HashSet<>();
+ private static final Debug debug = Debug.getInstance("certpath");
+ private static final String ALGORITHM_KEY = "Algorithm";
+
+ private static final Properties props = new Properties();
+ private static final String algorithm;
+ static {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ File f = new File(System.getProperty("java.home"),
+ "lib/security/blacklisted.certs");
+ try (FileInputStream fin = new FileInputStream(f)) {
+ props.load(fin);
+ // It's said that the fingerprint could contain colons
+ for (Map.Entry<Object,Object> e: props.entrySet()) {
+ e.setValue(stripColons(e.getValue()));
+ }
+ } catch (IOException fnfe) {
+ if (debug != null) {
+ debug.println("Error parsing blacklisted.certs");
+ }
+ }
+ return null;
+ }
+ });
+ algorithm = props.getProperty(ALGORITHM_KEY);
+ }
+
+ private static String stripColons(Object input) {
+ String s = (String)input;
+ char[] letters = s.toCharArray();
+ int pos = 0;
+ for (int i = 0; i < letters.length; i++) {
+ if (letters[i] != ':') {
+ if (i != pos) {
+ letters[pos] = letters[i];
+ }
+ pos++;
+ }
+ }
+ if (pos == letters.length) return s;
+ else return new String(letters, 0, pos);
+ }
/**
* Checks if a certificate is untrusted.
*
@@ -51,844 +95,21 @@
* @return true if the certificate is untrusted.
*/
public static boolean isUntrusted(X509Certificate cert) {
- return untrustedCerts.contains(cert);
- }
-
- private static void add(String alias, String pemCert) {
- // generate certificate from PEM certificate
- try (ByteArrayInputStream is =
- new ByteArrayInputStream(pemCert.getBytes())) {
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
-
- if (!untrustedCerts.add(cert)) {
- throw new RuntimeException("Duplicate untrusted certificate: " +
- cert.getSubjectX500Principal());
+ if (algorithm == null) {
+ return false;
+ }
+ String key;
+ if (cert instanceof X509CertImpl) {
+ key = ((X509CertImpl)cert).getFingerprint(algorithm);
+ } else {
+ try {
+ key = new X509CertImpl(cert.getEncoded()).getFingerprint(algorithm);
+ } catch (CertificateException cee) {
+ return false;
}
- } catch (CertificateException | IOException e) {
- throw new RuntimeException(
- "Incorrect untrusted certificate: " + alias, e);
}
+ return props.containsKey(key);
}
- static {
- // -----------------------------------------------------------------
- // Compromised CAs of Digicert Malaysia
- //
- // Reported by Digicert in its announcement on November 05, 2011.
- //
-
- // Digicert Malaysia intermediate, cross-signed by CyberTrust
- //
- // Subject: CN=Digisign Server ID (Enrich),
- // OU=457608-K,
- // O=Digicert Sdn. Bhd.,
- // C=MY
- // Issuer: CN=GTE CyberTrust Global Root,
- // OU=GTE CyberTrust Solutions, Inc.,
- // O=GTE Corporation,
- // C=US
- // Serial: 120001705 (07:27:14:a9)
- add("digicert-server-cross-to-cybertrust-4C0E636A",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIDyzCCAzSgAwIBAgIEBycUqTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\n" +
- "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\n" +
- "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\n" +
- "b2JhbCBSb290MB4XDTA3MDcxNzE1MTc0OFoXDTEyMDcxNzE1MTY1NFowYzELMAkG\n" +
- "A1UEBhMCTVkxGzAZBgNVBAoTEkRpZ2ljZXJ0IFNkbi4gQmhkLjERMA8GA1UECxMI\n" +
- "NDU3NjA4LUsxJDAiBgNVBAMTG0RpZ2lzaWduIFNlcnZlciBJRCAoRW5yaWNoKTCB\n" +
- "nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArahkS02Hx4RZufuQRqCmicDx/tXa\n" +
- "VII3DZkrRSYK6Fawf8qo9I5HhAGCKeOzarWR8/uVhbxyqGToCkCcxfRxrnt7agfq\n" +
- "kBRPjYmvlKuyBtQCanuYH1m5Os1U+iDfsioK6bjdaZDAKdNO0JftZszFGUkGf/pe\n" +
- "LHx7hRsyQt97lSUCAwEAAaOCAXgwggF0MBIGA1UdEwEB/wQIMAYBAf8CAQAwXAYD\n" +
- "VR0gBFUwUzBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVy\n" +
- "dHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMAcGBWCDSgEBMA4GA1Ud\n" +
- "DwEB/wQEAwIB5jCBiQYDVR0jBIGBMH+heaR3MHUxCzAJBgNVBAYTAlVTMRgwFgYD\n" +
- "VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv\n" +
- "bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv\n" +
- "b3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0\n" +
- "LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFMYWk04WF+wW\n" +
- "royUdvOGbcV0boR3MA0GCSqGSIb3DQEBBQUAA4GBAHYAe6Z4K2Ydjl42xqSOBfIj\n" +
- "knyTZ9P0wAp9iy3Z6tVvGvPhSilaIoRNUC9LDPL/hcJ7VdREgr5trGeOvLQfkpxR\n" +
- "gBoU9m6rYYgLrRx/90tQUdZlG6ZHcRVesHHzNRTyN71jyNXwk1o0X9g96F33xR7A\n" +
- "5c8fhiSpPAdmzcHSNmNZ\n" +
- "-----END CERTIFICATE-----");
-
- // Digicert Malaysia intermediate, cross-signed by Entrust
- //
- // Subject: CN=Digisign Server ID - (Enrich),
- // OU=457608-K,
- // O=Digicert Sdn. Bhd.,
- // C=MY
- // Issuer: CN=Entrust.net Certification Authority (2048)
- // OU=(c) 1999 Entrust.net Limited,
- // OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),
- // O=Entrust.net
- // Serial: 1184644297 (4c:0e:63:6a)
- add("digicert-server-cross-to-entrust-ca-4C0E636A",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIEzjCCA7agAwIBAgIETA5jajANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML\n" +
- "RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp\n" +
- "bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5\n" +
- "IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp\n" +
- "ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xMDA3MTYxNzIzMzdaFw0xNTA3\n" +
- "MTYxNzUzMzdaMGUxCzAJBgNVBAYTAk1ZMRswGQYDVQQKExJEaWdpY2VydCBTZG4u\n" +
- "IEJoZC4xETAPBgNVBAsTCDQ1NzYwOC1LMSYwJAYDVQQDEx1EaWdpc2lnbiBTZXJ2\n" +
- "ZXIgSUQgLSAoRW5yaWNoKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" +
- "AMWJ5PQNBkCSWccaszXRDkwqM/n4r8qef+65p21g9FTob9Wb8xtjMQRoctE0Foy0\n" +
- "FyyX3nPF2JAVoBor9cuzSIZE8B2ITM5BQhrv9Qze/kDaOSD3BlU6ap1GwdJvpbLI\n" +
- "Vz4po5zg6YV3ZuiYpyR+vsBZIOVEb7ZX2L7OwmV3WMZhQdF0BMh/SULFcqlyFu6M\n" +
- "3RJdtErU0a9Qt9iqdXZorT5dqjBtYairEFs+E78z4K9EnTgiW+9ML6ZxJhUmyiiM\n" +
- "2fqOjqmiFDXimySItPR/hZ2DTwehthSQNsQ0HI0mYW0Tb3i+6I8nx0uElqOGaAwj\n" +
- "vgvsjJQAqQSKE5D334VsDLECAwEAAaOCATQwggEwMA4GA1UdDwEB/wQEAwIBBjAS\n" +
- "BgNVHRMBAf8ECDAGAQH/AgEAMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcD\n" +
- "AgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8v\n" +
- "b2NzcC5lbnRydXN0Lm5ldDBEBgNVHSAEPTA7MDkGBWCDSgEBMDAwLgYIKwYBBQUH\n" +
- "AgEWImh0dHA6Ly93d3cuZGlnaWNlcnQuY29tLm15L2Nwcy5odG0wMgYDVR0fBCsw\n" +
- "KTAnoCWgI4YhaHR0cDovL2NybC5lbnRydXN0Lm5ldC8yMDQ4Y2EuY3JsMBEGA1Ud\n" +
- "DgQKBAhMTswlKAMpgTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDAN\n" +
- "BgkqhkiG9w0BAQUFAAOCAQEAl0zvSjpJrHL8MCBrtClbp8WVBJD5MtXChWreA6E3\n" +
- "+YkAsFqsVX7bQzX/yQH4Ub7MJsrIaqTEVD4mHucMo82XZ5TdpkLrXM2POXlrM3kh\n" +
- "Bnn6gkQVmczBtznTRmJ8snDrb84gqj4Zt+l0gpy0pUtNYQA35IfS8hQ6ZHy4qXth\n" +
- "4JMi59WfPkfmNnagU9gAAzoPtTP+lsrT0oI6Lt3XSOHkp2nMHOmZSufKcEXXCwcO\n" +
- "mnUb0C+Sb/akB8O9HEumhLZ9qJqp0qcp8QtXaR6XVybsK0Os1EWDBQDp4/BGQAf6\n" +
- "6rFRc5Mcpd1TETfIKqcVJx20qsx/qjEw/LhFn0gJ7RDixQ==\n" +
- "-----END CERTIFICATE-----");
-
-
- // -----------------------------------------------------------------
- //
- // No longer used certificates
- //
-
- // Subject: CN=Java Media APIs,
- // OU=Java Signed Extensions,
- // OU=Corporate Object Signing,
- // O=Sun Microsystems Inc
- // Issuer: CN=Object Signing CA,
- // OU=Class 2 OnSite Subscriber CA,
- // OU=VeriSign Trust Network,
- // O=Sun Microsystems Inc
- // Serial: 6a:8b:99:91:37:59:4f:89:53:e2:97:18:9f:19:1e:4e
- add("java-media-pretrusted-9F191E4E",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFdzCCBF+gAwIBAgIQaouZkTdZT4lT4pcYnxkeTjANBgkqhkiG9w0BAQUFADCB\n" +
- "gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT\n" +
- "aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj\n" +
- "cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA5MDUxMjAw\n" +
- "MDAwMFoXDTEyMDUxMTIzNTk1OVowfTEdMBsGA1UEChQUU3VuIE1pY3Jvc3lzdGVt\n" +
- "cyBJbmMxITAfBgNVBAsUGENvcnBvcmF0ZSBPYmplY3QgU2lnbmluZzEfMB0GA1UE\n" +
- "CxQWSmF2YSBTaWduZWQgRXh0ZW5zaW9uczEYMBYGA1UEAxQPSmF2YSBNZWRpYSBB\n" +
- "UElzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl5blzoKTVE8y4Hpz\n" +
- "q6E15RZz1bF5HnYEyYqgHkZXnAKedmYCoMzm1XK8s+gQWShLEvGEAvs5yqarx9gE\n" +
- "nnC21N28aEZgIJMa2/arKxCUkS4pxdGPYGexL9UzSRkUpoBShCZKEGdmX7gfJE2K\n" +
- "/sd9MFvGV5/yZtWXrADzvm0Kd/9mg1KRv1gfrZIq0TJbupoXPYYqb73AkI9eT2ZD\n" +
- "q9MdwD4E5+oojsDFXt8GU/D00fUhtXpYwuplU7D667WHYdJhIah0ST6JywyqcLXG\n" +
- "XSuFTXOgITT2idSHluZVmx3dqJ72u9kPkO4JdJTMDfaK8zgNLaRkiU8Qcj+qhLYH\n" +
- "ytaqcwIDAQABo4IB6jCCAeYwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwfwYD\n" +
- "VR0fBHgwdjB0oHKgcIZuaHR0cDovL29uc2l0ZWNybC52ZXJpc2lnbi5jb20vU3Vu\n" +
- "TWljcm9zeXN0ZW1zSW5jQ29ycG9yYXRlT2JqZWN0U2lnbmluZ0phdmFTaWduZWRF\n" +
- "eHRlbnNpb25zQ2xhc3NCL0xhdGVzdENSTC5jcmwwHwYDVR0jBBgwFoAUs0crgn5T\n" +
- "tHPKuLsZt76BTQeVx+0wHQYDVR0OBBYEFKS32mVx0gNWTeS4ProHEaeSpvvIMDsG\n" +
- "CCsGAQUFBwEBBC8wLTArBggrBgEFBQcwAYYfaHR0cDovL29uc2l0ZS1vY3NwLnZl\n" +
- "cmlzaWduLmNvbTCBtQYDVR0gBIGtMIGqMDkGC2CGSAGG+EUBBxcCMCowKAYIKwYB\n" +
- "BQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwbQYLYIZIAYb3AIN9\n" +
- "nD8wXjAnBggrBgEFBQcCARYbaHR0cHM6Ly93d3cuc3VuLmNvbS9wa2kvY3BzMDMG\n" +
- "CCsGAQUFBwICMCcaJVZhbGlkYXRlZCBGb3IgU3VuIEJ1c2luZXNzIE9wZXJhdGlv\n" +
- "bnMwEwYDVR0lBAwwCgYIKwYBBQUHAwMwDQYJKoZIhvcNAQEFBQADggEBAAe6BO4W\n" +
- "3TSNWfezyelJs6kE3HfulT6Bdyz4UUoh9ykXcV8nRwT+kh25I5MdyG2GfkJoADPR\n" +
- "VhC5DYo13UFpIsTNVjq+hGYe2hML93bN7ad9SxCCyjHUo3yMz2qgBbHZI3VA9ZHA\n" +
- "aWM4Tx0saMwbcnVvlbuGh+PXvStfypJqYT6lzcdFfjNVX4FI/QQNGhBswMY51tC8\n" +
- "GTBCL2qhJon0gSCU4zaawDOf7+XxJWirLamYL1Aal1/h2z2sFrvA/1ftxtU3kZ6I\n" +
- "7De8DyoHeZg7pYGdrj7g+lPhCga/WvEhN152I+aP08YbFcJHYmK05ngl/Ye4c6Bd\n" +
- "cdrdfbw6QzEUIYY=\n" +
- "-----END CERTIFICATE-----");
-
- // Subject: CN=JavaFX 1.0 Runtime,
- // OU=Java Signed Extensions,
- // OU=Corporate Object Signing,
- // O=Sun Microsystems Inc
- // Issuer: CN=Object Signing CA,
- // OU=Class 2 OnSite Subscriber CA,
- // OU=VeriSign Trust Network,
- // O=Sun Microsystems Inc
- // Serial: 55:c0:e6:44:59:59:79:9e:d9:26:f1:b0:4a:1e:f0:27
- add("java-fx10-pretrusted-4A1EF027",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFezCCBGOgAwIBAgIQVcDmRFlZeZ7ZJvGwSh7wJzANBgkqhkiG9w0BAQUFADCB\n" +
- "gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT\n" +
- "aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj\n" +
- "cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA4MTAwOTAw\n" +
- "MDAwMFoXDTExMTAwOTIzNTk1OVowgYAxHTAbBgNVBAoUFFN1biBNaWNyb3N5c3Rl\n" +
- "bXMgSW5jMSEwHwYDVQQLFBhDb3Jwb3JhdGUgT2JqZWN0IFNpZ25pbmcxHzAdBgNV\n" +
- "BAsUFkphdmEgU2lnbmVkIEV4dGVuc2lvbnMxGzAZBgNVBAMUEkphdmFGWCAxLjAg\n" +
- "UnVudGltZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM+WDc6+bu+4\n" +
- "tmAcS/lBtUc02WOt9QZpVsXg9cG2pu/8bUtmDELa8iiYBVFpIs8DU58HLrGQtCUY\n" +
- "SIAGOVPsOJoN29UKCDWfY9j5JeVhfhMGqk9DwrWhzgsjy4cpZ1pIp+k/fJ8zT8Ul\n" +
- "aYLpow1vg3UNddsmwz02tN7cOrMw9WYIG4CRYnY1OrtJSfe2pYzheC4zyvR+aiVl\n" +
- "nang2OtqikSQsNFOFHsLOJFxngy9LrO8evDSu25VTKI6zlWU6/bMeqtztJPN0VOn\n" +
- "NyUrJZvkxZ207Jg0T693BGSxNC1n+ihztXogql8950M/pEuUbDjylv5FFvlp6DSB\n" +
- "dDT2MkutmyMCAwEAAaOCAeowggHmMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeA\n" +
- "MH8GA1UdHwR4MHYwdKByoHCGbmh0dHA6Ly9vbnNpdGVjcmwudmVyaXNpZ24uY29t\n" +
- "L1N1bk1pY3Jvc3lzdGVtc0luY0NvcnBvcmF0ZU9iamVjdFNpZ25pbmdKYXZhU2ln\n" +
- "bmVkRXh0ZW5zaW9uc0NsYXNzQi9MYXRlc3RDUkwuY3JsMB8GA1UdIwQYMBaAFLNH\n" +
- "K4J+U7Rzyri7Gbe+gU0HlcftMB0GA1UdDgQWBBTjgufVi3XJ3gx1ewsA6Rr7BR4Z\n" +
- "zjA7BggrBgEFBQcBAQQvMC0wKwYIKwYBBQUHMAGGH2h0dHA6Ly9vbnNpdGUtb2Nz\n" +
- "cC52ZXJpc2lnbi5jb20wgbUGA1UdIASBrTCBqjA5BgtghkgBhvhFAQcXAjAqMCgG\n" +
- "CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMG0GC2CGSAGG\n" +
- "9wCDfZw/MF4wJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3LnN1bi5jb20vcGtpL2Nw\n" +
- "czAzBggrBgEFBQcCAjAnGiVWYWxpZGF0ZWQgRm9yIFN1biBCdXNpbmVzcyBPcGVy\n" +
- "YXRpb25zMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3DQEBBQUAA4IBAQAB\n" +
- "YVJTTVe7rzyTO4jc3zajErOT/COkdQTfNo0eIX1QbNynFieJvwY/jRzUZwjktIFR\n" +
- "2p4JtbpHGAtKtjOAOTieQ8xdDOoC1djzpE7/AbMvuvlTavtUKT+F7tPdhfXgWXJV\n" +
- "6Wbt8jryKyk3zZGiEhauIwZUkfjRkEtffEmZWLUd8c8rURJjfC/XHH2oyurscoxc\n" +
- "CjX29c9ynxSiS/VvQp1an0HvErGh69N48wj7cj8mtZ1yHzd2XCzSSR1OfTPfk0Pt\n" +
- "yg51p7yJaFiH21PTZegEL6zyVNOYBTKwwIi2OzpwYalD3uvK6e3OKDrfFCOxu17u\n" +
- "4PveESbrdyrmvLe7IVez\n" +
- "-----END CERTIFICATE-----");
-
- // Subject: CN=JavaFX Runtime,
- // OU=Java Signed Extensions,
- // OU=Corporate Object Signing,
- // O=Sun Microsystems Inc
- // Issuer: CN=Object Signing CA,
- // OU=Class 2 OnSite Subscriber CA,
- // OU=VeriSign Trust Network,
- // O=Sun Microsystems Inc
- // Serial: 47:f4:55:f1:da:4a:5e:f9:e3:f7:a8:03:62:17:c0:ff
- add("javafx-runtime-pretrusted-6217C0FF",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFdjCCBF6gAwIBAgIQR/RV8dpKXvnj96gDYhfA/zANBgkqhkiG9w0BAQUFADCB\n" +
- "gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT\n" +
- "aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj\n" +
- "cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA5MDEyOTAw\n" +
- "MDAwMFoXDTEyMDEyOTIzNTk1OVowfDEdMBsGA1UEChQUU3VuIE1pY3Jvc3lzdGVt\n" +
- "cyBJbmMxITAfBgNVBAsUGENvcnBvcmF0ZSBPYmplY3QgU2lnbmluZzEfMB0GA1UE\n" +
- "CxQWSmF2YSBTaWduZWQgRXh0ZW5zaW9uczEXMBUGA1UEAxQOSmF2YUZYIFJ1bnRp\n" +
- "bWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCIzd0fAk8mI9ONc6RJ\n" +
- "aGieioK2FLdXEwj8zL3vdGDVmBwyR1zwYkaOIFFgF9IW/8qc4iAYA5sGUY+0g8q3\n" +
- "5DuYAxfTzBB5KdaYvbuq6GGnoHIWmTirXY+1friFp8lyXSvtuEaGB1VHaBoZchEg\n" +
- "k+UgeVDA43dHwcT1Ov3DePczJRUes8T/QHzLX+BxUDG43vjyncCEO/AjqLZxXEz2\n" +
- "xrNbKLcH3lGMJK7hdbfssUfF5BjC38Hn71HauYlA43b2no+2y0Sjulwzez2YPbDC\n" +
- "0GLR3TnKtA8dqOrnl5t3DniDbfOBNtBE3VOydJO0XW57Ng1HRXD023nm9ECPY2xp\n" +
- "0N/pAgMBAAGjggHqMIIB5jAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDB/BgNV\n" +
- "HR8EeDB2MHSgcqBwhm5odHRwOi8vb25zaXRlY3JsLnZlcmlzaWduLmNvbS9TdW5N\n" +
- "aWNyb3N5c3RlbXNJbmNDb3Jwb3JhdGVPYmplY3RTaWduaW5nSmF2YVNpZ25lZEV4\n" +
- "dGVuc2lvbnNDbGFzc0IvTGF0ZXN0Q1JMLmNybDAfBgNVHSMEGDAWgBSzRyuCflO0\n" +
- "c8q4uxm3voFNB5XH7TAdBgNVHQ4EFgQUvOdd0cKPj+Yik/iOBwTdphh5A+gwOwYI\n" +
- "KwYBBQUHAQEELzAtMCsGCCsGAQUFBzABhh9odHRwOi8vb25zaXRlLW9jc3AudmVy\n" +
- "aXNpZ24uY29tMIG1BgNVHSAEga0wgaowOQYLYIZIAYb4RQEHFwIwKjAoBggrBgEF\n" +
- "BQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYTBtBgtghkgBhvcAg32c\n" +
- "PzBeMCcGCCsGAQUFBwIBFhtodHRwczovL3d3dy5zdW4uY29tL3BraS9jcHMwMwYI\n" +
- "KwYBBQUHAgIwJxolVmFsaWRhdGVkIEZvciBTdW4gQnVzaW5lc3MgT3BlcmF0aW9u\n" +
- "czATBgNVHSUEDDAKBggrBgEFBQcDAzANBgkqhkiG9w0BAQUFAAOCAQEAbGcf2NjL\n" +
- "AI93HG6ny2BbepaZA1a8xa/R6uUc7xV+Qw6MgLwFD4Q4i6LWUztQDvg9l68MM2/i\n" +
- "Y9LEi1KM4lcNbK5+D+t9x98wXBiuojXhVdp5ZmC03EyEBbriopdBsmXVLDSu/Y3+\n" +
- "zowOO5xwpMK3dbgsSDs2Vt0UosD3FTcRaD3GNfOhXMp+o1grHNiXF9YgkmdQbPPZ\n" +
- "DQ2KBhFPCRJXBGvyKOqno/DTg0sQ3crGH/C4/4t7mnQXWldZotmJUZ0ONc9oD+Q1\n" +
- "JAaguUKqIwn9yZ093ie+JWHbYNid9IIIPXYgtRxmf9a376WBhqhu56uJftBJ7x9g\n" +
- "eQ7Lot6CSWCiFw==\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised Solaris INTERNAL DEVELOPMENT USE ONLY certificate
- //
-
- // Subject: CN=Solaris INTERNAL DEVELOPMENT USE ONLY,
- // OU=Solaris Cryptographic Framework,
- // OU=Corporate Object Signing,
- // O=Sun Microsystems Inc
- // Issuer: CN=Object Signing CA,
- // OU=Class 2 OnSite Subscriber CA,
- // OU=VeriSign Trust Network,
- // O=Sun Microsystems Inc
- // Serial: 77:29:77:52:6a:19:7b:9a:a6:a2:c7:99:a0:e1:cd:8c
- add("solaris-internal-dev-A0E1CD8C",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFHjCCBAagAwIBAgIQdyl3UmoZe5qmoseZoOHNjDANBgkqhkiG9w0BAQUFADCB\n" +
- "gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT\n" +
- "aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj\n" +
- "cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA3MDEwNDAw\n" +
- "MDAwMFoXDTEwMDEwMzIzNTk1OVowgZwxHTAbBgNVBAoUFFN1biBNaWNyb3N5c3Rl\n" +
- "bXMgSW5jMSEwHwYDVQQLFBhDb3Jwb3JhdGUgT2JqZWN0IFNpZ25pbmcxKDAmBgNV\n" +
- "BAsUH1NvbGFyaXMgQ3J5cHRvZ3JhcGhpYyBGcmFtZXdvcmsxLjAsBgNVBAMUJVNv\n" +
- "bGFyaXMgSU5URVJOQUwgREVWRUxPUE1FTlQgVVNFIE9OTFkwgZ8wDQYJKoZIhvcN\n" +
- "AQEBBQADgY0AMIGJAoGBALbNU4hf3mD5ArDI9pjgioAyvV3bjMPRQdCZniIeGJBp\n" +
- "odFlSEH+Mh64W1DsY8coeZ7FvvGJkx9IpTMJW9k8w1oJK9UNqHyAQfaYjQyXi3xQ\n" +
- "LJp62EvYdGfDlwOZejEcR/MbzZG+GOPMMvQj5+xyFDvLXNGfQNTnxw2qnBgCJXjj\n" +
- "AgMBAAGjggH1MIIB8TAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDCBiQYDVR0f\n" +
- "BIGBMH8wfaB7oHmGd2h0dHA6Ly9vbnNpdGVjcmwudmVyaXNpZ24uY29tL1N1bk1p\n" +
- "Y3Jvc3lzdGVtc0luY0NvcnBvcmF0ZU9iamVjdFNpZ25pbmdTb2xhcmlzQ3J5cHRv\n" +
- "Z3JhcGhpY0ZyYW1ld29ya0NsYXNzQi9MYXRlc3RDUkwuY3JsMB8GA1UdIwQYMBaA\n" +
- "FLNHK4J+U7Rzyri7Gbe+gU0HlcftMB0GA1UdDgQWBBRpfiGYkehTnsIzuN2H6AFb\n" +
- "VCZG8jA7BggrBgEFBQcBAQQvMC0wKwYIKwYBBQUHMAGGH2h0dHA6Ly9vbnNpdGUt\n" +
- "b2NzcC52ZXJpc2lnbi5jb20wgbUGA1UdIASBrTCBqjA5BgtghkgBhvhFAQcXAjAq\n" +
- "MCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMG0GC2CG\n" +
- "SAGG9wCDfZw/MF4wJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3LnN1bi5jb20vcGtp\n" +
- "L2NwczAzBggrBgEFBQcCAjAnFiVWYWxpZGF0ZWQgRm9yIFN1biBCdXNpbmVzcyBP\n" +
- "cGVyYXRpb25zMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3DQEBBQUAA4IB\n" +
- "AQCG5soy3LFHTFbA8/5SzDRhQoJkHUnOP0t3b6nvX6vZYRp649fje7TQOPRm1pFd\n" +
- "CZ17J+tggdZwgzTqY4aYpJ00jZaK6pV37q/vgFC/ia6jDs8Q+ly9cEcadBZ5loYg\n" +
- "cmxp9p57W2MNWx8VA8oFdNtKfF0jUNXbLNtvwGHmgR6YcwLrGN1b6/9Lt9bO3ODl\n" +
- "FO+ZDwkfQz5ClUVrTx2dGBvKRYFqSG5S8JAfsgYhPvcacUQkA7ExyKvfRXLWVrce\n" +
- "ZiPpcElbx+819H2sAPvVvparVeAruZGMAtejHZp9NFoowKen5drJp9VxePS4eM49\n" +
- "3DepB6lKRrNRw66LNQol4ZBz\n" +
- "-----END CERTIFICATE-----");
-
-
- // -----------------------------------------------------------------
- // Compromised CAs of DigiNotar
- //
- // Reported by Fox-IT in its interim report on September 5, 2011,
- // "DigiNotar Certificate Authority breach 'Operation Black Tulip'".
- //
-
- //
- // Compromised DigiNotar Cyber CA
- //
-
- // DigiNotar intermediate, cross-signed by CyberTrust
- //
- // Subject: EMAILADDRESS=info@diginotar.nl, CN=DigiNotar Cyber CA,
- // O=DigiNotar, C=NL
- // Issuer: CN=GTE CyberTrust Global Root,
- // OU=GTE CyberTrust Solutions, Inc.,
- // O=GTE Corporation,
- // C=US
- // Serial: 120000525 (07:27:10:0D)
- add("info-at-diginotar-cyber-ca-cross-to-gte-cybertrust-0727100D",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFWjCCBMOgAwIBAgIEBycQDTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\n" +
- "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\n" +
- "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\n" +
- "b2JhbCBSb290MB4XDTA2MTAwNDEwNTQxMVoXDTExMTAwNDEwNTMxMVowYDELMAkG\n" +
- "A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy\n" +
- "IEN5YmVyIENBMSAwHgYJKoZIhvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIw\n" +
- "DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANLOFQotqF6EZ639vu9Gx8i5z3P8\n" +
- "9DS5+SxD52ATPXrjss87Z2yQrcC5P4RS8DVC3HTcKDu9UrSnrHJFF8bwieu0qiXy\n" +
- "XUte0dmHutZ9fPXOMp8QM8WxSrtekTHC0OlBwpFkfglBO9uLCDdqqspS3rU5HsCI\n" +
- "A6U/i5kTYUO1m4Kz7iBvz6FEouova0CfjytXraFTwoUiaZ2gP1HfC0GRDaXhqKpc\n" +
- "SQhdvd5wQbEPyWNr0380dAIvNFp4dRxoeoFnivPaQPBgY/SSINcDpj2jHmfEhBtB\n" +
- "pcmM5r3qSLYFFgizNxJa92E89zhvLpfgb1Y4VNMota0Ubi5LZLUnZbd1JQm2Bz2V\n" +
- "VgIKgmCyc0XgMyZRdJq51FAc9k1bW1JSE1qmf6cO4ehBVGeYjIfVydNsy9NUkgYJ\n" +
- "NEH3gW8/nsl8dVWw58Gzd+jDxAA1lUBwEEoF3iW7n1mlZLxHYL9g43aLE1Xd4XR6\n" +
- "uc8kpmp/3mQiRFhogmoQ+T3lPhu5vfwi9GAEibtVbShV+t6OjRshFNc3izR7Tfay\n" +
- "shDPM7F9HGKZSMsrbHaWVb8ZDR0fu2WqG46ZtcYokOWCLXhQIJr9eS8kf/CJKWn0\n" +
- "fc1zvrPtTsHR7VJej/e4142HrbLZG1ES/1az4a80fVykeIgQnp0DxqWqoiRR90kU\n" +
- "xbHuWUOV36toKDA/AgMBAAGjggGGMIIBgjASBgNVHRMBAf8ECDAGAQH/AgEBMFMG\n" +
- "A1UdIARMMEowSAYJKwYBBAGxPgEAMDswOQYIKwYBBQUHAgEWLWh0dHA6Ly93d3cu\n" +
- "cHVibGljLXRydXN0LmNvbS9DUFMvT21uaVJvb3QuaHRtbDAOBgNVHQ8BAf8EBAMC\n" +
- "AQYwgaAGA1UdIwSBmDCBlYAUpgwdn2H/Bxe1vzhG20Mw1Y6wUgaheaR3MHUxCzAJ\n" +
- "BgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdU\n" +
- "RSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVy\n" +
- "VHJ1c3QgR2xvYmFsIFJvb3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93\n" +
- "d3cucHVibGljLXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYD\n" +
- "VR0OBBYEFKv5aN/PSjfXe0WMX3LeQETDZbvCMA0GCSqGSIb3DQEBBQUAA4GBAI9o\n" +
- "a6VbB7pEZg4cqFwwezPkCiYE/O+eGjjWLqEf0JlHwnVkJP2eOyh2uSYoYZEMbSz4\n" +
- "BJ98UAHV42mv7xXSRZskCSpmBU8lgcpdvqrBWSeuM46C9990sFWzjvjnN8huqlZE\n" +
- "9r1TgSOWPbT6MopTZkQloiXGpjwljPDgKAYityZB\n" +
- "-----END CERTIFICATE-----");
-
- // DigiNotar intermediate, cross-signed by CyberTrust
- //
- // Subject: CN=DigiNotar Cyber CA, O=DigiNotar, C=NL
- // Issuer: CN=GTE CyberTrust Global Root,
- // OU=GTE CyberTrust Solutions, Inc.,
- // O=GTE Corporation,
- // C=US
- // Serial: 120000505 (07:27:0F:F9)
- add("diginotar-cyber-ca-cross-to-gte-cybertrust-07270FF9",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFODCCBKGgAwIBAgIEBycP+TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\n" +
- "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\n" +
- "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\n" +
- "b2JhbCBSb290MB4XDTA2MDkyMDA5NDUzMloXDTEzMDkyMDA5NDQwNlowPjELMAkG\n" +
- "A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy\n" +
- "IEN5YmVyIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0s4VCi2o\n" +
- "XoRnrf2+70bHyLnPc/z0NLn5LEPnYBM9euOyzztnbJCtwLk/hFLwNULcdNwoO71S\n" +
- "tKesckUXxvCJ67SqJfJdS17R2Ye61n189c4ynxAzxbFKu16RMcLQ6UHCkWR+CUE7\n" +
- "24sIN2qqylLetTkewIgDpT+LmRNhQ7WbgrPuIG/PoUSi6i9rQJ+PK1etoVPChSJp\n" +
- "naA/Ud8LQZENpeGoqlxJCF293nBBsQ/JY2vTfzR0Ai80Wnh1HGh6gWeK89pA8GBj\n" +
- "9JIg1wOmPaMeZ8SEG0GlyYzmvepItgUWCLM3Elr3YTz3OG8ul+BvVjhU0yi1rRRu\n" +
- "LktktSdlt3UlCbYHPZVWAgqCYLJzReAzJlF0mrnUUBz2TVtbUlITWqZ/pw7h6EFU\n" +
- "Z5iMh9XJ02zL01SSBgk0QfeBbz+eyXx1VbDnwbN36MPEADWVQHAQSgXeJbufWaVk\n" +
- "vEdgv2DjdosTVd3hdHq5zySman/eZCJEWGiCahD5PeU+G7m9/CL0YASJu1VtKFX6\n" +
- "3o6NGyEU1zeLNHtN9rKyEM8zsX0cYplIyytsdpZVvxkNHR+7Zaobjpm1xiiQ5YIt\n" +
- "eFAgmv15LyR/8IkpafR9zXO+s+1OwdHtUl6P97jXjYetstkbURL/VrPhrzR9XKR4\n" +
- "iBCenQPGpaqiJFH3SRTFse5ZQ5Xfq2goMD8CAwEAAaOCAYYwggGCMBIGA1UdEwEB\n" +
- "/wQIMAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcC\n" +
- "ARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5odG1s\n" +
- "MA4GA1UdDwEB/wQEAwIBBjCBoAYDVR0jBIGYMIGVgBSmDB2fYf8HF7W/OEbbQzDV\n" +
- "jrBSBqF5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlv\n" +
- "bjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYD\n" +
- "VQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUwRQYDVR0fBD4wPDA6\n" +
- "oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL2NnaS1iaW4vQ1JMLzIw\n" +
- "MTgvY2RwLmNybDAdBgNVHQ4EFgQUq/lo389KN9d7RYxfct5ARMNlu8IwDQYJKoZI\n" +
- "hvcNAQEFBQADgYEACcpiD427SuDUejUrBi3RKGG2rAH7g0m8rtQvLYauGYOl1h0T\n" +
- "4he+/jJ06XoUOMqUXvcpAWlxG5Ea/aO7qh3Ke+IW/aGjDvMMX7LhIDGUK16Sdu36\n" +
- "6bUjpr8KOwOpb1JgVM1f6bcvfKIn/UGDdbYN+3gm87FF6TKVKho1IZXFonU=\n" +
- "-----END CERTIFICATE-----");
-
- // DigiNotar intermediate, cross-signed by CyberTrust
- //
- // Subject: CN=DigiNotar Cyber CA, O=DigiNotar, C=NL
- // Issuer: CN=GTE CyberTrust Global Root,
- // OU=GTE CyberTrust Solutions, Inc.,
- // O=GTE Corporation,
- // C=US
- // Serial: 120000515 (07:27:10:03)
- add("diginotar-cyber-ca-cross-to-gte-cybertrust-07271003",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFODCCBKGgAwIBAgIEBycQAzANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV\n" +
- "UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU\n" +
- "cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds\n" +
- "b2JhbCBSb290MB4XDTA2MDkyNzEwNTMzMloXDTExMDkyNzEwNTIzMFowPjELMAkG\n" +
- "A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy\n" +
- "IEN5YmVyIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0s4VCi2o\n" +
- "XoRnrf2+70bHyLnPc/z0NLn5LEPnYBM9euOyzztnbJCtwLk/hFLwNULcdNwoO71S\n" +
- "tKesckUXxvCJ67SqJfJdS17R2Ye61n189c4ynxAzxbFKu16RMcLQ6UHCkWR+CUE7\n" +
- "24sIN2qqylLetTkewIgDpT+LmRNhQ7WbgrPuIG/PoUSi6i9rQJ+PK1etoVPChSJp\n" +
- "naA/Ud8LQZENpeGoqlxJCF293nBBsQ/JY2vTfzR0Ai80Wnh1HGh6gWeK89pA8GBj\n" +
- "9JIg1wOmPaMeZ8SEG0GlyYzmvepItgUWCLM3Elr3YTz3OG8ul+BvVjhU0yi1rRRu\n" +
- "LktktSdlt3UlCbYHPZVWAgqCYLJzReAzJlF0mrnUUBz2TVtbUlITWqZ/pw7h6EFU\n" +
- "Z5iMh9XJ02zL01SSBgk0QfeBbz+eyXx1VbDnwbN36MPEADWVQHAQSgXeJbufWaVk\n" +
- "vEdgv2DjdosTVd3hdHq5zySman/eZCJEWGiCahD5PeU+G7m9/CL0YASJu1VtKFX6\n" +
- "3o6NGyEU1zeLNHtN9rKyEM8zsX0cYplIyytsdpZVvxkNHR+7Zaobjpm1xiiQ5YIt\n" +
- "eFAgmv15LyR/8IkpafR9zXO+s+1OwdHtUl6P97jXjYetstkbURL/VrPhrzR9XKR4\n" +
- "iBCenQPGpaqiJFH3SRTFse5ZQ5Xfq2goMD8CAwEAAaOCAYYwggGCMBIGA1UdEwEB\n" +
- "/wQIMAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcC\n" +
- "ARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5odG1s\n" +
- "MA4GA1UdDwEB/wQEAwIBBjCBoAYDVR0jBIGYMIGVgBSmDB2fYf8HF7W/OEbbQzDV\n" +
- "jrBSBqF5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlv\n" +
- "bjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYD\n" +
- "VQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUwRQYDVR0fBD4wPDA6\n" +
- "oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL2NnaS1iaW4vQ1JMLzIw\n" +
- "MTgvY2RwLmNybDAdBgNVHQ4EFgQUq/lo389KN9d7RYxfct5ARMNlu8IwDQYJKoZI\n" +
- "hvcNAQEFBQADgYEAWcyGZhizJlRP1jjNupZey+yZG6oMDW4Z11boriMHbYPCndBE\n" +
- "bVh07zmPbZsihOw9w/vm5KbVX5CgxUv4Rhzh/20Faixf3P3bpWg0qgzHVVusNVR/\n" +
- "P50aKkpdK3hp+QLl56e+lWOddSAINIpmcuyDI1hyuzB+GJEASm9tNU/6rs8=\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised DigiNotar Root CA
- //
-
- // DigiNotar intermediate, cross-signed by Entrust
- //
- // Subject: EMAILADDRESS=info@diginotar.nl,
- // CN=DigiNotar Root CA,
- // O=DigiNotar, C=NL
- // Issuer: CN=Entrust.net Secure Server Certification Authority
- // OU=(c) 1999 Entrust.net Limited,
- // OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
- // O=Entrust.net,
- // C=US,
- // Serial: 1184644297 (46:9C:3C:C9)
- add("info-at-diginotar-root-ca-cross-to-entrust-secure-server-469C3CC9",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFSDCCBLGgAwIBAgIERpw8yTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" +
- "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" +
- "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" +
- "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" +
- "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA0\n" +
- "MjYwNTAwMDBaFw0xMzA4MTQyMDEyMzZaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" +
- "EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI\n" +
- "hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n" +
- "ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt\n" +
- "OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx\n" +
- "hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7\n" +
- "gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D\n" +
- "IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T\n" +
- "BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs\n" +
- "Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8\n" +
- "5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf\n" +
- "DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX\n" +
- "9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e\n" +
- "7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj\n" +
- "ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB\n" +
- "BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF\n" +
- "BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD\n" +
- "VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy\n" +
- "bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G\n" +
- "A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob\n" +
- "BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAI979rBep8tu3TeLunapgsZ0jtXp\n" +
- "GDFjKWSk87dj1jCyYi+q/GyDyZ6ZQZNRP0sF+6twscq05lClWNy3TROMp7QeuoLO\n" +
- "G7Utw3OJaswUtp4YglANMRTHEe3g9ltifUXRH5tSuy7u6yi4LD4WTm5ULP6r/g6l\n" +
- "0CnjXYb0+b1Fmz6U\n" +
- "-----END CERTIFICATE-----");
-
- // DigiNotar intermediate, cross-signed by Entrust
- //
- // Subject: EMAILADDRESS=info@diginotar.nl,
- // CN=DigiNotar Root CA,
- // O=DigiNotar, C=NL
- // Issuer: CN=Entrust.net Secure Server Certification Authority
- // OU=(c) 1999 Entrust.net Limited,
- // OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
- // O=Entrust.net,
- // C=US,
- // Serial: 1184640175 (46:9C:2C:AF)
- add("info-at-diginotar-root-ca-cross-to-entrust-secure-server-469C2CAF",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFSDCCBLGgAwIBAgIERpwsrzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" +
- "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" +
- "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" +
- "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" +
- "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3\n" +
- "MjYxNTU3MzlaFw0xMzA4MjYxNjI3MzlaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" +
- "EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI\n" +
- "hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP\n" +
- "ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt\n" +
- "OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx\n" +
- "hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7\n" +
- "gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D\n" +
- "IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T\n" +
- "BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs\n" +
- "Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8\n" +
- "5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf\n" +
- "DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX\n" +
- "9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e\n" +
- "7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj\n" +
- "ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB\n" +
- "BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF\n" +
- "BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD\n" +
- "VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy\n" +
- "bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G\n" +
- "A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob\n" +
- "BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAEa6RcDNcEIGUlkDJUY/pWTds4zh\n" +
- "xbVkp3wSmpwPFhx5fxTyF4HD2L60jl3aqjTB7gPpsL2Pk5QZlNsi3t4UkCV70UOd\n" +
- "ueJRN3o/LOtk4+bjXY2lC0qTHbN80VMLqPjmaf9ghSA9hwhskdtMgRsgfd90q5QP\n" +
- "ZFdYf+hthc3m6IcJ\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised DigiNotar PKIoverheid CA Organisatie - G2
- //
-
- // DigiNotar intermediate, cross-signed by the Dutch government
- //
- // Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2,
- // O=DigiNotar B.V.,
- // C=NL
- // Issuer: CN=Staat der Nederlanden Organisatie CA - G2,
- // O=Staat der Nederlanden,
- // C=NL
- // Serial: 20001983 (01:31:34:bf)
- add("diginotar-pkioverheid-organisatie-cross-to-nederlanden-013134BF",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIGnDCCBISgAwIBAgIEATE0vzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJO\n" +
- "TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTIwMAYDVQQDDClTdGFh\n" +
- "dCBkZXIgTmVkZXJsYW5kZW4gT3JnYW5pc2F0aWUgQ0EgLSBHMjAeFw0xMDA1MTIw\n" +
- "ODUxMzhaFw0yMDAzMjMwOTUwMDRaMFoxCzAJBgNVBAYTAk5MMRcwFQYDVQQKDA5E\n" +
- "aWdpTm90YXIgQi5WLjEyMDAGA1UEAwwpRGlnaU5vdGFyIFBLSW92ZXJoZWlkIENB\n" +
- "IE9yZ2FuaXNhdGllIC0gRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC\n" +
- "AQCxExkPJ+Zs1FWGS9DsiYpFkXisR71HK+T8RetPtCZzWzfTw3/2497Xo/gtaMUI\n" +
- "PkuU1uSHJTZrhLUYdPMoWHMvm2rPvAQe9t7dr/xLqvXbZmIlASWC3vKXWhBu3V2p\n" +
- "IrEEqSNzOvhxrR3PhETrR9Gvbch8KKvH8jd6dF9fxQIUiqNa4xtsAeNdjtlo1vQJ\n" +
- "GzLckbUs9SDrjANtJkm4k8SFXdjSm69WaswFM8ygQp40VUSca6DUEtArVM23iQ3l\n" +
- "9uvo+4UBM096a/GdcjOWDveyhKWlJ8Qn8VFzKXe6Z27+TNy04qGhgS85SY1DOBPO\n" +
- "0KVcwoc6AGdlQiPxNlkKHaNRyLyjlCox3+M88p0aPASw77EKMBNzttfzo0wBdRSF\n" +
- "eMDXijlYhVD6LubFvs+LP6+PNtQlCS3SD6xyk/K/i9RQs/kVUJuZ9RTZ+4uRozIm\n" +
- "JqD43ztggYaDeVsr6xM9KTrBbd29no6H1kquNJcF7hSm9tw4fkrpJFQHPZdoN0Zr\n" +
- "DceoIa8TVOQJavFNRgrJXfubT73e+7dUy7g4nKc5+2otwHuNq6WnV+xKkoozxeEg\n" +
- "XHPYkJIrgNUPhhhpfDlPhIa890xb89W0yqDC8DciynlSH1PmqvOQsDvd8ij9rOvF\n" +
- "BiSgydQvD1j9tZ7sD8+yWdCiBHo4aq5y+73wJWKUCacFCwIDAQABo4IBYTCCAV0w\n" +
- "SAYDVR0gBEEwPzA9BgRVHSAAMDUwMwYIKwYBBQUHAgEWJ2h0dHA6Ly93d3cuZGln\n" +
- "aW5vdGFyLm5sL2Nwcy9wa2lvdmVyaGVpZDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud\n" +
- "DwEB/wQEAwIBBjCBhQYDVR0jBH4wfIAUORCLSZJc22ESIM1JnRqO2pxnQLmhXqRc\n" +
- "MFoxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4x\n" +
- "KzApBgNVBAMMIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzKCBACY\n" +
- "lvQwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5wa2lvdmVyaGVpZC5ubC9E\n" +
- "b21PcmdhbmlzYXRpZUxhdGVzdENSTC1HMi5jcmwwHQYDVR0OBBYEFLxdlDvZq3sD\n" +
- "JXNhwtst7vyrj2WhMA0GCSqGSIb3DQEBCwUAA4ICAQCP/C1Mt9kt1R+978v0t2gX\n" +
- "dZ1O1ffdnPEqJu2forYcA9VTs+wIzzTi48P0tRYvyMO+19NzqwA2+RpKftZj6V5G\n" +
- "uqW2jhW3oyrYQx3vXcgfgYWzi/f/PPTZ9EYIP5y8HaDZqEzNJVJOCrEg9x/pQ9lU\n" +
- "RoETmsBedGwqmDLq/He7DaWiMZgifnx859qkrey3LhoZcfhIUNpDjyyE3cFAJ+O1\n" +
- "8BVOltT4XOOGKUYr1zsH6zh/yIZXl9PvKjPEF1DVZGlrK2tFXl0vF8paTs/D1zk8\n" +
- "9TufRrmb5w5Jl53W1eMbD+qPAU6aE5RZCgIHSEsaYKt/T+0L2FUNaG9VnGllFULs\n" +
- "wNzdbKzDFs4LHVabpMTE0i7gD+JEJytQaaTcYuiKISlCbMwAOpZ2m+9AwKRed4Qy\n" +
- "bCYqOWauXeO5ubIsaB8empADOfCqs6TMSYsYNOk3yXspx4R8b0QVL+xhWQTJRcui\n" +
- "1lKifH8pktZKxYtCqNT+6tjHhyMY5J16fXNAUpigrm7jBT8FD+Clxm1N7YM3iJzH\n" +
- "89xCmmq21yFJNnfy7xhPxXDZnunetyuL9Lx+KN8NQMmFXK6dxTH/0FwOtah+8Okv\n" +
- "uq+IruW10Vilr5xxpykBkINpN4IFuvwJwQhujHg7wzMCgD9EhQgd31VWCK0shS1d\n" +
- "sQPhrqp0xaTzTro3mHuCuQ==\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised DigiNotar PKIoverheid CA Overheid en Bedrijven
- //
-
- // DigiNotar intermediate, cross-signed by the Dutch government
- //
- // Subject: CN=DigiNotar PKIoverheid CA Overheid en Bedrijven,
- // O=DigiNotar B.V.,
- // C=NL
- // Issuer: CN=Staat der Nederlanden Overheid CA
- // O=Staat der Nederlanden,
- // C=NL
- // Serial: 20015536 (01:31:69:b0)
- add("diginotar-pkioverheid-overheid-enb-cross-to-nederlanden-013169B0",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIEiDCCA3CgAwIBAgIEATFpsDANBgkqhkiG9w0BAQUFADBZMQswCQYDVQQGEwJO\n" +
- "TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSowKAYDVQQDEyFTdGFh\n" +
- "dCBkZXIgTmVkZXJsYW5kZW4gT3ZlcmhlaWQgQ0EwHhcNMDcwNzA1MDg0MjA3WhcN\n" +
- "MTUwNzI3MDgzOTQ2WjBfMQswCQYDVQQGEwJOTDEXMBUGA1UEChMORGlnaU5vdGFy\n" +
- "IEIuVi4xNzA1BgNVBAMTLkRpZ2lOb3RhciBQS0lvdmVyaGVpZCBDQSBPdmVyaGVp\n" +
- "ZCBlbiBCZWRyaWp2ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDc\n" +
- "vdKnTmoKuzuiheF/AK2+tDBomAfNoHrElM9x+Yo35FPrV3bMi+Zs/u6HVcg+uwQ5\n" +
- "AKeAeKxbT370vbhUuHE7BzFJOZNUfCA7eSuPu2GQfbGs5h+QLp1FAalkLU3DL7nn\n" +
- "UNVOKlyrdnY3Rtd57EKZ96LspIlw3Dgrh6aqJOadkiQbvvb91C8ZF3rmMgeUVAVT\n" +
- "Q+lsvK9Hy7zL/b07RBKB8WtLu+20z6slTxjSzAL8o0+1QjPLWc0J3NNQ/aB2jKx+\n" +
- "ZopC9q0ckvO2+xRG603XLzDgbe5bNr5EdLcgBVeFTegAGaL2DOauocBC36esgl3H\n" +
- "aLcY5olLmmv6znn58yynAgMBAAGjggFQMIIBTDBIBgNVHSAEQTA/MD0GBFUdIAAw\n" +
- "NTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5kaWdpbm90YXIubmwvY3BzL3BraW92\n" +
- "ZXJoZWlkMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMIGABgNVHSME\n" +
- "eTB3gBQLhtYPd6NosftkCcOIblwEHFfpPaFZpFcwVTELMAkGA1UEBhMCTkwxHjAc\n" +
- "BgNVBAoTFVN0YWF0IGRlciBOZWRlcmxhbmRlbjEmMCQGA1UEAxMdU3RhYXQgZGVy\n" +
- "IE5lZGVybGFuZGVuIFJvb3QgQ0GCBACYmnkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0\n" +
- "cDovL2NybC5wa2lvdmVyaGVpZC5ubC9Eb21PdkxhdGVzdENSTC5jcmwwHQYDVR0O\n" +
- "BBYEFEwIyY128ZjHPt881y91DbF2eZfMMA0GCSqGSIb3DQEBBQUAA4IBAQAMlIca\n" +
- "v03jheLu19hjeQ5Q38aEW9K72fUxCho1l3TfFPoqDz7toOMI9tVOW6+mriXiRWsi\n" +
- "D7dUKH6S3o0UbNEc5W50BJy37zRERd/Jgx0ZH8Apad+J1T/CsFNt5U4X5HNhIxMm\n" +
- "cUP9TFnLw98iqiEr2b+VERqKpOKrp11Lbyn1UtHk0hWxi/7wA8+nfemZhzizDXMU\n" +
- "5HIs4c71rQZIZPrTKbmi2Lv01QulQERDjqC/zlqlUkxk0xcxYczopIro5Ij76eUv\n" +
- "BjMzm5RmZrGrUDqhCYF0U1onuabSJc/Tw6f/ltAv6uAejVLpGBwgCkegllYOQJBR\n" +
- "RKwa/fHuhR/3Qlpl\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised DigiNotar PKIoverheid CA Overheid
- //
-
- // DigiNotar intermediate, cross-signed by the Dutch government
- //
- // Subject: CN=DigiNotar PKIoverheid CA Overheid
- // O=DigiNotar B.V.,
- // C=NL
- // Issuer: CN=Staat der Nederlanden Overheid CA
- // O=Staat der Nederlanden,
- // C=NL
- // Serial: 20006006 (01:31:44:76)
- add("diginotar-pkioverheid-overheid-cross-to-nederlanden-01314476",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIEezCCA2OgAwIBAgIEATFEdjANBgkqhkiG9w0BAQUFADBZMQswCQYDVQQGEwJO\n" +
- "TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSowKAYDVQQDEyFTdGFh\n" +
- "dCBkZXIgTmVkZXJsYW5kZW4gT3ZlcmhlaWQgQ0EwHhcNMDQwNjI0MDgxOTMyWhcN\n" +
- "MTAwNjIzMDgxNzM2WjBSMQswCQYDVQQGEwJOTDEXMBUGA1UEChMORGlnaU5vdGFy\n" +
- "IEIuVi4xKjAoBgNVBAMTIURpZ2lOb3RhciBQS0lvdmVyaGVpZCBDQSBPdmVyaGVp\n" +
- "ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANSlrubta5tlOjVCi/gb\n" +
- "yLCvRqfBjxG8H594VcKHu0WAYc99SPZF9cycj5mw2GyfQvy/WIrGrL4iyNq1gSqR\n" +
- "0QA/mTXKZIaPqzpDhdm+VvrKkmjrbZfaQxgMSs3ChtBsjcP9Lc0X1zXZ4Q8nBe3k\n" +
- "BTp+zehINfmbjoEgXLxsMR5RQ6GxzKjuC04PQpbJQgTIakglKaqYcDDZbEscWgPV\n" +
- "Hgj/2aoHlj6leW/ThHZ+O41jUguEmBLZA3mu3HrCfrHntb5dPt0ihzSx7GtD/SaX\n" +
- "5HBLxnP189YuqMk5iRA95CtiSdKauvon/xRKRLNgG6XAz0ctSoY7xLDdiBVU5kJd\n" +
- "FScCAwEAAaOCAVAwggFMMEgGA1UdIARBMD8wPQYEVR0gADA1MDMGCCsGAQUFBwIB\n" +
- "FidodHRwOi8vd3d3LmRpZ2lub3Rhci5ubC9jcHMvcGtpb3ZlcmhlaWQwDwYDVR0T\n" +
- "AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgYAGA1UdIwR5MHeAFAuG1g93o2ix\n" +
- "+2QJw4huXAQcV+k9oVmkVzBVMQswCQYDVQQGEwJOTDEeMBwGA1UEChMVU3RhYXQg\n" +
- "ZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g\n" +
- "Um9vdCBDQYIEAJiaeTA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnBraW92\n" +
- "ZXJoZWlkLm5sL0RvbU92TGF0ZXN0Q1JMLmNybDAdBgNVHQ4EFgQUvRaYQh2+kdE9\n" +
- "wpcl4CjXWOC1f+IwDQYJKoZIhvcNAQEFBQADggEBAGhQsCWLiaN2EOhPAW+JQP6o\n" +
- "XBOrLv5w6joahzBFVn1BiefzmlMKjibqKYxURRvMAsMkh82/MfL8V0w6ugxl81lu\n" +
- "i42dcxl9cKSVXKMw4bbBzJ2VQI5HTIABwefeNuy/eX6idVwYdt3ajAH7fUA8Q9Cq\n" +
- "vr6H8B+8mwoEqTVTEVlCSsC/EXsokYEUr06PPzRudKjDmijgj7zFaIioZNc8hk7g\n" +
- "ufEgrs/tmcNGylrwRHgCXjCRBt2NHlZ08l7A1AGU8HcHlSbG9Un/2q9kVHUkps0D\n" +
- "gtUaEK+x6jpAu/R8Ojezu/+ZEcwwjI/KOhG+84+ejFmtyEkrUdsAdEdLf/2dKsw=\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Compromised DigiNotar Services 1024 CA
- //
-
- // DigiNotar intermediate, cross-signed by the Entrust
- //
- // Subject: EMAILADDRESS=info@diginotar.nl,
- // CN=DigiNotar Services 1024 CA
- // O=DigiNotar, C=NL
- // Issuer: CN=Entrust.net Secure Server Certification Authority,
- // OU=(c) 1999 Entrust.net Limited,
- // OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
- // O=Entrust.net,
- // C=US
- // Serial: 1184640176 (46:9c:2c:b0)
- add("diginotar-services-1024-ca-cross-to-entrust-469C2CB0",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIDzTCCAzagAwIBAgIERpwssDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC\n" +
- "VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u\n" +
- "ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc\n" +
- "KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u\n" +
- "ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3\n" +
- "MjYxNTU5MDBaFw0xMzA4MjYxNjI5MDBaMGgxCzAJBgNVBAYTAk5MMRIwEAYDVQQK\n" +
- "EwlEaWdpTm90YXIxIzAhBgNVBAMTGkRpZ2lOb3RhciBTZXJ2aWNlcyAxMDI0IENB\n" +
- "MSAwHgYJKoZIhvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCBnzANBgkqhkiG9w0B\n" +
- "AQEFAAOBjQAwgYkCgYEA2ptNXTz50eKLxsYIIMXZHkjsZlhneWIrQWP0iY1o2q+4\n" +
- "lDaLGSSkoJPSmQ+yrS01Tc0vauH5mxkrvAQafi09UmTN8T5nD4ku6PJPrqYIoYX+\n" +
- "oakJ5sarPkP8r3oDkdqmOaZh7phPGKjTs69mgumfvN1y+QYEvRLZGCTnq5NTi1kC\n" +
- "AwEAAaOCASYwggEiMBIGA1UdEwEB/wQIMAYBAf8CAQAwJwYDVR0lBCAwHgYIKwYB\n" +
- "BQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBDARBgNVHSAECjAIMAYGBFUdIAAwMwYI\n" +
- "KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5l\n" +
- "dDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLmVudHJ1c3QubmV0L3NlcnZl\n" +
- "cjEuY3JsMB0GA1UdDgQWBBT+3JRJDG/vXH/G8RKZTxZJrfuCZTALBgNVHQ8EBAMC\n" +
- "AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowGQYJKoZIhvZ9B0EA\n" +
- "BAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEFBQADgYEAY3RqN6k/lpxmyFisCcnv\n" +
- "9WWUf6MCxDgxvV0jh+zUVrLJsm7kBQb87PX6iHBZ1O7m3bV6oKNgLwIMq94SXa/w\n" +
- "NUuqikeRGvWFLELHHe+VQ7NeuJWTpdrFKKqtci0xrZlrbP+MISevrZqRK8fdWMNu\n" +
- "B8WfedLHjFW/TMcnXlEWKz4=\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Revoked DigiCert code signing certificates used to sign malware
- //
-
- // Subject: CN=Buster Paper Comercial Ltda,
- // O=Buster Paper Comercial Ltda,
- // L=S?o Jos? Dos Campos,
- // ST=S?o Paulo,
- // C=BR
- // Issuer: CN=DigiCert Assured ID Code Signing CA-1,
- // OU=www.digicert.com,
- // O=DigiCert Inc,
- // C=US
- // Serial: 07:b4:4c:db:ff:fb:78:de:05:f4:26:16:72:a6:73:12
- add("buster-paper-comercial-ltda-72A67312",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIGwzCCBaugAwIBAgIQB7RM2//7eN4F9CYWcqZzEjANBgkqhkiG9w0BAQUFADBv\n" +
- "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" +
- "d3cuZGlnaWNlcnQuY29tMS4wLAYDVQQDEyVEaWdpQ2VydCBBc3N1cmVkIElEIENv\n" +
- "ZGUgU2lnbmluZyBDQS0xMB4XDTEzMDExNzAwMDAwMFoXDTE0MDEyMjEyMDAwMFow\n" +
- "gY4xCzAJBgNVBAYTAkJSMRMwEQYDVQQIDApTw6NvIFBhdWxvMR4wHAYDVQQHDBVT\n" +
- "w6NvIEpvc8OpIERvcyBDYW1wb3MxJDAiBgNVBAoTG0J1c3RlciBQYXBlciBDb21l\n" +
- "cmNpYWwgTHRkYTEkMCIGA1UEAxMbQnVzdGVyIFBhcGVyIENvbWVyY2lhbCBMdGRh\n" +
- "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzO0l6jWIpEfO2oUpVHpL\n" +
- "HETj5lzivNb0S9jKHgGJax917czh81PnGTxwxFXd6gLJuy/XFHvmiSi8g8jzlymn\n" +
- "2Ji5zQ3CPaz7nomJokSUDlMVJ2qYWtctw4jrdjuI4qtn+koXXUFkWjkf8h8251I4\n" +
- "tUs7S49HE2Go5owCYP3byajj7fsFAYR/Xb7TdVtndkZsUB/YgOjHovyACjouaNCi\n" +
- "mDiRyQ6zLLjZGiyeD65Yiseuhp5b8/BL5h1p7w76QYMYMVQNAdtDKut2R8MBpuWf\n" +
- "Ny7Eoi0x/gm1p9X5Rcl5aN7K0G4UtTAJKbkuUfXddsyFoM0Nx8uo8SgNQ8Y/X5Jx\n" +
- "BwIDAQABo4IDOTCCAzUwHwYDVR0jBBgwFoAUe2jOKarAF75JeuHlP9an90WPNTIw\n" +
- "HQYDVR0OBBYEFFLZ3n5nt/Eer7n1bvtOqMb1qKO5MA4GA1UdDwEB/wQEAwIHgDAT\n" +
- "BgNVHSUEDDAKBggrBgEFBQcDAzBzBgNVHR8EbDBqMDOgMaAvhi1odHRwOi8vY3Js\n" +
- "My5kaWdpY2VydC5jb20vYXNzdXJlZC1jcy0yMDExYS5jcmwwM6AxoC+GLWh0dHA6\n" +
- "Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9hc3N1cmVkLWNzLTIwMTFhLmNybDCCAcQGA1Ud\n" +
- "IASCAbswggG3MIIBswYJYIZIAYb9bAMBMIIBpDA6BggrBgEFBQcCARYuaHR0cDov\n" +
- "L3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsG\n" +
- "AQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABD\n" +
- "AGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABh\n" +
- "AGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQBy\n" +
- "AHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBn\n" +
- "ACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABs\n" +
- "AGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABp\n" +
- "AG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBl\n" +
- "AGYAZQByAGUAbgBjAGUALjCBggYIKwYBBQUHAQEEdjB0MCQGCCsGAQUFBzABhhho\n" +
- "dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTAYIKwYBBQUHMAKGQGh0dHA6Ly9jYWNl\n" +
- "cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENvZGVTaWduaW5nQ0Et\n" +
- "MS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQUFAAOCAQEAPTTQvpOIikXI\n" +
- "hTLnNbajaFRR5GhQpTzUNgBfF9VYSlNw/wMjpGsrh5RxaJCip52jbehmTgjMRhft\n" +
- "jRYyml44PAVsCcR9uEoDpCZYpI1fHI1R+F8jd1C9rqprbSwwOG4xlg4SmvTHYs6e\n" +
- "gBItQ/1p9XY+Sf4Wv1qOuOFL1qvV/5VyR2zdlOQCmKCeMgxt6a/tHLBDiAA67D44\n" +
- "/vfdoNJl0CU2It0PO60jdCPFNWIRcxL+OSDqAoePeUC7xQ+JsTEIxuUE8+d6w6fc\n" +
- "BV2mYb1flh22t46GLjh4gyo7xw3aL6L0L0jzlTT6IcEw6NIbaPbIKj/npQnHobYj\n" +
- "XMuKLxbh7g==\n" +
- "-----END CERTIFICATE-----");
-
- // Subject: CN=BUSTER ASSISTENCIA TECNICA ELETRONICA LTDA - ME,
- // O=BUSTER ASSISTENCIA TECNICA ELETRONICA LTDA - ME,
- // L=S?o Paulo,
- // ST=S?o Paulo,
- // C=BR
- // Issuer: CN=DigiCert Assured ID Code Signing CA-1,
- // OU=www.digicert.com,
- // O=DigiCert Inc,
- // C=US
- // Serial: 0a:38:9b:95:ee:73:6d:d1:3b:c0:ed:74:3f:d7:4d:2f
- add("buster-assistencia-tecnica-electronica-ltda-3FD74D2F",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIG4DCCBcigAwIBAgIQCjible5zbdE7wO10P9dNLzANBgkqhkiG9w0BAQUFADBv\n" +
- "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n" +
- "d3cuZGlnaWNlcnQuY29tMS4wLAYDVQQDEyVEaWdpQ2VydCBBc3N1cmVkIElEIENv\n" +
- "ZGUgU2lnbmluZyBDQS0xMB4XDTEyMTEwOTAwMDAwMFoXDTEzMTExNDEyMDAwMFow\n" +
- "gasxCzAJBgNVBAYTAkJSMRMwEQYDVQQIDApTw6NvIFBhdWxvMRMwEQYDVQQHDApT\n" +
- "w6NvIFBhdWxvMTgwNgYDVQQKEy9CVVNURVIgQVNTSVNURU5DSUEgVEVDTklDQSBF\n" +
- "TEVUUk9OSUNBIExUREEgLSBNRTE4MDYGA1UEAxMvQlVTVEVSIEFTU0lTVEVOQ0lB\n" +
- "IFRFQ05JQ0EgRUxFVFJPTklDQSBMVERBIC0gTUUwggEiMA0GCSqGSIb3DQEBAQUA\n" +
- "A4IBDwAwggEKAoIBAQDAqNeEs5/B2CTXGjTOkUIdu6jV6qulOZwdw4sefHWYj1UR\n" +
- "4z6zPk9kjpUgbnb402RFq88QtfInwddZ/wXn9OxMtDd/3TnC7HrhNS7ga79ZFL2V\n" +
- "JnmzKHum2Yvh0q82QEJ9tHBR2X9VdKpUIH08Zs3k6cWWM1H0YX0cxA/HohhesQJW\n" +
- "kwJ3urOIJiH/HeByDk8a1NS8safcCxk5vxvW4WvCg43iT09LeHY5Aa8abKw8lqVb\n" +
- "0tD5ZSIjdmdj3TT1U37iAHLLRM2DXbxfdbhouUX1c5U1ZHAMA67HwjKiseOiDaHj\n" +
- "NUGbC37C+cgbc9VVM/cURD8WvS0Kj6fQv7F2QtJDAgMBAAGjggM5MIIDNTAfBgNV\n" +
- "HSMEGDAWgBR7aM4pqsAXvkl64eU/1qf3RY81MjAdBgNVHQ4EFgQU88EXKAyDsh30\n" +
- "o9+Gu9a4xUy+FSMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMD\n" +
- "MHMGA1UdHwRsMGowM6AxoC+GLWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9hc3N1\n" +
- "cmVkLWNzLTIwMTFhLmNybDAzoDGgL4YtaHR0cDovL2NybDQuZGlnaWNlcnQuY29t\n" +
- "L2Fzc3VyZWQtY3MtMjAxMWEuY3JsMIIBxAYDVR0gBIIBuzCCAbcwggGzBglghkgB\n" +
- "hv1sAwEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9z\n" +
- "c2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4A\n" +
- "eQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQA\n" +
- "ZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUA\n" +
- "IABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAA\n" +
- "YQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcA\n" +
- "cgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIA\n" +
- "aQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQA\n" +
- "ZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMIGC\n" +
- "BggrBgEFBQcBAQR2MHQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0\n" +
- "LmNvbTBMBggrBgEFBQcwAoZAaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp\n" +
- "Z2lDZXJ0QXNzdXJlZElEQ29kZVNpZ25pbmdDQS0xLmNydDAMBgNVHRMBAf8EAjAA\n" +
- "MA0GCSqGSIb3DQEBBQUAA4IBAQAei1QmiXepje8OIfo/WonD4MIXgpPr2dfRaquQ\n" +
- "A8q63OpTRSveyqdQDCSPpDRF/nvO1Y30yksZvIH1tNBsW5LBdxAKN3lFdBlqBwtE\n" +
- "Q3jHc0KVVYRJ0FBaGE/PJHmRajscdAhYIcMPhTga0u0tDK+wOHEq3993dfl6yHjA\n" +
- "XHU2iW5pnk75ZoE39zALD5eKXT8ZXrET5c3XUFJKWA+XuGmdmyzqo0Au49PanBv9\n" +
- "UlZnabYfqoMArqMS0tGSX4cGgi9/2E+pHG9BX4sFW+ZDumroOA2pxyMWEKjxePEL\n" +
- "zCOfhbsRWdMLYepauaNZOIMZXmFwcrIl0TGMkTAtATz+XmZc\n" +
- "-----END CERTIFICATE-----");
-
- //
- // Revoked code signing certificate w/ a stolen key issued by GoDaddy
- // used to sign malware
- //
-
- // Subject: CN=CLEARESULT CONSULTING INC., OU=Corporate IT,
- // O=CLEARESULT CONSULTING INC., L=Austin, ST=TX, C=US
- // Issuer: SERIALNUMBER=07969287,
- // CN=Go Daddy Secure Certification Authority,
- // OU=http://certificates.godaddy.com/repository,
- // O="GoDaddy.com, Inc.",
- // L=Scottsdale,
- // ST=Arizona,
- // C=US
- // Serial: 2b:73:43:2a:a8:4f:44
- add("clearesult-consulting-inc-2AA84F44",
- "-----BEGIN CERTIFICATE-----\n" +
- "MIIFYjCCBEqgAwIBAgIHK3NDKqhPRDANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE\n" +
- "BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY\n" +
- "BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm\n" +
- "aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5\n" +
- "IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky\n" +
- "ODcwHhcNMTIwMjE1MjEwOTA2WhcNMTQwMjE1MjEwOTA2WjCBjDELMAkGA1UEBgwC\n" +
- "VVMxCzAJBgNVBAgMAlRYMQ8wDQYDVQQHDAZBdXN0aW4xIzAhBgNVBAoMGkNMRUFS\n" +
- "RVNVTFQgQ09OU1VMVElORyBJTkMuMRUwEwYDVQQLDAxDb3Jwb3JhdGUgSVQxIzAh\n" +
- "BgNVBAMMGkNMRUFSRVNVTFQgQ09OU1VMVElORyBJTkMuMIIBIjANBgkqhkiG9w0B\n" +
- "AQEFAAOCAQ8AMIIBCgKCAQEAtIOjCKeAicull+7ZIzt0/4ya3IeXUFlfypqKMLkU\n" +
- "IbKjn0P5uMj6VE3rlbZr44RCegxvdnR6umBh1c0ZXoN3o+yc0JKcKcLiApmJJ277\n" +
- "p7IbLwYDhBXRQNoIJm187IOMRPIxsKN4hL91txn9jGBmW+9zKlJlNhR5R7vjwU2E\n" +
- "jrH/6oqsc9EM2yYpfjlNv6+3jSwAYZCkSWr+27PQOV+YHKmIxtJjX0upFz5FdIrV\n" +
- "9CCX+L2Kji1THOkSgG4QTbYxmEcHqGViWz8hXLeNXjcbEsPuIiAu3hknxRHfUTE/\n" +
- "U0Lh0Ug1e3LrJu+WnxM2SmUY4krsZ22c0yWUW9hzWITIjQIDAQABo4IBhzCCAYMw\n" +
- "DwYDVR0TAQH/BAUwAwEBADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8E\n" +
- "BAMCB4AwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nb2RhZGR5LmNvbS9n\n" +
- "ZHM1LTE2LmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0BBxcCMDkwNwYIKwYBBQUH\n" +
- "AgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8w\n" +
- "gYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRk\n" +
- "eS5jb20vMEoGCCsGAQUFBzAChj5odHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHku\n" +
- "Y29tL3JlcG9zaXRvcnkvZ2RfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBT9\n" +
- "rGEyk2xF1uLuhV+auud2mWjM5zAdBgNVHQ4EFgQUDtdeKqeN2QkcbEp1HovFieNB\n" +
- "XiowDQYJKoZIhvcNAQEFBQADggEBAD74Agw5tvi2aBl4/f/s7/VE/BClzDsKMb9K\n" +
- "v9qpeC45ZA/jelxV11HKbQnVF194gDb7D2H9OsAsRUy8HVKbXEcc/8dKvwOqb+BC\n" +
- "2i/EmfjLgmCfezNFtLq8xcPxF3zIRc44vPrK0z4YZsaHdH+yTEJ51p5EMdTqaLaP\n" +
- "4n5m8LX3RfqlQB9dYFe6dUoYZjKm9d/pIRww3VqfOzjl42Edi1w6dWmBVMx1NZuR\n" +
- "DBabJH1vJ9Gd+KwxMCmBZ6pQPl28JDimhJhI2LNqU349uADQVV0HJosddN/ARyyI\n" +
- "LSIQO7BnNVKVG9Iujf33bvPNeg0qNz5qw+rKKq97Pqeum+L5oKU=\n" +
- "-----END CERTIFICATE-----");
- }
+ private UntrustedCertificates() {}
}
--- a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,6 +37,7 @@
import java.security.cert.*;
import java.security.cert.Certificate;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
import javax.security.auth.x500.X500Principal;
@@ -1913,4 +1914,45 @@
}
return false;
}
+
+ private ConcurrentHashMap<String,String> fingerprints =
+ new ConcurrentHashMap<>(2);
+
+ public String getFingerprint(String algorithm) {
+ return fingerprints.computeIfAbsent(algorithm,
+ x -> getCertificateFingerPrint(x));
+ }
+
+ /**
+ * Gets the requested finger print of the certificate. The result
+ * only contains 0-9 and A-F. No small case, no colon.
+ */
+ private String getCertificateFingerPrint(String mdAlg) {
+ String fingerPrint = "";
+ try {
+ byte[] encCertInfo = getEncoded();
+ MessageDigest md = MessageDigest.getInstance(mdAlg);
+ byte[] digest = md.digest(encCertInfo);
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < digest.length; i++) {
+ byte2hex(digest[i], buf);
+ }
+ fingerPrint = buf.toString();
+ } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
+ // ignored
+ }
+ return fingerPrint;
+ }
+
+ /**
+ * Converts a byte to hex digit and writes to the supplied buffer
+ */
+ private static void byte2hex(byte b, StringBuffer buf) {
+ char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+ int high = ((b & 0xf0) >> 4);
+ int low = (b & 0x0f);
+ buf.append(hexChars[high]);
+ buf.append(hexChars[low]);
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/swing/AbstractFilterComboBoxModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package sun.swing;
+
+import javax.swing.AbstractListModel;
+import javax.swing.ComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+/**
+ * Data model for a type-face selection combo-box.
+ */
+public abstract class AbstractFilterComboBoxModel
+ extends AbstractListModel<FileFilter>
+ implements ComboBoxModel<FileFilter>, PropertyChangeListener {
+
+ protected FileFilter[] filters;
+
+ protected AbstractFilterComboBoxModel() {
+ this.filters = getFileChooser().getChoosableFileFilters();
+ }
+
+ protected abstract JFileChooser getFileChooser();
+
+ @Override
+ public void propertyChange(PropertyChangeEvent event) {
+ String property = event.getPropertyName();
+ if (property == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
+ this.filters = (FileFilter[]) event.getNewValue();
+ fireContentsChanged(this, -1, -1);
+ } else if (property == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
+ fireContentsChanged(this, -1, -1);
+ }
+ }
+
+ @Override
+ public void setSelectedItem(Object filter) {
+ if (filter != null) {
+ getFileChooser().setFileFilter((FileFilter) filter);
+ fireContentsChanged(this, -1, -1);
+ }
+ }
+
+ @Override
+ public Object getSelectedItem() {
+ // Ensure that the current filter is in the list.
+ // NOTE: we should not have to do this, since JFileChooser adds
+ // the filter to the choosable filters list when the filter
+ // is set. Lets be paranoid just in case someone overrides
+ // setFileFilter in JFileChooser.
+ FileFilter currentFilter = getFileChooser().getFileFilter();
+ if (currentFilter != null) {
+ for (FileFilter filter : this.filters) {
+ if (filter == currentFilter) {
+ return currentFilter;
+ }
+ }
+ getFileChooser().addChoosableFileFilter(currentFilter);
+ }
+ return currentFilter;
+ }
+
+ @Override
+ public int getSize() {
+ return (this.filters != null)
+ ? filters.length
+ : 0;
+ }
+
+ @Override
+ public FileFilter getElementAt(int index) {
+ if (index >= getSize()) {
+ // This shouldn't happen. Try to recover gracefully.
+ return getFileChooser().getFileFilter();
+ }
+ return (this.filters != null)
+ ? filters[index]
+ : null;
+ }
+}
--- a/jdk/src/share/classes/sun/swing/FilePane.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/FilePane.java Thu Oct 03 19:18:54 2013 +0100
@@ -1980,18 +1980,18 @@
}
if (f instanceof ShellFolder) {
- return ((ShellFolder) f).isFileSystem();
+ return f.canWrite();
} else {
if (usesShellFolder(getFileChooser())) {
try {
- return ShellFolder.getShellFolder(f).isFileSystem();
+ return ShellFolder.getShellFolder(f).canWrite();
} catch (FileNotFoundException ex) {
// File doesn't exist
return false;
}
} else {
// Ordinary file
- return true;
+ return f.canWrite();
}
}
}
--- a/jdk/src/share/classes/sun/swing/JLightweightFrame.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/JLightweightFrame.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,8 +33,9 @@
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
+import java.awt.MouseInfo;
+import java.awt.Point;
import java.awt.Rectangle;
-import java.awt.event.ComponentListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.image.BufferedImage;
@@ -48,6 +49,7 @@
import javax.swing.JRootPane;
import javax.swing.LayoutFocusTraversalPolicy;
import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
import sun.awt.LightweightFrame;
import sun.security.action.GetPropertyAction;
@@ -88,6 +90,15 @@
private PropertyChangeListener layoutSizeListener;
+ static {
+ SwingAccessor.setJLightweightFrameAccessor(new SwingAccessor.JLightweightFrameAccessor() {
+ @Override
+ public void updateCursor(JLightweightFrame frame) {
+ frame.updateClientCursor();
+ }
+ });
+ }
+
/**
* Constructs a new, initially invisible {@code JLightweightFrame}
* instance.
@@ -95,7 +106,7 @@
public JLightweightFrame() {
super();
copyBufferEnabled = "true".equals(AccessController.
- doPrivileged(new GetPropertyAction("jlf.copyBufferEnabled", "true")));
+ doPrivileged(new GetPropertyAction("swing.jlf.copyBufferEnabled", "true")));
add(rootPane, BorderLayout.CENTER);
setFocusTraversalPolicy(new LayoutFocusTraversalPolicy());
@@ -239,6 +250,11 @@
};
contentPane.setLayout(new BorderLayout());
contentPane.add(component);
+ if ("true".equals(AccessController.
+ doPrivileged(new GetPropertyAction("swing.jlf.contentPaneTransparent", "false"))))
+ {
+ contentPane.setOpaque(false);
+ }
setContentPane(contentPane);
contentPane.addContainerListener(new ContainerListener() {
@@ -358,4 +374,21 @@
public Component getGlassPane() {
return getRootPane().getGlassPane();
}
+
+
+ /*
+ * Notifies client toolkit that it should change a cursor.
+ *
+ * Called from the peer via SwingAccessor, because the
+ * Component.updateCursorImmediately method is final
+ * and could not be overridden.
+ */
+ private void updateClientCursor() {
+ Point p = MouseInfo.getPointerInfo().getLocation();
+ SwingUtilities.convertPointFromScreen(p, this);
+ Component target = SwingUtilities.getDeepestComponentAt(this, p.x, p.y);
+ if (target != null) {
+ content.setCursor(target.getCursor());
+ }
+ }
}
--- a/jdk/src/share/classes/sun/swing/LightweightContent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/LightweightContent.java Thu Oct 03 19:18:54 2013 +0100
@@ -26,6 +26,7 @@
package sun.swing;
import javax.swing.JComponent;
+import java.awt.Cursor;
/**
* The interface by means of which the {@link JLightweightFrame} class
@@ -179,4 +180,11 @@
* application that the content minimum size has changed.
*/
public void minimumSizeChanged(int width, int height);
+
+ /**
+ * {@code JLightweightFrame} calls this method to notify the client
+ * application that in needs to set a cursor
+ * @param cursor a cursor to set
+ */
+ default public void setCursor(Cursor cursor) { }
}
--- a/jdk/src/share/classes/sun/swing/SwingAccessor.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/SwingAccessor.java Thu Oct 03 19:18:54 2013 +0100
@@ -72,6 +72,16 @@
}
/**
+ * An accessor for the JLightweightFrame class.
+ */
+ public interface JLightweightFrameAccessor {
+ /**
+ * Notifies the JLightweight frame that it needs to update a cursor
+ */
+ void updateCursor(JLightweightFrame frame);
+ }
+
+ /**
* The javax.swing.text.JTextComponent class accessor object.
*/
private static JTextComponentAccessor jtextComponentAccessor;
@@ -93,4 +103,23 @@
return jtextComponentAccessor;
}
+
+ /**
+ * The JLightweightFrame class accessor object
+ */
+ private static JLightweightFrameAccessor jLightweightFrameAccessor;
+
+ /**
+ * Set an accessor object for the JLightweightFrame class.
+ */
+ public static void setJLightweightFrameAccessor(JLightweightFrameAccessor accessor) {
+ jLightweightFrameAccessor = accessor;
+ }
+
+ /**
+ * Retrieve the accessor object for the JLightweightFrame class
+ */
+ public static JLightweightFrameAccessor getJLightweightFrameAccessor() {
+ return jLightweightFrameAccessor;
+ }
}
--- a/jdk/src/share/classes/sun/swing/SwingUtilities2.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/SwingUtilities2.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,6 +33,7 @@
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.PrinterGraphics;
+import java.text.CharacterIterator;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
@@ -504,22 +505,25 @@
* it to fit in the screen width. This distributes the spacing
* more evenly than directly laying out to the screen advances.
*/
- float screenWidth = (float)
- g2d.getFont().getStringBounds(text, DEFAULT_FRC).getWidth();
- TextLayout layout = createTextLayout(c, text, g2d.getFont(),
- g2d.getFontRenderContext());
+ String trimmedText = trimTrailingSpaces(text);
+ if (!trimmedText.isEmpty()) {
+ float screenWidth = (float) g2d.getFont().getStringBounds
+ (trimmedText, DEFAULT_FRC).getWidth();
+ TextLayout layout = createTextLayout(c, text, g2d.getFont(),
+ g2d.getFontRenderContext());
- layout = layout.getJustifiedLayout(screenWidth);
- /* Use alternate print color if specified */
- Color col = g2d.getColor();
- if (col instanceof PrintColorUIResource) {
- g2d.setColor(((PrintColorUIResource)col).getPrintColor());
+ layout = layout.getJustifiedLayout(screenWidth);
+ /* Use alternate print color if specified */
+ Color col = g2d.getColor();
+ if (col instanceof PrintColorUIResource) {
+ g2d.setColor(((PrintColorUIResource)col).getPrintColor());
+ }
+
+ layout.draw(g2d, x, y);
+
+ g2d.setColor(col);
}
- layout.draw(g2d, x, y);
-
- g2d.setColor(col);
-
return;
}
}
@@ -789,25 +793,27 @@
if (frc != null &&
!isFontRenderContextPrintCompatible
(deviceFontRenderContext, frc)) {
- TextLayout layout =
- createTextLayout(c, new String(data, offset, length),
- g2d.getFont(),
- deviceFontRenderContext);
- float screenWidth = (float)g2d.getFont().
- getStringBounds(data, offset, offset + length, frc).
- getWidth();
- layout = layout.getJustifiedLayout(screenWidth);
+
+ String text = new String(data, offset, length);
+ TextLayout layout = new TextLayout(text, g2d.getFont(),
+ deviceFontRenderContext);
+ String trimmedText = trimTrailingSpaces(text);
+ if (!trimmedText.isEmpty()) {
+ float screenWidth = (float)g2d.getFont().
+ getStringBounds(trimmedText, frc).getWidth();
+ layout = layout.getJustifiedLayout(screenWidth);
- /* Use alternate print color if specified */
- Color col = g2d.getColor();
- if (col instanceof PrintColorUIResource) {
- g2d.setColor(((PrintColorUIResource)col).getPrintColor());
+ /* Use alternate print color if specified */
+ Color col = g2d.getColor();
+ if (col instanceof PrintColorUIResource) {
+ g2d.setColor(((PrintColorUIResource)col).getPrintColor());
+ }
+
+ layout.draw(g2d,x,y);
+
+ g2d.setColor(col);
}
- layout.draw(g2d,x,y);
-
- g2d.setColor(col);
-
return nextX;
}
}
@@ -888,14 +894,23 @@
} else {
frc = g2d.getFontRenderContext();
}
- TextLayout layout = new TextLayout(iterator, frc);
+ TextLayout layout;
if (isPrinting) {
FontRenderContext deviceFRC = g2d.getFontRenderContext();
if (!isFontRenderContextPrintCompatible(frc, deviceFRC)) {
- float screenWidth = layout.getAdvance();
layout = new TextLayout(iterator, deviceFRC);
- layout = layout.getJustifiedLayout(screenWidth);
+ AttributedCharacterIterator trimmedIt =
+ getTrimmedTrailingSpacesIterator(iterator);
+ if (trimmedIt != null) {
+ float screenWidth = new TextLayout(trimmedIt, frc).
+ getAdvance();
+ layout = layout.getJustifiedLayout(screenWidth);
+ }
+ } else {
+ layout = new TextLayout(iterator, frc);
}
+ } else {
+ layout = new TextLayout(iterator, frc);
}
layout.draw(g2d, x, y);
retVal = layout.getAdvance();
@@ -1047,6 +1062,39 @@
return (g instanceof PrinterGraphics || g instanceof PrintGraphics);
}
+ private static String trimTrailingSpaces(String s) {
+ int i = s.length() - 1;
+ while(i >= 0 && Character.isWhitespace(s.charAt(i))) {
+ i--;
+ }
+ return s.substring(0, i + 1);
+ }
+
+ private static AttributedCharacterIterator getTrimmedTrailingSpacesIterator
+ (AttributedCharacterIterator iterator) {
+ int curIdx = iterator.getIndex();
+
+ char c = iterator.last();
+ while(c != CharacterIterator.DONE && Character.isWhitespace(c)) {
+ c = iterator.previous();
+ }
+
+ if (c != CharacterIterator.DONE) {
+ int endIdx = iterator.getIndex();
+
+ if (endIdx == iterator.getEndIndex() - 1) {
+ iterator.setIndex(curIdx);
+ return iterator;
+ } else {
+ AttributedString trimmedText = new AttributedString(iterator,
+ iterator.getBeginIndex(), endIdx + 1);
+ return trimmedText.getIterator();
+ }
+ } else {
+ return null;
+ }
+ }
+
/**
* Determines whether the SelectedTextColor should be used for painting text
* foreground for the specified highlight.
--- a/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -923,70 +923,9 @@
/**
* Data model for a type-face selection combo-box.
*/
- protected class FilterComboBoxModel extends AbstractListModel<FileFilter> implements ComboBoxModel<FileFilter>,
- PropertyChangeListener {
- protected FileFilter[] filters;
- protected FilterComboBoxModel() {
- super();
- filters = getFileChooser().getChoosableFileFilters();
- }
-
- public void propertyChange(PropertyChangeEvent e) {
- String prop = e.getPropertyName();
- if(prop == JFileChooser.CHOOSABLE_FILE_FILTER_CHANGED_PROPERTY) {
- filters = (FileFilter[]) e.getNewValue();
- fireContentsChanged(this, -1, -1);
- } else if (prop == JFileChooser.FILE_FILTER_CHANGED_PROPERTY) {
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public void setSelectedItem(Object filter) {
- if(filter != null) {
- getFileChooser().setFileFilter((FileFilter) filter);
- fireContentsChanged(this, -1, -1);
- }
- }
-
- public Object getSelectedItem() {
- // Ensure that the current filter is in the list.
- // NOTE: we shouldnt' have to do this, since JFileChooser adds
- // the filter to the choosable filters list when the filter
- // is set. Lets be paranoid just in case someone overrides
- // setFileFilter in JFileChooser.
- FileFilter currentFilter = getFileChooser().getFileFilter();
- boolean found = false;
- if(currentFilter != null) {
- for (FileFilter filter : filters) {
- if (filter == currentFilter) {
- found = true;
- }
- }
- if(found == false) {
- getFileChooser().addChoosableFileFilter(currentFilter);
- }
- }
- return getFileChooser().getFileFilter();
- }
-
- public int getSize() {
- if(filters != null) {
- return filters.length;
- } else {
- return 0;
- }
- }
-
- public FileFilter getElementAt(int index) {
- if(index > getSize() - 1) {
- // This shouldn't happen. Try to recover gracefully.
- return getFileChooser().getFileFilter();
- }
- if(filters != null) {
- return filters[index];
- } else {
- return null;
- }
+ protected class FilterComboBoxModel extends AbstractFilterComboBoxModel {
+ protected JFileChooser getFileChooser() {
+ return SynthFileChooserUIImpl.this.getFileChooser();
}
}
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_de.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=Kennzeichen "c" erfordert Angabe von Manifest oder Eingabedateien.
error.bad.uflag=Kennzeichen "u" erfordert Angabe von Manifest, Kennzeichen "e" oder Eingabedateien.
error.bad.eflag=Kennzeichen "e" und Manifest mit dem Attribut "Main-Class" k\u00F6nnen nicht zusammen angegeben\nwerden.
-error.bad.pvalue=ung\u00FCltiger Wert f\u00FCr Attribut "Profil": {0}
error.nosuch.fileordir={0}: Datei oder Verzeichnis nicht vorhanden
error.write.file=Fehler beim Schreiben in vorhandener JAR-Datei
error.create.dir={0}: Verzeichnis konnte nicht erstellt werden
@@ -42,7 +41,7 @@
out.stored=(0 % gespeichert)
out.create=\ erstellt: {0}
out.extracted=extrahiert: {0}
-out.inflated=\ \\vergr\u00F6\u00DFert: {0}
+out.inflated=\ vergr\u00F6\u00DFert: {0}
out.size=(ein = {0}) (aus = {1})
-usage=Verwendung: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] Dateien...\nOptionen:\n -c Neues Archiv erstellen\n -t Inhaltsverzeichnis f\u00FCr Archiv auflisten\n -x Genannte (oder alle) Dateien aus Archiv extrahieren\n -u Vorhandenes Archiv aktualisieren\n -v Verbose-Ausgabe f\u00FCr Standardausgabe generieren\n -f Namen der Archivdatei angeben\n -m Manifestinformationen von angegebener Manifestdatei einschlie\u00DFen\n -e Anwendungseinstiegspunkt f\u00FCr die \n in einer ausf\u00FChrbaren JAR-Datei geb\u00FCndelte Standalone-Anwendung angeben\n -p Profilnamen angeben\n -0 Nur speichern (keine ZIP-Komprimierung)\n -M Keine Manifest-Datei f\u00FCr die Eintr\u00E4ge erstellen\n -i Indexinformationen f\u00FCr angegebene JAR-Dateien erstellen\n -C zum angegebenen Verzeichnis wechseln und folgende Datei einschlie\u00DFen\nFalls eine Datei ein Verzeichnis ist, wird dieses rekursiv verarbeitet.\nDer Name der Manifestdatei, der Name der Archivdatei und der Name des Einstiegspunkts werden\nin derselben Reihenfolge wie die Kennzeichen "m", "f" und "e" angegeben.\n\nBeispiel 1: Archivieren Sie zwei Klassendateien in ein Archiv mit dem Namen "classes.jar": \n jar cvf classes.jar Foo.class Bar.class \nBeispiel 2: Verwenden Sie die vorhandenen Manifestdatei "mymanifest", und archivieren Sie\n alle Dateien im Verzeichnis foo/ in "classes.jar": \n jar cvfm classes.jar mymanifest -C foo/ .\n
+usage=Verwendung: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] Dateien...\nOptionen:\n -c Neues Archiv erstellen\n -t Inhaltsverzeichnis f\u00FCr Archiv auflisten\n -x Genannte (oder alle) Dateien aus Archiv extrahieren\n -u Vorhandenes Archiv aktualisieren\n -v Verbose-Ausgabe f\u00FCr Standardausgabe generieren\n -f Namen der Archivdatei angeben\n -m Manifest-Informationen von angegebener Manifest-Datei einschlie\u00DFen\n -e Anwendungs-Einstiegspunkt f\u00FCr die \n in einer ausf\u00FChrbaren JAR-Datei geb\u00FCndelte Standalone-Anwendung angeben\n -0 Nur speichern (keine ZIP-Komprimierung)\n -M Keine Manifest-Datei f\u00FCr die Eintr\u00E4ge erstellen\n -i Indexinformationen f\u00FCr angegebenen JAR-Dateien erstellen\n -C zum angegebenen Verzeichnis wechseln und folgende Datei einschlie\u00DFen\nFalls eine Datei ein Verzeichnis ist, wird dieses rekursiv verarbeitet.\nDer Name der Manifest-Datei, der Name der Archivdatei und der Name des Einstiegspunkts werden\nin derselben Reihenfolge wie die Kennzeichen "m", "f" und "e" angegeben.\n\nBeispiel 1: Archivieren Sie zwei Klassendateien in ein Archiv mit Namen "classes.jar": \n jar cvf classes.jar Foo.class Bar.class \nBeispiel 2: Verwenden Sie die vorhandenen Manifest-Datei "mymanifest", und archivieren Sie\n alle Dateien im Verzeichnis foo/ in "classes.jar": \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_es.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_es.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=El indicador 'c' necesita la especificaci\u00F3n de archivos de manifiesto o de entrada.
error.bad.uflag=El indicador 'u' necesita la especificaci\u00F3n de archivos de manifiesto, de entrada o indicador 'e'.
error.bad.eflag=El indicador 'e' y el manifiesto con el atributo 'Main-Class' no pueden especificarse \na la vez.
-error.bad.pvalue=valor err\u00F3neo para el atributo ''Profile'': {0}
error.nosuch.fileordir={0} : no existe tal archivo o directorio
error.write.file=Error al escribir un archivo jar existente
error.create.dir={0} : no se ha podido crear el directorio
@@ -42,7 +41,7 @@
out.stored=(almacenado 0%)
out.create=\ creado: {0}
out.extracted=extra\u00EDdo: {0}
-out.inflated=\ \\inflado: {0}
+out.inflated=\ inflado: {0}
out.size=(entrada = {0}) (salida = {1})
-usage=Sintaxis: archivos jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] ...\nOpciones:\n -c crear nuevo archivo\n -t mostrar la tabla de contenido del archivo\n -x extraer los archivos mencionados (o todos) del archivo\n -u actualizar archivo existente\n -v generar salida detallada de los datos de salida est\u00E1ndar\n -f especificar nombre de archivo de almacenamiento\n -m incluir informaci\u00F3n de manifiesto del archivo de manifiesto especificado\n -e especificar punto de entrada de la aplicaci\u00F3n para la aplicaci\u00F3n aut\u00F3noma \n que se incluye dentro de un archivo jar ejecutable\n -p especificar nombre de perfil\n -0 solo almacenar; no utilizar compresi\u00F3n ZIP\n -M no crear un archivo de manifiesto para las entradas\n -i generar informaci\u00F3n de \u00EDndice para los archivos jar especificados\n -C cambiar al directorio especificado e incluir el archivo siguiente\nSi alg\u00FAn archivo es un directorio, se procesar\u00E1 de forma recurrente.\nEl nombre del archivo de manifiesto, el nombre del archivo de almacenamiento y el nombre del punto de entrada se\nespecifican en el mismo orden que los indicadores 'm', 'f' y 'e'.\n\nEjemplo 1: para archivar archivos de dos clases en un archivo llamado classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEjemplo 2: utilice un archivo de manifiesto existente 'mymanifest' y archive todos los\narchivos del directorio foo/ en'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n
+usage=Sintaxis: jar {ctxui}[vfm0Me] [archive-jar] [archive-manifiesto] [punto-entrada] [-C dir] archivos...\nOpciones:\n -c crear nuevo archivo\n -t crear la tabla de contenido del archivo\n -x extraer el archive mencionado (o todos) del archivo\n -u actualizar archive existente\n -v generar salida detallada de los datos de salida est\u00E1ndar\n -f especificar nombre de archive de almacenamiento\n -m incluir informaci\u00F3n de manifiesto del archive de manifiesto especificado\n -e especificar punto de entrada de la aplicaci\u00F3n para la aplicaci\u00F3n aut\u00F3noma \n que se incluye dentro de un archive jar ejecutable\n -0 s\u00F3lo almacenar; no utilizar compresi\u00F3n ZIP\n -M no crear un archive de manifiesto para las entradas\n -i generar informaci\u00F3n de \u00EDndice para los archives jar especificados\n -C cambiar al directorio especificado e incluir el archivo siguiente\nSi alg\u00FAn archivo es un directorio, se procesar\u00E1 de forma recurrente.\nEl nombre del archivo de manifiesto, el nombre del archivo de almacenamiento y el nombre del punto de entrada se\nespecifican en el mismo orden que los indicadores 'm', 'f' y 'e'.\n\nEjemplo 1: para archivar archivos de dos clases en un archivo llamado classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEjemplo 2: utilice un archivo de manifiesto existente 'mymanifest' y archive todos los\n archivos del directorio foo/ en 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_fr.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_fr.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=L'indicateur c requiert la sp\u00E9cification d'un fichier manifeste ou d'un fichier d'entr\u00E9e.
error.bad.uflag=L'indicateur u requiert la sp\u00E9cification d'un fichier manifeste, d'un fichier d'entr\u00E9e ou d'un indicateur e.
error.bad.eflag=L'indicateur e et le fichier manifeste portant l'attribut Main-Class ne peuvent pas \u00EAtre sp\u00E9cifi\u00E9s \nensemble.
-error.bad.pvalue=valeur incorrecte pour l''attribut ''Profile'' : {0}
error.nosuch.fileordir={0} : fichier ou r\u00E9pertoire introuvable
error.write.file=Erreur lors de l'\u00E9criture d'un fichier JAR existant
error.create.dir={0} : impossible de cr\u00E9er le r\u00E9pertoire
@@ -42,7 +41,7 @@
out.stored=(stockage : 0 %)
out.create=\ cr\u00E9\u00E9 : {0}
out.extracted=extrait : {0}
-out.inflated=\ \\d\u00E9compress\u00E9 : {0}
+out.inflated=\ d\u00E9compress\u00E9 : {0}
out.size=(entr\u00E9e = {0}) (sortie = {1})
-usage=Syntaxe : jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\nOptions :\n -c cr\u00E9e une archive\n -t affiche la table des mati\u00E8res de l'archive\n -x extrait les fichiers nomm\u00E9s (ou tous les fichiers) de l'archive\n -u met \u00E0 jour l'archive existante\n -v g\u00E9n\u00E8re une sortie en mode verbose d'une sortie standard\n -f sp\u00E9cifie le nom du fichier d'archive\n -m inclut les informations de manifest \u00E0 partir du fichier manifest sp\u00E9cifi\u00E9\n -e sp\u00E9cifie le point d'entr\u00E9e d'une application en mode autonome \n int\u00E9gr\u00E9e \u00E0 un fichier JAR ex\u00E9cutable\n -p indique le nom de profil\n -0 stockage uniquement, pas de compression ZIP\n -M ne cr\u00E9e pas de fichier manifest pour les entr\u00E9es\n -i g\u00E9n\u00E8re les informations d'index des fichiers JAR sp\u00E9cifi\u00E9s\n -C passe au r\u00E9pertoire sp\u00E9cifi\u00E9 et inclut le fichier suivant\nSi l'un des fichiers est un r\u00E9pertoire, celui-ci est trait\u00E9 r\u00E9cursivement.\nLes noms du fichier manifest, du fichier d'archive et du point d'entr\u00E9e sont\nsp\u00E9cifi\u00E9s dans le m\u00EAme ordre que celui des indicateurs m, f et e.\n\nExemple 1 : pour archiver deux fichiers de classe dans une archive intitul\u00E9e classes.jar : \n jar cvf classes.jar Foo.class Bar.class \nExemple 2 : pour utiliser un fichier manifest existant 'mymanifest', puis archiver tous les\n fichiers du r\u00E9pertoire foo/ dans 'classes.jar' : \n jar cvfm classes.jar mymanifest -C foo/ .\n
+usage=Syntaxe : jar {ctxui}[vfm0Me] [fichier-jar] [fichier-manifeste] [point-entr\u00E9e] [-C r\u00E9p] fichiers...\nOptions :\n -c cr\u00E9e une archive\n -t affiche la table des mati\u00E8res de l'archive\n -x extrait les fichiers nomm\u00E9s (ou tous les fichiers) de l'archive\n -u met \u00E0 jour l'archive existante\n -v g\u00E9n\u00E8re une version d\u00E9taill\u00E9e d'une sortie standard\n -f sp\u00E9cifie le nom du fichier archive\n -m inclut les informations de manifeste \u00E0 partir du fichier de manifeste sp\u00E9cifi\u00E9\n -e sp\u00E9cifie le point d'entr\u00E9e d'une application en mode autonome \n int\u00E9gr\u00E9e \u00E0 un fichier JAR ex\u00E9cutable\n -0 stockage uniquement, pas de compression ZIP\n -M ne cr\u00E9e pas de fichier manifeste pour les entr\u00E9es\n -i g\u00E9n\u00E8re les informations d'index des fichiers JAR sp\u00E9cifi\u00E9s\n -C passe au r\u00E9pertoire sp\u00E9cifi\u00E9 et inclut le fichier suivant\nSi l'un des fichiers est un r\u00E9pertoire, celui-ci est trait\u00E9 r\u00E9cursivement.\nLes noms du fichier manifeste, du fichier archive et du point d'entr\u00E9e sont\nsp\u00E9cifi\u00E9s dans le m\u00EAme ordre que celui des indicateurs m, f et e.\n\nExemple 1 : pour archiver deux fichiers de classe dans une archive intitul\u00E9e classes.jar : \n jar cvf classes.jar Foo.class Bar.class \nExemple 2 : pour utiliser un fichier manifeste existant 'monmanifeste', puis archiver tous les\n fichiers du r\u00E9pertoire foo/ dans 'classes.jar' : \n jar cvfm classes.jar monmanifeste -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_it.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_it.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=Per il flag 'c' \u00E8 necessario specificare file manifest o di input.
error.bad.uflag=Per il flag 'u' \u00E8 necessario specificare il flag 'e' oppure file manifest o di input.
error.bad.eflag=Il flag 'e' e il manifest con l'attributo 'Main-Class' non possono essere specificati\ninsieme.
-error.bad.pvalue=valore non valido per l''attributo ''Profile'': {0}
error.nosuch.fileordir={0} : file o directory inesistente
error.write.file=Errore durante la scrittura del file jar esistente
error.create.dir={0} : impossibile creare la directory
@@ -42,7 +41,7 @@
out.stored=(memorizzato 0%)
out.create=\ creato: {0}
out.extracted=estratto: {0}
-out.inflated=\ \\decompresso: {0}
+out.inflated=\ decompresso: {0}
out.size=(in = {0}) (out = {1})
-usage=Uso: jar {ctxui}[vfm0Me] [jar-file] [file manifest] [punto di accesso] [-C dir] file ...\nOpzioni:\n -c crea un nuovo archivio\n -t visualizza il sommario dell'archivio\n -x estrae i file specificati (o tutti i file) dall'archivio\n -u aggiorna un archivio esistente\n -v genera un output descrittivo dall'output standard\n -f specifica il nome file dell'archivio\n -m include le informazioni manifest dal file manifest specificato\n -e specifica il punto di accesso per l'applicazione standalone \n inclusa in un file JAR eseguibile\n -p specifica il nome del profilo\n -0 esegue solo la memorizzazione; non utilizza la compressione ZIP\n -M non crea un file manifest per le voci\n -i genera le informazioni di indice per i file JAR specificati\n -C passa alla directory specificata e include il file seguente\nSe un file qualsiasi \u00E8 una directory, viene elaborato in modo ricorsivo.\nIl nome del file manifest, del file di archivio e del punto di accesso devono\nessere specificati nello stesso ordine dei flag 'm', 'f' e 'e'.\n\nEsempio 1: archiviazione di due file di classe nell'archivio denominato classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEsempio 2: uso del file manifest esistente 'mymanifest' e archiviazione di tutti i\n file della directory foo/ in 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/.\n
+usage=Uso: jar {ctxui}[vfm0Me] [file-jar] [file-manifest] [punto di ingresso] [-C dir] file ...\nOpzioni:\n -c crea un nuovo archivio\n -t visualizza l'indice dell'archivio\n -x estrae i file con nome (o tutti i file) dall'archivio\n -u aggiorna l'archivio esistente\n -v genera output commentato dall'output standard\n -f specifica il nome file dell'archivio\n -m include informazioni manifest dal file manifest specificato\n -e specifica il punto di ingresso per l'applicazione stand-alone \n inclusa nel file jar eseguibile\n -0 solo memorizzazione; senza compressione ZIP\n -M consente di non creare un file manifest per le voci\n -i genera informazioni sull'indice per i file jar specificati\n -C imposta la directory specificata e include il file seguente\nSe un file \u00E8 una directory, verr\u00E0 elaborato in modo ricorsivo.\nIl nome del file manifest, del file di archivio e del punto di ingresso devono\nessere specificati nello stesso ordine dei flag 'm', 'f' ed 'e'.\n\nEsempio 1: archiviazione di due file di classe in un archivio con il nome classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nEsempio 2: utilizzo del file manifest esistente 'mymanifest' e archiviazione di tutti i\n file della directory foo/ in 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/.\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=\u30D5\u30E9\u30B0'c'\u3067\u306F\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u307E\u305F\u306F\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u6307\u5B9A\u304C\u5FC5\u8981\u3067\u3059\u3002
error.bad.uflag=\u30D5\u30E9\u30B0'u'\u3067\u306F\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u304B'e'\u30D5\u30E9\u30B0\u3001\u307E\u305F\u306F\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u6307\u5B9A\u304C\u5FC5\u8981\u3067\u3059\u3002
error.bad.eflag='e'\u30D5\u30E9\u30B0\u3068'Main-Class'\u5C5E\u6027\u3092\u6301\u3064\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u306F\u540C\u6642\u306B\n\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002
-error.bad.pvalue=''Profile''\u5C5E\u6027\u306E\u5024\u304C\u4E0D\u6B63\u3067\u3059: {0}
error.nosuch.fileordir={0}\u3068\u3044\u3046\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u3042\u308A\u307E\u305B\u3093
error.write.file=\u65E2\u5B58jar\u30D5\u30A1\u30A4\u30EB\u306E\u66F8\u8FBC\u307F\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
error.create.dir=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA{0}\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F
@@ -42,7 +41,7 @@
out.stored=(0%\u683C\u7D0D\u3055\u308C\u307E\u3057\u305F)
out.create=\ {0}\u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F
out.extracted={0}\u304C\u62BD\u51FA\u3055\u308C\u307E\u3057\u305F
-out.inflated=\ \\{0}\u304C\u5C55\u958B\u3055\u308C\u307E\u3057\u305F
+out.inflated=\ {0}\u304C\u5C55\u958B\u3055\u308C\u307E\u3057\u305F
out.size=(\u5165={0})(\u51FA={1})
-usage=\u4F7F\u7528\u65B9\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\u30AA\u30D7\u30B7\u30E7\u30F3:\n -c \u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u65B0\u898F\u4F5C\u6210\u3059\u308B\n -t \u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u5185\u5BB9\u3092\u4E00\u89A7\u8868\u793A\u3059\u308B\n -x \u6307\u5B9A\u306E(\u307E\u305F\u306F\u3059\u3079\u3066\u306E)\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u304B\u3089\u62BD\u51FA\u3059\u308B\n -u \u65E2\u5B58\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u66F4\u65B0\u3059\u308B\n -v \u6A19\u6E96\u51FA\u529B\u306B\u8A73\u7D30\u306A\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n -f \u30A2\u30FC\u30AB\u30A4\u30D6\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u3092\u6307\u5B9A\u3059\u308B\n -m \u6307\u5B9A\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u60C5\u5831\u3092\u53D6\u308A\u8FBC\u3080\n -e \u5B9F\u884C\u53EF\u80FDjar\u30D5\u30A1\u30A4\u30EB\u306B\u30D0\u30F3\u30C9\u30EB\u3055\u308C\u305F\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3\u30FB\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\n \u30A8\u30F3\u30C8\u30EA\u30FB\u30DD\u30A4\u30F3\u30C8\u3092\u6307\u5B9A\u3059\u308B\n -p \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u540D\u3092\u6307\u5B9A\u3059\u308B\n -0 \u683C\u7D0D\u306E\u307F\u3002ZIP\u5727\u7E2E\u3092\u4F7F\u7528\u3057\u306A\u3044\n -M \u30A8\u30F3\u30C8\u30EA\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u4F5C\u6210\u3057\u306A\u3044\n -i \u6307\u5B9A\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306E\u7D22\u5F15\u60C5\u5831\u3092\u751F\u6210\u3059\u308B\n -C \u6307\u5B9A\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u5909\u66F4\u3057\u3001\u4EE5\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u308A\u8FBC\u3080\n\u30D5\u30A1\u30A4\u30EB\u304C\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u5834\u5408\u306F\u518D\u5E30\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\n\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u3001\u30A2\u30FC\u30AB\u30A4\u30D6\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u304A\u3088\u3073\u30A8\u30F3\u30C8\u30EA\u30FB\u30DD\u30A4\u30F3\u30C8\u540D\u306F\u3001\n\u30D5\u30E9\u30B0'm'\u3001'f'\u3001'e'\u3068\u540C\u3058\u9806\u5E8F\u3067\u6307\u5B9A\u3057\u307E\u3059\u3002\n\n\u4F8B1: 2\u3064\u306E\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30FC\u30AB\u30A4\u30D6classes.jar\u306B\u4FDD\u5B58\u3059\u308B:\n jar cvf classes.jar Foo.class Bar.class\n\u4F8B2: \u65E2\u5B58\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB'mymanifest'\u3092\u4F7F\u7528\u3057\u3001foo/\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\n \u5168\u30D5\u30A1\u30A4\u30EB\u3092'classes.jar'\u306B\u30A2\u30FC\u30AB\u30A4\u30D6\u3059\u308B:\n jar cvfm classes.jar mymanifest -C foo/ \n
+usage=\u4F7F\u7528\u65B9\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\u30AA\u30D7\u30B7\u30E7\u30F3:\n -c \u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u65B0\u898F\u4F5C\u6210\u3059\u308B\n -t \u30A2\u30FC\u30AB\u30A4\u30D6\u306E\u5185\u5BB9\u3092\u4E00\u89A7\u8868\u793A\u3059\u308B\n -x \u6307\u5B9A\u306E(\u307E\u305F\u306F\u3059\u3079\u3066\u306E)\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30FC\u30AB\u30A4\u30D6\u304B\u3089\u62BD\u51FA\u3059\u308B\n -u \u65E2\u5B58\u30A2\u30FC\u30AB\u30A4\u30D6\u3092\u66F4\u65B0\u3059\u308B\n -v \u6A19\u6E96\u51FA\u529B\u306B\u8A73\u7D30\u306A\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n -f \u30A2\u30FC\u30AB\u30A4\u30D6\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u3092\u6307\u5B9A\u3059\u308B\n -m \u6307\u5B9A\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u60C5\u5831\u3092\u53D6\u308A\u8FBC\u3080\n -e \u5B9F\u884C\u53EF\u80FDjar\u30D5\u30A1\u30A4\u30EB\u306B\u30D0\u30F3\u30C9\u30EB\u3055\u308C\u305F\u30B9\u30BF\u30F3\u30C9\u30A2\u30ED\u30F3\u30FB\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\n \u30A8\u30F3\u30C8\u30EA\u30FB\u30DD\u30A4\u30F3\u30C8\u3092\u6307\u5B9A\u3059\u308B\n -0 \u683C\u7D0D\u306E\u307F\u3002ZIP\u5727\u7E2E\u3092\u4F7F\u7528\u3057\u306A\u3044\n -M \u30A8\u30F3\u30C8\u30EA\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u4F5C\u6210\u3057\u306A\u3044\n -i \u6307\u5B9A\u306Ejar\u30D5\u30A1\u30A4\u30EB\u306E\u7D22\u5F15\u60C5\u5831\u3092\u751F\u6210\u3059\u308B\n -C \u6307\u5B9A\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u5909\u66F4\u3057\u3001\u4EE5\u4E0B\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u308A\u8FBC\u3080\n\u30D5\u30A1\u30A4\u30EB\u304C\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u5834\u5408\u306F\u518D\u5E30\u7684\u306B\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\n\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u3001\u30A2\u30FC\u30AB\u30A4\u30D6\u30FB\u30D5\u30A1\u30A4\u30EB\u540D\u304A\u3088\u3073\u30A8\u30F3\u30C8\u30EA\u30FB\u30DD\u30A4\u30F3\u30C8\u540D\u306F\u3001\n\u30D5\u30E9\u30B0'm'\u3001'f'\u3001'e'\u306E\u6307\u5B9A\u3068\u540C\u3058\u9806\u756A\u3067\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\n\n\u4F8B1: 2\u3064\u306E\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u30A2\u30FC\u30AB\u30A4\u30D6classes.jar\u306B\u4FDD\u5B58\u3059\u308B:\n jar cvf classes.jar Foo.class Bar.class\n\u4F8B2: \u65E2\u5B58\u306E\u30DE\u30CB\u30D5\u30A7\u30B9\u30C8\u30FB\u30D5\u30A1\u30A4\u30EB'mymanifest'\u3092\u4F7F\u7528\u3057\u3001foo/\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\n \u5168\u30D5\u30A1\u30A4\u30EB\u3092'classes.jar'\u306B\u30A2\u30FC\u30AB\u30A4\u30D6\u3059\u308B:\n jar cvfm classes.jar mymanifest -C foo/ \n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_ko.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_ko.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,20 +29,19 @@
error.bad.cflag='c' \uD50C\uB798\uADF8\uB97C \uC0AC\uC6A9\uD558\uB824\uBA74 Manifest \uB610\uB294 \uC785\uB825 \uD30C\uC77C\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4!
error.bad.uflag='u' \uD50C\uB798\uADF8\uB97C \uC0AC\uC6A9\uD558\uB824\uBA74 Manifest, 'e' \uD50C\uB798\uADF8 \uB610\uB294 \uC785\uB825 \uD30C\uC77C\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4!
error.bad.eflag='e' \uD50C\uB798\uADF8 \uBC0F Manifest\uB97C 'Main-Class' \uC18D\uC131\uACFC \uD568\uAED8 \uC9C0\uC815\uD560 \uC218\n\uC5C6\uC2B5\uB2C8\uB2E4!
-error.bad.pvalue=''Profile'' \uC18D\uC131\uC5D0 \uB300\uD574 \uC798\uBABB\uB41C \uAC12: {0}
error.nosuch.fileordir={0}: \uD574\uB2F9 \uD30C\uC77C \uB610\uB294 \uB514\uB809\uD1A0\uB9AC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
error.write.file=\uAE30\uC874 jar \uD30C\uC77C\uC5D0 \uC4F0\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.
error.create.dir={0}: \uB514\uB809\uD1A0\uB9AC\uB97C \uC0DD\uC131\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
error.incorrect.length=\uCC98\uB9AC \uC911 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uAE38\uC774\uAC00 \uBC1C\uACAC\uB428: {0}
out.added.manifest=Manifest\uB97C \uCD94\uAC00\uD568
-out.update.manifest=Manifest\uB97C \uAC31\uC2E0\uD568
+out.update.manifest=Manifest\uB97C \uC5C5\uB370\uC774\uD2B8\uD568
out.ignore.entry={0} \uD56D\uBAA9\uC744 \uBB34\uC2DC\uD558\uB294 \uC911
out.adding=\uCD94\uAC00\uD558\uB294 \uC911: {0}
out.deflated=({0}%\uB97C \uAC10\uC18C\uD568)
out.stored=(0%\uB97C \uC800\uC7A5\uD568)
out.create=\ \uC0DD\uC131\uB428: {0}
out.extracted=\uCD94\uCD9C\uB428: {0}
-out.inflated=\ \\\uC99D\uAC00\uB428: {0}
+out.inflated=\ \uC99D\uAC00\uB428: {0}
out.size=(\uC785\uB825 = {0}) (\uCD9C\uB825 = {1})
-usage=\uC0AC\uC6A9\uBC95: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\uC635\uC158:\n -c \uC0C8 \uC544\uCE74\uC774\uBE0C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -t \uC544\uCE74\uC774\uBE0C\uC5D0 \uB300\uD55C \uBAA9\uCC28\uB97C \uB098\uC5F4\uD569\uB2C8\uB2E4.\n -x \uBA85\uBA85\uB41C(\uB610\uB294 \uBAA8\uB4E0) \uD30C\uC77C\uC744 \uC544\uCE74\uC774\uBE0C\uC5D0\uC11C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\n -u \uAE30\uC874 \uC544\uCE74\uC774\uBE0C\uB97C \uC5C5\uB370\uC774\uD2B8\uD569\uB2C8\uB2E4.\n -v \uD45C\uC900 \uCD9C\uB825\uC5D0 \uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -f \uC544\uCE74\uC774\uBE0C \uD30C\uC77C \uC774\uB984\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n -m \uC9C0\uC815\uB41C Manifest \uD30C\uC77C\uC758 Manifest \uC815\uBCF4\uB97C \uD3EC\uD568\uD569\uB2C8\uB2E4.\n -e jar \uC2E4\uD589 \uD30C\uC77C\uC5D0 \uBC88\uB4E4\uB85C \uC81C\uACF5\uB41C \uB3C5\uB9BD\uD615 \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8\uC758 \n \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8 \uC2DC\uC791 \uC9C0\uC810\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n -p \uD504\uB85C\uD30C\uC77C \uC774\uB984\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n -0 \uC800\uC7A5 \uC804\uC6A9: ZIP \uC555\uCD95\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -M \uD56D\uBAA9\uC5D0 \uB300\uD574 Manifest \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -i \uC9C0\uC815\uB41C jar \uD30C\uC77C\uC5D0 \uB300\uD55C \uC778\uB371\uC2A4 \uC815\uBCF4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -C \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uB85C \uBCC0\uACBD\uD558\uACE0 \uB2E4\uC74C \uD30C\uC77C\uC744 \uD3EC\uD568\uD569\uB2C8\uB2E4.\n\uD2B9\uC815 \uD30C\uC77C\uC774 \uB514\uB809\uD1A0\uB9AC\uC77C \uACBD\uC6B0 \uC21C\uD658\uC801\uC73C\uB85C \uCC98\uB9AC\uB429\uB2C8\uB2E4.\nManifest \uD30C\uC77C \uC774\uB984, \uC544\uCE74\uC774\uBE0C \uD30C\uC77C \uC774\uB984 \uBC0F \uC2DC\uC791 \uC9C0\uC810 \uC774\uB984\uC740\n'm', 'f' \uBC0F 'e' \uD50C\uB798\uADF8\uC640 \uB3D9\uC77C\uD55C \uC21C\uC11C\uB85C \uC9C0\uC815\uB429\uB2C8\uB2E4.\n\n\uC608 1: classes.jar\uB77C\uB294 \uC544\uCE74\uC774\uBE0C\uC5D0 \uB450 \uD074\uB798\uC2A4 \uD30C\uC77C\uC744 \uC544\uCE74\uC774\uBE0C\uD558\uB294 \uBC29\uBC95: \n jar cvf classes.jar Foo.class Bar.class \n\uC608 2: \uAE30\uC874 Manifest \uD30C\uC77C 'mymanifest'\uB97C \uC0AC\uC6A9\uD558\uC5EC\n foo/ \uB514\uB809\uD1A0\uB9AC\uC758 \uBAA8\uB4E0 \uD30C\uC77C\uC744 'classes.jar'\uB85C \uC544\uCE74\uC774\uBE0C\uD558\uB294 \uBC29\uBC95: \n jar cvfm classes.jar mymanifest -C foo/\n
+usage=\uC0AC\uC6A9\uBC95: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\uC635\uC158:\n -c \uC0C8 \uC544\uCE74\uC774\uBE0C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -t \uC544\uCE74\uC774\uBE0C\uC5D0 \uB300\uD55C \uBAA9\uCC28\uB97C \uB098\uC5F4\uD569\uB2C8\uB2E4.\n -x \uBA85\uBA85\uB41C(\uB610\uB294 \uBAA8\uB4E0) \uD30C\uC77C\uC744 \uC544\uCE74\uC774\uBE0C\uC5D0\uC11C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\n -u \uAE30\uC874 \uC544\uCE74\uC774\uBE0C\uB97C \uC5C5\uB370\uC774\uD2B8\uD569\uB2C8\uB2E4.\n -v \uD45C\uC900 \uCD9C\uB825\uC5D0 \uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -f \uC544\uCE74\uC774\uBE0C \uD30C\uC77C \uC774\uB984\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n -m \uC9C0\uC815\uB41C Manifest \uD30C\uC77C\uC758 Manifest \uC815\uBCF4\uB97C \uD3EC\uD568\uD569\uB2C8\uB2E4.\n -e jar \uC2E4\uD589 \uD30C\uC77C\uC5D0 \uBC88\uB4E4\uB85C \uC81C\uACF5\uB41C \uB3C5\uB9BD\uD615 \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8\uC758 \n \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8 \uC2DC\uC791 \uC9C0\uC810\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n -0 \uC800\uC7A5 \uC804\uC6A9: ZIP \uC555\uCD95\uC744 \uC0AC\uC6A9\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -M \uD56D\uBAA9\uC5D0 \uB300\uD574 Manifest \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.\n -i \uC9C0\uC815\uB41C jar \uD30C\uC77C\uC5D0 \uB300\uD55C \uC778\uB371\uC2A4 \uC815\uBCF4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n -C \uC9C0\uC815\uB41C \uB514\uB809\uD1A0\uB9AC\uB85C \uBCC0\uACBD\uD558\uACE0 \uB2E4\uC74C \uD30C\uC77C\uC744 \uD3EC\uD568\uD569\uB2C8\uB2E4.\n\uD2B9\uC815 \uD30C\uC77C\uC774 \uB514\uB809\uD1A0\uB9AC\uC77C \uACBD\uC6B0 \uC21C\uD658\uC801\uC73C\uB85C \uCC98\uB9AC\uB429\uB2C8\uB2E4.\nManifest \uD30C\uC77C \uC774\uB984, \uC544\uCE74\uC774\uBE0C \uD30C\uC77C \uC774\uB984 \uBC0F \uC2DC\uC791 \uC9C0\uC810 \uC774\uB984\uC740\n'm', 'f' \uBC0F 'e' \uD50C\uB798\uADF8\uC640 \uB3D9\uC77C\uD55C \uC21C\uC11C\uB85C \uC9C0\uC815\uB429\uB2C8\uB2E4.\n\n\uC608 1: classes.jar\uB77C\uB294 \uC544\uCE74\uC774\uBE0C\uC5D0 \uB450 \uD074\uB798\uC2A4 \uD30C\uC77C\uC744 \uC544\uCE74\uC774\uBE0C\uD558\uB294 \uBC29\uBC95: \n jar cvf classes.jar Foo.class Bar.class \n\uC608 2: \uAE30\uC874 Manifest \uD30C\uC77C 'mymanifest'\uB97C \uC0AC\uC6A9\uD558\uC5EC\n foo/ \uB514\uB809\uD1A0\uB9AC\uC758 \uBAA8\uB4E0 \uD30C\uC77C\uC744 'classes.jar'\uB85C \uC544\uCE74\uC774\uBE0C\uD558\uB294 \uBC29\uBC95: \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_pt_BR.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_pt_BR.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=flag 'c' requer que os arquivos de manifesto ou entrada sejam especificados!
error.bad.uflag=o flag 'u' requer que arquivos de manifesto, o flag 'e' ou arquivos de entrada sejam especificados!
error.bad.eflag=o flag 'e' e manifesto com o atributo 'Main-Class' n\u00E3o podem ser especificados \njuntos!
-error.bad.pvalue=valor inv\u00E1lido do atributo de ''Perfil'': {0}
error.nosuch.fileordir={0} : n\u00E3o h\u00E1 tal arquivo ou diret\u00F3rio
error.write.file=Erro ao gravar o arquivo jar existente
error.create.dir={0} : n\u00E3o foi poss\u00EDvel criar o diret\u00F3rio
@@ -38,11 +37,11 @@
out.update.manifest=manifesto atualizado
out.ignore.entry=ignorando entrada {0}
out.adding=adicionando: {0}
-out.deflated=(vazio {0}%)
+out.deflated=(compactado {0}%)
out.stored=(armazenado 0%)
out.create=\ criado: {0}
out.extracted=extra\u00EDdo: {0}
-out.inflated=\ \\cheio: {0}
-out.size=(dentro = {0}) (fora= {1})
+out.inflated=\ inflado: {0}
+out.size=(entrada = {0}) (sa\u00EDda= {1})
-usage=Uso: arquivos jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] ...\nOp\u00E7\u00F5es:\n -c cria novo arquivo compactado\n -t lista o sum\u00E1rio do arquivo compactado\n -x extrai arquivos com o nome (ou todos) do arquivo compactado\n -u atualizar o arquivo compactado existente\n -v gera sa\u00EDda detalhada na sa\u00EDda padr\u00E3o\n -f especifica o nome do arquivo do arquivo compactado\n -m inclui as informa\u00E7\u00F5es do manifesto do arquivo de manifesto especificado\n -e especifica o ponto de entrada da aplica\u00E7\u00E3o para aplica\u00E7\u00E3o independente \n empacotado em um arquivo jar execut\u00E1vel\n -p especifca o nome do perfil\n -0 armazena somente; n\u00E3o usa compacta\u00E7\u00E3o ZIP\n -M n\u00E3o cria um arquivo de manifesto para as entradas\n -i gera informa\u00E7\u00F5es de \u00EDndice para os arquivos especificados\n -C altera para o diret\u00F3rio e inclui o arquivo seguinte\nSe nenhum arquivo for um diret\u00F3rio, ent\u00E3o ser\u00E1 processado repetidamente.\nO nome do arquivo de manifesto, o nome do arquivo compactado e o nome do ponto de entrada s\u00E3o\nespecificados na mesma ordem dos flags 'm', 'f' e 'e'.\n\nExemplo 1: para arquivar dois arquivos de classe em um arquivo compactado com o nome classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nExemplo 2: use um arquivo de manifesto existente 'mymanifest' e arquive todos os\n arquivos no diret\u00F3rio foo/ na 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n
+usage=Uso: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] arquivos ...\nOp\u00E7\u00F5es:\n -c cria novo arquivo compactado\n -t lista o sum\u00E1rio do arquivo compactado\n -x extrai arquivos com o nome (ou todos) do arquivo compactado\n -u atualizar o arquivo compactado existente\n -v gera sa\u00EDda detalhada na sa\u00EDda padr\u00E3o\n -f especifica o nome do arquivo do arquivo compactado\n -m inclui as informa\u00E7\u00F5es do manifesto do arquivo de manifesto especificado\n -e especifica o ponto de entrada da aplica\u00E7\u00E3o para aplica\u00E7\u00E3o independente \n empacotando em um arquivo jar execut\u00E1vel\n -0 armazena somente; n\u00E3o usa compacta\u00E7\u00E3o ZIP\n -M n\u00E3o cria um arquivo de manifesto para as entradas\n -i gera informa\u00E7\u00F5es de \u00EDndice para os arquivos especificados\n -C altera para o diret\u00F3rio e inclui o arquivo seguinte\nSe nenhum arquivo for um diret\u00F3rio, ent\u00E3o ser\u00E1 processado repetidamente.\nO nome do arquivo de manifesto, o nome do arquivo compactado e o nome do ponto de entrada s\u00E3o\nespecificados na mesma ordem dos flags 'm', 'f' e 'e'.\n\nExemplo 1: para arquivar dois arquivos de classe em um arquivo compactado com o nome classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nExemplo 2: use um arquivo de manifesto existente 'mymanifest' e arquive todos os\n arquivos no diret\u00F3rio foo/ na 'classes.jar': \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_sv.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_sv.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag=f\u00F6r c-flaggan m\u00E5ste manifest- eller indatafiler anges.
error.bad.uflag=f\u00F6r u-flaggan m\u00E5ste manifest-, e-flagg- eller indatafiler anges.
error.bad.eflag=e-flaggan och manifest med attributet Main-Class kan inte anges \ntillsammans.
-error.bad.pvalue=felaktigt v\u00E4rde f\u00F6r ''Profile''-attribut: {0}
error.nosuch.fileordir={0} : det finns ingen s\u00E5dan fil eller katalog
error.write.file=Det uppstod ett fel vid skrivning till befintlig jar-fil.
error.create.dir={0} : kunde inte skapa n\u00E5gon katalog
@@ -45,4 +44,4 @@
out.inflated=\ uppackat: {0}
out.size=(in = {0}) (ut = {1})
-usage=Syntax: jar {ctxui}[vfm0Me] [jar-fil] [manifestfil] [startpunkt] [-C katalog] filer ...\nAlternativ:\n -c skapa nytt arkiv\n -t lista inneh\u00E5llsf\u00F6rteckning f\u00F6r arkiv\n -x extrahera namngivna (eller alla) filer fr\u00E5n arkiv\n -u uppdatera befintligt arkiv\n -v generera utf\u00F6rliga utdata vid standardutmatning\n -f ange arkivfilens namn\n -m inkludera manifestinformation fr\u00E5n angivet manifest\n -e ange programstartpunkt f\u00F6r frist\u00E5ende applikation \n som medf\u00F6ljer i en jar-programfil\n -p ange profilnamn\n -0 endast lagra (ingen zip-komprimering)\n -M skapa inte n\u00E5gon manifestfil f\u00F6r posterna\n -i generera indexinformation f\u00F6r de angivna jar-filerna\n -C \u00E4ndra till den angivna katalogen och inkludera f\u00F6ljande fil\nOm en fil \u00E4r en katalog bearbetas den rekursivt.\nNamnen p\u00E5 manifestfilen, arkivfilen och startpunkten anges\ni samma ordning som m-, f- och e-flaggorna.\n\nExempel 1: S\u00E5 h\u00E4r arkiverar du tv\u00E5 klassfiler i ett arkiv med namnet classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nExempel 2: Anv\u00E4nd en befintlig manifestfil (mymanifest) och arkivera alla\n filer fr\u00E5n katalogen foo/ i classes.jar: \n jar cvfm classes.jar mymanifest -C foo/ .\n
+usage=Syntax: jar {ctxui}[vfm0Me] [jar fil] [manifestfil] [startpunkt] [-C-katalog] ...\nAlternativ:\n -c skapa nytt arkiv\n -t lista inneh\u00E5llsf\u00F6rteckning f\u00F6r arkiv\n -x extrahera namngivna (eller alla) filer fr\u00E5n arkiv\n -u uppdatera befintligt arkiv\n -v generera utf\u00F6rliga utdata vid standardutmatning\n -f ange arkivfilens namn\n -m inkludera manifestinformation fr\u00E5n angivet manifest\n -e ange programstartpunkt f\u00F6r frist\u00E5ende applikation \n som medf\u00F6ljer i en jar-programfil\n -0 endast lagra (ingen zip-komprimering)\n -M skapa inte n\u00E5gon manifestfil f\u00F6r posterna\n -i generera indexinformation f\u00F6r de angivna jar-filerna\n -C \u00E4ndra till den angivna katalogen och inkludera f\u00F6ljande fil\nOm en fil \u00E4r en katalog bearbetas den rekursivt.\nNamnen p\u00E5 manifestfilen, arkivfilen och startpunkten anges i samma\nordning som m-, f- och e-flaggorna.\n\nExempel 1: S\u00E5 h\u00E4r arkiverar du tv\u00E5 klassfiler i ett arkiv med namnet classes.jar: \n jar cvf classes.jar Foo.class Bar.class \nExempel 2: Anv\u00E4nd en befintlig manifestfil (mymanifest) och arkivera alla\n filer fr\u00E5n katalogen foo/ i classes.jar: \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag='c' \u6807\u8BB0\u8981\u6C42\u6307\u5B9A\u6E05\u5355\u6216\u8F93\u5165\u6587\u4EF6!
error.bad.uflag='u' \u6807\u8BB0\u8981\u6C42\u6307\u5B9A\u6E05\u5355, 'e' \u6807\u8BB0\u6216\u8F93\u5165\u6587\u4EF6!
error.bad.eflag=\u4E0D\u80FD\u540C\u65F6\u6307\u5B9A 'e' \u6807\u8BB0\u548C\u5177\u6709 'Main-Class' \u5C5E\u6027\u7684\n\u6E05\u5355!
-error.bad.pvalue=''Profile'' \u5C5E\u6027\u7684\u503C\u9519\u8BEF: {0}
error.nosuch.fileordir={0}: \u6CA1\u6709\u8FD9\u4E2A\u6587\u4EF6\u6216\u76EE\u5F55
error.write.file=\u5199\u5165\u73B0\u6709\u7684 jar \u6587\u4EF6\u65F6\u51FA\u9519
error.create.dir={0}: \u65E0\u6CD5\u521B\u5EFA\u76EE\u5F55
@@ -45,4 +44,4 @@
out.inflated=\ \u5DF2\u89E3\u538B: {0}
out.size=(\u8F93\u5165 = {0}) (\u8F93\u51FA = {1})
-usage=\u7528\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\u9009\u9879:\n -c \u521B\u5EFA\u65B0\u6863\u6848\n -t \u5217\u51FA\u6863\u6848\u76EE\u5F55\n -x \u4ECE\u6863\u6848\u4E2D\u63D0\u53D6\u6307\u5B9A\u7684 (\u6216\u6240\u6709) \u6587\u4EF6\n -u \u66F4\u65B0\u73B0\u6709\u6863\u6848\n -v \u5728\u6807\u51C6\u8F93\u51FA\u4E2D\u751F\u6210\u8BE6\u7EC6\u8F93\u51FA\n -f \u6307\u5B9A\u6863\u6848\u6587\u4EF6\u540D\n -m \u5305\u542B\u6307\u5B9A\u6E05\u5355\u6587\u4EF6\u4E2D\u7684\u6E05\u5355\u4FE1\u606F\n -e \u4E3A\u7ED1\u5B9A\u5230\u53EF\u6267\u884C jar \u6587\u4EF6\u7684\u72EC\u7ACB\u5E94\u7528\u7A0B\u5E8F\n \u6307\u5B9A\u5E94\u7528\u7A0B\u5E8F\u5165\u53E3\u70B9\n -p \u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u540D\u79F0\n -0 \u4EC5\u5B58\u50A8; \u4E0D\u4F7F\u7528\u4EFB\u4F55 ZIP \u538B\u7F29\n -M \u4E0D\u521B\u5EFA\u6761\u76EE\u7684\u6E05\u5355\u6587\u4EF6\n -i \u4E3A\u6307\u5B9A\u7684 jar \u6587\u4EF6\u751F\u6210\u7D22\u5F15\u4FE1\u606F\n -C \u66F4\u6539\u4E3A\u6307\u5B9A\u7684\u76EE\u5F55\u5E76\u5305\u542B\u4EE5\u4E0B\u6587\u4EF6\n\u5982\u679C\u6587\u4EF6\u4E3A\u76EE\u5F55, \u5219\u5BF9\u5176\u8FDB\u884C\u9012\u5F52\u5904\u7406\u3002\n\u6E05\u5355\u6587\u4EF6\u540D, \u6863\u6848\u6587\u4EF6\u540D\u548C\u5165\u53E3\u70B9\u540D\u79F0\u7684\u6307\u5B9A\u987A\u5E8F\n\u4E0E 'm', 'f' \u548C 'e' \u6807\u8BB0\u7684\u6307\u5B9A\u987A\u5E8F\u76F8\u540C\u3002\n\n\u793A\u4F8B 1: \u5C06\u4E24\u4E2A\u7C7B\u6587\u4EF6\u5F52\u6863\u5230\u4E00\u4E2A\u540D\u4E3A classes.jar \u7684\u6863\u6848\u4E2D: \n jar cvf classes.jar Foo.class Bar.class \n\u793A\u4F8B 2: \u4F7F\u7528\u73B0\u6709\u7684\u6E05\u5355\u6587\u4EF6 'mymanifest' \u5E76\n \u5C06 foo/ \u76EE\u5F55\u4E2D\u7684\u6240\u6709\u6587\u4EF6\u5F52\u6863\u5230 'classes.jar' \u4E2D: \n jar cvfm classes.jar mymanifest -C foo/\u3002\n
+usage=\u7528\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\u9009\u9879\u5305\u62EC: \n -c \u521B\u5EFA\u65B0\u7684\u5F52\u6863\u6587\u4EF6\n -t \u5217\u51FA\u5F52\u6863\u76EE\u5F55\n -x \u4ECE\u6863\u6848\u4E2D\u63D0\u53D6\u6307\u5B9A\u7684 (\u6216\u6240\u6709) \u6587\u4EF6\n -u \u66F4\u65B0\u73B0\u6709\u7684\u5F52\u6863\u6587\u4EF6\n -v \u5728\u6807\u51C6\u8F93\u51FA\u4E2D\u751F\u6210\u8BE6\u7EC6\u8F93\u51FA\n -f \u6307\u5B9A\u5F52\u6863\u6587\u4EF6\u540D\n -m \u5305\u542B\u6307\u5B9A\u6E05\u5355\u6587\u4EF6\u4E2D\u7684\u6E05\u5355\u4FE1\u606F\n -e \u4E3A\u6346\u7ED1\u5230\u53EF\u6267\u884C jar \u6587\u4EF6\u7684\u72EC\u7ACB\u5E94\u7528\u7A0B\u5E8F\n \u6307\u5B9A\u5E94\u7528\u7A0B\u5E8F\u5165\u53E3\u70B9\n -0 \u4EC5\u5B58\u50A8; \u4E0D\u4F7F\u7528\u60C5\u51B5\u4EFB\u4F55 ZIP \u538B\u7F29\n -M \u4E0D\u521B\u5EFA\u6761\u76EE\u7684\u6E05\u5355\u6587\u4EF6\n -i \u4E3A\u6307\u5B9A\u7684 jar \u6587\u4EF6\u751F\u6210\u7D22\u5F15\u4FE1\u606F\n -C \u66F4\u6539\u4E3A\u6307\u5B9A\u7684\u76EE\u5F55\u5E76\u5305\u542B\u5176\u4E2D\u7684\u6587\u4EF6\n\u5982\u679C\u6709\u4EFB\u4F55\u76EE\u5F55\u6587\u4EF6, \u5219\u5BF9\u5176\u8FDB\u884C\u9012\u5F52\u5904\u7406\u3002\n\u6E05\u5355\u6587\u4EF6\u540D, \u5F52\u6863\u6587\u4EF6\u540D\u548C\u5165\u53E3\u70B9\u540D\u79F0\u7684\u6307\u5B9A\u987A\u5E8F\n\u4E0E 'm', 'f' \u548C 'e' \u6807\u8BB0\u7684\u6307\u5B9A\u987A\u5E8F\u76F8\u540C\u3002\n\n\u793A\u4F8B 1: \u5C06\u4E24\u4E2A\u7C7B\u6587\u4EF6\u5F52\u6863\u5230\u4E00\u4E2A\u540D\u4E3A classes.jar \u7684\u5F52\u6863\u6587\u4EF6\u4E2D: \n jar cvf classes.jar Foo.class Bar.class \n\u793A\u4F8B 2: \u4F7F\u7528\u73B0\u6709\u7684\u6E05\u5355\u6587\u4EF6 'mymanifest' \u5E76\n \u5C06 foo/ \u76EE\u5F55\u4E2D\u7684\u6240\u6709\u6587\u4EF6\u5F52\u6863\u5230 'classes.jar' \u4E2D: \n jar cvfm classes.jar mymanifest -C foo/\u3002\n
--- a/jdk/src/share/classes/sun/tools/jar/resources/jar_zh_TW.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jar/resources/jar_zh_TW.properties Thu Oct 03 19:18:54 2013 +0100
@@ -29,7 +29,6 @@
error.bad.cflag='c' \u65D7\u6A19\u8981\u6C42\u6307\u5B9A\u8CC7\u8A0A\u6E05\u55AE\u6216\u8F38\u5165\u6A94\u6848\uFF01
error.bad.uflag='u' \u65D7\u6A19\u8981\u6C42\u6307\u5B9A\u8CC7\u8A0A\u6E05\u55AE\u3001'e' \u65D7\u6A19\u6216\u8F38\u5165\u6A94\u6848\uFF01
error.bad.eflag=\u7121\u6CD5\u540C\u6642\u6307\u5B9A 'e' \u65D7\u6A19\u548C\u5177\u6709 'Main-Class' \u5C6C\u6027\u7684\n\u8CC7\u8A0A\u6E05\u55AE\uFF01
-error.bad.pvalue=''Profile'' \u5C6C\u6027\u503C\u7121\u6548: {0}
error.nosuch.fileordir={0} : \u6C92\u6709\u9019\u985E\u6A94\u6848\u6216\u76EE\u9304
error.write.file=\u5BEB\u5165\u73FE\u6709\u7684 jar \u6A94\u6848\u6642\u767C\u751F\u932F\u8AA4
error.create.dir={0} : \u7121\u6CD5\u5EFA\u7ACB\u76EE\u9304
@@ -42,7 +41,7 @@
out.stored=(\u5132\u5B58 0%)
out.create=\ \u5EFA\u7ACB: {0}
out.extracted=\u64F7\u53D6: {0}
-out.inflated=\ \\\u64F4\u5C55: {0}
+out.inflated=\ \u64F4\u5C55: {0}
out.size=\ (\u8B80={0})(\u5BEB={1})
-usage=\u7528\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...\n\u9078\u9805:\n -c \u5EFA\u7ACB\u65B0\u7684\u5B58\u6A94\n -t \u5217\u51FA\u5B58\u6A94\u7684\u76EE\u9304\n -x \u5F9E\u5B58\u6A94\u4E2D\u64F7\u53D6\u6307\u5B9A\u7684 (\u6216\u6240\u6709) \u6A94\u6848\n -u \u66F4\u65B0\u73FE\u6709\u5B58\u6A94\n -v \u5728\u6A19\u6E96\u8F38\u51FA\u7522\u751F\u8A73\u7D30\u8F38\u51FA\n -f \u6307\u5B9A\u5B58\u6A94\u6A94\u6848\u540D\u7A31\n -m \u5305\u542B\u6307\u5B9A\u4E4B\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848\u4E2D\u7684\u8CC7\u8A0A\u6E05\u55AE\u8CC7\u8A0A\n -e \u6307\u5B9A\u7368\u7ACB\u61C9\u7528\u7A0B\u5F0F\u7684\u61C9\u7528\u7A0B\u5F0F\u9032\u5165\u9EDE \n \u5DF2\u96A8\u9644\u65BC\u53EF\u57F7\u884C jar \u6A94\u6848\u4E2D\n -p \u6307\u5B9A\u8A2D\u5B9A\u6A94\u540D\u7A31\n -0 \u53EA\u5132\u5B58; \u4E0D\u4F7F\u7528 ZIP \u58D3\u7E2E\u65B9\u5F0F\n -M \u4E0D\u66FF\u9805\u76EE\u5EFA\u7ACB\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848\n -i \u7522\u751F\u6307\u5B9A\u4E4B jar \u6A94\u6848\u7684\u7D22\u5F15\u8CC7\u8A0A\n -C \u8B8A\u66F4\u81F3\u6307\u5B9A\u7684\u76EE\u9304\u4E26\u5305\u542B\u4E0B\u5217\u6A94\u6848\n\u5982\u679C\u6709\u4EFB\u4F55\u6A94\u6848\u662F\u76EE\u9304\uFF0C\u5247\u6703\u905E\u8FF4\u5730\u8655\u7406\u6A94\u6848\u3002\n\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848\u540D\u7A31\u3001\u5B58\u6A94\u6A94\u6848\u540D\u7A31\u4EE5\u53CA\u9032\u5165\u9EDE\u540D\u7A31\u7684\n\u6307\u5B9A\u9806\u5E8F\u8207 'm' \u65D7\u6A19\u3001'f' \u65D7\u6A19\u548C 'e' \u65D7\u6A19\u7684\u9806\u5E8F\u76F8\u540C\u3002\n\n\u7BC4\u4F8B 1: \u5C07\u5169\u500B\u985E\u5225\u6A94\u6848\u5B58\u6A94\u81F3\u540D\u70BA classes.jar \u7684\u5B58\u6A94\u4E2D: \n jar cvf classes.jar Foo.class Bar.class \n\u7BC4\u4F8B 2: \u4F7F\u7528\u73FE\u6709\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848 'mymanifest'\uFF0C\u5C07 foo/ \u76EE\u9304\n \u4E2D\u7684\u6240\u6709\u6A94\u6848\u5B58\u6A94\u81F3 'classes.jar' \u4E2D: \n jar cvfm classes.jar mymanifest -C foo/ \n
+usage=\u7528\u6CD5: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] \u6A94\u6848 ...\n\u9078\u9805:\n -c \u5EFA\u7ACB\u65B0\u7684\u6B78\u6A94\n -t \u5217\u51FA\u6B78\u6A94\u7684\u76EE\u9304\n -x \u5F9E\u6B78\u6A94\u4E2D\u64F7\u53D6\u5DF2\u547D\u540D\u7684 (\u6216\u6240\u6709) \u6A94\u6848\n -u \u66F4\u65B0\u73FE\u6709\u6B78\u6A94\n -v \u5728\u6A19\u6E96\u8F38\u51FA\u4E2D\u7522\u751F\u8A73\u7D30\u8F38\u51FA\n -f \u6307\u5B9A\u6B78\u6A94\u6A94\u6848\u540D\u7A31\n -m \u5305\u542B\u6307\u5B9A\u8CC7\u8A0A\u6E05\u55AE\u4E2D\u7684\u8CC7\u8A0A\u6E05\u55AE\u8CC7\u8A0A\n -e \u70BA\u7368\u7ACB\u61C9\u7528\u7A0B\u5F0F\u6307\u5B9A\u61C9\u7528\u7A0B\u5F0F\u9032\u5165\u9EDE\n \u5DF2\u96A8\u9644\u65BC\u53EF\u57F7\u884C jar \u6A94\u6848\u4E2D\n -0 \u50C5\u5132\u5B58; \u4E0D\u4F7F\u7528 ZIP \u58D3\u7E2E\u65B9\u5F0F\n -M \u4E0D\u70BA\u9805\u76EE\u5EFA\u7ACB\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848\n -i \u70BA\u6307\u5B9A\u7684 jar \u6A94\u6848\u7522\u751F\u7D22\u5F15\u8CC7\u8A0A\n -C \u8B8A\u66F4\u81F3\u6307\u5B9A\u76EE\u9304\u4E26\u5305\u542B\u5F8C\u9762\u6240\u5217\u7684\u6A94\u6848\n\u5982\u679C\u6709\u4EFB\u4F55\u6A94\u6848\u662F\u76EE\u9304\uFF0C\u5247\u6703\u5C0D\u5176\u9032\u884C\u905E\u8FF4\u8655\u7406\u3002\n\u6E05\u55AE\u6A94\u6848\u540D\u7A31\u3001\u6B78\u6A94\u6A94\u6848\u540D\u7A31\u548C\u9032\u5165\u9EDE\u540D\u7A31\n\u7684\u6307\u5B9A\u9806\u5E8F\u8207\u6307\u5B9A 'm' \u65D7\u6A19\u3001'f' \u65D7\u6A19\u548C 'e' \u65D7\u6A19\u7684\u9806\u5E8F\u76F8\u540C\u3002\n\n\u7BC4\u4F8B 1: \u5C07\u5169\u500B\u985E\u5225\u6A94\u6848\u6B78\u6A94\u81F3\u540D\u70BA classes.jar \u7684\u6B78\u6A94\u4E2D: \n jar cvf classes.jar Foo.class Bar.class\n\u7BC4\u4F8B 2: \u4F7F\u7528\u73FE\u6709\u8CC7\u8A0A\u6E05\u55AE\u6A94\u6848 'mymanifest' \u4E26\u5C07\n foo/ \u76EE\u9304\u4E2D\u7684\u6240\u6709\u6A94\u6848\u6B78\u6A94\u81F3 'classes.jar' \u4E2D: \n jar cvfm classes.jar mymanifest -C foo/ .\n
--- a/jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jconsole/resources/messages_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -113,6 +113,7 @@
IMPACT=\u5F71\u97FF
INFO=\u60C5\u5831
INFO_CAPITALIZED=INFO
+INSECURE=\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u63A5\u7D9A
INVALID_PLUGIN_PATH=\u8B66\u544A: \u7121\u52B9\u306A\u30D7\u30E9\u30B0\u30A4\u30F3\u30FB\u30D1\u30B9: {0}
INVALID_URL=\u7121\u52B9\u306AURL: {0}
IS=\u6B21\u306B\u4E00\u81F4\u3059\u308B
@@ -135,14 +136,14 @@
MBEANS=MBeans
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON=\u30AF\u30EA\u30A2(&C)
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON_TOOLTIP=\u901A\u77E5\u306E\u30AF\u30EA\u30A2
-MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=\u30B3\u30F3\u30DD\u30B8\u30C3\u30C8\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3{0}/{1}
-MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=\u30B3\u30F3\u30DD\u30B8\u30C3\u30C8\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3
+MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=\u30B3\u30F3\u30DD\u30B8\u30C3\u30C8\u30FB\u30C7\u30FC\u30BF\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3{0}/{1}
+MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=\u30B3\u30F3\u30DD\u30B8\u30C3\u30C8\u30FB\u30C7\u30FC\u30BF\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON=\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5(&R)
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON_TOOLTIP=\u5C5E\u6027\u306E\u30EA\u30D5\u30EC\u30C3\u30B7\u30E5
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON=\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D6(&S)
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=\u901A\u77E5\u30EA\u30B9\u30CB\u30F3\u30B0\u306E\u958B\u59CB
-MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=\u30BF\u30D6\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3{0}/{1}
-MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=\u30BF\u30D6\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3
+MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=\u30BF\u30D6\u30FB\u30C7\u30FC\u30BF\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3{0}/{1}
+MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=\u30BF\u30D6\u30FB\u30C7\u30FC\u30BF\u30FB\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON=\u30B5\u30D6\u30B9\u30AF\u30E9\u30A4\u30D6\u89E3\u9664(&U)
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=\u901A\u77E5\u30EA\u30B9\u30CB\u30F3\u30B0\u306E\u505C\u6B62
MANAGE_HOTSPOT_MBEANS_IN_COLON_=Hotspot MBeans\u306E\u7BA1\u7406:
@@ -196,6 +197,11 @@
PLOTTER_ACCESSIBLE_NAME_NO_DATA=\u30C7\u30FC\u30BF\u304C\u30D7\u30ED\u30C3\u30C8\u3055\u308C\u307E\u305B\u3093\u3002
PLOTTER_SAVE_AS_MENU_ITEM=\u540D\u524D\u3092\u4ED8\u3051\u3066\u30C7\u30FC\u30BF\u3092\u4FDD\u5B58(&A)...
PLOTTER_TIME_RANGE_MENU=\u6642\u9593\u7BC4\u56F2(&T)
+PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT=\u7D42\u4E86
+PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE=\u7121\u8996
+PLUGIN_EXCEPTION_DIALOG_BUTTON_OK=OK
+PLUGIN_EXCEPTION_DIALOG_MESSAGE=%s\u3067\u4E88\u671F\u3057\u306A\u3044\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F:\n\n%s\n\n\u8A73\u7D30\u306F\u3001\u5148\u982D\u306B-debug\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u7121\u8996\u3059\u308B\u3068\u3001\u4F8B\u5916\u306F\u3053\u308C\u4EE5\u4E0A\u8868\u793A\u3055\u308C\u306A\u304F\u306A\u308A\u307E\u3059\u3002
+PLUGIN_EXCEPTION_DIALOG_TITLE=\u30D7\u30E9\u30B0\u30A4\u30F3\u4F8B\u5916
PROBLEM_ADDING_LISTENER=\u30EA\u30B9\u30CA\u30FC\u8FFD\u52A0\u4E2D\u306E\u554F\u984C
PROBLEM_DISPLAYING_MBEAN=MBean\u8868\u793A\u4E2D\u306E\u554F\u984C
PROBLEM_INVOKING=\u547C\u51FA\u3057\u4E2D\u306E\u554F\u984C
@@ -223,6 +229,7 @@
THREADS=\u30B9\u30EC\u30C3\u30C9
THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME=\u30B9\u30EC\u30C3\u30C9\u60C5\u5831
THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME=\u30B9\u30EC\u30C3\u30C9\u6570\u306E\u30C1\u30E3\u30FC\u30C8\u3002
+THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE=[\u30B9\u30EC\u30C3\u30C9\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093]
THRESHOLD=\u3057\u304D\u3044\u5024
TILE=\u4E26\u3079\u3066\u8868\u793A(&T)
TIME_RANGE_COLON=\u6642\u9593\u7BC4\u56F2(&T):
@@ -260,6 +267,8 @@
WRITABLE=\u66F8\u8FBC\u307F\u53EF\u80FD
CONNECTION_FAILED1=\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F: \u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002
CONNECTION_FAILED2={0}\u3078\u306E\u63A5\u7D9A\u304C\u6210\u529F\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002<br>\u3082\u3046\u4E00\u5EA6\u8A66\u3057\u307E\u3059\u304B\u3002
+CONNECTION_FAILED_SSL1=\u4FDD\u8B77\u3055\u308C\u305F\u63A5\u7D9A\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u4FDD\u8B77\u305B\u305A\u306B\u518D\u8A66\u884C\u3057\u307E\u3059\u304B\u3002
+CONNECTION_FAILED_SSL2=SSL\u3092\u4F7F\u7528\u3057\u3066{0}\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002<br>SSL\u306A\u3057\u3067\u63A5\u7D9A\u3057\u307E\u3059\u304B\u3002<br>(\u30E6\u30FC\u30B6\u30FC\u540D\u304A\u3088\u3073\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u30D7\u30EC\u30FC\u30F3\u30FB\u30C6\u30AD\u30B9\u30C8\u3067\u9001\u4FE1\u3055\u308C\u307E\u3059\u3002)
CONNECTION_LOST1=\u63A5\u7D9A\u304C\u5931\u308F\u308C\u307E\u3057\u305F: \u518D\u63A5\u7D9A\u3057\u307E\u3059\u304B\u3002
CONNECTING_TO1={0}\u306B\u63A5\u7D9A\u4E2D
CONNECTING_TO2={0}\u306B\u73FE\u5728\u63A5\u7D9A\u4E2D\u3067\u3059\u3002<br>\u3053\u308C\u306B\u306F\u6570\u5206\u304B\u304B\u308A\u307E\u3059\u3002
--- a/jdk/src/share/classes/sun/tools/jconsole/resources/messages_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jconsole/resources/messages_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -113,6 +113,7 @@
IMPACT=\u5F71\u54CD
INFO=\u4FE1\u606F
INFO_CAPITALIZED=\u4FE1\u606F
+INSECURE=\u4E0D\u5B89\u5168\u7684\u8FDE\u63A5
INVALID_PLUGIN_PATH=\u8B66\u544A: \u63D2\u4EF6\u8DEF\u5F84\u65E0\u6548: {0}
INVALID_URL=URL \u65E0\u6548: {0}
IS=\u662F
@@ -135,14 +136,14 @@
MBEANS=MBean
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON=\u6E05\u9664(&C)
MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON_TOOLTIP=\u6E05\u9664\u901A\u77E5
-MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=\u7EC4\u5408\u5BFC\u822A{0}/{1}
-MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=\u7EC4\u5408\u5BFC\u822A
+MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=\u7EC4\u5408\u6570\u636E\u5BFC\u822A{0}/{1}
+MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=\u7EC4\u5408\u6570\u636E\u5BFC\u822A
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON=\u5237\u65B0(&R)
MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON_TOOLTIP=\u5237\u65B0\u5C5E\u6027
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON=\u8BA2\u9605(&S)
MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=\u5F00\u59CB\u76D1\u542C\u901A\u77E5
-MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=\u8868\u683C\u5F0F\u5BFC\u822A{0}/{1}
-MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=\u8868\u683C\u5F0F\u5BFC\u822A
+MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=\u8868\u683C\u5F0F\u6570\u636E\u5BFC\u822A{0}/{1}
+MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=\u8868\u683C\u5F0F\u6570\u636E\u5BFC\u822A
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON=\u53D6\u6D88\u8BA2\u9605(&U)
MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=\u505C\u6B62\u76D1\u542C\u901A\u77E5
MANAGE_HOTSPOT_MBEANS_IN_COLON_=\u7BA1\u7406\u4EE5\u4E0B\u4F4D\u7F6E\u7684 HotSpot MBean:
@@ -196,6 +197,11 @@
PLOTTER_ACCESSIBLE_NAME_NO_DATA=\u672A\u7ED8\u5236\u6570\u636E\u3002
PLOTTER_SAVE_AS_MENU_ITEM=\u5C06\u6570\u636E\u53E6\u5B58\u4E3A(&A)...
PLOTTER_TIME_RANGE_MENU=\u65F6\u95F4\u8303\u56F4(&T)
+PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT=\u9000\u51FA
+PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE=\u5FFD\u7565
+PLUGIN_EXCEPTION_DIALOG_BUTTON_OK=\u786E\u5B9A
+PLUGIN_EXCEPTION_DIALOG_MESSAGE=%s \u4E2D\u51FA\u73B0\u610F\u5916\u7684\u5F02\u5E38\u9519\u8BEF:\n\n%s\n\n\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u8FD0\u884C\u4EE5 -debug \u5F00\u5934\u7684\u547D\u4EE4\u83B7\u53D6\u3002\u5982\u679C\u5FFD\u7565, \u5219\u5C06\u9690\u85CF\u540E\u9762\u7684\u5F02\u5E38\u9519\u8BEF\u3002
+PLUGIN_EXCEPTION_DIALOG_TITLE=\u63D2\u4EF6\u5F02\u5E38\u9519\u8BEF
PROBLEM_ADDING_LISTENER=\u6DFB\u52A0\u76D1\u542C\u7A0B\u5E8F\u65F6\u51FA\u73B0\u95EE\u9898
PROBLEM_DISPLAYING_MBEAN=\u663E\u793A MBean \u65F6\u51FA\u73B0\u95EE\u9898
PROBLEM_INVOKING=\u8C03\u7528\u65F6\u51FA\u73B0\u95EE\u9898
@@ -223,6 +229,7 @@
THREADS=\u7EBF\u7A0B
THREAD_TAB_THREAD_INFO_ACCESSIBLE_NAME=\u7EBF\u7A0B\u4FE1\u606F
THREAD_TAB_THREAD_PLOTTER_ACCESSIBLE_NAME=\u8868\u793A\u7EBF\u7A0B\u6570\u7684\u56FE\u8868\u3002
+THREAD_TAB_INITIAL_STACK_TRACE_MESSAGE=[\u672A\u9009\u62E9\u7EBF\u7A0B]
THRESHOLD=\u9608\u503C
TILE=\u5E73\u94FA(&T)
TIME_RANGE_COLON=\u65F6\u95F4\u8303\u56F4(&T):
@@ -260,6 +267,8 @@
WRITABLE=\u53EF\u5199\u5165
CONNECTION_FAILED1=\u8FDE\u63A5\u5931\u8D25: \u662F\u5426\u91CD\u8BD5?
CONNECTION_FAILED2=\u672A\u6210\u529F\u8FDE\u63A5\u5230{0}\u3002<br>\u662F\u5426\u8981\u91CD\u8BD5?
+CONNECTION_FAILED_SSL1=\u5B89\u5168\u8FDE\u63A5\u5931\u8D25\u3002\u662F\u5426\u4EE5\u4E0D\u5B89\u5168\u7684\u65B9\u5F0F\u91CD\u8BD5?
+CONNECTION_FAILED_SSL2=\u65E0\u6CD5\u4F7F\u7528 SSL \u8FDE\u63A5\u5230{0}\u3002<br>\u662F\u5426\u5728\u4E0D\u4F7F\u7528 SSL \u7684\u60C5\u51B5\u4E0B\u8FDB\u884C\u5C1D\u8BD5?<br>(\u7528\u6237\u540D\u548C\u53E3\u4EE4\u5C06\u4EE5\u7EAF\u6587\u672C\u683C\u5F0F\u53D1\u9001\u3002)
CONNECTION_LOST1=\u8FDE\u63A5\u4E22\u5931: \u662F\u5426\u91CD\u65B0\u8FDE\u63A5?
CONNECTING_TO1=\u6B63\u5728\u8FDE\u63A5\u5230{0}
CONNECTING_TO2=\u60A8\u5F53\u524D\u6B63\u5728\u8FDE\u63A5\u5230{0}\u3002<br>\u8FD9\u5C06\u9700\u8981\u51E0\u5206\u949F\u7684\u65F6\u95F4\u3002
--- a/jdk/src/share/classes/sun/tools/jstat/resources/jstat_options Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/classes/sun/tools/jstat/resources/jstat_options Thu Oct 03 19:18:54 2013 +0100
@@ -208,6 +208,22 @@
format "0.0"
}
column {
+ header "^CCSC^" /* Compressed Class Space Capacity - Current */
+ data sun.gc.compressedclassspace.capacity
+ align center
+ width 6
+ scale K
+ format "0.0"
+ }
+ column {
+ header "^CCSU^" /* Compressed Class Space Used */
+ data sun.gc.compressedclassspace.used
+ align center
+ width 6
+ scale K
+ format "0.0"
+ }
+ column {
header "^YGC^" /* Young Generation Collections */
data sun.gc.collector.0.invocations
align right
@@ -354,6 +370,30 @@
format "0.0"
}
column {
+ header "^CCSMN^" /* Compressed Class Space Capacity - Minimum */
+ data sun.gc.compressedclassspace.minCapacity
+ scale K
+ align right
+ width 8
+ format "0.0"
+ }
+ column {
+ header "^CCSMX^" /* Compressed Class Space Capacity - Maximum */
+ data sun.gc.compressedclassspace.maxCapacity
+ scale K
+ align right
+ width 8
+ format "0.0"
+ }
+ column {
+ header "^CCSC^" /* Compressed Class Space Capacity - Current */
+ data sun.gc.compressedclassspace.capacity
+ scale K
+ align right
+ width 8
+ format "0.0"
+ }
+ column {
header "^YGC^" /* Young Generation Collections */
data sun.gc.collector.0.invocations
align right
@@ -412,6 +452,14 @@
format "0.00"
}
column {
+ header "^CCS^" /* Compressed Class Space - Percent Used */
+ data (1-((sun.gc.compressedclassspace.capacity - sun.gc.compressedclassspace.used)/sun.gc.compressedclassspace.capacity)) * 100
+ align right
+ width 6
+ scale raw
+ format "0.00"
+ }
+ column {
header "^YGC^" /* Young Generation Collections */
data sun.gc.collector.0.invocations
align right
@@ -662,6 +710,22 @@
format "0.0"
}
column {
+ header "^CCSC^" /* Compressed Class Space Capacity - Current */
+ data sun.gc.compressedclassspace.capacity
+ width 8
+ align right
+ scale K
+ format "0.0"
+ }
+ column {
+ header "^CCSU^" /* Compressed Class Space Used */
+ data sun.gc.compressedclassspace.used
+ width 8
+ align right
+ scale K
+ format "0.0"
+ }
+ column {
header "^OC^" /* Old Space Capacity - Current */
data sun.gc.generation.1.space.0.capacity
width 11
@@ -802,6 +866,30 @@
format "0.0"
}
column {
+ header "^CCSMN^" /* Compressed Class Space Capacity - Minimum */
+ data sun.gc.compressedclassspace.minCapacity
+ scale K
+ align right
+ width 10
+ format "0.0"
+ }
+ column {
+ header "^CCSMX^" /* Compressed Class Space Capacity - Maximum */
+ data sun.gc.compressedclassspace.maxCapacity
+ scale K
+ align right
+ width 10
+ format "0.0"
+ }
+ column {
+ header "^CCSC^" /* Compressed Class Space Capacity - Current */
+ data sun.gc.compressedclassspace.capacity
+ scale K
+ align right
+ width 10
+ format "0.0"
+ }
+ column {
header "^YGC^" /* Young Generation Collections */
data sun.gc.collector.0.invocations
align right
@@ -876,6 +964,14 @@
format "0.00"
}
column {
+ header "^CCS^" /* Compressed Class Space Space - Percent Used */
+ data (1-((sun.gc.compressedclassspace.capacity - sun.gc.compressedclassspace.used)/sun.gc.compressedclassspace.capacity)) * 100
+ align right
+ width 6
+ scale raw
+ format "0.00"
+ }
+ column {
header "^YGC^" /* Young Generation Collections */
data sun.gc.collector.0.invocations
align right
--- a/jdk/src/share/demo/applets/MoleculeViewer/XYZApp.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/XYZApp.java Thu Oct 03 19:18:54 2013 +0100
@@ -348,7 +348,7 @@
InputStream is = null;
try {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
- is = new URL(getDocumentBase(), mdname).openStream();
+ is = getClass().getResourceAsStream(mdname);
XYZChemModel m = new XYZChemModel(is);
Atom.setApplet(this);
md = m;
--- a/jdk/src/share/demo/applets/MoleculeViewer/example1.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example1.html Thu Oct 03 19:18:54 2013 +0100
@@ -2,10 +2,10 @@
<head>
<title>MoleculeViewer (example 1)</title>
</head>
- <body>
+ <body>
<h1>MoleculeViewer (example 1)</h1>
<hr>
- <applet code=XYZApp.class width=300 height=300>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=300 height=300>
<param name=model value="models/HyaluronicAcid.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
@@ -13,7 +13,7 @@
<hr>
<a href="XYZApp.java">The source</a>.
</body>
-</html>
+</html>
--- a/jdk/src/share/demo/applets/MoleculeViewer/example2.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example2.html Thu Oct 03 19:18:54 2013 +0100
@@ -2,10 +2,10 @@
<head>
<title>MoleculeViewer (example 2)</title>
</head>
- <body>
+ <body>
<h1>MoleculeViewer (example 2)</h1>
<hr>
- <applet code=XYZApp.class width=300 height=300>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=300 height=300>
<param name=model value="models/buckminsterfullerine.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
@@ -13,4 +13,4 @@
<hr>
<a href="XYZApp.java">The source</a>.
</body>
-</html>
+</html>
--- a/jdk/src/share/demo/applets/MoleculeViewer/example3.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example3.html Thu Oct 03 19:18:54 2013 +0100
@@ -5,25 +5,25 @@
<body>
<h1>MoleculeViewer (example 3)</h1>
<hr>
- <applet code=XYZApp.class width=100 height=100>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=100 height=100>
<param name=model value="models/water.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
</applet>
<p>
- <applet code=XYZApp.class width=100 height=100>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=100 height=100>
<param name=model value="models/benzene.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
</applet>
<p>
- <applet code=XYZApp.class width=100 height=100>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=100 height=100>
<param name=model value="models/ethane.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
</applet>
<p>
- <applet code=XYZApp.class width=100 height=100>
+ <applet code=XYZApp.class archive=MoleculeViewer.jar width=100 height=100>
<param name=model value="models/cyclohexane.xyz">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
@@ -31,5 +31,5 @@
<hr>
<a href="XYZApp.java">The source</a>.
</body>
-</html>
+</html>
--- a/jdk/src/share/demo/applets/WireFrame/ThreeD.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/ThreeD.java Thu Oct 03 19:18:54 2013 +0100
@@ -416,7 +416,7 @@
InputStream is = null;
try {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
- is = new URL(getDocumentBase(), mdname).openStream();
+ is = getClass().getResourceAsStream(mdname);
Model3D m = new Model3D(is);
md = m;
m.findBB();
--- a/jdk/src/share/demo/applets/WireFrame/example1.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example1.html Thu Oct 03 19:18:54 2013 +0100
@@ -5,7 +5,7 @@
<body>
<h1>3D Model: Cube</h1>
<hr>
- <applet code=ThreeD.class width=100 height=100>
+ <applet code=ThreeD.class archive=WireFrame.jar width=100 height=100>
<param name=model value="models/cube.obj">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
--- a/jdk/src/share/demo/applets/WireFrame/example2.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example2.html Thu Oct 03 19:18:54 2013 +0100
@@ -5,7 +5,7 @@
<body>
<h1>3D Model: Dinosaur</h1>
<hr>
- <applet code=ThreeD.class width=300 height=300>
+ <applet code=ThreeD.class archive=WireFrame.jar width=300 height=300>
<param name=model value="models/dinasaur.obj">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
--- a/jdk/src/share/demo/applets/WireFrame/example3.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example3.html Thu Oct 03 19:18:54 2013 +0100
@@ -5,7 +5,7 @@
<body>
<h1>3D Model: Hughes</h1>
<hr>
- <applet code=ThreeD.class width=300 height=300>
+ <applet code=ThreeD.class archive=WireFrame.jar width=300 height=300>
<param name=model value="models/hughes_500.obj">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
--- a/jdk/src/share/demo/applets/WireFrame/example4.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example4.html Thu Oct 03 19:18:54 2013 +0100
@@ -5,7 +5,7 @@
<body>
<h1>3D Model: knoxS</h1>
<hr>
- <applet code=ThreeD.class width=300 height=300>
+ <applet code=ThreeD.class archive=WireFrame.jar width=300 height=300>
<param name=model value="models/knoxS.obj">
alt="Your browser understands the <APPLET> tag but isn't running the applet, for some reason."
Your browser is completely ignoring the <APPLET> tag!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/lib/security/BlacklistedCertsConverter.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+
+/**
+ * This is the tool to convert blacklisted.certs.pem to blacklisted.certs.
+ * Every time a new blacklisted certs is added, please append the PEM format
+ * to the end of blacklisted.certs.pem (with proper comments) and then use
+ * this tool to generate an updated blacklisted.certs. Make sure to include
+ * changes to both in a changeset.
+ */
+public class BlacklistedCertsConverter {
+ public static void main(String[] args) throws Exception {
+ if (args.length == 0) {
+ System.out.println("Usage: java BlacklistedCertsConverter SHA-256" +
+ " < blacklisted.certs.pem > blacklisted.certs");
+ System.exit(1);
+ }
+ String mdAlg = args[0];
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ Collection<? extends Certificate> certs
+ = cf.generateCertificates(System.in);
+ System.out.println("Algorithm=" + mdAlg);
+ for (Certificate cert: certs) {
+ System.out.println(
+ getCertificateFingerPrint(mdAlg, (X509Certificate)cert));
+ }
+ }
+
+ /**
+ * Converts a byte to hex digit and writes to the supplied buffer
+ */
+ private static void byte2hex(byte b, StringBuffer buf) {
+ char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+ int high = ((b & 0xf0) >> 4);
+ int low = (b & 0x0f);
+ buf.append(hexChars[high]);
+ buf.append(hexChars[low]);
+ }
+
+ /**
+ * Gets the requested finger print of the certificate.
+ */
+ private static String getCertificateFingerPrint(String mdAlg,
+ X509Certificate cert) {
+ String fingerPrint = "";
+ try {
+ byte[] encCertInfo = cert.getEncoded();
+ MessageDigest md = MessageDigest.getInstance(mdAlg);
+ byte[] digest = md.digest(encCertInfo);
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < digest.length; i++) {
+ byte2hex(digest[i], buf);
+ }
+ fingerPrint = buf.toString();
+ } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
+ // ignored
+ }
+ return fingerPrint;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/lib/security/blacklisted.certs Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,19 @@
+Algorithm=SHA-256
+76A45A496031E4DD2D7ED23E8F6FF97DBDEA980BAAC8B0BA94D7EDB551348645
+4CBBF8256BC9888A8007B2F386940A2E394378B0D903CBB3863C5A6394B889CE
+D24566BF315F4E597D6E381C87119FB4198F5E9E2607F5F4AB362EF7E2E7672F
+14E6D2764A4B06701C6CBC376A253775F79C782FBCB6C0EE6F99DE4BA1024ADD
+D3A936E1A7775A45217C8296A1F22AC5631DCDEC45594099E78EEEBBEDCBA967
+5E83124D68D24E8E177E306DF643D5EA99C5A94D6FC34B072F7544A1CABB7C7B
+9ED8F9B0E8E42A1656B8E1DD18F42BA42DC06FE52686173BA2FC70E756F207DC
+FDEDB5BDFCB67411513A61AEE5CB5B5D7C52AF06028EFC996CC1B05B1D6CEA2B
+A686FEE577C88AB664D0787ECDFFF035F4806F3DE418DC9E4D516324FFF02083
+4FEE0163686ECBD65DB968E7494F55D84B25486D438E9DE558D629D28CD4D176
+8A1BD21661C60015065212CC98B1ABB50DFD14C872A208E66BAE890F25C448AF
+B8686723E415534BC0DBD16326F9486F85B0B0799BF6639334E61DAAE67F36CD
+3946901F46B0071E90D78279E82FABABCA177231A704BE72C5B0E8918566EA66
+31C8FD37DB9B56E708B03D1F01848B068C6DA66F36FB5D82C008C6040FA3E133
+450F1B421BB05C8609854884559C323319619E8B06B001EA2DCBB74A23AA3BE2
+FC02FD48DB92D4DCE6F11679D38354CF750CFC7F584A520EB90BDE80E241F2BD
+DF21016B00FC54F9FE3BC8B039911BB216E9162FAD2FD14D990AB96E951B49BE
+F5B6F88F75D391A4B1EB336F9E201239FB6B1377DB8CFA7B84736216E5AFFFD7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/lib/security/blacklisted.certs.pem Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,721 @@
+// Subject: CN=Digisign Server ID (Enrich),
+// OU=457608-K,
+// O=Digicert Sdn. Bhd.,
+// C=MY
+// Issuer: CN=GTE CyberTrust Global Root,
+// OU=GTE CyberTrust Solutions, Inc.,
+// O=GTE Corporation,
+// C=US
+// Serial: 120001705 (07:27:14:a9)
+-----BEGIN CERTIFICATE-----
+MIIDyzCCAzSgAwIBAgIEBycUqTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA3MDcxNzE1MTc0OFoXDTEyMDcxNzE1MTY1NFowYzELMAkG
+A1UEBhMCTVkxGzAZBgNVBAoTEkRpZ2ljZXJ0IFNkbi4gQmhkLjERMA8GA1UECxMI
+NDU3NjA4LUsxJDAiBgNVBAMTG0RpZ2lzaWduIFNlcnZlciBJRCAoRW5yaWNoKTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEArahkS02Hx4RZufuQRqCmicDx/tXa
+VII3DZkrRSYK6Fawf8qo9I5HhAGCKeOzarWR8/uVhbxyqGToCkCcxfRxrnt7agfq
+kBRPjYmvlKuyBtQCanuYH1m5Os1U+iDfsioK6bjdaZDAKdNO0JftZszFGUkGf/pe
+LHx7hRsyQt97lSUCAwEAAaOCAXgwggF0MBIGA1UdEwEB/wQIMAYBAf8CAQAwXAYD
+VR0gBFUwUzBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcCARYtaHR0cDovL2N5YmVy
+dHJ1c3Qub21uaXJvb3QuY29tL3JlcG9zaXRvcnkuY2ZtMAcGBWCDSgEBMA4GA1Ud
+DwEB/wQEAwIB5jCBiQYDVR0jBIGBMH+heaR3MHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0
+LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFMYWk04WF+wW
+royUdvOGbcV0boR3MA0GCSqGSIb3DQEBBQUAA4GBAHYAe6Z4K2Ydjl42xqSOBfIj
+knyTZ9P0wAp9iy3Z6tVvGvPhSilaIoRNUC9LDPL/hcJ7VdREgr5trGeOvLQfkpxR
+gBoU9m6rYYgLrRx/90tQUdZlG6ZHcRVesHHzNRTyN71jyNXwk1o0X9g96F33xR7A
+5c8fhiSpPAdmzcHSNmNZ
+-----END CERTIFICATE-----
+
+// Subject: CN=Digisign Server ID - (Enrich),
+// OU=457608-K,
+// O=Digicert Sdn. Bhd.,
+// C=MY
+// Issuer: CN=Entrust.net Certification Authority (2048)
+// OU=(c) 1999 Entrust.net Limited,
+// OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.),
+// O=Entrust.net
+// Serial: 1184644297 (4c:0e:63:6a)
+-----BEGIN CERTIFICATE-----
+MIIEzjCCA7agAwIBAgIETA5jajANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw0xMDA3MTYxNzIzMzdaFw0xNTA3
+MTYxNzUzMzdaMGUxCzAJBgNVBAYTAk1ZMRswGQYDVQQKExJEaWdpY2VydCBTZG4u
+IEJoZC4xETAPBgNVBAsTCDQ1NzYwOC1LMSYwJAYDVQQDEx1EaWdpc2lnbiBTZXJ2
+ZXIgSUQgLSAoRW5yaWNoKTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AMWJ5PQNBkCSWccaszXRDkwqM/n4r8qef+65p21g9FTob9Wb8xtjMQRoctE0Foy0
+FyyX3nPF2JAVoBor9cuzSIZE8B2ITM5BQhrv9Qze/kDaOSD3BlU6ap1GwdJvpbLI
+Vz4po5zg6YV3ZuiYpyR+vsBZIOVEb7ZX2L7OwmV3WMZhQdF0BMh/SULFcqlyFu6M
+3RJdtErU0a9Qt9iqdXZorT5dqjBtYairEFs+E78z4K9EnTgiW+9ML6ZxJhUmyiiM
+2fqOjqmiFDXimySItPR/hZ2DTwehthSQNsQ0HI0mYW0Tb3i+6I8nx0uElqOGaAwj
+vgvsjJQAqQSKE5D334VsDLECAwEAAaOCATQwggEwMA4GA1UdDwEB/wQEAwIBBjAS
+BgNVHRMBAf8ECDAGAQH/AgEAMCcGA1UdJQQgMB4GCCsGAQUFBwMBBggrBgEFBQcD
+AgYIKwYBBQUHAwQwMwYIKwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8v
+b2NzcC5lbnRydXN0Lm5ldDBEBgNVHSAEPTA7MDkGBWCDSgEBMDAwLgYIKwYBBQUH
+AgEWImh0dHA6Ly93d3cuZGlnaWNlcnQuY29tLm15L2Nwcy5odG0wMgYDVR0fBCsw
+KTAnoCWgI4YhaHR0cDovL2NybC5lbnRydXN0Lm5ldC8yMDQ4Y2EuY3JsMBEGA1Ud
+DgQKBAhMTswlKAMpgTAfBgNVHSMEGDAWgBRV5IHREYC+2Im5CKMx+aEkCRa5cDAN
+BgkqhkiG9w0BAQUFAAOCAQEAl0zvSjpJrHL8MCBrtClbp8WVBJD5MtXChWreA6E3
++YkAsFqsVX7bQzX/yQH4Ub7MJsrIaqTEVD4mHucMo82XZ5TdpkLrXM2POXlrM3kh
+Bnn6gkQVmczBtznTRmJ8snDrb84gqj4Zt+l0gpy0pUtNYQA35IfS8hQ6ZHy4qXth
+4JMi59WfPkfmNnagU9gAAzoPtTP+lsrT0oI6Lt3XSOHkp2nMHOmZSufKcEXXCwcO
+mnUb0C+Sb/akB8O9HEumhLZ9qJqp0qcp8QtXaR6XVybsK0Os1EWDBQDp4/BGQAf6
+6rFRc5Mcpd1TETfIKqcVJx20qsx/qjEw/LhFn0gJ7RDixQ==
+-----END CERTIFICATE-----
+
+// Subject: CN=Java Media APIs,
+// OU=Java Signed Extensions,
+// OU=Corporate Object Signing,
+// O=Sun Microsystems Inc
+// Issuer: CN=Object Signing CA,
+// OU=Class 2 OnSite Subscriber CA,
+// OU=VeriSign Trust Network,
+// O=Sun Microsystems Inc
+// Serial: 6a:8b:99:91:37:59:4f:89:53:e2:97:18:9f:19:1e:4e
+-----BEGIN CERTIFICATE-----
+MIIFdzCCBF+gAwIBAgIQaouZkTdZT4lT4pcYnxkeTjANBgkqhkiG9w0BAQUFADCB
+gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj
+cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA5MDUxMjAw
+MDAwMFoXDTEyMDUxMTIzNTk1OVowfTEdMBsGA1UEChQUU3VuIE1pY3Jvc3lzdGVt
+cyBJbmMxITAfBgNVBAsUGENvcnBvcmF0ZSBPYmplY3QgU2lnbmluZzEfMB0GA1UE
+CxQWSmF2YSBTaWduZWQgRXh0ZW5zaW9uczEYMBYGA1UEAxQPSmF2YSBNZWRpYSBB
+UElzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl5blzoKTVE8y4Hpz
+q6E15RZz1bF5HnYEyYqgHkZXnAKedmYCoMzm1XK8s+gQWShLEvGEAvs5yqarx9gE
+nnC21N28aEZgIJMa2/arKxCUkS4pxdGPYGexL9UzSRkUpoBShCZKEGdmX7gfJE2K
+/sd9MFvGV5/yZtWXrADzvm0Kd/9mg1KRv1gfrZIq0TJbupoXPYYqb73AkI9eT2ZD
+q9MdwD4E5+oojsDFXt8GU/D00fUhtXpYwuplU7D667WHYdJhIah0ST6JywyqcLXG
+XSuFTXOgITT2idSHluZVmx3dqJ72u9kPkO4JdJTMDfaK8zgNLaRkiU8Qcj+qhLYH
+ytaqcwIDAQABo4IB6jCCAeYwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwfwYD
+VR0fBHgwdjB0oHKgcIZuaHR0cDovL29uc2l0ZWNybC52ZXJpc2lnbi5jb20vU3Vu
+TWljcm9zeXN0ZW1zSW5jQ29ycG9yYXRlT2JqZWN0U2lnbmluZ0phdmFTaWduZWRF
+eHRlbnNpb25zQ2xhc3NCL0xhdGVzdENSTC5jcmwwHwYDVR0jBBgwFoAUs0crgn5T
+tHPKuLsZt76BTQeVx+0wHQYDVR0OBBYEFKS32mVx0gNWTeS4ProHEaeSpvvIMDsG
+CCsGAQUFBwEBBC8wLTArBggrBgEFBQcwAYYfaHR0cDovL29uc2l0ZS1vY3NwLnZl
+cmlzaWduLmNvbTCBtQYDVR0gBIGtMIGqMDkGC2CGSAGG+EUBBxcCMCowKAYIKwYB
+BQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwbQYLYIZIAYb3AIN9
+nD8wXjAnBggrBgEFBQcCARYbaHR0cHM6Ly93d3cuc3VuLmNvbS9wa2kvY3BzMDMG
+CCsGAQUFBwICMCcaJVZhbGlkYXRlZCBGb3IgU3VuIEJ1c2luZXNzIE9wZXJhdGlv
+bnMwEwYDVR0lBAwwCgYIKwYBBQUHAwMwDQYJKoZIhvcNAQEFBQADggEBAAe6BO4W
+3TSNWfezyelJs6kE3HfulT6Bdyz4UUoh9ykXcV8nRwT+kh25I5MdyG2GfkJoADPR
+VhC5DYo13UFpIsTNVjq+hGYe2hML93bN7ad9SxCCyjHUo3yMz2qgBbHZI3VA9ZHA
+aWM4Tx0saMwbcnVvlbuGh+PXvStfypJqYT6lzcdFfjNVX4FI/QQNGhBswMY51tC8
+GTBCL2qhJon0gSCU4zaawDOf7+XxJWirLamYL1Aal1/h2z2sFrvA/1ftxtU3kZ6I
+7De8DyoHeZg7pYGdrj7g+lPhCga/WvEhN152I+aP08YbFcJHYmK05ngl/Ye4c6Bd
+cdrdfbw6QzEUIYY=
+-----END CERTIFICATE-----
+
+// Subject: CN=JavaFX 1.0 Runtime,
+// OU=Java Signed Extensions,
+// OU=Corporate Object Signing,
+// O=Sun Microsystems Inc
+// Issuer: CN=Object Signing CA,
+// OU=Class 2 OnSite Subscriber CA,
+// OU=VeriSign Trust Network,
+// O=Sun Microsystems Inc
+// Serial: 55:c0:e6:44:59:59:79:9e:d9:26:f1:b0:4a:1e:f0:27
+-----BEGIN CERTIFICATE-----
+MIIFezCCBGOgAwIBAgIQVcDmRFlZeZ7ZJvGwSh7wJzANBgkqhkiG9w0BAQUFADCB
+gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj
+cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA4MTAwOTAw
+MDAwMFoXDTExMTAwOTIzNTk1OVowgYAxHTAbBgNVBAoUFFN1biBNaWNyb3N5c3Rl
+bXMgSW5jMSEwHwYDVQQLFBhDb3Jwb3JhdGUgT2JqZWN0IFNpZ25pbmcxHzAdBgNV
+BAsUFkphdmEgU2lnbmVkIEV4dGVuc2lvbnMxGzAZBgNVBAMUEkphdmFGWCAxLjAg
+UnVudGltZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM+WDc6+bu+4
+tmAcS/lBtUc02WOt9QZpVsXg9cG2pu/8bUtmDELa8iiYBVFpIs8DU58HLrGQtCUY
+SIAGOVPsOJoN29UKCDWfY9j5JeVhfhMGqk9DwrWhzgsjy4cpZ1pIp+k/fJ8zT8Ul
+aYLpow1vg3UNddsmwz02tN7cOrMw9WYIG4CRYnY1OrtJSfe2pYzheC4zyvR+aiVl
+nang2OtqikSQsNFOFHsLOJFxngy9LrO8evDSu25VTKI6zlWU6/bMeqtztJPN0VOn
+NyUrJZvkxZ207Jg0T693BGSxNC1n+ihztXogql8950M/pEuUbDjylv5FFvlp6DSB
+dDT2MkutmyMCAwEAAaOCAeowggHmMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeA
+MH8GA1UdHwR4MHYwdKByoHCGbmh0dHA6Ly9vbnNpdGVjcmwudmVyaXNpZ24uY29t
+L1N1bk1pY3Jvc3lzdGVtc0luY0NvcnBvcmF0ZU9iamVjdFNpZ25pbmdKYXZhU2ln
+bmVkRXh0ZW5zaW9uc0NsYXNzQi9MYXRlc3RDUkwuY3JsMB8GA1UdIwQYMBaAFLNH
+K4J+U7Rzyri7Gbe+gU0HlcftMB0GA1UdDgQWBBTjgufVi3XJ3gx1ewsA6Rr7BR4Z
+zjA7BggrBgEFBQcBAQQvMC0wKwYIKwYBBQUHMAGGH2h0dHA6Ly9vbnNpdGUtb2Nz
+cC52ZXJpc2lnbi5jb20wgbUGA1UdIASBrTCBqjA5BgtghkgBhvhFAQcXAjAqMCgG
+CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMG0GC2CGSAGG
+9wCDfZw/MF4wJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3LnN1bi5jb20vcGtpL2Nw
+czAzBggrBgEFBQcCAjAnGiVWYWxpZGF0ZWQgRm9yIFN1biBCdXNpbmVzcyBPcGVy
+YXRpb25zMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3DQEBBQUAA4IBAQAB
+YVJTTVe7rzyTO4jc3zajErOT/COkdQTfNo0eIX1QbNynFieJvwY/jRzUZwjktIFR
+2p4JtbpHGAtKtjOAOTieQ8xdDOoC1djzpE7/AbMvuvlTavtUKT+F7tPdhfXgWXJV
+6Wbt8jryKyk3zZGiEhauIwZUkfjRkEtffEmZWLUd8c8rURJjfC/XHH2oyurscoxc
+CjX29c9ynxSiS/VvQp1an0HvErGh69N48wj7cj8mtZ1yHzd2XCzSSR1OfTPfk0Pt
+yg51p7yJaFiH21PTZegEL6zyVNOYBTKwwIi2OzpwYalD3uvK6e3OKDrfFCOxu17u
+4PveESbrdyrmvLe7IVez
+-----END CERTIFICATE-----
+
+// Subject: CN=JavaFX Runtime,
+// OU=Java Signed Extensions,
+// OU=Corporate Object Signing,
+// O=Sun Microsystems Inc
+// Issuer: CN=Object Signing CA,
+// OU=Class 2 OnSite Subscriber CA,
+// OU=VeriSign Trust Network,
+// O=Sun Microsystems Inc
+// Serial: 47:f4:55:f1:da:4a:5e:f9:e3:f7:a8:03:62:17:c0:ff
+-----BEGIN CERTIFICATE-----
+MIIFdjCCBF6gAwIBAgIQR/RV8dpKXvnj96gDYhfA/zANBgkqhkiG9w0BAQUFADCB
+gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj
+cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA5MDEyOTAw
+MDAwMFoXDTEyMDEyOTIzNTk1OVowfDEdMBsGA1UEChQUU3VuIE1pY3Jvc3lzdGVt
+cyBJbmMxITAfBgNVBAsUGENvcnBvcmF0ZSBPYmplY3QgU2lnbmluZzEfMB0GA1UE
+CxQWSmF2YSBTaWduZWQgRXh0ZW5zaW9uczEXMBUGA1UEAxQOSmF2YUZYIFJ1bnRp
+bWUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCIzd0fAk8mI9ONc6RJ
+aGieioK2FLdXEwj8zL3vdGDVmBwyR1zwYkaOIFFgF9IW/8qc4iAYA5sGUY+0g8q3
+5DuYAxfTzBB5KdaYvbuq6GGnoHIWmTirXY+1friFp8lyXSvtuEaGB1VHaBoZchEg
+k+UgeVDA43dHwcT1Ov3DePczJRUes8T/QHzLX+BxUDG43vjyncCEO/AjqLZxXEz2
+xrNbKLcH3lGMJK7hdbfssUfF5BjC38Hn71HauYlA43b2no+2y0Sjulwzez2YPbDC
+0GLR3TnKtA8dqOrnl5t3DniDbfOBNtBE3VOydJO0XW57Ng1HRXD023nm9ECPY2xp
+0N/pAgMBAAGjggHqMIIB5jAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDB/BgNV
+HR8EeDB2MHSgcqBwhm5odHRwOi8vb25zaXRlY3JsLnZlcmlzaWduLmNvbS9TdW5N
+aWNyb3N5c3RlbXNJbmNDb3Jwb3JhdGVPYmplY3RTaWduaW5nSmF2YVNpZ25lZEV4
+dGVuc2lvbnNDbGFzc0IvTGF0ZXN0Q1JMLmNybDAfBgNVHSMEGDAWgBSzRyuCflO0
+c8q4uxm3voFNB5XH7TAdBgNVHQ4EFgQUvOdd0cKPj+Yik/iOBwTdphh5A+gwOwYI
+KwYBBQUHAQEELzAtMCsGCCsGAQUFBzABhh9odHRwOi8vb25zaXRlLW9jc3AudmVy
+aXNpZ24uY29tMIG1BgNVHSAEga0wgaowOQYLYIZIAYb4RQEHFwIwKjAoBggrBgEF
+BQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYTBtBgtghkgBhvcAg32c
+PzBeMCcGCCsGAQUFBwIBFhtodHRwczovL3d3dy5zdW4uY29tL3BraS9jcHMwMwYI
+KwYBBQUHAgIwJxolVmFsaWRhdGVkIEZvciBTdW4gQnVzaW5lc3MgT3BlcmF0aW9u
+czATBgNVHSUEDDAKBggrBgEFBQcDAzANBgkqhkiG9w0BAQUFAAOCAQEAbGcf2NjL
+AI93HG6ny2BbepaZA1a8xa/R6uUc7xV+Qw6MgLwFD4Q4i6LWUztQDvg9l68MM2/i
+Y9LEi1KM4lcNbK5+D+t9x98wXBiuojXhVdp5ZmC03EyEBbriopdBsmXVLDSu/Y3+
+zowOO5xwpMK3dbgsSDs2Vt0UosD3FTcRaD3GNfOhXMp+o1grHNiXF9YgkmdQbPPZ
+DQ2KBhFPCRJXBGvyKOqno/DTg0sQ3crGH/C4/4t7mnQXWldZotmJUZ0ONc9oD+Q1
+JAaguUKqIwn9yZ093ie+JWHbYNid9IIIPXYgtRxmf9a376WBhqhu56uJftBJ7x9g
+eQ7Lot6CSWCiFw==
+-----END CERTIFICATE-----
+
+// Subject: CN=Solaris INTERNAL DEVELOPMENT USE ONLY,
+// OU=Solaris Cryptographic Framework,
+// OU=Corporate Object Signing,
+// O=Sun Microsystems Inc
+// Issuer: CN=Object Signing CA,
+// OU=Class 2 OnSite Subscriber CA,
+// OU=VeriSign Trust Network,
+// O=Sun Microsystems Inc
+// Serial: 77:29:77:52:6a:19:7b:9a:a6:a2:c7:99:a0:e1:cd:8c
+-----BEGIN CERTIFICATE-----
+MIIFHjCCBAagAwIBAgIQdyl3UmoZe5qmoseZoOHNjDANBgkqhkiG9w0BAQUFADCB
+gzEdMBsGA1UEChMUU3VuIE1pY3Jvc3lzdGVtcyBJbmMxHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxJTAjBgNVBAsTHENsYXNzIDIgT25TaXRlIFN1YnNj
+cmliZXIgQ0ExGjAYBgNVBAMTEU9iamVjdCBTaWduaW5nIENBMB4XDTA3MDEwNDAw
+MDAwMFoXDTEwMDEwMzIzNTk1OVowgZwxHTAbBgNVBAoUFFN1biBNaWNyb3N5c3Rl
+bXMgSW5jMSEwHwYDVQQLFBhDb3Jwb3JhdGUgT2JqZWN0IFNpZ25pbmcxKDAmBgNV
+BAsUH1NvbGFyaXMgQ3J5cHRvZ3JhcGhpYyBGcmFtZXdvcmsxLjAsBgNVBAMUJVNv
+bGFyaXMgSU5URVJOQUwgREVWRUxPUE1FTlQgVVNFIE9OTFkwgZ8wDQYJKoZIhvcN
+AQEBBQADgY0AMIGJAoGBALbNU4hf3mD5ArDI9pjgioAyvV3bjMPRQdCZniIeGJBp
+odFlSEH+Mh64W1DsY8coeZ7FvvGJkx9IpTMJW9k8w1oJK9UNqHyAQfaYjQyXi3xQ
+LJp62EvYdGfDlwOZejEcR/MbzZG+GOPMMvQj5+xyFDvLXNGfQNTnxw2qnBgCJXjj
+AgMBAAGjggH1MIIB8TAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDCBiQYDVR0f
+BIGBMH8wfaB7oHmGd2h0dHA6Ly9vbnNpdGVjcmwudmVyaXNpZ24uY29tL1N1bk1p
+Y3Jvc3lzdGVtc0luY0NvcnBvcmF0ZU9iamVjdFNpZ25pbmdTb2xhcmlzQ3J5cHRv
+Z3JhcGhpY0ZyYW1ld29ya0NsYXNzQi9MYXRlc3RDUkwuY3JsMB8GA1UdIwQYMBaA
+FLNHK4J+U7Rzyri7Gbe+gU0HlcftMB0GA1UdDgQWBBRpfiGYkehTnsIzuN2H6AFb
+VCZG8jA7BggrBgEFBQcBAQQvMC0wKwYIKwYBBQUHMAGGH2h0dHA6Ly9vbnNpdGUt
+b2NzcC52ZXJpc2lnbi5jb20wgbUGA1UdIASBrTCBqjA5BgtghkgBhvhFAQcXAjAq
+MCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMG0GC2CG
+SAGG9wCDfZw/MF4wJwYIKwYBBQUHAgEWG2h0dHBzOi8vd3d3LnN1bi5jb20vcGtp
+L2NwczAzBggrBgEFBQcCAjAnFiVWYWxpZGF0ZWQgRm9yIFN1biBCdXNpbmVzcyBP
+cGVyYXRpb25zMBMGA1UdJQQMMAoGCCsGAQUFBwMDMA0GCSqGSIb3DQEBBQUAA4IB
+AQCG5soy3LFHTFbA8/5SzDRhQoJkHUnOP0t3b6nvX6vZYRp649fje7TQOPRm1pFd
+CZ17J+tggdZwgzTqY4aYpJ00jZaK6pV37q/vgFC/ia6jDs8Q+ly9cEcadBZ5loYg
+cmxp9p57W2MNWx8VA8oFdNtKfF0jUNXbLNtvwGHmgR6YcwLrGN1b6/9Lt9bO3ODl
+FO+ZDwkfQz5ClUVrTx2dGBvKRYFqSG5S8JAfsgYhPvcacUQkA7ExyKvfRXLWVrce
+ZiPpcElbx+819H2sAPvVvparVeAruZGMAtejHZp9NFoowKen5drJp9VxePS4eM49
+3DepB6lKRrNRw66LNQol4ZBz
+-----END CERTIFICATE-----
+
+// Subject: EMAILADDRESS=info@diginotar.nl, CN=DigiNotar Cyber CA,
+// O=DigiNotar, C=NL
+// Issuer: CN=GTE CyberTrust Global Root,
+// OU=GTE CyberTrust Solutions, Inc.,
+// O=GTE Corporation,
+// C=US
+// Serial: 120000525 (07:27:10:0D)
+-----BEGIN CERTIFICATE-----
+MIIFWjCCBMOgAwIBAgIEBycQDTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA2MTAwNDEwNTQxMVoXDTExMTAwNDEwNTMxMVowYDELMAkG
+A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy
+IEN5YmVyIENBMSAwHgYJKoZIhvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANLOFQotqF6EZ639vu9Gx8i5z3P8
+9DS5+SxD52ATPXrjss87Z2yQrcC5P4RS8DVC3HTcKDu9UrSnrHJFF8bwieu0qiXy
+XUte0dmHutZ9fPXOMp8QM8WxSrtekTHC0OlBwpFkfglBO9uLCDdqqspS3rU5HsCI
+A6U/i5kTYUO1m4Kz7iBvz6FEouova0CfjytXraFTwoUiaZ2gP1HfC0GRDaXhqKpc
+SQhdvd5wQbEPyWNr0380dAIvNFp4dRxoeoFnivPaQPBgY/SSINcDpj2jHmfEhBtB
+pcmM5r3qSLYFFgizNxJa92E89zhvLpfgb1Y4VNMota0Ubi5LZLUnZbd1JQm2Bz2V
+VgIKgmCyc0XgMyZRdJq51FAc9k1bW1JSE1qmf6cO4ehBVGeYjIfVydNsy9NUkgYJ
+NEH3gW8/nsl8dVWw58Gzd+jDxAA1lUBwEEoF3iW7n1mlZLxHYL9g43aLE1Xd4XR6
+uc8kpmp/3mQiRFhogmoQ+T3lPhu5vfwi9GAEibtVbShV+t6OjRshFNc3izR7Tfay
+shDPM7F9HGKZSMsrbHaWVb8ZDR0fu2WqG46ZtcYokOWCLXhQIJr9eS8kf/CJKWn0
+fc1zvrPtTsHR7VJej/e4142HrbLZG1ES/1az4a80fVykeIgQnp0DxqWqoiRR90kU
+xbHuWUOV36toKDA/AgMBAAGjggGGMIIBgjASBgNVHRMBAf8ECDAGAQH/AgEBMFMG
+A1UdIARMMEowSAYJKwYBBAGxPgEAMDswOQYIKwYBBQUHAgEWLWh0dHA6Ly93d3cu
+cHVibGljLXRydXN0LmNvbS9DUFMvT21uaVJvb3QuaHRtbDAOBgNVHQ8BAf8EBAMC
+AQYwgaAGA1UdIwSBmDCBlYAUpgwdn2H/Bxe1vzhG20Mw1Y6wUgaheaR3MHUxCzAJ
+BgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdU
+RSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVy
+VHJ1c3QgR2xvYmFsIFJvb3SCAgGlMEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93
+d3cucHVibGljLXRydXN0LmNvbS9jZ2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYD
+VR0OBBYEFKv5aN/PSjfXe0WMX3LeQETDZbvCMA0GCSqGSIb3DQEBBQUAA4GBAI9o
+a6VbB7pEZg4cqFwwezPkCiYE/O+eGjjWLqEf0JlHwnVkJP2eOyh2uSYoYZEMbSz4
+BJ98UAHV42mv7xXSRZskCSpmBU8lgcpdvqrBWSeuM46C9990sFWzjvjnN8huqlZE
+9r1TgSOWPbT6MopTZkQloiXGpjwljPDgKAYityZB
+-----END CERTIFICATE-----
+
+// Subject: CN=DigiNotar Cyber CA, O=DigiNotar, C=NL
+// Issuer: CN=GTE CyberTrust Global Root,
+// OU=GTE CyberTrust Solutions, Inc.,
+// O=GTE Corporation,
+// C=US
+// Serial: 120000505 (07:27:0F:F9)
+-----BEGIN CERTIFICATE-----
+MIIFODCCBKGgAwIBAgIEBycP+TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA2MDkyMDA5NDUzMloXDTEzMDkyMDA5NDQwNlowPjELMAkG
+A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy
+IEN5YmVyIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0s4VCi2o
+XoRnrf2+70bHyLnPc/z0NLn5LEPnYBM9euOyzztnbJCtwLk/hFLwNULcdNwoO71S
+tKesckUXxvCJ67SqJfJdS17R2Ye61n189c4ynxAzxbFKu16RMcLQ6UHCkWR+CUE7
+24sIN2qqylLetTkewIgDpT+LmRNhQ7WbgrPuIG/PoUSi6i9rQJ+PK1etoVPChSJp
+naA/Ud8LQZENpeGoqlxJCF293nBBsQ/JY2vTfzR0Ai80Wnh1HGh6gWeK89pA8GBj
+9JIg1wOmPaMeZ8SEG0GlyYzmvepItgUWCLM3Elr3YTz3OG8ul+BvVjhU0yi1rRRu
+LktktSdlt3UlCbYHPZVWAgqCYLJzReAzJlF0mrnUUBz2TVtbUlITWqZ/pw7h6EFU
+Z5iMh9XJ02zL01SSBgk0QfeBbz+eyXx1VbDnwbN36MPEADWVQHAQSgXeJbufWaVk
+vEdgv2DjdosTVd3hdHq5zySman/eZCJEWGiCahD5PeU+G7m9/CL0YASJu1VtKFX6
+3o6NGyEU1zeLNHtN9rKyEM8zsX0cYplIyytsdpZVvxkNHR+7Zaobjpm1xiiQ5YIt
+eFAgmv15LyR/8IkpafR9zXO+s+1OwdHtUl6P97jXjYetstkbURL/VrPhrzR9XKR4
+iBCenQPGpaqiJFH3SRTFse5ZQ5Xfq2goMD8CAwEAAaOCAYYwggGCMBIGA1UdEwEB
+/wQIMAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcC
+ARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5odG1s
+MA4GA1UdDwEB/wQEAwIBBjCBoAYDVR0jBIGYMIGVgBSmDB2fYf8HF7W/OEbbQzDV
+jrBSBqF5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlv
+bjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYD
+VQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUwRQYDVR0fBD4wPDA6
+oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL2NnaS1iaW4vQ1JMLzIw
+MTgvY2RwLmNybDAdBgNVHQ4EFgQUq/lo389KN9d7RYxfct5ARMNlu8IwDQYJKoZI
+hvcNAQEFBQADgYEACcpiD427SuDUejUrBi3RKGG2rAH7g0m8rtQvLYauGYOl1h0T
+4he+/jJ06XoUOMqUXvcpAWlxG5Ea/aO7qh3Ke+IW/aGjDvMMX7LhIDGUK16Sdu36
+6bUjpr8KOwOpb1JgVM1f6bcvfKIn/UGDdbYN+3gm87FF6TKVKho1IZXFonU=
+-----END CERTIFICATE-----
+
+// Subject: CN=DigiNotar Cyber CA, O=DigiNotar, C=NL
+// Issuer: CN=GTE CyberTrust Global Root,
+// OU=GTE CyberTrust Solutions, Inc.,
+// O=GTE Corporation,
+// C=US
+// Serial: 120000515 (07:27:10:03)
+-----BEGIN CERTIFICATE-----
+MIIFODCCBKGgAwIBAgIEBycQAzANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA2MDkyNzEwNTMzMloXDTExMDkyNzEwNTIzMFowPjELMAkG
+A1UEBhMCTkwxEjAQBgNVBAoTCURpZ2lOb3RhcjEbMBkGA1UEAxMSRGlnaU5vdGFy
+IEN5YmVyIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0s4VCi2o
+XoRnrf2+70bHyLnPc/z0NLn5LEPnYBM9euOyzztnbJCtwLk/hFLwNULcdNwoO71S
+tKesckUXxvCJ67SqJfJdS17R2Ye61n189c4ynxAzxbFKu16RMcLQ6UHCkWR+CUE7
+24sIN2qqylLetTkewIgDpT+LmRNhQ7WbgrPuIG/PoUSi6i9rQJ+PK1etoVPChSJp
+naA/Ud8LQZENpeGoqlxJCF293nBBsQ/JY2vTfzR0Ai80Wnh1HGh6gWeK89pA8GBj
+9JIg1wOmPaMeZ8SEG0GlyYzmvepItgUWCLM3Elr3YTz3OG8ul+BvVjhU0yi1rRRu
+LktktSdlt3UlCbYHPZVWAgqCYLJzReAzJlF0mrnUUBz2TVtbUlITWqZ/pw7h6EFU
+Z5iMh9XJ02zL01SSBgk0QfeBbz+eyXx1VbDnwbN36MPEADWVQHAQSgXeJbufWaVk
+vEdgv2DjdosTVd3hdHq5zySman/eZCJEWGiCahD5PeU+G7m9/CL0YASJu1VtKFX6
+3o6NGyEU1zeLNHtN9rKyEM8zsX0cYplIyytsdpZVvxkNHR+7Zaobjpm1xiiQ5YIt
+eFAgmv15LyR/8IkpafR9zXO+s+1OwdHtUl6P97jXjYetstkbURL/VrPhrzR9XKR4
+iBCenQPGpaqiJFH3SRTFse5ZQ5Xfq2goMD8CAwEAAaOCAYYwggGCMBIGA1UdEwEB
+/wQIMAYBAf8CAQEwUwYDVR0gBEwwSjBIBgkrBgEEAbE+AQAwOzA5BggrBgEFBQcC
+ARYtaHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL0NQUy9PbW5pUm9vdC5odG1s
+MA4GA1UdDwEB/wQEAwIBBjCBoAYDVR0jBIGYMIGVgBSmDB2fYf8HF7W/OEbbQzDV
+jrBSBqF5pHcwdTELMAkGA1UEBhMCVVMxGDAWBgNVBAoTD0dURSBDb3Jwb3JhdGlv
+bjEnMCUGA1UECxMeR1RFIEN5YmVyVHJ1c3QgU29sdXRpb25zLCBJbmMuMSMwIQYD
+VQQDExpHVEUgQ3liZXJUcnVzdCBHbG9iYWwgUm9vdIICAaUwRQYDVR0fBD4wPDA6
+oDigNoY0aHR0cDovL3d3dy5wdWJsaWMtdHJ1c3QuY29tL2NnaS1iaW4vQ1JMLzIw
+MTgvY2RwLmNybDAdBgNVHQ4EFgQUq/lo389KN9d7RYxfct5ARMNlu8IwDQYJKoZI
+hvcNAQEFBQADgYEAWcyGZhizJlRP1jjNupZey+yZG6oMDW4Z11boriMHbYPCndBE
+bVh07zmPbZsihOw9w/vm5KbVX5CgxUv4Rhzh/20Faixf3P3bpWg0qgzHVVusNVR/
+P50aKkpdK3hp+QLl56e+lWOddSAINIpmcuyDI1hyuzB+GJEASm9tNU/6rs8=
+-----END CERTIFICATE-----
+
+// Subject: EMAILADDRESS=info@diginotar.nl,
+// CN=DigiNotar Root CA,
+// O=DigiNotar, C=NL
+// Issuer: CN=Entrust.net Secure Server Certification Authority
+// OU=(c) 1999 Entrust.net Limited,
+// OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
+// O=Entrust.net,
+// C=US,
+// Serial: 1184644297 (46:9C:3C:C9)
+-----BEGIN CERTIFICATE-----
+MIIFSDCCBLGgAwIBAgIERpw8yTANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA0
+MjYwNTAwMDBaFw0xMzA4MTQyMDEyMzZaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK
+EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI
+hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt
+OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx
+hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7
+gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D
+IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T
+BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs
+Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8
+5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf
+DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX
+9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e
+7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj
+ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB
+BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF
+BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD
+VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy
+bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G
+A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob
+BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAI979rBep8tu3TeLunapgsZ0jtXp
+GDFjKWSk87dj1jCyYi+q/GyDyZ6ZQZNRP0sF+6twscq05lClWNy3TROMp7QeuoLO
+G7Utw3OJaswUtp4YglANMRTHEe3g9ltifUXRH5tSuy7u6yi4LD4WTm5ULP6r/g6l
+0CnjXYb0+b1Fmz6U
+-----END CERTIFICATE-----
+
+// Subject: EMAILADDRESS=info@diginotar.nl,
+// CN=DigiNotar Root CA,
+// O=DigiNotar, C=NL
+// Issuer: CN=Entrust.net Secure Server Certification Authority
+// OU=(c) 1999 Entrust.net Limited,
+// OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
+// O=Entrust.net,
+// C=US,
+// Serial: 1184640175 (46:9C:2C:AF)
+-----BEGIN CERTIFICATE-----
+MIIFSDCCBLGgAwIBAgIERpwsrzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3
+MjYxNTU3MzlaFw0xMzA4MjYxNjI3MzlaMF8xCzAJBgNVBAYTAk5MMRIwEAYDVQQK
+EwlEaWdpTm90YXIxGjAYBgNVBAMTEURpZ2lOb3RhciBSb290IENBMSAwHgYJKoZI
+hvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKywWMEAvdghCAsrmv5uVjAFnxt3kBBBXMMNhxF3joHxynzpjGrt
+OHQ1u9rf+bvACTe0lnOBfTMamDn3k2+Vfz25sXWHulFI6ItwPpUExdi2wxbZiLCx
+hx1w2oa0DxSLes8Q0XQ2ohJ7d4ZKeeZ73wIRaKVOhq40WJskE3hWIiUeAYtLUXH7
+gsxZlmmIWmhTxbkNAjfLS7xmSpB+KgsFB+0WX1WQddhGyRuD4gi+8SPMmR3WKg+D
+IBVYJ4Iu+uIiwkmxuQGBap1tnUB3aHZOISpthECFTnaZfILz87cCWdQmARuO361T
+BtGuGN3isjrL14g4jqxbKbkZ05j5GAPPSIKGZgsbaQ/J6ziIeiYaBUyS1yTUlvKs
+Ui2jR9VS9j/+zoQGcKaqPqLytlY0GFei5IFt58rwatPHkWsCg0F8Fe9rmmRe49A8
+5bHre12G+8vmd0nNo2Xc97mcuOQLX5PPzDAaMhzOHGOVpfnq4XSLnukrqTB7oBgf
+DhgL5Vup09FsHgdnj5FLqYq80maqkwGIspH6MVzVpsFSCAnNCmOi0yKm6KHZOQaX
+9W6NApCMFHs/gM0bnLrEWHIjr7ZWn8Z6QjMpBz+CyeYfBQ3NTCg2i9PIPhzGiO9e
+7olk6R3r2ol+MqZp0d3MiJ/R0MlmIdwGZ8WUepptYkx9zOBkgLKeR46jAgMBAAGj
+ggEmMIIBIjASBgNVHRMBAf8ECDAGAQH/AgEBMCcGA1UdJQQgMB4GCCsGAQUFBwMB
+BggrBgEFBQcDAgYIKwYBBQUHAwQwEQYDVR0gBAowCDAGBgRVHSAAMDMGCCsGAQUF
+BwEBBCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZW50cnVzdC5uZXQwMwYD
+VR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5lbnRydXN0Lm5ldC9zZXJ2ZXIxLmNy
+bDAdBgNVHQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wCwYDVR0PBAQDAgEGMB8G
+A1UdIwQYMBaAFPAXYhNVPbP/CgBr+1CEl/PtYtAaMBkGCSqGSIb2fQdBAAQMMAob
+BFY3LjEDAgCBMA0GCSqGSIb3DQEBBQUAA4GBAEa6RcDNcEIGUlkDJUY/pWTds4zh
+xbVkp3wSmpwPFhx5fxTyF4HD2L60jl3aqjTB7gPpsL2Pk5QZlNsi3t4UkCV70UOd
+ueJRN3o/LOtk4+bjXY2lC0qTHbN80VMLqPjmaf9ghSA9hwhskdtMgRsgfd90q5QP
+ZFdYf+hthc3m6IcJ
+-----END CERTIFICATE-----
+
+// Subject: CN=DigiNotar PKIoverheid CA Organisatie - G2,
+// O=DigiNotar B.V.,
+// C=NL
+// Issuer: CN=Staat der Nederlanden Organisatie CA - G2,
+// O=Staat der Nederlanden,
+// C=NL
+// Serial: 20001983 (01:31:34:bf)
+-----BEGIN CERTIFICATE-----
+MIIGnDCCBISgAwIBAgIEATE0vzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMTIwMAYDVQQDDClTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gT3JnYW5pc2F0aWUgQ0EgLSBHMjAeFw0xMDA1MTIw
+ODUxMzhaFw0yMDAzMjMwOTUwMDRaMFoxCzAJBgNVBAYTAk5MMRcwFQYDVQQKDA5E
+aWdpTm90YXIgQi5WLjEyMDAGA1UEAwwpRGlnaU5vdGFyIFBLSW92ZXJoZWlkIENB
+IE9yZ2FuaXNhdGllIC0gRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCxExkPJ+Zs1FWGS9DsiYpFkXisR71HK+T8RetPtCZzWzfTw3/2497Xo/gtaMUI
+PkuU1uSHJTZrhLUYdPMoWHMvm2rPvAQe9t7dr/xLqvXbZmIlASWC3vKXWhBu3V2p
+IrEEqSNzOvhxrR3PhETrR9Gvbch8KKvH8jd6dF9fxQIUiqNa4xtsAeNdjtlo1vQJ
+GzLckbUs9SDrjANtJkm4k8SFXdjSm69WaswFM8ygQp40VUSca6DUEtArVM23iQ3l
+9uvo+4UBM096a/GdcjOWDveyhKWlJ8Qn8VFzKXe6Z27+TNy04qGhgS85SY1DOBPO
+0KVcwoc6AGdlQiPxNlkKHaNRyLyjlCox3+M88p0aPASw77EKMBNzttfzo0wBdRSF
+eMDXijlYhVD6LubFvs+LP6+PNtQlCS3SD6xyk/K/i9RQs/kVUJuZ9RTZ+4uRozIm
+JqD43ztggYaDeVsr6xM9KTrBbd29no6H1kquNJcF7hSm9tw4fkrpJFQHPZdoN0Zr
+DceoIa8TVOQJavFNRgrJXfubT73e+7dUy7g4nKc5+2otwHuNq6WnV+xKkoozxeEg
+XHPYkJIrgNUPhhhpfDlPhIa890xb89W0yqDC8DciynlSH1PmqvOQsDvd8ij9rOvF
+BiSgydQvD1j9tZ7sD8+yWdCiBHo4aq5y+73wJWKUCacFCwIDAQABo4IBYTCCAV0w
+SAYDVR0gBEEwPzA9BgRVHSAAMDUwMwYIKwYBBQUHAgEWJ2h0dHA6Ly93d3cuZGln
+aW5vdGFyLm5sL2Nwcy9wa2lvdmVyaGVpZDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjCBhQYDVR0jBH4wfIAUORCLSZJc22ESIM1JnRqO2pxnQLmhXqRc
+MFoxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4x
+KzApBgNVBAMMIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzKCBACY
+lvQwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDovL2NybC5wa2lvdmVyaGVpZC5ubC9E
+b21PcmdhbmlzYXRpZUxhdGVzdENSTC1HMi5jcmwwHQYDVR0OBBYEFLxdlDvZq3sD
+JXNhwtst7vyrj2WhMA0GCSqGSIb3DQEBCwUAA4ICAQCP/C1Mt9kt1R+978v0t2gX
+dZ1O1ffdnPEqJu2forYcA9VTs+wIzzTi48P0tRYvyMO+19NzqwA2+RpKftZj6V5G
+uqW2jhW3oyrYQx3vXcgfgYWzi/f/PPTZ9EYIP5y8HaDZqEzNJVJOCrEg9x/pQ9lU
+RoETmsBedGwqmDLq/He7DaWiMZgifnx859qkrey3LhoZcfhIUNpDjyyE3cFAJ+O1
+8BVOltT4XOOGKUYr1zsH6zh/yIZXl9PvKjPEF1DVZGlrK2tFXl0vF8paTs/D1zk8
+9TufRrmb5w5Jl53W1eMbD+qPAU6aE5RZCgIHSEsaYKt/T+0L2FUNaG9VnGllFULs
+wNzdbKzDFs4LHVabpMTE0i7gD+JEJytQaaTcYuiKISlCbMwAOpZ2m+9AwKRed4Qy
+bCYqOWauXeO5ubIsaB8empADOfCqs6TMSYsYNOk3yXspx4R8b0QVL+xhWQTJRcui
+1lKifH8pktZKxYtCqNT+6tjHhyMY5J16fXNAUpigrm7jBT8FD+Clxm1N7YM3iJzH
+89xCmmq21yFJNnfy7xhPxXDZnunetyuL9Lx+KN8NQMmFXK6dxTH/0FwOtah+8Okv
+uq+IruW10Vilr5xxpykBkINpN4IFuvwJwQhujHg7wzMCgD9EhQgd31VWCK0shS1d
+sQPhrqp0xaTzTro3mHuCuQ==
+-----END CERTIFICATE-----
+
+// Subject: CN=DigiNotar PKIoverheid CA Overheid en Bedrijven,
+// O=DigiNotar B.V.,
+// C=NL
+// Issuer: CN=Staat der Nederlanden Overheid CA
+// O=Staat der Nederlanden,
+// C=NL
+// Serial: 20015536 (01:31:69:b0)
+-----BEGIN CERTIFICATE-----
+MIIEiDCCA3CgAwIBAgIEATFpsDANBgkqhkiG9w0BAQUFADBZMQswCQYDVQQGEwJO
+TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSowKAYDVQQDEyFTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gT3ZlcmhlaWQgQ0EwHhcNMDcwNzA1MDg0MjA3WhcN
+MTUwNzI3MDgzOTQ2WjBfMQswCQYDVQQGEwJOTDEXMBUGA1UEChMORGlnaU5vdGFy
+IEIuVi4xNzA1BgNVBAMTLkRpZ2lOb3RhciBQS0lvdmVyaGVpZCBDQSBPdmVyaGVp
+ZCBlbiBCZWRyaWp2ZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDc
+vdKnTmoKuzuiheF/AK2+tDBomAfNoHrElM9x+Yo35FPrV3bMi+Zs/u6HVcg+uwQ5
+AKeAeKxbT370vbhUuHE7BzFJOZNUfCA7eSuPu2GQfbGs5h+QLp1FAalkLU3DL7nn
+UNVOKlyrdnY3Rtd57EKZ96LspIlw3Dgrh6aqJOadkiQbvvb91C8ZF3rmMgeUVAVT
+Q+lsvK9Hy7zL/b07RBKB8WtLu+20z6slTxjSzAL8o0+1QjPLWc0J3NNQ/aB2jKx+
+ZopC9q0ckvO2+xRG603XLzDgbe5bNr5EdLcgBVeFTegAGaL2DOauocBC36esgl3H
+aLcY5olLmmv6znn58yynAgMBAAGjggFQMIIBTDBIBgNVHSAEQTA/MD0GBFUdIAAw
+NTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5kaWdpbm90YXIubmwvY3BzL3BraW92
+ZXJoZWlkMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMIGABgNVHSME
+eTB3gBQLhtYPd6NosftkCcOIblwEHFfpPaFZpFcwVTELMAkGA1UEBhMCTkwxHjAc
+BgNVBAoTFVN0YWF0IGRlciBOZWRlcmxhbmRlbjEmMCQGA1UEAxMdU3RhYXQgZGVy
+IE5lZGVybGFuZGVuIFJvb3QgQ0GCBACYmnkwPQYDVR0fBDYwNDAyoDCgLoYsaHR0
+cDovL2NybC5wa2lvdmVyaGVpZC5ubC9Eb21PdkxhdGVzdENSTC5jcmwwHQYDVR0O
+BBYEFEwIyY128ZjHPt881y91DbF2eZfMMA0GCSqGSIb3DQEBBQUAA4IBAQAMlIca
+v03jheLu19hjeQ5Q38aEW9K72fUxCho1l3TfFPoqDz7toOMI9tVOW6+mriXiRWsi
+D7dUKH6S3o0UbNEc5W50BJy37zRERd/Jgx0ZH8Apad+J1T/CsFNt5U4X5HNhIxMm
+cUP9TFnLw98iqiEr2b+VERqKpOKrp11Lbyn1UtHk0hWxi/7wA8+nfemZhzizDXMU
+5HIs4c71rQZIZPrTKbmi2Lv01QulQERDjqC/zlqlUkxk0xcxYczopIro5Ij76eUv
+BjMzm5RmZrGrUDqhCYF0U1onuabSJc/Tw6f/ltAv6uAejVLpGBwgCkegllYOQJBR
+RKwa/fHuhR/3Qlpl
+-----END CERTIFICATE-----
+
+// Subject: CN=DigiNotar PKIoverheid CA Overheid
+// O=DigiNotar B.V.,
+// C=NL
+// Issuer: CN=Staat der Nederlanden Overheid CA
+// O=Staat der Nederlanden,
+// C=NL
+// Serial: 20006006 (01:31:44:76)
+-----BEGIN CERTIFICATE-----
+MIIEezCCA2OgAwIBAgIEATFEdjANBgkqhkiG9w0BAQUFADBZMQswCQYDVQQGEwJO
+TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSowKAYDVQQDEyFTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gT3ZlcmhlaWQgQ0EwHhcNMDQwNjI0MDgxOTMyWhcN
+MTAwNjIzMDgxNzM2WjBSMQswCQYDVQQGEwJOTDEXMBUGA1UEChMORGlnaU5vdGFy
+IEIuVi4xKjAoBgNVBAMTIURpZ2lOb3RhciBQS0lvdmVyaGVpZCBDQSBPdmVyaGVp
+ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANSlrubta5tlOjVCi/gb
+yLCvRqfBjxG8H594VcKHu0WAYc99SPZF9cycj5mw2GyfQvy/WIrGrL4iyNq1gSqR
+0QA/mTXKZIaPqzpDhdm+VvrKkmjrbZfaQxgMSs3ChtBsjcP9Lc0X1zXZ4Q8nBe3k
+BTp+zehINfmbjoEgXLxsMR5RQ6GxzKjuC04PQpbJQgTIakglKaqYcDDZbEscWgPV
+Hgj/2aoHlj6leW/ThHZ+O41jUguEmBLZA3mu3HrCfrHntb5dPt0ihzSx7GtD/SaX
+5HBLxnP189YuqMk5iRA95CtiSdKauvon/xRKRLNgG6XAz0ctSoY7xLDdiBVU5kJd
+FScCAwEAAaOCAVAwggFMMEgGA1UdIARBMD8wPQYEVR0gADA1MDMGCCsGAQUFBwIB
+FidodHRwOi8vd3d3LmRpZ2lub3Rhci5ubC9jcHMvcGtpb3ZlcmhlaWQwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgYAGA1UdIwR5MHeAFAuG1g93o2ix
++2QJw4huXAQcV+k9oVmkVzBVMQswCQYDVQQGEwJOTDEeMBwGA1UEChMVU3RhYXQg
+ZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQYIEAJiaeTA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnBraW92
+ZXJoZWlkLm5sL0RvbU92TGF0ZXN0Q1JMLmNybDAdBgNVHQ4EFgQUvRaYQh2+kdE9
+wpcl4CjXWOC1f+IwDQYJKoZIhvcNAQEFBQADggEBAGhQsCWLiaN2EOhPAW+JQP6o
+XBOrLv5w6joahzBFVn1BiefzmlMKjibqKYxURRvMAsMkh82/MfL8V0w6ugxl81lu
+i42dcxl9cKSVXKMw4bbBzJ2VQI5HTIABwefeNuy/eX6idVwYdt3ajAH7fUA8Q9Cq
+vr6H8B+8mwoEqTVTEVlCSsC/EXsokYEUr06PPzRudKjDmijgj7zFaIioZNc8hk7g
+ufEgrs/tmcNGylrwRHgCXjCRBt2NHlZ08l7A1AGU8HcHlSbG9Un/2q9kVHUkps0D
+gtUaEK+x6jpAu/R8Ojezu/+ZEcwwjI/KOhG+84+ejFmtyEkrUdsAdEdLf/2dKsw=
+-----END CERTIFICATE-----
+
+// Subject: EMAILADDRESS=info@diginotar.nl,
+// CN=DigiNotar Services 1024 CA
+// O=DigiNotar, C=NL
+// Issuer: CN=Entrust.net Secure Server Certification Authority,
+// OU=(c) 1999 Entrust.net Limited,
+// OU=www.entrust.net/CPS incorp. by ref. (limits liab.),
+// O=Entrust.net,
+// C=US
+// Serial: 1184640176 (46:9c:2c:b0)
+-----BEGIN CERTIFICATE-----
+MIIDzTCCAzagAwIBAgIERpwssDANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNzA3
+MjYxNTU5MDBaFw0xMzA4MjYxNjI5MDBaMGgxCzAJBgNVBAYTAk5MMRIwEAYDVQQK
+EwlEaWdpTm90YXIxIzAhBgNVBAMTGkRpZ2lOb3RhciBTZXJ2aWNlcyAxMDI0IENB
+MSAwHgYJKoZIhvcNAQkBFhFpbmZvQGRpZ2lub3Rhci5ubDCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA2ptNXTz50eKLxsYIIMXZHkjsZlhneWIrQWP0iY1o2q+4
+lDaLGSSkoJPSmQ+yrS01Tc0vauH5mxkrvAQafi09UmTN8T5nD4ku6PJPrqYIoYX+
+oakJ5sarPkP8r3oDkdqmOaZh7phPGKjTs69mgumfvN1y+QYEvRLZGCTnq5NTi1kC
+AwEAAaOCASYwggEiMBIGA1UdEwEB/wQIMAYBAf8CAQAwJwYDVR0lBCAwHgYIKwYB
+BQUHAwEGCCsGAQUFBwMCBggrBgEFBQcDBDARBgNVHSAECjAIMAYGBFUdIAAwMwYI
+KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5lbnRydXN0Lm5l
+dDAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vY3JsLmVudHJ1c3QubmV0L3NlcnZl
+cjEuY3JsMB0GA1UdDgQWBBT+3JRJDG/vXH/G8RKZTxZJrfuCZTALBgNVHQ8EBAMC
+AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowGQYJKoZIhvZ9B0EA
+BAwwChsEVjcuMQMCAIEwDQYJKoZIhvcNAQEFBQADgYEAY3RqN6k/lpxmyFisCcnv
+9WWUf6MCxDgxvV0jh+zUVrLJsm7kBQb87PX6iHBZ1O7m3bV6oKNgLwIMq94SXa/w
+NUuqikeRGvWFLELHHe+VQ7NeuJWTpdrFKKqtci0xrZlrbP+MISevrZqRK8fdWMNu
+B8WfedLHjFW/TMcnXlEWKz4=
+-----END CERTIFICATE-----
+
+// Subject: CN=Buster Paper Comercial Ltda,
+// O=Buster Paper Comercial Ltda,
+// L=S?o Jos? Dos Campos,
+// ST=S?o Paulo,
+// C=BR
+// Issuer: CN=DigiCert Assured ID Code Signing CA-1,
+// OU=www.digicert.com,
+// O=DigiCert Inc,
+// C=US
+// Serial: 07:b4:4c:db:ff:fb:78:de:05:f4:26:16:72:a6:73:12
+-----BEGIN CERTIFICATE-----
+MIIGwzCCBaugAwIBAgIQB7RM2//7eN4F9CYWcqZzEjANBgkqhkiG9w0BAQUFADBv
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS4wLAYDVQQDEyVEaWdpQ2VydCBBc3N1cmVkIElEIENv
+ZGUgU2lnbmluZyBDQS0xMB4XDTEzMDExNzAwMDAwMFoXDTE0MDEyMjEyMDAwMFow
+gY4xCzAJBgNVBAYTAkJSMRMwEQYDVQQIDApTw6NvIFBhdWxvMR4wHAYDVQQHDBVT
+w6NvIEpvc8OpIERvcyBDYW1wb3MxJDAiBgNVBAoTG0J1c3RlciBQYXBlciBDb21l
+cmNpYWwgTHRkYTEkMCIGA1UEAxMbQnVzdGVyIFBhcGVyIENvbWVyY2lhbCBMdGRh
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzO0l6jWIpEfO2oUpVHpL
+HETj5lzivNb0S9jKHgGJax917czh81PnGTxwxFXd6gLJuy/XFHvmiSi8g8jzlymn
+2Ji5zQ3CPaz7nomJokSUDlMVJ2qYWtctw4jrdjuI4qtn+koXXUFkWjkf8h8251I4
+tUs7S49HE2Go5owCYP3byajj7fsFAYR/Xb7TdVtndkZsUB/YgOjHovyACjouaNCi
+mDiRyQ6zLLjZGiyeD65Yiseuhp5b8/BL5h1p7w76QYMYMVQNAdtDKut2R8MBpuWf
+Ny7Eoi0x/gm1p9X5Rcl5aN7K0G4UtTAJKbkuUfXddsyFoM0Nx8uo8SgNQ8Y/X5Jx
+BwIDAQABo4IDOTCCAzUwHwYDVR0jBBgwFoAUe2jOKarAF75JeuHlP9an90WPNTIw
+HQYDVR0OBBYEFFLZ3n5nt/Eer7n1bvtOqMb1qKO5MA4GA1UdDwEB/wQEAwIHgDAT
+BgNVHSUEDDAKBggrBgEFBQcDAzBzBgNVHR8EbDBqMDOgMaAvhi1odHRwOi8vY3Js
+My5kaWdpY2VydC5jb20vYXNzdXJlZC1jcy0yMDExYS5jcmwwM6AxoC+GLWh0dHA6
+Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9hc3N1cmVkLWNzLTIwMTFhLmNybDCCAcQGA1Ud
+IASCAbswggG3MIIBswYJYIZIAYb9bAMBMIIBpDA6BggrBgEFBQcCARYuaHR0cDov
+L3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsG
+AQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABD
+AGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABh
+AGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQBy
+AHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBn
+ACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABs
+AGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABp
+AG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBl
+AGYAZQByAGUAbgBjAGUALjCBggYIKwYBBQUHAQEEdjB0MCQGCCsGAQUFBzABhhho
+dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTAYIKwYBBQUHMAKGQGh0dHA6Ly9jYWNl
+cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENvZGVTaWduaW5nQ0Et
+MS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQUFAAOCAQEAPTTQvpOIikXI
+hTLnNbajaFRR5GhQpTzUNgBfF9VYSlNw/wMjpGsrh5RxaJCip52jbehmTgjMRhft
+jRYyml44PAVsCcR9uEoDpCZYpI1fHI1R+F8jd1C9rqprbSwwOG4xlg4SmvTHYs6e
+gBItQ/1p9XY+Sf4Wv1qOuOFL1qvV/5VyR2zdlOQCmKCeMgxt6a/tHLBDiAA67D44
+/vfdoNJl0CU2It0PO60jdCPFNWIRcxL+OSDqAoePeUC7xQ+JsTEIxuUE8+d6w6fc
+BV2mYb1flh22t46GLjh4gyo7xw3aL6L0L0jzlTT6IcEw6NIbaPbIKj/npQnHobYj
+XMuKLxbh7g==
+-----END CERTIFICATE-----
+
+// Subject: CN=BUSTER ASSISTENCIA TECNICA ELETRONICA LTDA - ME,
+// O=BUSTER ASSISTENCIA TECNICA ELETRONICA LTDA - ME,
+// L=S?o Paulo,
+// ST=S?o Paulo,
+// C=BR
+// Issuer: CN=DigiCert Assured ID Code Signing CA-1,
+// OU=www.digicert.com,
+// O=DigiCert Inc,
+// C=US
+// Serial: 0a:38:9b:95:ee:73:6d:d1:3b:c0:ed:74:3f:d7:4d:2f
+-----BEGIN CERTIFICATE-----
+MIIG4DCCBcigAwIBAgIQCjible5zbdE7wO10P9dNLzANBgkqhkiG9w0BAQUFADBv
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS4wLAYDVQQDEyVEaWdpQ2VydCBBc3N1cmVkIElEIENv
+ZGUgU2lnbmluZyBDQS0xMB4XDTEyMTEwOTAwMDAwMFoXDTEzMTExNDEyMDAwMFow
+gasxCzAJBgNVBAYTAkJSMRMwEQYDVQQIDApTw6NvIFBhdWxvMRMwEQYDVQQHDApT
+w6NvIFBhdWxvMTgwNgYDVQQKEy9CVVNURVIgQVNTSVNURU5DSUEgVEVDTklDQSBF
+TEVUUk9OSUNBIExUREEgLSBNRTE4MDYGA1UEAxMvQlVTVEVSIEFTU0lTVEVOQ0lB
+IFRFQ05JQ0EgRUxFVFJPTklDQSBMVERBIC0gTUUwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQDAqNeEs5/B2CTXGjTOkUIdu6jV6qulOZwdw4sefHWYj1UR
+4z6zPk9kjpUgbnb402RFq88QtfInwddZ/wXn9OxMtDd/3TnC7HrhNS7ga79ZFL2V
+JnmzKHum2Yvh0q82QEJ9tHBR2X9VdKpUIH08Zs3k6cWWM1H0YX0cxA/HohhesQJW
+kwJ3urOIJiH/HeByDk8a1NS8safcCxk5vxvW4WvCg43iT09LeHY5Aa8abKw8lqVb
+0tD5ZSIjdmdj3TT1U37iAHLLRM2DXbxfdbhouUX1c5U1ZHAMA67HwjKiseOiDaHj
+NUGbC37C+cgbc9VVM/cURD8WvS0Kj6fQv7F2QtJDAgMBAAGjggM5MIIDNTAfBgNV
+HSMEGDAWgBR7aM4pqsAXvkl64eU/1qf3RY81MjAdBgNVHQ4EFgQU88EXKAyDsh30
+o9+Gu9a4xUy+FSMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMD
+MHMGA1UdHwRsMGowM6AxoC+GLWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9hc3N1
+cmVkLWNzLTIwMTFhLmNybDAzoDGgL4YtaHR0cDovL2NybDQuZGlnaWNlcnQuY29t
+L2Fzc3VyZWQtY3MtMjAxMWEuY3JsMIIBxAYDVR0gBIIBuzCCAbcwggGzBglghkgB
+hv1sAwEwggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9z
+c2wtY3BzLXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4A
+eQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQA
+ZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUA
+IABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAA
+YQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcA
+cgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIA
+aQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQA
+ZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMIGC
+BggrBgEFBQcBAQR2MHQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0
+LmNvbTBMBggrBgEFBQcwAoZAaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp
+Z2lDZXJ0QXNzdXJlZElEQ29kZVNpZ25pbmdDQS0xLmNydDAMBgNVHRMBAf8EAjAA
+MA0GCSqGSIb3DQEBBQUAA4IBAQAei1QmiXepje8OIfo/WonD4MIXgpPr2dfRaquQ
+A8q63OpTRSveyqdQDCSPpDRF/nvO1Y30yksZvIH1tNBsW5LBdxAKN3lFdBlqBwtE
+Q3jHc0KVVYRJ0FBaGE/PJHmRajscdAhYIcMPhTga0u0tDK+wOHEq3993dfl6yHjA
+XHU2iW5pnk75ZoE39zALD5eKXT8ZXrET5c3XUFJKWA+XuGmdmyzqo0Au49PanBv9
+UlZnabYfqoMArqMS0tGSX4cGgi9/2E+pHG9BX4sFW+ZDumroOA2pxyMWEKjxePEL
+zCOfhbsRWdMLYepauaNZOIMZXmFwcrIl0TGMkTAtATz+XmZc
+-----END CERTIFICATE-----
+
+// Subject: CN=CLEARESULT CONSULTING INC., OU=Corporate IT,
+// O=CLEARESULT CONSULTING INC., L=Austin, ST=TX, C=US
+// Issuer: SERIALNUMBER=07969287,
+// CN=Go Daddy Secure Certification Authority,
+// OU=http://certificates.godaddy.com/repository,
+// O="GoDaddy.com, Inc.",
+// L=Scottsdale,
+// ST=Arizona,
+// C=US
+// Serial: 2b:73:43:2a:a8:4f:44
+-----BEGIN CERTIFICATE-----
+MIIFYjCCBEqgAwIBAgIHK3NDKqhPRDANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
+BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydGlm
+aWNhdGVzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkxMDAuBgNVBAMTJ0dvIERhZGR5
+IFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTERMA8GA1UEBRMIMDc5Njky
+ODcwHhcNMTIwMjE1MjEwOTA2WhcNMTQwMjE1MjEwOTA2WjCBjDELMAkGA1UEBgwC
+VVMxCzAJBgNVBAgMAlRYMQ8wDQYDVQQHDAZBdXN0aW4xIzAhBgNVBAoMGkNMRUFS
+RVNVTFQgQ09OU1VMVElORyBJTkMuMRUwEwYDVQQLDAxDb3Jwb3JhdGUgSVQxIzAh
+BgNVBAMMGkNMRUFSRVNVTFQgQ09OU1VMVElORyBJTkMuMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAtIOjCKeAicull+7ZIzt0/4ya3IeXUFlfypqKMLkU
+IbKjn0P5uMj6VE3rlbZr44RCegxvdnR6umBh1c0ZXoN3o+yc0JKcKcLiApmJJ277
+p7IbLwYDhBXRQNoIJm187IOMRPIxsKN4hL91txn9jGBmW+9zKlJlNhR5R7vjwU2E
+jrH/6oqsc9EM2yYpfjlNv6+3jSwAYZCkSWr+27PQOV+YHKmIxtJjX0upFz5FdIrV
+9CCX+L2Kji1THOkSgG4QTbYxmEcHqGViWz8hXLeNXjcbEsPuIiAu3hknxRHfUTE/
+U0Lh0Ug1e3LrJu+WnxM2SmUY4krsZ22c0yWUW9hzWITIjQIDAQABo4IBhzCCAYMw
+DwYDVR0TAQH/BAUwAwEBADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8E
+BAMCB4AwMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nb2RhZGR5LmNvbS9n
+ZHM1LTE2LmNybDBTBgNVHSAETDBKMEgGC2CGSAGG/W0BBxcCMDkwNwYIKwYBBQUH
+AgEWK2h0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8w
+gYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZ29kYWRk
+eS5jb20vMEoGCCsGAQUFBzAChj5odHRwOi8vY2VydGlmaWNhdGVzLmdvZGFkZHku
+Y29tL3JlcG9zaXRvcnkvZ2RfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBT9
+rGEyk2xF1uLuhV+auud2mWjM5zAdBgNVHQ4EFgQUDtdeKqeN2QkcbEp1HovFieNB
+XiowDQYJKoZIhvcNAQEFBQADggEBAD74Agw5tvi2aBl4/f/s7/VE/BClzDsKMb9K
+v9qpeC45ZA/jelxV11HKbQnVF194gDb7D2H9OsAsRUy8HVKbXEcc/8dKvwOqb+BC
+2i/EmfjLgmCfezNFtLq8xcPxF3zIRc44vPrK0z4YZsaHdH+yTEJ51p5EMdTqaLaP
+4n5m8LX3RfqlQB9dYFe6dUoYZjKm9d/pIRww3VqfOzjl42Edi1w6dWmBVMx1NZuR
+DBabJH1vJ9Gd+KwxMCmBZ6pQPl28JDimhJhI2LNqU349uADQVV0HJosddN/ARyyI
+LSIQO7BnNVKVG9Iujf33bvPNeg0qNz5qw+rKKq97Pqeum+L5oKU=
+-----END CERTIFICATE-----
--- a/jdk/src/share/npt/utf.c Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/share/npt/utf.c Thu Oct 03 19:18:54 2013 +0100
@@ -105,18 +105,24 @@
code = utf16[i];
if ( code >= 0x0001 && code <= 0x007F ) {
+ if ( outputLen + 1 >= outputMaxLen ) {
+ return -1;
+ }
output[outputLen++] = code;
} else if ( code == 0 || ( code >= 0x0080 && code <= 0x07FF ) ) {
+ if ( outputLen + 2 >= outputMaxLen ) {
+ return -1;
+ }
output[outputLen++] = ((code>>6) & 0x1F) | 0xC0;
output[outputLen++] = (code & 0x3F) | 0x80;
} else if ( code >= 0x0800 && code <= 0xFFFF ) {
+ if ( outputLen + 3 >= outputMaxLen ) {
+ return -1;
+ }
output[outputLen++] = ((code>>12) & 0x0F) | 0xE0;
output[outputLen++] = ((code>>6) & 0x3F) | 0x80;
output[outputLen++] = (code & 0x3F) | 0x80;
}
- if ( outputLen > outputMaxLen ) {
- return -1;
- }
}
output[outputLen] = 0;
return outputLen;
@@ -412,12 +418,15 @@
unsigned byte;
byte = bytes[i];
- if ( outputLen >= outputMaxLen ) {
- return -1;
- }
if ( byte <= 0x7f && isprint(byte) && !iscntrl(byte) ) {
+ if ( outputLen + 1 >= outputMaxLen ) {
+ return -1;
+ }
output[outputLen++] = (char)byte;
} else {
+ if ( outputLen + 4 >= outputMaxLen ) {
+ return -1;
+ }
(void)sprintf(output+outputLen,"\\x%02x",byte);
outputLen += 4;
}
--- a/jdk/src/solaris/bin/java_md_solinux.c Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/bin/java_md_solinux.c Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,6 @@
*/
#ifdef __solaris__
-# define DUAL_MODE
# ifndef LIBARCH32NAME
# error "The macro LIBARCH32NAME was not defined on the compile line"
# endif
--- a/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -145,13 +145,8 @@
}
/*
- * two native methods to call corresponding methods in Container and
- * Component
+ * native method to call corresponding methods in Component
*/
- protected Component findComponentAt(Container con, int x, int y) {
- return con.findComponentAt(x,y);
- }
-
protected Point getLocationOnScreen(Component c) {
return c.getLocationOnScreen();
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -28,6 +28,8 @@
import java.awt.Graphics;
import sun.awt.LightweightFrame;
+import sun.swing.JLightweightFrame;
+import sun.swing.SwingAccessor;
public class XLightweightFramePeer extends XFramePeer {
@@ -62,4 +64,9 @@
getLwTarget().ungrabFocus();
}
}
+
+ @Override
+ public void updateCursorImmediately() {
+ SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget());
+ }
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Oct 03 19:18:54 2013 +0100
@@ -2249,6 +2249,8 @@
XConstants.XkbModifierMapMask |
XConstants.XkbVirtualModsMask,
XConstants.XkbUseCoreKbd);
+
+ XlibWrapper.XkbSetDetectableAutoRepeat(getDisplay(), true);
}
}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -459,7 +459,7 @@
// other class tries to cast source field to Component).
// We already filter DRAG events out (CR 6565779).
e.setSource(xtiPeer.target);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e);
+ XToolkit.postEvent(XToolkit.targetToAppContext(e.getSource()), e);
}
public void mouseClicked(MouseEvent e) {
if ((e.getClickCount() > 1 || xtiPeer.balloon.isVisible()) &&
--- a/jdk/src/solaris/classes/sun/awt/X11/XWM.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWM.java Thu Oct 03 19:18:54 2013 +0100
@@ -592,7 +592,7 @@
}
static boolean isMutter() {
- return isNetWMName("Mutter");
+ return isNetWMName("Mutter") || isNetWMName("GNOME Shell");
}
static boolean isNonReparentingWM() {
--- a/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Thu Oct 03 19:18:54 2013 +0100
@@ -509,6 +509,7 @@
static native long XkbGetUpdatedMap(long display, long which, long xkb);
static native void XkbFreeKeyboard(long xkb, long which, boolean free_all);
static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn);
+ static native void XkbSetDetectableAutoRepeat(long display, boolean detectable);
static native void XConvertCase(long keysym,
--- a/jdk/src/solaris/classes/sun/java2d/xr/XRMaskImage.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/java2d/xr/XRMaskImage.java Thu Oct 03 19:18:54 2013 +0100
@@ -45,6 +45,7 @@
int blitMaskPicture;
int lastMaskWidth = 0;
int lastMaskHeight = 0;
+ int lastEA = -1;
AffineTransform lastMaskTransform;
XRCompositeManager xrMgr;
@@ -82,13 +83,15 @@
lastMaskTransform = maskTX;
}
- if (lastMaskWidth != maskWidth || lastMaskHeight != maskHeight) {
+ int currentEA = xrMgr.getAlphaColor().getAlpha();
+ if (lastMaskWidth != maskWidth || lastMaskHeight != maskHeight || lastEA != currentEA) {
//Only clear mask, if previous mask area is larger than new one, otherwise simple overpaint it
if (lastMaskWidth > maskWidth || lastMaskHeight > maskHeight) {
con.renderRectangle(blitMaskPicture, XRUtils.PictOpClear, XRColor.NO_ALPHA, 0, 0, lastMaskWidth, lastMaskHeight);
}
con.renderRectangle(blitMaskPicture, XRUtils.PictOpSrc, xrMgr.getAlphaColor(), 0, 0, maskWidth, maskHeight);
+ lastEA = currentEA;
}
lastMaskWidth = maskWidth;
--- a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java Thu Oct 03 19:18:54 2013 +0100
@@ -26,9 +26,11 @@
package sun.nio.ch;
import java.io.IOException;
+import java.security.AccessController;
import java.util.BitSet;
import java.util.Map;
import java.util.HashMap;
+import sun.security.action.GetIntegerAction;
/**
@@ -78,10 +80,11 @@
static final int NUM_POLLFDS = Math.min(OPEN_MAX-1, 8192);
// Initial size of arrays for fd registration changes
- private final int INITIAL_PENDING_UPDATE_SIZE = 64;
+ private static final int INITIAL_PENDING_UPDATE_SIZE = 64;
// maximum size of updatesLow
- private final int MAX_UPDATE_ARRAY_SIZE = Math.min(OPEN_MAX, 64*1024);
+ private static final int MAX_UPDATE_ARRAY_SIZE = AccessController.doPrivileged(
+ new GetIntegerAction("sun.nio.ch.maxUpdateArraySize", Math.min(OPEN_MAX, 64*1024)));
// The pollfd array for results from devpoll driver
private final AllocatedNativeObject pollArray;
--- a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java Thu Oct 03 19:18:54 2013 +0100
@@ -26,9 +26,11 @@
package sun.nio.ch;
import java.io.IOException;
+import java.security.AccessController;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Map;
+import sun.security.action.GetIntegerAction;
/**
* Manipulates a native array of epoll_event structs on Linux:
@@ -78,8 +80,8 @@
private static final int INITIAL_PENDING_UPDATE_SIZE = 64;
// maximum size of updatesLow
- private static final int MAX_UPDATE_ARRAY_SIZE = Math.min(OPEN_MAX, 64*1024);
-
+ private static final int MAX_UPDATE_ARRAY_SIZE = AccessController.doPrivileged(
+ new GetIntegerAction("sun.nio.ch.maxUpdateArraySize", Math.min(OPEN_MAX, 64*1024)));
// The fd of the epoll driver
private final int epfd;
@@ -164,6 +166,16 @@
}
/**
+ * Returns {@code true} if updates for the given key (file
+ * descriptor) are killed.
+ */
+ private boolean isEventsHighKilled(Integer key) {
+ assert key >= MAX_UPDATE_ARRAY_SIZE;
+ Byte value = eventsHigh.get(key);
+ return (value != null && value == KILLED);
+ }
+
+ /**
* Sets the pending update events for the given file descriptor. This
* method has no effect if the update events is already set to KILLED,
* unless {@code force} is {@code true}.
@@ -175,7 +187,7 @@
}
} else {
Integer key = Integer.valueOf(fd);
- if ((eventsHigh.get(key) != KILLED) || force) {
+ if (!isEventsHighKilled(key) || force) {
eventsHigh.put(key, Byte.valueOf(events));
}
}
--- a/jdk/src/solaris/classes/sun/nio/ch/EventPortWrapper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/classes/sun/nio/ch/EventPortWrapper.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,9 +25,14 @@
package sun.nio.ch;
+import java.io.IOException;
+import java.security.AccessController;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.Map;
+
import sun.misc.Unsafe;
-import java.io.IOException;
-import java.util.*;
+import sun.security.action.GetIntegerAction;
import static sun.nio.ch.SolarisEventPort.*;
/**
@@ -49,7 +54,8 @@
private final int INITIAL_PENDING_UPDATE_SIZE = 256;
// maximum size of updateArray
- private final int MAX_UPDATE_ARRAY_SIZE = Math.min(OPEN_MAX, 64*1024);
+ private static final int MAX_UPDATE_ARRAY_SIZE = AccessController.doPrivileged(
+ new GetIntegerAction("sun.nio.ch.maxUpdateArraySize", Math.min(OPEN_MAX, 64*1024)));
// special update status to indicate that it should be ignored
private static final byte IGNORE = -1;
--- a/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Thu Oct 03 19:18:54 2013 +0100
@@ -523,8 +523,12 @@
//printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn));
return b;
}
-
-
+JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat
+(JNIEnv *env, jclass clazz, jlong display, jboolean detectable)
+{
+ AWT_CHECK_HAVE_LOCK();
+ XkbSetDetectableAutoRepeat((Display *) jlong_to_ptr(display), detectable, NULL);
+}
/*
* Class: sun_awt_X11_XlibWrapper
* Method: XNextEvent
--- a/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -656,7 +656,7 @@
_setFont(f);
}
public synchronized native void _setFont(Font f);
- public final void updateCursorImmediately() {
+ public void updateCursorImmediately() {
WGlobalCursorManager.getCursorManager().updateCursorImmediately();
}
--- a/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Thu Oct 03 19:18:54 2013 +0100
@@ -211,9 +211,9 @@
DataFlavor.allHtmlFlavor,
format);
} else {
- // handel other html flavor types, including custom and
+ // handle other html flavor types, including custom and
// fragment ones
- bytes = HTMLCodec.convertToHTMLFormat(bytes);
+ bytes = HTMLCodec.convertToHTMLFormat(super.translateTransferable(contents, flavor, format));
}
} else {
// we handle non-html types basing on their
--- a/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -182,6 +182,7 @@
AWTAccessor.getFileDialogAccessor().setFile(fileDialog, null);
AWTAccessor.getFileDialogAccessor().setFiles(fileDialog, null);
+ AWTAccessor.getFileDialogAccessor().setDirectory(fileDialog, null);
WToolkit.executeOnEventHandlerThread(fileDialog, new Runnable() {
public void run() {
--- a/jdk/src/windows/classes/sun/awt/windows/WGlobalCursorManager.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WGlobalCursorManager.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -48,7 +48,6 @@
protected native void setCursor(Component comp, Cursor cursor, boolean u);
protected native void getCursorPos(Point p);
- protected native Component findComponentAt(Container con, int x, int y);
/*
* two native methods to call corresponding methods in Container and
* Component
--- a/jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,6 +31,8 @@
import java.awt.event.MouseEvent;
import sun.awt.LightweightFrame;
+import sun.swing.JLightweightFrame;
+import sun.swing.SwingAccessor;
public class WLightweightFramePeer extends WFramePeer {
@@ -83,4 +85,9 @@
public void ungrab() {
getLwTarget().ungrabFocus();
}
+
+ @Override
+ public void updateCursorImmediately() {
+ SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget());
+ }
}
--- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c Thu Oct 03 19:18:54 2013 +0100
@@ -308,7 +308,11 @@
if (success) {
PROCESS_INFORMATION pi;
- DWORD processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
+ DWORD processFlag = CREATE_UNICODE_ENVIRONMENT;
+
+ /* Suppress popping-up of a console window for non-console applications */
+ if (GetConsoleWindow() == NULL)
+ processFlag |= CREATE_NO_WINDOW;
si.dwFlags = STARTF_USESTDHANDLES;
if (!CreateProcessW(
--- a/jdk/src/windows/native/sun/windows/awt_Container.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Container.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,7 +31,6 @@
*/
jfieldID AwtContainer::layoutMgrID;
-jmethodID AwtContainer::findComponentAtMID;
/************************************************************************
* AwtContainer native methods
@@ -46,11 +45,7 @@
AwtContainer::layoutMgrID =
env->GetFieldID(cls, "layoutMgr", "Ljava/awt/LayoutManager;");
- AwtContainer::findComponentAtMID =
- env->GetMethodID(cls, "findComponentAt", "(IIZ)Ljava/awt/Component;");
-
DASSERT(AwtContainer::layoutMgrID != NULL);
- DASSERT(AwtContainer::findComponentAtMID);
CATCH_BAD_ALLOC;
}
--- a/jdk/src/windows/native/sun/windows/awt_Container.h Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Container.h Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,6 @@
/* java.awt.Container field ids */
static jfieldID layoutMgrID;
- static jmethodID findComponentAtMID;
};
--- a/jdk/src/windows/native/sun/windows/awt_Cursor.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Cursor.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -554,32 +554,6 @@
/*
* Class: sun_awt_windows_WGlobalCursorManager
- * Method: findComponentAt
- * Signature: (L/java/awt/Container;II)L/java/awt/Component
- */
-JNIEXPORT jobject JNICALL
-Java_sun_awt_windows_WGlobalCursorManager_findComponentAt(
- JNIEnv *env, jobject, jobject container, jint x, jint y)
-{
- TRY;
-
- /*
- * Call private version of Container.findComponentAt with the following
- * flag set -- ignoreEnabled = false (i.e., don't return or recur into
- * disabled Components);
- * NOTE: it may return a JRootPane's glass pane as the target Component
- */
- JNI_CHECK_NULL_RETURN_NULL(container, "null container");
- jobject comp =
- env->CallObjectMethod(container, AwtContainer::findComponentAtMID,
- x, y, JNI_FALSE);
- return comp;
-
- CATCH_BAD_ALLOC_RET(NULL);
-}
-
-/*
- * Class: sun_awt_windows_WGlobalCursorManager
* Method: getLocationOnScreen
* Signature: (L/java/awt/Component;)L/java/awt/Point
*/
--- a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -73,7 +73,7 @@
int length = env->GetStringLength(filterDescription);
DASSERT(length + 1 < MAX_FILTER_STRING);
LPCTSTR tmp = JNU_GetStringPlatformChars(env, filterDescription, NULL);
- _tcscpy(s_fileFilterString, tmp);
+ _tcscpy_s(s_fileFilterString, MAX_FILTER_STRING, tmp);
JNU_ReleaseStringPlatformChars(env, filterDescription, tmp);
//AdditionalString should be terminated by two NULL characters (Windows
@@ -353,7 +353,7 @@
if (!result) {
dlgerr = ::CommDlgExtendedError();
if (dlgerr == FNERR_INVALIDFILENAME) {
- _tcscpy(fileBuffer, TEXT(""));
+ _tcscpy_s(fileBuffer, bufferLimit, TEXT(""));
if (mode == java_awt_FileDialog_LOAD) {
result = AwtFileDialog::GetOpenFileName(&ofn);
} else {
@@ -372,7 +372,9 @@
// Report result to peer.
if (result) {
- jint length = (jint)GetBufferLength(ofn.lpstrFile, ofn.nMaxFile);
+ jint length = multipleMode
+ ? (jint)GetBufferLength(ofn.lpstrFile, ofn.nMaxFile)
+ : (jint)_tcslen(ofn.lpstrFile);
jcharArray jnames = env->NewCharArray(length);
env->SetCharArrayRegion(jnames, 0, length, (jchar*)ofn.lpstrFile);
--- a/jdk/src/windows/native/sun/windows/awt_Font.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Font.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -366,17 +366,6 @@
return awtFont;
}
-int CALLBACK FindFamilyName (ENUMLOGFONTEX *lpelfe,
- NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam)
-{
- if(_tcsstr((LPTSTR)lParam, lpelfe->elfLogFont.lfFaceName)) {
- _tcscpy((LPTSTR)lParam, lpelfe->elfLogFont.lfFaceName);
- return 0;
- } else {
- return 1;
- }
-}
-
static void strip_tail(wchar_t* text, wchar_t* tail) { // strips tail and any possible whitespace before it from the end of text
if (wcslen(text)<=wcslen(tail)) {
return;
--- a/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -428,17 +428,17 @@
devnames->wOutputOffset =
static_cast<WORD>(sizeof(DEVNAMES)/sizeof(TCHAR) + lenDriverName + lenPrinterName);
if (info2->pDriverName != NULL) {
- _tcscpy(lpcDevnames + devnames->wDriverOffset, info2->pDriverName);
+ _tcscpy_s(lpcDevnames + devnames->wDriverOffset, devnameSize - devnames->wDriverOffset, info2->pDriverName);
} else {
*(lpcDevnames + devnames->wDriverOffset) = _T('\0');
}
if (pPrinterName != NULL) {
- _tcscpy(lpcDevnames + devnames->wDeviceOffset, pPrinterName);
+ _tcscpy_s(lpcDevnames + devnames->wDeviceOffset, devnameSize - devnames->wDeviceOffset, pPrinterName);
} else {
*(lpcDevnames + devnames->wDeviceOffset) = _T('\0');
}
if (info2->pPortName != NULL) {
- _tcscpy(lpcDevnames + devnames->wOutputOffset, info2->pPortName);
+ _tcscpy_s(lpcDevnames + devnames->wOutputOffset, devnameSize - devnames->wOutputOffset, info2->pPortName);
} else {
*(lpcDevnames + devnames->wOutputOffset) = _T('\0');
}
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -228,7 +228,7 @@
// create input locale string, e.g., "00000409", from hkl.
TCHAR inputLocale[9];
TCHAR buf[9];
- _tcscpy(inputLocale, TEXT("00000000"));
+ _tcscpy_s(inputLocale, 9, TEXT("00000000"));
// 64-bit: ::LoadKeyboardLayout() is such a weird API - a string of
// the hex value you want?! Here we're converting our HKL value to
--- a/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -711,7 +711,7 @@
_tcsncpy(m_nid.szTip, tooltip, TRAY_ICON_TOOLTIP_MAX_SIZE);
m_nid.szTip[TRAY_ICON_TOOLTIP_MAX_SIZE - 1] = '\0';
} else {
- _tcscpy(m_nid.szTip, tooltip);
+ _tcscpy_s(m_nid.szTip, TRAY_ICON_TOOLTIP_MAX_SIZE, tooltip);
}
SendTrayMessage(NIM_MODIFY);
@@ -817,7 +817,7 @@
m_nid.szInfoTitle[TRAY_ICON_BALLOON_TITLE_MAX_SIZE - 1] = '\0';
} else {
- _tcscpy(m_nid.szInfoTitle, caption);
+ _tcscpy_s(m_nid.szInfoTitle, TRAY_ICON_BALLOON_TITLE_MAX_SIZE, caption);
}
if (text[0] == '\0') {
@@ -830,7 +830,7 @@
m_nid.szInfo[TRAY_ICON_BALLOON_INFO_MAX_SIZE - 1] = '\0';
} else {
- _tcscpy(m_nid.szInfo, text);
+ _tcscpy_s(m_nid.szInfo, TRAY_ICON_BALLOON_INFO_MAX_SIZE, text);
}
SendTrayMessage(NIM_MODIFY);
--- a/jdk/src/windows/native/sun/windows/awt_ole.cpp Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_ole.cpp Thu Oct 03 19:18:54 2013 +0100
@@ -70,7 +70,7 @@
bErrorReport?_T("Error:"):_T(""),
szBuffer) < 0)
{
- _tcscpy(szBuffer1 + DTRACE_BUF_LEN - 5, _T("...")); //reserver for \n
+ _tcscpy_s(szBuffer1 + DTRACE_BUF_LEN - 5, 5, _T("...")); //reserver for \n
}
memcpy(szBuffer1, szTime, iTimeLen*sizeof(TCHAR));
_tcscat(szBuffer1, _T("\n"));
--- a/jdk/test/com/sun/jdi/BadHandshakeTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -108,16 +108,7 @@
*/
private static Process launch(String address, String class_name) throws IOException {
String exe = System.getProperty("java.home")
- + File.separator + "bin" + File.separator;
- String arch = System.getProperty("os.arch");
- String osname = System.getProperty("os.name");
- if (osname.equals("SunOS") && arch.equals("sparcv9")) {
- exe += "sparcv9/java";
- } else if (osname.equals("SunOS") && arch.equals("amd64")) {
- exe += "amd64/java";
- } else {
- exe += "java";
- }
+ + File.separator + "bin" + File.separator + "java";
String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() +
" -agentlib:jdwp=transport=dt_socket" +
",server=y" + ",suspend=y" + ",address=" + address +
--- a/jdk/test/com/sun/jdi/DoubleAgentTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -90,16 +90,7 @@
*/
private static Process launch(String address, String class_name) throws IOException {
String exe = System.getProperty("java.home")
- + File.separator + "bin" + File.separator;
- String arch = System.getProperty("os.arch");
- String osname = System.getProperty("os.name");
- if (osname.equals("SunOS") && arch.equals("sparcv9")) {
- exe += "sparcv9/java";
- } else if (osname.equals("SunOS") && arch.equals("amd64")) {
- exe += "amd64/java";
- } else {
- exe += "java";
- }
+ + File.separator + "bin" + File.separator + "java";
String jdwpOption = "-agentlib:jdwp=transport=dt_socket"
+ ",server=y" + ",suspend=y" + ",address=" + address;
String cmd = exe + " " + VMConnection.getDebuggeeVMOptions()
--- a/jdk/test/com/sun/jdi/ExceptionEvents.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/ExceptionEvents.java Thu Oct 03 19:18:54 2013 +0100
@@ -417,8 +417,12 @@
request = eventRequestManager().createExceptionRequest(exceptionClass,
caught, uncaught);
request.addClassExclusionFilter("java.*");
+ request.addClassExclusionFilter("javax.*");
request.addClassExclusionFilter("sun.*");
request.addClassExclusionFilter("com.sun.*");
+ request.addClassExclusionFilter("com.oracle.*");
+ request.addClassExclusionFilter("oracle.*");
+ request.addClassExclusionFilter("jdk.internal.*");
request.setSuspendPolicy(suspendPolicy);
request.enable();
--- a/jdk/test/com/sun/jdi/ExclusiveBind.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -97,16 +97,7 @@
*/
private static Process launch(String address, boolean suspend, String class_name) throws IOException {
String exe = System.getProperty("java.home") + File.separator + "bin" +
- File.separator;
- String arch = System.getProperty("os.arch");
- String osname = System.getProperty("os.name");
- if (osname.equals("SunOS") && arch.equals("sparcv9")) {
- exe += "sparcv9/java";
- } else if (osname.equals("SunOS") && arch.equals("amd64")) {
- exe += "amd64/java";
- } else {
- exe += "java";
- }
+ File.separator + "java";
String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() +
" -agentlib:jdwp=transport=dt_socket,server=y,suspend=";
if (suspend) {
--- a/jdk/test/com/sun/jdi/FilterNoMatch.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/FilterNoMatch.java Thu Oct 03 19:18:54 2013 +0100
@@ -121,9 +121,13 @@
// We have to filter out all these so that they don't cause the
// listener to be called.
- request1.addClassExclusionFilter( "java.*");
- request1.addClassExclusionFilter( "com.*");
- request1.addClassExclusionFilter( "sun.*");
+ request1.addClassExclusionFilter("java.*");
+ request1.addClassExclusionFilter("javax.*");
+ request1.addClassExclusionFilter("sun.*");
+ request1.addClassExclusionFilter("com.sun.*");
+ request1.addClassExclusionFilter("com.oracle.*");
+ request1.addClassExclusionFilter("oracle.*");
+ request1.addClassExclusionFilter("jdk.internal.*");
// We want our listener to be called if a pattern does not match.
// So, here we want patterns that do not match HelloWorld.
--- a/jdk/test/com/sun/jdi/JDIScaffold.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/JDIScaffold.java Thu Oct 03 19:18:54 2013 +0100
@@ -450,8 +450,12 @@
requestManager.createStepRequest(thread, gran, depth);
sr.addClassExclusionFilter("java.*");
+ sr.addClassExclusionFilter("javax.*");
sr.addClassExclusionFilter("sun.*");
sr.addClassExclusionFilter("com.sun.*");
+ sr.addClassExclusionFilter("com.oracle.*");
+ sr.addClassExclusionFilter("oracle.*");
+ sr.addClassExclusionFilter("jdk.internal.*");
sr.addCountFilter(1);
sr.enable();
StepEvent retEvent = (StepEvent)waitForRequestedEvent(sr);
--- a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java Thu Oct 03 19:18:54 2013 +0100
@@ -115,7 +115,7 @@
*/
private String[] excludes = {"java.*", "javax.*", "sun.*",
"com.sun.*", "com.oracle.*",
- "oracle.*"};
+ "oracle.*", "jdk.internal.*"};
MethodEntryExitEvents (String args[]) {
super(args);
--- a/jdk/test/com/sun/jdi/PopAndStepTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/PopAndStepTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -130,8 +130,12 @@
StepRequest srInto = erm.createStepRequest(mainThread, StepRequest.STEP_LINE,
StepRequest.STEP_INTO);
srInto.addClassExclusionFilter("java.*");
+ srInto.addClassExclusionFilter("javax.*");
srInto.addClassExclusionFilter("sun.*");
srInto.addClassExclusionFilter("com.sun.*");
+ srInto.addClassExclusionFilter("com.oracle.*");
+ srInto.addClassExclusionFilter("oracle.*");
+ srInto.addClassExclusionFilter("jdk.internal.*");
srInto.addCountFilter(1);
srInto.enable(); // This fails
mainThread.popFrames(frameFor("A"));
--- a/jdk/test/com/sun/jdi/PrivateTransportTest.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/PrivateTransportTest.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1,7 +1,7 @@
#!/bin/ksh -p
#
-# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -102,28 +102,7 @@
is_windows=false
is_cygwin=false
case `uname -s` in
- SunOS)
- libarch=`uname -p`
- d64=`echo "${DEBUGGEEFLAGS}" | fgrep -- -d64`
- case `uname -p` in
- sparc)
- if [ "${d64}" != "" ] ; then
- libarch=sparcv9
- fi
- ;;
- i386)
- if [ "${d64}" != "" ] ; then
- libarch=amd64
- fi
- ;;
- *)
- echo "FAILURE: Unknown uname -p: " `uname -p`
- exit 1
- ;;
- esac
- libloc=${jreloc}/lib/${libarch}
- ;;
- Linux)
+ SunOS|Linux)
xx=`find ${jreloc}/lib -name libdt_socket.so`
libloc=`dirname ${xx}`
;;
--- a/jdk/test/com/sun/jdi/RepStep.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/RepStep.java Thu Oct 03 19:18:54 2013 +0100
@@ -75,8 +75,12 @@
DEPTH);
sr.addClassExclusionFilter("java.*");
+ sr.addClassExclusionFilter("javax.*");
sr.addClassExclusionFilter("sun.*");
sr.addClassExclusionFilter("com.sun.*");
+ sr.addClassExclusionFilter("com.oracle.*");
+ sr.addClassExclusionFilter("oracle.*");
+ sr.addClassExclusionFilter("jdk.internal.*");
sr.enable();
}
--- a/jdk/test/com/sun/jdi/RunToExit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/RunToExit.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -113,16 +113,7 @@
*/
private static Process launch(String address, String class_name) throws IOException {
String exe = System.getProperty("java.home")
- + File.separator + "bin" + File.separator;
- String arch = System.getProperty("os.arch");
- String osname = System.getProperty("os.name");
- if (osname.equals("SunOS") && arch.equals("sparcv9")) {
- exe += "sparcv9/java";
- } else if (osname.equals("SunOS") && arch.equals("amd64")) {
- exe += "amd64/java";
- } else {
- exe += "java";
- }
+ + File.separator + "bin" + File.separator + "java";
String cmd = exe + " " + VMConnection.getDebuggeeVMOptions() +
" -agentlib:jdwp=transport=dt_socket" +
",server=y" + ",suspend=y" + ",address=" + address +
--- a/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,226 +0,0 @@
-#!/bin/ksh -p
-
-#
-# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-#
-# This code is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-#
-# @test Solaris32AndSolaris64Test.sh
-# @bug 4478312 4780570 4913748 6730273
-# @summary Test debugging with mixed 32/64bit VMs.
-# @author Tim Bell
-# Based on test/java/awt/TEMPLATE/AutomaticShellTest.sh
-#
-# @run build TestScaffold VMConnection TargetListener TargetAdapter
-# @run compile -g FetchLocals.java
-# @run compile -g DataModelTest.java
-# @run shell/timeout=240 Solaris32AndSolaris64Test.sh DataModelTest
-# @run shell/timeout=240 Solaris32AndSolaris64Test.sh FetchLocals
-
-# Beginning of subroutines:
-status=1
-
-#Call this from anywhere to fail the test with an error message
-# usage: fail "reason why the test failed"
-fail()
- { echo "The test failed :-("
- echo "$*" 1>&2
- echo "exit status was $status"
- exit $status
- } #end of fail()
-
-#Call this from anywhere to pass the test with a message
-# usage: pass "reason why the test passed if applicable"
-pass()
- { echo "The test passed!!!"
- echo "$*" 1>&2
- exit 0
- } #end of pass()
-
-# end of subroutines
-
-if [ $# = 0 ] ; then
- echo "Error: no testname specified on cmd line"
- exit 1
-fi
-testName=$1
-shift
-
-#Set appropriate jdk
-
-if [ -z "${TESTJAVA}" ] ; then
- # TESTJAVA is not set, so the test is running stand-alone.
- # TESTJAVA holds the path to the root directory of the build of the JDK
- # to be tested. That is, any java files run explicitly in this shell
- # should use TESTJAVA in the path to the java interpreter.
- # So, we'll set this to the JDK spec'd on the command line. If none
- # is given on the command line, tell the user that and use a default.
- # THIS IS THE JDK BEING TESTED.
- if [ -n "$1" ] ; then
- TESTJAVA=$1
- else
- echo "no JDK specified on command line so using JAVA_HOME=$JAVA_HOME"
- TESTJAVA=$JAVA_HOME
- fi
- TESTSRC=.
- TESTCLASSES=.
- STANDALONE=1;
-fi
-echo "JDK under test is: $TESTJAVA"
-
-
-# The beginning of the script proper
-
-# Checking for proper OS and processor type.
-#
-# This test is only interested in SunOS SPARC sparcv9 and SunOS AMD64
-# (supporting both 32 and 64 bit Solaris binaries).
-#
-# All other platforms will instantly complete with passing
-# status.
-#
-OS=`uname -s`
-case "$OS" in
- SunOS )
- PATHSEP=":"
- PTYPE=`uname -p`
- if [ -x /usr/bin/isainfo ]; then
- # Instruction set being used by the OS
- ISET=`isainfo -k`
- else
- #SunOS 5.6 didn't have "isainfo"
- pass "This test always passes on $OS/$PTYPE (32-bit ${ISET})"
- fi
- ;;
-
- Linux | Darwin )
- pass "This test always passes on $OS"
- ;;
-
- Windows* | CYGWIN*)
- pass "This test always passes on $OS"
- ;;
-
- # catch all other OSs
- * )
- echo "Unrecognized system! $OS"
- fail "Unrecognized system! $OS"
- ;;
-esac
-
-# Is the OS running in sparcv9 or amd64 mode?
-case "${ISET}" in
- sparc )
- pass "This test always passes on $OS/$PTYPE (32-bit ${ISET})"
- ;;
- i386 )
- pass "This test always passes on $OS/$PTYPE (32-bit ${ISET})"
- ;;
- amd64 )
- echo "OS is running in ${ISET} mode"
- ;;
- sparcv9 )
- echo "OS is running in ${ISET} mode"
- ;;
- # catch all others
- * )
- echo "Unrecognized instruction set! $OS/$PTYPE/${ISET}"
- fail "Unrecognized instruction set! $OS/$PTYPE/${ISET}"
- ;;
-esac
-
-# SunOS 32 and 64 bit binaries must be available
-# to test in the remainder of the script below.
-$TESTJAVA/bin/java -d64 -version > /dev/null 2<&1
-if [ $? = 1 ]; then
- # The 64 bit version is not installed. Make the test pass.
- pass "This test always passes on $OS/$PTYPE if 64 bit jdk is not installed"
-fi
-
-# Want this test to run standalone as well as in the harness, so do the
-# following to copy the test's directory into the harness's scratch directory
-# and set all appropriate variables:
-
-#Deal with .class files:
-if [ -n "${STANDALONE}" ] ; then
- #if running standalone, compile the support files
- ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" \
- TestScaffold.java VMConnection.java TargetListener.java TargetAdapter.java
- ${TESTJAVA}/bin/javac -d ${TESTCLASSES} \
- -classpath "$TESTJAVA/lib/tools.jar${PATHSEP}${TESTSRC}" -g \
- FetchLocals.java DataModelTest.java
-fi
-
-# Get DEBUGGEE flags
-DEBUGGEEFLAGS=
-filename=$TESTCLASSES/@debuggeeVMOptions
-if [ ! -r ${filename} ] ; then
- filename=$TESTCLASSES/../@debuggeeVMOptions
-fi
-# Remove -d32, -d64 if present, and remove -XX:[+-]UseCompressedOops
-# if present since it is illegal in 32 bit mode.
-if [ -r ${filename} ] ; then
- DEBUGGEEFLAGS=`cat ${filename} | sed \
- -e 's/-d32//g' \
- -e 's/-d64//g' \
- -e 's/-XX:.UseCompressedOops//g' \
- `
-fi
-
-#
-CLASSPATH="$TESTJAVA/lib/tools.jar${PATHSEP}${TESTCLASSES}"
-export CLASSPATH
-CP="-classpath \"${CLASSPATH}\""
-
-for DEBUGGERMODEL in \
- 32 \
- 64 \
-; do
-
- for TARGETMODEL in \
- 32 \
- 64 \
- ; do
- DEBUGGERFLAGS="-d${DEBUGGERMODEL} -showversion -DEXPECTED=${TARGETMODEL}"
- CONNECTSTRING="-connect 'com.sun.jdi.CommandLineLaunch:options=-d${TARGETMODEL} $DEBUGGEEFLAGS -showversion'"
-
- for TARGETCLASS in $testName ; do
- echo "--------------------------------------------"
- echo "debugger=${DEBUGGERMODEL} debugee=${TARGETMODEL} class=${TARGETCLASS}"
- echo "--------------------------------------------"
- echo ${TESTJAVA}/bin/java -DHANGINGJAVA_DEB ${DEBUGGERFLAGS} ${CP} ${TARGETCLASS} ${CONNECTSTRING}
- eval ${TESTJAVA}/bin/java -DHANGINGJAVA_DEB ${DEBUGGERFLAGS} ${CP} ${TARGETCLASS} ${CONNECTSTRING}
- status=$?
- if [ $status -ne "0" ];
- then fail "$DEBUGGERMODEL to $TARGETMODEL test failed for class=$TARGETCLASS!"
- fi
- done
- done
-done
-#
-# pass or fail the test based on status of the command
-if [ $status -eq "0" ];
- then pass ""
-
- else fail "unspecified test failure"
-fi
--- a/jdk/test/com/sun/jdi/TestScaffold.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/TestScaffold.java Thu Oct 03 19:18:54 2013 +0100
@@ -746,8 +746,12 @@
requestManager.createStepRequest(thread, gran, depth);
sr.addClassExclusionFilter("java.*");
+ sr.addClassExclusionFilter("javax.*");
sr.addClassExclusionFilter("sun.*");
sr.addClassExclusionFilter("com.sun.*");
+ sr.addClassExclusionFilter("com.oracle.*");
+ sr.addClassExclusionFilter("oracle.*");
+ sr.addClassExclusionFilter("jdk.internal.*");
sr.addCountFilter(1);
sr.enable();
StepEvent retEvent = (StepEvent)waitForRequestedEvent(sr);
@@ -829,7 +833,8 @@
Method method = findMethod(rt, methodName, methodSignature);
if (method == null) {
- throw new IllegalArgumentException("Bad method name/signature");
+ throw new IllegalArgumentException("Bad method name/signature: "
+ + clsName + "." + methodName + ":" + methodSignature);
}
return resumeTo(method.location());
--- a/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -143,16 +143,7 @@
TransportService.ListenKey key = ts.startListening();
String exe = System.getProperty("java.home") + File.separator + "bin" +
- File.separator;
- String arch = System.getProperty("os.arch");
- String osname = System.getProperty("os.name");
- if (osname.equals("SunOS") && arch.equals("sparcv9")) {
- exe += "sparcv9/java";
- } else if (osname.equals("SunOS") && arch.equals("amd64")) {
- exe += "amd64/java";
- } else {
- exe += "java";
- }
+ File.separator + "java";
String cmd = exe + " -Xdebug -Xrunjdwp:transport=dt_socket,timeout=15000,address=" +
key.address() +
" -classpath " + System.getProperty("test.classes") +
--- a/jdk/test/demo/jvmti/DemoRun.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/demo/jvmti/DemoRun.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -125,28 +125,22 @@
String libprefix = os_name.contains("Windows")?"":"lib";
String libsuffix = os_name.contains("Windows")?".dll":
os_name.contains("OS X")?".dylib":".so";
- boolean d64 = ( os_name.contains("Solaris") ||
- os_name.contains("SunOS") )
- && ( os_arch.equals("sparcv9") ||
- os_arch.equals("amd64"));
boolean hprof = demo_name.equals("hprof");
- String isa_dir = d64?(File.separator+os_arch):"";
String java = jre_home
- + File.separator + "bin" + isa_dir
+ + File.separator + "bin"
+ File.separator + "java";
/* Array of strings to be passed in for exec:
* 1. java
* 2. -Dtest.classes=.
- * 3. -d64 (optional)
- * 4. -Xcheck:jni (Just because it finds bugs)
- * 5. -Xverify:all (Make sure verification is on full blast)
- * 6. -agent
+ * 3. -Xcheck:jni (Just because it finds bugs)
+ * 4. -Xverify:all (Make sure verification is on full blast)
+ * 5. -agent
* vm_options
- * 7+i. classname
+ * 6+i. classname
*/
int nvm_options = 0;
if ( vm_options != null ) nvm_options = vm_options.length;
- String cmd[] = new String[1 + (d64?1:0) + 7 + nvm_options];
+ String cmd[] = new String[1 + 7 + nvm_options];
String cmdLine;
int exitStatus;
int i,j;
@@ -160,10 +154,6 @@
cmdLine += (cmd[i++] = cdir);
cmdLine += " ";
cmdLine += (cmd[i++] = "-Dtest.classes=" + cdir);
- if ( d64 ) {
- cmdLine += " ";
- cmdLine += (cmd[i++] = "-d64");
- }
cmdLine += " ";
cmdLine += (cmd[i++] = "-Xcheck:jni");
cmdLine += " ";
@@ -178,7 +168,7 @@
+ File.separator + "demo"
+ File.separator + "jvmti"
+ File.separator + demo_name
- + File.separator + "lib" + isa_dir
+ + File.separator + "lib"
+ File.separator + libprefix + demo_name + libsuffix;
cmdLine += " ";
cmdLine += (cmd[i++] = "-agentpath:" + libname
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Cursor/CursorOverlappedPanelsTest/CursorOverlappedPanelsTest.html Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,32 @@
+<!--
+ Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<html>
+ <head>
+ <title>CursorOverlappedPanelsTest, bug ID 8007155</title>
+ </head>
+ <body>
+ <applet CODE="CursorOverlappedPanelsTest.class" WIDTH=300 HEIGHT=100></applet>
+ <p> See the dialog box (usually in upper left corner) for instructions</p>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Cursor/CursorOverlappedPanelsTest/CursorOverlappedPanelsTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.*;
+//import java.applet.Applet;
+import javax.swing.BorderFactory;
+import javax.swing.JApplet;
+import javax.swing.JFrame;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
+
+/**
+ * @test
+ * @bug 8007155
+ * @summary [macosx] Disabled panel takes mouse input in JLayeredPane
+ * @author Alexander Scherbatiy: area=java.awt.Cursor
+ * @run applet/manual=yesno CursorOverlappedPanelsTest.html
+ */
+public class CursorOverlappedPanelsTest extends JApplet {
+ //Declare things used in the test, like buttons and labels here
+
+ public void init() {
+ //Create instructions for the user here, as well as set up
+ // the environment -- set the layout manager, add buttons,
+ // etc.
+ this.setLayout(new BorderLayout());
+
+ String[] instructions = {
+ "Verify that the Crosshair cursor from enabled panel"
+ + " is displayed on the panels intersection",
+ "1) Move the mosue cursor on the Enabled and Disabled panels"
+ + " intersection",
+ "2) Check that the Crosshair cursor is displayed ",
+ "If so, press PASS, else press FAIL."
+ };
+ Sysout.createDialogWithInstructions(instructions);
+
+ }//End init()
+
+ public void start() {
+ //Get things going. Request focus, set size, et cetera
+ setSize(200, 200);
+ setVisible(true);
+ validate();
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }// start()
+
+ //The rest of this class is the actions which perform the test...
+ //Use Sysout.println to communicate with the user NOT System.out!!
+ //Sysout.println ("Something Happened!");
+ private static JPanel createPanel(Point location, boolean enabled) {
+ final JPanel panel = new JPanel();
+ panel.setOpaque(false);
+ panel.setEnabled(enabled);
+ panel.setSize(new Dimension(200, 200));
+ panel.setLocation(location);
+ panel.setBorder(BorderFactory.createTitledBorder(
+ enabled ? "Enabled" : "Disabled"));
+ panel.setCursor(Cursor.getPredefinedCursor(
+ enabled ? Cursor.CROSSHAIR_CURSOR : Cursor.DEFAULT_CURSOR));
+ System.out.println("cursor: " + Cursor.getPredefinedCursor(enabled ? Cursor.CROSSHAIR_CURSOR : Cursor.DEFAULT_CURSOR));
+ return panel;
+ }
+
+ private static void createAndShowGUI() {
+ final JFrame frame = new JFrame("Test");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ JLayeredPane layeredPane = new JLayeredPane();
+ layeredPane.setPreferredSize(new Dimension(400, 400));
+ JPanel enabledPanel = createPanel(new Point(10, 10), true);
+ JPanel disabledPanel = createPanel(new Point(100, 100), false);
+ layeredPane.add(disabledPanel, JLayeredPane.PALETTE_LAYER);
+ layeredPane.add(enabledPanel, JLayeredPane.DEFAULT_LAYER);
+
+ frame.getContentPane().add(layeredPane);
+ frame.pack();
+ frame.setVisible(true);
+ }
+}// class BlockedWindowTest
+
+/* Place other classes related to the test after this line */
+/**
+ * **************************************************
+ * Standard Test Machinery DO NOT modify anything below -- it's a standard chunk
+ * of code whose purpose is to make user interaction uniform, and thereby make
+ * it simpler to read and understand someone else's test.
+ * **************************************************
+ */
+/**
+ * This is part of the standard test machinery. It creates a dialog (with the
+ * instructions), and is the interface for sending text messages to the user. To
+ * print the instructions, send an array of strings to Sysout.createDialog
+ * WithInstructions method. Put one line of instructions per array entry. To
+ * display a message for the tester to see, simply call Sysout.println with the
+ * string to be displayed. This mimics System.out.println but works within the
+ * test harness as well as standalone.
+ */
+class Sysout {
+
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions(String[] instructions) {
+ dialog = new TestDialog(new Frame(), "Instructions");
+ dialog.printInstructions(instructions);
+ dialog.setVisible(true);
+ println("Any messages for the tester will display here.");
+ }
+
+ public static void createDialog() {
+ dialog = new TestDialog(new Frame(), "Instructions");
+ String[] defInstr = {"Instructions will appear here. ", ""};
+ dialog.printInstructions(defInstr);
+ dialog.setVisible(true);
+ println("Any messages for the tester will display here.");
+ }
+
+ public static void printInstructions(String[] instructions) {
+ dialog.printInstructions(instructions);
+ }
+
+ public static void println(String messageIn) {
+ dialog.displayMessage(messageIn);
+ }
+}// Sysout class
+
+/**
+ * This is part of the standard test machinery. It provides a place for the test
+ * instructions to be displayed, and a place for interactive messages to the
+ * user to be displayed. To have the test instructions displayed, see Sysout. To
+ * have a message to the user be displayed, see Sysout. Do not call anything in
+ * this dialog directly.
+ */
+class TestDialog extends Dialog {
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog(Frame frame, String name) {
+ super(frame, name);
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea("", 15, maxStringLength, scrollBoth);
+ add("North", instructionsText);
+
+ messageText = new TextArea("", 5, maxStringLength, scrollBoth);
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions(String[] instructions) {
+ //Clear out any current instructions
+ instructionsText.setText("");
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for (int i = 0; i < instructions.length; i++) {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i];
+ while (remainingStr.length() > 0) {
+ //if longer than max then chop off first max chars to print
+ if (remainingStr.length() >= maxStringLength) {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf(' ', maxStringLength - 1);
+
+ if (posOfSpace <= 0) {
+ posOfSpace = maxStringLength - 1;
+ }
+
+ printStr = remainingStr.substring(0, posOfSpace + 1);
+ remainingStr = remainingStr.substring(posOfSpace + 1);
+ } //else just print
+ else {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append(printStr + "\n");
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage(String messageIn) {
+ messageText.append(messageIn + "\n");
+ System.out.println(messageIn);
+ }
+}// TestDialog class
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Focus/KeyEventForBadFocusOwnerTest/KeyEventForBadFocusOwnerTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ @test
+ @bug 4476629
+ @library ../../../../javax/swing/regtesthelpers
+ @build Util
+ @summary KeyEvents dispatched to old focus owner that is no longer showing
+ @author son@sparc.spb.su: area=awt.focus
+ @run main KeyEventForBadFocusOwnerTest
+*/
+
+/**
+ * KeyEventForBadFocusOwnerTest.java
+ *
+ * summary: KeyEvents dispatched to old focus owner that is no longer showing
+ */
+
+
+import java.awt.Robot;
+import java.awt.Toolkit;
+
+import java.awt.event.*;
+
+import javax.swing.*;
+import javax.swing.event.*;
+import sun.awt.SunToolkit;
+
+public class KeyEventForBadFocusOwnerTest {
+ final static String ITEM_ONE_TEXT = "one";
+ final static String ITEM_TWO_TEXT = "two";
+
+ volatile static boolean itemOneSelected = false;
+ volatile static boolean itemTwoSelected = false;
+ volatile static boolean unexpectedItemSelected = false;
+
+ static Robot robot;
+ static SunToolkit toolkit;
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ JFrame frame = new JFrame("TEST");
+ JMenuBar mb = new JMenuBar();
+ JMenu one = new JMenu(ITEM_ONE_TEXT);
+ JMenu two = new JMenu(ITEM_TWO_TEXT);
+
+ mb.add(one);
+ mb.add(two);
+
+ ActionListener al = new ActionListener() {
+ public void actionPerformed(ActionEvent ae) {
+ String itemText = ((JMenuItem)ae.getSource()).getText();
+ System.out.println("--> " + itemText);
+ unexpectedItemSelected = true;
+ }
+ };
+ one.setMnemonic(KeyEvent.VK_O);
+ JMenuItem item = new JMenuItem("one 1");
+ item.setMnemonic(KeyEvent.VK_O);
+ item.addActionListener(al);
+ one.add(item);
+ one.add("two");
+ one.add("three");
+
+ two.setMnemonic(KeyEvent.VK_T);
+ item = new JMenuItem("two 2");
+ item.setMnemonic(KeyEvent.VK_T);
+ item.addActionListener(al);
+ two.add(item);
+ two.add("three");
+ two.add("four");
+
+ PopupMenuListener popupMenuListener = new PopupMenuListener() {
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ System.out.print(e);
+ System.out.print(e.getSource());
+ String itemText = ((JPopupMenu)e.getSource()).getName();
+ System.out.println("Menu " + itemText + "is opened.");
+ switch(itemText) {
+ case ITEM_ONE_TEXT:
+ itemOneSelected = true;
+ break;
+ case ITEM_TWO_TEXT:
+ itemTwoSelected = true;
+ break;
+ }
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+ public void popupMenuCanceled(PopupMenuEvent e) {}
+ };
+ one.getPopupMenu().setName(ITEM_ONE_TEXT);
+ two.getPopupMenu().setName(ITEM_TWO_TEXT);
+ one.getPopupMenu().addPopupMenuListener(popupMenuListener);
+ two.getPopupMenu().addPopupMenuListener(popupMenuListener);
+ frame.setJMenuBar(mb);
+ frame.setSize(100,100);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.pack();
+ frame.setVisible(true);
+ }
+ });
+
+ toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+
+ robot = new Robot();
+ robot.setAutoDelay(100);
+
+ Util.hitMnemonics(robot, KeyEvent.VK_O);
+ Util.hitMnemonics(robot, KeyEvent.VK_T);
+
+ toolkit.realSync();
+ Thread.sleep(1000); // workaround for MacOS
+
+ if (unexpectedItemSelected) {
+ throw new Exception("Test failed. KeyEvent dispatched to old focus owner. ");
+ }
+ if (!itemOneSelected || !itemTwoSelected) {
+ throw new Exception("Not all expected events were received");
+ }
+ }
+}
--- a/jdk/test/java/awt/FullScreen/TranslucentWindow/TranslucentWindow.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/awt/FullScreen/TranslucentWindow/TranslucentWindow.java Thu Oct 03 19:18:54 2013 +0100
@@ -42,6 +42,7 @@
GraphicsDevice gd = ge.getDefaultScreenDevice();
Frame f = new Frame("Test frame");
+ f.setUndecorated(true);
f.setBounds(100, 100, 320, 240);
// First, check it can be made fullscreen window without any effects applied
--- a/jdk/test/java/awt/MenuBar/MenuBarSetFont/MenuBarSetFont.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/awt/MenuBar/MenuBarSetFont/MenuBarSetFont.java Thu Oct 03 19:18:54 2013 +0100
@@ -65,6 +65,12 @@
}
public static void main(final String[] args) throws Exception {
+
+ if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.MACOSX) {
+ System.err.println("This test is not for OS X. Menu.setFont() is not supported on OS X.");
+ return;
+ }
+
//Components initialization.
frame.setMenuBar(mb);
mb.setFont(new Font("Helvetica", Font.ITALIC, 5));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/ModalDialogOrderingTest/ModalDialogOrderingTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import sun.awt.SunToolkit;
+/*
+ * @test
+ * @bug 8008728
+ * @summary [macosx] Swing. JDialog. Modal dialog goes to background
+ * @author Alexandr Scherbatiy
+ * @run main ModalDialogOrderingTest
+ */
+
+public class ModalDialogOrderingTest {
+
+ private static final Color DIALOG_COLOR = Color.GREEN;
+ private static final Color FRAME_COLOR = Color.BLUE;
+
+ public static void main(String[] args) {
+
+ final Frame frame = new Frame("Test");
+ frame.setSize(100, 100);
+ frame.setBackground(FRAME_COLOR);
+ frame.setVisible(true);
+
+ final Dialog modalDialog = new Dialog((Frame) null, true);
+ modalDialog.setTitle("Modal Dialog");
+ modalDialog.setSize(50, 50);
+ modalDialog.setBackground(DIALOG_COLOR);
+ modalDialog.setModal(true);
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ runTest(modalDialog, frame);
+ }
+ }).start();
+
+ modalDialog.setVisible(true);
+ }
+
+ private static void runTest(Dialog dialog, Frame frame) {
+ try {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(15);
+ robot.mouseMove(300, 300);
+
+ while (!dialog.isVisible()) {
+ toolkit.realSync();
+ }
+
+ Rectangle dialogBounds = dialog.getBounds();
+ Rectangle frameBounds = frame.getBounds();
+
+ double x0 = dialogBounds.getX();
+ double y0 = dialogBounds.getY();
+ double x1 = dialogBounds.getX() + dialogBounds.getWidth();
+ double y1 = dialogBounds.getY() + dialogBounds.getHeight();
+ double x2 = frameBounds.getX() + frameBounds.getWidth();
+ double y2 = frameBounds.getY() + frameBounds.getHeight();
+
+ int clickX = (int) ((x2 + x1) / 2);
+ int clickY = (int) ((y2 + y1) / 2);
+
+ robot.mouseMove(clickX, clickY);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ toolkit.realSync();
+
+ int colorX = (int) ((x0 + x1) / 2);
+ int colorY = (int) ((y0 + y1) / 2);
+
+ Color color = robot.getPixelColor(colorX, colorY);
+
+ dialog.setVisible(false);
+ frame.setVisible(false);
+
+ if (!DIALOG_COLOR.equals(color)) {
+ throw new RuntimeException("The frame is on top"
+ + " of the modal dialog!");
+ }
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Mouse/GetMousePositionTest/GetMousePositionWithOverlay.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import test.java.awt.regtesthelpers.Util;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @test
+ * @bug 8012026
+ * @summary Component.getMousePosition() does not work in an applet on MacOS
+ * @author Petr Pchelko
+ * @library ../../regtesthelpers
+ * @build Util
+ * @compile GetMousePositionWithOverlay.java
+ * @run main/othervm GetMousePositionWithOverlay
+ */
+
+public class GetMousePositionWithOverlay {
+
+ static Frame backFrame;
+ static Frame frontFrame;
+
+ public static void main(String[] args) throws Throwable {
+ try {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ constructTestUI();
+ }
+ });
+ Util.waitForIdle(null);
+
+ Robot r = new Robot();
+ Util.pointOnComp(frontFrame, r);
+ Util.waitForIdle(null);
+
+ Point pos = getMousePosition(backFrame);
+ if (pos != null) {
+ throw new RuntimeException("Test failed. Mouse position should be null but was" + pos);
+ }
+
+ pos = getMousePosition(frontFrame);
+ if (pos == null) {
+ throw new RuntimeException("Test failed. Mouse position should not be null");
+ }
+
+ r.mouseMove(189, 189);
+ Util.waitForIdle(null);
+
+ pos = getMousePosition(backFrame);
+ if (pos == null) {
+ throw new RuntimeException("Test failed. Mouse position should not be null");
+ }
+ } finally {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ backFrame.dispose();
+ frontFrame.dispose();
+ }
+ });
+ }
+ }
+
+ private static Point getMousePosition(final Component component) throws Exception {
+ final AtomicReference<Point> pos = new AtomicReference<Point>();
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ pos.set(component.getMousePosition());
+ }
+ });
+ return pos.get();
+ }
+
+ private static void constructTestUI() {
+ backFrame = new Frame();
+ backFrame.setBounds(100, 100, 100, 100);
+ backFrame.setVisible(true);
+
+ frontFrame = new Frame();
+ frontFrame.setBounds(120, 120, 60, 60);
+ frontFrame.setVisible(true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Mouse/GetMousePositionTest/GetMousePositionWithPopup.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import test.java.awt.regtesthelpers.Util;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
+
+/**
+ * @test
+ * @bug 8012026
+ * @summary Component.getMousePosition() does not work in an applet on MacOS
+ * @author Petr Pchelko
+ * @library ../../regtesthelpers
+ * @build Util
+ * @compile GetMousePositionWithPopup.java
+ * @run main/othervm GetMousePositionWithPopup
+ */
+
+public class GetMousePositionWithPopup {
+
+ private static Frame frame1;
+ private static Frame frame2;
+
+ public static void main(String[] args) throws Exception {
+ try {
+ Robot r = Util.createRobot();
+ r.mouseMove(0, 0);
+ Util.waitForIdle(null);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ constructTestUI();
+ }
+ });
+
+ Util.waitForIdle(null);
+ r.mouseMove(149, 149);
+ Util.waitForIdle(null);
+ r.mouseMove(150, 150);
+ Util.waitForIdle(null);
+
+ } finally {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ frame1.dispose();
+ frame2.dispose();
+ }
+ });
+ }
+ }
+
+ private static void constructTestUI() {
+ frame1 = new Frame();
+ frame1.setBounds(100, 100, 100, 100);
+ frame1.addMouseMotionListener(new MouseMotionAdapter() {
+
+ private boolean shown = false;
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ if (shown) {
+ return;
+ }
+
+ shown = true;
+
+ frame2 = new Frame();
+ frame2.setBounds(120, 120, 120, 120);
+ frame2.setVisible(true);
+
+ Point positionInFrame2 = frame2.getMousePosition();
+ if (positionInFrame2.x != 30 || positionInFrame2.y != 30) {
+ throw new RuntimeException("Wrong position reported. Should be [30, 30] but was [" +
+ positionInFrame2.x + ", " + positionInFrame2.y + "]");
+ }
+
+ Point positionInFrame1 = frame1.getMousePosition();
+ if (positionInFrame1 != null) {
+ throw new RuntimeException("Wrong position reported. Should be null");
+ }
+
+ }
+ });
+ frame1.setVisible(true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Toolkit/DynamicLayout/bug7172833.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+import java.awt.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.dnd.DragGestureEvent;
+import java.awt.dnd.InvalidDnDOperationException;
+import java.awt.dnd.peer.DragSourceContextPeer;
+import java.awt.font.TextAttribute;
+import java.awt.im.InputMethodHighlight;
+import java.awt.image.ColorModel;
+import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
+import java.awt.peer.*;
+import java.net.URL;
+import java.util.Map;
+import java.util.Properties;
+
+
+/**
+ * @test
+ * @bug 7172833
+ * @summary java.awt.Toolkit methods is/setDynamicLayout() should be consistent.
+ * @author Sergey Bylokhov
+ */
+public final class bug7172833 {
+
+ public static void main(final String[] args) throws Exception {
+ final StubbedToolkit t = new StubbedToolkit();
+
+ t.setDynamicLayout(true);
+ if(!t.isDynamicLayoutSet()){
+ throw new RuntimeException("'true' expected but 'false' returned");
+ }
+
+ t.setDynamicLayout(false);
+ if(t.isDynamicLayoutSet()){
+ throw new RuntimeException("'false' expected but 'true' returned");
+ }
+ }
+
+ static final class StubbedToolkit extends Toolkit {
+
+ @Override
+ protected boolean isDynamicLayoutSet() throws HeadlessException {
+ return super.isDynamicLayoutSet();
+ }
+
+ @Override
+ protected DesktopPeer createDesktopPeer(final Desktop target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected ButtonPeer createButton(final Button target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected TextFieldPeer createTextField(final TextField target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected LabelPeer createLabel(final Label target) throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected ListPeer createList(final List target) throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected CheckboxPeer createCheckbox(final Checkbox target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected ScrollbarPeer createScrollbar(final Scrollbar target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected ScrollPanePeer createScrollPane(final ScrollPane target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected TextAreaPeer createTextArea(final TextArea target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected ChoicePeer createChoice(final Choice target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected FramePeer createFrame(final Frame target) throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected CanvasPeer createCanvas(final Canvas target) {
+ return null;
+ }
+
+ @Override
+ protected PanelPeer createPanel(final Panel target) {
+ return null;
+ }
+
+ @Override
+ protected WindowPeer createWindow(final Window target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected DialogPeer createDialog(final Dialog target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected MenuBarPeer createMenuBar(final MenuBar target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected MenuPeer createMenu(final Menu target) throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected PopupMenuPeer createPopupMenu(final PopupMenu target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected MenuItemPeer createMenuItem(final MenuItem target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected FileDialogPeer createFileDialog(final FileDialog target)
+ throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected CheckboxMenuItemPeer createCheckboxMenuItem(
+ final CheckboxMenuItem target) throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected FontPeer getFontPeer(final String name, final int style) {
+ return null;
+ }
+
+ @Override
+ public Dimension getScreenSize() throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ public int getScreenResolution() throws HeadlessException {
+ return 0;
+ }
+
+ @Override
+ public ColorModel getColorModel() throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ public String[] getFontList() {
+ return new String[0];
+ }
+
+ @Override
+ public FontMetrics getFontMetrics(final Font font) {
+ return null;
+ }
+
+ @Override
+ public void sync() {
+
+ }
+
+ @Override
+ public Image getImage(final String filename) {
+ return null;
+ }
+
+ @Override
+ public Image getImage(final URL url) {
+ return null;
+ }
+
+ @Override
+ public Image createImage(final String filename) {
+ return null;
+ }
+
+ @Override
+ public Image createImage(final URL url) {
+ return null;
+ }
+
+ @Override
+ public boolean prepareImage(
+ final Image image, final int width, final int height,
+ final ImageObserver observer) {
+ return false;
+ }
+
+ @Override
+ public int checkImage(final Image image, final int width, final int height,
+ final ImageObserver observer) {
+ return 0;
+ }
+
+ @Override
+ public Image createImage(final ImageProducer producer) {
+ return null;
+ }
+
+ @Override
+ public Image createImage(final byte[] imagedata, final int imageoffset,
+ final int imagelength) {
+ return null;
+ }
+
+ @Override
+ public PrintJob getPrintJob(final Frame frame, final String jobtitle,
+ final Properties props) {
+ return null;
+ }
+
+ @Override
+ public void beep() {
+
+ }
+
+ @Override
+ public Clipboard getSystemClipboard() throws HeadlessException {
+ return null;
+ }
+
+ @Override
+ protected EventQueue getSystemEventQueueImpl() {
+ return null;
+ }
+
+ @Override
+ public DragSourceContextPeer createDragSourceContextPeer(
+ final DragGestureEvent dge) throws InvalidDnDOperationException {
+ return null;
+ }
+
+ @Override
+ public boolean isModalityTypeSupported(
+ final Dialog.ModalityType modalityType) {
+ return false;
+ }
+
+ @Override
+ public boolean isModalExclusionTypeSupported(
+ final Dialog.ModalExclusionType modalExclusionType) {
+ return false;
+ }
+
+ @Override
+ public Map<TextAttribute, ?> mapInputMethodHighlight(
+ final InputMethodHighlight highlight) throws HeadlessException {
+ return null;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Toolkit/ToolkitPropertyTest/bug7129133.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 7129133
+ * @summary [macosx] Accelerators are displayed as Meta instead of the Command symbol
+ * @author leonid.romanov@oracle.com
+ * @run main bug7129133
+ */
+
+import java.awt.*;
+
+public class bug7129133 {
+ public static void main(String[] args) throws Exception {
+ if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) {
+ System.out.println("This test is for MacOS only. Automatically passed on other platforms.");
+ return;
+ }
+
+ Toolkit.getDefaultToolkit();
+
+ String cmdSymbol = "\u2318";
+ String val = Toolkit.getProperty("AWT.meta", "Meta");
+
+ if (!val.equals(cmdSymbol)) {
+ throw new Exception("Wrong property value for AWT.meta. Expected: " + cmdSymbol + ", actual: " + val);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/TrayIcon/ShowAfterDisposeTest/ShowAfterDisposeTest.html Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,43 @@
+<html>
+<!--
+ Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<!--
+ @test
+ @bug 6384984 8004032
+ @summary TrayIcon try to dispay a tooltip when is not visible
+ @author Dmitry.Cherepanov@sun.com area=awt.tray
+ @run applet/manual=yesno ShowAfterDisposeTest.html
+ -->
+<head>
+<title> ShowAfterDisposeTest </title>
+</head>
+<body>
+
+<h1>ShowAfterDisposeTest<br>Bug ID: 6384984</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="ShowAfterDisposeTest.class" WIDTH=200 HEIGHT=200></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/TrayIcon/ShowAfterDisposeTest/ShowAfterDisposeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ test
+ @bug 6384984 8004032
+ @summary TrayIcon try to dispay a tooltip when is not visible
+ @author Dmitry.Cherepanov@sun.com area=awt.tray
+ @run applet/manual=yesno ShowAfterDisposeTest.html
+*/
+
+import java.applet.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.image.*;
+
+public class ShowAfterDisposeTest extends Applet
+{
+ boolean traySupported;
+
+ public void init()
+ {
+ this.setLayout (new BorderLayout ());
+
+ String[] instructions;
+ traySupported = SystemTray.isSupported();
+ if (traySupported)
+ {
+ String[] s =
+ {
+ "1) When the test starts an icon is added to the SystemTray area.",
+ "2a) If you use Apple OS X,",
+ " right click on this icon (it's important to click before the tooltip is shown).",
+ " The icon should disappear.",
+ "2b) If you use other os (Windows, Linux, Solaris),",
+ " double click on this icon (it's important to click before the tooltip is shown).",
+ " The icon should disappear.",
+ "3) If the bug is reproducible then the test will fail without assistance.",
+ "4) Just press the 'pass' button."
+ };
+ instructions = s;
+ }
+ else
+ {
+ String[] s =
+ {
+ "The test cannot be run because SystemTray is not supported.",
+ "Simply press PASS button."
+ };
+ instructions = s;
+ }
+ Sysout.createDialogWithInstructions(instructions);
+ }
+
+ public void start ()
+ {
+ setSize (200,200);
+ setVisible(true);
+ validate();
+
+ if (!traySupported)
+ {
+ return;
+ }
+
+ BufferedImage img = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB);
+ Graphics g = img.createGraphics();
+ g.setColor(Color.WHITE);
+ g.fillRect(0, 0, 32, 32);
+ g.setColor(Color.RED);
+ g.fillRect(6, 6, 20, 20);
+ g.dispose();
+
+ final SystemTray tray = SystemTray.getSystemTray();
+ final TrayIcon icon = new TrayIcon(img);
+ icon.setImageAutoSize(true);
+ icon.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent ev)
+ {
+ tray.remove(icon);
+ }
+ }
+ );
+
+ try {
+ tray.add(icon);
+ } catch (AWTException e) {
+ Sysout.println(e.toString());
+ Sysout.println("!!! The test coudn't be performed !!!");
+ return;
+ }
+ icon.setToolTip("tooltip");
+ }
+}
+
+/****************************************************
+ Standard Test Machinery
+ DO NOT modify anything below -- it's a standard
+ chunk of code whose purpose is to make user
+ interaction uniform, and thereby make it simpler
+ to read and understand someone else's test.
+ ****************************************************/
+
+/**
+ This is part of the standard test machinery.
+ It creates a dialog (with the instructions), and is the interface
+ for sending text messages to the user.
+ To print the instructions, send an array of strings to Sysout.createDialog
+ WithInstructions method. Put one line of instructions per array entry.
+ To display a message for the tester to see, simply call Sysout.println
+ with the string to be displayed.
+ This mimics System.out.println but works within the test harness as well
+ as standalone.
+ */
+
+class Sysout
+{
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions( String[] instructions )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ dialog.printInstructions( instructions );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void createDialog( )
+ {
+ dialog = new TestDialog( new Frame(), "Instructions" );
+ String[] defInstr = { "Instructions will appear here. ", "" } ;
+ dialog.printInstructions( defInstr );
+ dialog.setVisible(true);
+ println( "Any messages for the tester will display here." );
+ }
+
+ public static void printInstructions( String[] instructions )
+ {
+ dialog.printInstructions( instructions );
+ }
+
+ public static void println( String messageIn )
+ {
+ dialog.displayMessage( messageIn );
+ }
+}
+
+/**
+ This is part of the standard test machinery. It provides a place for the
+ test instructions to be displayed, and a place for interactive messages
+ to the user to be displayed.
+ To have the test instructions displayed, see Sysout.
+ To have a message to the user be displayed, see Sysout.
+ Do not call anything in this dialog directly.
+ */
+class TestDialog extends Dialog
+{
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog( Frame frame, String name )
+ {
+ super( frame, name );
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea( "", 15, maxStringLength, scrollBoth );
+ add( "North", instructionsText );
+
+ messageText = new TextArea( "", 5, maxStringLength, scrollBoth );
+ add("Center", messageText);
+
+ pack();
+
+ setVisible(true);
+ }
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions( String[] instructions )
+ {
+ //Clear out any current instructions
+ instructionsText.setText( "" );
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for( int i=0; i < instructions.length; i++ )
+ {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[ i ];
+ while( remainingStr.length() > 0 )
+ {
+ //if longer than max then chop off first max chars to print
+ if( remainingStr.length() >= maxStringLength )
+ {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf( ' ', maxStringLength - 1 );
+
+ if( posOfSpace <= 0 ) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring( 0, posOfSpace + 1 );
+ remainingStr = remainingStr.substring( posOfSpace + 1 );
+ }
+ //else just print
+ else
+ {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append( printStr + "\n" );
+ }
+ }
+ }
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage( String messageIn )
+ {
+ messageText.append( messageIn + "\n" );
+ System.out.println(messageIn);
+ }
+}
--- a/jdk/test/java/awt/Window/MaximizeOffscreen/MaximizeOffscreenTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/awt/Window/MaximizeOffscreen/MaximizeOffscreenTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,6 +23,7 @@
/**
* @test @summary JVM crash if the frame maximized from offscreen
+ * @bug 8020210
* @author Petr Pchelko
* @library ../../regtesthelpers
* @build Util
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/ExtendedKeyCode/ExtendedKeyCodeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyAdapter;
+import sun.awt.ExtendedKeyCodes;
+import sun.awt.SunToolkit;
+
+/*
+ * @test
+ * @bug 8007156
+ * @summary Extended key code is not set for a key event
+ * @author Alexandr Scherbatiy
+ * @run main ExtendedKeyCodeTest
+ */
+public class ExtendedKeyCodeTest {
+
+ private static volatile boolean setExtendedKeyCode = true;
+ private static volatile int eventsCount = 0;
+
+ public static void main(String[] args) throws Exception {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+
+ Frame frame = new Frame();
+ frame.setSize(300, 300);
+
+ frame.addKeyListener(new KeyAdapter() {
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ eventsCount++;
+ setExtendedKeyCode = setExtendedKeyCode && (e.getExtendedKeyCode()
+ == ExtendedKeyCodes.getExtendedKeyCodeForChar(e.getKeyChar()));
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ eventsCount++;
+ setExtendedKeyCode = setExtendedKeyCode && (e.getExtendedKeyCode()
+ == ExtendedKeyCodes.getExtendedKeyCodeForChar(e.getKeyChar()));
+ }
+ });
+
+ frame.setVisible(true);
+ toolkit.realSync();
+
+ robot.keyPress(KeyEvent.VK_D);
+ robot.keyRelease(KeyEvent.VK_D);
+ toolkit.realSync();
+
+ frame.dispose();
+
+ if (eventsCount != 2 || !setExtendedKeyCode) {
+ throw new RuntimeException("Wrong extended key code");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/KeyEvent/KeyChar/KeyCharTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.AWTEvent;
+import java.awt.Frame;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.AWTEventListener;
+import java.awt.event.KeyEvent;
+import java.util.Locale;
+import sun.awt.SunToolkit;
+
+/*
+ * @test
+ * @bug 8022401
+ * @summary Wrong key char
+ * @author Alexandr Scherbatiy
+ * @run main KeyCharTest
+ */
+public class KeyCharTest {
+
+ private static volatile int eventsCount = 0;
+
+ static {
+ Locale.setDefault(Locale.ENGLISH);
+
+ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+
+ @Override
+ public void eventDispatched(AWTEvent event) {
+ eventsCount++;
+ char delete = ((KeyEvent) event).getKeyChar();
+ if (delete != '\u007f') {
+ throw new RuntimeException("Key char is not delete: '" + delete + "'");
+ }
+ }
+ }, AWTEvent.KEY_EVENT_MASK);
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+
+ Frame frame = new Frame();
+ frame.setSize(300, 300);
+ frame.setVisible(true);
+ toolkit.realSync();
+
+ Robot robot = new Robot();
+
+ robot.keyPress(KeyEvent.VK_DELETE);
+ robot.keyRelease(KeyEvent.VK_DELETE);
+ toolkit.realSync();
+
+ frame.dispose();
+
+ if (eventsCount != 3) {
+ throw new RuntimeException("Wrong number of key events: " + eventsCount);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/font/TransformAttribute/TransformEqualityTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary test equals method
+ * @bug 7092764
+ */
+
+import java.awt.font.TransformAttribute;
+import java.awt.geom.AffineTransform;
+
+public class TransformEqualityTest {
+
+ public static void main(String[] args) {
+ AffineTransform tx1 = new AffineTransform(1, 0, 1, 1, 0, 0);
+ AffineTransform tx2 = new AffineTransform(1, 0, 1, 1, 0, 0);
+ AffineTransform tx3 = new AffineTransform(2, 0, 1, 1, 0, 0);
+ TransformAttribute ta1a = new TransformAttribute(tx1);
+ TransformAttribute ta1b = new TransformAttribute(tx1);
+ TransformAttribute ta2 = new TransformAttribute(tx2);
+ TransformAttribute ta3 = new TransformAttribute(tx3);
+ if (ta1a.equals(null)) {
+ throw new RuntimeException("should not be equal to null.");
+ }
+ if (!ta1a.equals(ta1a)) {
+ throw new RuntimeException("(1) should be equal.");
+ }
+ if (!ta1a.equals(ta1b)) {
+ throw new RuntimeException("(2) should be equal.");
+ }
+ if (!ta1a.equals(ta2)) {
+ throw new RuntimeException("(3) should be equal.");
+ }
+ if (ta2.equals(ta3)) {
+ throw new RuntimeException("should be different.");
+ }
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/DrawImage/EABlitTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.util.*;
+import javax.swing.*;
+
+/**
+ * @test
+ * @bug 8024895
+ * @summary tests if changing extra alpha values are honored for transformed blits
+ * @author ceisserer
+ */
+public class EABlitTest extends Frame {
+ protected void test() {
+ BufferedImage srcImg = createSrcImage();
+ Image dstImg = getGraphicsConfiguration().createCompatibleVolatileImage(20, 50);
+
+ //be over-cautious and render twice to avoid BI caching issues
+ renderToVI(srcImg, dstImg);
+ renderToVI(srcImg, dstImg);
+
+ BufferedImage validationImg = new BufferedImage(20, 50, BufferedImage.TYPE_INT_RGB);
+ Graphics2D valG = (Graphics2D) validationImg.getGraphics();
+ valG.drawImage(dstImg, 0, 0, null);
+
+ //Loop over all pixel, and count the different pixel values encountered.
+ TreeSet<Integer> colorCntSet = new TreeSet<>();
+ for (int x=0; x < validationImg.getWidth(); x++) {
+ for (int y=0; y < validationImg.getHeight(); y++) {
+ int rgb = validationImg.getRGB(x, y);
+ colorCntSet.add(rgb);
+ }
+ }
+
+ //Check if we encountered 3 different color values in total
+ if (colorCntSet.size() == 3) {
+ System.out.println("Passed!");
+ } else {
+ throw new RuntimeException("Test FAILED!");
+ }
+ }
+
+ protected void renderToVI(BufferedImage src, Image dst) {
+ Graphics2D g = (Graphics2D) dst.getGraphics();
+
+ g.setColor(Color.WHITE);
+ g.fillRect(0, 0, 50, 50);
+ g.rotate(0.5f);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY);
+
+ g.setComposite(AlphaComposite.SrcOver.derive(1f));
+ g.drawImage(src, 10, 10, null);
+
+ g.setComposite(AlphaComposite.SrcOver.derive(0.5f));
+ g.drawImage(src, 20, 20, null);
+ }
+
+ protected BufferedImage createSrcImage() {
+ BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = (Graphics2D) bi.getGraphics();
+ g.setColor(Color.YELLOW);
+ g.fillRect(0, 0, 10, 10);
+ return bi;
+ }
+
+ public static void main(String[] args) {
+ new EABlitTest().test();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/bug8023392/bug8023392.html Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,20 @@
+<html>
+<!--
+ @test
+ @bug 8023392
+ @summary Swing text components printed with spaces between chars
+ @author Anton Nashatyrev
+ @run applet/manual=yesno bug8023392.html
+ -->
+<head>
+ <title> Bug 8023392 </title>
+</head>
+<body>
+
+<h1>Bug ID: 8023392</h1>
+
+<p> See the dialog box (usually in upper left corner) for instructions</p>
+
+<APPLET CODE="bug8023392.class" WIDTH=400 HEIGHT=400></APPLET>
+</body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/print/bug8023392/bug8023392.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ test
+ @bug 8023392
+ @summary Swing text components printed with spaces between chars
+ @author Anton Nashatyrev
+ @run applet/manual=yesno bug8023392.html
+*/
+
+import javax.swing.*;
+import javax.swing.border.LineBorder;
+import java.applet.Applet;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.font.TextAttribute;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterJob;
+import java.text.AttributedCharacterIterator;
+import java.text.AttributedString;
+
+
+public class bug8023392 extends Applet {
+ static final String[] instructions = {
+ "A Frame containing several pairs of labels ((a) and (b)) is displayed.",
+ "Labels of each pair look the same and are left-aligned (with spaces ",
+ "between chars).",
+ "1. Hit the print button.",
+ "2. Select any available printer (printing to file is also fine).",
+ "3. Look at the printing result (paper, PDF, PS, etc.):",
+ " The (a) and (b) labels should look almost the same and the (a) labels",
+ " shouldn't appear as if they are stretched along X axis."};
+
+ public void init() {
+ this.setLayout(new BorderLayout());
+ add(new SimplePrint2(), BorderLayout.CENTER);
+
+ Sysout.createDialogWithInstructions(instructions);
+
+ }
+
+ public static class SimplePrint2 extends JPanel
+ implements ActionListener, Printable {
+ JLabel label1;
+ JLabel label2;
+ JButton printButton;
+
+
+ public SimplePrint2() {
+ setLayout(new BorderLayout());
+ label1 = new JLabel("2a) a b c d e" +
+ " ");
+ label2 = new JLabel("2b) a b c d e");
+
+ Box p1 = new Box(BoxLayout.Y_AXIS);
+ p1.add(label1);
+ p1.add(label2);
+ p1.add(new JLabel("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww") {
+ String s = "3a) a b c d e ";
+ @Override
+ protected void paintComponent(Graphics g) {
+ sun.swing.SwingUtilities2.drawChars(this, g, s.toCharArray(),
+ 0, s.length(), 0, 15);
+ }
+ });
+ p1.add(new JLabel("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww") {
+ String s = "3b) a b c d e";
+ @Override
+ protected void paintComponent(Graphics g) {
+ sun.swing.SwingUtilities2.drawChars(this, g, s.toCharArray(),
+ 0, s.length(), 0, 15);
+ }
+ });
+ p1.add(new JLabel("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww") {
+ String s = "4a) a b c d e ";
+ AttributedCharacterIterator it;
+ {
+ AttributedString as = new AttributedString(s);
+ as.addAttribute(TextAttribute.FONT, getFont());
+ as.addAttribute(TextAttribute.FOREGROUND, Color.RED, 3, 8);
+ it = as.getIterator();
+ }
+ @Override
+ protected void paintComponent(Graphics g) {
+ sun.swing.SwingUtilities2.drawString(this, g, it, 0, 15);
+ }
+ });
+
+ p1.add(new JLabel("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww") {
+ String s = "4b) a b c d e";
+ AttributedCharacterIterator it;
+ {
+ AttributedString as = new AttributedString(s);
+ as.addAttribute(TextAttribute.FONT, getFont());
+ as.addAttribute(TextAttribute.FOREGROUND, Color.RED, 3, 8);
+ it = as.getIterator();
+ }
+ @Override
+ protected void paintComponent(Graphics g) {
+ sun.swing.SwingUtilities2.drawString(this, g, it, 0, 15);
+ }
+ });
+
+ JPanel p2 = new JPanel();
+ printButton = new JButton("Print");
+ printButton.addActionListener(this);
+ p2.add(printButton);
+
+ Container c = this;
+ c.add(p1, BorderLayout.CENTER);
+ c.add(p2, BorderLayout.SOUTH);
+
+ String[] data = {
+ "1a) \u30aa\u30f3\u30e9\u30a4\u30f3\u6d88\u8fbc" +
+ " ",
+ "1b) \u30aa\u30f3\u30e9\u30a4\u30f3\u6d88\u8fbc"
+ };
+ JList l0 = new JList(data);
+ l0.setVisibleRowCount(l0.getModel().getSize());
+ JScrollPane jsp = new JScrollPane(l0);
+ l0.setBorder(new LineBorder(Color.GRAY));
+ c.add(jsp, BorderLayout.NORTH);
+
+ for (Component comp : new Component[]{label1, label2, printButton}) {
+ comp.setFont(new Font("Monospaced", 0, 16));
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ PrinterJob job = PrinterJob.getPrinterJob();
+ job.setPrintable(this);
+ if (job.printDialog()) {
+ try {
+ job.print();
+ } catch (PrinterException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+
+ public int print(Graphics graphics,
+ PageFormat pageFormat,
+ int pageIndex)
+ throws PrinterException {
+ if (pageIndex >= 1) {
+ return Printable.NO_SUCH_PAGE;
+ }
+
+ this.paint(graphics);
+ return Printable.PAGE_EXISTS;
+ }
+ }
+}
+
+
+/**
+ * *************************************************
+ * Standard Test Machinery
+ * DO NOT modify anything below -- it's a standard
+ * chunk of code whose purpose is to make user
+ * interaction uniform, and thereby make it simpler
+ * to read and understand someone else's test.
+ * **************************************************
+ */
+class Sysout {
+ private static TestDialog dialog;
+
+ public static void createDialogWithInstructions(String[] instructions) {
+ dialog = new TestDialog(new Frame(), "Instructions");
+ dialog.printInstructions(instructions);
+ dialog.show();
+ println("Any messages for the tester will display here.");
+ }
+
+ public static void createDialog() {
+ dialog = new TestDialog(new Frame(), "Instructions");
+ String[] defInstr = {"Instructions will appear here. ", ""};
+ dialog.printInstructions(defInstr);
+ dialog.show();
+ println("Any messages for the tester will display here.");
+ }
+
+
+ public static void printInstructions(String[] instructions) {
+ dialog.printInstructions(instructions);
+ }
+
+
+ public static void println(String messageIn) {
+ dialog.displayMessage(messageIn);
+ }
+
+}// Sysout class
+
+
+class TestDialog extends Dialog {
+
+ TextArea instructionsText;
+ TextArea messageText;
+ int maxStringLength = 80;
+
+ //DO NOT call this directly, go through Sysout
+ public TestDialog(Frame frame, String name) {
+ super(frame, name);
+ int scrollBoth = TextArea.SCROLLBARS_BOTH;
+ instructionsText = new TextArea("", 15, maxStringLength, scrollBoth);
+ add("North", instructionsText);
+
+ messageText = new TextArea("", 5, maxStringLength, scrollBoth);
+ add("South", messageText);
+
+ pack();
+
+ show();
+ }// TestDialog()
+
+ //DO NOT call this directly, go through Sysout
+ public void printInstructions(String[] instructions) {
+ //Clear out any current instructions
+ instructionsText.setText("");
+
+ //Go down array of instruction strings
+
+ String printStr, remainingStr;
+ for (int i = 0; i < instructions.length; i++) {
+ //chop up each into pieces maxSringLength long
+ remainingStr = instructions[i];
+ while (remainingStr.length() > 0) {
+ //if longer than max then chop off first max chars to print
+ if (remainingStr.length() >= maxStringLength) {
+ //Try to chop on a word boundary
+ int posOfSpace = remainingStr.
+ lastIndexOf(' ', maxStringLength - 1);
+
+ if (posOfSpace <= 0) posOfSpace = maxStringLength - 1;
+
+ printStr = remainingStr.substring(0, posOfSpace + 1);
+ remainingStr = remainingStr.substring(posOfSpace + 1);
+ }
+ //else just print
+ else {
+ printStr = remainingStr;
+ remainingStr = "";
+ }
+
+ instructionsText.append(printStr + "\n");
+
+ }// while
+
+ }// for
+
+ }//printInstructions()
+
+ //DO NOT call this directly, go through Sysout
+ public void displayMessage(String messageIn) {
+ messageText.append(messageIn + "\n");
+ }
+
+}// TestDialog class
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/beans/Introspector/Test7172865.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.beans.IndexedPropertyDescriptor;
+import java.beans.MethodDescriptor;
+import java.beans.PropertyDescriptor;
+
+/*
+ * @test
+ * @bug 7172854 7172865
+ * @summary Tests that cached methods are not lost
+ * @author Sergey Malenkov
+ */
+
+public class Test7172865 {
+ public static void main(String[] args) throws Exception {
+ int errors = 0;
+
+ MethodDescriptor md = new MethodDescriptor(Test7172865.class.getMethod("getGood"));
+
+ errors += test(PropertyDescriptor.class, "good", true);
+ PropertyDescriptor pdGoodString = new PropertyDescriptor("good", Test7172865.class, "getGood", "setGood");
+ PropertyDescriptor pdGoodMethod = new PropertyDescriptor("good",
+ Test7172865.class.getMethod("getGood"),
+ Test7172865.class.getMethod("setGood", args.getClass()));
+
+ errors += test(PropertyDescriptor.class, "bad", false);
+ PropertyDescriptor pdBadString = new PropertyDescriptor("bad", Test7172865.class, "getBad", null);
+ PropertyDescriptor pdBadMethod = new PropertyDescriptor("bad",
+ Test7172865.class.getMethod("getBad"),
+ Test7172865.class.getMethod("setBad", args.getClass()));
+
+ errors += test(IndexedPropertyDescriptor.class, "good", true);
+ IndexedPropertyDescriptor ipdGoodString = new IndexedPropertyDescriptor("good", Test7172865.class, "getGood", "setGood", "getGood", "setGood");
+ IndexedPropertyDescriptor ipdGoodMethod = new IndexedPropertyDescriptor("good",
+ Test7172865.class.getMethod("getGood"),
+ Test7172865.class.getMethod("setGood", args.getClass()),
+ Test7172865.class.getMethod("getGood", Integer.TYPE),
+ Test7172865.class.getMethod("setGood", Integer.TYPE, String.class));
+
+ errors += test(IndexedPropertyDescriptor.class, "bad", false);
+ IndexedPropertyDescriptor ipdBadString = new IndexedPropertyDescriptor("bad", Test7172865.class, "getBad", null, "getBad", null);
+ IndexedPropertyDescriptor ipdBadMethod = new IndexedPropertyDescriptor("bad",
+ Test7172865.class.getMethod("getBad"),
+ Test7172865.class.getMethod("setBad", args.getClass()),
+ Test7172865.class.getMethod("getBad", Integer.TYPE),
+ Test7172865.class.getMethod("setBad", Integer.TYPE, String.class));
+
+ for (int i = 1; i <= 2; i++) {
+ System.out.println("STEP: " + i);
+ errors += test("md", null != md.getMethod());
+
+ errors += test("pdGoodString", pdGoodString, true, true);
+ errors += test("pdGoodMethod", pdGoodMethod, true, true);
+
+ errors += test("pdBadString", pdBadString, true, false);
+ errors += test("pdBadMethod", pdBadMethod, true, true);
+
+ errors += test("ipdGoodString", ipdGoodString, true, true, true, true);
+ errors += test("ipdGoodMethod", ipdGoodMethod, true, true, true, true);
+
+ errors += test("ipdBadString", ipdBadString, true, false, true, false);
+ errors += test("ipdBadMethod", ipdBadMethod, true, true, true, true);
+
+ try {
+ int[] array = new int[1024];
+ while (true) {
+ array = new int[array.length << 1];
+ }
+ }
+ catch (OutOfMemoryError error) {
+ System.gc();
+ }
+ }
+ if (errors > 0) {
+ throw new Error("found " + errors + " errors");
+ }
+ }
+
+ private static int test(Class<?> type, String property, boolean value) {
+ String message = type.getSimpleName() + "(" + property + ") ";
+ try {
+ type.getConstructor(String.class, Class.class).newInstance(property, Test7172865.class);
+ message += "passed";
+ }
+ catch (Exception exception) {
+ message += "failed";
+ value = !value;
+ }
+ if (value) {
+ message += " as expected";
+ }
+ System.out.println(message);
+ return value ? 0 : 1;
+ }
+
+ private static int test(String message, boolean value) {
+ System.out.println(message + ": " + (value ? "passed" : "failed"));
+ return value ? 0 : 1;
+ }
+
+ private static int test(String message, PropertyDescriptor pd, boolean rm, boolean wm) {
+ return test(message + ".Read", rm == (null != pd.getReadMethod()))
+ + test(message + ".Write", wm == (null != pd.getWriteMethod()));
+ }
+
+ private static int test(String message, IndexedPropertyDescriptor ipd, boolean rm, boolean wm, boolean irm, boolean iwm) {
+ return test(message, ipd, rm, wm)
+ + test(message + ".IndexedRead", irm == (null != ipd.getIndexedReadMethod()))
+ + test(message + ".IndexedWrite", iwm == (null != ipd.getIndexedWriteMethod()));
+ }
+
+ public String[] getGood() {
+ return null;
+ }
+
+ public String getGood(int index) {
+ return null;
+ }
+
+ public void setGood(String[] good) {
+ }
+
+ public void setGood(int index, String value) {
+ }
+
+ public String[] getBad() {
+ return null;
+ }
+
+ public String getBad(int index) {
+ return null;
+ }
+
+ public Test7172865 setBad(String[] bad) {
+ return null;
+ }
+
+ public Test7172865 setBad(int index, String value) {
+ return null;
+ }
+}
--- a/jdk/test/java/beans/Performance/Test7122740.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/beans/Performance/Test7122740.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 7122740
+ * @bug 7187618 7122740
* @summary Tests just a benchmark of PropertyDescriptor(String, Class) performance
* @author Sergey Malenkov
* @run main/manual Test7122740
--- a/jdk/test/java/beans/Performance/Test7184799.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/beans/Performance/Test7184799.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 7184799
+ * @bug 7187618 7184799
* @summary Tests just a benchmark of Introspector.getBeanInfo(Class) performance
* @author Sergey Malenkov
* @run main/manual Test7184799
--- a/jdk/test/java/lang/CharSequence/DefaultTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/lang/CharSequence/DefaultTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,7 @@
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PrimitiveIterator;
+import java.util.Spliterator;
import java.util.stream.Collectors;
import org.testng.annotations.Test;
@@ -34,7 +35,7 @@
/*
* @test
* @summary Unit test for CharSequence default methods
- * @bug 8012665
+ * @bug 8012665 8025002
* @run testng DefaultTest
*/
@@ -53,6 +54,12 @@
assertEquals(list, Arrays.asList((int) 'a', (int) 'b', (int) 'c'));
}
+ public void testCodePointsCharacteristics() {
+ Spliterator.OfInt s = "".codePoints().spliterator();
+ assertFalse(s.hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
+ assertTrue(s.hasCharacteristics(Spliterator.ORDERED));
+ }
+
@Test(expectedExceptions = NoSuchElementException.class)
public void testEmptyCodePoints() {
PrimitiveIterator.OfInt s = "".codePoints().iterator();
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java Thu Oct 03 19:18:54 2013 +0100
@@ -298,11 +298,15 @@
System.exit(5);
System.err.print("standard error");
System.out.print("standard output");
- } else if (action.equals("testInheritIO")) {
+ } else if (action.equals("testInheritIO")
+ || action.equals("testRedirectInherit")) {
List<String> childArgs = new ArrayList<String>(javaChildArgs);
childArgs.add("testIO");
ProcessBuilder pb = new ProcessBuilder(childArgs);
- pb.inheritIO();
+ if (action.equals("testInheritIO"))
+ pb.inheritIO();
+ else
+ redirectIO(pb, INHERIT, INHERIT, INHERIT);
ProcessResults r = run(pb);
if (! r.out().equals(""))
System.exit(7);
@@ -1019,10 +1023,10 @@
// Note that this requires __FOUR__ nested JVMs involved in one test,
// if you count the harness JVM.
//----------------------------------------------------------------
- {
+ for (String testName : new String[] { "testInheritIO", "testRedirectInherit" } ) {
redirectIO(pb, PIPE, PIPE, PIPE);
List<String> command = pb.command();
- command.set(command.size() - 1, "testInheritIO");
+ command.set(command.size() - 1, testName);
Process p = pb.start();
new PrintStream(p.getOutputStream()).print("standard input");
p.getOutputStream().close();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/InheritIO/InheritIO.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import static java.lang.ProcessBuilder.Redirect.*;
+
+class InheritIO {
+
+ public static class TestInheritIO {
+ public static void main(String args[]) throws Throwable {
+ int err = new ProcessBuilder(args).inheritIO().start().waitFor();
+ System.err.print("exit value: " + err);
+ System.exit(err);
+ }
+ }
+
+ public static class TestRedirectInherit {
+ public static void main(String args[]) throws Throwable {
+ int err = new ProcessBuilder(args)
+ .redirectInput(INHERIT)
+ .redirectOutput(INHERIT)
+ .redirectError(INHERIT)
+ .start().waitFor();
+ System.err.print("exit value: " + err);
+ System.exit(err);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/InheritIO/InheritIO.sh Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+#
+
+# @test
+# @bug 8023130
+# @summary (process) ProcessBuilder#inheritIO does not work on Windows
+# @run shell InheritIO.sh
+
+if [ "x${TESTSRC}" = "x" ]; then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "x${TESTJAVA}" = "x" ]; then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+
+JAVA="${TESTJAVA}/bin/java"
+JAVAC="${TESTJAVA}/bin/javac"
+
+cp -f ${TESTSRC}/InheritIO.java .
+
+# compile the class ourselves, so this can run as a standalone test
+
+${JAVAC} InheritIO.java
+RES="$?"
+if [ ${RES} != 0 ]; then
+ echo 'FAIL: Cannot compile InheritIO.java'
+ exit ${RES}
+fi
+
+
+for TEST_NAME in TestInheritIO TestRedirectInherit
+do
+ ${JAVA} ${TESTVMOPTS} -classpath . \
+ 'InheritIO$'${TEST_NAME} printf message > stdout.txt 2> stderr.txt
+
+ RES="$?"
+ if [ ${RES} != 0 ]; then
+ echo 'FAIL: InheritIO$'${TEST_NAME}' failed with '${RES}
+ exit ${RES}
+ fi
+
+ OUT_EXPECTED='message'
+ OUT_RECEIVED=`cat stdout.txt`
+ if [ "x${OUT_RECEIVED}" != "x${OUT_EXPECTED}" ]; then
+ echo "FAIL: unexpected '${OUT_RECEIVED}' in stdout"
+ exit 1
+ fi
+
+ ERR_EXPECTED='exit value: 0'
+ ERR_RECEIVED=`cat stderr.txt`
+ if [ "x${ERR_RECEIVED}" != "x${ERR_EXPECTED}" ]; then
+ echo "FAIL: unexpected '${ERR_RECEIVED}' in stderr"
+ exit 1
+ fi
+done
+
+echo 'PASS: InheritIO works as expected'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/annotation/AnnotationsInheritanceOrderRedefinitionTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8011940
+ * @summary Test inheritance, order and class redefinition behaviour of RUNTIME
+ * class annotations
+ * @author plevart
+ */
+
+import sun.reflect.annotation.AnnotationParser;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.StringJoiner;
+
+public class AnnotationsInheritanceOrderRedefinitionTest {
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Inherited
+ @interface Ann1 {
+ String value();
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Inherited
+ @interface Ann2 {
+ String value();
+ }
+
+ @Retention(RetentionPolicy.RUNTIME)
+ @Inherited
+ @interface Ann3 {
+ String value();
+ }
+
+ @Ann1("A")
+ @Ann2("A")
+ static class A {}
+
+ @Ann3("B")
+ static class B extends A {}
+
+ @Ann1("C")
+ @Ann3("C")
+ static class C extends B {}
+
+ public static void main(String[] args) {
+
+ StringBuilder msgs = new StringBuilder();
+ boolean ok = true;
+
+ ok &= annotationsEqual(msgs, A.class, true,
+ ann(Ann1.class, "A"), ann(Ann2.class, "A"));
+ ok &= annotationsEqual(msgs, A.class, false,
+ ann(Ann1.class, "A"), ann(Ann2.class, "A"));
+ ok &= annotationsEqual(msgs, B.class, true,
+ ann(Ann3.class, "B"));
+ ok &= annotationsEqual(msgs, B.class, false,
+ ann(Ann1.class, "A"), ann(Ann2.class, "A"), ann(Ann3.class, "B"));
+ ok &= annotationsEqual(msgs, C.class, true,
+ ann(Ann1.class, "C"), ann(Ann3.class, "C"));
+ ok &= annotationsEqual(msgs, C.class, false,
+ ann(Ann1.class, "C"), ann(Ann2.class, "A"), ann(Ann3.class, "C"));
+
+ Annotation[] declaredAnnotatiosA = A.class.getDeclaredAnnotations();
+ Annotation[] annotationsA = A.class.getAnnotations();
+ Annotation[] declaredAnnotatiosB = B.class.getDeclaredAnnotations();
+ Annotation[] annotationsB = B.class.getAnnotations();
+ Annotation[] declaredAnnotatiosC = C.class.getDeclaredAnnotations();
+ Annotation[] annotationsC = C.class.getAnnotations();
+
+ incrementClassRedefinedCount(A.class);
+ incrementClassRedefinedCount(B.class);
+ incrementClassRedefinedCount(C.class);
+
+ ok &= annotationsEqualButNotSame(msgs, A.class, true, declaredAnnotatiosA);
+ ok &= annotationsEqualButNotSame(msgs, A.class, false, annotationsA);
+ ok &= annotationsEqualButNotSame(msgs, B.class, true, declaredAnnotatiosB);
+ ok &= annotationsEqualButNotSame(msgs, B.class, false, annotationsB);
+ ok &= annotationsEqualButNotSame(msgs, C.class, true, declaredAnnotatiosC);
+ ok &= annotationsEqualButNotSame(msgs, C.class, false, annotationsC);
+
+ if (!ok) {
+ throw new RuntimeException("test failure\n" + msgs);
+ }
+ }
+
+ // utility methods
+
+ private static boolean annotationsEqualButNotSame(StringBuilder msgs,
+ Class<?> declaringClass, boolean declaredOnly, Annotation[] oldAnns) {
+ if (!annotationsEqual(msgs, declaringClass, declaredOnly, oldAnns)) {
+ return false;
+ }
+ Annotation[] anns = declaredOnly
+ ? declaringClass.getDeclaredAnnotations()
+ : declaringClass.getAnnotations();
+ List<Annotation> sameAnns = new ArrayList<>();
+ for (int i = 0; i < anns.length; i++) {
+ if (anns[i] == oldAnns[i]) {
+ sameAnns.add(anns[i]);
+ }
+ }
+ if (!sameAnns.isEmpty()) {
+ msgs.append(declaredOnly ? "declared " : "").append("annotations for ")
+ .append(declaringClass.getSimpleName())
+ .append(" not re-parsed after class redefinition: ")
+ .append(toSimpleString(sameAnns)).append("\n");
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ private static boolean annotationsEqual(StringBuilder msgs,
+ Class<?> declaringClass, boolean declaredOnly, Annotation... expectedAnns) {
+ Annotation[] anns = declaredOnly
+ ? declaringClass.getDeclaredAnnotations()
+ : declaringClass.getAnnotations();
+ if (!Arrays.equals(anns, expectedAnns)) {
+ msgs.append(declaredOnly ? "declared " : "").append("annotations for ")
+ .append(declaringClass.getSimpleName()).append(" are: ")
+ .append(toSimpleString(anns)).append(", expected: ")
+ .append(toSimpleString(expectedAnns)).append("\n");
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ private static Annotation ann(Class<? extends Annotation> annotationType,
+ Object value) {
+ return AnnotationParser.annotationForMap(annotationType,
+ Collections.singletonMap("value", value));
+ }
+
+ private static String toSimpleString(List<Annotation> anns) {
+ return toSimpleString(anns.toArray(new Annotation[anns.size()]));
+ }
+
+ private static String toSimpleString(Annotation[] anns) {
+ StringJoiner joiner = new StringJoiner(", ");
+ for (Annotation ann : anns) {
+ joiner.add(toSimpleString(ann));
+ }
+ return joiner.toString();
+ }
+
+ private static String toSimpleString(Annotation ann) {
+ Class<? extends Annotation> annotationType = ann.annotationType();
+ Object value;
+ try {
+ value = annotationType.getDeclaredMethod("value").invoke(ann);
+ } catch (IllegalAccessException | InvocationTargetException
+ | NoSuchMethodException e) {
+ throw new RuntimeException(e);
+ }
+ return "@" + annotationType.getSimpleName() + "(" + value + ")";
+ }
+
+ private static final Field classRedefinedCountField;
+
+ static {
+ try {
+ classRedefinedCountField = Class.class.getDeclaredField("classRedefinedCount");
+ classRedefinedCountField.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ throw new Error(e);
+ }
+ }
+
+ private static void incrementClassRedefinedCount(Class<?> clazz) {
+ try {
+ classRedefinedCountField.set(clazz,
+ ((Integer) classRedefinedCountField.get(clazz)) + 1);
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
--- a/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java Thu Oct 03 19:18:54 2013 +0100
@@ -136,7 +136,7 @@
echoServer.getPort());
test(address, 0, false, false);
test(address, 0, false, true);
- test(address, 5000, false, false);
+ test(address, 15000, false, false);
}
try (TestServers.UdpDiscardServer discardServer
= TestServers.UdpDiscardServer.startNewServer()) {
--- a/jdk/test/java/nio/channels/Selector/LotsOfChannels.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/nio/channels/Selector/LotsOfChannels.java Thu Oct 03 19:18:54 2013 +0100
@@ -22,9 +22,10 @@
*/
/* @test
- * @bug 4503092
+ * @bug 4503092 8024883
* @summary Tests that Windows Selector can use more than 63 channels
- * @run main/timeout=300 LotsOfChannels
+ * @run main LotsOfChannels
+ * @run main/othervm -Dsun.nio.ch.maxUpdateArraySize=64 LotsOfChannels
* @author kladko
*/
--- a/jdk/test/java/nio/channels/Selector/SelectorLimit.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/nio/channels/Selector/SelectorLimit.java Thu Oct 03 19:18:54 2013 +0100
@@ -22,12 +22,13 @@
*/
/* @test
- * @bug 4777504
+ * @bug 4777504 8024883
* @summary Ensure that a Selector can return at least 100 selected keys
* @author Mark Reinhold
* @library ..
* @build SelectorLimit
* @run main/othervm SelectorLimit
+ * @run main/othervm -Dsun.nio.ch.maxUpdateArraySize=128 SelectorLimit
*/
import java.io.*;
--- a/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile Thu Oct 03 19:18:54 2013 +0100
@@ -21,33 +21,14 @@
ifeq ($(uname), SunOS)
PLATFORM = solaris
ISAINFO = isainfo
- ifndef ARCH_DATA_MODEL
- ARCH_DATA_MODEL=32
- endif
- ifeq ($(ARCH_DATA_MODEL), 32)
- archExpr = case "`$(UNAME) -p`" in \
- i386) \
- $(ECHO) i586 \
- ;; \
- sparc*) \
- $(ECHO) sparc \
- ;; \
- *) \
- $(UNAME) -p \
- ;; \
- esac
- ARCH := $(shell $(archExpr) )
- else
- ARCH := $(shell $(ISAINFO) -n)
- endif
+ ARCH_DATA_MODEL=64
+ ARCH := $(shell $(ISAINFO) -n)
CC = cc
LD = ld
CFLAGS = -D_REENTRANT -D__solaris__
LDFLAGS_COMMON = -G
EXTRA_LIBS = -lc
- ifeq ($(ARCH_DATA_MODEL), 64)
- CC += -xarch=v9
- endif
+ CC += -m64 -Kpic
endif
ifeq ($(uname), Linux)
Binary file jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-amd64/libLauncher.so has changed
Binary file jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-i586/libLauncher.so has changed
Binary file jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/lib/solaris-sparc/libLauncher.so has changed
--- a/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1,7 +1,7 @@
#!/bin/sh
#
-# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,6 @@
# questions.
#
-
# @test
# @bug 4673940
# @bug 4930794
@@ -39,7 +38,6 @@
exit 0
fi
-
# if TESTJAVA isn't set then we assume an interactive run. So that it's
# clear which version of 'java' is running we do a 'which java' and
# a 'java -version'.
@@ -64,24 +62,17 @@
# Check that we have libLauncher.so for the right platform.
-# On Solaris we assume 64-bit if java -d64 works.
+# On Solaris we assume 64-bit
DFLAG=
if [ "$os" = "SunOS" ]; then
PLATFORM=solaris
case "`uname -p`" in
i[3-9]86)
- ARCH=i586
+ ARCH=amd64
;;
sparc)
- ARCH=sparc
- ${JAVA} -d64 -version > /dev/null 2<&1
- if [ $? = 1 ]; then
- ARCH=sparc
- else
- ARCH=sparcv9
- DFLAG=-d64
- fi
+ ARCH=sparcv9
;;
esac
fi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/HashMap/ReplaceExisting.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8025173
+ * @summary Verify that replacing the value for an existing key does not
+ * corrupt active iterators, in particular due to a resize() occurring and
+ * not updating modCount.
+ * @run main ReplaceExisting
+ */
+
+import java.util.ConcurrentModificationException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+
+public class ReplaceExisting {
+ /* Number of entries required to trigger a resize for cap=16, load=0.75*/
+ private static int ENTRIES = 13;
+
+ public static void main(String[] args) {
+ for (int i = 0; i <= ENTRIES; i++) {
+ HashMap<Integer,Integer> hm = prepHashMap();
+ testItr(hm, i);
+ }
+ }
+
+ /* Prepare a HashMap that will resize on next put() */
+ private static HashMap<Integer,Integer> prepHashMap() {
+ HashMap<Integer,Integer> hm = new HashMap<>(16, 0.75f);
+ // Add items to one more than the resize threshold
+ for (int i = 0; i < ENTRIES; i++) {
+ hm.put(i*10, i*10);
+ }
+ return hm;
+ }
+
+ /* Iterate hm for elemBeforePut elements, then call put() to replace value
+ * for existing key. With bug 8025173, this will also cause a resize, but
+ * not increase the modCount.
+ * Finish the iteration to check for a corrupt iterator.
+ */
+ private static void testItr(HashMap<Integer,Integer> hm, int elemBeforePut) {
+ if (elemBeforePut > hm.size()) {
+ throw new IllegalArgumentException("Error in test: elemBeforePut must be <= HashMap size");
+ }
+ // Create a copy of the keys
+ HashSet<Integer> keys = new HashSet<>(hm.size());
+ keys.addAll(hm.keySet());
+
+ HashSet<Integer> collected = new HashSet<>(hm.size());
+
+ // Run itr for elemBeforePut items, collecting returned elems
+ Iterator<Integer> itr = hm.keySet().iterator();
+ for (int i = 0; i < elemBeforePut; i++) {
+ Integer retVal = itr.next();
+ if (!collected.add(retVal)) {
+ throw new RuntimeException("Corrupt iterator: key " + retVal + " already encountered");
+ }
+ }
+
+ // Do put() to replace entry (and resize table when bug present)
+ if (null == hm.put(0, 100)) {
+ throw new RuntimeException("Error in test: expected key 0 to be in the HashMap");
+ }
+
+ // Finish itr + collecting returned elems
+ while(itr.hasNext()) {
+ Integer retVal = itr.next();
+ if (!collected.add(retVal)) {
+ throw new RuntimeException("Corrupt iterator: key " + retVal + " already encountered");
+ }
+ }
+
+ // Compare returned elems to original copy of keys
+ if (!keys.equals(collected)) {
+ throw new RuntimeException("Collected keys do not match original set of keys");
+ }
+ }
+}
--- a/jdk/test/java/util/Map/Defaults.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/Map/Defaults.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8010122 8004518
+ * @bug 8010122 8004518 8024331
* @summary Test Map default methods
* @author Mike Duigou
* @run testng Defaults
@@ -288,6 +288,21 @@
assertSame(map.get(EXTRA_KEY), EXTRA_VALUE);
}
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfAbsentNPEHashMap() {
+ Object value = new HashMap().computeIfAbsent(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfAbsentNPEHashtable() {
+ Object value = new Hashtable().computeIfAbsent(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfAbsentNPETreeMap() {
+ Object value = new TreeMap().computeIfAbsent(KEYS[1], null);
+ }
+
@Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull")
public void testComputeIfPresentNulls(String description, Map<IntegerEnum, String> map) {
assertTrue(map.containsKey(null), description + ": null key absent");
@@ -328,6 +343,21 @@
assertSame(map.get(EXTRA_KEY), null);
}
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfPresentNPEHashMap() {
+ Object value = new HashMap().computeIfPresent(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfPresentNPEHashtable() {
+ Object value = new Hashtable().computeIfPresent(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeIfPresentNPETreeMap() {
+ Object value = new TreeMap().computeIfPresent(KEYS[1], null);
+ }
+
@Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull")
public void testComputeNulls(String description, Map<IntegerEnum, String> map) {
assertTrue(map.containsKey(null), "null key absent");
@@ -414,6 +444,20 @@
assertSame(map.get(EXTRA_KEY), EXTRA_VALUE);
}
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeNPEHashMap() {
+ Object value = new HashMap().compute(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeNPEHashtable() {
+ Object value = new Hashtable().compute(KEYS[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testComputeNPETreeMap() {
+ Object value = new TreeMap().compute(KEYS[1], null);
+ }
@Test(dataProvider = "Map<IntegerEnum,String> rw=true keys=withNull values=withNull")
public void testMergeNulls(String description, Map<IntegerEnum, String> map) {
@@ -456,6 +500,21 @@
assertSame(map.get(EXTRA_KEY), EXTRA_VALUE);
}
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testMergeNPEHashMap() {
+ Object value = new HashMap().merge(KEYS[1], VALUES[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testMergeNPEHashtable() {
+ Object value = new Hashtable().merge(KEYS[1], VALUES[1], null);
+ }
+
+ @Test(expectedExceptions = {NullPointerException.class})
+ public void testMergeNPETreeMap() {
+ Object value = new TreeMap().merge(KEYS[1], VALUES[1], null);
+ }
+
enum IntegerEnum {
e0, e1, e2, e3, e4, e5, e6, e7, e8, e9,
--- a/jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/Spliterator/SpliteratorCharacteristics.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 8020156 8020009 8022326 8012913
+ * @bug 8020156 8020009 8022326 8012913 8024405
* @run testng SpliteratorCharacteristics
*/
@@ -36,21 +36,150 @@
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Map;
+import java.util.PrimitiveIterator;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.Spliterator;
+import java.util.Spliterators;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.function.Supplier;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
import static org.testng.Assert.*;
@Test
public class SpliteratorCharacteristics {
+ public void testSpliteratorFromCollection() {
+ List<Integer> l = Arrays.asList(1, 2, 3, 4);
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(l, 0);
+ assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(l, Spliterator.CONCURRENT);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(l.iterator( ), 1, 0);
+ assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(l.iterator( ), 1, Spliterator.CONCURRENT);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(l.iterator( ), 0);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(
+ l.iterator(), Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+ }
+
+ public void testSpliteratorOfIntFromIterator() {
+ Supplier<PrimitiveIterator.OfInt> si = () -> IntStream.of(1, 2, 3, 4).iterator();
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);
+ assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(
+ si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+ }
+
+ public void testSpliteratorOfLongFromIterator() {
+ Supplier<PrimitiveIterator.OfLong> si = () -> LongStream.of(1, 2, 3, 4).iterator();
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);
+ assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(
+ si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+ }
+
+ public void testSpliteratorOfDoubleFromIterator() {
+ Supplier<PrimitiveIterator.OfDouble> si = () -> DoubleStream.of(1, 2, 3, 4).iterator();
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, 0);
+ assertCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliterator(si.get(), 1, Spliterator.CONCURRENT);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertCharacteristics(s, Spliterator.CONCURRENT);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(si.get(), 0);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+
+ {
+ Spliterator<?> s = Spliterators.spliteratorUnknownSize(
+ si.get(), Spliterator.SIZED | Spliterator.SUBSIZED);
+ assertHasNotCharacteristics(s, Spliterator.SIZED | Spliterator.SUBSIZED);
+ }
+ }
+
+ //
+
public void testHashMap() {
assertMapCharacteristics(new HashMap<>(),
Spliterator.SIZED | Spliterator.DISTINCT);
@@ -199,10 +328,19 @@
}
void assertCharacteristics(Collection<?> c, int expectedCharacteristics) {
- assertTrue(c.spliterator().hasCharacteristics(expectedCharacteristics),
+ assertCharacteristics(c.spliterator(), expectedCharacteristics);
+ }
+
+ void assertCharacteristics(Spliterator<?> s, int expectedCharacteristics) {
+ assertTrue(s.hasCharacteristics(expectedCharacteristics),
"Spliterator characteristics");
}
+ void assertHasNotCharacteristics(Spliterator<?> s, int expectedCharacteristics) {
+ assertFalse(s.hasCharacteristics(expectedCharacteristics),
+ "Spliterator characteristics");
+ }
+
void assertNullComparator(Collection<?> c) {
assertNull(c.spliterator().getComparator(),
"Comparator of Spliterator of Collection");
--- a/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1159,7 +1159,7 @@
List<T> dest = new ArrayList<>();
spliterator = supplier.get();
- assertSpliterator(spliterator);
+ assertRootSpliterator(spliterator);
// verify splitting with forEach
visit(depth, 0, dest, spliterator, boxingAdapter, spliterator.characteristics(), false);
@@ -1234,7 +1234,7 @@
UnaryOperator<Consumer<T>> boxingAdapter) {
Spliterator<T> s = supplier.get();
boolean isOrdered = s.hasCharacteristics(Spliterator.ORDERED);
- assertSpliterator(s);
+ assertRootSpliterator(s);
List<T> splits = new ArrayList<>();
Consumer<T> c = boxingAdapter.apply(splits::add);
@@ -1326,6 +1326,13 @@
}
}
+ private static void assertRootSpliterator(Spliterator<?> s) {
+ assertFalse(s.hasCharacteristics(Spliterator.SIZED | Spliterator.CONCURRENT),
+ "Root spliterator should not be SIZED and CONCURRENT");
+
+ assertSpliterator(s);
+ }
+
private static void assertSpliterator(Spliterator<?> s, int rootCharacteristics) {
if ((rootCharacteristics & Spliterator.SUBSIZED) != 0) {
assertTrue(s.hasCharacteristics(Spliterator.SUBSIZED),
--- a/jdk/test/java/util/concurrent/ThreadLocalRandom/ThreadLocalRandomTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/concurrent/ThreadLocalRandom/ThreadLocalRandomTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,7 +33,9 @@
/**
* @test
+ * @bug 8024253
* @run testng ThreadLocalRandomTest
+ * @run testng/othervm -Djava.util.secureRandomSeed=true ThreadLocalRandomTest
* @summary test methods on ThreadLocalRandom
*/
@Test
--- a/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobal.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobal.java Thu Oct 03 19:18:54 2013 +0100
@@ -29,18 +29,18 @@
* @bug 7184195
* @summary checks that java.util.logging.Logger.getGlobal().info() logs without configuration
* @build TestGetGlobal testgetglobal.HandlerImpl testgetglobal.LogManagerImpl1 testgetglobal.LogManagerImpl2 testgetglobal.LogManagerImpl3 testgetglobal.BadLogManagerImpl testgetglobal.DummyLogManagerImpl
- * @run main/othervm/timeout=10 TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager TestGetGlobal
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobal
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobal
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobal
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobal
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobal
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobal
+ * @run main/othervm TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager TestGetGlobal
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobal
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobal
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobal
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobal
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobal
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobal
* @author danielfuchs
*/
public class TestGetGlobal {
--- a/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobalByName.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobalByName.java Thu Oct 03 19:18:54 2013 +0100
@@ -29,18 +29,18 @@
* @bug 7184195
* @summary checks that java.util.logging.Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).info() logs without configuration
* @build TestGetGlobalByName testgetglobal.HandlerImpl testgetglobal.LogManagerImpl1 testgetglobal.LogManagerImpl2 testgetglobal.LogManagerImpl3 testgetglobal.BadLogManagerImpl testgetglobal.DummyLogManagerImpl
- * @run main/othervm/timeout=10 TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager TestGetGlobalByName
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl TestGetGlobalByName
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalByName
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalByName
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalByName
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalByName
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalByName
+ * @run main/othervm TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager TestGetGlobalByName
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl TestGetGlobalByName
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalByName
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalByName
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalByName
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalByName
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalByName
* @author danielfuchs
*/
public class TestGetGlobalByName {
--- a/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobalConcurrent.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/java/util/logging/Logger/getGlobal/TestGetGlobalConcurrent.java Thu Oct 03 19:18:54 2013 +0100
@@ -30,18 +30,18 @@
* @bug 7184195 8021003
* @summary Test that the global logger can log with no configuration when accessed from multiple threads.
* @build TestGetGlobalConcurrent testgetglobal.HandlerImpl testgetglobal.LogManagerImpl1 testgetglobal.LogManagerImpl2 testgetglobal.LogManagerImpl3 testgetglobal.BadLogManagerImpl testgetglobal.DummyLogManagerImpl
- * @run main/othervm/timeout=10 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager TestGetGlobalConcurrent
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalConcurrent
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalConcurrent
- * @run main/othervm/timeout=10 -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalConcurrent
- * @run main/othervm/timeout=10/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalConcurrent
+ * @run main/othervm TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager TestGetGlobalConcurrent
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl1 TestGetGlobalConcurrent
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl2 TestGetGlobalConcurrent
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.LogManagerImpl3 TestGetGlobalConcurrent
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.BadLogManagerImpl TestGetGlobalConcurrent
+ * @run main/othervm -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalConcurrent
+ * @run main/othervm/policy=policy -Djava.security.manager -Djava.util.logging.manager=testgetglobal.DummyLogManagerImpl TestGetGlobalConcurrent
* @author danielfuchs
*/
public class TestGetGlobalConcurrent {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/regex/PatternStreamTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8016846 8024341
+ * @summary Unit tests for wrapping classes should delegate to default methods
+ * @library ../stream/bootlib
+ * @build java.util.stream.OpTestCase
+ * @run testng/othervm PatternStreamTest
+ */
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+import java.util.stream.LambdaTestHelpers;
+import java.util.stream.OpTestCase;
+import java.util.stream.Stream;
+import java.util.stream.TestData;
+
+@Test
+public class PatternStreamTest extends OpTestCase {
+
+ @DataProvider(name = "Stream<String>")
+ public static Object[][] makeStreamTestData() {
+ List<Object[]> data = new ArrayList<>();
+
+ String description = "";
+ String input = "awgqwefg1fefw4vssv1vvv1";
+ Pattern pattern = Pattern.compile("4");
+ List<String> expected = new ArrayList<>();
+ expected.add("awgqwefg1fefw");
+ expected.add("vssv1vvv1");
+
+ // Must match the type signature of the consumer of this data, testStrings
+ // String, String, Pattern, List<String>
+ data.add(new Object[]{description, input, pattern, expected});
+
+ input = "afbfq\u00a3abgwgb\u00a3awngnwggw\u00a3a\u00a3ahjrnhneerh";
+ pattern = Pattern.compile("\u00a3a");
+ expected = new ArrayList<>();
+ expected.add("afbfq");
+ expected.add("bgwgb");
+ expected.add("wngnwggw");
+ expected.add("");
+ expected.add("hjrnhneerh");
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ input = "awgqwefg1fefw4vssv1vvv1";
+ pattern = Pattern.compile("1");
+ expected = new ArrayList<>();
+ expected.add("awgqwefg");
+ expected.add("fefw4vssv");
+ expected.add("vvv");
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ input = "a\u4ebafg1fefw\u4eba4\u9f9cvssv\u9f9c1v\u672c\u672cvv";
+ pattern = Pattern.compile("1");
+ expected = new ArrayList<>();
+ expected.add("a\u4ebafg");
+ expected.add("fefw\u4eba4\u9f9cvssv\u9f9c");
+ expected.add("v\u672c\u672cvv");
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ input = "1\u56da23\u56da456\u56da7890";
+ pattern = Pattern.compile("\u56da");
+ expected = new ArrayList<>();
+ expected.add("1");
+ expected.add("23");
+ expected.add("456");
+ expected.add("7890");
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ input = "1\u56da23\u9f9c\u672c\u672c\u56da456\u56da\u9f9c\u672c7890";
+ pattern = Pattern.compile("\u56da");
+ expected = new ArrayList<>();
+ expected.add("1");
+ expected.add("23\u9f9c\u672c\u672c");
+ expected.add("456");
+ expected.add("\u9f9c\u672c7890");
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ input = "";
+ pattern = Pattern.compile("\u56da");
+ expected = new ArrayList<>();
+
+ data.add(new Object[]{description, input, pattern, expected});
+
+
+ description = "Multiple separators";
+ input = "This is,testing: with\tdifferent separators.";
+ pattern = Pattern.compile("[ \t,:.]");
+ expected = new ArrayList<>();
+ expected.add("This");
+ expected.add("is");
+ expected.add("testing");
+ expected.add("");
+ expected.add("with");
+ expected.add("different");
+ expected.add("separators");
+
+
+ description = "Repeated separators within and at end";
+ input = "boo:and:foo";
+ pattern = Pattern.compile("o");
+ expected = new ArrayList<>();
+ expected.add("b");
+ expected.add("");
+ expected.add(":and:f");
+
+
+ description = "Many repeated separators within and at end";
+ input = "booooo:and:fooooo";
+ pattern = Pattern.compile("o");
+ expected = new ArrayList<>();
+ expected.add("b");
+ expected.add("");
+ expected.add("");
+ expected.add("");
+ expected.add("");
+ expected.add(":and:f");
+
+ description = "Many repeated separators before last match";
+ input = "fooooo:";
+ pattern = Pattern.compile("o");
+ expected = new ArrayList<>();
+ expected.add("f");
+ expected.add("");
+ expected.add("");
+ expected.add("");
+ expected.add("");
+ expected.add(":");
+
+ data.add(new Object[] {description, input, pattern, expected});
+ return data.toArray(new Object[0][]);
+ }
+
+ @Test(dataProvider = "Stream<String>")
+ public void testStrings(String description, String input, Pattern pattern, List<String> expected) {
+ Supplier<Stream<String>> ss = () -> pattern.splitAsStream(input);
+ withData(TestData.Factory.ofSupplier(description, ss))
+ .stream(LambdaTestHelpers.identity())
+ .expectedResult(expected)
+ .exercise();
+ }
+}
--- a/jdk/test/java/util/regex/PatternTest.java Sat Sep 14 20:43:34 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @summary Unit tests for wrapping classes should delegate to default methods
- * @library ../stream/bootlib
- * @build java.util.stream.OpTestCase
- * @run testng/othervm PatternTest
- */
-
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Supplier;
-import java.util.regex.Pattern;
-import java.util.stream.LambdaTestHelpers;
-import java.util.stream.OpTestCase;
-import java.util.stream.Stream;
-import java.util.stream.TestData;
-
-@Test
-public class PatternTest extends OpTestCase {
-
- @DataProvider(name = "Stream<String>")
- public static Object[][] makeStreamTestData() {
- List<Object[]> data = new ArrayList<>();
-
- String description = "";
- String input = "awgqwefg1fefw4vssv1vvv1";
- Pattern pattern = Pattern.compile("4");
- List<String> expected = new ArrayList<>();
- expected.add("awgqwefg1fefw");
- expected.add("vssv1vvv1");
-
- // Must match the type signature of the consumer of this data, testStrings
- // String, String, Pattern, List<String>
- data.add(new Object[]{description, input, pattern, expected});
-
- input = "afbfq\u00a3abgwgb\u00a3awngnwggw\u00a3a\u00a3ahjrnhneerh";
- pattern = Pattern.compile("\u00a3a");
- expected = new ArrayList<>();
- expected.add("afbfq");
- expected.add("bgwgb");
- expected.add("wngnwggw");
- expected.add("");
- expected.add("hjrnhneerh");
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- input = "awgqwefg1fefw4vssv1vvv1";
- pattern = Pattern.compile("1");
- expected = new ArrayList<>();
- expected.add("awgqwefg");
- expected.add("fefw4vssv");
- expected.add("vvv");
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- input = "a\u4ebafg1fefw\u4eba4\u9f9cvssv\u9f9c1v\u672c\u672cvv";
- pattern = Pattern.compile("1");
- expected = new ArrayList<>();
- expected.add("a\u4ebafg");
- expected.add("fefw\u4eba4\u9f9cvssv\u9f9c");
- expected.add("v\u672c\u672cvv");
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- input = "1\u56da23\u56da456\u56da7890";
- pattern = Pattern.compile("\u56da");
- expected = new ArrayList<>();
- expected.add("1");
- expected.add("23");
- expected.add("456");
- expected.add("7890");
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- input = "1\u56da23\u9f9c\u672c\u672c\u56da456\u56da\u9f9c\u672c7890";
- pattern = Pattern.compile("\u56da");
- expected = new ArrayList<>();
- expected.add("1");
- expected.add("23\u9f9c\u672c\u672c");
- expected.add("456");
- expected.add("\u9f9c\u672c7890");
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- input = "";
- pattern = Pattern.compile("\u56da");
- expected = new ArrayList<>();
-
- data.add(new Object[]{description, input, pattern, expected});
-
-
- description = "Multiple separators";
- input = "This is,testing: with\tdifferent separators.";
- pattern = Pattern.compile("[ \t,:.]");
- expected = new ArrayList<>();
- expected.add("This");
- expected.add("is");
- expected.add("testing");
- expected.add("");
- expected.add("with");
- expected.add("different");
- expected.add("separators");
-
- data.add(new Object[] {description, input, pattern, expected});
- return data.toArray(new Object[0][]);
- }
-
- @Test(dataProvider = "Stream<String>")
- public void testStrings(String description, String input, Pattern pattern, List<String> expected) {
- Supplier<Stream<String>> ss = () -> pattern.splitAsStream(input);
- withData(TestData.Factory.ofSupplier(description, ss))
- .stream(LambdaTestHelpers.identity())
- .expectedResult(expected)
- .exercise();
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/management/MBeanInfo/MBeanInfoEqualsNPETest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanConstructorInfo;
+import javax.management.MBeanFeatureInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanNotificationInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanParameterInfo;
+import javax.management.modelmbean.DescriptorSupport;
+import javax.management.openmbean.SimpleType;
+
+/*
+ * @test
+ * @bug 8023954
+ * @summary Test that MBean*Info.equals do not throw NPE
+ * @author Shanliang JIANG
+ * @run clean MBeanInfoEqualsNPETest
+ * @run build MBeanInfoEqualsNPETest
+ * @run main MBeanInfoEqualsNPETest
+ */
+public class MBeanInfoEqualsNPETest {
+ private static int failed = 0;
+
+ public static void main(String[] args) throws Exception {
+ System.out.println("---MBeanInfoEqualsNPETest-main ...");
+
+ // ----
+ System.out.println("\n---Testing on MBeanAttributeInfo...");
+ MBeanAttributeInfo mbeanAttributeInfo0 = new MBeanAttributeInfo(
+ "name", SimpleType.INTEGER.getClassName(), "description", true, true, false);
+ MBeanAttributeInfo mbeanAttributeInfo = new MBeanAttributeInfo(
+ null, SimpleType.INTEGER.getClassName(), "description", true, true, false);
+ test(mbeanAttributeInfo0, mbeanAttributeInfo, "class name");
+
+ mbeanAttributeInfo = new MBeanAttributeInfo(
+ "name", null, "description", true, true, false);
+ test(mbeanAttributeInfo0, mbeanAttributeInfo, "type");
+
+ mbeanAttributeInfo = new MBeanAttributeInfo(
+ "name", SimpleType.INTEGER.getClassName(), null, true, true, false);
+ test(mbeanAttributeInfo0, mbeanAttributeInfo, "description");
+
+ // ----
+ System.out.println("\n---Testing on MBeanConstructorInfo...");
+ MBeanConstructorInfo mbeanConstructorInfo0 = new MBeanConstructorInfo(
+ "", "", new MBeanParameterInfo[]{}, new DescriptorSupport());
+ MBeanConstructorInfo mbeanConstructorInfo = new MBeanConstructorInfo(
+ null, "", new MBeanParameterInfo[]{}, new DescriptorSupport());
+ test(mbeanConstructorInfo0, mbeanConstructorInfo, "name");
+
+ mbeanConstructorInfo = new MBeanConstructorInfo(
+ "", null, new MBeanParameterInfo[]{}, new DescriptorSupport());
+ test(mbeanConstructorInfo0, mbeanConstructorInfo, "description");
+
+ mbeanConstructorInfo = new MBeanConstructorInfo(
+ "", "", null, new DescriptorSupport());
+ test(mbeanConstructorInfo0, mbeanConstructorInfo, "MBeanParameterInfo");
+
+ mbeanConstructorInfo = new MBeanConstructorInfo(
+ "", "", new MBeanParameterInfo[]{}, null);
+ test(mbeanConstructorInfo0, mbeanConstructorInfo, "descriptor");
+
+ // ----
+ System.out.println("\n---Testing on MBeanOperationInfo...");
+ MBeanOperationInfo mbeanOperationInfo0 = new MBeanOperationInfo(
+ "name", "description", new MBeanParameterInfo[]{}, "type",
+ MBeanOperationInfo.UNKNOWN, new DescriptorSupport());
+
+ MBeanOperationInfo mbeanOperationInfo = new MBeanOperationInfo(
+ null, "description", new MBeanParameterInfo[]{}, "type",
+ MBeanOperationInfo.UNKNOWN, new DescriptorSupport());
+ test(mbeanOperationInfo0, mbeanOperationInfo, "name");
+
+ mbeanOperationInfo = new MBeanOperationInfo(
+ "name", null, new MBeanParameterInfo[]{}, "type",
+ MBeanOperationInfo.UNKNOWN, new DescriptorSupport());
+ test(mbeanOperationInfo0, mbeanOperationInfo, "description");
+
+ mbeanOperationInfo = new MBeanOperationInfo(
+ "name", "description", null, "type", 1, new DescriptorSupport());
+ test(mbeanOperationInfo0, mbeanOperationInfo, "MBeanParameterInfo");
+
+ mbeanOperationInfo = new MBeanOperationInfo(
+ "name", "description", new MBeanParameterInfo[]{}, null,
+ MBeanOperationInfo.UNKNOWN, new DescriptorSupport());
+ test(mbeanOperationInfo0, mbeanOperationInfo, "type");
+
+ mbeanOperationInfo = new MBeanOperationInfo(
+ "name", "description", new MBeanParameterInfo[]{}, null,
+ MBeanOperationInfo.UNKNOWN, null);
+ test(mbeanOperationInfo0, mbeanOperationInfo, "Descriptor");
+
+ // ----
+ System.out.println("\n---Testing on MBeanParameterInfo...");
+ MBeanParameterInfo mbeanParameterInfo0 = new MBeanParameterInfo(
+ "name", "type", "description", new DescriptorSupport());
+ MBeanParameterInfo mbeanParameterInfo = new MBeanParameterInfo(
+ null, "type", "description", new DescriptorSupport());
+ test(mbeanParameterInfo0, mbeanParameterInfo, "name");
+
+ mbeanParameterInfo = new MBeanParameterInfo(
+ "name", null, "description", new DescriptorSupport());
+ test(mbeanParameterInfo0, mbeanParameterInfo, "type");
+
+ mbeanParameterInfo = new MBeanParameterInfo(
+ "name", "type", null, new DescriptorSupport());
+ test(mbeanParameterInfo0, mbeanParameterInfo, "description");
+
+ mbeanParameterInfo = new MBeanParameterInfo(
+ "name", "type", "description", null);
+ test(mbeanParameterInfo0, mbeanParameterInfo, "Descriptor");
+
+ // ----
+ System.out.println("\n---Testing on MBeanFeatureInfo ...");
+ MBeanFeatureInfo mbeanFeatureInfo0 = new MBeanFeatureInfo(
+ "name", "description", new DescriptorSupport());
+ MBeanFeatureInfo mbeanFeatureInfo = new MBeanFeatureInfo(
+ null, "description", new DescriptorSupport());
+ test(mbeanFeatureInfo0, mbeanFeatureInfo, "name");
+
+ mbeanFeatureInfo = new MBeanFeatureInfo(
+ "name", null, new DescriptorSupport());
+ test(mbeanParameterInfo0, mbeanParameterInfo, "description");
+
+ mbeanFeatureInfo = new MBeanFeatureInfo(
+ "name", "description", null);
+ test(mbeanParameterInfo0, mbeanParameterInfo, "Descriptor");
+
+ // ----
+ System.out.println("\n---Testing on MBeanInfo...");
+ String className = "toto";
+ String description = "titi";
+ MBeanAttributeInfo[] attrInfos = new MBeanAttributeInfo[]{};
+ MBeanConstructorInfo[] constrInfos = new MBeanConstructorInfo[]{};
+ MBeanOperationInfo[] operaInfos = new MBeanOperationInfo[]{};
+ MBeanNotificationInfo[] notifInfos = new MBeanNotificationInfo[]{};
+
+ MBeanInfo minfo0 = new MBeanInfo("toto", description, attrInfos, constrInfos, operaInfos, notifInfos);
+ MBeanInfo minfo = new MBeanInfo(null, description, attrInfos, constrInfos, operaInfos, notifInfos);
+ test(minfo0, minfo, "class name");
+
+ minfo = new MBeanInfo(className, null, attrInfos, constrInfos, operaInfos, notifInfos);
+ test(minfo0, minfo, "description");
+
+ minfo = new MBeanInfo(className, description, null, constrInfos, operaInfos, notifInfos);
+ test(minfo0, minfo, "attrInfos");
+
+ minfo = new MBeanInfo(className, description, attrInfos, null, operaInfos, notifInfos);
+ test(minfo0, minfo, "constrInfos");
+
+ minfo = new MBeanInfo(className, description, attrInfos, constrInfos, null, notifInfos);
+ test(minfo0, minfo, "operaInfos");
+
+ minfo = new MBeanInfo(className, description, attrInfos, constrInfos, operaInfos, null);
+ test(minfo0, minfo, "notifInfos");
+
+ if (failed > 0) {
+ throw new RuntimeException("Test failed: "+failed);
+ } else {
+ System.out.println("---Test: PASSED");
+ }
+ }
+
+ private static void test(Object obj1, Object obj2, String param) {
+ try {
+ obj1.equals(obj2);
+ System.out.println("OK-1: "+obj1.getClass().getSimpleName()+".equals worked with a null paramer: "+param);
+ } catch (NullPointerException npe) {
+ System.out.println("--->KO-1!!! "+obj1.getClass().getSimpleName()+".equals got NPE with a null paramer: "+param);
+ npe.printStackTrace();
+ failed++;
+ }
+
+ try {
+ obj2.equals(obj1);
+ System.out.println("OK-2: "+obj2.getClass().getSimpleName()+".equals worked with a null paramer: "+param);
+ } catch (NullPointerException npe) {
+ System.out.println("--->KO-2!!! "+obj2.getClass().getSimpleName()+".equals got NPE with a null paramer: "+param);
+ npe.printStackTrace();
+ failed++;
+ }
+
+ try {
+ obj1.equals(null);
+ obj2.equals(null);
+
+ System.out.println("OK-3: "+obj1.getClass().getSimpleName()+".equals worked with a null field.");
+ } catch (NullPointerException npe) {
+ System.out.println("--->KO-3!!! "+obj1.getClass().getSimpleName()+".equals got NPE with a null field.");
+ npe.printStackTrace();
+ failed++;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JComboBox/6236162/bug6236162.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 6236162
+ @summary Checks that there is no an inconsistence in combo box
+ behavior when user points an item in combo popup
+ by mouse and then uses UP/DOWN keys.
+ @library ../../regtesthelpers
+ @build Util
+ @author Mikhail Lapshin
+ @run main bug6236162
+*/
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.*;
+import javax.swing.plaf.metal.MetalComboBoxUI;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+public class bug6236162 {
+ private static final SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ private static JFrame frame;
+ private static JComboBox combo;
+ private static MyComboUI comboUI;
+
+ public static void main(String[] args) throws Exception {
+ UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+ toolkit.realSync();
+ test();
+ System.out.println("Test passed");
+ }
+
+ private static void createAndShowGUI() {
+ frame = new JFrame("bug6236162");
+
+ combo = new JComboBox(new String[]{"one", "two", "three", "four", "five"});
+ combo.setEditable(true);
+ comboUI = new MyComboUI();
+ combo.setUI(comboUI);
+ combo.setSelectedIndex(3);
+ frame.getContentPane().add(combo);
+
+ frame.pack();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setLocationRelativeTo(null);
+ frame.setVisible(true);
+ }
+
+ private static void test() throws AWTException {
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ // Open popup menu
+ realSync();
+ Util.hitKeys(robot, KeyEvent.VK_DOWN);
+
+ // Move mouse to the first popup menu item
+ realSync();
+ Point p = combo.getLocationOnScreen();
+ Dimension size = combo.getSize();
+ p.x += size.width / 2;
+ p.y += size.height;
+ float dy = 1;
+ robot.mouseMove(p.x, p.y - 5);
+ for (int i=1; i <= 10; i++) {
+ robot.mouseMove((int)(p.x), (int)(p.y - 5 + dy*i));
+ }
+
+ // Select the second popup menu item
+ realSync();
+ Util.hitKeys(robot, KeyEvent.VK_DOWN);
+
+ realSync();
+ JList list = comboUI.getComboPopup().getList();
+ if (list.getSelectedIndex() != 1) {
+ throw new RuntimeException("There is an inconsistence in combo box " +
+ "behavior when user points an item in combo popup " +
+ "by mouse and then uses UP/DOWN keys.");
+ }
+ }
+
+ private static void realSync() {
+ ((SunToolkit)Toolkit.getDefaultToolkit()).realSync();
+ }
+
+ // Gives access to BasicComboBoxUI.popup field
+ private static class MyComboUI extends MetalComboBoxUI {
+ public ComboPopup getComboPopup() {
+ return popup;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JComboBox/7195179/Test7195179.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Component;
+import javax.swing.GroupLayout;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.ListCellRenderer;
+import javax.swing.plaf.basic.BasicComboBoxRenderer;
+
+import static javax.swing.SwingUtilities.invokeAndWait;
+
+/*
+ * @test
+ * @bug 7195179
+ * @summary Tests that combobox works with generified renderers
+ * @author Sergey Malenkov
+ */
+
+public class Test7195179 {
+ public static void main(String[] args) throws Exception {
+ invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ Integer[] items = {null, 1, 2, 3};
+ JComboBox<Integer> combo = new JComboBox<>(items);
+ JLabel label = new JLabel("choose:");
+ JPanel panel = new JPanel();
+ GroupLayout layout = new GroupLayout(panel);
+ panel.setLayout(layout);
+ label.setLabelFor(combo);
+ combo.setSelectedIndex(0);
+ combo.setRenderer(new ListCellRenderer<Integer>() {
+ private final BasicComboBoxRenderer renderer = new BasicComboBoxRenderer();
+
+ @Override
+ public Component getListCellRendererComponent(JList<? extends Integer> list, Integer value, int index, boolean isSelected, boolean cellHasFocus) {
+ return this.renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ }
+ });
+ layout.setAutoCreateContainerGaps(true);
+ layout.setAutoCreateGaps(true);
+ layout.setHorizontalGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup().addComponent(label))
+ .addGroup(layout.createParallelGroup().addComponent(combo)));
+ layout.setVerticalGroup(layout
+ .createSequentialGroup()
+ .addGroup(layout
+ .createParallelGroup(GroupLayout.Alignment.BASELINE)
+ .addComponent(label)
+ .addComponent(combo)));
+
+ JFrame frame = new JFrame(getClass().getSimpleName());
+ frame.add(panel);
+ frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ frame.pack();
+ frame.setVisible(true);
+ }
+ });
+ }
+}
--- a/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.html Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.html Thu Oct 03 19:18:54 2013 +0100
@@ -1,6 +1,38 @@
<html>
+<!--
+ Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+ This code is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License version 2 only, as
+ published by the Free Software Foundation.
+
+ This code is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ version 2 for more details (a copy is included in the LICENSE file that
+ accompanied this code).
+
+ You should have received a copy of the GNU General Public License version
+ 2 along with this work; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ or visit www.oracle.com if you need additional information or have any
+ questions.
+-->
+
+<!--
+ @test
+ @bug 4150029 8006087
+ @summary BackSpace keyboard button does not lead to parent directory
+ @author Oleg Mokhovikov
+ @run applet/manual=done bug4150029.html
+-->
+
<body>
<applet code="bug4150029.class" width=200 height=200></applet>
+Follow the instructions below.
1.Go into 'subDir' folder.
2.Press BACKSPACE key.
3.Push OPEN button.
--- a/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -21,11 +21,10 @@
* questions.
*/
-/* @test
- @bug 4150029
- @summary BackSpace keyboard button does not lead to parent directory
- @author Oleg Mokhovikov
- @run applet/manual=done bug4150029.html
+/*
+ bug 4150029 8006087
+ summary BackSpace keyboard button does not lead to parent directory
+ author Oleg Mokhovikov
*/
import javax.swing.*;
@@ -36,6 +35,14 @@
private boolean res;
public void init() {
+ if (sun.awt.OSInfo.getOSType() == sun.awt.OSInfo.OSType.MACOSX) {
+ try {
+ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
String tmpDir = System.getProperty("java.io.tmpdir");
if (tmpDir.length() == 0) {//'java.io.tmpdir' isn't guaranteed to be defined
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/7199708/bug7199708.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import javax.swing.JFileChooser;
+import javax.swing.SwingUtilities;
+
+import java.nio.file.Files;
+import javax.swing.AbstractButton;
+import javax.swing.JTable;
+import javax.swing.UIManager;
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 7199708
+ * @author Alexander Scherbatiy
+ * @summary FileChooser crashs when opening large folder
+ * @run main bug7199708
+ */
+public class bug7199708 {
+
+ private static int FILE_NUMBER = 30000;
+ private static volatile JFileChooser fileChooser;
+ private static volatile int locationX;
+ private static volatile int locationY;
+ private static volatile int width;
+
+ public static void main(String[] args) throws Exception {
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ final File folder = createLargeFolder();
+ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ fileChooser = new JFileChooser(folder);
+ fileChooser.showSaveDialog(null);
+ }
+ });
+
+ toolkit.realSync();
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ final String detailsTooltip = UIManager.getString("FileChooser."
+ + "detailsViewButtonToolTipText", fileChooser.getLocale());
+
+ doAction(fileChooser, new ComponentAction() {
+ @Override
+ public boolean accept(Component component) {
+ return (component instanceof AbstractButton)
+ && detailsTooltip.equals(
+ ((AbstractButton) component).getToolTipText());
+ }
+
+ @Override
+ public void perform(Component component) {
+ ((AbstractButton) component).doClick();
+ }
+ });
+
+ doAction(fileChooser, new ComponentAction() {
+ @Override
+ public boolean accept(Component component) {
+ return (component instanceof JTable);
+ }
+
+ @Override
+ public void perform(Component component) {
+ Point tableLocation = component.getLocationOnScreen();
+ locationX = (int) tableLocation.getX();
+ locationY = (int) tableLocation.getY();
+ width = (int) fileChooser.getBounds().getWidth();
+ }
+ });
+ }
+ });
+
+ toolkit.realSync();
+
+ int d = 25;
+ for (int i = 0; i < width / d; i++) {
+ robot.mouseMove(locationX + i * d, locationY + 5);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ toolkit.realSync();
+ }
+
+ robot.keyPress(KeyEvent.VK_ESCAPE);
+ robot.keyRelease(KeyEvent.VK_ESCAPE);
+ }
+
+ static void doAction(Component component, ComponentAction action) {
+ if (action.accept(component)) {
+ action.perform(component);
+ } else if (component instanceof Container) {
+ for (Component comp : ((Container) component).getComponents()) {
+ doAction(comp, action);
+ }
+ }
+ }
+
+ private static File createLargeFolder() {
+ try {
+
+ File largeFolder = Files.createTempDirectory("large_folder").toFile();
+ largeFolder.deleteOnExit();
+
+ for (int i = 0; i < FILE_NUMBER; i++) {
+ File file = new File(largeFolder, "File_" + i + ".txt");
+ file.createNewFile();
+ file.deleteOnExit();
+ }
+ return largeFolder;
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ interface ComponentAction {
+
+ boolean accept(Component component);
+
+ void perform(Component component);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8002077/bug8002077.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.KeyEvent;
+import javax.swing.JFileChooser;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 8002077
+ * @author Alexander Scherbatiy
+ * @summary Possible mnemonic issue on JFileChooser Save button on nimbus L&F
+ * @library ../../regtesthelpers/
+ * @build Util
+ * @run main bug8002077
+ */
+public class bug8002077 {
+
+ private static volatile int fileChooserState = JFileChooser.ERROR_OPTION;
+
+ public static void main(String[] args) throws Exception {
+ for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
+ if ("Nimbus".equals(info.getName())) {
+ UIManager.setLookAndFeel(info.getClassName());
+ runTest();
+ break;
+ }
+ }
+ }
+
+ private static void runTest() throws Exception {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ fileChooserState = new JFileChooser().showSaveDialog(null);
+ }
+ });
+ toolkit.realSync();
+
+ Util.hitMnemonics(robot, KeyEvent.VK_N);
+ toolkit.realSync();
+
+ robot.keyPress(KeyEvent.VK_A);
+ robot.keyRelease(KeyEvent.VK_A);
+ toolkit.realSync();
+
+ Util.hitMnemonics(robot, KeyEvent.VK_S);
+ toolkit.realSync();
+
+ if (fileChooserState != JFileChooser.APPROVE_OPTION) {
+ throw new RuntimeException("Save button is not pressed!");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8021253/bug8021253.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.awt.BorderLayout;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import sun.awt.SunToolkit;
+
+/**
+ * @test
+ * @bug 8021253
+ * @author Alexander Scherbatiy
+ * @summary JFileChooser does not react on pressing enter since java 7
+ * @run main bug8021253
+ */
+
+public class bug8021253 {
+
+ private static volatile boolean defaultKeyPressed;
+ private static JFileChooser fileChooser;
+ private static File file;
+
+ public static void main(String[] args) throws Exception {
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ toolkit.realSync();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ fileChooser.setSelectedFile(file);
+ }
+ });
+
+ toolkit.realSync();
+
+ robot.keyPress(KeyEvent.VK_ENTER);
+ robot.keyRelease(KeyEvent.VK_ENTER);
+ toolkit.realSync();
+
+ if (!defaultKeyPressed) {
+ throw new RuntimeException("Default button is not pressed");
+ }
+ }
+
+ private static void createAndShowGUI() {
+
+ file = getTempFile();
+
+ final JFrame frame = new JFrame("Test");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setSize(200, 300);
+
+ fileChooser = new JFileChooser(file.getParentFile());
+ fileChooser.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ defaultKeyPressed = true;
+ frame.dispose();
+ }
+ });
+
+ frame.getContentPane().add(BorderLayout.CENTER, fileChooser);
+ frame.setSize(fileChooser.getPreferredSize());
+ frame.setVisible(true);
+ }
+
+ private static File getTempFile() {
+ try {
+ File temp = File.createTempFile("test", ".txt");
+ temp.deleteOnExit();
+ return temp;
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JInternalFrame/4193219/IconCoord.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ @test
+ @bug 4193219
+ @summary
+ @author Your Name: Hania Gajewska area=swing
+ @run main/manual IconCoord
+*/
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+public class IconCoord {
+ static Test test = new Test();
+
+ public static void main(String[] args) throws Exception {
+ UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ new IconCoord().createAndShowGUI();
+ }
+ });
+ test.waitTestResult();
+ }
+
+ private void createAndShowGUI() {
+ StringBuilder instrText = new StringBuilder();
+ instrText.append("First, iconify internal frame \"Frame 1\" by clicking on its iconify button.\n");
+ instrText.append("Now, maximize the top-level window \"IconCoord\".\n");
+ instrText.append("The \"Frame 1\" icon should stay in the lower left corner of the desktop; ");
+ instrText.append("if it doesn't, press \"Fail\".\n");
+ instrText.append("Now move the icon to the middle of the desktop by dragging it by its ");
+ instrText.append("bumpy left side. Then iconify \"Frame 2\" by clicking on its iconify button.\n");
+ instrText.append("If the icon for frame two gets placed in the lower left corner of the ");
+ instrText.append("desktop (where the icon for \"Frame 1\" used to be before you moved it), ");
+ instrText.append("press \"Pass\". Otherwise, press \"Fail\".\n");
+
+ JDesktopPane dt = new JDesktopPane();
+
+ JButton tf;
+ JInternalFrame if1 = new JInternalFrame("Frame 1", false, false, false, true);
+ JComponent c = (JComponent) if1.getContentPane();
+ c.setLayout(new BorderLayout());
+
+ tf = new JButton ("ignore");
+ c.add (tf, BorderLayout.NORTH);
+
+ tf = new JButton ("ignore");
+ c.add (tf, BorderLayout.CENTER);
+
+ JInternalFrame if2 = new JInternalFrame("Frame 2", false, false, false, true);
+ c = (JComponent) if2.getContentPane();
+ c.setLayout(new BorderLayout());
+
+ tf = new JButton ("ignore");
+ c.add (tf, BorderLayout.NORTH);
+
+ tf = new JButton ("ignore");
+ c.add (tf, BorderLayout.CENTER);
+
+ if1.pack();
+ if1.setBounds(300, 0, 300, 80);
+ if2.pack();
+ if2.setBounds(0, 0, 300, 80);
+ dt.add(if1);
+ dt.add(if2);
+
+ if1.setVisible(true);
+ if2.setVisible(true);
+
+ int frameHeight = 500;
+
+ JScrollPane dtScrollPane = new JScrollPane(dt);
+ JFrame frame = test.createTestFrame("IconCoord", dtScrollPane, instrText.toString(), 250);
+ dt.setPreferredSize(new Dimension(650, frameHeight - 250));
+ frame.setSize (600,500);
+ frame.setVisible(true);
+ }
+
+ static class Test {
+ private boolean pass;
+ JFrame createTestFrame(String name, Component topComponent, String instructions, int instrHeight) {
+ final String PASS = "Pass";
+ final String FAIL = "Fail";
+ JFrame frame = new JFrame(name);
+ frame.setLayout(new BorderLayout());
+
+ JPanel testButtonsPanel = new JPanel();
+ testButtonsPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 20));
+
+ ActionListener btnAL = new ActionListener() {
+ public void actionPerformed(ActionEvent event) {
+ switch (event.getActionCommand()) {
+ case PASS:
+ pass();
+ break;
+ default:
+ throw new RuntimeException("Test failed.");
+ }
+ }
+ };
+ JButton passBtn = new JButton(PASS);
+ passBtn.addActionListener(btnAL);
+ passBtn.setActionCommand(PASS);
+
+ JButton failBtn = new JButton(FAIL);
+ failBtn.addActionListener(btnAL);
+ failBtn.setActionCommand(FAIL);
+
+ testButtonsPanel.add(BorderLayout.WEST, passBtn);
+ testButtonsPanel.add(BorderLayout.EAST, failBtn);
+
+ JTextArea instrText = new JTextArea();
+ instrText.setLineWrap(true);
+ instrText.setEditable(false);
+ JScrollPane instrScrollPane = new JScrollPane(instrText);
+ instrScrollPane.setMaximumSize(new Dimension(Integer.MAX_VALUE, instrHeight));
+ instrText.append(instructions);
+
+ JPanel servicePanel = new JPanel();
+ servicePanel.setLayout(new BorderLayout());
+ servicePanel.add(BorderLayout.CENTER, instrScrollPane);
+ servicePanel.add(BorderLayout.SOUTH, testButtonsPanel);
+
+ frame.add(BorderLayout.SOUTH, servicePanel);
+ frame.add(BorderLayout.CENTER, topComponent);
+ return frame;
+ }
+ synchronized void pass() {
+ pass = true;
+ notifyAll();
+ }
+ synchronized void waitTestResult() throws InterruptedException {
+ while (!pass) {
+ wait();
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JInternalFrame/4251301/bug4251301.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 4251301
+ @summary Keybinding for show/hide the system menu.
+ @author Andrey Pikalev
+ @run main/manual bug4251301
+*/
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.*;
+import sun.awt.OSInfo;
+import sun.awt.SunToolkit;
+
+
+public class bug4251301 {
+ private static final SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ static Test test = new Test();
+ public static void main(String[] args) throws Exception {
+ if (OSInfo.getOSType() == OSInfo.OSType.MACOSX) {
+ System.out.println("This test is not applicable for MacOS. Passed.");
+ return;
+ }
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+ toolkit.realSync();
+ test.waitTestResult();
+ }
+
+ public static void createAndShowGUI() {
+ final StringBuilder instructions = new StringBuilder();
+ instructions.append("Click with your mouse the content area of the internal frame with the title \"IFrame\" ");
+ instructions.append("and press Ctrl+Space. \n");
+ instructions.append("If the system menu shows up, press Esc. Then system menu should hide. \n");
+ instructions.append("If you success then press \"Pass\", else press \"Fail\".\n");
+
+ JDesktopPane dp = new JDesktopPane();
+ JInternalFrame jif = new JInternalFrame("IFrame",true,true,true,true);
+ dp.add(jif);
+ jif.setBounds(20, 20, 220, 100);
+ jif.setVisible(true);
+ try {
+ jif.setSelected(true);
+ } catch(PropertyVetoException pve) {
+ pve.printStackTrace();
+ throw new Error("Occures PropertyVetoException while set selection...");
+ }
+ JScrollPane dtScrollPane = new JScrollPane(dp);
+ JFrame testFrame = test.createTestFrame("Instructions", dtScrollPane, instructions.toString(), 500);
+ testFrame.setSize(500, 400);
+ testFrame.setVisible(true);
+ }
+ static class Test {
+ private boolean pass;
+ JFrame createTestFrame(String name, Component topComponent, String instructions, int instrHeight) {
+ final String PASS = "Pass";
+ final String FAIL = "Fail";
+ JFrame frame = new JFrame(name);
+ frame.setLayout(new BorderLayout());
+
+ JPanel testButtonsPanel = new JPanel();
+ testButtonsPanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 20));
+
+ ActionListener btnAL = new ActionListener() {
+ public void actionPerformed(ActionEvent event) {
+ switch (event.getActionCommand()) {
+ case PASS:
+ pass();
+ break;
+ default:
+ throw new RuntimeException("Test failed.");
+ }
+ }
+ };
+ JButton passBtn = new JButton(PASS);
+ passBtn.addActionListener(btnAL);
+ passBtn.setActionCommand(PASS);
+
+ JButton failBtn = new JButton(FAIL);
+ failBtn.addActionListener(btnAL);
+ failBtn.setActionCommand(FAIL);
+
+ testButtonsPanel.add(BorderLayout.WEST, passBtn);
+ testButtonsPanel.add(BorderLayout.EAST, failBtn);
+
+ JTextArea instrText = new JTextArea();
+ instrText.setLineWrap(true);
+ instrText.setEditable(false);
+ JScrollPane instrScrollPane = new JScrollPane(instrText);
+ instrScrollPane.setMaximumSize(new Dimension(Integer.MAX_VALUE, instrHeight));
+ instrText.append(instructions);
+
+ JPanel servicePanel = new JPanel();
+ servicePanel.setLayout(new BorderLayout());
+ servicePanel.add(BorderLayout.CENTER, instrScrollPane);
+ servicePanel.add(BorderLayout.SOUTH, testButtonsPanel);
+
+ frame.add(BorderLayout.SOUTH, servicePanel);
+ frame.add(BorderLayout.CENTER, topComponent);
+ return frame;
+ }
+ synchronized void pass() {
+ pass = true;
+ notifyAll();
+ }
+ synchronized void waitTestResult() throws InterruptedException {
+ while (!pass) {
+ wait();
+ }
+ }
+ }
+}
--- a/jdk/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -27,19 +27,19 @@
@author mcherkas
@run main InternalFrameIsNotCollectedTest
*/
-
import sun.awt.SunToolkit;
import javax.swing.*;
import java.awt.*;
-import java.awt.event.KeyEvent;
import java.beans.PropertyVetoException;
import java.util.Date;
public class InternalFrameIsNotCollectedTest {
- public static final int waitTime = 10000;
+ public static final int maxWaitTime = 100000;
+ public static final int waitTime = 5000;
private static Robot robot;
+ private static CustomInternalFrame iFrame;
public static void sync() {
@@ -62,12 +62,13 @@
});
sync();
invokeGC();
+ System.runFinalization();
Thread.sleep(1000); // it's better to wait 1 sec now then 10 sec later
Date startWaiting = new Date();
synchronized (CustomInternalFrame.waiter) {
// Sync with finalization thread.
Date now = new Date();
- while (now.getTime() - startWaiting.getTime() < waitTime && !CustomInternalFrame.finalized) {
+ while (now.getTime() - startWaiting.getTime() < maxWaitTime && !CustomInternalFrame.finalized) {
CustomInternalFrame.waiter.wait(waitTime);
now = new Date();
}
@@ -83,10 +84,8 @@
}
private static void closeInternalFrame() throws PropertyVetoException {
- robot.keyPress(KeyEvent.VK_CONTROL);
- robot.keyPress(KeyEvent.VK_F4);
- robot.keyRelease(KeyEvent.VK_F4);
- robot.keyRelease(KeyEvent.VK_CONTROL);
+ iFrame.setClosed(true);
+ iFrame = null;
}
private static void initUI() {
@@ -96,7 +95,7 @@
desktopPane.setDesktopManager(new DefaultDesktopManager());
frame.getContentPane().add(desktopPane, BorderLayout.CENTER);
- CustomInternalFrame iFrame = new CustomInternalFrame("Dummy Frame");
+ iFrame = new CustomInternalFrame("Dummy Frame");
iFrame.setSize(200, 200);
iFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JMenuBar/4750590/bug4750590.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @library ../../regtesthelpers
+ @build Util
+ @bug 4750590 8015597
+ @summary SwingSet: Cannot change Themes using menu accelerators
+ @author Alexander Zuev
+ @run main bug4750590
+ */
+
+import javax.swing.*;
+import java.awt.event.*;
+import java.awt.*;
+
+public class bug4750590 {
+
+ public static PassedListener pass = new PassedListener();
+ public static volatile boolean passed = false;
+
+ public static void main(String args[]) throws Throwable {
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ sun.awt.SunToolkit toolkit = (sun.awt.SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+
+ Robot robo = new Robot();
+ robo.setAutoDelay(500);
+ Util.hitMnemonics(robo, KeyEvent.VK_F);
+ robo.keyPress(KeyEvent.VK_M);
+ robo.keyRelease(KeyEvent.VK_M);
+
+ toolkit.realSync();
+
+ if (passed) {
+ System.out.println("Test passed!");
+ } else {
+ throw new RuntimeException("Test FAILED!");
+ }
+ }
+
+ private static void createAndShowGUI() {
+ JFrame mainFrame = new JFrame("Bug 4750590");
+ JMenuBar mbar = new JMenuBar();
+ JMenu menu = new JMenu("File");
+ menu.setMnemonic('F');
+ JMenu submenu = new JMenu("Submenu");
+ submenu.add(new JMenuItem("SubMenu Item 1")).setMnemonic('S');
+ submenu.add(new JMenuItem("SubMenu Item 2"));
+ menu.add(submenu);
+
+ menu.add(new JMenuItem("Menu Item 1"));
+ JMenuItem menuItem = menu.add(new JMenuItem("Menu Item 2"));
+ menuItem.setMnemonic('M');
+ menuItem.addActionListener(pass);
+ mbar.add(menu);
+ mainFrame.setJMenuBar(mbar);
+
+ mainFrame.setSize(200, 200);
+ mainFrame.setLocation(200, 200);
+ mainFrame.setVisible(true);
+ mainFrame.toFront();
+ }
+
+ public static class PassedListener implements ActionListener {
+ public void actionPerformed(ActionEvent ev) {
+ passed = true;
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JMenuItem/4171437/bug4171437.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 4171437
+ @library ../../regtesthelpers
+ @build Util
+ @author Georges Saab
+ @run main bug4171437
+*/
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ArrayList;
+import javax.swing.*;
+import javax.swing.event.*;
+import sun.awt.SunToolkit;
+
+public class bug4171437 {
+ static volatile boolean closeActivated = false;
+ static volatile boolean customActivated = false;
+
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ Util.hitMnemonics(robot, KeyEvent.VK_F);
+ Util.hitKeys(robot, KeyEvent.VK_C);
+
+ toolkit.realSync();
+ Thread.sleep(1000);
+
+ if (!closeActivated || customActivated) {
+ throw new RuntimeException("Didn't pass the muster");
+ }
+ }
+ public static void createAndShowGUI() {
+ JMenuBar menubar = new JMenuBar();
+
+ JMenu fileMenu = new JMenu("File");
+ fileMenu.setMnemonic('f');
+
+ JMenuItem fmi1 = new JMenuItem();
+ fmi1 = new JMenuItem("Open");
+ JMenuItem fmi2 = new JMenuItem();
+ fmi2 = new JMenuItem("Close");
+ fmi2.setMnemonic('c');
+ fmi2.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ closeActivated = true;
+ }
+ });
+
+ fileMenu.add( fmi1);
+ fileMenu.add( fmi2);
+
+ menubar.add( fileMenu);
+
+ JMenu custom = new JMenu("Custom");
+ custom.setMnemonic('c');
+ JMenuItem cmi = new JMenuItem();
+ cmi = new JMenuItem("Properties");
+ cmi.setMnemonic('p');
+ custom.add( cmi);
+ custom.addMenuListener(new MenuListener() {
+ public void menuSelected(MenuEvent e) {
+ customActivated = true;
+ }
+ public void menuDeselected(MenuEvent e) {}
+ public void menuCanceled(MenuEvent e) {}
+ });
+ menubar.add( custom);
+
+ JFrame frame = new JFrame();
+ frame.setJMenuBar( menubar);
+ frame.setSize(300, 300);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.pack();
+ frame.setVisible(true);
+ }
+}
--- a/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -35,12 +35,13 @@
import javax.swing.*;
public class ActionListenerCalledTwiceTest {
- static String menuItems[] = { "Item1", "Item2", "Item3", "Item4" };
+ static String menuItems[] = { "Item1", "Item2", "Item3", "Item4", "Item5" };
static KeyStroke keyStrokes[] = {
KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.META_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.SHIFT_MASK),
- KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.META_MASK)
+ KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.META_MASK),
+ KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK)
};
static volatile int listenerCallCounter = 0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JPopupMenu/4458079/bug4458079.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 4458079
+ @library ../../regtesthelpers
+ @build Util
+ @summary Tests calling removeAll() from PopupMenuListener
+ @author Peter Zhelezniakov
+ @run main bug4458079
+*/
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+import java.awt.event.KeyEvent;
+import java.util.ArrayList;
+import sun.awt.SunToolkit;
+
+public class bug4458079 extends JFrame implements PopupMenuListener {
+ public JMenu menu;
+
+ static volatile boolean itemASelected = false;
+ public static void main(String[] args) throws Exception {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ new bug4458079().createAndShowGUI();
+ }
+ });
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ Util.hitMnemonics(robot, KeyEvent.VK_M);
+
+ toolkit.realSync();
+ Thread.sleep(1000);
+
+ Util.hitKeys(robot, KeyEvent.VK_DOWN);
+ Util.hitKeys(robot, KeyEvent.VK_ENTER);
+
+ toolkit.realSync();
+ Thread.sleep(1000);
+
+ if (!itemASelected) {
+ throw new RuntimeException("Test failed: arrow key traversal in JMenu broken!");
+ }
+ }
+ public void createAndShowGUI() {
+ JMenuBar bar = new JMenuBar();
+ menu = new JMenu("Menu");
+ menu.add(new JMenuItem("1"));
+ menu.add(new JMenuItem("2"));
+ menu.setMnemonic(KeyEvent.VK_M);
+ menu.getPopupMenu().addPopupMenuListener(this);
+ bar.add(menu);
+
+ setJMenuBar(bar);
+ getContentPane().add(new JButton(""));
+ setSize(300, 300);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ pack();
+ setVisible(true);
+ }
+
+ public void rebuildMenu() {
+ menu.removeAll();
+ final String itemCommand = "A";
+ JMenuItem item = new JMenuItem(itemCommand);
+ item.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ JMenuItem item = ((JMenuItem)e.getSource());
+ if (e.getActionCommand() == itemCommand) {
+ itemASelected = true;
+ }
+ }
+ });
+ menu.add(item);
+ menu.add(new JMenuItem("B"));
+ }
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ rebuildMenu();
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
+ public void popupMenuCanceled(PopupMenuEvent e) {}
+}
--- a/jdk/test/javax/swing/JScrollBar/7163696/Test7163696.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JScrollBar/7163696/Test7163696.java Thu Oct 03 19:18:54 2013 +0100
@@ -59,7 +59,8 @@
UIManager.setLookAndFeel(info.getClassName());
SwingUtilities.invokeAndWait(this);
- toolkit.realSync(500); // after creation
+ toolkit.realSync(); // after creation
+ Thread.sleep(1000);
Point point = this.bar.getLocation();
SwingUtilities.convertPointToScreen(point, this.bar);
@@ -69,7 +70,8 @@
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
- toolkit.realSync(500); // before validation
+ toolkit.realSync(); // before validation
+ Thread.sleep(1000);
SwingUtilities.invokeAndWait(this);
if (this.bar != null) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JSplitPane/4816114/bug4816114.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 4816114
+ @summary REGRESSION: Regression in divider location behavior when JSplitPane is resized
+ @author Andrey Pikalev
+ @run main bug4816114
+*/
+
+import javax.swing.*;
+import java.awt.*;
+import java.lang.reflect.*;
+import sun.awt.SunToolkit;
+
+
+public class bug4816114 {
+
+ JFrame fr;
+ JSplitPane splitPane;
+
+ boolean[] resized = new boolean[] { false, false, false,
+ false, false, false };
+ static int step = 0;
+ boolean h_passed = false;
+ boolean v_passed = false;
+
+ static bug4816114 test = new bug4816114();
+
+ public static void main(String[] args) throws InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ test.createAndShowGUI();
+ }
+ });
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+ Thread.sleep(1000);
+ Thread.sleep(2000);
+
+ step++;
+ test.doTest(150, 300);
+
+ step++;
+ test.doTest(650, 300);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ test.splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
+ }
+ });
+
+ step++;
+ test.doTest(300, 650);
+
+ step++;
+ test.doTest(300, 150);
+
+ step++;
+ test.doTest(300, 650);
+
+ if ( !test.isPassed() ) {
+ throw new Error("The divider location is wrong.");
+ }
+ }
+ public void createAndShowGUI() {
+ fr = new JFrame("Test");
+
+ splitPane = new TestSplitPane();
+ splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
+ splitPane.setResizeWeight(0);
+ splitPane.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
+
+ JButton leftButton = new JButton("LEFT");
+ leftButton.setPreferredSize(new Dimension(300, 300));
+ leftButton.setMinimumSize(new Dimension(150, 150));
+ splitPane.setLeftComponent(leftButton);
+
+ JButton rightButton = new JButton("RIGHT");
+ rightButton.setPreferredSize(new Dimension(300, 300));
+ rightButton.setMinimumSize(new Dimension(150, 150));
+ splitPane.setRightComponent(rightButton);
+
+ fr.getContentPane().add(splitPane, BorderLayout.CENTER);
+
+ fr.pack();
+ fr.setVisible(true);
+ }
+
+ void doTest(final int width, final int height) throws InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ splitPane.setPreferredSize(new Dimension(width, height));
+ fr.pack();
+ }
+ });
+
+ synchronized (bug4816114.this) {
+ while (!resized[step]) {
+ bug4816114.this.wait();
+ }
+ }
+ }
+
+ synchronized void setPassed(int orientation, boolean passed) {
+ if (orientation == JSplitPane.HORIZONTAL_SPLIT) {
+ this.h_passed = passed;
+ }
+ else {
+ this.v_passed = passed;
+ }
+ }
+
+ synchronized boolean isPassed() {
+ return h_passed && v_passed;
+ }
+
+
+ class TestSplitPane extends JSplitPane {
+ public void setDividerLocation(int location) {
+ super.setDividerLocation(location);
+
+ if ( splitPane.getDividerLocation() == 151 ) {
+ setPassed(getOrientation(), true);
+ }
+
+ synchronized (bug4816114.this) {
+ resized[step] = true;
+ bug4816114.this.notifyAll();
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTabbedPane/7024235/Test7024235.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.BorderLayout;
+import sun.awt.SunToolkit;
+
+import java.awt.Container;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JTabbedPane;
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+
+/*
+ * @test
+ * @bug 7024235
+ * @summary Tests JFrame.pack() with the JTabbedPane
+ * @author Sergey Malenkov
+ */
+
+public class Test7024235 implements Runnable {
+
+ private static final boolean AUTO = null != System.getProperty("test.src", null);
+
+ public static void main(String[] args) throws Exception {
+ Test7024235 test = new Test7024235();
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
+ UIManager.setLookAndFeel(info.getClassName());
+
+ test.test();
+ toolkit.realSync();
+ Thread.sleep(1000);
+ test.test();
+ }
+ }
+
+ private volatile JTabbedPane pane;
+ private volatile boolean passed;
+
+ public void run() {
+ if (this.pane == null) {
+ this.pane = new JTabbedPane();
+ this.pane.addTab("1", new Container());
+ this.pane.addTab("2", new JButton());
+ this.pane.addTab("3", new JCheckBox());
+
+ JFrame frame = new JFrame();
+ frame.add(BorderLayout.WEST, this.pane);
+ frame.pack();
+ frame.setVisible(true);
+
+ test("first");
+ }
+ else {
+ test("second");
+ if (this.passed || AUTO) { // do not close a frame for manual review
+ SwingUtilities.getWindowAncestor(this.pane).dispose();
+ }
+ this.pane = null;
+ }
+ }
+
+ private void test() throws Exception {
+ SwingUtilities.invokeAndWait(this);
+ if (!this.passed && AUTO) { // error reporting only for automatic testing
+ throw new Error("TEST FAILED");
+ }
+ }
+
+ private void test(String step) {
+ this.passed = true;
+ for (int index = 0; index < this.pane.getTabCount(); index++) {
+ Rectangle bounds = this.pane.getBoundsAt(index);
+ int centerX = bounds.x + bounds.width / 2;
+ int centerY = bounds.y + bounds.height / 2;
+ int actual = this.pane.indexAtLocation(centerX, centerY);
+ if (index != actual) {
+ System.out.println("name = " + UIManager.getLookAndFeel().getName());
+ System.out.println("step = " + step);
+ System.out.println("index = " + index);
+ System.out.println("bounds = " + bounds);
+ System.out.println("indexAtLocation(" + centerX + "," + centerX + ") returns " + actual);
+ this.passed = false;
+ }
+ }
+ }
+}
--- a/jdk/test/javax/swing/JTable/7068740/bug7068740.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JTable/7068740/bug7068740.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,6 +37,7 @@
import java.awt.*;
import java.awt.event.KeyEvent;
import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.atomic.AtomicInteger;
public class bug7068740 extends JFrame {
@@ -66,6 +67,7 @@
};
table = new JTable(model);
+ table.setRowSelectionInterval(0, 0);
LayerUI<JComponent> layerUI = new LayerUI<>();
JLayer<JComponent> layer = new JLayer<>(table, layerUI);
JScrollPane scrollPane = new JScrollPane(layer);
@@ -78,7 +80,7 @@
try {
if (robot == null) {
robot = new Robot();
- robot.setAutoDelay(20);
+ robot.setAutoDelay(50);
}
if (toolkit == null) {
@@ -104,24 +106,37 @@
}
}
- private static void doTest() {
+ private static int getSelectedRow() throws Exception {
+ final AtomicInteger row = new AtomicInteger(-1);
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ row.set(table.getSelectedRow());
+ }
+ });
+ return row.intValue();
+ }
+
+ private static void doTest() throws Exception {
toolkit.realSync();
- table.setRowSelectionInterval(0, 0);
robot.keyPress(KeyEvent.VK_PAGE_DOWN);
+ robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
toolkit.realSync();
- if (table.getSelectedRow() != 19) {
+
+ if (getSelectedRow() != 19) {
throw new RuntimeException("Test failed");
}
robot.keyPress(KeyEvent.VK_PAGE_UP);
+ robot.keyRelease(KeyEvent.VK_PAGE_UP);
toolkit.realSync();
- if (table.getSelectedRow() != 0) {
+ if (getSelectedRow() != 0) {
throw new RuntimeException("Test failed");
}
}
- public static void main(String[] args) {
+ public static void main(String[] args) throws Exception {
try {
UIManager.setLookAndFeel(new MetalLookAndFeel());
setUp();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JTree/4927934/bug4927934.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,247 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/* @test
+ @bug 4927934
+ @summary JTree traversal is unlike Native windows tree traversal
+ @author Andrey Pikalev
+ @run main bug4927934
+*/
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.tree.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.reflect.InvocationTargetException;
+import sun.awt.*;
+
+public class bug4927934 implements TreeSelectionListener, TreeExpansionListener, FocusListener {
+
+ final static Object listener = new bug4927934();
+
+ static boolean focusGained = false;
+ public static boolean selectionChanged = false;
+ public static boolean treeExpanded = false;
+ public static boolean treeCollapsed = false;
+
+ static JFrame frame;
+ static JTree tree;
+ static Robot robot;
+
+ public static void main(String args[]) throws Exception {
+ UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
+
+ robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ frame = new JFrame();
+
+ DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
+ createNodes(root);
+ tree = new JTree(root);
+ JScrollPane scrollPane = new JScrollPane(tree);
+ frame.getContentPane().add(scrollPane);
+
+ tree.addFocusListener((FocusListener)listener);
+ tree.addTreeSelectionListener((TreeSelectionListener)listener);
+ tree.addTreeExpansionListener((TreeExpansionListener)listener);
+
+ frame.setSize(300, 300);
+ frame.setVisible(true);
+ }
+ });
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ toolkit.realSync();
+ Thread.sleep(1000);
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ tree.requestFocus();
+ }
+ });
+
+ synchronized(listener) {
+ if (!focusGained) {
+ System.out.println("waiting focusGained...");
+ try {
+ listener.wait(10000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ // GO TO RIGHT
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_RIGHT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 0)) {
+ throw new RuntimeException("Root should be selected");
+ }
+
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_RIGHT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 1)) {
+ throw new RuntimeException("Node should be selected");
+ }
+
+ treeExpanded = false;
+ hitKey(KeyEvent.VK_RIGHT);
+ toolkit.realSync();
+ if (!isTreeExpanded()) {
+ throw new RuntimeException("Node should be expanded");
+ }
+
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_RIGHT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 2)) {
+ throw new RuntimeException("Leaf1 should be selected");
+ }
+
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_RIGHT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 2)) {
+ throw new RuntimeException("Leaf1 should be selected");
+ }
+
+ // GO TO LEFT
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_LEFT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 1)) {
+ throw new RuntimeException("Node should be selected");
+ }
+
+ treeCollapsed = false;
+ hitKey(KeyEvent.VK_LEFT);
+ if (!isTreeCollapsed()) {
+ throw new RuntimeException("Node should be collapsed");
+ }
+
+ selectionChanged = false;
+ hitKey(KeyEvent.VK_LEFT);
+ toolkit.realSync();
+ if (!checkSelectionChanged(tree, 0)) {
+ throw new RuntimeException("Root should be selected");
+ }
+
+ treeCollapsed = false;
+ hitKey(KeyEvent.VK_LEFT);
+ toolkit.realSync();
+ if (!isTreeCollapsed()) {
+ throw new RuntimeException("Root should be collapsed");
+ }
+ }
+
+
+ synchronized public void focusLost(FocusEvent e) {
+ }
+
+ synchronized public void focusGained(FocusEvent e) {
+ focusGained = true;
+ System.out.println("focusGained");
+ listener.notifyAll();
+ }
+
+ private static void createNodes(DefaultMutableTreeNode root) {
+ DefaultMutableTreeNode node = new DefaultMutableTreeNode("Node");
+ node.add(new DefaultMutableTreeNode("Leaf1"));
+ node.add(new DefaultMutableTreeNode("Leaf2"));
+ root.add(node);
+ root.add(new DefaultMutableTreeNode("Leaf3"));
+ }
+
+ synchronized public void valueChanged(TreeSelectionEvent e) {
+ selectionChanged = true;
+ System.out.println("selectionChanged");
+ notifyAll();
+ }
+
+ synchronized public void treeCollapsed(TreeExpansionEvent e) {
+ System.out.println("treeCollapsed");
+ treeCollapsed = true;
+ notifyAll();
+ }
+
+ synchronized public void treeExpanded(TreeExpansionEvent e) {
+ System.out.println("treeExpanded");
+ treeExpanded = true;
+ notifyAll();
+ }
+
+ private static void hitKey(int key) {
+ System.out.println("key " + key + " pressed");
+ robot.keyPress(key);
+ robot.keyRelease(key);
+ }
+
+ private static boolean checkSelectionChanged(JTree tree, int shouldBeSel) {
+ synchronized(listener) {
+ if (!selectionChanged) {
+ System.out.println("waiting for selectionChanged...");
+ try {
+ listener.wait(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ int selRow = tree.getLeadSelectionRow();
+ System.out.println("Selected row: " + selRow);
+ return selRow == shouldBeSel;
+ }
+
+ private static boolean isTreeExpanded() {
+ synchronized(listener) {
+ if (!treeExpanded) {
+ System.out.println("waiting for treeExpanded...");
+ try {
+ listener.wait(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return treeExpanded;
+ }
+
+ private static boolean isTreeCollapsed() {
+ synchronized(listener) {
+ if (!treeCollapsed) {
+ System.out.println("waiting for treeCollapsed...");
+ try {
+ listener.wait(5000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return treeCollapsed;
+ }
+}
--- a/jdk/test/javax/swing/JTree/8013571/Test8013571.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/JTree/8013571/Test8013571.java Thu Oct 03 19:18:54 2013 +0100
@@ -27,8 +27,8 @@
/*
* @test
- * @bug 8016545
- * @summary Tests beans with public fields
+ * @bug 8013571
+ * @summary Tests null as a root of TreeModelEvent
* @author Sergey Malenkov
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/Popup/TaskbarPositionTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,340 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+/**
+ * @test @bug 4245587 4474813 4425878 4767478 8015599
+ * @author Mark Davidson
+ * @summary Tests the location of the heavy weight popup portion of JComboBox,
+ * JMenu and JPopupMenu.
+ * @library ../regtesthelpers
+ * @build Util
+ * @run main TaskbarPositionTest
+ */
+public class TaskbarPositionTest extends JFrame implements ActionListener {
+
+ private boolean done;
+ private Throwable error;
+ private static TaskbarPositionTest test;
+ private static JPopupMenu popupMenu;
+ private static JPanel panel;
+ private static JComboBox<String> combo1;
+ private static JComboBox<String> combo2;
+ private static JMenuBar menubar;
+ private static JMenu menu1;
+ private static JMenu menu2;
+ private static Rectangle fullScreenBounds;
+ // The usable desktop space: screen size - screen insets.
+ private static Rectangle screenBounds;
+ private static String[] numData = {
+ "One", "Two", "Three", "Four", "Five", "Six", "Seven"
+ };
+ private static String[] dayData = {
+ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"
+ };
+ private static char[] mnDayData = {
+ 'M', 'T', 'W', 'R', 'F', 'S', 'U'
+ };
+
+ public TaskbarPositionTest() {
+ super("Use CTRL-down to show a JPopupMenu");
+ setContentPane(panel = createContentPane());
+ setJMenuBar(createMenuBar("1 - First Menu", true));
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ // CTRL-down will show the popup.
+ panel.getInputMap().put(KeyStroke.getKeyStroke(
+ KeyEvent.VK_DOWN, InputEvent.CTRL_MASK), "OPEN_POPUP");
+ panel.getActionMap().put("OPEN_POPUP", new PopupHandler());
+
+ pack();
+
+ Toolkit toolkit = Toolkit.getDefaultToolkit();
+ fullScreenBounds = new Rectangle(new Point(), toolkit.getScreenSize());
+ screenBounds = new Rectangle(new Point(), toolkit.getScreenSize());
+
+ // Place the frame near the bottom. This is a pretty wild guess.
+ this.setLocation(0, (int) screenBounds.getHeight() - 2 * this.getHeight());
+
+ // Reduce the screen bounds by the insets.
+ GraphicsConfiguration gc = this.getGraphicsConfiguration();
+ if (gc != null) {
+ Insets screenInsets = toolkit.getScreenInsets(gc);
+ screenBounds = gc.getBounds();
+ screenBounds.width -= (screenInsets.left + screenInsets.right);
+ screenBounds.height -= (screenInsets.top + screenInsets.bottom);
+ screenBounds.x += screenInsets.left;
+ screenBounds.y += screenInsets.top;
+ }
+
+ setVisible(true);
+ }
+
+ public static class ComboPopupCheckListener implements PopupMenuListener {
+
+ public void popupMenuCanceled(PopupMenuEvent ev) {
+ }
+
+ public void popupMenuWillBecomeVisible(PopupMenuEvent ev) {
+ }
+
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent ev) {
+ Point cpos = combo1.getLocation();
+ SwingUtilities.convertPointToScreen(cpos, panel);
+
+ JPopupMenu pm = (JPopupMenu) combo1.getUI().getAccessibleChild(combo1, 0);
+
+ if (pm != null) {
+ Point p = pm.getLocation();
+ SwingUtilities.convertPointToScreen(p, pm);
+ if (p.y < cpos.y) {
+ throw new RuntimeException("ComboBox popup is wrongly aligned");
+ } // check that popup was opened down
+ }
+ }
+ }
+
+ private class PopupHandler extends AbstractAction {
+
+ public void actionPerformed(ActionEvent e) {
+ if (!popupMenu.isVisible()) {
+ popupMenu.show((Component) e.getSource(), 40, 40);
+ }
+ isPopupOnScreen(popupMenu, fullScreenBounds);
+ }
+ }
+
+ class PopupListener extends MouseAdapter {
+
+ private JPopupMenu popup;
+
+ public PopupListener(JPopupMenu popup) {
+ this.popup = popup;
+ }
+
+ public void mousePressed(MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ maybeShowPopup(e);
+ }
+
+ private void maybeShowPopup(MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ popup.show(e.getComponent(), e.getX(), e.getY());
+ isPopupOnScreen(popup, fullScreenBounds);
+ }
+ }
+ }
+
+ /**
+ * Tests if the popup is on the screen.
+ */
+ public static void isPopupOnScreen(JPopupMenu popup, Rectangle checkBounds) {
+ Dimension dim = popup.getSize();
+ Point pt = new Point();
+ SwingUtilities.convertPointToScreen(pt, popup);
+ Rectangle bounds = new Rectangle(pt, dim);
+
+ if (!SwingUtilities.isRectangleContainingRectangle(checkBounds, bounds)) {
+ throw new RuntimeException("We do not match! " + checkBounds + " / " + bounds);
+ }
+
+ }
+
+ private JPanel createContentPane() {
+ JPanel panel = new JPanel();
+
+ combo1 = new JComboBox<>(numData);
+ panel.add(combo1);
+ combo2 = new JComboBox<>(dayData);
+ combo2.setEditable(true);
+ panel.add(combo2);
+ panel.setSize(300, 200);
+
+ popupMenu = new JPopupMenu();
+ JMenuItem item;
+ for (int i = 0; i < dayData.length; i++) {
+ item = popupMenu.add(new JMenuItem(dayData[i], mnDayData[i]));
+ item.addActionListener(this);
+ }
+ panel.addMouseListener(new PopupListener(popupMenu));
+
+ JTextField field = new JTextField("CTRL+down for Popup");
+ // CTRL-down will show the popup.
+ field.getInputMap().put(KeyStroke.getKeyStroke(
+ KeyEvent.VK_DOWN, InputEvent.CTRL_MASK), "OPEN_POPUP");
+ field.getActionMap().put("OPEN_POPUP", new PopupHandler());
+
+ panel.add(field);
+
+ return panel;
+ }
+
+ /**
+ * @param str name of Menu
+ * @param bFlag set mnemonics on menu items
+ */
+ private JMenuBar createMenuBar(String str, boolean bFlag) {
+ menubar = new JMenuBar();
+
+ menu1 = new JMenu(str);
+ menu1.setMnemonic(str.charAt(0));
+ menu1.addActionListener(this);
+
+ menubar.add(menu1);
+ for (int i = 0; i < 8; i++) {
+ JMenuItem menuitem = new JMenuItem("1 JMenuItem" + i);
+ menuitem.addActionListener(this);
+ if (bFlag) {
+ menuitem.setMnemonic('0' + i);
+ }
+ menu1.add(menuitem);
+ }
+
+ // second menu
+ menu2 = new JMenu("2 - Second Menu");
+ menu2.addActionListener(this);
+ menu2.setMnemonic('2');
+
+ menubar.add(menu2);
+ for (int i = 0; i < 5; i++) {
+ JMenuItem menuitem = new JMenuItem("2 JMenuItem" + i);
+ menuitem.addActionListener(this);
+
+ if (bFlag) {
+ menuitem.setMnemonic('0' + i);
+ }
+ menu2.add(menuitem);
+ }
+ JMenu submenu = new JMenu("Sub Menu");
+ submenu.setMnemonic('S');
+ submenu.addActionListener(this);
+ for (int i = 0; i < 5; i++) {
+ JMenuItem menuitem = new JMenuItem("S JMenuItem" + i);
+ menuitem.addActionListener(this);
+ if (bFlag) {
+ menuitem.setMnemonic('0' + i);
+ }
+ submenu.add(menuitem);
+ }
+ menu2.add(new JSeparator());
+ menu2.add(submenu);
+
+ return menubar;
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ Object obj = evt.getSource();
+ if (obj instanceof JMenuItem) {
+ // put the focus on the noneditable combo.
+ combo1.requestFocus();
+ }
+ }
+
+ public static void main(String[] args) throws Throwable {
+
+ sun.awt.SunToolkit toolkit = (sun.awt.SunToolkit) Toolkit.getDefaultToolkit();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ test = new TaskbarPositionTest();
+ }
+ });
+
+ // Use Robot to automate the test
+ Robot robot;
+ robot = new Robot();
+ robot.setAutoDelay(125);
+
+ // 1 - menu
+ Util.hitMnemonics(robot, KeyEvent.VK_1);
+
+ toolkit.realSync();
+ isPopupOnScreen(menu1.getPopupMenu(), screenBounds);
+
+ // 2 menu with sub menu
+ robot.keyPress(KeyEvent.VK_RIGHT);
+ robot.keyRelease(KeyEvent.VK_RIGHT);
+ Util.hitMnemonics(robot, KeyEvent.VK_S);
+
+ toolkit.realSync();
+ isPopupOnScreen(menu2.getPopupMenu(), screenBounds);
+
+ robot.keyPress(KeyEvent.VK_ENTER);
+ robot.keyRelease(KeyEvent.VK_ENTER);
+
+ // Focus should go to non editable combo box
+ toolkit.realSync();
+ Thread.sleep(500);
+
+ robot.keyPress(KeyEvent.VK_DOWN);
+
+ // How do we check combo boxes?
+
+ // Editable combo box
+ robot.keyPress(KeyEvent.VK_TAB);
+ robot.keyRelease(KeyEvent.VK_TAB);
+ robot.keyPress(KeyEvent.VK_DOWN);
+ robot.keyRelease(KeyEvent.VK_DOWN);
+
+ // combo1.getUI();
+
+ // Popup from Text field
+ robot.keyPress(KeyEvent.VK_TAB);
+ robot.keyRelease(KeyEvent.VK_TAB);
+ robot.keyPress(KeyEvent.VK_CONTROL);
+ robot.keyPress(KeyEvent.VK_DOWN);
+ robot.keyRelease(KeyEvent.VK_DOWN);
+ robot.keyRelease(KeyEvent.VK_CONTROL);
+
+ // Popup from a mouse click.
+ Point pt = new Point(2, 2);
+ SwingUtilities.convertPointToScreen(pt, panel);
+ robot.mouseMove((int) pt.getX(), (int) pt.getY());
+ robot.mousePress(InputEvent.BUTTON3_MASK);
+ robot.mouseRelease(InputEvent.BUTTON3_MASK);
+
+ toolkit.realSync();
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ test.setLocation(-30, 100);
+ combo1.addPopupMenuListener(new ComboPopupCheckListener());
+ combo1.requestFocus();
+ }
+ });
+
+ robot.keyPress(KeyEvent.VK_DOWN);
+ robot.keyRelease(KeyEvent.VK_DOWN);
+ robot.keyPress(KeyEvent.VK_ESCAPE);
+ robot.keyRelease(KeyEvent.VK_ESCAPE);
+
+ toolkit.realSync();
+ Thread.sleep(500);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/basic/BasicMenuUI/4983388/bug4983388.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 4983388 8015600
+ @summary shortcuts on menus do not work on JDS
+ @author Oleg Mokhovikov
+ @library ../../../../regtesthelpers
+ @build Util
+ @run main bug4983388
+*/
+
+import sun.awt.*;
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.event.MenuListener;
+import javax.swing.event.MenuEvent;
+import java.awt.event.KeyEvent;
+
+public class bug4983388 {
+ static volatile boolean bMenuSelected = false;
+
+ private static class TestMenuListener implements MenuListener {
+ public void menuCanceled(MenuEvent e) {}
+ public void menuDeselected(MenuEvent e) {}
+ public void menuSelected(MenuEvent e) {
+ System.out.println("menuSelected");
+ bMenuSelected = true;
+ }
+ }
+
+ private static void createAndShowGUI() {
+ JMenuBar menuBar = new JMenuBar();
+ JMenu menu = new JMenu("File");
+ menu.setMnemonic('F');
+ menuBar.add(menu);
+ JFrame frame = new JFrame();
+ frame.setJMenuBar(menuBar);
+ frame.pack();
+ frame.setVisible(true);
+ MenuListener listener = new TestMenuListener();
+ menu.addMenuListener(listener);
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ try {
+ UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
+ } catch (UnsupportedLookAndFeelException | ClassNotFoundException ex) {
+ System.err.println("GTKLookAndFeel is not supported on this platform. Using defailt LaF for this platform.");
+ }
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ Robot robot = new Robot();
+ Util.hitMnemonics(robot, KeyEvent.VK_F);
+
+ toolkit.realSync();
+
+ if (!bMenuSelected) {
+ throw new RuntimeException("shortcuts on menus do not work");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/basic/BasicTabbedPaneUI/Test6943780.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.JButton;
+import javax.swing.JTabbedPane;
+import java.awt.Component;
+
+import static javax.swing.SwingUtilities.invokeAndWait;
+
+/*
+ * @test
+ * @bug 4873983 6943780
+ * @summary Tests JTabbedPane with SCROLL_TAB_LAYOUT
+ * @author Sergey Malenkov
+ */
+public class Test6943780 implements Runnable, Thread.UncaughtExceptionHandler {
+ public static void main(String[] args) throws Exception {
+ invokeAndWait(new Test6943780());
+ }
+
+ @Override
+ public void uncaughtException(Thread thread, Throwable throwable) {
+ throwable.printStackTrace();
+ System.exit(1);
+ }
+
+ @Override
+ public void run() {
+ JTabbedPane pane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT);
+ pane.addTab("first", new JButton("first"));
+ pane.addTab("second", new JButton("second"));
+ for (Component component : pane.getComponents()) {
+ component.setSize(100, 100);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/plaf/basic/BasicTreeUI/8023474/bug8023474.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8023474
+ * @summary Tests that the first mouse press starts editing in JTree
+ * @author Dmitry Markov
+ * @run main bug8023474
+ */
+
+import sun.awt.SunToolkit;
+
+import javax.swing.*;
+import javax.swing.event.CellEditorListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeCellEditor;
+import javax.swing.tree.TreeCellRenderer;
+import java.awt.*;
+import java.awt.event.InputEvent;
+import java.util.EventObject;
+
+public class bug8023474 {
+ private static JTree tree;
+
+ public static void main(String[] args) throws Exception {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ toolkit.realSync();
+
+ Point point = getRowPointToClick(1);
+ robot.mouseMove(point.x, point.y);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+
+ toolkit.realSync();
+
+ Boolean result = (Boolean)tree.getCellEditor().getCellEditorValue();
+ if (!result) {
+ throw new RuntimeException("Test Failed!");
+ }
+ }
+
+ private static void createAndShowGUI() {
+ try {
+ UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
+ DefaultMutableTreeNode item = new DefaultMutableTreeNode("item");
+ DefaultMutableTreeNode subItem = new DefaultMutableTreeNode("subItem");
+
+ root.add(item);
+ item.add(subItem);
+
+ DefaultTreeModel model = new DefaultTreeModel(root);
+ tree = new JTree(model);
+
+ tree.setCellEditor(new Editor());
+ tree.setEditable(true);
+ tree.setRowHeight(30);
+ tree.setCellRenderer(new CheckboxCellRenderer());
+
+ JFrame frame = new JFrame("bug8023474");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.add(new JScrollPane(tree));
+ frame.setSize(400, 300);
+ frame.setVisible(true);
+ }
+
+ private static Point getRowPointToClick(final int row) throws Exception {
+ final Point[] result = new Point[1];
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ Rectangle rect = tree.getRowBounds(row);
+ Point point = new Point(rect.x + 10, rect.y + rect.height / 2);
+ SwingUtilities.convertPointToScreen(point, tree);
+ result[0] = point;
+ }
+ });
+ return result[0];
+ }
+
+ private static class Editor extends JPanel implements TreeCellEditor {
+ private JCheckBox checkbox;
+
+ public Editor() {
+ setOpaque(false);
+ checkbox = new JCheckBox();
+ add(checkbox);
+ }
+
+ public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected,
+ boolean expanded, boolean leaf, int row) {
+ checkbox.setText(value.toString());
+ checkbox.setSelected(false);
+ return this;
+ }
+
+ public Object getCellEditorValue() {
+ return checkbox.isSelected();
+ }
+
+ public boolean isCellEditable(EventObject anEvent) {
+ return true;
+ }
+
+ public boolean shouldSelectCell(EventObject anEvent) {
+ return true;
+ }
+
+ public boolean stopCellEditing() {
+ return true;
+ }
+
+ public void cancelCellEditing() {
+ }
+
+ public void addCellEditorListener(CellEditorListener l) {
+ }
+
+ public void removeCellEditorListener(CellEditorListener l) {
+ }
+ }
+
+ private static class CheckboxCellRenderer extends JPanel implements TreeCellRenderer {
+ private JCheckBox checkbox;
+
+ public CheckboxCellRenderer() {
+ setOpaque(false);
+ checkbox = new JCheckBox();
+ add(checkbox);
+ }
+
+ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
+ boolean leaf, int row, boolean hasFocus) {
+ checkbox.setText(value.toString());
+ checkbox.setSelected(false);
+ return this;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/AbstractDocument/6968363/Test6968363.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import sun.awt.SunToolkit;
+
+import java.awt.Robot;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.UndoableEditListener;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.PlainDocument;
+import javax.swing.text.Position;
+import javax.swing.text.Segment;
+
+import static java.awt.BorderLayout.NORTH;
+import static java.awt.BorderLayout.SOUTH;
+import static java.awt.Toolkit.getDefaultToolkit;
+import static java.awt.event.KeyEvent.VK_LEFT;
+import static javax.swing.SwingUtilities.invokeAndWait;
+
+/*
+ * @test
+ * @bug 6968363
+ * @summary Ensures that a custom document may not extend AbstractDocument
+ * @author Sergey Malenkov
+ */
+public class Test6968363 implements Runnable, Thread.UncaughtExceptionHandler {
+ private JFrame frame;
+
+ public static void main(String[] args) throws Exception {
+ SunToolkit toolkit = (SunToolkit) getDefaultToolkit();
+ Runnable task = new Test6968363();
+ invokeAndWait(task);
+ toolkit.realSync(100);
+ new Robot().keyPress(VK_LEFT);
+ toolkit.realSync(100);
+ invokeAndWait(task);
+ }
+
+ @Override
+ public void uncaughtException(Thread thread, Throwable throwable) {
+ throwable.printStackTrace();
+ System.exit(1);
+ }
+
+ @Override
+ public void run() {
+ if (this.frame == null) {
+ Thread.setDefaultUncaughtExceptionHandler(this);
+ this.frame = new JFrame(getClass().getSimpleName());
+ this.frame.add(NORTH, new JLabel("Copy Paste a HINDI text into the field below"));
+ this.frame.add(SOUTH, new JTextField(new MyDocument(), "\u0938", 10));
+ this.frame.pack();
+ this.frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+ this.frame.setLocationRelativeTo(null);
+ this.frame.setVisible(true);
+ } else {
+ this.frame.dispose();
+ this.frame = null;
+ }
+ }
+
+ private static class MyDocument implements Document {
+ private final Document document = new PlainDocument();
+
+ @Override
+ public int getLength() {
+ return this.document.getLength();
+ }
+
+ @Override
+ public void addDocumentListener(DocumentListener listener) {
+ this.document.addDocumentListener(listener);
+ }
+
+ @Override
+ public void removeDocumentListener(DocumentListener listener) {
+ this.document.removeDocumentListener(listener);
+ }
+
+ @Override
+ public void addUndoableEditListener(UndoableEditListener listener) {
+ this.document.addUndoableEditListener(listener);
+ }
+
+ @Override
+ public void removeUndoableEditListener(UndoableEditListener listener) {
+ this.document.removeUndoableEditListener(listener);
+ }
+
+ @Override
+ public Object getProperty(Object key) {
+ return this.document.getProperty(key);
+ }
+
+ @Override
+ public void putProperty(Object key, Object value) {
+ this.document.putProperty(key, value);
+ }
+
+ @Override
+ public void remove(int offset, int length) throws BadLocationException {
+ this.document.remove(offset, length);
+ }
+
+ @Override
+ public void insertString(int offset, String string, AttributeSet set) throws BadLocationException {
+ for (int i = 0; i < string.length(); i++) {
+ System.out.println("i: " + i + "; ch: " + Integer.toHexString(string.charAt(i)));
+ }
+ this.document.insertString(offset, string, set);
+ }
+
+ @Override
+ public String getText(int offset, int length) throws BadLocationException {
+ return this.document.getText(offset, length);
+ }
+
+ @Override
+ public void getText(int offset, int length, Segment segment) throws BadLocationException {
+ this.document.getText(offset, length, segment);
+ }
+
+ @Override
+ public Position getStartPosition() {
+ return this.document.getStartPosition();
+ }
+
+ @Override
+ public Position getEndPosition() {
+ return this.document.getEndPosition();
+ }
+
+ @Override
+ public Position createPosition(int offset) throws BadLocationException {
+ return this.document.createPosition(offset);
+ }
+
+ @Override
+ public Element[] getRootElements() {
+ Element[] elements = this.document.getRootElements();
+ Element[] wrappers = new Element[elements.length];
+ for (int i = 0; i < elements.length; i++) {
+ wrappers[i] = new MyElement(elements[i]);
+ }
+ return wrappers;
+ }
+
+ @Override
+ public Element getDefaultRootElement() {
+ return new MyElement(this.document.getDefaultRootElement());
+ }
+
+ @Override
+ public void render(Runnable task) {
+ this.document.render(task);
+ }
+
+ private class MyElement implements Element {
+ private final Element element;
+
+ private MyElement(Element element) {
+ this.element = element;
+ }
+
+ @Override
+ public Document getDocument() {
+ return MyDocument.this;
+ }
+
+ @Override
+ public Element getParentElement() {
+ return new MyElement(this.element.getParentElement());
+ }
+
+ @Override
+ public String getName() {
+ return this.element.getName();
+ }
+
+ @Override
+ public AttributeSet getAttributes() {
+ return this.element.getAttributes();
+ }
+
+ @Override
+ public int getStartOffset() {
+ return this.element.getStartOffset();
+ }
+
+ @Override
+ public int getEndOffset() {
+ return this.element.getEndOffset();
+ }
+
+ @Override
+ public int getElementIndex(int offset) {
+ return this.element.getElementIndex(offset);
+ }
+
+ @Override
+ public int getElementCount() {
+ return this.element.getElementCount();
+ }
+
+ @Override
+ public Element getElement(int index) {
+ return new MyElement(this.element.getElement(index));
+ }
+
+ @Override
+ public boolean isLeaf() {
+ return this.element.isLeaf();
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/text/DefaultCaret/7083457/bug7083457.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.text.DefaultCaret;
+
+/**
+ * @test
+ * @bug 7083457
+ * @author Alexander Scherbatiy
+ * @summary Incomplete specification for javax/swing/text/DefaultCaret.html#setVisible(boolean)
+ * @run main bug7083457
+ */
+public class bug7083457 {
+
+ public static void main(String[] args) {
+ DefaultCaret caret = new DefaultCaret();
+
+ for (int i = 0; i < 10; i++) {
+ boolean active = (i % 2 == 0);
+ caret.setVisible(active);
+ if (caret.isActive() != active) {
+ throw new RuntimeException("caret.isActive() does not equal: " + active);
+ }
+ }
+ }
+}
--- a/jdk/test/javax/swing/text/View/8014863/bug8014863.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/javax/swing/text/View/8014863/bug8014863.java Thu Oct 03 19:18:54 2013 +0100
@@ -24,6 +24,7 @@
/*
* @test
* @bug 8014863
+ * @bug 8024395
* @summary Tests the calculation of the line breaks when a text is inserted
* @author Dmitry Markov
* @library ../../../regtesthelpers
@@ -34,91 +35,107 @@
import sun.awt.SunToolkit;
import javax.swing.*;
+import javax.swing.text.GlyphView;
+import javax.swing.text.View;
import javax.swing.text.html.HTMLEditorKit;
import java.awt.*;
import java.awt.event.KeyEvent;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
public class bug8014863 {
private static JEditorPane editorPane;
+ private static JFrame frame;
private static Robot robot;
private static SunToolkit toolkit;
+ private static String text1 = "<p>one two qqqq <em>this is a test sentence</em> qqqq <em>pp</em> qqqq <em>pp</em> " +
+ "qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq</p>";
+ private static String text2 = "<p>qqqq <em>this is a test sentence</em> qqqq <em>pp</em> qqqq <em>pp</em> " +
+ "qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq</p>";
+
+ private static ArrayList<GlyphView> glyphViews;
+
public static void main(String[] args) throws Exception {
toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
robot = new Robot();
+ robot.setAutoDelay(50);
+ glyphViews = new ArrayList<GlyphView>();
- createAndShowGUI();
+ createAndShowGUI(text1);
+
+ toolkit.realSync();
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ retrieveGlyphViews(editorPane.getUI().getRootView(editorPane));
+ }
+ });
+ GlyphView [] arr1 = glyphViews.toArray(new GlyphView[glyphViews.size()]);
+
+ frame.dispose();
+ glyphViews.clear();
+
+ createAndShowGUI(text2);
toolkit.realSync();
Util.hitKeys(robot, KeyEvent.VK_HOME);
- Util.hitKeys(robot, KeyEvent.VK_O);
-
toolkit.realSync();
- if (3 != getNumberOfTextLines()) {
- throw new RuntimeException("The number of texts lines does not meet the expectation");
- }
-
+ Util.hitKeys(robot, KeyEvent.VK_O);
Util.hitKeys(robot, KeyEvent.VK_N);
-
- toolkit.realSync();
-
- if (3 != getNumberOfTextLines()) {
- throw new RuntimeException("The number of texts lines does not meet the expectation");
- }
-
Util.hitKeys(robot, KeyEvent.VK_E);
Util.hitKeys(robot, KeyEvent.VK_SPACE);
Util.hitKeys(robot, KeyEvent.VK_T);
Util.hitKeys(robot, KeyEvent.VK_W);
+ Util.hitKeys(robot, KeyEvent.VK_O);
+ Util.hitKeys(robot, KeyEvent.VK_SPACE);
toolkit.realSync();
- if (3 != getNumberOfTextLines()) {
- throw new RuntimeException("The number of texts lines does not meet the expectation");
+ SwingUtilities.invokeAndWait(new Runnable() {
+ public void run() {
+ retrieveGlyphViews(editorPane.getUI().getRootView(editorPane));
+ }
+ });
+ GlyphView [] arr2 = glyphViews.toArray(new GlyphView[glyphViews.size()]);
+
+ if (arr1.length != arr2.length) {
+ throw new RuntimeException("Test Failed!");
+ }
+
+ for (int i=0; i<arr1.length; i++) {
+ GlyphView v1 = arr1[i];
+ GlyphView v2 = arr2[i];
+ Field field = GlyphView.class.getDeclaredField("breakSpots");
+ field.setAccessible(true);
+ int[] breakSpots1 = (int[])field.get(v1);
+ int[] breakSpots2 = (int[])field.get(v2);
+ if (!Arrays.equals(breakSpots1,breakSpots2)) {
+ throw new RuntimeException("Test Failed!");
+ }
+ }
+
+ frame.dispose();
+ }
+
+ private static void retrieveGlyphViews(View root) {
+ for (int i=0; i<= root.getViewCount()-1; i++) {
+ View view = root.getView(i);
+ if (view instanceof GlyphView && view.isVisible()) {
+ if (!glyphViews.contains(view)) {
+ glyphViews.add((GlyphView)view);
+ }
+ } else {
+ retrieveGlyphViews(view);
+ }
}
}
- private static int getNumberOfTextLines() throws Exception {
- int numberOfLines = 0;
- int caretPosition = getCaretPosition();
- int current = 1;
- int previous;
-
- setCaretPosition(current);
- do {
- previous = current;
- Util.hitKeys(robot, KeyEvent.VK_DOWN);
- toolkit.realSync();
- current = getCaretPosition();
- numberOfLines++;
- } while (current != previous);
-
- setCaretPosition(caretPosition);
- return numberOfLines;
- }
-
- private static int getCaretPosition() throws Exception {
- final int[] result = new int[1];
- SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- result[0] = editorPane.getCaretPosition();
- }
- });
- return result[0];
- }
-
- private static void setCaretPosition(final int position) throws Exception {
- SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- editorPane.setCaretPosition(position);
- }
- });
- }
-
- private static void createAndShowGUI() throws Exception {
+ private static void createAndShowGUI(String text) throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
try {
@@ -126,22 +143,17 @@
} catch (Exception ex) {
throw new RuntimeException(ex);
}
- JFrame frame = new JFrame();
+ frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
editorPane = new JEditorPane();
HTMLEditorKit editorKit = new HTMLEditorKit();
editorPane.setEditorKit(editorKit);
- editorPane.setText("<p>qqqq <em>pp</em> qqqq <em>pp</em> " +
- "qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp" +
- "</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq <em>pp</em> qqqq</p>");
+ editorPane.setText(text);
editorPane.setCaretPosition(1);
- // An actual font size depends on OS and might be differnet on various OSs.
- // It is necessary to calculate the width to meet the expected number of lines.
- int width = SwingUtilities.computeStringWidth(editorPane.getFontMetrics(editorPane.getFont()),
- "qqqq pp qqqq pp qqqq pp qqqqqqqq");
+
frame.add(editorPane);
- frame.setSize(width, 200);
+ frame.setSize(200, 200);
frame.setVisible(true);
}
});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/security/CheckBlacklistedCerts.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8011402
+ * @summary Move blacklisting certificate logic from hard code to data
+ */
+
+import sun.security.util.UntrustedCertificates;
+
+import java.io.*;
+import java.security.KeyStore;
+import java.security.cert.*;
+import java.util.*;
+
+public class CheckBlacklistedCerts {
+ public static void main(String[] args) throws Exception {
+
+ String home = System.getProperty("java.home");
+ boolean failed = false;
+
+ // Root CAs should always be trusted
+ File file = new File(home, "lib/security/cacerts");
+ KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
+ try (FileInputStream fis = new FileInputStream(file)) {
+ ks.load(new FileInputStream(file), null);
+ }
+ System.out.println("Check for cacerts: " + ks.size());
+ for (String alias: Collections.list(ks.aliases())) {
+ X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
+ if (UntrustedCertificates.isUntrusted(cert)) {
+ System.out.print(alias + " is untrusted");
+ failed = true;
+ }
+ }
+
+ // All certs in the pem files
+ Set<Certificate> blacklisted = new HashSet<>();
+
+ // Hopefully src comes with test, but it might be missing if doing
+ // a -testonly JPRT job.
+ File[] blacklists = {
+ new File(System.getProperty("test.src"),
+ "../../../src/share/lib/security/blacklisted.certs.pem"),
+ new File(System.getProperty("test.src"),
+ "../../../src/closed/share/lib/security/blacklisted.certs.pem")
+ };
+
+ // Is this an OPENJDK build?
+ if (!new File(home, "lib/security/local_policy.jar").exists()) {
+ blacklists = Arrays.copyOf(blacklists, 1);
+ }
+
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ for (File blacklist: blacklists) {
+ System.out.print("Check for " + blacklist + ": ");
+ if (!blacklist.exists()) {
+ System.out.println("does not exist");
+ } else {
+ try (FileInputStream fis = new FileInputStream(blacklist)) {
+ Collection<? extends Certificate> certs
+ = cf.generateCertificates(fis);
+ System.out.println(certs.size());
+ for (Certificate c: certs) {
+ blacklisted.add(c);
+ X509Certificate cert = ((X509Certificate)c);
+ if (!UntrustedCertificates.isUntrusted(cert)) {
+ System.out.println(cert.getSubjectDN() + " is trusted");
+ failed = true;
+ }
+ }
+ }
+ }
+ }
+
+ // Check the blacklisted.certs file itself
+ file = new File(home, "lib/security/blacklisted.certs");
+ System.out.print("Check for " + file + ": ");
+ try (BufferedReader reader = new BufferedReader(
+ new InputStreamReader(new FileInputStream(file)))) {
+ int acount = 0;
+ int ccount = 0;
+ while (true) {
+ String line = reader.readLine();
+ if (line == null) break;
+ if (line.startsWith("Algorithm")) {
+ acount++;
+ } else if (!line.isEmpty() && !line.startsWith("#")) {
+ ccount++;
+ }
+ }
+ System.out.println(acount + " algs, " + ccount + " certs" );
+ if (acount != 1) {
+ System.out.println("There are " + acount + " algorithms");
+ failed = true;
+ }
+ if (ccount != blacklisted.size()
+ && !blacklisted.isEmpty()) {
+ System.out.println("Wrong blacklisted.certs size: "
+ + ccount + " fingerprints, "
+ + blacklisted.size() + " certs");
+ failed = true;
+ }
+ }
+
+ if (failed) {
+ throw new Exception("Failed");
+ }
+ }
+}
--- a/jdk/test/sun/security/krb5/ParseCAPaths.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/security/krb5/ParseCAPaths.java Thu Oct 03 19:18:54 2013 +0100
@@ -22,7 +22,7 @@
*/
/*
* @test
- * @bug 6789935
+ * @bug 6789935 8012615
* @run main/othervm ParseCAPaths
* @summary cross-realm capath search error
*/
@@ -35,37 +35,75 @@
public static void main(String[] args) throws Exception {
System.setProperty("java.security.krb5.conf",
System.getProperty("test.src", ".") +"/krb5-capaths.conf");
- //System.setProperty("sun.security.krb5.debug", "true");
- // Standard example
+ // MIT
check("ANL.GOV", "TEST.ANL.GOV", "ANL.GOV");
check("ANL.GOV", "ES.NET", "ANL.GOV");
check("ANL.GOV", "PNL.GOV", "ANL.GOV", "ES.NET");
check("ANL.GOV", "NERSC.GOV", "ANL.GOV", "ES.NET");
+ check("NERSC.GOV", "TEST.ANL.GOV", "NERSC.GOV", "ES.NET", "ANL.GOV");
+
+ // RedHat
+ // 3.6.2.1. Configuring a Shared Hierarchy of Names
+ check("AA.EXAMPLE.COM", "BB.EXAMPLE.COM",
+ "AA.EXAMPLE.COM", "EXAMPLE.COM");
+ check("SITE1.SALES.EXAMPLE.COM", "EVERYWHERE.EXAMPLE.COM",
+ "SITE1.SALES.EXAMPLE.COM", "SALES.EXAMPLE.COM",
+ "EXAMPLE.COM");
+ check("DEVEL.EXAMPLE.COM", "PROD.EXAMPLE.ORG",
+ "DEVEL.EXAMPLE.COM", "EXAMPLE.COM", "COM",
+ "ORG", "EXAMPLE.ORG");
+ // 3.6.2.2. Configuring Paths in krb5.conf
+ check("A.EXAMPLE.COM", "B.EXAMPLE.COM", "A.EXAMPLE.COM");
+ check("A.EXAMPLE.COM", "C.EXAMPLE.COM",
+ "A.EXAMPLE.COM", "B.EXAMPLE.COM");
+ check("A.EXAMPLE.COM", "D.EXAMPLE.COM",
+ "A.EXAMPLE.COM", "B.EXAMPLE.COM", "C.EXAMPLE.COM");
+
+ // The original JDK example
+ check("TIVOLI.COM", "IBM.COM", "TIVOLI.COM", "LDAPCENTRAL.NET",
+ "IBM_LDAPCENTRAL.COM", "MOONLITE.ORG");
+
// Hierachical
- check("N1.N.COM", "N2.N.COM", "N1.N.COM", "N.COM"); // 2 common
- check("N1.N.COM", "N2.N3.COM", "N1.N.COM", "N.COM", // 1 common
+ check("N1.N.COM", "N2.N.COM", "N1.N.COM", "N.COM");
+ check("N1.N.COM", "N2.N3.COM", "N1.N.COM", "N.COM",
"COM", "N3.COM");
- check("N1.COM", "N2.COM", "N1.COM", "COM"); // 1 common
- check("N1", "N2", "N1"); // 0 common
- // Extra garbages
- check("A1.COM", "A4.COM", "A1.COM", "A2.COM");
+ check("N1.COM", "N2.COM", "N1.COM", "COM");
+ check("N1", "N2", "N1");
+ check("N1.COM", "N2.ORG", "N1.COM", "COM", "ORG");
+ check("N1.N.COM", "N.COM", "N1.N.COM");
+ check("X.N1.N.COM", "N.COM", "X.N1.N.COM", "N1.N.COM");
+ check("N.COM", "N1.N.COM", "N.COM");
+ check("N.COM", "X.N1.N.COM", "N.COM", "N1.N.COM");
+ check("A.B.C", "D.E.F", "A.B.C", "B.C", "C", "F", "E.F");
+
+ // Full path
+ check("A1.COM", "A2.COM", "A1.COM");
+ check("A1.COM", "A3.COM", "A1.COM", "A2.COM");
+ check("A1.COM", "A4.COM", "A1.COM", "A2.COM", "A3.COM");
+
+ // Shortest path
+ check("B1.COM", "B2.COM", "B1.COM");
check("B1.COM", "B3.COM", "B1.COM", "B2.COM");
+ check("B1.COM", "B4.COM", "B1.COM", "B2.COM", "B3.COM");
+
// Missing is "."
+ check("C1.COM", "C2.COM", "C1.COM", "COM");
check("C1.COM", "C3.COM", "C1.COM", "C2.COM");
- // Multiple path
- check("D1.COM", "D4.COM", "D1.COM", "D2.COM");
- check("E1.COM", "E4.COM", "E1.COM", "E2.COM");
- check("F1.COM", "F4.COM", "F1.COM", "F9.COM");
- // Infinite loop
- check("G1.COM", "G3.COM", "G1.COM", "COM");
- check("H1.COM", "H3.COM", "H1.COM");
+
+ // cRealm = .
+ check("D1.COM", "D2.COM", "D1.COM");
+
+ // Bad cases
+ check("E1.COM", "E2.COM", "E1.COM");
+ check("E1.COM", "E3.COM", "E1.COM", "E4.COM");
+ check("G1.COM", "G3.COM", "G1.COM", "G2.COM");
check("I1.COM", "I4.COM", "I1.COM", "I5.COM");
- // J2=J1 is the same as J2=.
- check("J1.COM", "J2.COM", "J1.COM");
+
// 7019384
check("A9.PRAGUE.XXX.CZ", "SERVIS.XXX.CZ",
"A9.PRAGUE.XXX.CZ", "PRAGUE.XXX.CZ", "ROOT.XXX.CZ");
+
if (failed != null) {
throw failed;
}
@@ -75,6 +113,7 @@
try {
check2(from, to, paths);
} catch (Exception e) {
+ System.out.println(" " + e.getMessage());
failed = e;
}
}
@@ -84,18 +123,14 @@
System.out.println(from + " -> " + to);
System.out.println(" expected: " + Arrays.toString(paths));
String[] result = Realm.getRealmsList(from, to);
- System.out.println(" result: " + Arrays.toString(result));
- if (result == null) {
- if (paths.length == 0) {
- // OK
- } else {
- throw new Exception("Shouldn't have a valid path.");
- }
+ if (result == null || result.length == 0) {
+ throw new Exception("There is always a valid path.");
} else if(result.length != paths.length) {
throw new Exception("Length of path not correct");
} else {
for (int i=0; i<result.length; i++) {
if (!result[i].equals(paths[i])) {
+ System.out.println(" result: " + Arrays.toString(result));
throw new Exception("Path not same");
}
}
--- a/jdk/test/sun/security/krb5/krb5-capaths.conf Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/security/krb5/krb5-capaths.conf Thu Oct 03 19:18:54 2013 +0100
@@ -1,6 +1,6 @@
[capaths]
-# Standard
+# http://web.mit.edu/kerberos/krb5-1.5/krb5-1.5.4/doc/krb5-admin/capaths.html
ANL.GOV = {
TEST.ANL.GOV = .
@@ -14,81 +14,86 @@
PNL.GOV = {
ANL.GOV = ES.NET
}
-NERSC.GOV = {
- ANL.GOV = ES.NET
-}
+#NERSC.GOV = {
+# ANL.GOV = ES.NET
+#}
ES.NET = {
ANL.GOV = .
}
+NERSC.GOV = {
+ ANL.GOV = ES.NET
+ TEST.ANL.GOV = ES.NET
+ TEST.ANL.GOV = ANL.GOV
+ PNL.GOV = ES.NET
+ ES.NET = .
+}
-# Extra garbages
+# The original JDK example
+
+TIVOLI.COM = {
+ IBM.COM = IBM_LDAPCENTRAL.COM MOONLITE.ORG
+ IBM_LDAPCENTRAL.COM = LDAPCENTRAL.NET
+ LDAPCENTRAL.NET = .
+}
+
+# https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Smart_Cards/Setting_Up_Cross_Realm_Authentication.html
+
+A.EXAMPLE.COM = {
+ B.EXAMPLE.COM = .
+ C.EXAMPLE.COM = B.EXAMPLE.COM
+ D.EXAMPLE.COM = B.EXAMPLE.COM
+ D.EXAMPLE.COM = C.EXAMPLE.COM
+}
+
+# Full path
A1.COM = {
A2.COM = .
+ A3.COM = A2.COM
A4.COM = A2.COM
- A3.COM = A4.COM
- A3.COM = A2.COM
+ A4.COM = A3.COM
}
+# Shortest path
+
B1.COM = {
B2.COM = .
B3.COM = B2.COM
- B3.COM = B4.COM
+ B4.COM = B3.COM
}
-# Missing is "."
+# If no sRealm key, fallback to hierarchy
C1.COM = {
C3.COM = C2.COM
}
-# Multiple paths
+# cRealm is "."
D1.COM = {
- D2.COM = .
- D3.COM = .
- D4.COM = D2.COM
- D4.COM = D3.COM
+ D2.COM=D1.COM
}
+# Bad cases
+
E1.COM = {
- E2.COM = .
+ E2.COM = E2.COM
+ E3.COM = E4.COM
E3.COM = .
- E4.COM = E2.COM E3.COM E2.COM
}
-# Shortest or First?
-
-F1.COM = {
- F2.COM = .
- F3.COM = F2.COM
- F4.COM = F9.COM
- F4.COM = F3.COM
- F4.COM = F2.COM
-}
-
-# Infinite loop
-
G1.COM = {
G2.COM = G3.COM
G3.COM = G2.COM
}
-H1.COM = {
- H2.COM = H3.COM
- H3.COM = H2.COM
- H3.COM = .
-}
-
I1.COM = {
I2.COM = I3.COM
I3.COM = I2.COM
- I4.COM = I2.COM I5.COM
+ I4.COM = I5.COM
}
-J1.COM = {
- J2.COM=J1.COM
-}
+# 7019384
A9.PRAGUE.XXX.CZ = {
PRAGUE.XXX.CZ = .
--- a/jdk/test/sun/security/tools/keytool/autotest.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/security/tools/keytool/autotest.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -58,7 +58,7 @@
case "$OS" in
SunOS )
FS="/"
- LIBNAME="/usr/lib/mps/libsoftokn3.so"
+ LIBNAME="/usr/lib/mps/`isainfo -n`/libsoftokn3.so"
;;
Linux )
FS="/"
--- a/jdk/test/sun/tools/jhat/HatRun.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jhat/HatRun.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -167,28 +167,23 @@
String cdir = System.getProperty("test.classes", ".");
String os_arch = System.getProperty("os.arch");
String os_name = System.getProperty("os.name");
- boolean d64 = os_name.equals("SunOS") && (
- os_arch.equals("sparcv9") ||
- os_arch.equals("amd64"));
- String isa_dir = d64?(File.separator+os_arch):"";
String java = jre_home
- + File.separator + "bin" + isa_dir
+ + File.separator + "bin"
+ File.separator + "java";
String jhat = sdk_home + File.separator + "bin"
+ File.separator + "jhat";
/* Array of strings to be passed in for exec:
* 1. java
* 2. -Dtest.classes=.
- * 3. -d64 (optional)
- * 4. -Xcheck:jni (Just because it finds bugs)
- * 5. -Xverify:all (Make sure verification is on full blast)
- * 6. -agent
+ * 3. -Xcheck:jni (Just because it finds bugs)
+ * 4. -Xverify:all (Make sure verification is on full blast)
+ * 5. -agent
* vm_options
- * 7+i. classname
+ * 6+i. classname
*/
int nvm_options = 0;
if ( vm_options != null ) nvm_options = vm_options.length;
- String cmd[] = new String[1 + (d64?1:0) + 7 + nvm_options];
+ String cmd[] = new String[1 + 7 + nvm_options];
int i,j;
i = 0;
@@ -196,9 +191,6 @@
cmd[i++] = "-cp";
cmd[i++] = cdir;
cmd[i++] = "-Dtest.classes=" + cdir;
- if ( d64 ) {
- cmd[i++] = "-d64";
- }
cmd[i++] = "-Xcheck:jni";
cmd[i++] = "-Xverify:all";
dumpfile= cdir + File.separator + class_name + ".hdump";
--- a/jdk/test/sun/tools/jstat/gcCapacityOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/gcCapacityOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,19 +3,19 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC YGC FGC
-# 2176.0 7232.0 2176.0 64.0 64.0 2048.0 6016.0 58304.0 6016.0 6016.0 8192.0 65536.0 8192.0 8192.0 0
+# NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
+# 4096.0 657408.0 8192.0 512.0 512.0 3072.0 6144.0 1312768.0 6144.0 6144.0 512.0 132096.0 5120.0 512.0 131072.0 512.0 1 0
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC YGC FGC $/ {
+/^ NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/gcCauseOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/gcCauseOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,15 +3,15 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
-# 0.00 100.00 14.01 3.06 23.20 1 0.032 0 0.000 0.032 Allocation Failure No GC
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
+# 0.00 0.00 0.00 9.97 90.94 87.70 2 0.013 0 0.000 0.013 Allocation Failure No GC
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT LGCC GCC $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC $/ {
headerlines++;
}
@@ -23,7 +23,7 @@
# or more letters and spaces. It also provides for the ".", "(", and ")"
# characters to allow for the string "System.gc()".
#
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[a-zA-Z]+[a-zA-Z \.\(\)]*[ ]*[a-zA-Z]+[a-zA-Z \.\(\)]*$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[a-zA-Z]+[a-zA-Z \.\(\)]*[ ]*[a-zA-Z]+[a-zA-Z \.\(\)]*$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/gcMetaCapacityOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/gcMetaCapacityOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,18 +3,18 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# MCMN MCMX MC YGC FGC FGCT GCT
-# 8192.0 65536.0 8192.0 8192.0 1 0 0.000 0.029
+# MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
+# 512.0 132096.0 5120.0 512.0 131072.0 512.0 1 0 0.000 0.004
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ MCMN MCMX MC YGC FGC FGCT GCT $/ {
+/^ MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/gcOldOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/gcOldOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,19 +3,19 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# MC MU OC OU YGC FGC FGCT GCT
-# 8192.0 1877.3 6016.0 180.8 1 0 0.000 0.030
+# MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
+# 5120.0 4152.0 512.0 397.9 6144.0 200.0 1 0 0.000 0.005
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ MC MU OC OU YGC FGC FGCT GCT $/ {
+/^ MC MU CCSC CCSU OC OU YGC FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/gcOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/gcOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,19 +3,19 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0C S1C S0U S1U EC EU OC OU MC MU YGC YGCT FGC FGCT GCT
-# 64.0 64.0 0.0 0.0 2048.0 1711.2 6016.0 0.0 8192.0 1948.6 0 0.000 0 0.000 0.000
+# S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
+# 512.0 512.0 0.0 496.0 3072.0 615.5 6144.0 280.0 5120.0 4176.0 512.0 401.0 1 0.005 0 0.000 0.005
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0C S1C S0U S1U EC EU OC OU MC MU YGC YGCT FGC FGCT GCT $/ {
+/^ S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/lineCounts1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/lineCounts1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,22 +3,22 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 100.00 68.87 1.24 27.75 1 0.044 0 0.000 0.044
-# 0.00 100.00 68.87 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 68.87 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 70.89 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 70.89 1.24 27.84 1 0.044 0 0.000 0.044
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 93.76 28.80 1.82 77.74 68.02 1 0.005 0 0.000 0.005
+# 0.00 93.76 73.04 1.82 77.74 68.02 1 0.005 0 0.000 0.005
+# 0.00 93.76 73.04 1.82 77.74 68.02 1 0.005 0 0.000 0.005
+# 0.00 93.76 73.04 1.82 77.74 68.02 1 0.005 0 0.000 0.005
+# 0.00 93.76 75.00 1.82 77.74 68.02 1 0.005 0 0.000 0.005
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/lineCounts2.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/lineCounts2.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,18 +3,18 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 100.00 68.87 1.24 27.75 1 0.044 0 0.000 0.044
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 93.76 28.40 1.82 77.74 68.02 1 0.005 0 0.000 0.005
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/lineCounts3.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/lineCounts3.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,27 +3,27 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 99.99 66.81 1.24 26.55 1 0.028 0 0.000 0.028
-# 0.00 99.99 68.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 72.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 72.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 74.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 74.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 76.81 1.24 27.85 1 0.028 0 0.000 0.028
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 93.76 26.48 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 71.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 73.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 73.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 73.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 75.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 75.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 77.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 77.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
+# 0.00 93.76 77.58 1.95 77.78 68.02 1 0.006 0 0.000 0.006
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstat/lineCounts4.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/lineCounts4.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,30 +3,30 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 99.99 66.81 1.24 26.55 1 0.028 0 0.000 0.028
-# 0.00 99.99 68.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 70.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 72.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 72.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 74.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 74.81 1.24 27.84 1 0.028 0 0.000 0.028
-# 0.00 99.99 76.81 1.24 27.85 1 0.028 0 0.000 0.028
-# S0 S1 E O P YGC YGCT FGC FGCT GCT
-# 0.00 99.99 76.81 1.24 27.85 1 0.028 0 0.000 0.028
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 96.88 66.55 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 71.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 73.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 73.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 73.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 75.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 75.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 77.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 77.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# 0.00 96.88 77.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 96.88 79.58 2.34 77.78 68.02 1 0.003 0 0.000 0.003
BEGIN {
headerlines=0; datalines=0; totallines=0
datalines2=0;
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
if (headerlines == 2) {
datalines2++;
}
--- a/jdk/test/sun/tools/jstat/timeStamp1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstat/timeStamp1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,18 +3,18 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 100.00 68.87 1.24 27.75 1 0.044 0 0.000 0.044
+#Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.3 0.00 100.00 68.74 1.95 77.73 68.02 1 0.004 0 0.000 0.004
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^Timestamp S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/sun/tools/jstatd/jstatGcutilOutput1.awk Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/sun/tools/jstatd/jstatGcutilOutput1.awk Thu Oct 03 19:18:54 2013 +0100
@@ -3,22 +3,22 @@
# that the numerical values conform to a specific pattern, rather than
# specific values.
#
-# S0 S1 E O M YGC YGCT FGC FGCT GCT
-# 0.00 100.00 68.87 1.24 27.75 1 0.044 0 0.000 0.044
-# 0.00 100.00 68.87 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 68.87 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 70.89 1.24 27.84 1 0.044 0 0.000 0.044
-# 0.00 100.00 70.89 1.24 27.84 1 0.044 0 0.000 0.044
+# S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
+# 0.00 100.00 56.99 7.81 95.03 87.56 1 0.009 0 0.000 0.009
+# 0.00 100.00 63.64 7.81 95.03 87.56 1 0.009 0 0.000 0.009
+# 0.00 100.00 64.68 7.81 95.03 87.56 1 0.009 0 0.000 0.009
+# 0.00 100.00 65.73 7.81 95.03 87.56 1 0.009 0 0.000 0.009
+# 0.00 100.00 67.22 7.81 95.03 87.56 1 0.009 0 0.000 0.009
BEGIN {
headerlines=0; datalines=0; totallines=0
}
-/^ S0 S1 E O M YGC YGCT FGC FGCT GCT $/ {
+/^ S0 S1 E O M CCS YGC YGCT FGC FGCT GCT $/ {
headerlines++;
}
-/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
+/^[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+[ ]*[0-9]+\.[0-9]+[ ]*[0-9]+\.[0-9]+$/ {
datalines++;
}
--- a/jdk/test/tools/jar/ChangeDir.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/jar/ChangeDir.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,13 +23,15 @@
/**
* @test
- * @bug 4806786
+ * @bug 4806786 8023113
* @summary jar -C doesn't ignore multiple // in path
*/
import java.io.*;
+import java.nio.file.*;
import java.util.*;
import java.util.jar.*;
+import java.util.stream.Stream;
import sun.tools.jar.Main;
public class ChangeDir {
@@ -37,13 +39,16 @@
private final static String fileName = "hello.txt";
/** Remove dirs & files needed for test. */
- private static void cleanup(File dir) throws Throwable {
- if (dir != null && dir.exists()) {
- for (File ff : dir.listFiles()) {
- check(ff.delete());
+ private static void cleanup(Path dir) {
+ try {
+ if (Files.isDirectory(dir)) {
+ try (Stream<Path> s = Files.list(dir)) {
+ s.forEach( p -> cleanup(p));
+ }
}
- check(dir.delete());
- check(new File(jarName).delete());
+ Files.delete(dir);
+ } catch (IOException x) {
+ fail(x.toString());
}
}
@@ -62,19 +67,16 @@
}
static void doTest(String sep) throws Throwable {
- File testDir = null;
- JarFile jf = null;
+ Path topDir = Files.createTempDirectory("delete");
try {
+ Files.deleteIfExists(Paths.get(jarName));
+
// Create a subdirectory "a/b"
- File f = File.createTempFile("delete", ".me");
- String dirName = f.getParent();
- testDir = new File(dirName + sep + "a" + sep + "b");
- cleanup(testDir);
- check(testDir.mkdirs());
+ Path testDir = Files.createDirectories(topDir.resolve("a").resolve("b"));
// Create file in that subdirectory
- File testFile = new File(testDir, fileName);
- check(testFile.createNewFile());
+ Path testFile = testDir.resolve(fileName);
+ Files.createFile(testFile);
// Create a jar file from that subdirectory, but with a // in the
// path name.
@@ -82,33 +84,32 @@
argList.add("cf");
argList.add(jarName);
argList.add("-C");
- argList.add(dirName + sep + "a" + sep + sep + "b"); // Note double 'sep' is intentional
+ argList.add(topDir.toString() + sep + "a" + sep + sep + "b"); // Note double 'sep' is intentional
argList.add(fileName);
- String jarArgs[] = new String[argList.size()];
- jarArgs = argList.toArray(jarArgs);
Main jarTool = new Main(System.out, System.err, "jar");
- if (!jarTool.run(jarArgs)) {
+ if (!jarTool.run(argList.toArray(new String[argList.size()]))) {
fail("Could not create jar file.");
}
// Check that the entry for hello.txt does *not* have a pathname.
- jf = new JarFile(jarName);
- for (Enumeration<JarEntry> i = jf.entries(); i.hasMoreElements();) {
- JarEntry je = i.nextElement();
- String name = je.getName();
- if (name.indexOf(fileName) != -1) {
- if (name.indexOf(fileName) != 0) {
- fail(String.format(
- "Expected '%s' but got '%s'%n", fileName, name));
+ try (JarFile jf = new JarFile(jarName)) {
+ for (Enumeration<JarEntry> i = jf.entries(); i.hasMoreElements();) {
+ JarEntry je = i.nextElement();
+ String name = je.getName();
+ if (name.indexOf(fileName) != -1) {
+ if (name.indexOf(fileName) != 0) {
+ fail(String.format(
+ "Expected '%s' but got '%s'%n", fileName, name));
+ } else {
+ pass();
+ }
}
}
}
} finally {
- if (jf != null) {
- jf.close();
- }
- cleanup(testDir);
+ cleanup(topDir);
+ Files.deleteIfExists(Paths.get(jarName));
}
}
--- a/jdk/test/tools/launcher/6842838/Test6842838.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/6842838/Test6842838.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -48,16 +48,16 @@
NULL=/dev/null
PS=":"
FS="/"
- JAVA_EXE=${TESTJAVA}${FS}bin${FS}sparcv9${FS}java
+ JAVA_EXE=${TESTJAVA}${FS}bin${FS}java
;;
* )
- printf "Only testing on sparcv9 (use libumem to reliably catch buffer overrun)\n"
+ printf "Only testing on solaris 64-bit (use libumem to reliably catch buffer overrun)\n"
exit 0;
;;
esac
if [ ! -x ${JAVA_EXE} ]; then
- printf "Warning: sparcv9 components not installed - skipping test.\n"
+ printf "Warning: 64-bit components not installed - skipping test.\n"
exit 0
fi
--- a/jdk/test/tools/launcher/ChangeDataModel.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/ChangeDataModel.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,8 +30,6 @@
* @author Joseph D. Darcy, ksrini
*/
import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
public class ChangeDataModel extends TestHelper {
private static final File TestJar = new File("test" + JAR_FILE_EXT);
@@ -54,48 +52,14 @@
throw new Error("unsupported data model");
}
- // test dual mode systems
- if (isDualMode) {
- // albeit dual mode we may not have the 64 bit components present
- if (dualModePresent()) {
- // 32-bit -> 64-bit
- checkExecCount(javaCmd, "-d64");
- // 64-bit -> 32-bit
- checkExecCount(java64Cmd, "-d32");
-
- checkAcceptance(javaCmd, "-d64");
- checkAcceptance(java64Cmd, "-d32");
- } else {
- System.out.println("Warning: no 64-bit components found;" +
- " only one data model tested.");
- }
+ // Negative tests: ensure that non-dual mode systems reject the
+ // complementary (other) data model
+ if (is32Bit) {
+ checkRejection(javaCmd, "-d64");
+ } else if (is64Bit) {
+ checkRejection(javaCmd, "-d32");
} else {
- // Negative tests: ensure that non-dual mode systems reject the
- // complementary (other) data model
- if (is32Bit) {
- checkRejection(javaCmd, "-d64");
- } else if (is64Bit) {
- checkRejection(javaCmd, "-d32");
- } else {
- throw new Error("unsupported data model");
- }
- }
- }
-
- static void checkExecCount(String cmd, String dmodel) {
- Map<String, String> envMap = new HashMap<>();
- envMap.put(JLDEBUG_KEY, "true");
- TestResult tr = doExec(envMap, javaCmd, "-d64",
- "-jar", TestJar.getAbsolutePath());
- int count = 0;
- for (String x : tr.testOutput) {
- if (x.contains(EXPECTED_MARKER)) {
- count++;
- if (count > 1) {
- System.out.println(tr);
- throw new RuntimeException("Maximum exec count of 1 execeeded");
- }
- }
+ throw new Error("unsupported data model");
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/DiacriticTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8017248
+ * @summary Compiler Diacritics Issue
+ * @run main DiacriticTest
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class DiacriticTest extends TestHelper {
+
+ // NFD-normalized form of the class name
+ static String NAME_NFD="ClassA\u0301";
+ // NFC-normalized form of the same class name
+ static String NAME_NFC="Class\u00C1";
+
+ public static void main(String[] args) throws IOException {
+ if (!isMacOSX) {
+ System.out.println("This test is for Mac OS X only. Passing.");
+ return;
+ }
+
+ File sourceFile = new File(NAME_NFC + ".java");
+ String source = "public class " + NAME_NFC + " { " +
+ " public static void main(String args[]) {\n" +
+ " System.out.println(\"Success!\");\n" +
+ " }\n" +
+ "}\n";
+ ArrayList<String> content = new ArrayList<>();
+ content.add(source);
+ createFile(sourceFile, content);
+
+ HashMap<String, String> env = new HashMap<>();
+ env.put("LC_CTYPE", "UTF-8");
+
+ TestResult tr;
+ tr = doExec(env, javacCmd, NAME_NFD + ".java");
+ System.out.println(tr.testOutput);
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ throw new RuntimeException("Compilation failed");
+ }
+ tr = doExec(env, javaCmd, "-cp", ".", NAME_NFD);
+ System.out.println(tr.testOutput);
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ throw new RuntimeException("Test execution failed");
+ }
+ }
+}
--- a/jdk/test/tools/launcher/ExecutionEnvironment.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/ExecutionEnvironment.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
* @bug 4780570 4731671 6354700 6367077 6670965 4882974
* @summary Checks for LD_LIBRARY_PATH and execution on *nixes
* @compile -XDignore.symbol.file ExecutionEnvironment.java
- * @run main ExecutionEnvironment
+ * @run main/othervm ExecutionEnvironment
*/
/*
@@ -46,6 +46,9 @@
* b. LD_LIBRARY_PATH32 is ignored if set
* 5. no extra symlink exists on Solaris ie.
* jre/lib/$arch/libjvm.so -> client/libjvm.so
+ * 6. Since 32-bit Solaris is no longer supported we continue to ensure that
+ * the appropriate paths are ignored or used, additionally we also test to
+ * ensure the 64-bit isadir exists and contains appropriate links.
* TODO:
* a. perhaps we need to add a test to audit all environment variables are
* in pristine condition after the launch, there may be a few that the
@@ -54,10 +57,16 @@
*/
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import static java.nio.file.LinkOption.*;
+import java.util.regex.Pattern;
public class ExecutionEnvironment extends TestHelper {
@@ -80,13 +89,14 @@
static final File testJarFile = new File("EcoFriendly.jar");
- static int errors = 0;
- static int passes = 0;
-
static final String LIBJVM = TestHelper.isWindows
? "jvm.dll"
: "libjvm" + (TestHelper.isMacOSX ? ".dylib" : ".so");
+ public ExecutionEnvironment() {
+ createTestJar();
+ }
+
static void createTestJar() {
try {
List<String> codeList = new ArrayList<>();
@@ -111,13 +121,17 @@
throw new RuntimeException(fnfe);
}
}
-
+ private void flagError(TestResult tr, String message) {
+ System.err.println(tr);
+ throw new RuntimeException(message);
+ }
/*
* tests if the launcher pollutes the LD_LIBRARY_PATH variables ie. there
* should not be any new variables or pollution/mutations of any kind, the
* environment should be pristine.
*/
- private static void ensureEcoFriendly() {
+ @Test
+ void testEcoFriendly() {
TestResult tr = null;
Map<String, String> env = new HashMap<>();
@@ -129,17 +143,12 @@
tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
if (!tr.isNotZeroOutput()) {
- System.out.println(tr);
- throw new RuntimeException("Error: No output at all. Did the test execute ?");
+ flagError(tr, "Error: No output at all. Did the test execute ?");
}
for (String x : LD_PATH_STRINGS) {
if (!tr.contains(x)) {
- System.out.println("FAIL: did not get <" + x + ">");
- System.out.println(tr);
- errors++;
- } else {
- passes++;
+ flagError(tr, "FAIL: did not get <" + x + ">");
}
}
}
@@ -148,19 +157,15 @@
* ensures that there are no execs as long as we are in the same
* data model
*/
- static void ensureNoExec() {
+ @Test
+ void testNoExec() {
Map<String, String> env = new HashMap<>();
env.put(JLDEBUG_KEY, "true");
TestResult tr = doExec(env, javaCmd, "-version");
if (tr.testOutput.contains(EXPECTED_MARKER)) {
- System.out.println("FAIL: EnsureNoExecs: found expected warning <" +
- EXPECTED_MARKER +
+ flagError(tr, "testNoExec: found warning <" + EXPECTED_MARKER +
"> the process execing ?");
- errors++;
- } else {
- passes++;
}
- return;
}
/*
@@ -173,8 +178,8 @@
* For Solaris 64-bit
* * The LD_LIBRARY_PATH_64 should override LD_LIBRARY_PATH if specified
*/
-
- static void verifyJavaLibraryPath() {
+ @Test
+ void testJavaLibraryPath() {
TestResult tr = null;
Map<String, String> env = new HashMap<>();
@@ -200,88 +205,33 @@
env.put(pairs[0], pairs[1]);
}
- // verify the override occurs, since we know the invocation always
- // uses by default is 32-bit, therefore we also set the test
- // expectation to be the same.
+ // verify the override occurs for 64-bit system
tr = doExec(env, javaCmd, "-jar", testJarFile.getAbsolutePath());
- verifyJavaLibraryPathOverride(tr, true);
-
- // try changing the model from 32 to 64 bit
- if (dualModePresent() && is32Bit) {
- // verify the override occurs
- env.clear();
- for (String x : LD_PATH_STRINGS) {
- String pairs[] = x.split("=");
- env.put(pairs[0], pairs[1]);
- }
- tr = doExec(env, javaCmd, "-d64", "-jar",
- testJarFile.getAbsolutePath());
- verifyJavaLibraryPathOverride(tr, false);
-
- // no override
- env.clear();
- env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
- tr = doExec(env, javaCmd, "-jar",
- testJarFile.getAbsolutePath());
- verifyJavaLibraryPathGeneric(tr);
- }
-
- // try changing the model from 64 to 32 bit
- if (java64Cmd != null && is64Bit) {
- // verify the override occurs
- env.clear();
- for (String x : LD_PATH_STRINGS) {
- String pairs[] = x.split("=");
- env.put(pairs[0], pairs[1]);
- }
- tr = doExec(env, java64Cmd, "-d32", "-jar",
- testJarFile.getAbsolutePath());
- verifyJavaLibraryPathOverride(tr, true);
-
- // no override
- env.clear();
- env.put(LD_LIBRARY_PATH, LD_LIBRARY_PATH_VALUE);
- tr = doExec(env, java64Cmd, "-d32", "-jar",
- testJarFile.getAbsolutePath());
- verifyJavaLibraryPathGeneric(tr);
- }
+ verifyJavaLibraryPathOverride(tr, false);
}
}
- private static void verifyJavaLibraryPathGeneric(TestResult tr) {
+ private void verifyJavaLibraryPathGeneric(TestResult tr) {
if (!tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
- System.out.print("FAIL: verifyJavaLibraryPath: ");
- System.out.println(" java.library.path does not contain " +
+ flagError(tr, "testJavaLibraryPath: java.library.path does not contain " +
LD_LIBRARY_PATH_VALUE);
- System.out.println(tr);
- errors++;
- } else {
- passes++;
}
}
- private static void verifyJavaLibraryPathOverride(TestResult tr,
+ private void verifyJavaLibraryPathOverride(TestResult tr,
boolean is32Bit) {
// make sure the 32/64 bit value exists
if (!tr.matches("java.library.path=.*" +
(is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE) + ".*")) {
- System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
- System.out.println(" java.library.path does not contain " +
+ flagError(tr, "verifyJavaLibraryPathOverride: " +
+ " java.library.path does not contain " +
(is32Bit ? LD_LIBRARY_PATH_32_VALUE : LD_LIBRARY_PATH_64_VALUE));
- System.out.println(tr);
- errors++;
- } else {
- passes++;
+
}
// make sure the generic value is absent
- if (tr.matches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
- System.out.print("FAIL: verifyJavaLibraryPathOverride: ");
- System.out.println(" java.library.path contains " +
- LD_LIBRARY_PATH_VALUE);
- System.out.println(tr);
- errors++;
- } else {
- passes++;
+ if (!tr.notMatches("java.library.path=.*" + LD_LIBRARY_PATH_VALUE + ".*")) {
+ flagError(tr, "verifyJavaLibraryPathOverride: " +
+ " java.library.path contains " + LD_LIBRARY_PATH_VALUE);
}
}
@@ -289,34 +239,28 @@
* ensures we have indeed exec'ed the correct vm of choice, all VMs support
* -server, however 32-bit VMs support -client and -server.
*/
- static void verifyVmSelection() {
+ @Test
+ void testVmSelection() {
TestResult tr = null;
if (is32Bit) {
tr = doExec(javaCmd, "-client", "-version");
if (!tr.matches(".*Client VM.*")) {
- System.out.println("FAIL: the expected vm -client did not launch");
- System.out.println(tr);
- errors++;
- } else {
- passes++;
+ flagError(tr, "the expected vm -client did not launch");
}
}
tr = doExec(javaCmd, "-server", "-version");
if (!tr.matches(".*Server VM.*")) {
- System.out.println("FAIL: the expected vm -server did not launch");
- System.out.println(tr);
- errors++;
- } else {
- passes++;
+ flagError(tr, "the expected vm -server did not launch");
}
}
/*
* checks to see there is no extra libjvm.so than needed
*/
- static void verifyNoSymLink() {
+ @Test
+ void testNoSymLink() {
if (is64Bit) {
return;
}
@@ -326,31 +270,65 @@
symLink = new File(JAVAHOME, libPathPrefix +
getJreArch() + "/" + LIBJVM);
if (symLink.exists()) {
- System.out.println("FAIL: The symlink exists " +
- symLink.getAbsolutePath());
- errors++;
- } else {
- passes++;
+ throw new RuntimeException("symlink exists " + symLink.getAbsolutePath());
}
}
+ /*
+ * verify if all the symlinks in the images are created correctly,
+ * only on solaris, this test works only on images.
+ */
+ @Test
+ void testSymLinks() throws Exception {
+ if (!isSolaris)
+ return;
+ verifySymLinks(JAVA_BIN);
+ verifySymLinks(JAVA_JRE_BIN);
+ }
+ // exclude non-consequential binaries or scripts co-packaged in other
+ // build phases
+ private final String excludeRE =
+ ".*jvisualvm.*" +
+ "|.*javaws.*" +
+ "|.*ControlPanel.*" +
+ "|.*java-rmi.cgi" +
+ "|.*jcontrol.*";
+ private final Pattern symlinkExcludes = Pattern.compile(excludeRE);
+
+ private void verifySymLinks(String bindir) throws IOException {
+ File binDir = new File(bindir);
+ System.err.println("verifying links in: " + bindir);
+ File isaDir = new File(binDir, getArch()).getAbsoluteFile();
+ if (!isaDir.exists()) {
+ throw new RuntimeException("dir: " + isaDir + " does not exist");
+ }
+ try (DirectoryStream<Path> ds = Files.newDirectoryStream(binDir.toPath())) {
+ for (Path p : ds) {
+ if (symlinkExcludes.matcher(p.toString()).matches() ||
+ Files.isDirectory(p, NOFOLLOW_LINKS)) {
+ continue;
+ }
+ Path link = new File(isaDir, p.getFileName().toString()).toPath();
+ if (Files.isSymbolicLink(link)) {
+ Path target = Files.readSymbolicLink(link);
+ if (target.startsWith("..") && p.endsWith(target.getFileName())) {
+ // System.out.println(target + " OK");
+ continue;
+ }
+ System.err.println("target:" + target);
+ System.err.println("file:" + p);
+ }
+ throw new RuntimeException("could not find link to " + p);
+ }
+ }
+
+ }
public static void main(String... args) throws Exception {
if (isWindows) {
- System.out.println("Warning: noop on windows");
+ System.err.println("Warning: test not applicable to windows");
return;
}
- // create our test jar first
- createTestJar();
- ensureNoExec();
- verifyVmSelection();
- ensureEcoFriendly();
- verifyJavaLibraryPath();
- verifyNoSymLink();
- if (errors > 0) {
- throw new Exception("ExecutionEnvironment: FAIL: with " +
- errors + " errors and passes " + passes );
- } else {
- System.out.println("ExecutionEnvironment: PASS " + passes);
- }
+ ExecutionEnvironment ee = new ExecutionEnvironment();
+ ee.run(args);
}
}
--- a/jdk/test/tools/launcher/FXLauncherTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/FXLauncherTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -405,7 +405,7 @@
}
} else {
System.err.println("Warning: JavaFX components missing or not supported");
- System.err.println(" test passes vacuosly.");
+ System.err.println(" test passes vacuously.");
}
}
}
--- a/jdk/test/tools/launcher/RunpathTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/RunpathTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -64,15 +64,9 @@
}
void testRpath() {
- if (isDualMode && is64Bit) {
- String expectedRpath = ".*RPATH.*\\$ORIGIN/../../lib/" + getJreArch()
- + ":\\$ORIGIN/../../jre/lib/" + getJreArch() + ".*";
- elfCheck(java64Cmd, expectedRpath);
- } else {
- String expectedRpath = ".*RPATH.*\\$ORIGIN/../lib/" + getJreArch()
- + ":\\$ORIGIN/../jre/lib/" + getJreArch() + ".*";
- elfCheck(javaCmd, expectedRpath);
- }
+ String expectedRpath = ".*RPATH.*\\$ORIGIN/../lib/" + getJreArch()
+ + ":\\$ORIGIN/../jre/lib/" + getJreArch() + ".*";
+ elfCheck(javaCmd, expectedRpath);
}
public static void main(String... args) throws Exception {
--- a/jdk/test/tools/launcher/Test7029048.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/Test7029048.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,8 +30,8 @@
*/
/*
- * 7029048: test for LD_LIBRARY_PATH set to different paths pointing which may
- * contain a libjvm.so and may not, but we test to ensure that the launcher
+ * 7029048: test for LD_LIBRARY_PATH set to different paths which may or
+ * may not contain a libjvm.so, but we test to ensure that the launcher
* behaves correctly in all cases.
*/
import java.io.File;
@@ -50,8 +50,6 @@
private static final String LIBJVM = ExecutionEnvironment.LIBJVM;
private static final String LD_LIBRARY_PATH =
ExecutionEnvironment.LD_LIBRARY_PATH;
- private static final String LD_LIBRARY_PATH_32 =
- ExecutionEnvironment.LD_LIBRARY_PATH_32;
private static final String LD_LIBRARY_PATH_64 =
ExecutionEnvironment.LD_LIBRARY_PATH_64;
@@ -70,24 +68,8 @@
private static final File dstClientDir = new File(dstLibArchDir, "client");
private static final File dstClientLibjvm = new File(dstClientDir, LIBJVM);
- // used primarily to test the solaris variants in dual mode
- private static final File dstOtherArchDir;
- private static final File dstOtherServerDir;
- private static final File dstOtherServerLibjvm;
-
private static final Map<String, String> env = new HashMap<>();
- static {
- if (isDualMode) {
- dstOtherArchDir = new File(dstLibDir, getComplementaryJreArch());
- dstOtherServerDir = new File(dstOtherArchDir, "server");
- dstOtherServerLibjvm = new File(dstOtherServerDir, LIBJVM);
- } else {
- dstOtherArchDir = null;
- dstOtherServerDir = null;
- dstOtherServerLibjvm = null;
- }
- }
static String getValue(String name, List<String> in) {
for (String x : in) {
@@ -99,45 +81,20 @@
return null;
}
- static void run(boolean want32, String dflag, Map<String, String> env,
+ static void run(Map<String, String> env,
int nLLPComponents, String caseID) {
- final boolean want64 = want32 == false;
env.put(ExecutionEnvironment.JLDEBUG_KEY, "true");
List<String> cmdsList = new ArrayList<>();
-
- // only for a dual-mode system
- if (want64 && isDualMode) {
- cmdsList.add(java64Cmd);
- } else {
- cmdsList.add(javaCmd); // a 32-bit java command for all
- }
-
- /*
- * empty or null strings can confuse the ProcessBuilder. A null flag
- * indicates that the appropriate data model is enforced on the chosen
- * launcher variant.
- */
-
- if (dflag != null) {
- cmdsList.add(dflag);
- } else {
- cmdsList.add(want32 ? "-d32" : "-d64");
- }
+ cmdsList.add(javaCmd);
cmdsList.add("-server");
cmdsList.add("-jar");
cmdsList.add(ExecutionEnvironment.testJarFile.getAbsolutePath());
String[] cmds = new String[cmdsList.size()];
TestResult tr = doExec(env, cmdsList.toArray(cmds));
+ System.out.println(tr);
analyze(tr, nLLPComponents, caseID);
}
- // no cross launch, ie. no change to the data model.
- static void run(Map<String, String> env, int nLLPComponents, String caseID)
- throws IOException {
- boolean want32 = is32Bit;
- run(want32, null, env, nLLPComponents, caseID);
- }
-
static void analyze(TestResult tr, int nLLPComponents, String caseID) {
String envValue = getValue(LD_LIBRARY_PATH, tr.testOutput);
/*
@@ -192,10 +149,6 @@
copyFile(srcLibjvmSo, dstServerLibjvm);
// does not matter if it is client or a server
copyFile(srcLibjvmSo, dstClientLibjvm);
- // does not matter if the arch do not match either
- if (isDualMode) {
- copyFile(srcLibjvmSo, dstOtherServerLibjvm);
- }
desc = "LD_LIBRARY_PATH should be set";
break;
case LLP_SET_EMPTY_PATH:
@@ -211,14 +164,6 @@
Files.deleteIfExists(dstServerLibjvm.toPath());
}
- if (isDualMode) {
- if (!dstOtherServerDir.exists()) {
- Files.createDirectories(dstOtherServerDir.toPath());
- } else {
- Files.deleteIfExists(dstOtherServerLibjvm.toPath());
- }
- }
-
desc = "LD_LIBRARY_PATH should not be set";
break;
case LLP_SET_NON_EXISTENT_PATH:
@@ -245,40 +190,14 @@
env.put(LD_LIBRARY_PATH, dstClientDir.getAbsolutePath());
run(env, v.value + 1, "Case 2: " + desc);
- if (!isDualMode) {
- continue; // nothing more to do for Linux
- }
-
- // Tests applicable only to solaris.
-
- // initialize test variables for dual mode operations
- final File dst32ServerDir = is32Bit
- ? dstServerDir
- : dstOtherServerDir;
-
- final File dst64ServerDir = is64Bit
- ? dstServerDir
- : dstOtherServerDir;
-
- /*
- * Case 3: set the appropriate LLP_XX flag,
- * java32 -d32, LLP_32 is relevant, LLP_64 is ignored
- * java64 -d64, LLP_64 is relevant, LLP_32 is ignored
- */
- env.clear();
- env.put(LD_LIBRARY_PATH_32, dst32ServerDir.getAbsolutePath());
- env.put(LD_LIBRARY_PATH_64, dst64ServerDir.getAbsolutePath());
- run(is32Bit, null, env, v.value + 1, "Case 3: " + desc);
-
- /*
- * Case 4: we are in dual mode environment, running 64-bit then
- * we have the following scenarios:
- * java32 -d64, LLP_64 is relevant, LLP_32 is ignored
- * java64 -d32, LLP_32 is relevant, LLP_64 is ignored
- */
- if (dualModePresent()) {
- run(true, "-d64", env, v.value + 1, "Case 4A: " + desc);
- run(false,"-d32", env, v.value + 1, "Case 4B: " + desc);
+ if (isSolaris) {
+ /*
+ * Case 3: set the appropriate LLP_XX flag,
+ * java64 -d64, LLP_64 is relevant, LLP_32 is ignored
+ */
+ env.clear();
+ env.put(LD_LIBRARY_PATH_64, dstServerDir.getAbsolutePath());
+ run(env, v.value + 1, "Case 3: " + desc);
}
}
return;
@@ -297,9 +216,6 @@
if (errors > 0) {
throw new Exception("Test7029048: FAIL: with "
+ errors + " errors and passes " + passes);
- } else if (dualModePresent() && passes < 15) {
- throw new Exception("Test7029048: FAIL: " +
- "all tests did not run, expected " + 15 + " got " + passes);
} else if (isSolaris && passes < 9) {
throw new Exception("Test7029048: FAIL: " +
"all tests did not run, expected " + 9 + " got " + passes);
--- a/jdk/test/tools/launcher/TestHelper.java Sat Sep 14 20:43:34 2013 +0100
+++ b/jdk/test/tools/launcher/TestHelper.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -66,10 +66,10 @@
static final String JAVAHOME = System.getProperty("java.home");
static final String JAVA_BIN;
+ static final String JAVA_JRE_BIN;
static final boolean isSDK = JAVAHOME.endsWith("jre");
static final String javaCmd;
static final String javawCmd;
- static final String java64Cmd;
static final String javacCmd;
static final String jarCmd;
@@ -88,7 +88,7 @@
System.getProperty("os.name", "unknown").startsWith("SunOS");
static final boolean isLinux =
System.getProperty("os.name", "unknown").startsWith("Linux");
- static final boolean isDualMode = isSolaris;
+
static final boolean isSparc = System.getProperty("os.arch").startsWith("sparc");
// make a note of the golden default locale
@@ -124,9 +124,12 @@
throw new RuntimeException("arch model is not 32 or 64 bit ?");
}
compiler = ToolProvider.getSystemJavaCompiler();
- File binDir = (isSDK) ? new File((new File(JAVAHOME)).getParentFile(), "bin")
- : new File(JAVAHOME, "bin");
+ File binDir = (isSDK)
+ ? new File((new File(JAVAHOME)).getParentFile(), "bin")
+ : new File(JAVAHOME, "bin");
JAVA_BIN = binDir.getAbsolutePath();
+ JAVA_JRE_BIN = new File((new File(JAVAHOME)).getParentFile(),
+ (isSDK) ? "jre/bin" : "bin").getAbsolutePath();
File javaCmdFile = (isWindows)
? new File(binDir, "java.exe")
: new File(binDir, "java");
@@ -165,17 +168,6 @@
throw new RuntimeException("java <" + javacCmd +
"> must exist and should be executable");
}
- if (isSolaris) {
- File sparc64BinDir = new File(binDir,isSparc ? "sparcv9" : "amd64");
- File java64CmdFile= new File(sparc64BinDir, "java");
- if (java64CmdFile.exists() && java64CmdFile.canExecute()) {
- java64Cmd = java64CmdFile.getAbsolutePath();
- } else {
- java64Cmd = null;
- }
- } else {
- java64Cmd = null;
- }
}
void run(String[] args) throws Exception {
int passed = 0, failed = 0;
@@ -194,7 +186,13 @@
System.out.printf("Passed: %d, Failed: %d, ExitValue: %d%n",
passed, failed, testExitValue);
} catch (Throwable ex) {
- System.out.printf("Test %s failed: %s %n", m, ex.getCause());
+ System.out.printf("Test %s failed: %s %n", m, ex);
+ System.out.println("----begin detailed exceptions----");
+ ex.printStackTrace(System.out);
+ for (Throwable t : ex.getSuppressed()) {
+ t.printStackTrace(System.out);
+ }
+ System.out.println("----end detailed exceptions----");
failed++;
}
}
@@ -210,41 +208,15 @@
}
/*
- * is a dual mode available in the test jdk
- */
- static boolean dualModePresent() {
- return isDualMode && java64Cmd != null;
- }
-
- /*
* usually the jre/lib/arch-name is the same as os.arch, except for x86.
*/
static String getJreArch() {
String arch = System.getProperty("os.arch");
return arch.equals("x86") ? "i386" : arch;
}
-
- /*
- * get the complementary jre arch ie. if sparc then return sparcv9 and
- * vice-versa.
- */
- static String getComplementaryJreArch() {
- String arch = System.getProperty("os.arch");
- if (arch != null) {
- switch (arch) {
- case "sparc":
- return "sparcv9";
- case "sparcv9":
- return "sparc";
- case "x86":
- return "amd64";
- case "amd64":
- return "i386";
- }
- }
- return null;
+ static String getArch() {
+ return System.getProperty("os.arch");
}
-
static File getClassFile(File javaFile) {
String s = javaFile.getAbsolutePath().replace(JAVA_FILE_EXT, CLASS_FILE_EXT);
return new File(s);
@@ -623,6 +595,16 @@
appendError("string <" + stringToMatch + "> not found");
return false;
}
+
+ boolean notMatches(String stringToMatch) {
+ for (String x : testOutput) {
+ if (!x.matches(stringToMatch)) {
+ return true;
+ }
+ }
+ appendError("string <" + stringToMatch + "> found");
+ return false;
+ }
}
/**
* Indicates that the annotated method is a test method.
--- a/langtools/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -229,3 +229,6 @@
375834b5cf086dd7ce9e49f602d81bb51d3e0fa9 jdk8-b105
fcd768844b9926c5f994292ec6350c20cc7c0f76 jdk8-b106
3f274927ec1863544b8214262ab02b7de2970da6 jdk8-b107
+252f872b8a2f81a416f9127e77924ca56a4578b0 jdk8-b108
+985abf1cd327169a317d4ff4f318a8162a5cd47d jdk8-b109
+41541097533aa3933a018c8c1c426c1871dfd76e jdk8-b110
--- a/langtools/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -40,8 +40,8 @@
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
macosx_x64_10.7-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# Test target list (no fastdebug & limited c2 testing)
jprt.my.test.target.set= \
@@ -52,8 +52,8 @@
linux_i586_2.6-product-{c1|c2}-TESTNAME, \
linux_x64_2.6-product-c2-TESTNAME, \
macosx_x64_10.7-product-c2-TESTNAME, \
- windows_i586_5.1-product-c1-TESTNAME, \
- windows_x64_5.2-product-c2-TESTNAME
+ windows_i586_6.1-product-c1-TESTNAME, \
+ windows_x64_6.1-product-c2-TESTNAME
# Default test targets
jprt.make.rule.test.targets= \
@@ -71,8 +71,8 @@
linux_i586_2.6-product-{c1|c2}-TESTNAME, \
linux_x64_2.6-product-c2-TESTNAME, \
macosx_x64_10.7-product-c2-TESTNAME, \
- windows_i586_5.1-product-c1-TESTNAME, \
- windows_x64_5.2-product-c2-TESTNAME
+ windows_i586_6.1-product-c1-TESTNAME, \
+ windows_x64_6.1-product-c2-TESTNAME
# Default test targets
jprt.make.rule.test.targets= \
--- a/langtools/make/netbeans/langtools/build.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/make/netbeans/langtools/build.xml Thu Oct 03 19:18:54 2013 +0100
@@ -55,18 +55,17 @@
description="Build one or all langtools tools"
/>
- <condition property="bootstrap" value="bootstrap-" else="">
+ <condition property="use_bootstrap" value="bootstrap-" else="">
<isset property="langtools.tool.bootstrap"/>
</condition>
-
- <condition property="bcp" value="${build.bootstrap.dir}/classes" else="${build.classes.dir}">
+ <condition property="with_bootclasspath" value="${build.bootstrap.dir}/classes" else="${build.classes.dir}">
<isset property="langtools.tool.bootstrap"/>
</condition>
<target name="-build-tool" if="langtools.tool.name">
- <echo level="info" message="Building ${bootstrap}${langtools.tool.name}"/>
+ <echo level="info" message="Building ${use_bootstrap}${langtools.tool.name}"/>
<echo level="verbose" message="(Unset langtools.tool.name to build all tools)"/>
- <antcall target="build-${bootstrap}${langtools.tool.name}"/>
+ <antcall target="build-${use_bootstrap}${langtools.tool.name}"/>
</target>
<target name="-build-all" unless="langtools.tool.name">
@@ -97,9 +96,9 @@
<target name="run" depends="-check-target.java.home,build,-def-run,-get-tool-and-args"
description="run tool">
- <echo level="info" message="${bcp}"/>
- <echo level="info" message="Run ${bootstrap}${langtools.tool.name} with args ${langtools.tool.args}"/>
- <run bcp="${bcp}" mainclass="com.sun.tools.${langtools.tool.name}.Main" args="${langtools.tool.args}"/>
+ <echo level="info" message="${with_bootclasspath}"/>
+ <echo level="info" message="Run ${use_bootstrap}${langtools.tool.name} with args ${langtools.tool.args}"/>
+ <run bcp="${with_bootclasspath}" mainclass="com.sun.tools.${langtools.tool.name}.Main" args="${langtools.tool.args}"/>
</target>
<!-- Run a selected class. (action: run.single; shift-F6) -->
@@ -145,9 +144,9 @@
<!-- Debug tool in NetBeans. -->
<target name="debug" depends="-check-target.java.home,-def-run,-def-start-debugger,-get-tool-and-args,build" if="netbeans.home">
- <echo level="info" message="Debug ${boostrap}${langtools.tool.name} with args ${langtools.tool.args}"/>
+ <echo level="info" message="Debug ${use_bootstrap}${langtools.tool.name} with args ${langtools.tool.args}"/>
<start-debugger/>
- <run bcp="${bcp}" mainclass="com.sun.tools.${langtools.tool.name}.Main" args="${langtools.tool.args}" jpda.jvmargs="${jpda.jvmargs}"/>
+ <run bcp="${with_bootclasspath}" mainclass="com.sun.tools.${langtools.tool.name}.Main" args="${langtools.tool.args}" jpda.jvmargs="${jpda.jvmargs}"/>
</target>
<!-- Debug a selected class . -->
@@ -237,12 +236,12 @@
<macrodef name="run">
<attribute name="mainclass"/>
<attribute name="args" default=""/>
- <attribute name="bcp" default="${build.classes.dir}"/>
+ <attribute name="bcp" default="${with_bootclasspath}"/>
<attribute name="jpda.jvmargs" default=""/>
<sequential>
<java fork="true" jvm="${target.java}" classname="@{mainclass}">
- <jvmarg line="-Xbootclasspath/p:${bcp}"/>
+ <jvmarg line="-Xbootclasspath/p:@{bcp}"/>
<jvmarg line="@{jpda.jvmargs}"/>
<arg line="@{args}"/>
</java>
--- a/langtools/make/tools/anttasks/SelectToolTask.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/make/tools/anttasks/SelectToolTask.java Thu Oct 03 19:18:54 2013 +0100
@@ -87,8 +87,9 @@
this(toolName, false);
}
- ToolChoices(String toolName, boolean boostrap) {
+ ToolChoices(String toolName, boolean bootstrap) {
this.toolName = toolName;
+ this.bootstrap = bootstrap;
}
@Override
--- a/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Thu Oct 03 19:18:54 2013 +0100
@@ -61,9 +61,9 @@
code_length = cr.readInt();
code = new byte[code_length];
cr.readFully(code);
- exception_table_langth = cr.readUnsignedShort();
- exception_table = new Exception_data[exception_table_langth];
- for (int i = 0; i < exception_table_langth; i++)
+ exception_table_length = cr.readUnsignedShort();
+ exception_table = new Exception_data[exception_table_length];
+ for (int i = 0; i < exception_table_length; i++)
exception_table[i] = new Exception_data(cr);
attributes = new Attributes(cr);
}
@@ -139,7 +139,7 @@
public final int max_locals;
public final int code_length;
public final byte[] code;
- public final int exception_table_langth;
+ public final int exception_table_length;
public final Exception_data[] exception_table;
public final Attributes attributes;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeFieldWriterImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,301 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.formats.html;
+
+import java.io.*;
+
+import com.sun.javadoc.*;
+import com.sun.tools.doclets.formats.html.markup.*;
+import com.sun.tools.doclets.internal.toolkit.*;
+
+/**
+ * Writes annotation type field documentation in HTML format.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ * @author Bhavesh Patel
+ */
+public class AnnotationTypeFieldWriterImpl extends AbstractMemberWriter
+ implements AnnotationTypeFieldWriter, MemberSummaryWriter {
+
+ /**
+ * Construct a new AnnotationTypeFieldWriterImpl.
+ *
+ * @param writer the writer that will write the output.
+ * @param annotationType the AnnotationType that holds this member.
+ */
+ public AnnotationTypeFieldWriterImpl(SubWriterHolderWriter writer,
+ AnnotationTypeDoc annotationType) {
+ super(writer, annotationType);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getMemberSummaryHeader(ClassDoc classDoc,
+ Content memberSummaryTree) {
+ memberSummaryTree.addContent(
+ HtmlConstants.START_OF_ANNOTATION_TYPE_FIELD_SUMMARY);
+ Content memberTree = writer.getMemberTreeHeader();
+ writer.addSummaryHeader(this, classDoc, memberTree);
+ return memberTree;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getMemberTreeHeader() {
+ return writer.getMemberTreeHeader();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addAnnotationFieldDetailsMarker(Content memberDetails) {
+ memberDetails.addContent(HtmlConstants.START_OF_ANNOTATION_TYPE_FIELD_DETAILS);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addAnnotationDetailsTreeHeader(ClassDoc classDoc,
+ Content memberDetailsTree) {
+ if (!writer.printedAnnotationFieldHeading) {
+ memberDetailsTree.addContent(writer.getMarkerAnchor(
+ "annotation_type_field_detail"));
+ Content heading = HtmlTree.HEADING(HtmlConstants.DETAILS_HEADING,
+ writer.fieldDetailsLabel);
+ memberDetailsTree.addContent(heading);
+ writer.printedAnnotationFieldHeading = true;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getAnnotationDocTreeHeader(MemberDoc member,
+ Content annotationDetailsTree) {
+ annotationDetailsTree.addContent(
+ writer.getMarkerAnchor(member.name()));
+ Content annotationDocTree = writer.getMemberTreeHeader();
+ Content heading = new HtmlTree(HtmlConstants.MEMBER_HEADING);
+ heading.addContent(member.name());
+ annotationDocTree.addContent(heading);
+ return annotationDocTree;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getSignature(MemberDoc member) {
+ Content pre = new HtmlTree(HtmlTag.PRE);
+ writer.addAnnotationInfo(member, pre);
+ addModifiers(member, pre);
+ Content link =
+ writer.getLink(new LinkInfoImpl(configuration,
+ LinkInfoImpl.Kind.MEMBER, getType(member)));
+ pre.addContent(link);
+ pre.addContent(writer.getSpace());
+ if (configuration.linksource) {
+ Content memberName = new StringContent(member.name());
+ writer.addSrcLink(member, memberName, pre);
+ } else {
+ addName(member.name(), pre);
+ }
+ return pre;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addDeprecated(MemberDoc member, Content annotationDocTree) {
+ addDeprecatedInfo(member, annotationDocTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addComments(MemberDoc member, Content annotationDocTree) {
+ addComment(member, annotationDocTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addTags(MemberDoc member, Content annotationDocTree) {
+ writer.addTagsInfo(member, annotationDocTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getAnnotationDetails(Content annotationDetailsTree) {
+ return getMemberTree(annotationDetailsTree);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getAnnotationDoc(Content annotationDocTree,
+ boolean isLastContent) {
+ return getMemberTree(annotationDocTree, isLastContent);
+ }
+
+ /**
+ * Close the writer.
+ */
+ public void close() throws IOException {
+ writer.close();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addSummaryLabel(Content memberTree) {
+ Content label = HtmlTree.HEADING(HtmlConstants.SUMMARY_HEADING,
+ writer.getResource("doclet.Field_Summary"));
+ memberTree.addContent(label);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getTableSummary() {
+ return configuration.getText("doclet.Member_Table_Summary",
+ configuration.getText("doclet.Field_Summary"),
+ configuration.getText("doclet.fields"));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Content getCaption() {
+ return configuration.getResource("doclet.Fields");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getSummaryTableHeader(ProgramElementDoc member) {
+ String[] header = new String[] {
+ writer.getModifierTypeHeader(),
+ configuration.getText("doclet.0_and_1",
+ configuration.getText("doclet.Fields"),
+ configuration.getText("doclet.Description"))
+ };
+ return header;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addSummaryAnchor(ClassDoc cd, Content memberTree) {
+ memberTree.addContent(writer.getMarkerAnchor(
+ "annotation_type_field_summary"));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addInheritedSummaryAnchor(ClassDoc cd, Content inheritedTree) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addInheritedSummaryLabel(ClassDoc cd, Content inheritedTree) {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addSummaryLink(LinkInfoImpl.Kind context, ClassDoc cd, ProgramElementDoc member,
+ Content tdSummary) {
+ Content strong = HtmlTree.SPAN(HtmlStyle.strong,
+ writer.getDocLink(context, (MemberDoc) member, member.name(), false));
+ Content code = HtmlTree.CODE(strong);
+ tdSummary.addContent(code);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addInheritedSummaryLink(ClassDoc cd,
+ ProgramElementDoc member, Content linksTree) {
+ //Not applicable.
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addSummaryType(ProgramElementDoc member, Content tdSummaryType) {
+ MemberDoc m = (MemberDoc)member;
+ addModifierAndType(m, getType(m), tdSummaryType);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Content getDeprecatedLink(ProgramElementDoc member) {
+ return writer.getDocLink(LinkInfoImpl.Kind.MEMBER,
+ (MemberDoc) member, ((MemberDoc)member).qualifiedName());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected Content getNavSummaryLink(ClassDoc cd, boolean link) {
+ if (link) {
+ return writer.getHyperLink("annotation_type_field_summary",
+ writer.getResource("doclet.navField"));
+ } else {
+ return writer.getResource("doclet.navField");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void addNavDetailLink(boolean link, Content liNav) {
+ if (link) {
+ liNav.addContent(writer.getHyperLink("annotation_type_field_detail",
+ writer.getResource("doclet.navField")));
+ } else {
+ liNav.addContent(writer.getResource("doclet.navField"));
+ }
+ }
+
+ private Type getType(MemberDoc member) {
+ if (member instanceof FieldDoc) {
+ return ((FieldDoc) member).type();
+ } else {
+ return ((MethodDoc) member).returnType();
+ }
+ }
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -71,6 +71,20 @@
/**
* {@inheritDoc}
*/
+ public Content getMemberTreeHeader() {
+ return writer.getMemberTreeHeader();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addAnnotationDetailsMarker(Content memberDetails) {
+ memberDetails.addContent(HtmlConstants.START_OF_ANNOTATION_TYPE_DETAILS);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public void addAnnotationDetailsTreeHeader(ClassDoc classDoc,
Content memberDetailsTree) {
if (!writer.printedAnnotationHeading) {
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -278,13 +278,6 @@
/**
* {@inheritDoc}
*/
- public void addAnnotationDetailsMarker(Content memberDetails) {
- memberDetails.addContent(HtmlConstants.START_OF_ANNOTATION_TYPE_DETAILS);
- }
-
- /**
- * {@inheritDoc}
- */
protected Content getNavLinkTree() {
Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE,
treeLabel, "", "");
@@ -319,6 +312,12 @@
Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li);
MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder)
configuration.getBuilderFactory().getMemberSummaryBuilder(this);
+ Content liNavField = new HtmlTree(HtmlTag.LI);
+ addNavSummaryLink(memberSummaryBuilder,
+ "doclet.navField",
+ VisibleMemberMap.ANNOTATION_TYPE_FIELDS, liNavField);
+ addNavGap(liNavField);
+ ulNav.addContent(liNavField);
Content liNavReq = new HtmlTree(HtmlTag.LI);
addNavSummaryLink(memberSummaryBuilder,
"doclet.navAnnotationTypeRequiredMember",
@@ -364,12 +363,23 @@
Content ulNav = HtmlTree.UL(HtmlStyle.subNavList, li);
MemberSummaryBuilder memberSummaryBuilder = (MemberSummaryBuilder)
configuration.getBuilderFactory().getMemberSummaryBuilder(this);
+ AbstractMemberWriter writerField =
+ ((AbstractMemberWriter) memberSummaryBuilder.
+ getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_FIELDS));
AbstractMemberWriter writerOptional =
((AbstractMemberWriter) memberSummaryBuilder.
getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL));
AbstractMemberWriter writerRequired =
((AbstractMemberWriter) memberSummaryBuilder.
getMemberSummaryWriter(VisibleMemberMap.ANNOTATION_TYPE_MEMBER_REQUIRED));
+ Content liNavField = new HtmlTree(HtmlTag.LI);
+ if (writerField != null){
+ writerField.addNavDetailLink(annotationType.fields().length > 0, liNavField);
+ } else {
+ liNavField.addContent(getResource("doclet.navField"));
+ }
+ addNavGap(liNavField);
+ ulNav.addContent(liNavField);
if (writerOptional != null){
Content liNavOpt = new HtmlTree(HtmlTag.LI);
writerOptional.addNavDetailLink(annotationType.elements().length > 0, liNavOpt);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -85,6 +85,11 @@
protected boolean printedAnnotationHeading = false;
/**
+ * To check whether annotation field heading is printed or not.
+ */
+ protected boolean printedAnnotationFieldHeading = false;
+
+ /**
* To check whether the repeated annotations is documented or not.
*/
private boolean isAnnotationDocumented = false;
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -107,6 +107,16 @@
/**
* {@inheritDoc}
*/
+ public AnnotationTypeFieldWriter
+ getAnnotationTypeFieldWriter(AnnotationTypeWriter annotationTypeWriter) throws Exception {
+ return new AnnotationTypeFieldWriterImpl(
+ (SubWriterHolderWriter) annotationTypeWriter,
+ annotationTypeWriter.getAnnotationTypeDoc());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public AnnotationTypeOptionalMemberWriter
getAnnotationTypeOptionalMemberWriter(
AnnotationTypeWriter annotationTypeWriter) throws Exception {
@@ -202,6 +212,9 @@
AnnotationTypeWriter annotationTypeWriter, int memberType)
throws Exception {
switch (memberType) {
+ case VisibleMemberMap.ANNOTATION_TYPE_FIELDS:
+ return (AnnotationTypeFieldWriterImpl)
+ getAnnotationTypeFieldWriter(annotationTypeWriter);
case VisibleMemberMap.ANNOTATION_TYPE_MEMBER_OPTIONAL:
return (AnnotationTypeOptionalMemberWriterImpl)
getAnnotationTypeOptionalMemberWriter(annotationTypeWriter);
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java Thu Oct 03 19:18:54 2013 +0100
@@ -94,6 +94,12 @@
new Comment("=========== ANNOTATION TYPE REQUIRED MEMBER SUMMARY ===========");
/**
+ * Marker to identify start of annotation type required member summary.
+ */
+ public static final Content START_OF_ANNOTATION_TYPE_FIELD_SUMMARY =
+ new Comment("=========== ANNOTATION TYPE FIELD SUMMARY ===========");
+
+ /**
* Marker to identify start of constructor summary.
*/
public static final Content START_OF_CONSTRUCTOR_SUMMARY =
@@ -130,6 +136,12 @@
new Comment("============ ANNOTATION TYPE MEMBER DETAIL ===========");
/**
+ * Marker to identify start of annotation type field details.
+ */
+ public static final Content START_OF_ANNOTATION_TYPE_FIELD_DETAILS =
+ new Comment("============ ANNOTATION TYPE FIELD DETAIL ===========");
+
+ /**
* Marker to identify start of method details.
*/
public static final Content START_OF_METHOD_DETAILS =
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Thu Oct 03 19:18:54 2013 +0100
@@ -28,6 +28,7 @@
import java.io.IOException;
import java.io.Writer;
import java.util.*;
+import java.nio.charset.*;
import com.sun.tools.doclets.internal.toolkit.Content;
import com.sun.tools.doclets.internal.toolkit.util.*;
@@ -164,6 +165,46 @@
}
/**
+ * A set of ASCII URI characters to be left unencoded.
+ */
+ public static final BitSet NONENCODING_CHARS = new BitSet(256);
+
+ static {
+ // alphabetic characters
+ for (int i = 'a'; i <= 'z'; i++) {
+ NONENCODING_CHARS.set(i);
+ }
+ for (int i = 'A'; i <= 'Z'; i++) {
+ NONENCODING_CHARS.set(i);
+ }
+ // numeric characters
+ for (int i = '0'; i <= '9'; i++) {
+ NONENCODING_CHARS.set(i);
+ }
+ // Reserved characters as per RFC 3986. These are set of delimiting characters.
+ String noEnc = ":/?#[]@!$&'()*+,;=";
+ // Unreserved characters as per RFC 3986 which should not be percent encoded.
+ noEnc += "-._~";
+ for (int i = 0; i < noEnc.length(); i++) {
+ NONENCODING_CHARS.set(noEnc.charAt(i));
+ }
+ }
+
+ private static String encodeURL(String url) {
+ byte[] urlBytes = url.getBytes(Charset.forName("UTF-8"));
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < urlBytes.length; i++) {
+ int c = urlBytes[i];
+ if (NONENCODING_CHARS.get(c & 0xFF)) {
+ sb.append((char) c);
+ } else {
+ sb.append(String.format("%%%02X", c & 0xFF));
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
* Generates an HTML anchor tag.
*
* @param ref reference url for the anchor tag
@@ -172,7 +213,7 @@
*/
public static HtmlTree A(String ref, Content body) {
HtmlTree htmltree = new HtmlTree(HtmlTag.A, nullCheck(body));
- htmltree.addAttr(HtmlAttr.HREF, ref);
+ htmltree.addAttr(HtmlAttr.HREF, encodeURL(ref));
return htmltree;
}
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -335,6 +335,12 @@
" if (targetPage.indexOf(\":\") != -1 || (targetPage != \"\" && !validURL(targetPage)))" + DocletConstants.NL +
" targetPage = \"undefined\";" + DocletConstants.NL +
" function validURL(url) {" + DocletConstants.NL +
+ " try {" + DocletConstants.NL +
+ " url = decodeURIComponent(url);" + DocletConstants.NL +
+ " }" + DocletConstants.NL +
+ " catch (error) {" + DocletConstants.NL +
+ " return false;" + DocletConstants.NL +
+ " }" + DocletConstants.NL +
" var pos = url.indexOf(\".html\");" + DocletConstants.NL +
" if (pos == -1 || pos != url.length - 5)" + DocletConstants.NL +
" return false;" + DocletConstants.NL +
@@ -346,7 +352,8 @@
" if ('a' <= ch && ch <= 'z' ||" + DocletConstants.NL +
" 'A' <= ch && ch <= 'Z' ||" + DocletConstants.NL +
" ch == '$' ||" + DocletConstants.NL +
- " ch == '_') {" + DocletConstants.NL +
+ " ch == '_' ||" + DocletConstants.NL +
+ " ch.charCodeAt(0) > 127) {" + DocletConstants.NL +
" allowNumber = true;" + DocletConstants.NL +
" allowSep = true;" + DocletConstants.NL +
" } else if ('0' <= ch && ch <= '9'" + DocletConstants.NL +
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -185,9 +185,9 @@
doclet.Groupname_already_used=-group\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u304A\u3044\u3066\u3001\u3059\u3067\u306B\u30B0\u30EB\u30FC\u30D7\u540D\u304C\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059: {0}
doclet.Same_package_name_used=\u30D1\u30C3\u30B1\u30FC\u30B8\u540D\u5F62\u5F0F\u304C2\u56DE\u4F7F\u7528\u3055\u308C\u3066\u3044\u307E\u3059: {0}
doclet.exception_encountered={1}\u306E\u51E6\u7406\u4E2D\u306B\u4F8B\u5916\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\n{0}
-doclet.usage=\u6A19\u6E96\u306Edoclet\u306B\u3088\u308A\u63D0\u4F9B\u3055\u308C\u308B\u3082\u306E:\n-d <directory> \u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u8EE2\u9001\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\n-use \u30AF\u30E9\u30B9\u3068\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u4F7F\u7528\u30DA\u30FC\u30B8\u3092\u4F5C\u6210\u3059\u308B\n-version @version\u30D1\u30E9\u30B0\u30E9\u30D5\u3092\u542B\u3081\u308B\n-author @author\u30D1\u30E9\u30B0\u30E9\u30D5\u3092\u542B\u3081\u308B\n-docfilessubdirs doc-file\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u518D\u5E30\u7684\u306B\u30B3\u30D4\u30FC\u3059\u308B\n-splitindex 1\u5B57\u3054\u3068\u306B1\u30D5\u30A1\u30A4\u30EB\u306B\u7D22\u5F15\u3092\u5206\u5272\u3059\u308B\n-windowtitle <text> \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u7528\u306E\u30D6\u30E9\u30A6\u30B6\u30FB\u30A6\u30A3\u30F3\u30C9\u30A6\u30FB\u30BF\u30A4\u30C8\u30EB\n-doctitle <html-code> \u6982\u8981\u30DA\u30FC\u30B8\u306B\u30BF\u30A4\u30C8\u30EB\u3092\u542B\u3081\u308B\n-header <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u30D8\u30C3\u30C0\u30FC\u3092\u542B\u3081\u308B\n-footer <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u30D5\u30C3\u30BF\u30FC\u3092\u542B\u3081\u308B\n-top <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u4E0A\u90E8\u30C6\u30AD\u30B9\u30C8\u3092\u542B\u3081\u308B\n-bottom <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u4E0B\u90E8\u30C6\u30AD\u30B9\u30C8\u3092\u542B\u3081\u308B\n-link <url> <url>\u306Bjavadoc\u51FA\u529B\u3078\u306E\u30EA\u30F3\u30AF\u3092\u4F5C\u6210\u3059\u308B\n-linkoffline <url> <url2> <url2>\u306B\u3042\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u4F7F\u7528\u3057\u3066<url>\u306Edocs\u306B\u30EA\u30F3\u30AF\u3059\u308B\n-excludedocfilessubdir <name1>:.. \u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u306Edoc-files\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u3059\u3079\u3066\u9664\u5916\u3059\u308B\n-group <name> <p1>:<p2>.. \u6307\u5B9A\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6982\u8981\u30DA\u30FC\u30B8\u306B\u304A\u3044\u3066\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\n-nocomment \u8A18\u8FF0\u304A\u3088\u3073\u30BF\u30B0\u3092\u6291\u5236\u3057\u3066\u5BA3\u8A00\u306E\u307F\u3092\u751F\u6210\u3059\u308B\n-nodeprecated @deprecated\u60C5\u5831\u3092\u9664\u5916\u3059\u308B\n-noqualifier <name1>:<name2>:... \u51FA\u529B\u304B\u3089\u4FEE\u98FE\u5B50\u306E\u30EA\u30B9\u30C8\u3092\u9664\u5916\u3059\u308B\n-nosince @since\u60C5\u5831\u3092\u9664\u5916\u3059\u308B\n-notimestamp \u975E\u8868\u793A\u306E\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u3092\u9664\u5916\u3059\u308B\n-nodeprecatedlist \u975E\u63A8\u5968\u306E\u30EA\u30B9\u30C8\u3092\u751F\u6210\u3057\u306A\u3044\n-notree \u30AF\u30E9\u30B9\u968E\u5C64\u3092\u751F\u6210\u3057\u306A\u3044\n-noindex \u7D22\u5F15\u3092\u751F\u6210\u3057\u306A\u3044\n-nohelp \u30D8\u30EB\u30D7\u30FB\u30EA\u30F3\u30AF\u3092\u751F\u6210\u3057\u306A\u3044\n-nonavbar \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30D0\u30FC\u3092\u751F\u6210\u3057\u306A\u3044\n-serialwarn @serial\u30BF\u30B0\u306B\u95A2\u3059\u308B\u8B66\u544A\u3092\u751F\u6210\u3059\u308B\n-tag <name>:<locations>:<header> \u5358\u4E00\u306E\u5F15\u6570\u3092\u6301\u3064\u30AB\u30B9\u30BF\u30E0\u30FB\u30BF\u30B0\u3092\u6307\u5B9A\u3059\u308B\n-taglet \u30BF\u30B0\u30EC\u30C3\u30C8\u306E\u5B8C\u5168\u4FEE\u98FE\u540D\u3092\u767B\u9332\u3059\u308B\n-tagletpath \u30BF\u30B0\u30EC\u30C3\u30C8\u306E\u30D1\u30B9\n-Xdocrootparent \
-<url> \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30B3\u30E1\u30F3\u30C8\u5185\u306E@docRoot(\u3053\u306E\u5F8C\u306B\u306F/..\u304C\u7D9A\u304F)\u306E\u3059\u3079\u3066\u306E\u51FA\u73FE\u7B87\u6240\u3092<url>\u3067\u7F6E\u63DB\u3059\u308B\n-charset <charset> \u751F\u6210\u3055\u308C\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30AF\u30ED\u30B9\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3067\u306E\u6587\u5B57\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\n-helpfile <file> \u30D8\u30EB\u30D7\u30FB\u30EA\u30F3\u30AF\u306E\u30EA\u30F3\u30AF\u5148\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3081\u308B\n-linksource HTML\u5F62\u5F0F\u3067\u30BD\u30FC\u30B9\u3092\u751F\u6210\u3059\u308B\n-sourcetab <tab length> \u30BD\u30FC\u30B9\u5185\u306E\u30BF\u30D6\u306E\u7A7A\u767D\u6587\u5B57\u306E\u6570\u3092\u6307\u5B9A\u3059\u308B\n-keywords HTML\u306Emeta\u30BF\u30B0\u306B\u3001\u30D1\u30C3\u30B1\u30FC\u30B8\u3001\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u60C5\u5831\u3092\u542B\u3081\u308B\n-stylesheetfile <path> \u751F\u6210\u3055\u308C\u305F\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30B9\u30BF\u30A4\u30EB\u5909\u66F4\u7528\u30D5\u30A1\u30A4\u30EB\n-docencoding <name> \u51FA\u529B\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u540D
+doclet.usage=\u6A19\u6E96\u306Edoclet\u306B\u3088\u308A\u63D0\u4F9B\u3055\u308C\u308B\u3082\u306E:\n-d <directory> \u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u306E\u8EE2\u9001\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\n-use \u30AF\u30E9\u30B9\u3068\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u4F7F\u7528\u30DA\u30FC\u30B8\u3092\u4F5C\u6210\u3059\u308B\n-version @version\u30D1\u30E9\u30B0\u30E9\u30D5\u3092\u542B\u3081\u308B\n-author @author\u30D1\u30E9\u30B0\u30E9\u30D5\u3092\u542B\u3081\u308B\n-docfilessubdirs doc-file\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u518D\u5E30\u7684\u306B\u30B3\u30D4\u30FC\u3059\u308B\n-splitindex 1\u5B57\u3054\u3068\u306B1\u30D5\u30A1\u30A4\u30EB\u306B\u7D22\u5F15\u3092\u5206\u5272\u3059\u308B\n-windowtitle <text> \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u7528\u306E\u30D6\u30E9\u30A6\u30B6\u30FB\u30A6\u30A3\u30F3\u30C9\u30A6\u30FB\u30BF\u30A4\u30C8\u30EB\n-doctitle <html-code> \u6982\u8981\u30DA\u30FC\u30B8\u306B\u30BF\u30A4\u30C8\u30EB\u3092\u542B\u3081\u308B\n-header <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u30D8\u30C3\u30C0\u30FC\u3092\u542B\u3081\u308B\n-footer <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u30D5\u30C3\u30BF\u30FC\u3092\u542B\u3081\u308B\n-top <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u4E0A\u90E8\u30C6\u30AD\u30B9\u30C8\u3092\u542B\u3081\u308B\n-bottom <html-code> \u5404\u30DA\u30FC\u30B8\u306B\u4E0B\u90E8\u30C6\u30AD\u30B9\u30C8\u3092\u542B\u3081\u308B\n-link <url> <url>\u306Bjavadoc\u51FA\u529B\u3078\u306E\u30EA\u30F3\u30AF\u3092\u4F5C\u6210\u3059\u308B\n-linkoffline <url> <url2> <url2>\u306B\u3042\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u4F7F\u7528\u3057\u3066<url>\u306Edocs\u306B\u30EA\u30F3\u30AF\u3059\u308B\n-excludedocfilessubdir <name1>:.. \u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u306Edoc-files\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u3059\u3079\u3066\u9664\u5916\u3059\u308B\n-group <name> <p1>:<p2>.. \u6307\u5B9A\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6982\u8981\u30DA\u30FC\u30B8\u306B\u304A\u3044\u3066\u30B0\u30EB\u30FC\u30D7\u5316\u3059\u308B\n-nocomment \u8A18\u8FF0\u304A\u3088\u3073\u30BF\u30B0\u3092\u6291\u5236\u3057\u3066\u5BA3\u8A00\u306E\u307F\u3092\u751F\u6210\u3059\u308B\n-nodeprecated @deprecated\u60C5\u5831\u3092\u9664\u5916\u3059\u308B\n-noqualifier <name1>:<name2>:... \u51FA\u529B\u304B\u3089\u4FEE\u98FE\u5B50\u306E\u30EA\u30B9\u30C8\u3092\u9664\u5916\u3059\u308B\n-nosince @since\u60C5\u5831\u3092\u9664\u5916\u3059\u308B\n-notimestamp \u975E\u8868\u793A\u306E\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7\u3092\u9664\u5916\u3059\u308B\n-nodeprecatedlist \u975E\u63A8\u5968\u306E\u30EA\u30B9\u30C8\u3092\u751F\u6210\u3057\u306A\u3044\n-notree \u30AF\u30E9\u30B9\u968E\u5C64\u3092\u751F\u6210\u3057\u306A\u3044\n-noindex \u7D22\u5F15\u3092\u751F\u6210\u3057\u306A\u3044\n-nohelp \u30D8\u30EB\u30D7\u30FB\u30EA\u30F3\u30AF\u3092\u751F\u6210\u3057\u306A\u3044\n-nonavbar \u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3\u30FB\u30D0\u30FC\u3092\u751F\u6210\u3057\u306A\u3044\n-serialwarn @serial\u30BF\u30B0\u306B\u95A2\u3059\u308B\u8B66\u544A\u3092\u751F\u6210\u3059\u308B\n-tag <name>:<locations>:<header> \u5358\u4E00\u306E\u5F15\u6570\u3092\u6301\u3064\u30AB\u30B9\u30BF\u30E0\u30FB\u30BF\u30B0\u3092\u6307\u5B9A\u3059\u308B\n-taglet \u30BF\u30B0\u30EC\u30C3\u30C8\u306E\u5B8C\u5168\u4FEE\u98FE\u540D\u3092\u767B\u9332\u3059\u308B\n-tagletpath \u30BF\u30B0\u30EC\u30C3\u30C8\u306E\u30D1\u30B9\n-charset \
+<charset> \u751F\u6210\u3055\u308C\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30AF\u30ED\u30B9\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u3067\u306E\u6587\u5B57\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\n-helpfile <file> \u30D8\u30EB\u30D7\u30FB\u30EA\u30F3\u30AF\u306E\u30EA\u30F3\u30AF\u5148\u30D5\u30A1\u30A4\u30EB\u3092\u542B\u3081\u308B\n-linksource HTML\u5F62\u5F0F\u3067\u30BD\u30FC\u30B9\u3092\u751F\u6210\u3059\u308B\n-sourcetab <tab length> \u30BD\u30FC\u30B9\u5185\u306E\u30BF\u30D6\u306E\u7A7A\u767D\u6587\u5B57\u306E\u6570\u3092\u6307\u5B9A\u3059\u308B\n-keywords HTML\u306Emeta\u30BF\u30B0\u306B\u3001\u30D1\u30C3\u30B1\u30FC\u30B8\u3001\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u60C5\u5831\u3092\u542B\u3081\u308B\n-stylesheetfile <path> \u751F\u6210\u3055\u308C\u305F\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u30B9\u30BF\u30A4\u30EB\u5909\u66F4\u7528\u30D5\u30A1\u30A4\u30EB\n-docencoding <name> \u51FA\u529B\u306E\u6587\u5B57\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u3092\u6307\u5B9A\u3059\u308B
-
-
+# L10N: do not localize these words: all none accessibility html missing reference syntax
+doclet.X.usage=\u6A19\u6E96\u306Edoclet\u306B\u3088\u308A\u63D0\u4F9B\u3055\u308C\u308B\u3082\u306E:\n -Xdocrootparent <url> doc\u30B3\u30E1\u30F3\u30C8\u5185\u306E/..\u304C\u5F8C\u306B\u7D9A\u304F@docRoot\u306E\u3059\u3079\u3066\u3092\n <url>\u3067\u7F6E\u63DB\u3057\u307E\u3059\n -Xdoclint javadoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u554F\u984C\u306B\u5BFE\u3059\u308B\u63A8\u5968\u3055\u308C\u308B\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\n -Xdoclint:(all|none|[-]<group>) \n javadoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u554F\u984C\u306B\u5BFE\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n \u3053\u3053\u3067\u3001<group>\u306Fhtml\u3001missing\u3001reference\u307E\u305F\u306Fsyntax\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002\n
--- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -185,8 +185,8 @@
doclet.Groupname_already_used=\u5728 -group \u9009\u9879\u4E2D, groupname \u5DF2\u4F7F\u7528: {0}
doclet.Same_package_name_used=\u7A0B\u5E8F\u5305\u540D\u79F0\u5F62\u5F0F\u4F7F\u7528\u4E86\u4E24\u6B21: {0}
doclet.exception_encountered=\u5904\u7406{1}\u65F6\u51FA\u73B0\u5F02\u5E38\u9519\u8BEF\n{0}
-doclet.usage=\u901A\u8FC7\u6807\u51C6 doclet \u63D0\u4F9B:\n-d <directory> \u8F93\u51FA\u6587\u4EF6\u7684\u76EE\u6807\u76EE\u5F55\n-use \u521B\u5EFA\u7C7B\u548C\u7A0B\u5E8F\u5305\u7528\u6CD5\u9875\u9762\n-version \u5305\u542B @version \u6BB5\n-author \u5305\u542B @author \u6BB5\n-docfilessubdirs \u9012\u5F52\u590D\u5236\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55\n-splitindex \u5C06\u7D22\u5F15\u5206\u4E3A\u6BCF\u4E2A\u5B57\u6BCD\u5BF9\u5E94\u4E00\u4E2A\u6587\u4EF6\n-windowtitle <text> \u6587\u6863\u7684\u6D4F\u89C8\u5668\u7A97\u53E3\u6807\u9898\n-doctitle <html-code> \u5305\u542B\u6982\u89C8\u9875\u9762\u7684\u6807\u9898\n-header <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9875\u7709\u6587\u672C\n-footer <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9875\u811A\u6587\u672C\n-top <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9876\u90E8\u6587\u672C\n-bottom <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u5E95\u90E8\u6587\u672C\n-link <url> \u521B\u5EFA\u6307\u5411\u4F4D\u4E8E <url> \u7684 javadoc \u8F93\u51FA\u7684\u94FE\u63A5\n-linkoffline <url> <url2> \u5229\u7528\u4F4D\u4E8E <url2> \u7684\u7A0B\u5E8F\u5305\u5217\u8868\u94FE\u63A5\u81F3\u4F4D\u4E8E <url> \u7684\u6587\u6863\n-excludedocfilessubdir <name1>:.. \u6392\u9664\u5177\u6709\u7ED9\u5B9A\u540D\u79F0\u7684\u6240\u6709\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55\u3002\n-group <name> <p1>:<p2>.. \u5728\u6982\u89C8\u9875\u9762\u4E2D, \u5C06\u6307\u5B9A\u7684\u7A0B\u5E8F\u5305\u5206\u7EC4\n-nocomment \u4E0D\u751F\u6210\u8BF4\u660E\u548C\u6807\u8BB0, \u53EA\u751F\u6210\u58F0\u660E\u3002\n-nodeprecated \u4E0D\u5305\u542B @deprecated \u4FE1\u606F\n-noqualifier <name1>:<name2>:... \u8F93\u51FA\u4E2D\u4E0D\u5305\u62EC\u9650\u5B9A\u7B26\u7684\u5217\u8868\u3002\n-nosince \u4E0D\u5305\u542B @since \u4FE1\u606F\n-notimestamp \u4E0D\u5305\u542B\u9690\u85CF\u65F6\u95F4\u6233\n-nodeprecatedlist \u4E0D\u751F\u6210\u5DF2\u8FC7\u65F6\u7684\u5217\u8868\n-notree \u4E0D\u751F\u6210\u7C7B\u5206\u5C42\u7ED3\u6784\n-noindex \u4E0D\u751F\u6210\u7D22\u5F15\n-nohelp \u4E0D\u751F\u6210\u5E2E\u52A9\u94FE\u63A5\n-nonavbar \u4E0D\u751F\u6210\u5BFC\u822A\u680F\n-serialwarn \u751F\u6210\u6709\u5173 @serial \u6807\u8BB0\u7684\u8B66\u544A\n-tag <name>:<locations>:<header> \u6307\u5B9A\u5355\u4E2A\u53C2\u6570\u5B9A\u5236\u6807\u8BB0\n-taglet \u8981\u6CE8\u518C\u7684 Taglet \u7684\u5168\u9650\u5B9A\u540D\u79F0\n-tagletpath Taglet \u7684\u8DEF\u5F84\n-Xdocrootparent <url> \u5C06\u6587\u6863\u6CE8\u91CA\u4E2D\u51FA\u73B0\u7684\u6240\u6709\u540E\u8DDF /.. \u7684 @docRoot \u66FF\u6362\u4E3A <url>\n-charset <charset> \u7528\u4E8E\u8DE8\u5E73\u53F0\u67E5\u770B\u751F\u6210\u7684\u6587\u6863\u7684\u5B57\u7B26\u96C6\u3002\n-helpfile <file> \u5305\u542B\u5E2E\u52A9\u94FE\u63A5\u6240\u94FE\u63A5\u5230\u7684\u6587\u4EF6\n-linksource \u4EE5 HTML \u683C\u5F0F\u751F\u6210\u6E90\u6587\u4EF6\n-sourcetab <tab length> \u6307\u5B9A\u6E90\u4E2D\u6BCF\u4E2A\u5236\u8868\u7B26\u5360\u636E\u7684\u7A7A\u683C\u6570\n-keywords \u4F7F\u7A0B\u5E8F\u5305, \u7C7B\u548C\u6210\u5458\u4FE1\u606F\u9644\u5E26 HTML \u5143\u6807\u8BB0\n-stylesheetfile <path> \u7528\u4E8E\u66F4\u6539\u751F\u6210\u6587\u6863\u7684\u6837\u5F0F\u7684\u6587\u4EF6\n-docencoding <name> \u8F93\u51FA\u7F16\u7801\u540D\u79F0
+doclet.usage=\u901A\u8FC7\u6807\u51C6 doclet \u63D0\u4F9B:\n -d <directory> \u8F93\u51FA\u6587\u4EF6\u7684\u76EE\u6807\u76EE\u5F55\n -use \u521B\u5EFA\u7C7B\u548C\u7A0B\u5E8F\u5305\u7528\u6CD5\u9875\u9762\n -version \u5305\u542B @version \u6BB5\n -author \u5305\u542B @author \u6BB5\n -docfilessubdirs \u9012\u5F52\u590D\u5236\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55\n -splitindex \u5C06\u7D22\u5F15\u5206\u4E3A\u6BCF\u4E2A\u5B57\u6BCD\u5BF9\u5E94\u4E00\u4E2A\u6587\u4EF6\n -windowtitle <text> \u6587\u6863\u7684\u6D4F\u89C8\u5668\u7A97\u53E3\u6807\u9898\n -doctitle <html-code> \u5305\u542B\u6982\u89C8\u9875\u9762\u7684\u6807\u9898\n -header <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9875\u7709\u6587\u672C\n -footer <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9875\u811A\u6587\u672C\n -top <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u9876\u90E8\u6587\u672C\n -bottom <html-code> \u5305\u542B\u6BCF\u4E2A\u9875\u9762\u7684\u5E95\u90E8\u6587\u672C\n -link <url> \u521B\u5EFA\u6307\u5411\u4F4D\u4E8E <url> \u7684 javadoc \u8F93\u51FA\u7684\u94FE\u63A5\n -linkoffline <url> <url2> \u5229\u7528\u4F4D\u4E8E <url2> \u7684\u7A0B\u5E8F\u5305\u5217\u8868\u94FE\u63A5\u81F3\u4F4D\u4E8E <url> \u7684\u6587\u6863\n -excludedocfilessubdir <name1>:.. \u6392\u9664\u5177\u6709\u7ED9\u5B9A\u540D\u79F0\u7684\u6240\u6709\u6587\u6863\u6587\u4EF6\u5B50\u76EE\u5F55\u3002\n -group <name> <p1>:<p2>.. \u5728\u6982\u89C8\u9875\u9762\u4E2D, \u5C06\u6307\u5B9A\u7684\u7A0B\u5E8F\u5305\u5206\u7EC4\n -nocomment \u4E0D\u751F\u6210\u8BF4\u660E\u548C\u6807\u8BB0, \u53EA\u751F\u6210\u58F0\u660E\u3002\n -nodeprecated \u4E0D\u5305\u542B @deprecated \u4FE1\u606F\n -noqualifier <name1>:<name2>:... \u8F93\u51FA\u4E2D\u4E0D\u5305\u62EC\u6307\u5B9A\u9650\u5B9A\u7B26\u7684\u5217\u8868\u3002\n -nosince \u4E0D\u5305\u542B @since \u4FE1\u606F\n -notimestamp \u4E0D\u5305\u542B\u9690\u85CF\u65F6\u95F4\u6233\n -nodeprecatedlist \u4E0D\u751F\u6210\u5DF2\u8FC7\u65F6\u7684\u5217\u8868\n -notree \u4E0D\u751F\u6210\u7C7B\u5206\u5C42\u7ED3\u6784\n -noindex \u4E0D\u751F\u6210\u7D22\u5F15\n -nohelp \u4E0D\u751F\u6210\u5E2E\u52A9\u94FE\u63A5\n -nonavbar \u4E0D\u751F\u6210\u5BFC\u822A\u680F\n -serialwarn \u751F\u6210\u6709\u5173 @serial \u6807\u8BB0\u7684\u8B66\u544A\n -tag <name>:<locations>:<header> \u6307\u5B9A\u5355\u4E2A\u53C2\u6570\u5B9A\u5236\u6807\u8BB0\n -taglet \u8981\u6CE8\u518C\u7684 Taglet \u7684\u5168\u9650\u5B9A\u540D\u79F0\n -tagletpath Taglet \u7684\u8DEF\u5F84\n -charset <charset> \u7528\u4E8E\u8DE8\u5E73\u53F0\u67E5\u770B\u751F\u6210\u7684\u6587\u6863\u7684\u5B57\u7B26\u96C6\u3002\n -helpfile <file> \u5305\u542B\u5E2E\u52A9\u94FE\u63A5\u6240\u94FE\u63A5\u5230\u7684\u6587\u4EF6\n -linksource \u4EE5 HTML \u683C\u5F0F\u751F\u6210\u6E90\u6587\u4EF6\n -sourcetab <tab length> \u6307\u5B9A\u6E90\u4E2D\u6BCF\u4E2A\u5236\u8868\u7B26\u5360\u636E\u7684\u7A7A\u683C\u6570\n -keywords \u4F7F\u7A0B\u5E8F\u5305, \u7C7B\u548C\u6210\u5458\u4FE1\u606F\u9644\u5E26 HTML \u5143\u6807\u8BB0\n -stylesheetfile <path> \u7528\u4E8E\u66F4\u6539\u751F\u6210\u6587\u6863\u7684\u6837\u5F0F\u7684\u6587\u4EF6\n -docencoding <name> \u6307\u5B9A\u8F93\u51FA\u7684\u5B57\u7B26\u7F16\u7801
-
-
+# L10N: do not localize these words: all none accessibility html missing reference syntax
+doclet.X.usage=\u901A\u8FC7\u6807\u51C6 doclet \u63D0\u4F9B:\n -Xdocrootparent <url> \u4F7F\u7528 <url> \u66FF\u6362\u6587\u6863\u6CE8\u91CA\u4E2D\u51FA\u73B0\u7684\n \u6240\u6709\u5176\u540E\u8DDF\u968F /.. \u7684 @docRoot\n -Xdoclint \u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u5EFA\u8BAE\u7684\u68C0\u67E5\n -Xdoclint:(all|none|[-]<group>) \n \u5BF9 javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5\u3002\n \u5176\u4E2D <group> \u662F accessibility, html, missing, reference \u6216 syntax \u4E4B\u4E00\u3002\n
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeFieldWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit;
+
+import java.io.*;
+import com.sun.javadoc.*;
+
+/**
+ * The interface for writing annotation type field output.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ *
+ * @author Bhavesh Patel
+ * @since 1.8
+ */
+
+public interface AnnotationTypeFieldWriter {
+
+ /**
+ * Add the annotation type member tree header.
+ *
+ * @return content tree for the member tree header
+ */
+ public Content getMemberTreeHeader();
+
+ /**
+ * Add the annotation type field details marker.
+ *
+ * @param memberDetails the content tree representing field details marker
+ */
+ public void addAnnotationFieldDetailsMarker(Content memberDetails);
+
+ /**
+ * Add the annotation type details tree header.
+ *
+ * @param classDoc the annotation type being documented
+ * @param memberDetailsTree the content tree representing member details
+ */
+ public void addAnnotationDetailsTreeHeader(ClassDoc classDoc,
+ Content memberDetailsTree);
+
+ /**
+ * Get the annotation type documentation tree header.
+ *
+ * @param member the annotation type being documented
+ * @param annotationDetailsTree the content tree representing annotation type details
+ * @return content tree for the annotation type documentation header
+ */
+ public Content getAnnotationDocTreeHeader(MemberDoc member,
+ Content annotationDetailsTree);
+
+ /**
+ * Get the annotation type details tree.
+ *
+ * @param annotationDetailsTree the content tree representing annotation type details
+ * @return content tree for the annotation type details
+ */
+ public Content getAnnotationDetails(Content annotationDetailsTree);
+
+ /**
+ * Get the annotation type documentation.
+ *
+ * @param annotationDocTree the content tree representing annotation type documentation
+ * @param isLastContent true if the content to be added is the last content
+ * @return content tree for the annotation type documentation
+ */
+ public Content getAnnotationDoc(Content annotationDocTree, boolean isLastContent);
+
+ /**
+ * Get the signature for the given member.
+ *
+ * @param member the member being documented
+ * @return content tree for the annotation type signature
+ */
+ public Content getSignature(MemberDoc member);
+
+ /**
+ * Add the deprecated output for the given member.
+ *
+ * @param member the member being documented
+ * @param annotationDocTree content tree to which the deprecated information will be added
+ */
+ public void addDeprecated(MemberDoc member, Content annotationDocTree);
+
+ /**
+ * Add the comments for the given member.
+ *
+ * @param member the member being documented
+ * @param annotationDocTree the content tree to which the comments will be added
+ */
+ public void addComments(MemberDoc member, Content annotationDocTree);
+
+ /**
+ * Add the tags for the given member.
+ *
+ * @param member the member being documented
+ * @param annotationDocTree the content tree to which the tags will be added
+ */
+ public void addTags(MemberDoc member, Content annotationDocTree);
+
+ /**
+ * Close the writer.
+ */
+ public void close() throws IOException;
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,6 +45,20 @@
public interface AnnotationTypeRequiredMemberWriter {
/**
+ * Add the annotation type member tree header.
+ *
+ * @return content tree for the member tree header
+ */
+ public Content getMemberTreeHeader();
+
+ /**
+ * Add the annotation type details marker.
+ *
+ * @param memberDetails the content tree representing details marker
+ */
+ public void addAnnotationDetailsMarker(Content memberDetails);
+
+ /**
* Add the annotation type details tree header.
*
* @param classDoc the annotation type being documented
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -104,13 +104,6 @@
public void addAnnotationTypeDeprecationInfo (Content annotationInfoTree);
/**
- * Add the annotation type details marker.
- *
- * @param memberDetails the content tree representing member details marker
- */
- public void addAnnotationDetailsMarker(Content memberDetails);
-
- /**
* Get the member tree header for the annotation type.
*
* @return a content tree for the member tree header
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java Thu Oct 03 19:18:54 2013 +0100
@@ -130,6 +130,18 @@
throws Exception;
/**
+ * Return the annotation type field writer for a given annotation type.
+ *
+ * @param annotationTypeWriter the writer for the annotation type
+ * being documented.
+ * @return the member writer for the given annotation type. Return null if
+ * this writer is not supported by the doclet.
+ */
+ public abstract AnnotationTypeFieldWriter
+ getAnnotationTypeFieldWriter(
+ AnnotationTypeWriter annotationTypeWriter) throws Exception;
+
+ /**
* Return the annotation type optional member writer for a given annotation
* type.
*
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java Thu Oct 03 19:18:54 2013 +0100
@@ -223,14 +223,23 @@
Content memberDetailsTree = writer.getMemberTreeHeader();
buildChildren(node, memberDetailsTree);
if (memberDetailsTree.isValid()) {
- Content memberDetails = writer.getMemberTreeHeader();
- writer.addAnnotationDetailsMarker(memberDetails);
- memberDetails.addContent(writer.getMemberTree(memberDetailsTree));
- annotationContentTree.addContent(writer.getMemberDetailsTree(memberDetails));
+ annotationContentTree.addContent(writer.getMemberDetailsTree(memberDetailsTree));
}
}
/**
+ * Build the annotation type field documentation.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param memberDetailsTree the content tree to which the documentation will be added
+ */
+ public void buildAnnotationTypeFieldDetails(XMLNode node, Content memberDetailsTree)
+ throws Exception {
+ configuration.getBuilderFactory().
+ getAnnotationTypeFieldsBuilder(writer).buildChildren(node, memberDetailsTree);
+ }
+
+ /**
* Build the annotation type optional member documentation.
*
* @param node the XML element that specifies which components to document
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeFieldBuilder.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.doclets.internal.toolkit.builders;
+
+import java.util.*;
+
+import com.sun.javadoc.*;
+import com.sun.tools.doclets.internal.toolkit.*;
+import com.sun.tools.doclets.internal.toolkit.util.*;
+
+/**
+ * Builds documentation for annotation type fields.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ *
+ * @author Bhavesh Patel
+ * @since 1.8
+ */
+public class AnnotationTypeFieldBuilder extends AbstractMemberBuilder {
+
+ /**
+ * The annotation type whose members are being documented.
+ */
+ protected ClassDoc classDoc;
+
+ /**
+ * The visible members for the given class.
+ */
+ protected VisibleMemberMap visibleMemberMap;
+
+ /**
+ * The writer to output the member documentation.
+ */
+ protected AnnotationTypeFieldWriter writer;
+
+ /**
+ * The list of members being documented.
+ */
+ protected List<ProgramElementDoc> members;
+
+ /**
+ * The index of the current member that is being documented at this point
+ * in time.
+ */
+ protected int currentMemberIndex;
+
+ /**
+ * Construct a new AnnotationTypeFieldsBuilder.
+ *
+ * @param context the build context.
+ * @param classDoc the class whose members are being documented.
+ * @param writer the doclet specific writer.
+ * @param memberType the type of member that is being documented.
+ */
+ protected AnnotationTypeFieldBuilder(Context context,
+ ClassDoc classDoc,
+ AnnotationTypeFieldWriter writer,
+ int memberType) {
+ super(context);
+ this.classDoc = classDoc;
+ this.writer = writer;
+ this.visibleMemberMap = new VisibleMemberMap(classDoc, memberType,
+ configuration);
+ this.members = new ArrayList<ProgramElementDoc>(
+ this.visibleMemberMap.getMembersFor(classDoc));
+ if (configuration.getMemberComparator() != null) {
+ Collections.sort(this.members, configuration.getMemberComparator());
+ }
+ }
+
+
+ /**
+ * Construct a new AnnotationTypeFieldBuilder.
+ *
+ * @param context the build context.
+ * @param classDoc the class whose members are being documented.
+ * @param writer the doclet specific writer.
+ */
+ public static AnnotationTypeFieldBuilder getInstance(
+ Context context, ClassDoc classDoc,
+ AnnotationTypeFieldWriter writer) {
+ return new AnnotationTypeFieldBuilder(context, classDoc,
+ writer, VisibleMemberMap.ANNOTATION_TYPE_FIELDS);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName() {
+ return "AnnotationTypeFieldDetails";
+ }
+
+ /**
+ * Returns a list of members that will be documented for the given class.
+ * This information can be used for doclet specific documentation
+ * generation.
+ *
+ * @param classDoc the {@link ClassDoc} we want to check.
+ * @return a list of members that will be documented.
+ */
+ public List<ProgramElementDoc> members(ClassDoc classDoc) {
+ return visibleMemberMap.getMembersFor(classDoc);
+ }
+
+ /**
+ * Returns the visible member map for the members of this class.
+ *
+ * @return the visible member map for the members of this class.
+ */
+ public VisibleMemberMap getVisibleMemberMap() {
+ return visibleMemberMap;
+ }
+
+ /**
+ * summaryOrder.size()
+ */
+ public boolean hasMembersToDocument() {
+ return members.size() > 0;
+ }
+
+ /**
+ * Build the annotation type field documentation.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param memberDetailsTree the content tree to which the documentation will be added
+ */
+ public void buildAnnotationTypeField(XMLNode node, Content memberDetailsTree) {
+ buildAnnotationTypeMember(node, memberDetailsTree);
+ }
+
+ /**
+ * Build the member documentation.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param memberDetailsTree the content tree to which the documentation will be added
+ */
+ public void buildAnnotationTypeMember(XMLNode node, Content memberDetailsTree) {
+ if (writer == null) {
+ return;
+ }
+ int size = members.size();
+ if (size > 0) {
+ writer.addAnnotationFieldDetailsMarker(memberDetailsTree);
+ for (currentMemberIndex = 0; currentMemberIndex < size;
+ currentMemberIndex++) {
+ Content detailsTree = writer.getMemberTreeHeader();
+ writer.addAnnotationDetailsTreeHeader(classDoc, detailsTree);
+ Content annotationDocTree = writer.getAnnotationDocTreeHeader(
+ (MemberDoc) members.get(currentMemberIndex),
+ detailsTree);
+ buildChildren(node, annotationDocTree);
+ detailsTree.addContent(writer.getAnnotationDoc(
+ annotationDocTree, (currentMemberIndex == size - 1)));
+ memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree));
+ }
+ }
+ }
+
+ /**
+ * Build the signature.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param annotationDocTree the content tree to which the documentation will be added
+ */
+ public void buildSignature(XMLNode node, Content annotationDocTree) {
+ annotationDocTree.addContent(
+ writer.getSignature((MemberDoc) members.get(currentMemberIndex)));
+ }
+
+ /**
+ * Build the deprecation information.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param annotationDocTree the content tree to which the documentation will be added
+ */
+ public void buildDeprecationInfo(XMLNode node, Content annotationDocTree) {
+ writer.addDeprecated((MemberDoc) members.get(currentMemberIndex),
+ annotationDocTree);
+ }
+
+ /**
+ * Build the comments for the member. Do nothing if
+ * {@link Configuration#nocomment} is set to true.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param annotationDocTree the content tree to which the documentation will be added
+ */
+ public void buildMemberComments(XMLNode node, Content annotationDocTree) {
+ if(! configuration.nocomment){
+ writer.addComments((MemberDoc) members.get(currentMemberIndex),
+ annotationDocTree);
+ }
+ }
+
+ /**
+ * Build the tag information.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param annotationDocTree the content tree to which the documentation will be added
+ */
+ public void buildTagInfo(XMLNode node, Content annotationDocTree) {
+ writer.addTags((MemberDoc) members.get(currentMemberIndex),
+ annotationDocTree);
+ }
+
+ /**
+ * Return the annotation type field writer for this builder.
+ *
+ * @return the annotation type field writer for this builder.
+ */
+ public AnnotationTypeFieldWriter getWriter() {
+ return writer;
+ }
+}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Thu Oct 03 19:18:54 2013 +0100
@@ -167,16 +167,17 @@
}
int size = members.size();
if (size > 0) {
- writer.addAnnotationDetailsTreeHeader(
- classDoc, memberDetailsTree);
+ writer.addAnnotationDetailsMarker(memberDetailsTree);
for (currentMemberIndex = 0; currentMemberIndex < size;
- currentMemberIndex++) {
+ currentMemberIndex++) {
+ Content detailsTree = writer.getMemberTreeHeader();
+ writer.addAnnotationDetailsTreeHeader(classDoc, detailsTree);
Content annotationDocTree = writer.getAnnotationDocTreeHeader(
- (MemberDoc) members.get(currentMemberIndex),
- memberDetailsTree);
+ (MemberDoc) members.get(currentMemberIndex), detailsTree);
buildChildren(node, annotationDocTree);
- memberDetailsTree.addContent(writer.getAnnotationDoc(
+ detailsTree.addContent(writer.getAnnotationDoc(
annotationDocTree, (currentMemberIndex == size - 1)));
+ memberDetailsTree.addContent(writer.getAnnotationDetails(detailsTree));
}
}
}
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java Thu Oct 03 19:18:54 2013 +0100
@@ -174,10 +174,26 @@
}
/**
+ * Return an instance of the annotation type fields builder for the given
+ * class.
+ *
+ * @return an instance of the annotation type field builder for the given
+ * annotation type.
+ */
+ public AbstractBuilder getAnnotationTypeFieldsBuilder(
+ AnnotationTypeWriter annotationTypeWriter)
+ throws Exception {
+ return AnnotationTypeFieldBuilder.getInstance(context,
+ annotationTypeWriter.getAnnotationTypeDoc(),
+ writerFactory.getAnnotationTypeFieldWriter(
+ annotationTypeWriter));
+ }
+
+ /**
* Return an instance of the annotation type member builder for the given
* class.
*
- * @return an instance of the annotation type memebr builder for the given
+ * @return an instance of the annotation type member builder for the given
* annotation type.
*/
public AbstractBuilder getAnnotationTypeOptionalMemberBuilder(
@@ -193,7 +209,7 @@
* Return an instance of the annotation type member builder for the given
* class.
*
- * @return an instance of the annotation type memebr builder for the given
+ * @return an instance of the annotation type member builder for the given
* annotation type.
*/
public AbstractBuilder getAnnotationTypeRequiredMemberBuilder(
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Thu Oct 03 19:18:54 2013 +0100
@@ -213,6 +213,20 @@
}
/**
+ * Build the summary for fields.
+ *
+ * @param node the XML element that specifies which components to document
+ * @param memberSummaryTree the content tree to which the documentation will be added
+ */
+ public void buildAnnotationTypeFieldsSummary(XMLNode node, Content memberSummaryTree) {
+ MemberSummaryWriter writer =
+ memberSummaryWriters[VisibleMemberMap.ANNOTATION_TYPE_FIELDS];
+ VisibleMemberMap visibleMemberMap =
+ visibleMemberMaps[VisibleMemberMap.ANNOTATION_TYPE_FIELDS];
+ addSummary(writer, visibleMemberMap, false, memberSummaryTree);
+ }
+
+ /**
* Build the summary for the optional members.
*
* @param node the XML element that specifies which components to document
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml Thu Oct 03 19:18:54 2013 +0100
@@ -66,10 +66,19 @@
<AnnotationTypeTagInfo/>
</AnnotationTypeInfo>
<MemberSummary>
+ <AnnotationTypeFieldsSummary/>
<AnnotationTypeRequiredMemberSummary/>
<AnnotationTypeOptionalMemberSummary/>
</MemberSummary>
<AnnotationTypeMemberDetails>
+ <AnnotationTypeFieldDetails>
+ <AnnotationTypeField>
+ <Signature/>
+ <DeprecationInfo/>
+ <MemberComments/>
+ <TagInfo/>
+ </AnnotationTypeField>
+ </AnnotationTypeFieldDetails>
<AnnotationTypeRequiredMemberDetails>
<AnnotationTypeRequiredMember>
<Signature/>
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Thu Oct 03 19:18:54 2013 +0100
@@ -136,6 +136,7 @@
doclet.Groupname_already_used=In -group option, groupname already used: {0}
doclet.value_tag_invalid_reference={0} (referenced by @value tag) is an unknown reference.
doclet.value_tag_invalid_constant=@value tag (which references {0}) can only be used in constants.
+doclet.value_tag_invalid_use=@value tag cannot be used here.
doclet.dest_dir_create=Creating destination directory: "{0}"
doclet.in={0} in {1}
doclet.Use_Table_Summary=Use table, listing {0}, and an explanation
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -174,6 +174,16 @@
doclet.0_and_1={0}\u3068{1}
#Documentation for Enums
-doclet.enum_values_doc=\n\u3053\u306E\u5217\u6319\u578B\u306E\u5B9A\u6570\u3092\u542B\u3080\u914D\u5217\u3092\u5BA3\u8A00\u3055\u308C\u3066\u3044\u308B\u9806\u5E8F\u3067\u8FD4\u3057\u307E\u3059\u3002\n\u3053\u306E\u30E1\u30BD\u30C3\u30C9\u306F\u6B21\u306E\u3088\u3046\u306B\u3057\u3066\u5B9A\u6570\u3092\u53CD\u5FA9\u3059\u308B\u305F\u3081\u306B\n\u4F7F\u7528\u3067\u304D\u307E\u3059:\n<pre>\nfor({0} c: {0}.values())\n System.out.println(c);\n</pre>\n@return\u3053\u306E\u5217\u6319\u578B\u306E\u5B9A\u6570\u3092\u5BA3\u8A00\u3055\u308C\u3066\u3044\u308B\u9806\u5E8F\u3067\n\u542B\u3080\u914D\u5217
+doclet.enum_values_doc.main=\n\u3053\u306E\u5217\u6319\u578B\u306E\u5B9A\u6570\u3092\u542B\u3080\u914D\u5217\u3092\u5BA3\u8A00\u3055\u308C\u3066\u3044\u308B\u9806\u5E8F\u3067\u8FD4\u3057\u307E\u3059\u3002\n\u3053\u306E\u30E1\u30BD\u30C3\u30C9\u306F\u6B21\u306E\u3088\u3046\u306B\u3057\u3066\u5B9A\u6570\u3092\u53CD\u5FA9\u3059\u308B\u305F\u3081\u306B\n\u4F7F\u7528\u3067\u304D\u307E\u3059:\n<pre>\nfor({0} c: {0}.values())\n System.out.println(c);\n</pre>\n
+
+doclet.enum_values_doc.return=\n\u3053\u306E\u5217\u6319\u578B\u306E\u5B9A\u6570\u3092\u542B\u3080\u3001\u5BA3\u8A00\u3055\u308C\u3066\u3044\u308B\u9806\u5E8F\u3067\u306E\u914D\u5217
+
+doclet.enum_valueof_doc.main=\n\u6307\u5B9A\u3057\u305F\u540D\u524D\u3092\u6301\u3064\u3053\u306E\u578B\u306E\u5217\u6319\u578B\u5B9A\u6570\u3092\u8FD4\u3057\u307E\u3059\u3002\n\u6587\u5B57\u5217\u306F\u3001\u3053\u306E\u578B\u306E\u5217\u6319\u578B\u5B9A\u6570\u3092\u5BA3\u8A00\u3059\u308B\u306E\u306B\u4F7F\u7528\u3057\u305F\u8B58\u5225\u5B50\u3068<i>\u6B63\u78BA\u306B</i>\n\u4E00\u81F4\u3057\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\n(\u4F59\u5206\u306A\u7A7A\u767D\u6587\u5B57\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002)\n
-doclet.enum_valueof_doc=\n\u6307\u5B9A\u3057\u305F\u540D\u524D\u3092\u6301\u3064\u3053\u306E\u578B\u306E\u5217\u6319\u578B\u5B9A\u6570\u3092\u8FD4\u3057\u307E\u3059\u3002\n\u6587\u5B57\u5217\u306F\u3001\u3053\u306E\u578B\u306E\u5217\u6319\u578B\u5B9A\u6570\u3092\u5BA3\u8A00\u3059\u308B\u306E\u306B\u4F7F\u7528\u3057\u305F\u8B58\u5225\u5B50\u3068<i>\u6B63\u78BA\u306B</i>\n\u4E00\u81F4\u3057\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\n(\u4F59\u5206\u306A\u7A7A\u767D\u6587\u5B57\u3092\u542B\u3081\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002)\n\n@param name\u8FD4\u3055\u308C\u308B\u5217\u6319\u578B\u5B9A\u6570\u306E\u540D\u524D\n@return\u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u3092\u6301\u3064\u5217\u6319\u578B\u5B9A\u6570\n@throws IllegalArgumentException\u6307\u5B9A\u3055\u308C\u305F\u540D\u524D\u3092\u6301\u3064\u5B9A\u6570\u3092\n\u3053\u306E\u5217\u6319\u578B\u304C\u6301\u3063\u3066\u3044\u306A\u3044\u5834\u5408\n@throws NullPointerException\u5F15\u6570\u304Cnull\u306E\u5834\u5408
+doclet.enum_valueof_doc.param_name=\u8FD4\u3055\u308C\u308B\u5217\u6319\u578B\u5B9A\u6570\u306E\u540D\u524D\u3002
+
+doclet.enum_valueof_doc.return=\u6307\u5B9A\u3057\u305F\u540D\u524D\u306E\u5217\u6319\u578B\u5B9A\u6570
+
+doclet.enum_valueof_doc.throws_ila=\u3053\u306E\u5217\u6319\u578B\u306B\u3001\u6307\u5B9A\u3057\u305F\u540D\u524D\u306E\u5B9A\u6570\u304C\u306A\u3044\u5834\u5408
+
+doclet.enum_valueof_doc.throws_npe=\u5F15\u6570\u304Cnull\u306E\u5834\u5408
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -174,6 +174,16 @@
doclet.0_and_1={0}\u548C{1}
#Documentation for Enums
-doclet.enum_values_doc=\n\u6309\u7167\u58F0\u660E\u8BE5\u679A\u4E3E\u7C7B\u578B\u7684\u5E38\u91CF\u7684\u987A\u5E8F, \u8FD4\u56DE\n\u5305\u542B\u8FD9\u4E9B\u5E38\u91CF\u7684\u6570\u7EC4\u3002\u8BE5\u65B9\u6CD5\u53EF\u7528\u4E8E\u8FED\u4EE3\n\u5E38\u91CF, \u5982\u4E0B\u6240\u793A:\n<pre>\nfor ({0} c : {0}.values())\n System.out.println(c);\n</pre>\n@return \u6309\u7167\u58F0\u660E\u8BE5\u679A\u4E3E\u7C7B\u578B\u7684\u5E38\u91CF\u7684\u987A\u5E8F, \u8FD4\u56DE\n\u5305\u542B\u8FD9\u4E9B\u5E38\u91CF\u7684\u6570\u7EC4
+doclet.enum_values_doc.main=\n\u6309\u7167\u58F0\u660E\u8BE5\u679A\u4E3E\u7C7B\u578B\u7684\u5E38\u91CF\u7684\u987A\u5E8F, \u8FD4\u56DE\n\u5305\u542B\u8FD9\u4E9B\u5E38\u91CF\u7684\u6570\u7EC4\u3002\u8BE5\u65B9\u6CD5\u53EF\u7528\u4E8E\u8FED\u4EE3\n\u5E38\u91CF, \u5982\u4E0B\u6240\u793A:\n<pre>\nfor ({0} c : {0}.values())\n System.out.println(c);\n</pre>
+
+doclet.enum_values_doc.return=\n\u6309\u7167\u58F0\u660E\u8BE5\u679A\u4E3E\u7C7B\u578B\u7684\u5E38\u91CF\u7684\u987A\u5E8F\u8FD4\u56DE\u7684\u5305\u542B\u8FD9\u4E9B\u5E38\u91CF\u7684\u6570\u7EC4
+
+doclet.enum_valueof_doc.main=\n\u8FD4\u56DE\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u8BE5\u7C7B\u578B\u7684\u679A\u4E3E\u5E38\u91CF\u3002\n\u5B57\u7B26\u4E32\u5FC5\u987B\u4E0E\u7528\u4E8E\u58F0\u660E\u8BE5\u7C7B\u578B\u7684\u679A\u4E3E\u5E38\u91CF\u7684\n\u6807\u8BC6\u7B26<i>\u5B8C\u5168</i>\u5339\u914D\u3002(\u4E0D\u5141\u8BB8\u6709\u591A\u4F59\n\u7684\u7A7A\u683C\u5B57\u7B26\u3002)
-doclet.enum_valueof_doc=\n\u8FD4\u56DE\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u8BE5\u7C7B\u578B\u7684\u679A\u4E3E\u5E38\u91CF\u3002\n\u5B57\u7B26\u4E32\u5FC5\u987B\u4E0E\u7528\u4E8E\u58F0\u660E\u8BE5\u7C7B\u578B\u7684\u679A\u4E3E\u5E38\u91CF\u7684\n\u6807\u8BC6\u7B26<i>\u5B8C\u5168</i>\u5339\u914D\u3002(\u4E0D\u5141\u8BB8\u6709\u591A\u4F59\n\u7684\u7A7A\u683C\u5B57\u7B26\u3002)\n\n@param name \u8981\u8FD4\u56DE\u7684\u679A\u4E3E\u5E38\u91CF\u7684\u540D\u79F0\u3002\n@return \u8FD4\u56DE\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u679A\u4E3E\u5E38\u91CF\n@throws \u5982\u679C\u8BE5\u679A\u4E3E\u7C7B\u578B\u6CA1\u6709\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u5E38\u91CF, \n\u5219\u629B\u51FA IllegalArgumentException\n@throws \u5982\u679C\u53C2\u6570\u4E3A\u7A7A\u503C, \u5219\u629B\u51FA NullPointerException
+doclet.enum_valueof_doc.param_name=\u8981\u8FD4\u56DE\u7684\u679A\u4E3E\u5E38\u91CF\u7684\u540D\u79F0\u3002
+
+doclet.enum_valueof_doc.return=\u8FD4\u56DE\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u679A\u4E3E\u5E38\u91CF
+
+doclet.enum_valueof_doc.throws_ila=\u5982\u679C\u8BE5\u679A\u4E3E\u7C7B\u578B\u6CA1\u6709\u5E26\u6709\u6307\u5B9A\u540D\u79F0\u7684\u5E38\u91CF
+
+doclet.enum_valueof_doc.throws_npe=\u5982\u679C\u53C2\u6570\u4E3A\u7A7A\u503C
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java Thu Oct 03 19:18:54 2013 +0100
@@ -105,7 +105,9 @@
}
/**
- * Given the name of the field, return the corresponding FieldDoc.
+ * Given the name of the field, return the corresponding FieldDoc. Return null
+ * due to invalid use of value tag if the name is null or empty string and if
+ * the value tag is not used on a field.
*
* @param config the current configuration of the doclet.
* @param tag the value tag.
@@ -114,10 +116,8 @@
* it is assumed that the field is in the current class.
*
* @return the corresponding FieldDoc. If the name is null or empty string,
- * return field that the value tag was used in.
- *
- * @throws DocletAbortException if the value tag does not specify a name to
- * a value field and it is not used within the comments of a valid field.
+ * return field that the value tag was used in. Return null if the name is null
+ * or empty string and if the value tag is not used on a field.
*/
private FieldDoc getFieldDoc(Configuration config, Tag tag, String name) {
if (name == null || name.length() == 0) {
@@ -125,8 +125,9 @@
if (tag.holder() instanceof FieldDoc) {
return (FieldDoc) tag.holder();
} else {
- //This should never ever happen.
- throw new DocletAbortException("should not happen");
+ // If the value tag does not specify a parameter which is a valid field and
+ // it is not used within the comments of a valid field, return null.
+ return null;
}
}
StringTokenizer st = new StringTokenizer(name, "#");
@@ -165,9 +166,15 @@
FieldDoc field = getFieldDoc(
writer.configuration(), tag, tag.text());
if (field == null) {
- //Reference is unknown.
- writer.getMsgRetriever().warning(tag.holder().position(),
- "doclet.value_tag_invalid_reference", tag.text());
+ if (tag.text().isEmpty()) {
+ //Invalid use of @value
+ writer.getMsgRetriever().warning(tag.holder().position(),
+ "doclet.value_tag_invalid_use");
+ } else {
+ //Reference is unknown.
+ writer.getMsgRetriever().warning(tag.holder().position(),
+ "doclet.value_tag_invalid_reference", tag.text());
+ }
} else if (field.constantValue() != null) {
return writer.valueTagOutput(field,
field.constantValueExpression(),
--- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Thu Oct 03 19:18:54 2013 +0100
@@ -55,14 +55,15 @@
public static final int FIELDS = 2;
public static final int CONSTRUCTORS = 3;
public static final int METHODS = 4;
- public static final int ANNOTATION_TYPE_MEMBER_OPTIONAL = 5;
- public static final int ANNOTATION_TYPE_MEMBER_REQUIRED = 6;
- public static final int PROPERTIES = 7;
+ public static final int ANNOTATION_TYPE_FIELDS = 5;
+ public static final int ANNOTATION_TYPE_MEMBER_OPTIONAL = 6;
+ public static final int ANNOTATION_TYPE_MEMBER_REQUIRED = 7;
+ public static final int PROPERTIES = 8;
/**
* The total number of member types is {@value}.
*/
- public static final int NUM_MEMBER_TYPES = 8;
+ public static final int NUM_MEMBER_TYPES = 9;
public static final String STARTLEVEL = "start";
@@ -433,6 +434,9 @@
}
ProgramElementDoc[] members = null;
switch (kind) {
+ case ANNOTATION_TYPE_FIELDS:
+ members = cd.fields(filter);
+ break;
case ANNOTATION_TYPE_MEMBER_OPTIONAL:
members = cd.isAnnotationType() ?
filter((AnnotationTypeDoc) cd, false) :
--- a/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Thu Oct 03 19:18:54 2013 +0100
@@ -44,6 +44,7 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Name;
+import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic.Kind;
@@ -93,7 +94,7 @@
Set<Element> foundParams = new HashSet<>();
Set<TypeMirror> foundThrows = new HashSet<>();
- Map<JavaFileObject, Set<String>> foundAnchors = new HashMap<>();
+ Map<Element, Set<String>> foundAnchors = new HashMap<>();
boolean foundInheritDoc = false;
boolean foundReturn = false;
@@ -576,13 +577,30 @@
}
private boolean checkAnchor(String name) {
- JavaFileObject fo = env.currPath.getCompilationUnit().getSourceFile();
- Set<String> set = foundAnchors.get(fo);
+ Element e = getEnclosingPackageOrClass(env.currElement);
+ if (e == null)
+ return true;
+ Set<String> set = foundAnchors.get(e);
if (set == null)
- foundAnchors.put(fo, set = new HashSet<>());
+ foundAnchors.put(e, set = new HashSet<>());
return set.add(name);
}
+ private Element getEnclosingPackageOrClass(Element e) {
+ while (e != null) {
+ switch (e.getKind()) {
+ case CLASS:
+ case ENUM:
+ case INTERFACE:
+ case PACKAGE:
+ return e;
+ default:
+ e = e.getEnclosingElement();
+ }
+ }
+ return e;
+ }
+
// http://www.w3.org/TR/html401/types.html#type-name
private static final Pattern validName = Pattern.compile("[A-Za-z][A-Za-z0-9-_:.]*");
@@ -712,6 +730,10 @@
@Override
public Void visitReference(ReferenceTree tree, Void ignore) {
+ String sig = tree.getSignature();
+ if (sig.contains("<") || sig.contains(">"))
+ env.messages.error(REFERENCE, tree, "dc.type.arg.not.allowed");
+
Element e = env.trees.getElement(getCurrentPath());
if (e == null)
env.messages.error(REFERENCE, tree, "dc.ref.not.found");
@@ -805,10 +827,33 @@
@Override
public Void visitValue(ValueTree tree, Void ignore) {
+ ReferenceTree ref = tree.getReference();
+ if (ref == null || ref.getSignature().isEmpty()) {
+ if (!isConstant(env.currElement))
+ env.messages.error(REFERENCE, tree, "dc.value.not.allowed.here");
+ } else {
+ Element e = env.trees.getElement(new DocTreePath(getCurrentPath(), ref));
+ if (!isConstant(e))
+ env.messages.error(REFERENCE, tree, "dc.value.not.a.constant");
+ }
+
markEnclosingTag(Flag.HAS_INLINE_TAG);
return super.visitValue(tree, ignore);
}
+ private boolean isConstant(Element e) {
+ if (e == null)
+ return false;
+
+ switch (e.getKind()) {
+ case FIELD:
+ Object value = ((VariableElement) e).getConstantValue();
+ return (value != null); // can't distinguish "not a constant" from "constant is null"
+ default:
+ return false;
+ }
+ }
+
@Override
public Void visitVersion(VersionTree tree, Void ignore) {
warnIfEmpty(tree, tree.getBody());
--- a/langtools/src/share/classes/com/sun/tools/doclint/DocLint.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/DocLint.java Thu Oct 03 19:18:54 2013 +0100
@@ -29,9 +29,14 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Queue;
+import java.util.Set;
import javax.lang.model.element.Name;
+import javax.tools.JavaFileObject;
import javax.tools.StandardLocation;
import com.sun.source.doctree.DocCommentTree;
@@ -278,15 +283,25 @@
TaskListener tl = new TaskListener() {
@Override
public void started(TaskEvent e) {
+ switch (e.getKind()) {
+ case ANALYZE:
+ CompilationUnitTree tree;
+ while ((tree = todo.poll()) != null)
+ ds.scan(tree, null);
+ break;
+ }
}
@Override
public void finished(TaskEvent e) {
switch (e.getKind()) {
- case ENTER:
- ds.scan(e.getCompilationUnit(), null);
+ case PARSE:
+ todo.add(e.getCompilationUnit());
+ break;
}
}
+
+ Queue<CompilationUnitTree> todo = new LinkedList<CompilationUnitTree>();
};
task.addTaskListener(tl);
--- a/langtools/src/share/classes/com/sun/tools/doclint/HtmlTag.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/HtmlTag.java Thu Oct 03 19:18:54 2013 +0100
@@ -86,6 +86,9 @@
DD(BlockType.LIST_ITEM, EndKind.OPTIONAL,
EnumSet.of(Flag.ACCEPTS_BLOCK, Flag.ACCEPTS_INLINE, Flag.EXPECT_CONTENT)),
+ DFN(BlockType.INLINE, EndKind.REQUIRED,
+ EnumSet.of(Flag.EXPECT_CONTENT, Flag.NO_NEST)),
+
DIV(BlockType.BLOCK, EndKind.REQUIRED,
EnumSet.of(Flag.ACCEPTS_BLOCK, Flag.ACCEPTS_INLINE)),
--- a/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint.properties Thu Oct 03 19:18:54 2013 +0100
@@ -67,7 +67,10 @@
dc.tag.start.unmatched = end tag missing: </{0}>
dc.tag.unknown = unknown tag: {0}
dc.text.not.allowed = text not allowed in <{0}> element
+dc.type.arg.not.allowed = type arguments not allowed here
dc.unexpected.comment=documentation comment not expected here
+dc.value.not.allowed.here='{@value}' not allowed here
+dc.value.not.a.constant=value does not refer to a constant
dc.main.ioerror=IO error: {0}
dc.main.no.files.given=No files given
--- a/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -26,6 +26,7 @@
dc.anchor.already.defined = \u30A2\u30F3\u30AB\u30FC\u304C\u3059\u3067\u306B\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u3059: {0}
dc.anchor.value.missing = \u30A2\u30F3\u30AB\u30FC\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
dc.attr.lacks.value = \u5C5E\u6027\u306B\u5024\u304C\u3042\u308A\u307E\u305B\u3093
+dc.attr.not.number = \u5C5E\u6027\u5024\u304C\u6570\u5B57\u3067\u306F\u3042\u308A\u307E\u305B\u3093
dc.attr.obsolete = \u5C5E\u6027\u306F\u5EC3\u6B62\u3055\u308C\u3066\u3044\u307E\u3059: {0}
dc.attr.obsolete.use.css = \u5C5E\u6027\u306F\u5EC3\u6B62\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u304B\u308F\u308A\u306BCSS\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044: {0}
dc.attr.repeated = \u7E70\u308A\u8FD4\u3055\u308C\u305F\u5C5E\u6027: {0}
@@ -46,7 +47,7 @@
dc.missing.throws = {0}\u306E@throws\u304C\u3042\u308A\u307E\u305B\u3093
dc.no.alt.attr.for.image = \u30A4\u30E1\u30FC\u30B8\u306E"alt"\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093
dc.no.summary.or.caption.for.table=\u8868\u306E\u8981\u7D04\u307E\u305F\u306F\u30AD\u30E3\u30D7\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093
-dc.param.name.not.found = @param\u540D\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
+dc.param.name.not.found = @param name\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
dc.ref.not.found = \u53C2\u7167\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
dc.tag.code.within.code = <code>\u5185\u306E'{@code'}
dc.tag.empty = \u7A7A\u306E<{0}>\u30BF\u30B0
@@ -66,3 +67,9 @@
dc.tag.start.unmatched = \u7D42\u4E86\u30BF\u30B0\u304C\u3042\u308A\u307E\u305B\u3093: </{0}>
dc.tag.unknown = \u4E0D\u660E\u306A\u30BF\u30B0: {0}
dc.text.not.allowed = <{0}>\u8981\u7D20\u3067\u306F\u30C6\u30AD\u30B9\u30C8\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
+dc.unexpected.comment=\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u30FB\u30B3\u30E1\u30F3\u30C8\u306F\u3053\u3053\u3067\u306F\u5FC5\u8981\u3042\u308A\u307E\u305B\u3093
+
+dc.main.ioerror=IO\u30A8\u30E9\u30FC: {0}
+dc.main.no.files.given=\u30D5\u30A1\u30A4\u30EB\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+dc.main.usage=\u4F7F\u7528\u65B9\u6CD5:\n doclint [options] source-files...\n\n\u30AA\u30D7\u30B7\u30E7\u30F3:\n -Xmsgs \n -Xmsgs:all\u3068\u540C\u3058\n -Xmsgs:values\n \u30C1\u30A7\u30C3\u30AF\u3059\u308B\u554F\u984C\u306E\u30AB\u30C6\u30B4\u30EA\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002\u3053\u3053\u3067\u306E''values''\u306F\u3001\n \u30AB\u30F3\u30DE\u3067\u533A\u5207\u3089\u308C\u305F\u6B21\u306E\u5024\u306E\u30EA\u30B9\u30C8\u3067\u3059:\n reference Java\u30BD\u30FC\u30B9\u30FB\u30B3\u30FC\u30C9\u8981\u7D20\u3078\u306E\u4E0D\u6B63\u306A\u53C2\u7167\u3092\u542B\u3080\u30B3\u30E1\u30F3\u30C8\u306E\n \u5834\u6240\u3092\u8868\u793A\u3057\u307E\u3059\n syntax \u30B3\u30E1\u30F3\u30C8\u5185\u306E\u57FA\u672C\u69CB\u6587\u30A8\u30E9\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\n html HTML\u30BF\u30D6\u304A\u3088\u3073\u5C5E\u6027\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n accessibility \u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n missing \u6B20\u843D\u3057\u3066\u3044\u308B\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306E\u554F\u984C\u3092\u8868\u793A\u3057\u307E\u3059\n all \u524D\u8FF0\u306E\u3059\u3079\u3066\n \u3053\u308C\u3092\u5426\u5B9A\u3059\u308B\u306B\u306F\u3001\u5024\u306E\u524D\u306B''-''\u3092\u6307\u5B9A\u3057\u307E\u3059\n \u30AB\u30C6\u30B4\u30EA\u306F\u3001\u6B21\u306E\u3044\u305A\u308C\u304B\u3067\u4FEE\u98FE\u3067\u304D\u307E\u3059:\n /public /protected /package /private\n \u6B63\u306E\u30AB\u30C6\u30B4\u30EA(''-''\u3067\u59CB\u307E\u3089\u306A\u3044)\u306E\u5834\u5408\n \u4FEE\u98FE\u5B50\u306F\u3001\u305D\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u4EE5\u4E0A\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u8CA0\u306E\u30AB\u30C6\u30B4\u30EA(''-''\u3067\u59CB\u307E\u308B)\u306E\u5834\u5408\n \u4FEE\u98FE\u5B50\u306F\u3001\u305D\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u4EE5\u4E0B\u306B\u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u4FEE\u98FE\u5B50\u304C\u306A\u3044\u5834\u5408\u3001\u30AB\u30C6\u30B4\u30EA\u306F\u3059\u3079\u3066\u306E\u30A2\u30AF\u30BB\u30B9\u30FB\u30EC\u30D9\u30EB\u306B\n \u9069\u7528\u3055\u308C\u307E\u3059\u3002\n \u4F8B: -Xmsgs:all,-syntax/private\n \u3053\u306E\u5834\u5408\u3001private\u30E1\u30BD\u30C3\u30C9\u306Edoc\u30B3\u30E1\u30F3\u30C8\u5185\u306E\u69CB\u6587\u30A8\u30E9\u30FC\u3092\u9664\u304D\u3001\n \u3059\u3079\u3066\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u6709\u52B9\u5316\u3055\u308C\u307E\u3059\u3002\n -Xmsgs\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u306F\u3001\n -Xmsgs:all/protected\u3068\u540C\u7B49\u306B\u306A\u308A\u3001\u3053\u308C\u306F\n \u3059\u3079\u3066\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u3001protected\u304A\u3088\u3073public\u306E\u5BA3\u8A00\u306E\u307F\u306B\u5831\u544A\u3055\u308C\u308B\u3053\u3068\u3092\n \u610F\u5473\u3057\u307E\u3059\u3002\n -stats\n \u5831\u544A\u3055\u308C\u305F\u554F\u984C\u306B\u5BFE\u3057\u3066\u7D71\u8A08\u3092\u5831\u544A\u3057\u307E\u3059\u3002\n -h -help --help -usage -?\n \u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\n\n\u6B21\u306Ejavac\u30AA\u30D7\u30B7\u30E7\u30F3\u3082\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u3059\n \
+-bootclasspath\u3001-classpath\u3001-cp\u3001-sourcepath\u3001-Xmaxerrs\u3001-Xmaxwarns\n\n\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u4E00\u90E8\u306B\u5BFE\u3057\u3066doclint\u3092\u5B9F\u884C\u3059\u308B\u306B\u306F\u3001\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30B3\u30F3\u30D1\u30A4\u30EB\u3055\u308C\u305F\u30AF\u30E9\u30B9\u3092\n\u30AF\u30E9\u30B9\u30D1\u30B9(\u307E\u305F\u306F\u30D6\u30FC\u30C8\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9)\u306B\u6307\u5B9A\u3057\u3001\u30B3\u30DE\u30F3\u30C9\u30FB\u30E9\u30A4\u30F3\u3067\n\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002
--- a/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -26,6 +26,7 @@
dc.anchor.already.defined = \u951A\u5B9A\u70B9\u5DF2\u5B9A\u4E49: {0}
dc.anchor.value.missing = \u6CA1\u6709\u4E3A\u951A\u5B9A\u70B9\u6307\u5B9A\u503C
dc.attr.lacks.value = \u5C5E\u6027\u7F3A\u5C11\u503C
+dc.attr.not.number = \u5C5E\u6027\u503C\u4E0D\u662F\u6570\u5B57
dc.attr.obsolete = \u5C5E\u6027\u5DF2\u8FC7\u65F6: {0}
dc.attr.obsolete.use.css = \u5C5E\u6027\u5DF2\u8FC7\u65F6, \u8BF7\u6539\u7528 CSS: {0}
dc.attr.repeated = \u5C5E\u6027\u91CD\u590D: {0}
@@ -46,7 +47,7 @@
dc.missing.throws = {0}\u6CA1\u6709 @throws
dc.no.alt.attr.for.image = \u56FE\u50CF\u6CA1\u6709 "alt" \u5C5E\u6027
dc.no.summary.or.caption.for.table=\u8868\u6CA1\u6709\u6982\u8981\u6216\u6807\u9898
-dc.param.name.not.found = \u627E\u4E0D\u5230 @param \u540D\u79F0
+dc.param.name.not.found = @param name \u672A\u627E\u5230
dc.ref.not.found = \u627E\u4E0D\u5230\u5F15\u7528
dc.tag.code.within.code = '{@code'} \u5728 <code> \u4E2D
dc.tag.empty = <{0}> \u6807\u8BB0\u4E3A\u7A7A
@@ -66,3 +67,8 @@
dc.tag.start.unmatched = \u7F3A\u5C11\u7ED3\u675F\u6807\u8BB0: </{0}>
dc.tag.unknown = \u672A\u77E5\u6807\u8BB0: {0}
dc.text.not.allowed = <{0}> \u5143\u7D20\u4E2D\u4E0D\u5141\u8BB8\u4F7F\u7528\u6587\u672C
+dc.unexpected.comment=\u6B64\u5904\u672A\u9884\u671F\u6587\u6863\u6CE8\u91CA
+
+dc.main.ioerror=IO \u9519\u8BEF: {0}
+dc.main.no.files.given=\u672A\u6307\u5B9A\u6587\u4EF6
+dc.main.usage=\u7528\u6CD5:\n doclint [options] source-files...\n\n\u9009\u9879:\n -Xmsgs \n \u4E0E -Xmsgs:all \u76F8\u540C\n -Xmsgs:values\n \u6307\u5B9A\u8981\u68C0\u67E5\u7684\u95EE\u9898\u7684\u7C7B\u522B, \u5176\u4E2D ''values''\n \u662F\u4EFB\u610F\u4EE5\u4E0B\u5185\u5BB9\u7684\u4EE5\u9017\u53F7\u5206\u9694\u7684\u5217\u8868:\n reference \u663E\u793A\u5305\u542B\u5BF9 Java \u6E90\u4EE3\u7801\u5143\u7D20\n \u9519\u8BEF\u5F15\u7528\u7684\u6CE8\u91CA\u7684\u4F4D\u7F6E\n syntax \u663E\u793A\u6CE8\u91CA\u4E2D\u7684\u57FA\u672C\u8BED\u6CD5\u9519\u8BEF\n html \u663E\u793A HTML \u6807\u8BB0\u548C\u5C5E\u6027\u95EE\u9898\n accessibility \u663E\u793A\u53EF\u8BBF\u95EE\u6027\u7684\u95EE\u9898\n missing \u663E\u793A\u7F3A\u5C11\u6587\u6863\u7684\u95EE\u9898\n all \u6240\u6709\u4EE5\u4E0A\u5185\u5BB9\n \u5728\u503C\u4E4B\u524D\u4F7F\u7528 ''-'' \u53EF\u4F7F\u7528\u5176\u53CD\u503C\n \u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u4E00\u9879\u6765\u9650\u5B9A\u7C7B\u522B:\n /public /protected /package /private\n \u5BF9\u4E8E\u6B63\u7C7B\u522B (\u4E0D\u4EE5 ''-'' \u5F00\u5934)\n \u9650\u5B9A\u7B26\u9002\u7528\u4E8E\u8BE5\u8BBF\u95EE\u7EA7\u522B\u53CA\u66F4\u9AD8\u7EA7\u522B\u3002\n \u5BF9\u4E8E\u8D1F\u7C7B\u522B (\u4EE5 ''-'' \u5F00\u5934)\n \u9650\u5B9A\u7B26\u9002\u7528\u4E8E\u8BE5\u8BBF\u95EE\u7EA7\u522B\u53CA\u66F4\u4F4E\u7EA7\u522B\u3002\n \u5982\u679C\u6CA1\u6709\u9650\u5B9A\u7B26, \u5219\u8BE5\u7C7B\u522B\u9002\u7528\u4E8E\n \u6240\u6709\u8BBF\u95EE\u7EA7\u522B\u3002\n \u4F8B\u5982, -Xmsgs:all,-syntax/private\n \u8FD9\u5C06\u5728\u4E13\u7528\u65B9\u6CD5\u7684\u6587\u6863\u6CE8\u91CA\u4E2D\n \u542F\u7528\u9664\u8BED\u6CD5\u9519\u8BEF\u4E4B\u5916\u7684\u6240\u6709\u6D88\u606F\u3002\n \u5982\u679C\u672A\u63D0\u4F9B -Xmsgs \u9009\u9879, \u5219\u9ED8\u8BA4\u503C\n \u7B49\u540C\u4E8E -Xmsgs:all/protected, \u8868\u793A\n \u4EC5\u62A5\u544A\u53D7\u4FDD\u62A4\u548C\u516C\u5171\u58F0\u660E\u4E2D\u7684\n \u6240\u6709\u6D88\u606F\n -stats\n \u62A5\u544A\u6240\u62A5\u544A\u95EE\u9898\u7684\u7EDF\u8BA1\u4FE1\u606F\u3002\n -h -help --help -usage -?\n \u663E\u793A\u6B64\u6D88\u606F\u3002\n\n\u8FD8\u652F\u6301\u4EE5\u4E0B javac \u9009\u9879\n -bootclasspath, -classpath, -cp, -sourcepath, -Xmaxerrs, -Xmaxwarns\n\n\u8981\u5728\u9879\u76EE\u7684\u4E00\u90E8\u5206\u4E0A\u8FD0\u884C doclint, \u8BF7\u5C06\u9879\u76EE\u4E2D\u5DF2\u7F16\u8BD1\u7684\u7C7B\n\u653E\u5728\u7C7B\u8DEF\u5F84 (\u6216\u5F15\u5BFC\u7C7B\u8DEF\u5F84) \u4E0A, \u7136\u540E\u5728\u547D\u4EE4\u884C\u4E0A\u6307\u5B9A\n\u8981\u68C0\u67E5\u7684\u6E90\u6587\u4EF6\u3002
--- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java Thu Oct 03 19:18:54 2013 +0100
@@ -472,7 +472,7 @@
for (TypeElement item: classes)
set.add(item);
- ListBuffer<Env<AttrContext>> defer = ListBuffer.<Env<AttrContext>>lb();
+ ListBuffer<Env<AttrContext>> defer = new ListBuffer<>();
while (list.peek() != null) {
Env<AttrContext> env = list.remove();
ClassSymbol csym = env.enclClass.sym;
--- a/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java Thu Oct 03 19:18:54 2013 +0100
@@ -81,7 +81,7 @@
} else {
ListBuffer<LintLogger> loggers = loggersQueue.get(currentPos);
if (loggers == null) {
- loggersQueue.put(currentPos, loggers = ListBuffer.<LintLogger>lb());
+ loggersQueue.put(currentPos, loggers = new ListBuffer<>());
}
loggers.append(logger);
}
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Thu Oct 03 19:18:54 2013 +0100
@@ -261,7 +261,7 @@
public static final long SIGNATURE_POLYMORPHIC = 1L<<46;
/**
- * Flag that marks inference variables used in a 'throws' clause
+ * Flag that indicates that an inference variable is used in a 'throws' clause.
*/
public static final long THROWS = 1L<<47;
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java Thu Oct 03 19:18:54 2013 +0100
@@ -103,7 +103,7 @@
* @return localized string representation
*/
public String visitTypes(List<Type> ts, Locale locale) {
- ListBuffer<String> sbuf = ListBuffer.lb();
+ ListBuffer<String> sbuf = new ListBuffer<>();
for (Type t : ts) {
sbuf.append(visit(t, locale));
}
@@ -118,7 +118,7 @@
* @return localized string representation
*/
public String visitSymbols(List<Symbol> ts, Locale locale) {
- ListBuffer<String> sbuf = ListBuffer.lb();
+ ListBuffer<String> sbuf = new ListBuffer<>();
for (Symbol t : ts) {
sbuf.append(visit(t, locale));
}
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Thu Oct 03 19:18:54 2013 +0100
@@ -614,7 +614,7 @@
}
public List<TypeVariableSymbol> getTypeParameters() {
- ListBuffer<TypeVariableSymbol> l = ListBuffer.lb();
+ ListBuffer<TypeVariableSymbol> l = new ListBuffer<>();
for (Type t : type.getTypeArguments()) {
Assert.check(t.tsym.getKind() == ElementKind.TYPE_PARAMETER);
l.append((TypeVariableSymbol)t.tsym);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Thu Oct 03 19:18:54 2013 +0100
@@ -433,7 +433,7 @@
}
public static List<Type> filter(List<Type> ts, Filter<Type> tf) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : ts) {
if (tf.accepts(t)) {
buf.append(t);
@@ -977,7 +977,7 @@
}
public java.util.List<? extends TypeMirror> getBounds() {
- return Collections.unmodifiableList(getComponents());
+ return Collections.unmodifiableList(getExplicitComponents());
}
public List<Type> getComponents() {
@@ -1496,7 +1496,7 @@
/** get all bounds of a given kind */
public List<Type> getBounds(InferenceBound... ibs) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (InferenceBound ib : ibs) {
buf.appendList(bounds.get(ib));
}
@@ -1505,7 +1505,7 @@
/** get the list of declared (upper) bounds */
public List<Type> getDeclaredBounds() {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
int count = 0;
for (Type b : getBounds(InferenceBound.UPPER)) {
if (count++ == declaredCount) break;
@@ -1565,8 +1565,8 @@
for (Map.Entry<InferenceBound, List<Type>> _entry : bounds.entrySet()) {
InferenceBound ib = _entry.getKey();
List<Type> prevBounds = _entry.getValue();
- ListBuffer<Type> newBounds = ListBuffer.lb();
- ListBuffer<Type> deps = ListBuffer.lb();
+ ListBuffer<Type> newBounds = new ListBuffer<>();
+ ListBuffer<Type> deps = new ListBuffer<>();
//step 1 - re-add bounds that are not dependent on ivars
for (Type t : prevBounds) {
if (!t.containsAny(instVars)) {
--- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java Thu Oct 03 19:18:54 2013 +0100
@@ -304,7 +304,7 @@
* @param list The bytecode representation of the type path.
*/
public static List<TypePathEntry> getTypePathFromBinary(java.util.List<Integer> list) {
- ListBuffer<TypePathEntry> loc = ListBuffer.lb();
+ ListBuffer<TypePathEntry> loc = new ListBuffer<>();
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
Integer fst = iter.next();
@@ -316,7 +316,7 @@
}
public static List<Integer> getBinaryFromTypePath(java.util.List<TypePathEntry> locs) {
- ListBuffer<Integer> loc = ListBuffer.lb();
+ ListBuffer<Integer> loc = new ListBuffer<>();
for (TypePathEntry tpe : locs) {
loc = loc.append(tpe.tag.tag);
loc = loc.append(tpe.arg);
--- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,10 +31,7 @@
import javax.tools.JavaFileObject;
-import com.sun.tools.javac.code.Attribute;
import com.sun.tools.javac.code.Attribute.TypeCompound;
-import com.sun.tools.javac.code.Flags;
-import com.sun.tools.javac.code.Kinds;
import com.sun.tools.javac.code.Type.AnnotatedType;
import com.sun.tools.javac.code.Type.ArrayType;
import com.sun.tools.javac.code.Type.CapturedType;
@@ -49,7 +46,6 @@
import com.sun.tools.javac.code.Type.WildcardType;
import com.sun.tools.javac.code.TypeAnnotationPosition.TypePathEntry;
import com.sun.tools.javac.code.TypeAnnotationPosition.TypePathEntryKind;
-import com.sun.tools.javac.code.TypeTag;
import com.sun.tools.javac.code.Symbol.VarSymbol;
import com.sun.tools.javac.code.Symbol.MethodSymbol;
import com.sun.tools.javac.comp.Annotate;
@@ -70,6 +66,7 @@
import com.sun.tools.javac.tree.TreeScanner;
import com.sun.tools.javac.tree.JCTree.*;
import com.sun.tools.javac.util.Assert;
+import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Log;
@@ -83,8 +80,28 @@
* and determine the TypeAnnotationPositions for all type annotations.
*/
public class TypeAnnotations {
- // Class cannot be instantiated.
- private TypeAnnotations() {}
+ protected static final Context.Key<TypeAnnotations> typeAnnosKey =
+ new Context.Key<TypeAnnotations>();
+
+ public static TypeAnnotations instance(Context context) {
+ TypeAnnotations instance = context.get(typeAnnosKey);
+ if (instance == null)
+ instance = new TypeAnnotations(context);
+ return instance;
+ }
+
+ final Log log;
+ final Names names;
+ final Symtab syms;
+ final Annotate annotate;
+
+ protected TypeAnnotations(Context context) {
+ context.put(typeAnnosKey, this);
+ names = Names.instance(context);
+ log = Log.instance(context);
+ syms = Symtab.instance(context);
+ annotate = Annotate.instance(context);
+ }
/**
* Separate type annotations from declaration annotations and
@@ -95,15 +112,14 @@
* adds an Annotator to the correct Annotate queue for
* later processing.
*/
- public static void organizeTypeAnnotationsSignatures(final Symtab syms, final Names names,
- final Log log, final Env<AttrContext> env, final JCClassDecl tree, final Annotate annotate) {
+ public void organizeTypeAnnotationsSignatures(final Env<AttrContext> env, final JCClassDecl tree) {
annotate.afterRepeated( new Annotator() {
@Override
public void enterAnnotation() {
JavaFileObject oldSource = log.useSource(env.toplevel.sourcefile);
try {
- new TypeAnnotationPositions(syms, names, log, true).scan(tree);
+ new TypeAnnotationPositions(true).scan(tree);
} finally {
log.useSource(oldSource);
}
@@ -115,8 +131,8 @@
* This version only visits types in bodies, that is, field initializers,
* top-level blocks, and method bodies, and should be called from Attr.
*/
- public static void organizeTypeAnnotationsBodies(Symtab syms, Names names, Log log, JCClassDecl tree) {
- new TypeAnnotationPositions(syms, names, log, false).scan(tree);
+ public void organizeTypeAnnotationsBodies(JCClassDecl tree) {
+ new TypeAnnotationPositions(false).scan(tree);
}
public enum AnnotationType { DECLARATION, TYPE, BOTH };
@@ -125,8 +141,7 @@
* Determine whether an annotation is a declaration annotation,
* a type annotation, or both.
*/
- public static AnnotationType annotationType(Symtab syms, Names names,
- Attribute.Compound a, Symbol s) {
+ public AnnotationType annotationType(Attribute.Compound a, Symbol s) {
Attribute.Compound atTarget =
a.type.tsym.attribute(syms.annotationTargetType.tsym);
if (atTarget == null) {
@@ -215,17 +230,11 @@
}
- private static class TypeAnnotationPositions extends TreeScanner {
+ private class TypeAnnotationPositions extends TreeScanner {
- private final Symtab syms;
- private final Names names;
- private final Log log;
private final boolean sigOnly;
- private TypeAnnotationPositions(Symtab syms, Names names, Log log, boolean sigOnly) {
- this.syms = syms;
- this.names = names;
- this.log = log;
+ TypeAnnotationPositions(boolean sigOnly) {
this.sigOnly = sigOnly;
}
@@ -233,7 +242,7 @@
* When traversing the AST we keep the "frames" of visited
* trees in order to determine the position of annotations.
*/
- private ListBuffer<JCTree> frames = ListBuffer.lb();
+ private ListBuffer<JCTree> frames = new ListBuffer<>();
protected void push(JCTree t) { frames = frames.prepend(t); }
protected JCTree pop() { return frames.next(); }
@@ -265,7 +274,7 @@
ListBuffer<Attribute.TypeCompound> typeAnnos = new ListBuffer<Attribute.TypeCompound>();
for (Attribute.Compound a : annotations) {
- switch (annotationType(syms, names, a, sym)) {
+ switch (annotationType(a, sym)) {
case DECLARATION:
declAnnos.append(a);
break;
@@ -301,7 +310,7 @@
}
// type is non-null and annotations are added to that type
- type = typeWithAnnotations(typetree, type, typeAnnotations, log);
+ type = typeWithAnnotations(typetree, type, typeAnnotations);
if (sym.getKind() == ElementKind.METHOD) {
sym.type.asMethodType().restype = type;
@@ -352,8 +361,8 @@
//
// As a side effect the method sets the type annotation position of "annotations".
// Note that it is assumed that all annotations share the same position.
- private static Type typeWithAnnotations(final JCTree typetree, final Type type,
- final List<Attribute.TypeCompound> annotations, Log log) {
+ private Type typeWithAnnotations(final JCTree typetree, final Type type,
+ final List<Attribute.TypeCompound> annotations) {
// System.out.printf("typeWithAnnotations(typetree: %s, type: %s, annotations: %s)%n",
// typetree, type, annotations);
if (annotations.isEmpty()) {
@@ -381,7 +390,7 @@
}
JCArrayTypeTree arTree = arrayTypeTree(typetree);
- ListBuffer<TypePathEntry> depth = ListBuffer.lb();
+ ListBuffer<TypePathEntry> depth = new ListBuffer<>();
depth = depth.append(TypePathEntry.ARRAY);
while (arType.elemtype.hasTag(TypeTag.ARRAY)) {
if (arType.elemtype.isAnnotated()) {
@@ -400,7 +409,7 @@
arTree = arrayTypeTree(arTree.elemtype);
depth = depth.append(TypePathEntry.ARRAY);
}
- Type arelemType = typeWithAnnotations(arTree.elemtype, arType.elemtype, annotations, log);
+ Type arelemType = typeWithAnnotations(arTree.elemtype, arType.elemtype, annotations);
tomodify.elemtype = arelemType;
{
// All annotations share the same position; modify the first one.
@@ -417,7 +426,7 @@
// There is a TypeKind, but no TypeTag.
JCTypeUnion tutree = (JCTypeUnion) typetree;
JCExpression fst = tutree.alternatives.get(0);
- Type res = typeWithAnnotations(fst, fst.type, annotations, log);
+ Type res = typeWithAnnotations(fst, fst.type, annotations);
fst.type = res;
// TODO: do we want to set res as first element in uct.alternatives?
// UnionClassType uct = (com.sun.tools.javac.code.Type.UnionClassType)type;
@@ -473,7 +482,7 @@
// the correct nesting.
// The genericLocation for the annotation.
- ListBuffer<TypePathEntry> depth = ListBuffer.lb();
+ ListBuffer<TypePathEntry> depth = new ListBuffer<>();
Type topTy = enclTy;
while (enclEl != null &&
@@ -505,7 +514,7 @@
}
}
- private static JCArrayTypeTree arrayTypeTree(JCTree typetree) {
+ private JCArrayTypeTree arrayTypeTree(JCTree typetree) {
if (typetree.getKind() == JCTree.Kind.ARRAY_TYPE) {
return (JCArrayTypeTree) typetree;
} else if (typetree.getKind() == JCTree.Kind.ANNOTATED_TYPE) {
@@ -532,7 +541,7 @@
* @param annotations The annotations to insert.
* @return A copy of type that contains the annotations.
*/
- private static Type typeWithAnnotations(final Type type,
+ private Type typeWithAnnotations(final Type type,
final Type stopAt,
final List<Attribute.TypeCompound> annotations) {
Visitor<Type, List<TypeCompound>> visitor =
@@ -619,7 +628,7 @@
return type.accept(visitor, annotations);
}
- private static Attribute.TypeCompound toTypeCompound(Attribute.Compound a, TypeAnnotationPosition p) {
+ private Attribute.TypeCompound toTypeCompound(Attribute.Compound a, TypeAnnotationPosition p) {
// It is safe to alias the position.
return new Attribute.TypeCompound(a, p);
}
@@ -793,7 +802,7 @@
}
case ARRAY_TYPE: {
- ListBuffer<TypePathEntry> index = ListBuffer.lb();
+ ListBuffer<TypePathEntry> index = new ListBuffer<>();
index = index.append(TypePathEntry.ARRAY);
List<JCTree> newPath = path.tail;
while (true) {
@@ -953,10 +962,10 @@
}
}
- private static void locateNestedTypes(Type type, TypeAnnotationPosition p) {
+ private void locateNestedTypes(Type type, TypeAnnotationPosition p) {
// The number of "steps" to get from the full type to the
// left-most outer type.
- ListBuffer<TypePathEntry> depth = ListBuffer.lb();
+ ListBuffer<TypePathEntry> depth = new ListBuffer<>();
Type encl = type.getEnclosingType();
while (encl != null &&
@@ -970,7 +979,7 @@
}
}
- private static int methodParamIndex(List<JCTree> path, JCTree param) {
+ private int methodParamIndex(List<JCTree> path, JCTree param) {
List<JCTree> curr = path;
while (curr.head.getTag() != Tag.METHODDEF &&
curr.head.getTag() != Tag.LAMBDA) {
@@ -1226,7 +1235,7 @@
public void visitNewArray(JCNewArray tree) {
findPosition(tree, tree, tree.annotations);
int dimAnnosCount = tree.dimAnnotations.size();
- ListBuffer<TypePathEntry> depth = ListBuffer.lb();
+ ListBuffer<TypePathEntry> depth = new ListBuffer<>();
// handle annotations associated with dimensions
for (int i = 0; i < dimAnnosCount; ++i) {
@@ -1284,7 +1293,7 @@
}
}
- private static void setTypeAnnotationPos(List<JCAnnotation> annotations,
+ private void setTypeAnnotationPos(List<JCAnnotation> annotations,
TypeAnnotationPosition position) {
for (JCAnnotation anno : annotations) {
// attribute might be null during DeferredAttr;
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Oct 03 19:18:54 2013 +0100
@@ -51,7 +51,6 @@
import static com.sun.tools.javac.code.Type.*;
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.jvm.ClassFile.externalize;
-import static com.sun.tools.javac.util.ListBuffer.lb;
/**
* Utility class containing various operations on types.
@@ -411,7 +410,7 @@
throw failure("not.a.functional.intf", origin);
}
- final ListBuffer<Symbol> abstracts = ListBuffer.lb();
+ final ListBuffer<Symbol> abstracts = new ListBuffer<>();
for (Symbol sym : membersCache.getElements(new DescriptorFilter(origin))) {
Type mtype = memberType(origin.type, sym);
if (abstracts.isEmpty() ||
@@ -434,7 +433,7 @@
FunctionDescriptor descRes = mergeDescriptors(origin, abstracts.toList());
if (descRes == null) {
//we can get here if the functional interface is ill-formed
- ListBuffer<JCDiagnostic> descriptors = ListBuffer.lb();
+ ListBuffer<JCDiagnostic> descriptors = new ListBuffer<>();
for (Symbol desc : abstracts) {
String key = desc.type.getThrownTypes().nonEmpty() ?
"descriptor.throws" : "descriptor";
@@ -596,7 +595,7 @@
Type capturedSite = capture(site);
if (capturedSite != site) {
Type formalInterface = site.tsym.type;
- ListBuffer<Type> typeargs = ListBuffer.lb();
+ ListBuffer<Type> typeargs = new ListBuffer<>();
List<Type> actualTypeargs = site.getTypeArguments();
List<Type> capturedTypeargs = capturedSite.getTypeArguments();
//simply replace the wildcards with its bound
@@ -662,7 +661,7 @@
Assert.check(isFunctionalInterface(origin));
Symbol descSym = findDescriptorSymbol(origin);
CompoundScope members = membersClosure(origin.type, false);
- ListBuffer<Symbol> overridden = ListBuffer.lb();
+ ListBuffer<Symbol> overridden = new ListBuffer<>();
outer: for (Symbol m2 : members.getElementsByName(descSym.name, bridgeFilter)) {
if (m2 == descSym) continue;
else if (descSym.overrides(m2, origin, Types.this, false)) {
@@ -885,12 +884,12 @@
private Type rewriteSupers(Type t) {
if (!t.isParameterized())
return t;
- ListBuffer<Type> from = lb();
- ListBuffer<Type> to = lb();
+ ListBuffer<Type> from = new ListBuffer<>();
+ ListBuffer<Type> to = new ListBuffer<>();
adaptSelf(t, from, to);
if (from.isEmpty())
return t;
- ListBuffer<Type> rewrite = lb();
+ ListBuffer<Type> rewrite = new ListBuffer<>();
boolean changed = false;
for (Type orig : to.toList()) {
Type s = rewriteSupers(orig);
@@ -2415,6 +2414,29 @@
}
};
+ public List<Type> directSupertypes(Type t) {
+ return directSupertypes.visit(t);
+ }
+ // where
+ private final UnaryVisitor<List<Type>> directSupertypes = new UnaryVisitor<List<Type>>() {
+
+ public List<Type> visitType(final Type type, final Void ignored) {
+ if (!type.isCompound()) {
+ final Type sup = supertype(type);
+ return (sup == Type.noType || sup == type || sup == null)
+ ? interfaces(type)
+ : interfaces(type).prepend(sup);
+ } else {
+ return visitIntersectionType((IntersectionClassType) type);
+ }
+ }
+
+ private List<Type> visitIntersectionType(final IntersectionClassType it) {
+ return it.getExplicitComponents();
+ }
+
+ };
+
public boolean isDirectSuperInterface(TypeSymbol isym, TypeSymbol origin) {
for (Type i2 : interfaces(origin.type)) {
if (isym == i2.tsym) return true;
@@ -2744,7 +2766,7 @@
}
public List<MethodSymbol> prune(List<MethodSymbol> methods) {
- ListBuffer<MethodSymbol> methodsMin = ListBuffer.lb();
+ ListBuffer<MethodSymbol> methodsMin = new ListBuffer<>();
for (MethodSymbol m1 : methods) {
boolean isMin_m1 = true;
for (MethodSymbol m2 : methods) {
@@ -3001,7 +3023,7 @@
List<Type> to) {
if (tvars.isEmpty())
return tvars;
- ListBuffer<Type> newBoundsBuf = lb();
+ ListBuffer<Type> newBoundsBuf = new ListBuffer<>();
boolean changed = false;
// calculate new bounds
for (Type t : tvars) {
@@ -3013,7 +3035,7 @@
}
if (!changed)
return tvars;
- ListBuffer<Type> newTvars = lb();
+ ListBuffer<Type> newTvars = new ListBuffer<>();
// create new type variables without bounds
for (Type t : tvars) {
newTvars.append(new TypeVar(t.tsym, null, syms.botType));
@@ -3440,15 +3462,15 @@
* compoundMin or glb.
*/
private List<Type> closureMin(List<Type> cl) {
- ListBuffer<Type> classes = lb();
- ListBuffer<Type> interfaces = lb();
+ ListBuffer<Type> classes = new ListBuffer<>();
+ ListBuffer<Type> interfaces = new ListBuffer<>();
while (!cl.isEmpty()) {
Type current = cl.head;
if (current.isInterface())
interfaces.append(current);
else
classes.append(current);
- ListBuffer<Type> candidates = lb();
+ ListBuffer<Type> candidates = new ListBuffer<>();
for (Type t : cl.tail) {
if (!isSubtypeNoCapture(current, t))
candidates.append(t);
@@ -3564,7 +3586,7 @@
}
// where
List<Type> erasedSupertypes(Type t) {
- ListBuffer<Type> buf = lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type sup : closure(t)) {
if (sup.hasTag(TYPEVAR)) {
buf.append(sup);
@@ -3914,7 +3936,7 @@
}
// where
public List<Type> freshTypeVariables(List<Type> types) {
- ListBuffer<Type> result = lb();
+ ListBuffer<Type> result = new ListBuffer<>();
for (Type t : types) {
if (t.hasTag(WILDCARD)) {
t = t.unannotatedType();
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Oct 03 19:18:54 2013 +0100
@@ -93,6 +93,7 @@
final Types types;
final JCDiagnostic.Factory diags;
final Annotate annotate;
+ final TypeAnnotations typeAnnotations;
final DeferredLintHandler deferredLintHandler;
public static Attr instance(Context context) {
@@ -121,6 +122,7 @@
types = Types.instance(context);
diags = JCDiagnostic.Factory.instance(context);
annotate = Annotate.instance(context);
+ typeAnnotations = TypeAnnotations.instance(context);
deferredLintHandler = DeferredLintHandler.instance(context);
Options options = Options.instance(context);
@@ -1724,7 +1726,7 @@
boolean isConstructorCall =
methName == names._this || methName == names._super;
- ListBuffer<Type> argtypesBuf = ListBuffer.lb();
+ ListBuffer<Type> argtypesBuf = new ListBuffer<>();
if (isConstructorCall) {
// We are seeing a ...this(...) or ...super(...) call.
// Check that this is the first statement in a constructor.
@@ -1989,7 +1991,7 @@
}
// Attribute constructor arguments.
- ListBuffer<Type> argtypesBuf = ListBuffer.lb();
+ ListBuffer<Type> argtypesBuf = new ListBuffer<>();
int pkind = attribArgs(tree.args, localEnv, argtypesBuf);
List<Type> argtypes = argtypesBuf.toList();
List<Type> typeargtypes = attribTypes(tree.typeargs, localEnv);
@@ -2228,7 +2230,7 @@
// empty annotations, if only declaration annotations were given.
// This method will raise an error for such a type.
for (JCAnnotation ai : annotations) {
- if (TypeAnnotations.annotationType(syms, names, ai.attribute, sym) == TypeAnnotations.AnnotationType.DECLARATION) {
+ if (typeAnnotations.annotationType(ai.attribute, sym) == TypeAnnotations.AnnotationType.DECLARATION) {
log.error(ai.pos(), "annotation.type.not.applicable");
}
}
@@ -2476,8 +2478,8 @@
}
private TypeSymbol makeNotionalInterface(IntersectionClassType ict) {
- ListBuffer<Type> targs = ListBuffer.lb();
- ListBuffer<Type> supertypes = ListBuffer.lb();
+ ListBuffer<Type> targs = new ListBuffer<>();
+ ListBuffer<Type> supertypes = new ListBuffer<>();
for (Type i : ict.interfaces_field) {
if (i.isParameterized()) {
targs.appendList(i.tsym.type.allparams());
@@ -2907,7 +2909,7 @@
}
});
} else {
- ListBuffer<Type> targets = ListBuffer.lb();
+ ListBuffer<Type> targets = new ListBuffer<>();
if (pt.hasTag(CLASS)) {
if (pt.isCompound()) {
targets.append(types.removeWildcards(primaryTarget)); //this goes first
@@ -3102,8 +3104,14 @@
public void visitTypeTest(JCInstanceOf tree) {
Type exprtype = chk.checkNullOrRefType(
tree.expr.pos(), attribExpr(tree.expr, env));
- Type clazztype = chk.checkReifiableReferenceType(
- tree.clazz.pos(), attribType(tree.clazz, env));
+ Type clazztype = attribType(tree.clazz, env);
+ if (!clazztype.hasTag(TYPEVAR)) {
+ clazztype = chk.checkClassOrArrayType(tree.clazz.pos(), clazztype);
+ }
+ if (!clazztype.isErroneous() && !types.isReifiable(clazztype)) {
+ log.error(tree.clazz.pos(), "illegal.generic.type.for.instof");
+ clazztype = types.createErrorType(clazztype);
+ }
chk.validate(tree.clazz, env, false);
chk.checkCastable(tree.expr.pos(), exprtype, clazztype);
result = check(tree, syms.booleanType, VAL, resultInfo);
@@ -3903,7 +3911,7 @@
}
public void visitTypeUnion(JCTypeUnion tree) {
- ListBuffer<Type> multicatchTypes = ListBuffer.lb();
+ ListBuffer<Type> multicatchTypes = new ListBuffer<>();
ListBuffer<Type> all_multicatchTypes = null; // lazy, only if needed
for (JCExpression typeTree : tree.alternatives) {
Type ctype = attribType(typeTree, env);
@@ -3930,7 +3938,7 @@
all_multicatchTypes.append(ctype);
} else {
if (all_multicatchTypes == null) {
- all_multicatchTypes = ListBuffer.lb();
+ all_multicatchTypes = new ListBuffer<>();
all_multicatchTypes.appendList(multicatchTypes);
}
all_multicatchTypes.append(ctype);
@@ -4085,7 +4093,7 @@
if (annotations.isEmpty())
return List.nil();
- ListBuffer<Attribute.TypeCompound> buf = ListBuffer.lb();
+ ListBuffer<Attribute.TypeCompound> buf = new ListBuffer<>();
for (JCAnnotation anno : annotations) {
if (anno.attribute != null) {
// TODO: this null-check is only needed for an obscure
@@ -4333,7 +4341,7 @@
}
if (allowTypeAnnos) {
// Correctly organize the postions of the type annotations
- TypeAnnotations.organizeTypeAnnotationsBodies(this.syms, this.names, this.log, tree);
+ typeAnnotations.organizeTypeAnnotationsBodies(tree);
// Check type annotations applicability rules
validateTypeAnnotations(tree);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Oct 03 19:18:54 2013 +0100
@@ -706,20 +706,6 @@
return t;
}
- /** Check that type is a reifiable class, interface or array type.
- * @param pos Position to be used for error reporting.
- * @param t The type to be checked.
- */
- Type checkReifiableReferenceType(DiagnosticPosition pos, Type t) {
- t = checkClassOrArrayType(pos, t);
- if (!t.isErroneous() && !types.isReifiable(t)) {
- log.error(pos, "illegal.generic.type.for.instof");
- return types.createErrorType(t);
- } else {
- return t;
- }
- }
-
/** Check that type is a reference type, i.e. a class, interface or array type
* or a type variable.
* @param pos Position to be used for error reporting.
@@ -1245,6 +1231,7 @@
*/
class Validator extends JCTree.Visitor {
+ boolean checkRaw;
boolean isOuter;
Env<AttrContext> env;
@@ -1254,7 +1241,7 @@
@Override
public void visitTypeArray(JCArrayTypeTree tree) {
- tree.elemtype.accept(this);
+ validateTree(tree.elemtype, checkRaw, isOuter);
}
@Override
@@ -1345,15 +1332,20 @@
}
public void validateTree(JCTree tree, boolean checkRaw, boolean isOuter) {
- try {
- if (tree != null) {
- this.isOuter = isOuter;
+ if (tree != null) {
+ boolean prevCheckRaw = this.checkRaw;
+ this.checkRaw = checkRaw;
+ this.isOuter = isOuter;
+
+ try {
tree.accept(this);
if (checkRaw)
checkRaw(tree, env);
+ } catch (CompletionFailure ex) {
+ completionError(tree.pos(), ex);
+ } finally {
+ this.checkRaw = prevCheckRaw;
}
- } catch (CompletionFailure ex) {
- completionError(tree.pos(), ex);
}
}
@@ -2446,8 +2438,8 @@
Assert.check(m.kind == MTH);
List<MethodSymbol> prov = types.interfaceCandidates(site, (MethodSymbol)m);
if (prov.size() > 1) {
- ListBuffer<Symbol> abstracts = ListBuffer.lb();
- ListBuffer<Symbol> defaults = ListBuffer.lb();
+ ListBuffer<Symbol> abstracts = new ListBuffer<>();
+ ListBuffer<Symbol> defaults = new ListBuffer<>();
for (MethodSymbol provSym : prov) {
if ((provSym.flags() & DEFAULT) != 0) {
defaults = defaults.append(provSym);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Thu Oct 03 19:18:54 2013 +0100
@@ -637,7 +637,7 @@
Env<AttrContext> localEnv = env.dup(tree);
JCExpression exprTree = (JCExpression)attribSpeculative(tree.getQualifierExpression(), localEnv,
attr.memberReferenceQualifierResult(tree));
- ListBuffer<Type> argtypes = ListBuffer.lb();
+ ListBuffer<Type> argtypes = new ListBuffer<>();
for (Type t : types.findDescriptorType(pt).getParameterTypes()) {
argtypes.append(Type.noType);
}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Thu Oct 03 19:18:54 2013 +0100
@@ -288,7 +288,9 @@
JavaFileObject.Kind.SOURCE);
if (tree.pid != null) {
tree.packge = reader.enterPackage(TreeInfo.fullName(tree.pid));
- if (tree.packageAnnotations.nonEmpty() || pkginfoOpt == PkgInfo.ALWAYS) {
+ if (tree.packageAnnotations.nonEmpty()
+ || pkginfoOpt == PkgInfo.ALWAYS
+ || tree.docComments != null) {
if (isPkgInfo) {
addEnv = true;
} else if (tree.packageAnnotations.nonEmpty()){
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Oct 03 19:18:54 2013 +0100
@@ -713,7 +713,7 @@
ListBuffer<PendingExit> prevPending = pendingExits;
boolean prevAlive = alive;
try {
- pendingExits = ListBuffer.lb();
+ pendingExits = new ListBuffer<>();
alive = true;
scanStat(tree.body);
tree.canCompleteNormally = alive;
@@ -1265,7 +1265,7 @@
List<Type> prevThrown = thrown;
ListBuffer<FlowPendingExit> prevPending = pendingExits;
try {
- pendingExits = ListBuffer.lb();
+ pendingExits = new ListBuffer<>();
caught = tree.getDescriptorType(types).getThrownTypes();
thrown = List.nil();
scan(tree.body);
@@ -1338,7 +1338,7 @@
ListBuffer<FlowPendingExit> prevPending = pendingExits;
inLambda = true;
try {
- pendingExits = ListBuffer.lb();
+ pendingExits = new ListBuffer<>();
caught = List.of(syms.throwableType);
thrown = List.nil();
scan(tree.body);
@@ -2030,7 +2030,7 @@
void reportWarning(Lint.LintCategory lc, DiagnosticPosition pos, String key, Object ... args) {}
public void visitTry(JCTry tree) {
- ListBuffer<JCVariableDecl> resourceVarDecls = ListBuffer.lb();
+ ListBuffer<JCVariableDecl> resourceVarDecls = new ListBuffer<>();
final Bits uninitsTryPrev = new Bits(uninitsTry);
ListBuffer<P> prevPendingExits = pendingExits;
pendingExits = new ListBuffer<>();
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Thu Oct 03 19:18:54 2013 +0100
@@ -277,7 +277,7 @@
* Infer cyclic inference variables as described in 15.12.2.8.
*/
private void instantiateAsUninferredVars(List<Type> vars, InferenceContext inferenceContext) {
- ListBuffer<Type> todo = ListBuffer.lb();
+ ListBuffer<Type> todo = new ListBuffer<>();
//step 1 - create fresh tvars
for (Type t : vars) {
UndetVar uv = (UndetVar)inferenceContext.asFree(t);
@@ -1832,7 +1832,7 @@
}
private List<Type> filterVars(Filter<UndetVar> fu) {
- ListBuffer<Type> res = ListBuffer.lb();
+ ListBuffer<Type> res = new ListBuffer<>();
for (Type t : undetvars) {
UndetVar uv = (UndetVar)t;
if (fu.accepts(uv)) {
@@ -1860,7 +1860,7 @@
* Returns a list of free variables in a given type
*/
final List<Type> freeVarsIn(Type t) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type iv : inferenceVars()) {
if (t.contains(iv)) {
buf.add(iv);
@@ -1870,11 +1870,11 @@
}
final List<Type> freeVarsIn(List<Type> ts) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : ts) {
buf.appendList(freeVarsIn(t));
}
- ListBuffer<Type> buf2 = ListBuffer.lb();
+ ListBuffer<Type> buf2 = new ListBuffer<>();
for (Type t : buf) {
if (!buf2.contains(t)) {
buf2.add(t);
@@ -1893,7 +1893,7 @@
}
final List<Type> asFree(List<Type> ts) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : ts) {
buf.append(asFree(t));
}
@@ -1901,7 +1901,7 @@
}
List<Type> instTypes() {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : undetvars) {
UndetVar uv = (UndetVar)t;
buf.append(uv.inst != null ? uv.inst : uv.qtype);
@@ -1919,7 +1919,7 @@
}
List<Type> asInstTypes(List<Type> ts) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : ts) {
buf.append(asInstType(t));
}
@@ -1967,7 +1967,7 @@
* Save the state of this inference context
*/
List<Type> save() {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (Type t : undetvars) {
UndetVar uv = (UndetVar)t;
UndetVar uv2 = new UndetVar((TypeVar)uv.qtype, types);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Thu Oct 03 19:18:54 2013 +0100
@@ -126,7 +126,7 @@
private final VarSymbol deserParamSym;
private KlassInfo(Symbol kSym) {
- appendedMethodList = ListBuffer.lb();
+ appendedMethodList = new ListBuffer<>();
deserializeCases = new HashMap<String, ListBuffer<JCStatement>>();
long flags = PRIVATE | STATIC | SYNTHETIC;
MethodType type = new MethodType(List.of(syms.serializedLambdaType), syms.objectType,
@@ -153,6 +153,8 @@
return instance;
}
+ private Attr attr;
+
private LambdaToMethod(Context context) {
diags = JCDiagnostic.Factory.instance(context);
log = Log.instance(context);
@@ -166,6 +168,7 @@
analyzer = new LambdaAnalyzerPreprocessor();
Options options = Options.instance(context);
dumpLambdaToMethodStats = options.isSet("dumpLambdaToMethodStats");
+ attr = Attr.instance(context);
}
// </editor-fold>
@@ -188,7 +191,7 @@
}
<T extends JCTree> List<T> translate(List<T> trees, TranslationContext<?> newContext) {
- ListBuffer<T> buf = ListBuffer.lb();
+ ListBuffer<T> buf = new ListBuffer<>();
for (T tree : trees) {
buf.append(translate(tree, newContext));
}
@@ -301,7 +304,7 @@
// * the "this" argument if it is an instance method
// * enclosing locals captured by the lambda expression
- ListBuffer<JCExpression> syntheticInits = ListBuffer.lb();
+ ListBuffer<JCExpression> syntheticInits = new ListBuffer<>();
if (!sym.isStatic()) {
syntheticInits.append(makeThis(
@@ -368,6 +371,7 @@
case BOUND: /** Expr :: instMethod */
init = tree.getQualifierExpression();
+ init = attr.makeNullCheck(init);
break;
case UNBOUND: /** Type :: instMethod */
@@ -465,7 +469,7 @@
} else if (isLambda_void && isTarget_Void) {
//void to Void conversion:
// BODY; return null;
- ListBuffer<JCStatement> stats = ListBuffer.lb();
+ ListBuffer<JCStatement> stats = new ListBuffer<>();
stats.append(make.Exec(expr));
stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType)));
return make.Block(0, stats.toList());
@@ -527,8 +531,8 @@
}
private JCMethodDecl makeDeserializeMethod(Symbol kSym) {
- ListBuffer<JCCase> cases = ListBuffer.lb();
- ListBuffer<JCBreak> breaks = ListBuffer.lb();
+ ListBuffer<JCCase> cases = new ListBuffer<>();
+ ListBuffer<JCBreak> breaks = new ListBuffer<>();
for (Map.Entry<String, ListBuffer<JCStatement>> entry : kInfo.deserializeCases.entrySet()) {
JCBreak br = make.Break(null);
breaks.add(br);
@@ -590,11 +594,11 @@
String implMethodSignature = methodSig(types.erasure(refSym.type));
JCExpression kindTest = eqTest(syms.intType, deserGetter("getImplMethodKind", syms.intType), make.Literal(implMethodKind));
- ListBuffer<JCExpression> serArgs = ListBuffer.lb();
+ ListBuffer<JCExpression> serArgs = new ListBuffer<>();
int i = 0;
for (Type t : indyType.getParameterTypes()) {
- List<JCExpression> indexAsArg = ListBuffer.<JCExpression>lb().append(make.Literal(i)).toList();
- List<Type> argTypes = ListBuffer.<Type>lb().append(syms.intType).toList();
+ List<JCExpression> indexAsArg = new ListBuffer<JCExpression>().append(make.Literal(i)).toList();
+ List<Type> argTypes = new ListBuffer<Type>().append(syms.intType).toList();
serArgs.add(make.TypeCast(types.erasure(t), deserGetter("getCapturedArg", syms.objectType, argTypes, indexAsArg)));
++i;
}
@@ -614,7 +618,7 @@
null);
ListBuffer<JCStatement> stmts = kInfo.deserializeCases.get(implMethodName);
if (stmts == null) {
- stmts = ListBuffer.lb();
+ stmts = new ListBuffer<>();
kInfo.deserializeCases.put(implMethodName, stmts);
}
/****
@@ -724,8 +728,8 @@
private final JCMemberReference tree;
private final ReferenceTranslationContext localContext;
- private final ListBuffer<JCExpression> args = ListBuffer.lb();
- private final ListBuffer<JCVariableDecl> params = ListBuffer.lb();
+ private final ListBuffer<JCExpression> args = new ListBuffer<>();
+ private final ListBuffer<JCVariableDecl> params = new ListBuffer<>();
MemberReferenceBridger(JCMemberReference tree, ReferenceTranslationContext localContext) {
this.tree = tree;
@@ -930,7 +934,7 @@
typeToMethodType(tree.getDescriptorType(types)));
//computed indy arg types
- ListBuffer<Type> indy_args_types = ListBuffer.lb();
+ ListBuffer<Type> indy_args_types = new ListBuffer<>();
for (JCExpression arg : indy_args) {
indy_args_types.append(arg.type);
}
@@ -945,7 +949,7 @@
names.altMetafactory : names.metafactory;
if (context.needsAltMetafactory()) {
- ListBuffer<Object> markers = ListBuffer.lb();
+ ListBuffer<Object> markers = new ListBuffer<>();
for (Type t : tree.targets.tail) {
if (t.tsym != syms.serializableType.tsym) {
markers.append(t.tsym);
@@ -1023,7 +1027,7 @@
}
//where
private List<Type> bsmStaticArgToTypes(List<Object> args) {
- ListBuffer<Type> argtypes = ListBuffer.lb();
+ ListBuffer<Type> argtypes = new ListBuffer<>();
for (Object arg : args) {
argtypes.append(bsmStaticArgToType(arg));
}
@@ -1847,7 +1851,7 @@
(thisReferenced? (inInterface? DEFAULT : 0) : STATIC);
//compute synthetic params
- ListBuffer<JCVariableDecl> params = ListBuffer.lb();
+ ListBuffer<JCVariableDecl> params = new ListBuffer<>();
// The signature of the method is augmented with the following
// synthetic parameters:
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Oct 03 19:18:54 2013 +0100
@@ -3725,7 +3725,7 @@
(JCVariableDecl)make.VarDef(dollar_tmp, make.Literal(INT, -1)).setType(dollar_tmp.type);
dollar_tmp_def.init.type = dollar_tmp.type = syms.intType;
stmtList.append(dollar_tmp_def);
- ListBuffer<JCCase> caseBuffer = ListBuffer.lb();
+ ListBuffer<JCCase> caseBuffer = new ListBuffer<>();
// hashCode will trigger nullcheck on original switch expression
JCMethodInvocation hashCodeCall = makeCall(make.Ident(dollar_s),
names.hashCode,
@@ -3749,7 +3749,7 @@
elsepart);
}
- ListBuffer<JCStatement> lb = ListBuffer.lb();
+ ListBuffer<JCStatement> lb = new ListBuffer<>();
JCBreak breakStmt = make.Break(null);
breakStmt.target = switch1;
lb.append(elsepart).append(breakStmt);
@@ -3764,7 +3764,7 @@
// with corresponding integer ones from the label to
// position map.
- ListBuffer<JCCase> lb = ListBuffer.lb();
+ ListBuffer<JCCase> lb = new ListBuffer<>();
JCSwitch switch2 = make.Switch(make.Ident(dollar_tmp), lb.toList());
for(JCCase oneCase : caseList ) {
// Rewire up old unlabeled break statements to the
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Thu Oct 03 19:18:54 2013 +0100
@@ -79,6 +79,7 @@
private final ClassReader reader;
private final Todo todo;
private final Annotate annotate;
+ private final TypeAnnotations typeAnnotations;
private final Types types;
private final JCDiagnostic.Factory diags;
private final Source source;
@@ -105,6 +106,7 @@
reader = ClassReader.instance(context);
todo = Todo.instance(context);
annotate = Annotate.instance(context);
+ typeAnnotations = TypeAnnotations.instance(context);
types = Types.instance(context);
diags = JCDiagnostic.Factory.instance(context);
source = Source.instance(context);
@@ -1164,7 +1166,7 @@
}
}
if (allowTypeAnnos) {
- TypeAnnotations.organizeTypeAnnotationsSignatures(syms, names, log, env, tree, annotate);
+ typeAnnotations.organizeTypeAnnotationsSignatures(env, tree);
}
}
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Oct 03 19:18:54 2013 +0100
@@ -213,7 +213,7 @@
int pos = 0;
int mostSpecificPos = -1;
- ListBuffer<JCDiagnostic> subDiags = ListBuffer.lb();
+ ListBuffer<JCDiagnostic> subDiags = new ListBuffer<>();
for (Candidate c : currentResolutionContext.candidates) {
if (currentResolutionContext.step != c.step ||
(c.isApplicable() && !verboseResolutionMode.contains(VerboseResolutionMode.APPLICABLE)) ||
@@ -783,7 +783,7 @@
};
List<Type> dummyArgs(int length) {
- ListBuffer<Type> buf = ListBuffer.lb();
+ ListBuffer<Type> buf = new ListBuffer<>();
for (int i = 0 ; i < length ; i++) {
buf.append(Type.noType);
}
@@ -3173,7 +3173,7 @@
}
//where
private List<Type> pruneInterfaces(Type t) {
- ListBuffer<Type> result = ListBuffer.lb();
+ ListBuffer<Type> result = new ListBuffer<>();
for (Type t1 : types.interfaces(t)) {
boolean shouldAdd = true;
for (Type t2 : types.interfaces(t)) {
@@ -3286,7 +3286,7 @@
if (argtypes == null || argtypes.isEmpty()) {
return noArgs;
} else {
- ListBuffer<Object> diagArgs = ListBuffer.lb();
+ ListBuffer<Object> diagArgs = new ListBuffer<>();
for (Type t : argtypes) {
if (t.hasTag(DEFERRED)) {
diagArgs.append(((DeferredAttr.DeferredType)t).tree);
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Oct 03 19:18:54 2013 +0100
@@ -887,7 +887,7 @@
private List<JCTree> addOverrideBridgesIfNeeded(DiagnosticPosition pos,
final ClassSymbol c) {
- ListBuffer<JCTree> buf = ListBuffer.lb();
+ ListBuffer<JCTree> buf = new ListBuffer<>();
if (c.isInterface() || !boundsRestricted(c))
return buf.toList();
Type t = types.supertype(c.type);
--- a/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java Thu Oct 03 19:18:54 2013 +0100
@@ -40,6 +40,7 @@
import java.nio.CharBuffer;
import java.nio.charset.CharsetDecoder;
import javax.tools.JavaFileObject;
+import java.text.Normalizer;
/**
* A subclass of JavaFileObject representing regular files.
@@ -57,6 +58,7 @@
private String name;
final File file;
private Reference<File> absFileRef;
+ final static boolean isMacOS = System.getProperty("os.name", "").contains("OS X");
public RegularFileObject(JavacFileManager fileManager, File f) {
this(fileManager, f.getName(), f);
@@ -180,7 +182,19 @@
if (name.equals(n)) {
return true;
}
- if (name.equalsIgnoreCase(n)) {
+ if (isMacOS && Normalizer.isNormalized(name, Normalizer.Form.NFD)
+ && Normalizer.isNormalized(n, Normalizer.Form.NFC)) {
+ // On Mac OS X it is quite possible to file name and class
+ // name normalized in a different way - in that case we have to normalize file name
+ // to the Normal Form Compised (NFC)
+ String normName = Normalizer.normalize(name, Normalizer.Form.NFC);
+ if (normName.equals(n)) {
+ this.name = normName;
+ return true;
+ }
+ }
+
+ if (name.equalsIgnoreCase(n)) {
try {
// allow for Windows
return file.getCanonicalFile().getName().equals(n);
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Oct 03 19:18:54 2013 +0100
@@ -56,6 +56,7 @@
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Kinds.*;
import static com.sun.tools.javac.code.TypeTag.CLASS;
+import static com.sun.tools.javac.code.TypeTag.TYPEVAR;
import static com.sun.tools.javac.jvm.ClassFile.*;
import static com.sun.tools.javac.jvm.ClassFile.Version.*;
@@ -703,6 +704,12 @@
sigp++;
thrown = thrown.prepend(sigToType());
}
+ // if there is a typevar in the throws clause we should state it.
+ for (List<Type> l = thrown; l.nonEmpty(); l = l.tail) {
+ if (l.head.hasTag(TYPEVAR)) {
+ l.head.tsym.flags_field |= THROWS;
+ }
+ }
return new MethodType(argtypes,
restype,
thrown.reverse(),
@@ -1439,8 +1446,7 @@
void attachTypeAnnotations(final Symbol sym) {
int numAttributes = nextChar();
if (numAttributes != 0) {
- ListBuffer<TypeAnnotationProxy> proxies =
- ListBuffer.lb();
+ ListBuffer<TypeAnnotationProxy> proxies = new ListBuffer<>();
for (int i = 0; i < numAttributes; i++)
proxies.append(readTypeAnnotation());
annotate.normal(new TypeAnnotationCompleter(sym, proxies.toList()));
@@ -1589,7 +1595,7 @@
{ // See whether there is location info and read it
int len = nextByte();
- ListBuffer<Integer> loc = ListBuffer.lb();
+ ListBuffer<Integer> loc = new ListBuffer<>();
for (int i = 0; i < len * TypeAnnotationPosition.TypePathEntry.bytesPerEntry; ++i)
loc = loc.append(nextByte());
position.location = TypeAnnotationPosition.getTypePathFromBinary(loc.toList());
@@ -1939,7 +1945,7 @@
}
List<Attribute.TypeCompound> deproxyTypeCompoundList(List<TypeAnnotationProxy> proxies) {
- ListBuffer<Attribute.TypeCompound> buf = ListBuffer.lb();
+ ListBuffer<Attribute.TypeCompound> buf = new ListBuffer<>();
for (TypeAnnotationProxy proxy: proxies) {
Attribute.Compound compound = deproxyCompound(proxy.compound);
Attribute.TypeCompound typeCompound = new Attribute.TypeCompound(compound, proxy.position);
@@ -2026,7 +2032,7 @@
boolean isVarargs = (flags & VARARGS) != 0;
if (isVarargs) {
Type varargsElem = args.last();
- ListBuffer<Type> adjustedArgs = ListBuffer.lb();
+ ListBuffer<Type> adjustedArgs = new ListBuffer<>();
for (Type t : args) {
adjustedArgs.append(t != varargsElem ?
t :
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -766,8 +766,8 @@
int writeTypeAnnotations(List<Attribute.TypeCompound> typeAnnos, boolean inCode) {
if (typeAnnos.isEmpty()) return 0;
- ListBuffer<Attribute.TypeCompound> visibles = ListBuffer.lb();
- ListBuffer<Attribute.TypeCompound> invisibles = ListBuffer.lb();
+ ListBuffer<Attribute.TypeCompound> visibles = new ListBuffer<>();
+ ListBuffer<Attribute.TypeCompound> invisibles = new ListBuffer<>();
for (Attribute.TypeCompound tc : typeAnnos) {
if (tc.hasUnknownPosition()) {
--- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Oct 03 19:18:54 2013 +0100
@@ -1595,7 +1595,7 @@
public void compressCatchTable() {
- ListBuffer<char[]> compressedCatchInfo = ListBuffer.lb();
+ ListBuffer<char[]> compressedCatchInfo = new ListBuffer<>();
List<Integer> handlerPcs = List.nil();
for (char[] catchEntry : catchInfo) {
handlerPcs = handlerPcs.prepend((int)catchEntry[2]);
--- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu Oct 03 19:18:54 2013 +0100
@@ -67,7 +67,6 @@
import static com.sun.tools.javac.code.TypeTag.CLASS;
import static com.sun.tools.javac.main.Option.*;
import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*;
-import static com.sun.tools.javac.util.ListBuffer.lb;
/** This class could be the main entry point for GJC when GJC is used as a
@@ -586,7 +585,7 @@
}
protected final <T> Queue<T> stopIfError(CompileState cs, Queue<T> queue) {
- return shouldStop(cs) ? ListBuffer.<T>lb() : queue;
+ return shouldStop(cs) ? new ListBuffer<T>() : queue;
}
protected final <T> List<T> stopIfError(CompileState cs, List<T> list) {
@@ -952,7 +951,7 @@
return List.nil();
//parse all files
- ListBuffer<JCCompilationUnit> trees = lb();
+ ListBuffer<JCCompilationUnit> trees = new ListBuffer<>();
Set<JavaFileObject> filesSoFar = new HashSet<JavaFileObject>();
for (JavaFileObject fileObject : fileObjects) {
if (!filesSoFar.contains(fileObject)) {
@@ -1002,7 +1001,7 @@
// then remember the classes declared in
// the original compilation units listed on the command line.
if (needRootClasses || sourceOutput || stubOutput) {
- ListBuffer<JCClassDecl> cdefs = lb();
+ ListBuffer<JCClassDecl> cdefs = new ListBuffer<>();
for (JCCompilationUnit unit : roots) {
for (List<JCTree> defs = unit.defs;
defs.nonEmpty();
@@ -1226,7 +1225,7 @@
* @returns a list of environments for attributd classes.
*/
public Queue<Env<AttrContext>> attribute(Queue<Env<AttrContext>> envs) {
- ListBuffer<Env<AttrContext>> results = lb();
+ ListBuffer<Env<AttrContext>> results = new ListBuffer<>();
while (!envs.isEmpty())
results.append(attribute(envs.remove()));
return stopIfError(CompileState.ATTR, results);
@@ -1291,7 +1290,7 @@
* @returns the list of attributed parse trees
*/
public Queue<Env<AttrContext>> flow(Queue<Env<AttrContext>> envs) {
- ListBuffer<Env<AttrContext>> results = lb();
+ ListBuffer<Env<AttrContext>> results = new ListBuffer<>();
for (Env<AttrContext> env: envs) {
flow(env, results);
}
@@ -1302,7 +1301,7 @@
* Perform dataflow checks on an attributed parse tree.
*/
public Queue<Env<AttrContext>> flow(Env<AttrContext> env) {
- ListBuffer<Env<AttrContext>> results = lb();
+ ListBuffer<Env<AttrContext>> results = new ListBuffer<>();
flow(env, results);
return stopIfError(CompileState.FLOW, results);
}
@@ -1356,7 +1355,7 @@
* @returns a list containing the classes to be generated
*/
public Queue<Pair<Env<AttrContext>, JCClassDecl>> desugar(Queue<Env<AttrContext>> envs) {
- ListBuffer<Pair<Env<AttrContext>, JCClassDecl>> results = lb();
+ ListBuffer<Pair<Env<AttrContext>, JCClassDecl>> results = new ListBuffer<>();
for (Env<AttrContext> env: envs)
desugar(env, results);
return stopIfError(CompileState.FLOW, results);
@@ -1605,7 +1604,7 @@
}
@Override
public void visitClassDef(JCClassDecl tree) {
- ListBuffer<JCTree> newdefs = lb();
+ ListBuffer<JCTree> newdefs = new ListBuffer<>();
for (List<JCTree> it = tree.defs; it.tail != null; it = it.tail) {
JCTree t = it.head;
switch (t.getTag()) {
--- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacAnnoConstructs.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacAnnoConstructs.java Thu Oct 03 19:18:54 2013 +0100
@@ -207,7 +207,7 @@
Attribute[] contained0 = null;
if (container != null)
contained0 = unpackAttributes(container);
- ListBuffer<Attribute.Compound> compounds = ListBuffer.lb();
+ ListBuffer<Attribute.Compound> compounds = new ListBuffer<>();
if (contained0 != null) {
for (Attribute a : contained0)
if (a instanceof Attribute.Compound)
@@ -328,7 +328,7 @@
Attribute[] contained0 = null;
if (container != null)
contained0 = unpackAttributes(container);
- ListBuffer<Attribute.Compound> compounds = ListBuffer.lb();
+ ListBuffer<Attribute.Compound> compounds = new ListBuffer<>();
if (contained0 != null) {
for (Attribute a : contained0)
if (a instanceof Attribute.Compound)
--- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java Thu Oct 03 19:18:54 2013 +0100
@@ -116,11 +116,7 @@
public List<Type> directSupertypes(TypeMirror t) {
validateTypeNotIn(t, EXEC_OR_PKG);
- Type type = (Type) t;
- Type sup = types.supertype(type);
- return (sup == Type.noType || sup == type || sup == null)
- ? types.interfaces(type)
- : types.interfaces(type).prepend(sup);
+ return types.directSupertypes((Type) t);
}
public TypeMirror erasure(TypeMirror t) {
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Oct 03 19:18:54 2013 +0100
@@ -48,7 +48,6 @@
import static com.sun.tools.javac.parser.Tokens.TokenKind.IMPORT;
import static com.sun.tools.javac.parser.Tokens.TokenKind.LT;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
-import static com.sun.tools.javac.util.ListBuffer.lb;
/** The parser maps a token sequence into an abstract syntax
* tree. It operates by recursive descent, with code derived
@@ -1767,7 +1766,7 @@
/** Arguments = "(" [Expression { COMMA Expression }] ")"
*/
List<JCExpression> arguments() {
- ListBuffer<JCExpression> args = lb();
+ ListBuffer<JCExpression> args = new ListBuffer<>();
if (token.kind == LPAREN) {
nextToken();
if (token.kind != RPAREN) {
@@ -1834,7 +1833,7 @@
nextToken();
return List.nil();
} else {
- ListBuffer<JCExpression> args = ListBuffer.lb();
+ ListBuffer<JCExpression> args = new ListBuffer<>();
args.append(((mode & EXPR) == 0) ? typeArgument() : parseType());
while (token.kind == COMMA) {
nextToken();
@@ -2175,7 +2174,7 @@
ListBuffer<JCExpression> dims = new ListBuffer<JCExpression>();
// maintain array dimension type annotations
- ListBuffer<List<JCAnnotation>> dimAnnotations = ListBuffer.lb();
+ ListBuffer<List<JCAnnotation>> dimAnnotations = new ListBuffer<>();
dimAnnotations.append(annos);
dims.append(parseExpression());
@@ -2626,7 +2625,7 @@
}
List<JCExpression> catchTypes() {
- ListBuffer<JCExpression> catchTypes = ListBuffer.lb();
+ ListBuffer<JCExpression> catchTypes = new ListBuffer<>();
catchTypes.add(parseType());
while (token.kind == BAR) {
checkMulticatch();
@@ -2708,7 +2707,7 @@
* | { FINAL | '@' Annotation } Type VariableDeclarators
*/
List<JCStatement> forInit() {
- ListBuffer<JCStatement> stats = lb();
+ ListBuffer<JCStatement> stats = new ListBuffer<>();
int pos = token.pos;
if (token.kind == FINAL || token.kind == MONKEYS_AT) {
return variableDeclarators(optFinal(0), parseType(), stats).toList();
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/Tokens.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/Tokens.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -402,7 +402,7 @@
if (comments == null) {
return List.nil();
} else {
- ListBuffer<Comment> buf = ListBuffer.lb();
+ ListBuffer<Comment> buf = new ListBuffer<>();
for (Comment c : comments) {
if (c.getStyle() == style) {
buf.add(c);
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -525,9 +525,6 @@
compiler.misc.incompatible.ret.type.in.mref=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u306E\u623B\u308A\u578B\u304C\u4E0D\u6B63\u3067\u3059\n{0}
# 0: list of type
-compiler.err.incompatible.thrown.types.in.lambda=\u30E9\u30E0\u30C0\u5F0F\u3067\u30B9\u30ED\u30FC\u3055\u308C\u305F\u30BF\u30A4\u30D7{0}\u306F\u4E0D\u9069\u5408\u3067\u3059
-
-# 0: list of type
compiler.err.incompatible.thrown.types.in.mref=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u306E\u30B9\u30ED\u30FC\u3055\u308C\u305F\u30BF\u30A4\u30D7{0}\u306F\u4E0D\u9069\u5408\u3067\u3059
compiler.misc.incompatible.arg.types.in.lambda=\u30E9\u30E0\u30C0\u5F0F\u306E\u30D1\u30E9\u30E1\u30FC\u30BF\u578B\u306F\u4E0D\u9069\u5408\u3067\u3059
@@ -642,12 +639,18 @@
# 0: symbol, 1: set of modifier, 2: symbol
compiler.err.report.access={0}\u306F{2}\u3067{1}\u30A2\u30AF\u30BB\u30B9\u3055\u308C\u307E\u3059
+# 0: symbol, 1: set of modifier, 2: symbol
+compiler.misc.report.access={0}\u306F{2}\u3067{1}\u30A2\u30AF\u30BB\u30B9\u3055\u308C\u307E\u3059
+
compiler.err.ret.outside.meth=\u30E1\u30BD\u30C3\u30C9\u306E\u5916\u306Ereturn\u6587\u3067\u3059
compiler.err.signature.doesnt.match.supertype=\u30B7\u30B0\u30CD\u30C1\u30E3\u304C{0}\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u4E0D\u9069\u5408\u306A\u30B9\u30FC\u30D1\u30FC\u30BF\u30A4\u30D7\u3067\u3059
compiler.err.signature.doesnt.match.intf=\u30B7\u30B0\u30CD\u30C1\u30E3\u304C{0}\u306B\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u4E0D\u9069\u5408\u306A\u30A4\u30F3\u30BF\u30D5\u30A7\u30FC\u30B9\u3067\u3059
+# 0: number, 1: number
+compiler.err.method.invoked.with.incorrect.number.arguments=\u30E1\u30BD\u30C3\u30C9\u3092\u8D77\u52D5\u3057\u305F\u5F15\u6570\u306E\u6570\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002\u4E88\u671F\u3055\u308C\u308B\u6570\u306F{0}\u3067\u3059\u304C\u3001{1}\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F
+
# 0: symbol, 1: symbol, 2: symbol
compiler.err.does.not.override.abstract={0}\u306Fabstract\u3067\u306A\u304F\u3001{2}\u5185\u306Eabstract\u30E1\u30BD\u30C3\u30C9{1}\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3057\u307E\u305B\u3093
@@ -756,6 +759,9 @@
compiler.err.var.might.not.have.been.initialized=\u5909\u6570{0}\u306F\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059
# 0: symbol
+compiler.err.var.not.initialized.in.default.constructor=\u5909\u6570{0}\u306F\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u3067\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+
+# 0: symbol
compiler.err.var.might.be.assigned.in.loop=\u5909\u6570{0}\u306F\u30EB\u30FC\u30D7\u5185\u3067\u4EE3\u5165\u3055\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059
# 0: symbol, 1: message segment
@@ -829,6 +835,14 @@
compiler.note.potential.lambda.found=\u3053\u306E\u533F\u540D\u5185\u90E8\u30AF\u30E9\u30B9\u3092\u30E9\u30E0\u30C0\u5F0F\u306B\u5909\u63DB\u3067\u304D\u307E\u3059\u3002
+# 0: boolean, 1: symbol
+compiler.note.lambda.stat=\u30E9\u30E0\u30C0\u5F0F\u3092\u5909\u63DB\u3057\u3066\u3044\u307E\u3059\n\u4EE3\u66FFmetafactory = {0}\n\u5408\u6210\u30E1\u30BD\u30C3\u30C9 = {1}
+
+# 0: boolean, 1: unused
+compiler.note.mref.stat=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u3092\u5909\u63DB\u3057\u3066\u3044\u307E\u3059\n\u4EE3\u66FFmetafactory = {0}\n
+# 0: boolean, 1: symbol
+compiler.note.mref.stat.1=\u30E1\u30BD\u30C3\u30C9\u53C2\u7167\u3092\u5909\u63DB\u3057\u3066\u3044\u307E\u3059\n\u4EE3\u66FFmetafactory = {0}\n\u30D6\u30EA\u30C3\u30B8\u30FB\u30E1\u30BD\u30C3\u30C9 = {1}
+
compiler.note.note=\u6CE8\u610F:
# 0: file name
@@ -1015,6 +1029,14 @@
# 0: string
compiler.warn.source.no.bootclasspath=\u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9\u304C-source {0}\u3068\u4E00\u7DD2\u306B\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
+# 0: string
+compiler.warn.option.obsolete.source=\u30BD\u30FC\u30B9\u5024{0}\u306F\u5EC3\u6B62\u3055\u308C\u3066\u3044\u3066\u3001\u4ECA\u5F8C\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059
+
+# 0: string
+compiler.warn.option.obsolete.target=\u30BF\u30FC\u30B2\u30C3\u30C8\u5024{0}\u306F\u5EC3\u6B62\u3055\u308C\u3066\u3044\u3066\u3001\u4ECA\u5F8C\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u524A\u9664\u3055\u308C\u308B\u4E88\u5B9A\u3067\u3059
+
+compiler.warn.option.obsolete.suppression=\u5EC3\u6B62\u3055\u308C\u305F\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u3064\u3044\u3066\u306E\u8B66\u544A\u3092\u8868\u793A\u3057\u306A\u3044\u3088\u3046\u306B\u3059\u308B\u306B\u306F\u3001-Xlint:\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
+
# 0: name, 1: number, 2: number, 3: number, 4: number
compiler.warn.future.attr=\u30D0\u30FC\u30B8\u30E7\u30F3{1}.{2}\u306E\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3067\u5C0E\u5165\u3055\u308C\u305F{0}\u5C5E\u6027\u306F\u3001\u30D0\u30FC\u30B8\u30E7\u30F3{3}.{4}\u306E\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u7121\u8996\u3055\u308C\u307E\u3059
@@ -1550,7 +1572,7 @@
compiler.warn.assert.as.identifier=\u30EA\u30EA\u30FC\u30B91.4\u304B\u3089''assert''\u306F\u30AD\u30FC\u30EF\u30FC\u30C9\u306A\u306E\u3067\u3001\u8B58\u5225\u5B50\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\n(''assert''\u3092\u30AD\u30FC\u30EF\u30FC\u30C9\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u306B\u306F\u3001-source 1.4\u4EE5\u964D\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044)
-compiler.warn.underscore.as.identifier=\u8B58\u5225\u5B50\u3068\u3057\u3066''_''\u304C\u4F7F\u7528\u3055\u308C\u307E\u3057\u305F\n(\u8B58\u5225\u5B50\u3068\u3057\u3066\u306E''_''\u306E\u4F7F\u7528\u306F\u3001\u5C06\u6765\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059)
+compiler.warn.underscore.as.identifier=\u8B58\u5225\u5B50\u3068\u3057\u3066''_''\u304C\u4F7F\u7528\u3055\u308C\u307E\u3057\u305F\n(\u8B58\u5225\u5B50\u3068\u3057\u3066\u306E''_''\u306E\u4F7F\u7528\u306F\u3001Java SE 8\u3088\u308A\u5F8C\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u306A\u3044\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059)
compiler.err.enum.as.identifier=\u30EA\u30EA\u30FC\u30B95\u304B\u3089''enum''\u306F\u30AD\u30FC\u30EF\u30FC\u30C9\u306A\u306E\u3067\u8B58\u5225\u5B50\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\n(''enum''\u3092\u8B58\u5225\u5B50\u3068\u3057\u3066\u4F7F\u7528\u3059\u308B\u306B\u306F-source 1.4\u4EE5\u524D\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044)
@@ -1567,7 +1589,7 @@
# TODO 308: make a better error message
# 0: unused
-compiler.err.cant.annotate.nested.type=\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30BF\u30A4\u30D7\u306F\u6CE8\u91C8\u4ED8\u3051\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093
+compiler.err.cant.annotate.nested.type=static\u306E\u30CD\u30B9\u30C8\u3055\u308C\u305F\u30BF\u30A4\u30D7\u306E\u30B9\u30B3\u30FC\u30D7\u30FB\u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30C8\u306B\u306F\u6CE8\u91C8\u4ED8\u3051\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093
# 0: type, 1: type
compiler.err.incorrect.receiver.name=\u53D7\u53D6\u308A\u5074\u306E\u540D\u524D\u304C\u3001\u5305\u542B\u3059\u308B\u30AF\u30E9\u30B9\u30FB\u30BF\u30A4\u30D7\u3068\u4E00\u81F4\u3057\u307E\u305B\u3093\n\u5FC5\u9808: {0}\n\u691C\u51FA: {1}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -525,9 +525,6 @@
compiler.misc.incompatible.ret.type.in.mref=\u65B9\u6CD5\u5F15\u7528\u4E2D\u7684\u8FD4\u56DE\u7C7B\u578B\u9519\u8BEF\n{0}
# 0: list of type
-compiler.err.incompatible.thrown.types.in.lambda=lambda \u8868\u8FBE\u5F0F\u4E2D\u629B\u51FA\u7684\u7C7B\u578B{0}\u4E0D\u517C\u5BB9
-
-# 0: list of type
compiler.err.incompatible.thrown.types.in.mref=\u65B9\u6CD5\u5F15\u7528\u4E2D\u629B\u51FA\u7684\u7C7B\u578B{0}\u4E0D\u517C\u5BB9
compiler.misc.incompatible.arg.types.in.lambda=lambda \u8868\u8FBE\u5F0F\u4E2D\u7684\u53C2\u6570\u7C7B\u578B\u4E0D\u517C\u5BB9
@@ -642,12 +639,18 @@
# 0: symbol, 1: set of modifier, 2: symbol
compiler.err.report.access={0}\u53EF\u4EE5\u5728{2}\u4E2D\u8BBF\u95EE{1}
+# 0: symbol, 1: set of modifier, 2: symbol
+compiler.misc.report.access={0}\u53EF\u4EE5\u5728{2}\u4E2D\u8BBF\u95EE{1}
+
compiler.err.ret.outside.meth=\u8FD4\u56DE\u5916\u90E8\u65B9\u6CD5
compiler.err.signature.doesnt.match.supertype=\u7B7E\u540D\u4E0E{0}\u4E0D\u5339\u914D; \u4E0D\u517C\u5BB9\u7684\u8D85\u7C7B\u578B
compiler.err.signature.doesnt.match.intf=\u7B7E\u540D\u4E0E{0}\u4E0D\u5339\u914D; \u4E0D\u517C\u5BB9\u7684\u63A5\u53E3
+# 0: number, 1: number
+compiler.err.method.invoked.with.incorrect.number.arguments=\u4F7F\u7528\u4E0D\u6B63\u786E\u6570\u91CF\u7684\u53C2\u6570\u8C03\u7528\u4E86\u65B9\u6CD5; \u9884\u671F\u4E3A {0} \u4E2A, \u627E\u5230 {1} \u4E2A
+
# 0: symbol, 1: symbol, 2: symbol
compiler.err.does.not.override.abstract={0}\u4E0D\u662F\u62BD\u8C61\u7684, \u5E76\u4E14\u672A\u8986\u76D6{2}\u4E2D\u7684\u62BD\u8C61\u65B9\u6CD5{1}
@@ -756,6 +759,9 @@
compiler.err.var.might.not.have.been.initialized=\u53EF\u80FD\u5C1A\u672A\u521D\u59CB\u5316\u53D8\u91CF{0}
# 0: symbol
+compiler.err.var.not.initialized.in.default.constructor=\u53D8\u91CF {0} \u672A\u5728\u9ED8\u8BA4\u6784\u9020\u5668\u4E2D\u521D\u59CB\u5316
+
+# 0: symbol
compiler.err.var.might.be.assigned.in.loop=\u53EF\u80FD\u5728 loop \u4E2D\u5206\u914D\u4E86\u53D8\u91CF{0}
# 0: symbol, 1: message segment
@@ -829,6 +835,14 @@
compiler.note.potential.lambda.found=\u53EF\u5C06\u6B64\u533F\u540D\u5185\u90E8\u7C7B\u521B\u5EFA\u8F6C\u6362\u4E3A lambda \u8868\u8FBE\u5F0F\u3002
+# 0: boolean, 1: symbol
+compiler.note.lambda.stat=\u8F6C\u6362 lambda \u8868\u8FBE\u5F0F\n\u66FF\u4EE3 metafactory = {0}\n\u5408\u6210\u65B9\u6CD5 = {1}
+
+# 0: boolean, 1: unused
+compiler.note.mref.stat=\u8F6C\u6362\u65B9\u6CD5\u5F15\u7528\n\u66FF\u4EE3 metafactory = {0}\n
+# 0: boolean, 1: symbol
+compiler.note.mref.stat.1=\u8F6C\u6362\u65B9\u6CD5\u5F15\u7528\n\u66FF\u4EE3 metafactory = {0}\nbridge \u65B9\u6CD5 = {1}
+
compiler.note.note=\u6CE8:
# 0: file name
@@ -1015,6 +1029,14 @@
# 0: string
compiler.warn.source.no.bootclasspath=\u672A\u4E0E -source {0} \u4E00\u8D77\u8BBE\u7F6E\u5F15\u5BFC\u7C7B\u8DEF\u5F84
+# 0: string
+compiler.warn.option.obsolete.source=\u6E90\u503C{0}\u5DF2\u8FC7\u65F6, \u5C06\u5728\u672A\u6765\u6240\u6709\u53D1\u884C\u7248\u4E2D\u5220\u9664
+
+# 0: string
+compiler.warn.option.obsolete.target=\u76EE\u6807\u503C{0}\u5DF2\u8FC7\u65F6, \u5C06\u5728\u672A\u6765\u6240\u6709\u53D1\u884C\u7248\u4E2D\u5220\u9664
+
+compiler.warn.option.obsolete.suppression=\u8981\u9690\u85CF\u6709\u5173\u5DF2\u8FC7\u65F6\u9009\u9879\u7684\u8B66\u544A, \u8BF7\u4F7F\u7528 -Xlint:-options\u3002
+
# 0: name, 1: number, 2: number, 3: number, 4: number
compiler.warn.future.attr={1}.{2} \u7248\u7C7B\u6587\u4EF6\u4E2D\u5F15\u5165\u7684 {0} \u5C5E\u6027\u5728 {3}.{4} \u7248\u7C7B\u6587\u4EF6\u4E2D\u88AB\u5FFD\u7565
@@ -1550,7 +1572,7 @@
compiler.warn.assert.as.identifier=\u4ECE\u53D1\u884C\u7248 1.4 \u5F00\u59CB, ''assert'' \u662F\u4E00\u4E2A\u5173\u952E\u5B57, \u4F46\u4E0D\u80FD\u7528\u4F5C\u6807\u8BC6\u7B26\n(\u8BF7\u4F7F\u7528 -source 1.4 \u6216\u66F4\u9AD8\u7248\u672C\u4EE5\u5C06 ''assert'' \u7528\u4F5C\u5173\u952E\u5B57)
-compiler.warn.underscore.as.identifier=''_'' \u5DF2\u7528\u4F5C\u6807\u8BC6\u7B26\n(\u4EE5\u540E\u7684\u53D1\u884C\u7248\u53EF\u80FD\u4E0D\u652F\u6301\u5C06 ''_'' \u7528\u4F5C\u6807\u8BC6\u7B26)
+compiler.warn.underscore.as.identifier=''_'' \u7528\u4F5C\u6807\u8BC6\u7B26\n(Java SE 8 \u4E4B\u540E\u7684\u53D1\u884C\u7248\u4E2D\u53EF\u80FD\u4E0D\u652F\u6301\u4F7F\u7528 ''_'' \u4F5C\u4E3A\u6807\u8BC6\u7B26)
compiler.err.enum.as.identifier=\u4ECE\u53D1\u884C\u7248 5 \u5F00\u59CB, ''enum'' \u4E3A\u5173\u952E\u5B57, \u800C\u4E0D\u7528\u4F5C\u6807\u8BC6\u7B26\n(\u8BF7\u4F7F\u7528 -source 1.4 \u6216\u66F4\u4F4E\u7248\u672C\u4EE5\u5C06 ''enum'' \u7528\u4F5C\u6807\u8BC6\u7B26)
@@ -1567,7 +1589,7 @@
# TODO 308: make a better error message
# 0: unused
-compiler.err.cant.annotate.nested.type=\u65E0\u6CD5\u5BF9\u5D4C\u5957\u7C7B\u578B\u8FDB\u884C\u6CE8\u91CA
+compiler.err.cant.annotate.nested.type=\u65E0\u6CD5\u6CE8\u91CA\u7528\u4E8E\u9759\u6001\u5D4C\u5957\u7C7B\u578B\u7684\u786E\u5B9A\u4F5C\u7528\u57DF\u7ED3\u6784
# 0: type, 1: type
compiler.err.incorrect.receiver.name=\u63A5\u6536\u65B9\u540D\u79F0\u4E0E\u5C01\u95ED\u7C7B\u7C7B\u578B\u4E0D\u5339\u914D\n\u9700\u8981: {0}\n\u627E\u5230: {1}
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -87,8 +87,12 @@
javac.opt.Xlint=\u63A8\u5968\u306E\u8B66\u544A\u3092\u6709\u52B9\u306B\u3059\u308B
javac.opt.Xlint.suboptlist=\u7279\u5B9A\u306E\u8B66\u544A\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3059\u308B
javac.opt.Xdoclint=javadoc\u30B3\u30E1\u30F3\u30C8\u306E\u554F\u984C\u306B\u95A2\u3059\u308B\u63A8\u5968\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u306B\u3059\u308B
-javac.opt.Xdoclint.subopts = (all|[-]<group>)[/<access>]
-javac.opt.Xdoclint.custom=\n javadoc\u30B3\u30E1\u30F3\u30C8\u306E\u554F\u984C\u306B\u95A2\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n \u3053\u3053\u3067\u3001<group>\u306Faccessibility\u3001html\u3001reference\u307E\u305F\u306Fsyntax\u306E\u3044\u305A\u308C\u304B\u3067\u3001\n <access>\u306Fpublic\u3001protected\u3001package\u307E\u305F\u306Fprivate\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002
+# L10N: do not localize: all none
+javac.opt.Xdoclint.subopts = (all|none|[-]<group>)[/<access>]
+
+# L10N: do not localize: accessibility html missing reference syntax
+# L10N: do not localize: public protected package private
+javac.opt.Xdoclint.custom=\n javadoc\u30B3\u30E1\u30F3\u30C8\u306E\u554F\u984C\u306B\u95A2\u3059\u308B\u7279\u5B9A\u306E\u30C1\u30A7\u30C3\u30AF\u3092\u6709\u52B9\u307E\u305F\u306F\u7121\u52B9\u306B\u3057\u307E\u3059\u3002\n \u3053\u3053\u3067\u3001<group>\u306Faccessibility\u3001html\u3001missing\u3001reference\u307E\u305F\u306Fsyntax\u306E\u3044\u305A\u308C\u304B\u3067\u3001\n <access>\u306Fpublic\u3001protected\u3001package\u307E\u305F\u306Fprivate\u306E\u3044\u305A\u308C\u304B\u3067\u3059\u3002
javac.opt.Xstdout=\u6A19\u6E96\u51FA\u529B\u3092\u30EA\u30C0\u30A4\u30EC\u30AF\u30C8\u3059\u308B
javac.opt.X=\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3059\u308B
javac.opt.help=\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3059\u308B
@@ -105,6 +109,7 @@
javac.err.invalid.arg={0}\u306F\u7121\u52B9\u306A\u5F15\u6570\u3067\u3059
javac.err.invalid.A.key=\u6CE8\u91C8\u30D7\u30ED\u30BB\u30C3\u30B5\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3''{0}''\u306E\u30AD\u30FC\u306B\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u4E00\u9023\u306E\u8B58\u5225\u5B50\u304C\u3001\u30C9\u30C3\u30C8\u3067\u533A\u5207\u3089\u308C\u3066\u3044\u307E\u305B\u3093
javac.err.invalid.flag={0}\u306F\u7121\u52B9\u306A\u30D5\u30E9\u30B0\u3067\u3059
+javac.err.profile.bootclasspath.conflict=profile\u3068bootclasspath\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u540C\u6642\u306B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
javac.err.invalid.profile=\u7121\u52B9\u306A\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB: {0}
javac.err.invalid.target={0}\u306F\u7121\u52B9\u306A\u30BF\u30FC\u30B2\u30C3\u30C8\u30FB\u30EA\u30EA\u30FC\u30B9\u3067\u3059
javac.err.no.source.files=\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093
--- a/langtools/src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -87,8 +87,12 @@
javac.opt.Xlint=\u542F\u7528\u5EFA\u8BAE\u7684\u8B66\u544A
javac.opt.Xlint.suboptlist=\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u7684\u8B66\u544A
javac.opt.Xdoclint=\u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u5EFA\u8BAE\u7684\u68C0\u67E5
-javac.opt.Xdoclint.subopts = (all|[-]<group>)[/<access>]
-javac.opt.Xdoclint.custom=\n \u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5,\n \u5176\u4E2D <group> \u4E3A\u53EF\u8BBF\u95EE\u6027, html, \u5F15\u7528\u6216\u8BED\u6CD5\u4E4B\u4E00,\n <access> \u4E3A public, protected, package \u6216 private \u4E4B\u4E00\u3002
+# L10N: do not localize: all none
+javac.opt.Xdoclint.subopts = (all|none|[-]<group>)[/<access>]
+
+# L10N: do not localize: accessibility html missing reference syntax
+# L10N: do not localize: public protected package private
+javac.opt.Xdoclint.custom=\n \u4E3A javadoc \u6CE8\u91CA\u4E2D\u7684\u95EE\u9898\u542F\u7528\u6216\u7981\u7528\u7279\u5B9A\u68C0\u67E5,\n \u5176\u4E2D <group> \u4E3A accessibility, html, missing, reference \u6216 syntax \u4E4B\u4E00\u3002\n <access> \u4E3A public, protected, package \u6216 private \u4E4B\u4E00\u3002
javac.opt.Xstdout=\u91CD\u5B9A\u5411\u6807\u51C6\u8F93\u51FA
javac.opt.X=\u8F93\u51FA\u975E\u6807\u51C6\u9009\u9879\u7684\u63D0\u8981
javac.opt.help=\u8F93\u51FA\u6807\u51C6\u9009\u9879\u7684\u63D0\u8981
@@ -105,6 +109,7 @@
javac.err.invalid.arg=\u65E0\u6548\u7684\u53C2\u6570: {0}
javac.err.invalid.A.key=\u6CE8\u91CA\u5904\u7406\u7A0B\u5E8F\u9009\u9879 ''{0}'' \u4E2D\u7684\u5173\u952E\u5B57\u4E0D\u662F\u4EE5\u70B9\u5206\u9694\u7684\u6807\u8BC6\u7B26\u5E8F\u5217
javac.err.invalid.flag=\u65E0\u6548\u7684\u6807\u8BB0: {0}
+javac.err.profile.bootclasspath.conflict=\u6982\u8981\u4FE1\u606F\u548C\u5F15\u5BFC\u7C7B\u8DEF\u5F84\u9009\u9879\u4E0D\u80FD\u540C\u65F6\u4F7F\u7528
javac.err.invalid.profile=\u914D\u7F6E\u6587\u4EF6\u65E0\u6548: {0}
javac.err.invalid.target=\u65E0\u6548\u7684\u76EE\u6807\u53D1\u884C\u7248: {0}
javac.err.no.source.files=\u65E0\u6E90\u6587\u4EF6
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java Thu Oct 03 19:18:54 2013 +0100
@@ -234,7 +234,7 @@
public JCTree visitLabeledStatement(LabeledStatementTree node, P p) {
JCLabeledStatement t = (JCLabeledStatement) node;
JCStatement body = copy(t.body, p);
- return M.at(t.pos).Labelled(t.label, t.body);
+ return M.at(t.pos).Labelled(t.label, body);
}
public JCTree visitLiteral(LiteralTree node, P p) {
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java Thu Oct 03 19:18:54 2013 +0100
@@ -946,6 +946,7 @@
boolean isUnqualifiable(Symbol sym) {
if (sym.name == names.empty ||
sym.owner == null ||
+ sym.owner == syms.rootPackage ||
sym.owner.kind == MTH || sym.owner.kind == VAR) {
return true;
} else if (sym.kind == TYP && toplevel != null) {
--- a/langtools/src/share/classes/com/sun/tools/javac/util/GraphUtils.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/GraphUtils.java Thu Oct 03 19:18:54 2013 +0100
@@ -103,8 +103,8 @@
* directed graph in linear time. Works on TarjanNode.
*/
public static <D, N extends TarjanNode<D>> List<? extends List<? extends N>> tarjan(Iterable<? extends N> nodes) {
- ListBuffer<List<N>> cycles = ListBuffer.lb();
- ListBuffer<N> stack = ListBuffer.lb();
+ ListBuffer<List<N>> cycles = new ListBuffer<>();
+ ListBuffer<N> stack = new ListBuffer<>();
int index = 0;
for (N node: nodes) {
if (node.index == -1) {
@@ -132,7 +132,7 @@
}
if (v.lowlink == v.index) {
N n;
- ListBuffer<N> cycle = ListBuffer.lb();
+ ListBuffer<N> cycle = new ListBuffer<>();
do {
n = stack.remove();
n.active = false;
--- a/langtools/src/share/classes/com/sun/tools/javac/util/List.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/List.java Thu Oct 03 19:18:54 2013 +0100
@@ -97,7 +97,7 @@
}
public List<A> intersect(List<A> that) {
- ListBuffer<A> buf = ListBuffer.lb();
+ ListBuffer<A> buf = new ListBuffer<>();
for (A el : this) {
if (that.contains(el)) {
buf.append(el);
@@ -107,7 +107,7 @@
}
public List<A> diff(List<A> that) {
- ListBuffer<A> buf = ListBuffer.lb();
+ ListBuffer<A> buf = new ListBuffer<>();
for (A el : this) {
if (!that.contains(el)) {
buf.append(el);
@@ -120,7 +120,7 @@
* Create a new list from the first {@code n} elements of this list
*/
public List<A> take(int n) {
- ListBuffer<A> buf = ListBuffer.lb();
+ ListBuffer<A> buf = new ListBuffer<>();
int count = 0;
for (A el : this) {
if (count++ == n) break;
@@ -167,7 +167,7 @@
}
public static <A> List<A> from(Iterable<? extends A> coll) {
- ListBuffer<A> xs = ListBuffer.lb();
+ ListBuffer<A> xs = new ListBuffer<>();
for (A a : coll) {
xs.append(a);
}
--- a/langtools/src/share/classes/com/sun/tools/javac/util/ListBuffer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/ListBuffer.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -40,10 +40,6 @@
*/
public class ListBuffer<A> extends AbstractQueue<A> {
- public static <T> ListBuffer<T> lb() {
- return new ListBuffer<T>();
- }
-
public static <T> ListBuffer<T> of(T x) {
ListBuffer<T> lb = new ListBuffer<T>();
lb.add(x);
--- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java Thu Oct 03 19:18:54 2013 +0100
@@ -123,7 +123,7 @@
* active diagnostic handler.
*/
public static class DeferredDiagnosticHandler extends DiagnosticHandler {
- private Queue<JCDiagnostic> deferred = ListBuffer.lb();
+ private Queue<JCDiagnostic> deferred = new ListBuffer<>();
private final Filter<JCDiagnostic> filter;
public DeferredDiagnosticHandler(Log log) {
--- a/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -27,8 +27,13 @@
main.error=\u30A8\u30E9\u30FC{0}\u500B
main.warnings=\u8B66\u544A{0}\u500B
main.warning=\u8B66\u544A{0}\u500B
-main.usage=\u4F7F\u7528\u65B9\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n-overview <file> HTML\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u6982\u8981\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u3080\n-public public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u793A\u3059\n-protected protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8)\n-package package/protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n-private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n-help \u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n-doclet <class> \u4EE3\u66FFdoclet\u3092\u4ECB\u3057\u3066\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n-docletpath <path> doclet\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u63A2\u3059\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n-sourcepath <pathlist> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n-classpath <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n-exclude <pkglist> \u9664\u5916\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u6307\u5B9A\u3059\u308B\n-subpackages <subpkglist> \u518D\u5E30\u7684\u306B\u30ED\u30FC\u30C9\u3059\u308B\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u5B9A\u3059\u308B\n-breakiterator BreakIterator\u3067\u6700\u521D\u306E\u6587\u3092\u8A08\u7B97\u3059\u308B\n-bootclasspath <pathlist> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30ED\u30FC\u30C0\u30FC\u306B\u3088\u308A\u30ED\u30FC\u30C9\u3055\u308C\u305F\n\t\t\t \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n-source <release> \u6307\u5B9A\u3055\u308C\u305F\u30EA\u30EA\u30FC\u30B9\u3068\u30BD\u30FC\u30B9\u306E\u4E92\u63DB\u6027\u3092\u63D0\u4F9B\u3059\u308B\n-extdirs <dirlist> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u305F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n-verbose Javadoc\u306E\u52D5\u4F5C\u306B\u3064\u3044\u3066\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n-locale <name> en_US\u3084en_US_WIN\u306A\u3069\u306E\u4F7F\u7528\u3059\u308B\u30ED\u30B1\u30FC\u30EB\n-encoding <name> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u540D\n-quiet \u72B6\u614B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u306A\u3044\n-J<flag> <flag>\u3092\u5B9F\u884C\u6642\u30B7\u30B9\u30C6\u30E0\u306B\u76F4\u63A5\u6E21\u3059\n-X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3059\u308B\n
-main.Xusage=-Xmaxerrs <number> \u51FA\u529B\u3059\u308B\u30A8\u30E9\u30FC\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n-Xmaxwarns <number> \u51FA\u529B\u3059\u308B\u8B66\u544A\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n\n\u3053\u308C\u3089\u306F\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002
+
+main.usage=\u4F7F\u7528\u65B9\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n -overview <file> HTML\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u6982\u8981\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u3080\n -public public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u793A\u3059\n -protected protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059(\u30C7\u30D5\u30A9\u30EB\u30C8)\n -package package/protected/public\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u793A\u3059\n -help \u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n -doclet <class> \u4EE3\u66FFdoclet\u3092\u4ECB\u3057\u3066\u51FA\u529B\u3092\u751F\u6210\u3059\u308B\n -docletpath <path> doclet\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u63A2\u3059\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -sourcepath <pathlist> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -classpath <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\n -cp <pathlist> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u3042\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B\r\n -exclude <pkglist> \u9664\u5916\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EA\u30B9\u30C8\u3092\u6307\u5B9A\u3059\u308B\n -subpackages <subpkglist> \u518D\u5E30\u7684\u306B\u30ED\u30FC\u30C9\u3059\u308B\u30B5\u30D6\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u6307\u5B9A\u3059\u308B\n -breakiterator BreakIterator\u3067\u6700\u521D\u306E\u6587\u3092\u8A08\u7B97\u3059\u308B\n -bootclasspath <pathlist> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30ED\u30FC\u30C0\u30FC\u306B\u3088\u308A\u30ED\u30FC\u30C9\u3055\u308C\u305F\n \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -source <release> \u6307\u5B9A\u3055\u308C\u305F\u30EA\u30EA\u30FC\u30B9\u3068\u30BD\u30FC\u30B9\u306E\u4E92\u63DB\u6027\u3092\u63D0\u4F9B\u3059\u308B\n -extdirs <dirlist> \u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u305F\u62E1\u5F35\u6A5F\u80FD\u306E\u5834\u6240\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B\n -verbose Javadoc\u306E\u52D5\u4F5C\u306B\u3064\u3044\u3066\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B\n -locale <name> en_US\u3084en_US_WIN\u306A\u3069\u306E\u4F7F\u7528\u3059\u308B\u30ED\u30B1\u30FC\u30EB\n -encoding <name> \u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u30A8\u30F3\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0\u540D\n -quiet \u72B6\u614B\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u306A\u3044\n -J<flag> <flag>\u3092\u5B9F\u884C\u6642\u30B7\u30B9\u30C6\u30E0\u306B\u76F4\u63A5\u6E21\u3059\n -X \u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u6982\u8981\u3092\u51FA\u529B\u3057\u7D42\u4E86\u3059\u308B\n
+
+main.Xusage=\ -Xmaxerrs <number> \u51FA\u529B\u3059\u308B\u30A8\u30E9\u30FC\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n -Xmaxwarns <number> \u51FA\u529B\u3059\u308B\u8B66\u544A\u306E\u6700\u5927\u6570\u3092\u8A2D\u5B9A\u3059\u308B\n
+
+main.Xusage.foot=\u3053\u308C\u3089\u306F\u975E\u6A19\u6E96\u30AA\u30D7\u30B7\u30E7\u30F3\u3067\u3042\u308A\u4E88\u544A\u306A\u3057\u306B\u5909\u66F4\u3055\u308C\u308B\u3053\u3068\u304C\u3042\u308A\u307E\u3059\u3002
+
main.option.already.seen={0}\u30AA\u30D7\u30B7\u30E7\u30F3\u304C\u8907\u6570\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002
main.requires_argument=\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059\u3002
main.locale_first=\u30AA\u30D7\u30B7\u30E7\u30F3-locale\u306F\u3001\u30B3\u30DE\u30F3\u30C9\u30E9\u30A4\u30F3\u306E\u6700\u521D\u306B\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002
--- a/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -27,8 +27,13 @@
main.error={0} \u4E2A\u9519\u8BEF
main.warnings={0} \u4E2A\u8B66\u544A
main.warning={0} \u4E2A\u8B66\u544A
-main.usage=\u7528\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n-overview <file> \u4ECE HTML \u6587\u4EF6\u8BFB\u53D6\u6982\u89C8\u6587\u6863\n-public \u4EC5\u663E\u793A public \u7C7B\u548C\u6210\u5458\n-protected \u663E\u793A protected/public \u7C7B\u548C\u6210\u5458 (\u9ED8\u8BA4\u503C)\n-package \u663E\u793A package/protected/public \u7C7B\u548C\u6210\u5458\n-private \u663E\u793A\u6240\u6709\u7C7B\u548C\u6210\u5458\n-help \u663E\u793A\u547D\u4EE4\u884C\u9009\u9879\u5E76\u9000\u51FA\n-doclet <class> \u901A\u8FC7\u66FF\u4EE3 doclet \u751F\u6210\u8F93\u51FA\n-docletpath <path> \u6307\u5B9A\u67E5\u627E doclet \u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n-sourcepath <pathlist> \u6307\u5B9A\u67E5\u627E\u6E90\u6587\u4EF6\u7684\u4F4D\u7F6E\n-classpath <pathlist> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n-exclude <pkglist> \u6307\u5B9A\u8981\u6392\u9664\u7684\u7A0B\u5E8F\u5305\u5217\u8868\n-subpackages <subpkglist> \u6307\u5B9A\u8981\u9012\u5F52\u52A0\u8F7D\u7684\u5B50\u7A0B\u5E8F\u5305\n-breakiterator \u8BA1\u7B97\u5E26\u6709 BreakIterator \u7684\u7B2C\u4E00\u4E2A\u8BED\u53E5\n-bootclasspath <pathlist> \u8986\u76D6\u7531\u5F15\u5BFC\u7C7B\u52A0\u8F7D\u5668\u6240\u52A0\u8F7D\u7684\n\t\t\t \u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n-source <release> \u63D0\u4F9B\u4E0E\u6307\u5B9A\u53D1\u884C\u7248\u7684\u6E90\u517C\u5BB9\u6027\n-extdirs <dirlist> \u8986\u76D6\u6240\u5B89\u88C5\u6269\u5C55\u7684\u4F4D\u7F6E\n-verbose \u8F93\u51FA\u6709\u5173 Javadoc \u6B63\u5728\u6267\u884C\u7684\u64CD\u4F5C\u7684\u4FE1\u606F\n-locale <name> \u8981\u4F7F\u7528\u7684\u533A\u57DF\u8BBE\u7F6E, \u4F8B\u5982 en_US \u6216 en_US_WIN\n-encoding <name> \u6E90\u6587\u4EF6\u7F16\u7801\u540D\u79F0\n-quiet \u4E0D\u663E\u793A\u72B6\u6001\u6D88\u606F\n-J<flag> \u76F4\u63A5\u5C06 <flag> \u4F20\u9012\u5230\u8FD0\u884C\u65F6\u7CFB\u7EDF\n-X \u8F93\u51FA\u975E\u6807\u51C6\u9009\u9879\u7684\u63D0\u8981\n
-main.Xusage=-Xmaxerrs <number> \u8BBE\u7F6E\u8981\u8F93\u51FA\u7684\u6700\u5927\u9519\u8BEF\u6570\n-Xmaxwarns <number> \u8BBE\u7F6E\u8981\u8F93\u51FA\u7684\u6700\u5927\u8B66\u544A\u6570\n\n\u8FD9\u4E9B\u9009\u9879\u90FD\u662F\u975E\u6807\u51C6\u9009\u9879, \u5982\u6709\u66F4\u6539, \u6055\u4E0D\u53E6\u884C\u901A\u77E5\u3002
+
+main.usage=\u7528\u6CD5: javadoc [options] [packagenames] [sourcefiles] [@files]\n -overview <file> \u4ECE HTML \u6587\u4EF6\u8BFB\u53D6\u6982\u89C8\u6587\u6863\n -public \u4EC5\u663E\u793A public \u7C7B\u548C\u6210\u5458\n -protected \u663E\u793A protected/public \u7C7B\u548C\u6210\u5458 (\u9ED8\u8BA4\u503C)\n -package \u663E\u793A package/protected/public \u7C7B\u548C\u6210\u5458\n -private \u663E\u793A\u6240\u6709\u7C7B\u548C\u6210\u5458\n -help \u663E\u793A\u547D\u4EE4\u884C\u9009\u9879\u5E76\u9000\u51FA\n -doclet <class> \u901A\u8FC7\u66FF\u4EE3 doclet \u751F\u6210\u8F93\u51FA\n -docletpath <path> \u6307\u5B9A\u67E5\u627E doclet \u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -sourcepath <pathlist> \u6307\u5B9A\u67E5\u627E\u6E90\u6587\u4EF6\u7684\u4F4D\u7F6E\n -classpath <pathlist> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -cp <pathlist> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -exclude <pkglist> \u6307\u5B9A\u8981\u6392\u9664\u7684\u7A0B\u5E8F\u5305\u5217\u8868\n -subpackages <subpkglist> \u6307\u5B9A\u8981\u9012\u5F52\u52A0\u8F7D\u7684\u5B50\u7A0B\u5E8F\u5305\n -breakiterator \u8BA1\u7B97\u5E26\u6709 BreakIterator \u7684\u7B2C\u4E00\u4E2A\u8BED\u53E5\n -bootclasspath <pathlist> \u8986\u76D6\u7531\u5F15\u5BFC\u7C7B\u52A0\u8F7D\u5668\u6240\u52A0\u8F7D\u7684\n \u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E\n -source <release> \u63D0\u4F9B\u4E0E\u6307\u5B9A\u53D1\u884C\u7248\u7684\u6E90\u517C\u5BB9\u6027\n -extdirs <dirlist> \u8986\u76D6\u6240\u5B89\u88C5\u6269\u5C55\u7684\u4F4D\u7F6E\n -verbose \u8F93\u51FA\u6709\u5173 Javadoc \u6B63\u5728\u6267\u884C\u7684\u64CD\u4F5C\u7684\u4FE1\u606F\n -locale <name> \u8981\u4F7F\u7528\u7684\u533A\u57DF\u8BBE\u7F6E, \u4F8B\u5982 en_US \u6216 en_US_WIN\n -encoding <name> \u6E90\u6587\u4EF6\u7F16\u7801\u540D\u79F0\n -quiet \u4E0D\u663E\u793A\u72B6\u6001\u6D88\u606F\n -J<flag> \u76F4\u63A5\u5C06 <flag> \u4F20\u9012\u5230\u8FD0\u884C\u65F6\u7CFB\u7EDF\n -X \u8F93\u51FA\u975E\u6807\u51C6\u9009\u9879\u7684\u63D0\u8981\n
+
+main.Xusage=\ -Xmaxerrs <number> \u8BBE\u7F6E\u8981\u8F93\u51FA\u7684\u6700\u5927\u9519\u8BEF\u6570\n -Xmaxwarns <number> \u8BBE\u7F6E\u8981\u8F93\u51FA\u7684\u6700\u5927\u8B66\u544A\u6570\n
+
+main.Xusage.foot=\u8FD9\u4E9B\u9009\u9879\u90FD\u662F\u975E\u6807\u51C6\u9009\u9879, \u5982\u6709\u66F4\u6539, \u6055\u4E0D\u53E6\u884C\u901A\u77E5\u3002
+
main.option.already.seen={0}\u9009\u9879\u53EA\u80FD\u6307\u5B9A\u4E00\u6B21\u3002
main.requires_argument=\u9009\u9879{0}\u9700\u8981\u53C2\u6570\u3002
main.locale_first=\u5728\u547D\u4EE4\u884C\u4E2D, \u9009\u9879 -locale \u5FC5\u987B\u4E3A\u7B2C\u4E00\u4E2A\u9009\u9879\u3002
--- a/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -49,7 +49,7 @@
#
# Usage message.
#
-usage=\u4F7F\u7528\u65B9\u6CD5: javah [options] <classes>\n\n[options]\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\n\n\t-help \u30D8\u30EB\u30D7\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n\t-classpath <path> \u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9\n\t-bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9\n\t-d<dir> \u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\n\t-o <file> \u51FA\u529B\u30D5\u30A1\u30A4\u30EB(-d\u304B-o\u306E\u3069\u3061\u3089\u304B\u4E00\u65B9\u3092\u4F7F\u7528\u3059\u308B)\n\t-jni JNI\u5F62\u5F0F\u306E\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u751F\u6210\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)\n\t-version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n\t-verbose \u8A73\u7D30\u306A\u51FA\u529B\u3092\u884C\u3046\n\t-force \u5E38\u306B\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\n\n<classes> \u306F\u5B8C\u5168\u6307\u5B9A\u306E\u540D\u524D\u3067\u6307\u5B9A\u3057\u307E\u3059\n(java.lang.Object\u306A\u3069)\u3002\n
+usage=\u4F7F\u7528\u65B9\u6CD5: javah [options] <classes>\n\n[options]\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002\n\n\t-help \u30D8\u30EB\u30D7\u30FB\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u8868\u793A\u3057\u3066\u7D42\u4E86\u3059\u308B\n\t-classpath <path> \u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9\n\t-cp <path> \u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9\r\n\t-bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9\n\t-d<dir> \u51FA\u529B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\n\t-o <file> \u51FA\u529B\u30D5\u30A1\u30A4\u30EB(-d\u304B-o\u306E\u3069\u3061\u3089\u304B\u4E00\u65B9\u3092\u4F7F\u7528\u3059\u308B)\n\t-jni JNI\u5F62\u5F0F\u306E\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u751F\u6210\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)\n\t-version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831\u3092\u8868\u793A\u3059\u308B\n\t-verbose \u8A73\u7D30\u306A\u51FA\u529B\u3092\u884C\u3046\n\t-force \u5E38\u306B\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080\n\n<classes>\u306F\u5B8C\u5168\u6307\u5B9A\u306E\u540D\u524D\u3067\u6307\u5B9A\u3057\u307E\u3059\n(java.lang.Object\u306A\u3069)\u3002\n
main.usage=\u4F7F\u7528\u65B9\u6CD5: \n javah [options] <classes>\n[options]\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059\u3002
main.opt.o=\ -o <file> \u51FA\u529B\u30D5\u30A1\u30A4\u30EB(-d\u304B-o\u306E\u3069\u3061\u3089\u304B\u4E00\u65B9\u3092\u4F7F\u7528\u3059\u308B)
@@ -60,6 +60,7 @@
main.opt.jni=\ -jni JNI\u5F62\u5F0F\u306E\u30D8\u30C3\u30C0\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u751F\u6210\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8)
main.opt.force=\ -force \u5E38\u306B\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u3092\u66F8\u304D\u8FBC\u3080
main.opt.classpath=\ -classpath <path> \u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9
+main.opt.cp=\ -cp <path> \u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9
main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u3092\u30ED\u30FC\u30C9\u3059\u308B\u30D1\u30B9
main.usage.foot=<classes>\u306F\u5B8C\u5168\u6307\u5B9A\u306E\u540D\u524D\u3067\u6307\u5B9A\u3057\u307E\u3059\n(java.lang.Object\u306A\u3069)\u3002
@@ -90,7 +91,7 @@
err.prefix=\u30A8\u30E9\u30FC:
err.cant.use.option.for.fm=\u6307\u5B9A\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3067{0}\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093
err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0}
-err.ioerror=\u5165\u51FA\u529B\u30A8\u30E9\u30FC: {0}
+err.ioerror=IO\u30A8\u30E9\u30FC: {0}
err.missing.arg={0}\u306E\u5024\u304C\u3042\u308A\u307E\u305B\u3093
err.no.classes.specified=\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093
err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0}
--- a/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -49,7 +49,7 @@
#
# Usage message.
#
-usage=\u7528\u6CD5: javah [options] <classes>\n\n\u5176\u4E2D, [options] \u5305\u62EC:\n\n\t-help \u8F93\u51FA\u6B64\u5E2E\u52A9\u6D88\u606F\u5E76\u9000\u51FA\n\t-classpath <path> \u4ECE\u4E2D\u52A0\u8F7D\u7C7B\u7684\u8DEF\u5F84\n\t-bootclasspath <path> \u4ECE\u4E2D\u52A0\u8F7D\u5F15\u5BFC\u7C7B\u7684\u8DEF\u5F84\n\t-d <dir> \u8F93\u51FA\u76EE\u5F55\n\t-o <file> \u8F93\u51FA\u6587\u4EF6 (\u53EA\u80FD\u4F7F\u7528 -d \u6216 -o \u4E4B\u4E00)\n\t-jni \u751F\u6210 JNI \u6837\u5F0F\u7684\u6807\u5934\u6587\u4EF6 (\u9ED8\u8BA4\u503C)\n\t-version \u8F93\u51FA\u7248\u672C\u4FE1\u606F\n\t-verbose \u542F\u7528\u8BE6\u7EC6\u8F93\u51FA\n\t-force \u59CB\u7EC8\u5199\u5165\u8F93\u51FA\u6587\u4EF6\n\n<classes> \u662F\u4F7F\u7528\u5176\u5168\u9650\u5B9A\u540D\u79F0\u6307\u5B9A\u7684,\n(\u4F8B\u5982 java.lang.Object)\u3002\n
+usage=\u7528\u6CD5: javah [options] <classes>\n\n\u5176\u4E2D, [options] \u5305\u62EC:\n\n\t-help \u8F93\u51FA\u6B64\u5E2E\u52A9\u6D88\u606F\u5E76\u9000\u51FA\n\t-classpath <path> \u4ECE\u4E2D\u52A0\u8F7D\u7C7B\u7684\u8DEF\u5F84\n\t-cp <path> \u4ECE\u4E2D\u52A0\u8F7D\u7C7B\u7684\u8DEF\u5F84\n\t-bootclasspath <path> \u4ECE\u4E2D\u52A0\u8F7D\u5F15\u5BFC\u7C7B\u7684\u8DEF\u5F84\n\t-d <dir> \u8F93\u51FA\u76EE\u5F55\n\t-o <file> \u8F93\u51FA\u6587\u4EF6 (\u53EA\u80FD\u4F7F\u7528 -d \u6216 -o \u4E4B\u4E00)\n\t-jni \u751F\u6210 JNI \u6837\u5F0F\u7684\u6807\u5934\u6587\u4EF6 (\u9ED8\u8BA4\u503C)\n\t-version \u8F93\u51FA\u7248\u672C\u4FE1\u606F\n\t-verbose \u542F\u7528\u8BE6\u7EC6\u8F93\u51FA\n\t-force \u59CB\u7EC8\u5199\u5165\u8F93\u51FA\u6587\u4EF6\n\n<classes> \u662F\u4F7F\u7528\u5176\u5168\u9650\u5B9A\u540D\u79F0\u6307\u5B9A\u7684,\n(\u4F8B\u5982, java.lang.Object)\u3002\n
main.usage=\u7528\u6CD5: \n javah [options] <classes>\n\u5176\u4E2D, [options] \u5305\u62EC:
main.opt.o=\ -o <file> \u8F93\u51FA\u6587\u4EF6 (\u53EA\u80FD\u4F7F\u7528 -d \u6216 -o \u4E4B\u4E00)
@@ -60,6 +60,7 @@
main.opt.jni=\ -jni \u751F\u6210 JNI \u6837\u5F0F\u7684\u6807\u5934\u6587\u4EF6 (\u9ED8\u8BA4\u503C)
main.opt.force=\ -force \u59CB\u7EC8\u5199\u5165\u8F93\u51FA\u6587\u4EF6
main.opt.classpath=\ -classpath <path> \u4ECE\u4E2D\u52A0\u8F7D\u7C7B\u7684\u8DEF\u5F84
+main.opt.cp=\ -cp <path> \u4ECE\u4E2D\u52A0\u8F7D\u7C7B\u7684\u8DEF\u5F84
main.opt.bootclasspath=\ -bootclasspath <path> \u4ECE\u4E2D\u52A0\u8F7D\u5F15\u5BFC\u7C7B\u7684\u8DEF\u5F84
main.usage.foot=<classes> \u662F\u4F7F\u7528\u5176\u5168\u9650\u5B9A\u540D\u79F0\u6307\u5B9A\u7684\n(\u4F8B\u5982, java.lang.Object)\u3002
--- a/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -208,7 +208,7 @@
public void writeExceptionTable(Code_attribute attr) {
- if (attr.exception_table_langth > 0) {
+ if (attr.exception_table_length > 0) {
println("Exception table:");
indent(+1);
println(" from to target type");
--- a/langtools/src/share/classes/com/sun/tools/javap/resources/javap_ja.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/resources/javap_ja.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
-err.prefix=\u30A8\u30E9\u30FC:
+err.prefix=\u30A8\u30E9\u30FC:
err.bad.constant.pool={0}\u306E\u5B9A\u6570\u30D7\u30FC\u30EB\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1}
err.class.not.found=\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}
@@ -55,6 +55,8 @@
main.opt.classpath=\ -classpath <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B
+main.opt.cp=\ -cp <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B
+
main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B
main.opt.constants=\ -constants \u9759\u7684final\u5B9A\u6570\u3092\u8868\u793A\u3059\u308B
--- a/langtools/src/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
-err.prefix=\u9519\u8BEF:
+err.prefix=\u9519\u8BEF:
err.bad.constant.pool=\u8BFB\u53D6{0}\u7684\u5E38\u91CF\u6C60\u65F6\u51FA\u9519: {1}
err.class.not.found=\u627E\u4E0D\u5230\u7C7B: {0}
@@ -55,6 +55,8 @@
main.opt.classpath=\ -classpath <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E
+main.opt.cp=\ -cp <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E
+
main.opt.bootclasspath=\ -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E
main.opt.constants=\ -constants \u663E\u793A\u9759\u6001\u6700\u7EC8\u5E38\u91CF
--- a/langtools/src/share/classes/com/sun/tools/sjavac/BuildState.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/BuildState.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -81,12 +81,13 @@
}
/**
- * Collect all packages, sources and artifacts for all modules
- * into the build state.
+ * Store references to all packages, sources and artifacts for all modules
+ * into the build state. I.e. flatten the module tree structure
+ * into global maps stored in the BuildState for easy access.
*
* @param m The set of modules.
*/
- public void collectPackagesSourcesAndArtifacts(Map<String,Module> m) {
+ public void flattenPackagesSourcesAndArtifacts(Map<String,Module> m) {
modules = m;
// Extract all the found packages.
for (Module i : modules.values()) {
@@ -121,11 +122,12 @@
}
/**
- * Collect all the artifacts of all modules and packages.
+ * Store references to all artifacts found in the module tree into the maps
+ * stored in the build state.
*
* @param m The set of modules.
*/
- public void collectArtifacts(Map<String,Module> m) {
+ public void flattenArtifacts(Map<String,Module> m) {
modules = m;
// Extract all the found packages.
for (Module i : modules.values()) {
@@ -270,6 +272,8 @@
Module mnew = findModuleFromPackageName(pkg);
Package pprev = prev.packages().get(pkg);
mnew.addPackage(pprev);
+ // Do not forget to update the flattened data.
+ packages.put(pkg, pprev);
}
}
}
--- a/langtools/src/share/classes/com/sun/tools/sjavac/Main.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/Main.java Thu Oct 03 19:18:54 2013 +0100
@@ -274,7 +274,7 @@
// findFiles(args, "-modulepath", Util.set(".class"), modules_to_link_to, modules, current_module, true);
// Add the set of sources to the build database.
- javac_state.now().collectPackagesSourcesAndArtifacts(modules);
+ javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
javac_state.now().checkInternalState("checking sources", false, sources);
javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
javac_state.setVisibleSources(sources_to_link_to);
@@ -311,7 +311,7 @@
Map<String,Source> generated_sources = new HashMap<String,Source>();
Source.scanRoot(gensrc_dir, Util.set(".java"), null, null, null, null,
generated_sources, modules, current_module, false, true, false);
- javac_state.now().collectPackagesSourcesAndArtifacts(modules);
+ javac_state.now().flattenPackagesSourcesAndArtifacts(modules);
// Recheck the the source files and their timestamps again.
javac_state.checkSourceStatus(true);
@@ -336,8 +336,8 @@
// Only update the state if the compile went well.
if (rc[0]) {
javac_state.save();
- // Collect all the artifacts.
- javac_state.now().collectArtifacts(modules);
+ // Reflatten only the artifacts.
+ javac_state.now().flattenArtifacts(modules);
// Remove artifacts that were generated during the last compile, but not this one.
javac_state.removeSuperfluousArtifacts(recently_compiled);
}
--- a/langtools/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java Thu Oct 03 19:18:54 2013 +0100
@@ -464,7 +464,7 @@
PrintStream err) {
int rc = -3;
try {
- int port = portFile.getPort();
+ int port = portFile.containsPortInfo() ? portFile.getPort() : 0;
if (port == 0) {
return ERROR_BUT_TRY_AGAIN;
}
--- a/langtools/test/com/sun/javadoc/lib/JavadocTester.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/lib/JavadocTester.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -57,6 +57,7 @@
protected static final String SRC_DIR = System.getProperty("test.src", ".");
protected static final String JAVA_VERSION = System.getProperty("java.version");
protected static final String[][] NO_TEST = new String[][] {};
+ protected static final String[] NO_FILE_TEST = new String[] {};
/**
* Use this as the file name in the test array when you want to search
@@ -166,6 +167,26 @@
}
/**
+ * Execute the tests.
+ *
+ * @param tester the tester to execute
+ * @param args the arguments to pass to Javadoc
+ * @param testArray the array of tests
+ * @param negatedTestArray the array of negated tests
+ * @param fileTestArray the array of file tests
+ * @param negatedFileTestArray the array of negated file tests
+ * @return the return code for the execution of Javadoc
+ */
+ public static int run(JavadocTester tester, String[] args,
+ String[][] testArray, String[][] negatedTestArray, String[] fileTestArray,
+ String[] negatedFileTestArray) {
+ int returnCode = tester.runJavadoc(args);
+ tester.runTestsOnHTML(testArray, negatedTestArray);
+ tester.runTestsOnFile(fileTestArray, negatedFileTestArray);
+ return returnCode;
+ }
+
+ /**
* Execute Javadoc using the default doclet.
*
* @param args the arguments to pass to Javadoc
@@ -244,6 +265,19 @@
}
/**
+ * Run array of tests on the generated files.
+ * This method accepts a fileTestArray for testing if a file is generated
+ * and a negatedFileTestArray for testing if a file is not found.
+ *
+ * @param testArray the array of file tests
+ * @param negatedTestArray the array of negated file tests
+ */
+ public void runTestsOnFile(String[] fileTestArray, String[] negatedFileTestArray) {
+ runTestsOnFile(fileTestArray, false);
+ runTestsOnFile(negatedFileTestArray, true);
+ }
+
+ /**
* Run the array of tests on the resulting HTML.
*
* @param testArray the array of tests
@@ -265,9 +299,11 @@
fileString = readFileToString(testArray[i][0]);
} catch (Error e) {
if (isNegated) {
- numTestsPassed += 1;
- System.out.println("Passed\n not found:\n"
- + stringToFind + " in non-existent " + testArray[i][0] + "\n");
+ System.out.println( "FAILED" + "\n"
+ + "for bug " + getBugId()
+ + " (" + getBugName() + ") "
+ + "due to "
+ + e + "\n");
continue;
}
throw e;
@@ -291,6 +327,39 @@
}
/**
+ * Run the array of file tests on the generated files.
+ *
+ * @param testArray the array of file tests
+ * @param isNegated true if test is negated; false otherwise
+ */
+ private void runTestsOnFile(String[] testArray, boolean isNegated) {
+ String fileName;
+ String failedString;
+ String passedString;
+ for (int i = 0; i < testArray.length; i++) {
+ numTestsRun++;
+ fileName = testArray[i];
+ failedString = "FAILED" + "\n"
+ + "for bug " + getBugId() + " (" + getBugName() + ") "
+ + "file (" + fileName + ") found" + "\n";
+ passedString = "Passed" + "\n" +
+ "file (" + fileName + ") not found" + "\n";
+ System.out.print("Running subtest #" + numTestsRun + "... ");
+ try {
+ File file = new File(fileName);
+ if ((file.exists() && !isNegated) || (!file.exists() && isNegated)) {
+ numTestsPassed += 1;
+ System.out.println(passedString);
+ } else {
+ System.out.println(failedString);
+ }
+ } catch (Error e) {
+ System.err.println(e);
+ }
+ }
+ }
+
+ /**
* Iterate through the list of given file pairs and diff each file.
*
* @param filePairs the pairs of files to diff.
--- a/langtools/test/com/sun/javadoc/testAnnotationTypes/TestAnnotationTypes.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testAnnotationTypes/TestAnnotationTypes.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,20 +23,19 @@
/*
* @test
- * @bug 4973609
+ * @bug 4973609 8015249
* @summary Make sure that annotation types with 0 members does not have
* extra HR tags.
* @author jamieh
* @library ../lib/
- * @build JavadocTester
- * @build TestAnnotationTypes
+ * @build JavadocTester TestAnnotationTypes
* @run main TestAnnotationTypes
*/
public class TestAnnotationTypes extends JavadocTester {
//Test information.
- private static final String BUG_ID = "4973609";
+ private static final String BUG_ID = "4973609-8015249";
//Javadoc arguments.
private static final String[] ARGS = new String[] {
@@ -44,7 +43,31 @@
};
//Input for string search tests.
- private static final String[][] TEST = NO_TEST;
+ private static final String[][] TEST = {
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<li>Summary: </li>" + NL + "<li><a href=\"#annotation_type_" +
+ "field_summary\">Field</a> | </li>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<li>Detail: </li>" + NL + "<li><a href=\"#annotation_type_" +
+ "field_detail\">Field</a> | </li>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<!-- =========== ANNOTATION TYPE FIELD SUMMARY =========== -->"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<h3>Field Summary</h3>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<td class=\"colLast\"><code><span class=\"strong\"><a href=\"../" +
+ "pkg/AnnotationTypeField.html#DEFAULT_NAME\">DEFAULT_NAME</a></span>" +
+ "</code> </td>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<!-- ============ ANNOTATION TYPE FIELD DETAIL =========== -->"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationTypeField.html",
+ "<h4>DEFAULT_NAME</h4>" + NL + "<pre>public static final java." +
+ "lang.String DEFAULT_NAME</pre>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
+ "<li>Summary: </li>" + NL + "<li>Field | </li>"},
+ {BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
+ "<li>Detail: </li>" + NL + "<li>Field | </li>"},
+ };
private static final String[][] NEGATED_TEST = {
{BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
"<HR>" + NL + NL + "<P>" + NL + NL + "<P>" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/com/sun/javadoc/testAnnotationTypes/pkg/AnnotationTypeField.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package pkg;
+
+import java.lang.annotation.*;
+
+/**
+ * This is just a test for annotation type fields.
+ */
+@Documented public @interface AnnotationTypeField {
+ String DEFAULT_NAME = "test";
+
+ String name() default DEFAULT_NAME;
+}
--- a/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,7 @@
/*
* @test
- * @bug 4258405 4973606
+ * @bug 4258405 4973606 8024096
* @summary This test verifies that the doc-file directory does not
* get overwritten when the sourcepath is equal to the destination
* directory.
@@ -47,25 +47,17 @@
};
private static final String[][] NEGATED_TEST1 = NO_TEST;
- private static final String[][] TEST2 = {
- {BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-used1" +
+ private static final String[] FILE_TEST2 = {
+ BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-used1" +
FS + "testfile.txt",
- "passed"
- },
- {BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-used2" +
- FS + "testfile.txt",
- "passed"
- },
+ BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-used2" +
+ FS + "testfile.txt"
};
- private static final String[][] NEGATED_TEST2 = {
- {BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-excluded1" +
+ private static final String[] FILE_NEGATED_TEST2 = {
+ BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-excluded1" +
FS + "testfile.txt",
- "passed"
- },
- {BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-excluded2" +
- FS + "testfile.txt",
- "passed"
- },
+ BUG_ID + "-2" + FS + "pkg" + FS + "doc-files" + FS + "subdir-excluded2" +
+ FS + "testfile.txt"
};
private static final String[][] TEST0 = {
@@ -106,7 +98,7 @@
run(tester, ARGS0, TEST0, NEGATED_TEST0);
copyDir(SRC_DIR + FS + "pkg", BUG_ID + "-1");
run(tester, ARGS1, TEST1, NEGATED_TEST1);
- run(tester, ARGS2, TEST2, NEGATED_TEST2);
+ run(tester, ARGS2, NO_TEST, NO_TEST, FILE_TEST2, FILE_NEGATED_TEST2);
tester.printSummary();
}
--- a/langtools/test/com/sun/javadoc/testEncoding/EncodeTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testEncoding/EncodeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,9 @@
/**
- * ±ñÉ¿í ¹©¢!
+ * Testing en\u00e7\u00f4ded string.
+ * In the encoded comment string, Unicode U+00E7 is "Latin small letter C with cedilla"
+ * and Unicode U+00F4 is "Latin small letter O with circumflex"
*/
public class EncodeTest {
}
--- a/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4661481
+ * @bug 4661481 8024096
* @summary This test determines if the value of the -encoding option is
* properly passed from Javadoc to the source file parser.
* @author jamieh
@@ -40,12 +40,12 @@
//If ??? is found in the output, the source file was not read with the correct encoding setting.
private static final String[][] NEGATED_TEST = {
- {BUG_ID + FS + "EncodeTest.html", "???"}
+ {BUG_ID + FS + "EncodeTest.html", "??"}
};
private static final String[] ARGS =
new String[] {
"-d", BUG_ID, "-sourcepath", SRC_DIR,
- "-encoding", "SJIS", SRC_DIR + FS + "EncodeTest.java"
+ "-encoding", "iso-8859-1", SRC_DIR + FS + "EncodeTest.java"
};
/**
--- a/langtools/test/com/sun/javadoc/testHref/TestHref.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testHref/TestHref.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4663254
+ * @bug 4663254 8016328
* @summary Verify that spaces do not appear in hrefs and anchors.
* @author jamieh
* @library ../lib/
@@ -46,11 +46,11 @@
private static final String[][] TEST = {
//External link.
{BUG_ID + FS + "pkg" + FS + "C1.html",
- "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait(long, int)\""
+ "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait(long,%20int)\""
},
//Member summary table link.
{BUG_ID + FS + "pkg" + FS + "C1.html",
- "href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\""
+ "href=\"../pkg/C1.html#method(int,%20int,%20java.util.ArrayList)\""
},
//Anchor test.
{BUG_ID + FS + "pkg" + FS + "C1.html",
@@ -66,11 +66,11 @@
},
//{@link} test.
{BUG_ID + FS + "pkg" + FS + "C2.html",
- "Link: <a href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">"
+ "Link: <a href=\"../pkg/C1.html#method(int,%20int,%20java.util.ArrayList)\">"
},
//@see test.
{BUG_ID + FS + "pkg" + FS + "C2.html",
- "See Also:</span></dt>" + NL + "<dd><a href=\"../pkg/C1.html#method(int, int, java.util.ArrayList)\">"
+ "See Also:</span></dt>" + NL + "<dd><a href=\"../pkg/C1.html#method(int,%20int,%20java.util.ArrayList)\">"
},
//Header does not link to the page itself.
--- a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4665566 4855876 7025314 8012375 8015997
+ * @bug 4665566 4855876 7025314 8012375 8015997 8016328
* @summary Verify that the output has the right javascript.
* @author jamieh
* @library ../lib/
@@ -56,6 +56,12 @@
" if (targetPage.indexOf(\":\") != -1 || (targetPage != \"\" && !validURL(targetPage)))" + NL +
" targetPage = \"undefined\";" + NL +
" function validURL(url) {" + NL +
+ " try {" + NL +
+ " url = decodeURIComponent(url);" + NL +
+ " }" + NL +
+ " catch (error) {" + NL +
+ " return false;" + NL +
+ " }" + NL +
" var pos = url.indexOf(\".html\");" + NL +
" if (pos == -1 || pos != url.length - 5)" + NL +
" return false;" + NL +
@@ -67,7 +73,8 @@
" if ('a' <= ch && ch <= 'z' ||" + NL +
" 'A' <= ch && ch <= 'Z' ||" + NL +
" ch == '$' ||" + NL +
- " ch == '_') {" + NL +
+ " ch == '_' ||" + NL +
+ " ch.charCodeAt(0) > 127) {" + NL +
" allowNumber = true;" + NL +
" allowSep = true;" + NL +
" } else if ('0' <= ch && ch <= '9'" + NL +
--- a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4732864 6280605 7064544 8014636
+ * @bug 4732864 6280605 7064544 8014636 8016328
* @summary Make sure that you can link from one member to another using
* non-qualified name, furthermore, ensure the right one is linked.
* @author jamieh
@@ -49,9 +49,9 @@
"Qualified Link: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>" + NL +
" Unqualified Link1: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>" + NL +
" Unqualified Link2: <a href=\"../pkg/C.InnerC.html\" title=\"class in pkg\"><code>C.InnerC</code></a>.<br/>" + NL +
- " Qualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(pkg.C.InnerC, pkg.C.InnerC2)</code></a>.<br/>" + NL +
- " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(C.InnerC, C.InnerC2)</code></a>.<br/>" + NL +
- " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC, pkg.C.InnerC2)\"><code>method(InnerC, InnerC2)</code></a>.<br/>"
+ " Qualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC,%20pkg.C.InnerC2)\"><code>method(pkg.C.InnerC, pkg.C.InnerC2)</code></a>.<br/>" + NL +
+ " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC,%20pkg.C.InnerC2)\"><code>method(C.InnerC, C.InnerC2)</code></a>.<br/>" + NL +
+ " Unqualified Link: <a href=\"../pkg/C.html#method(pkg.C.InnerC,%20pkg.C.InnerC2)\"><code>method(InnerC, InnerC2)</code></a>.<br/>"
},
{BUG_ID + FS + "pkg" + FS + "C.InnerC.html",
"Link to member in outer class: <a href=\"../pkg/C.html#MEMBER\"><code>C.MEMBER</code></a> <br/>" + NL +
--- a/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8002304
+ * @bug 8002304 8024096
* @summary Test for various method types in the method summary table
* @author Bhavesh Patel
* @library ../lib/
@@ -107,7 +107,7 @@
"</caption>"
},
- {BUG_ID + FS + "pkg" + FS + "D.html",
+ {BUG_ID + FS + "pkg1" + FS + "D.html",
"<caption><span>Methods</span><span class=\"tabEnd\"> </span>" +
"</caption>"
},
--- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java Thu Oct 03 19:18:54 2013 +0100
@@ -155,13 +155,13 @@
//=================================
//Make sure the summary links are correct.
{BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
- "<li>Summary: </li>" + NL +
+ "<li>Summary: </li>" + NL + "<li>Field | </li>" + NL +
"<li><a href=\"#annotation_type_required_element_summary\">" +
"Required</a> | </li>" + NL + "<li>" +
"<a href=\"#annotation_type_optional_element_summary\">Optional</a></li>"},
//Make sure the detail links are correct.
{BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
- "<li>Detail: </li>" + NL +
+ "<li>Detail: </li>" + NL + "<li>Field | </li>" + NL +
"<li><a href=\"#annotation_type_element_detail\">Element</a></li>"},
//Make sure the heading is correct.
{BUG_ID + FS + "pkg" + FS + "AnnotationType.html",
--- a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4780441 4874845 4978816 8014017
+ * @bug 4780441 4874845 4978816 8014017 8016328
* @summary Make sure that when the -private flag is not used, members
* inherited from package private class are documented in the child.
*
@@ -177,7 +177,7 @@
// Should document that a method overrides method from private class.
{BUG_ID + "-2" + FS + "pkg" + FS + "PublicChild.html",
"<dt><span class=\"strong\">Overrides:</span></dt>" + NL +
- "<dd><code><a href=\"../pkg/PrivateParent.html#methodOverridenFromParent(char[], int, T, V, java.util.List)\">" +
+ "<dd><code><a href=\"../pkg/PrivateParent.html#methodOverridenFromParent(char[],%20int,%20T,%20V,%20java.util.List)\">" +
"methodOverridenFromParent</a></code> in class <code>" +
"<a href=\"../pkg/PrivateParent.html\" title=\"class in pkg\">" +
"PrivateParent</a></code></dd>"},
--- a/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8006124 8009684 8016921 8023700
+ * @bug 8006124 8009684 8016921 8023700 8024096
* @summary Test javadoc support for profiles.
* @author Bhavesh Patel, Evgeniya Stepanova
* @library ../lib/
@@ -187,26 +187,6 @@
}
};
private static final String[][] PACKAGES_NEGATED_TEST = {
- {PACKAGE_BUG_ID + FS + "profile-overview-frame.html",
- "<span><a href=\"overview-frame.html\" "
- + "target=\"packageListFrame\">All Packages</a></span>"
- },
- {PACKAGE_BUG_ID + FS + "compact2-frame.html",
- "<span><a href=\"overview-frame.html\" target=\"packageListFrame\">"
- + "All Packages</a></span><span><a href=\"profile-overview-frame.html\" "
- + "target=\"packageListFrame\">All Profiles</a></span>"
- },
- {PACKAGE_BUG_ID + FS + "pkg2" + FS + "compact2-package-frame.html",
- "<a href=\"../compact2-summary.html\" target=\"classFrame\">"
- + "compact2</a> - <a href=\"../pkg2/compact2-package-summary.html\" "
- + "target=\"classFrame\">pkg2</a>"
- },
- {PACKAGE_BUG_ID + FS + "compact2-summary.html",
- "<h1 title=\"Profile\" class=\"title\">Profile compact2</h1>"
- },
- {PACKAGE_BUG_ID + FS + "pkg5" + FS + "compact3-package-summary.html",
- "<div class=\"subTitle\">compact3</div>"
- },
{PACKAGE_BUG_ID + FS + "overview-frame.html",
"<span><a href=\"profile-overview-frame.html\" "
+ "target=\"packageListFrame\">All Profiles</a></span>"
@@ -222,6 +202,13 @@
"</ul>"
}
};
+ private static final String[] PACKAGES_NEGATED_FILE_TEST = {
+ PACKAGE_BUG_ID + FS + "profile-overview-frame.html",
+ PACKAGE_BUG_ID + FS + "compact2-frame.html",
+ PACKAGE_BUG_ID + FS + "pkg2" + FS + "compact2-package-frame.html",
+ PACKAGE_BUG_ID + FS + "compact2-summary.html",
+ PACKAGE_BUG_ID + FS + "pkg5" + FS + "compact3-package-summary.html"
+ };
/**
* The entry point of the test.
@@ -231,7 +218,7 @@
public static void main(String[] args) {
TestProfiles tester = new TestProfiles();
run(tester, ARGS1, PROFILES_TEST, PROFILES_NEGATED_TEST);
- run(tester, ARGS2, PACKAGES_TEST, PACKAGES_NEGATED_TEST);
+ run(tester, ARGS2, PACKAGES_TEST, PACKAGES_NEGATED_TEST, NO_FILE_TEST, PACKAGES_NEGATED_FILE_TEST);
tester.printSummary();
}
--- a/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 4496290 4985072 7006178 7068595
+ * @bug 4496290 4985072 7006178 7068595 8016328
* @summary A simple test to determine if -use works.
* @author jamieh
* @library ../lib/
@@ -60,7 +60,7 @@
"UsedInC</a> in <a href=\"../package-summary.html\"><Unnamed></a>"
},
{BUG_ID + "-3" + FS + "package-use.html", "<td class=\"colOne\">" +
- "<a href=\"class-use/UsedInC.html#<Unnamed>\">UsedInC</a> </td>"
+ "<a href=\"class-use/UsedInC.html#%3CUnnamed%3E\">UsedInC</a> </td>"
}
};
--- a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,13 +23,12 @@
/*
* @test
- * @bug 4764045
+ * @bug 4764045 8004825
* @summary This test ensures that the value tag works in all
* use cases. The explainations for each test case are written below.
* @author jamieh
* @library ../lib/
- * @build JavadocTester
- * @build TestValueTag
+ * @build JavadocTester TestValueTag
* @run main TestValueTag
*/
@@ -41,8 +40,14 @@
//Javadoc arguments.
private static final String[] ARGS =
new String[] {
+ "-d", BUG_ID, "-sourcepath", SRC_DIR, "-tag",
+ "todo", "pkg1", "pkg2"
+ };
+
+ private static final String[] ARGS1 =
+ new String[] {
"-Xdoclint:none",
- "-d", BUG_ID, "-sourcepath", SRC_DIR, "-tag",
+ "-d", BUG_ID + "-1", "-sourcepath", SRC_DIR, "-tag",
"todo", "pkg1", "pkg2"
};
@@ -91,16 +96,58 @@
{BUG_ID + FS + "pkg1" + FS + "CustomTagUsage.html",
"<dt><span class=\"strong\">Todo:</span></dt>" + NL +
"<dd>the value of this constant is 55.</dd>"},
+ //Test @value errors printed dues to invalid use or when used with
+ //non-constant or with bad references.
+ {ERROR_OUTPUT,"error: value does not refer to a constant" + NL +
+ " * Result: {@value TEST_12_ERROR}"
+ },
+ {ERROR_OUTPUT,"error: {@value} not allowed here" + NL +
+ " * Result: {@value}"
+ },
+ {ERROR_OUTPUT,"error: value does not refer to a constant" + NL +
+ " * Result: {@value NULL}"
+ },
+ {ERROR_OUTPUT,"error: {@value} not allowed here" + NL +
+ " * Invalid (null): {@value}"
+ },
+ {ERROR_OUTPUT,"error: {@value} not allowed here" + NL +
+ " * Invalid (non-constant field): {@value}"
+ },
+ {ERROR_OUTPUT,"error: value does not refer to a constant" + NL +
+ " * Here is a bad value reference: {@value UnknownClass#unknownConstant}"
+ },
+ {ERROR_OUTPUT,"error: reference not found" + NL +
+ " * Here is a bad value reference: {@value UnknownClass#unknownConstant}"
+ },
+ {ERROR_OUTPUT,"error: {@value} not allowed here" + NL +
+ " * @todo the value of this constant is {@value}"
+ }
+ };
+ private static final String[][] TEST1 = {
//Test @value warning printed when used with non-constant.
{WARNING_OUTPUT,"warning - @value tag (which references nonConstant) " +
"can only be used in constants."
},
+ {WARNING_OUTPUT,"warning - @value tag (which references NULL) " +
+ "can only be used in constants."
+ },
+ {WARNING_OUTPUT,"warning - @value tag (which references TEST_12_ERROR) " +
+ "can only be used in constants."
+ },
//Test warning printed for bad reference.
{WARNING_OUTPUT,"warning - UnknownClass#unknownConstant (referenced by " +
"@value tag) is an unknown reference."
},
+ //Test warning printed for invalid use of @value.
+ {WARNING_OUTPUT,"warning - @value tag cannot be used here."
+ }
};
- private static final String[][] NEGATED_TEST = NO_TEST;
+ private static final String[][] NEGATED_TEST = {
+ //Base case: using @value on a constant.
+ {BUG_ID + FS + "pkg1" + FS + "Class1.html",
+ "Result: <a href=\"../pkg1/Class1.html#TEST_12_ERROR\">\"Test 12 " +
+ "generates an error message\"</a>"},
+ };
/**
* The entry point of the test.
@@ -109,9 +156,18 @@
public static void main(String[] args) {
TestValueTag tester = new TestValueTag();
run(tester, ARGS, TEST, NEGATED_TEST);
+ checkForException(tester);
+ run(tester, ARGS1, TEST1, NO_TEST);
+ checkForException(tester);
tester.printSummary();
}
+ public static void checkForException(TestValueTag tester) {
+ if (tester.getErrorOutput().contains("DocletAbortException")) {
+ throw new AssertionError("javadoc threw DocletAbortException");
+ }
+ }
+
/**
* {@inheritDoc}
*/
--- a/langtools/test/com/sun/javadoc/testValueTag/pkg1/Class1.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testValueTag/pkg1/Class1.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,6 +45,16 @@
public static final String TEST_11_PASSES = "Test 11 passes";
/**
+ * Invalid (non-constant field): {@value}
+ */
+ public static String TEST_12_ERROR = "Test 12 generates an error message";
+
+ /**
+ * Invalid (null): {@value}
+ */
+ public static final String NULL = null;
+
+ /**
* Result: {@value TEST_3_PASSES}
*/
public int field;
@@ -60,6 +70,21 @@
public void method() {}
/**
+ * Result: {@value TEST_12_ERROR}
+ */
+ public void invalidValueTag1() {}
+
+ /**
+ * Result: {@value}
+ */
+ public void invalidValueTag2() {}
+
+ /**
+ * Result: {@value NULL}
+ */
+ public void testNullConstant() {}
+
+ /**
* Result: {@value pkg1.Class1#TEST_6_PASSES}
*/
public class NestedClass{}
--- a/langtools/test/tools/doclint/ReferenceTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/doclint/ReferenceTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,6 +1,6 @@
/*
* @test /nodynamiccopyright/
- * @bug 8004832 8020556
+ * @bug 8004832 8020556 8002154
* @summary Add new doclint package
* @build DocLintTester
* @run main DocLintTester -Xmsgs:-reference ReferenceTest.java
@@ -54,5 +54,13 @@
* @throws T description
*/
public <T extends Throwable> void valid_throws_generic() throws T { }
+
+ /**
+ * {@link java.util.List<String>}
+ * {@link java.util.List<String>#equals}
+ * @see java.util.List<String>
+ * @see java.util.List<String>#equals
+ */
+ public void invalid_type_args() { }
}
--- a/langtools/test/tools/doclint/ReferenceTest.out Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/doclint/ReferenceTest.out Thu Oct 03 19:18:54 2013 +0100
@@ -25,6 +25,18 @@
ReferenceTest.java:48: error: exception not thrown: java.lang.Exception
* @throws Exception description
^
-8 errors
+ReferenceTest.java:59: error: type arguments not allowed here
+ * {@link java.util.List<String>}
+ ^
+ReferenceTest.java:60: error: type arguments not allowed here
+ * {@link java.util.List<String>#equals}
+ ^
+ReferenceTest.java:61: error: type arguments not allowed here
+ * @see java.util.List<String>
+ ^
+ReferenceTest.java:62: error: type arguments not allowed here
+ * @see java.util.List<String>#equals
+ ^
+12 errors
1 warning
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/ValueTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,67 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8025272
+ * @summary doclint needs to check for valid usage of at-value tag
+ * @build DocLintTester
+ * @run main DocLintTester -ref ValueTest.out ValueTest.java
+ */
+
+/** */
+public class ValueTest {
+ /*
+ * Tests for {@value} without a reference
+ */
+
+ /** valid: {@value} */
+ public static final boolean cBoolean = false;
+
+ /** valid: {@value} */
+ public static final byte cByte = 0;
+
+ /** valid: {@value} */
+ public static final short cShort = 0;
+
+ /** valid: {@value} */
+ public static final int cInt = 0;
+
+ /** valid: {@value} */
+ public static final long cLong = 0L;
+
+ /** valid: {@value} */
+ public static final float cFloat = 0.0f;
+
+ /** valid: {@value} */
+ public static final double cDouble = 0.0;
+
+ /** valid: {@value} */
+ public static final String cString = "";
+
+ /** invalid class C: {@value} */
+ public class C { }
+
+ /** invalid enum E: {@value} */
+ public enum E {
+ /** invalid enum constant E1: {@value} */
+ E1
+ }
+
+ /** invalid field 1: {@value} */
+ public int f1;
+
+ /** invalid field 2: {@value} */
+ public int f2 = 3;
+
+
+ /*
+ * Tests for {@value} with a reference
+ */
+
+ /** valid: {@value Integer#SIZE} */
+ public int intRef;
+
+ /** invalid method: {@value Object#toString} */
+ public int badMethod;
+
+ /** invalid enum constant: {@value Thread.State#NEW} */
+ public int badEnum;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/ValueTest.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,22 @@
+ValueTest.java:39: error: {@value} not allowed here
+ /** invalid class C: {@value} */
+ ^
+ValueTest.java:42: error: {@value} not allowed here
+ /** invalid enum E: {@value} */
+ ^
+ValueTest.java:44: error: {@value} not allowed here
+ /** invalid enum constant E1: {@value} */
+ ^
+ValueTest.java:48: error: {@value} not allowed here
+ /** invalid field 1: {@value} */
+ ^
+ValueTest.java:51: error: {@value} not allowed here
+ /** invalid field 2: {@value} */
+ ^
+ValueTest.java:62: error: value does not refer to a constant
+ /** invalid method: {@value Object#toString} */
+ ^
+ValueTest.java:65: error: value does not refer to a constant
+ /** invalid enum constant: {@value Thread.State#NEW} */
+ ^
+7 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,53 @@
+/* @test /nodynamiccopyright/
+ * @bug 8025246
+ * @summary doclint is showing error on anchor already defined when it's not
+ * @library ../..
+ * @build DocLintTester
+ * @run main DocLintTester -ref Test.out Test.java
+ * @compile/fail/ref=Test.javac.out -XDrawDiagnostics -Werror -Xdoclint:all Test.java
+ */
+
+package p;
+
+/**
+ * <a name="dupTest">dupTest</a>
+ * <a name="dupTest">dupTest again</a>
+ *
+ * <a name="dupTestField">dupTestField</a>
+ * <a name="dupTestMethod">dupTestMethod</a>
+
+ * <a name="okClass">okClass</a>
+ * <a name="okField">okField</a>
+ * <a name="okMethod">okMethod</a>
+ */
+public class Test {
+ /** <a name="dupTestField">dupTestField again</a> */
+ public int f;
+
+ /** <a name="dupTestMethod">dupTestMethod again</a> */
+ public void m() { }
+
+ /**
+ * <a name="dupNested">dupNested</a>
+ * <a name="dupNested">dupNested again</a>
+ * <a name="dupNestedField">dupNestedField</a>
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ *
+ * <a name="okClass">okClass again</a>
+ */
+ public class Nested {
+ /**
+ * <a name="dupNestedField">dupNestedField</a>
+ *
+ * <a name="okField">okField again</a>
+ */
+ public int f;
+
+ /**
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ *
+ * <a name="okMethod">okMethod again</a>
+ */
+ public void m() { }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.javac.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,7 @@
+Test.java:14:7: compiler.err.proc.messager: anchor already defined: dupTest
+Test.java:24:12: compiler.err.proc.messager: anchor already defined: dupTestField
+Test.java:27:12: compiler.err.proc.messager: anchor already defined: dupTestMethod
+Test.java:32:11: compiler.err.proc.messager: anchor already defined: dupNested
+Test.java:40:15: compiler.err.proc.messager: anchor already defined: dupNestedField
+Test.java:47:15: compiler.err.proc.messager: anchor already defined: dupNestedMethod
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,19 @@
+Test.java:14: error: anchor already defined: dupTest
+ * <a name="dupTest">dupTest again</a>
+ ^
+Test.java:24: error: anchor already defined: dupTestField
+ /** <a name="dupTestField">dupTestField again</a> */
+ ^
+Test.java:27: error: anchor already defined: dupTestMethod
+ /** <a name="dupTestMethod">dupTestMethod again</a> */
+ ^
+Test.java:32: error: anchor already defined: dupNested
+ * <a name="dupNested">dupNested again</a>
+ ^
+Test.java:40: error: anchor already defined: dupNestedField
+ * <a name="dupNestedField">dupNestedField</a>
+ ^
+Test.java:47: error: anchor already defined: dupNestedMethod
+ * <a name="dupNestedMethod">dupNestedMethod</a>
+ ^
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,15 @@
+/* @test /nodynamiccopyright/
+ * @bug 8025246
+ * @summary doclint is showing error on anchor already defined when it's not
+ * @library ../..
+ * @build DocLintTester
+ * @run main DocLintTester -ref package-info.out package-info.java
+ * @compile/fail/ref=package-info.javac.out -XDrawDiagnostics -Werror -Xdoclint:all package-info.java
+ */
+
+/**
+ * <a name=here>here</a>
+ * <a name=here>here again</a>
+ */
+package p;
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.javac.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,2 @@
+package-info.java:12:7: compiler.err.proc.messager: anchor already defined: here
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,4 @@
+package-info.java:12: error: anchor already defined: here
+ * <a name=here>here again</a>
+ ^
+1 error
--- a/langtools/test/tools/doclint/html/InlineTagsTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/doclint/html/InlineTagsTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -39,6 +39,7 @@
* <br>
* <cite> abc </cite>
* <code> abc </code>
+ * <dfn> abc </dfn>
* <em> abc </em>
* <font> abc </font>
* <i> abc </i>
--- a/langtools/test/tools/doclint/tidy/util/Main.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/doclint/tidy/util/Main.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,3 +1,27 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
package tidystats;
import java.io.IOException;
@@ -17,6 +41,35 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+/**
+ * Generate statistics from the files generated by tidy.sh.
+ *
+ * <p>The tidy.sh script is used to run tidy on all the HTML files
+ * in a directory, creating files in a new directory, and for each
+ * HTML file, it writes the console output from tidy into a file
+ * beside the fixed up file, with an additional .tidy extension.
+ *
+ * <p>This program will scan a directory for *.tidy files and
+ * analyze the messages reported by tidy, in order to generate a
+ * report with statistics on the various messages that were
+ * reported by tidy.
+ *
+ * <p>Typical usage:
+ * <pre>
+ * $ bash /path/to/tidy.sh /path/to/htmldir
+ * $ javac -d /path/to/classes /path/to/Main.java
+ * $ java -cp /path/to/classes tidystats.Main /path/to/htmldir.tidy
+ * </pre>
+ *
+ * <p>Internally, the program works by matching lines in the *.tidy
+ * files against a series of regular expressions that are used to
+ * categorize the messages. The set of regular expressions was
+ * empirically determined by running the program on the output from
+ * running tidy.sh on all the generated JDK documentation. It is
+ * possible that tidy may generate more/different messages on other
+ * doc sets, in which case, the set of regexes in the program should
+ * be updated.
+ */
public class Main {
public static void main(String... args) throws IOException {
new Main().run(args);
--- a/langtools/test/tools/doclint/tidy/util/tidy.sh Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/doclint/tidy/util/tidy.sh Thu Oct 03 19:18:54 2013 +0100
@@ -1,6 +1,6 @@
-#!/bin/sh
+#!/bin/bash
#
-# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
#
# Run the "tidy" program over the files in a directory.
+# The "tidy" program must be on your PATH.
#
# Usage:
# sh tidy.sh <dir>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T4881267.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,12 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 4881267
+ * @summary improve diagnostic for "instanceof T" for type parameter T
+ * @compile/fail/ref=T4881267.out -XDrawDiagnostics T4881267.java
+ */
+
+class T4881267 {
+ <T> void m(Object o) {
+ boolean b = o instanceof T;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T4881267.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,2 @@
+T4881267.java:10:34: compiler.err.illegal.generic.type.for.instof
+1 error
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7090499.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,14 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7090499
+ * @summary missing rawtypes warnings in anonymous inner class
+ * @compile/ref=T7090499.out -Xlint:rawtypes -XDrawDiagnostics T7090499.java
+ */
+
+class T7090499<X> {
+ {
+ new Object() {
+ T7090499 x;
+ };
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7090499.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,2 @@
+T7090499.java:11:13: compiler.warn.raw.class.use: T7090499, T7090499<X>
+1 warning
--- a/langtools/test/tools/javac/T7093325.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/T7093325.java Thu Oct 03 19:18:54 2013 +0100
@@ -208,7 +208,7 @@
}
int actualGapsCount = 0;
- for (int i = 0; i < code.exception_table_langth ; i++) {
+ for (int i = 0; i < code.exception_table_length ; i++) {
int catchType = code.exception_table[i].catch_type;
if (catchType == 0) { //any
actualGapsCount++;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7120463.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,11 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7120463
+ * @summary Fix method reference parser support in order to avoid ambiguities
+ * @compile/fail/ref=T7120463.out -XDrawDiagnostics T7120463.java
+ */
+
+class T7120463 {
+ void test() { that(i < len, "oopmap"); }
+ void that(int i, String s) { };
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7120463.out Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,3 @@
+T7120463.java:9:24: compiler.err.cant.resolve.location: kindname.variable, i, , , (compiler.misc.location: kindname.class, T7120463, null)
+T7120463.java:9:28: compiler.err.cant.resolve.location: kindname.variable, len, , , (compiler.misc.location: kindname.class, T7120463, null)
+2 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T7126754.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,19 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 7126754
+ * @summary Generics compilation failure casting List<? extends Set...> to List<Set...>
+ * @compile T7126754.java
+ */
+
+import java.util.List;
+import java.util.Set;
+
+public class T7126754 {
+ public static void main(String[] args) {
+ List<Set<? extends String>> a = null;
+ List<? extends Set<? extends String>> b = a;
+
+ List<? extends Set<? extends String>> c = null;
+ List<Set<? extends String>> d = (List<Set<? extends String>>)c;
+ }
+}
--- a/langtools/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -100,7 +100,7 @@
if (method.getName(classFile.constant_pool).equals(methodToFind)) {
numberOfmethodsFound++;
Code_attribute code = (Code_attribute) method.attributes.get("Code");
- Assert.check(code.exception_table_langth == expectedExceptionTable.length,
+ Assert.check(code.exception_table_length == expectedExceptionTable.length,
"The ExceptionTable found has a length different to the expected one");
int i = 0;
for (Exception_data entry: code.exception_table) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/T8024437/ExceptionInferenceFromClassFileTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024437
+ * @summary Inferring the exception thrown by a lambda: sometimes fails to compile
+ * @library /tools/javac/lib
+ * @build ToolBox
+ * @run main ExceptionInferenceFromClassFileTest
+ */
+
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class ExceptionInferenceFromClassFileTest {
+
+ static final String ABSrc =
+ "class B {\n" +
+ " public static <E extends Throwable> void t(A<E> a) throws E {\n" +
+ " a.run();\n" +
+ " }\n" +
+ "}\n" +
+
+ "interface A<E extends Throwable> {\n" +
+ " void run() throws E;\n" +
+ "}";
+
+ static final String CSrc =
+ "class C {\n" +
+ " public void d() {\n" +
+ " B.t(null);\n" +
+ " }\n" +
+ "}";
+
+ public static void main(String[] args) throws Exception {
+ Files.createDirectory(Paths.get("out"));
+
+ ToolBox.JavaToolArgs compileABParams =
+ new ToolBox.JavaToolArgs()
+ .setOptions("-d", "out")
+ .setSources(ABSrc);
+ ToolBox.javac(compileABParams);
+
+ ToolBox.JavaToolArgs compileCParams =
+ new ToolBox.JavaToolArgs()
+ .setOptions("-d", "out", "-cp", "out")
+ .setSources(CSrc);
+ ToolBox.javac(compileCParams);
+ }
+
+}
--- a/langtools/test/tools/javac/cast/intersection/IntersectionTypeCastTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/IntersectionTypeCastTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -237,7 +237,7 @@
}
static List<CastInfo> allCastInfo() {
- ListBuffer<CastInfo> buf = ListBuffer.lb();
+ ListBuffer<CastInfo> buf = new ListBuffer<>();
for (CastKind kind : CastKind.values()) {
for (ClassKind clazz : ClassKind.values()) {
if (kind == CastKind.INTERFACE && clazz != ClassKind.OBJECT) {
--- a/langtools/test/tools/javac/cast/intersection/model/Model01.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/model/Model01.java Thu Oct 03 19:18:54 2013 +0100
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8002099
+ * @bug 8002099 6499673
* @summary Add support for intersection types in cast expression
* @library /tools/javac/lib
* @build JavacTestingAbstractProcessor ModelChecker
@@ -46,7 +46,7 @@
}
void test(){
- @IntersectionTypeInfo({"java.lang.Object", "Test.A", "Test.B"})
+ @IntersectionTypeInfo({"Test.A", "Test.B"})
Object o = (A & B)null;
}
}
--- a/langtools/test/tools/javac/cast/intersection/model/ModelChecker.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/model/ModelChecker.java Thu Oct 03 19:18:54 2013 +0100
@@ -97,7 +97,7 @@
}
}
- assertTrue(assertionCount == 10, "Expected 10 assertions - found " + assertionCount);
+ assertTrue(assertionCount == 9, "Expected 9 assertions - found " + assertionCount);
return super.visitVariable(node, p);
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/doclint/implicitSource/ImplicitSourceTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8024538
+ * @summary -Xdoclint + -Xprefer:source + incremental compilation == FAIL
+ * @compile -Xdoclint -Xprefer:source ImplicitSourceTest.java
+ */
+
+/** ImplicitSourceTest. */
+class ImplicitSourceTest {
+ /** <p> {@link Other} </p> */
+ int i;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/doclint/implicitSource/Other.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/** Other. */
+class Other { }
--- a/langtools/test/tools/javac/flow/LVTHarness.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/flow/LVTHarness.java Thu Oct 03 19:18:54 2013 +0100
@@ -64,6 +64,7 @@
import static javax.tools.StandardLocation.*;
import static com.sun.tools.classfile.LocalVariableTable_attribute.Entry;
+import static javax.tools.JavaFileObject.Kind.SOURCE;
public class LVTHarness {
@@ -73,10 +74,14 @@
static final StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
public static void main(String[] args) throws Exception {
- fm.setLocation(SOURCE_PATH,
- Arrays.asList(new File(System.getProperty("test.src"), "tests")));
- for (JavaFileObject jfo : fm.list(SOURCE_PATH, "",
- Collections.singleton(JavaFileObject.Kind.SOURCE), true)) {
+
+ String testDir = System.getProperty("test.src");
+ fm.setLocation(SOURCE_PATH, Arrays.asList(new File(testDir, "tests")));
+
+ // Make sure classes are written to scratch dir.
+ fm.setLocation(CLASS_OUTPUT, Arrays.asList(new File(".")));
+
+ for (JavaFileObject jfo : fm.list(SOURCE_PATH, "", Collections.singleton(SOURCE), true)) {
new LVTHarness(jfo).check();
}
if (nerrors > 0) {
@@ -86,8 +91,7 @@
JavaFileObject jfo;
- Map<ElementKey, AliveRanges> aliveRangeMap =
- new HashMap<ElementKey, AliveRanges>();
+ Map<ElementKey, AliveRanges> aliveRangeMap = new HashMap<>();
Set<String> declaredKeys = new HashSet<>();
List<ElementKey> seenAliveRanges = new ArrayList<>();
@@ -96,15 +100,19 @@
}
protected void check() throws Exception {
- JavacTask ct = (JavacTask)comp.getTask(null, fm, null, Arrays.asList("-g"),
- null, Arrays.asList(jfo));
- System.err.println("compiling code " + jfo.toString());
+
+ JavacTask ct = (JavacTask) comp.getTask(null, fm, null, Arrays.asList("-g"),
+ null, Arrays.asList(jfo));
+ System.err.println("compiling code " + jfo);
ct.setProcessors(Collections.singleton(new AliveRangeFinder()));
if (!ct.call()) {
throw new AssertionError("Error during compilation");
}
- checkClassFile(new File(jfo.getName().replace(".java", ".class")));
+
+ File javaFile = new File(jfo.getName());
+ File classFile = new File(javaFile.getName().replace(".java", ".class"));
+ checkClassFile(classFile);
//check all candidates have been used up
for (Map.Entry<ElementKey, AliveRanges> entry : aliveRangeMap.entrySet()) {
--- a/langtools/test/tools/javac/lambda/8023558/T8023558a.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/lambda/8023558/T8023558a.java Thu Oct 03 19:18:54 2013 +0100
@@ -31,8 +31,14 @@
T get();
}
+ static class K<T> implements SAM<T> {
+ public T get() {
+ return (T)this;
+ }
+ }
+
public static void main(String[] args) {
- SAM<SAM> sam = new SAM<SAM>() { public SAM get() { return null; } };
+ SAM<SAM> sam = new SAM<SAM>() { public SAM get() { return new K<>(); } };
SAM temp = sam.get()::get;
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/ByteCodeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,647 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8011738
+ * @author sogoel
+ * @summary Code translation test for Lambda expressions, method references
+ * @run main ByteCodeTest
+ */
+
+import com.sun.tools.classfile.Attribute;
+import com.sun.tools.classfile.BootstrapMethods_attribute;
+import com.sun.tools.classfile.ClassFile;
+import com.sun.tools.classfile.ConstantPool;
+import com.sun.tools.classfile.ConstantPoolException;
+import com.sun.tools.classfile.ConstantPool.*;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+public class ByteCodeTest {
+
+ static boolean IS_DEBUG = false;
+ public static void main(String[] args) {
+ File classFile = null;
+ int err = 0;
+ boolean verifyResult = false;
+ for(TestCases tc : TestCases.values()) {
+ classFile = getCompiledFile(tc.name(), tc.srcCode);
+ if(classFile == null) { // either testFile or classFile was not created
+ err++;
+ } else {
+ verifyResult = verifyClassFileAttributes(classFile, tc);
+ if(!verifyResult)
+ System.out.println("Bootstrap class file attributes did not match for " + tc.name());
+ }
+ }
+ if(err > 0)
+ throw new RuntimeException("Found " + err + " found");
+ else
+ System.out.println("Test passed");
+ }
+
+ private static boolean verifyClassFileAttributes(File classFile, TestCases tc) {
+ ClassFile c = null;
+ try {
+ c = ClassFile.read(classFile);
+ } catch (IOException | ConstantPoolException e) {
+ e.printStackTrace();
+ }
+ ConstantPoolVisitor cpv = new ConstantPoolVisitor(c, c.constant_pool.size());
+ Map<Integer, String> hm = cpv.getBSMMap();
+
+ List<String> expectedValList = tc.getExpectedArgValues();
+ expectedValList.add(tc.bsmSpecifier.specifier);
+ if(!(hm.values().containsAll(new HashSet<String>(expectedValList)))) {
+ System.out.println("Values do not match");
+ return false;
+ }
+ return true;
+ }
+
+ private static File getCompiledFile(String fname, String srcString) {
+ File testFile = null, classFile = null;
+ boolean isTestFileCreated = true;
+
+ try {
+ testFile = writeTestFile(fname+".java", srcString);
+ } catch(IOException ioe) {
+ isTestFileCreated = false;
+ System.err.println("fail to write" + ioe);
+ }
+
+ if(isTestFileCreated) {
+ try {
+ classFile = compile(testFile);
+ } catch (Error err) {
+ System.err.println("fail compile. Source:\n" + srcString);
+ throw err;
+ }
+ }
+ return classFile;
+ }
+
+ static File writeTestFile(String fname, String source) throws IOException {
+ File f = new File(fname);
+ PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(f)));
+ out.println(source);
+ out.close();
+ return f;
+ }
+
+ static File compile(File f) {
+ int rc = com.sun.tools.javac.Main.compile(new String[] {
+ "-source", "1.8", "-g", f.getPath() });
+ if (rc != 0)
+ throw new Error("compilation failed. rc=" + rc);
+ String path = f.getPath();
+ return new File(path.substring(0, path.length() - 5) + ".class");
+ }
+
+ static void debugln(String str) {
+ if(IS_DEBUG)
+ System.out.println(str);
+ }
+
+ enum BSMSpecifier {
+ SPECIFIER1("REF_invokeStatic java/lang/invoke/LambdaMetafactory metaFactory " +
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;" +
+ "Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)" +
+ "Ljava/lang/invoke/CallSite;"),
+ SPECIFIER2("REF_invokeStatic java/lang/invoke/LambdaMetafactory altMetaFactory " +
+ "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;" +
+ "[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;");
+
+ String specifier;
+ private BSMSpecifier(String specifier) {
+ this.specifier = specifier;
+ }
+ }
+
+ enum TestCases {
+ // Single line lambda expression
+ TC1("class TC1 {\n" +
+ " public static void main(String[] args) {\n" +
+ " Object o = (Runnable) () -> { System.out.println(\"hi\");};\n" +
+ " }\n"+
+ "}", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface java/lang/Runnable run ()V");
+ valList.add("REF_invokeStatic TC1 lambda$0 ()V");
+ valList.add("()V");
+ return valList;
+ }
+ },
+
+ // Lambda expression in a for loop
+ TC2("import java.util.*;\n" +
+ "public class TC2 {\n" +
+ " void TC2_test() {\n" +
+ " List<String> list = new ArrayList<>();\n" +
+ " list.add(\"A\");\n" +
+ " list.add(\"B\");\n" +
+ " list.stream().forEach( s -> { System.out.println(s); } );\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " new TC2().TC2_test();\n" +
+ " }\n" +
+ "}", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface java/util/function/Consumer accept (Ljava/lang/Object;)V");
+ valList.add("REF_invokeStatic TC2 lambda$0 (Ljava/lang/String;)V");
+ valList.add("(Ljava/lang/String;)V");
+ return valList;
+ }
+ },
+
+ // Lambda initializer
+ TC3("class TC3 {\n" +
+ " interface SAM {\n" +
+ " void m(int i);\n" +
+ " }\n" +
+ " SAM lambda_03 = (int pos) -> { };\n" +
+ "}", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC3$SAM m (I)V");
+ valList.add("REF_invokeStatic TC3 lambda$0 (I)V");
+ valList.add("(I)V");
+ return valList;
+ }
+ },
+
+ // Array initializer
+ TC4("class TC4 {\n" +
+ " interface Block<T> {\n" +
+ " void m(T t);\n" +
+ " }\n" +
+ " void test1() {\n" +
+ " Block<?>[] arr1 = { t -> { }, t -> { } };\n" +
+ " }\n" +
+ "}", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC4$Block m (Ljava/lang/Object;)V");
+ valList.add("REF_invokeStatic TC4 lambda$0 (Ljava/lang/Object;)V");
+ valList.add("(Ljava/lang/Object;)V");
+ valList.add("REF_invokeStatic TC4 lambda$1 (Ljava/lang/Object;)V");
+ return valList;
+ }
+ },
+
+ //Lambda expression as a method arg
+ TC5("class TC5 {\n"+
+ " interface MapFun<T,R> { R m( T n); }\n" +
+ " void meth( MapFun<String,Integer> mf ) {\n" +
+ " assert( mf.m(\"four\") == 4);\n" +
+ " }\n"+
+ " void test(Integer i) {\n" +
+ " meth(s -> { Integer len = s.length(); return len; } );\n" +
+ " }\n"+
+ "}", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC5$MapFun m (Ljava/lang/Object;)Ljava/lang/Object;");
+ valList.add("REF_invokeStatic TC5 lambda$0 (Ljava/lang/String;)Ljava/lang/Integer;");
+ valList.add("(Ljava/lang/String;)Ljava/lang/Integer;");
+ return valList;
+ }
+ },
+
+ //Inner class of Lambda expression
+ TC6("class TC6 {\n" +
+ " interface MapFun<T, R> { R m( T n); }\n" +
+ " MapFun<Class<?>,String> cs;\n" +
+ " void test() {\n" +
+ " cs = c -> {\n" +
+ " class innerClass {\n" +
+ " Class<?> icc;\n" +
+ " innerClass(Class<?> _c) { icc = _c; }\n" +
+ " String getString() { return icc.toString(); }\n" +
+ " }\n" +
+ " return new innerClass(c).getString();\n"+
+ " };\n" +
+ " }\n" +
+ "}\n", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC6$MapFun m (Ljava/lang/Object;)Ljava/lang/Object;");
+ valList.add("REF_invokeSpecial TC6 lambda$0 (Ljava/lang/Class;)Ljava/lang/String;");
+ valList.add("(Ljava/lang/Class;)Ljava/lang/String;");
+ return valList;
+ }
+ },
+
+ // Method reference
+ TC7("class TC7 {\n" +
+ " static interface SAM {\n" +
+ " void m(Integer i);\n" +
+ " }\n" +
+ " void m(Integer i) {}\n" +
+ " SAM s = this::m;\n" +
+ "}\n", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC7$SAM m (Ljava/lang/Integer;)V");
+ valList.add("REF_invokeVirtual TC7 m (Ljava/lang/Integer;)V");
+ valList.add("(Ljava/lang/Integer;)V");
+ return valList;
+ }
+ },
+
+ // Constructor reference
+ TC8("public class TC8 {\n" +
+ " static interface A {Fee<String> m();}\n" +
+ " static class Fee<T> {\n" +
+ " private T t;\n" +
+ " public Fee() {}\n" +
+ " }\n" +
+ " public static void main(String[] args) {\n" +
+ " A a = Fee<String>::new; \n" +
+ " }\n" +
+ "}\n", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC8$A m ()LTC8$Fee;");
+ valList.add("REF_newInvokeSpecial TC8$Fee <init> ()V");
+ valList.add("()LTC8$Fee;");
+ return valList;
+ }
+ },
+
+ // Recursive lambda expression
+ TC9("class TC9 {\n" +
+ " interface Recursive<T, R> { T apply(R n); };\n" +
+ " Recursive<Integer,Integer> factorial;\n" +
+ " void test(Integer j) {\n" +
+ " factorial = i -> { return i == 0 ? 1 : i * factorial.apply( i - 1 ); };\n" +
+ " }\n" +
+ "}\n", BSMSpecifier.SPECIFIER1) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeInterface TC9$Recursive apply (Ljava/lang/Object;)Ljava/lang/Object;");
+ valList.add("REF_invokeSpecial TC9 lambda$0 (Ljava/lang/Integer;)Ljava/lang/Integer;");
+ valList.add("(Ljava/lang/Integer;)Ljava/lang/Integer;");
+ return valList;
+ }
+ },
+
+ //Serializable Lambda
+ TC10("import java.io.Serializable;\n" +
+ "class TC10 {\n" +
+ " interface Foo { int m(); }\n" +
+ " public static void main(String[] args) {\n" +
+ " Foo f1 = (Foo & Serializable)() -> 3;\n" +
+ " }\n" +
+ "}\n", BSMSpecifier.SPECIFIER2) {
+
+ @Override
+ List<String> getExpectedArgValues() {
+ List<String> valList = new ArrayList<>();
+ valList.add("REF_invokeStatic java/lang/invoke/LambdaMetafactory altMetaFactory (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;");
+ valList.add("REF_invokeInterface TC10$Foo m ()I");
+ valList.add("REF_invokeStatic TC10 lambda$main$3231c38a$0 ()I");
+ valList.add("()I");
+ valList.add("1");
+ return valList;
+ }
+ };
+
+ String srcCode;
+ BSMSpecifier bsmSpecifier;
+
+ TestCases(String src, BSMSpecifier bsmSpecifier) {
+ this.srcCode = src;
+ // By default, all test cases will have bootstrap method specifier as Lambda.MetaFactory
+ // For serializable lambda test cases, bootstrap method specifier changed to altMetaFactory
+ this.bsmSpecifier = bsmSpecifier;
+ }
+
+ List<String> getExpectedArgValues() {
+ return null;
+ }
+
+ void setSrcCode(String src) {
+ srcCode = src;
+ }
+ }
+
+ static class ConstantPoolVisitor implements ConstantPool.Visitor<String, Integer> {
+ final List<String> slist;
+ final ClassFile cf;
+ final ConstantPool cfpool;
+ final Map<Integer, String> bsmMap;
+
+
+ public ConstantPoolVisitor(ClassFile cf, int size) {
+ slist = new ArrayList<>(size);
+ for (int i = 0 ; i < size; i++) {
+ slist.add(null);
+ }
+ this.cf = cf;
+ this.cfpool = cf.constant_pool;
+ bsmMap = readBSM();
+ }
+
+ public Map<Integer, String> getBSMMap() {
+ return Collections.unmodifiableMap(bsmMap);
+ }
+
+ public String visit(CPInfo c, int index) {
+ return c.accept(this, index);
+ }
+
+ private Map<Integer, String> readBSM() {
+ BootstrapMethods_attribute bsmAttr =
+ (BootstrapMethods_attribute) cf.getAttribute(Attribute.BootstrapMethods);
+ if (bsmAttr != null) {
+ Map<Integer, String> out =
+ new HashMap<>(bsmAttr.bootstrap_method_specifiers.length);
+ for (BootstrapMethods_attribute.BootstrapMethodSpecifier bsms :
+ bsmAttr.bootstrap_method_specifiers) {
+ int index = bsms.bootstrap_method_ref;
+ try {
+ String value = slist.get(index);
+ if (value == null) {
+ value = visit(cfpool.get(index), index);
+ debugln("[SG]: index " + index);
+ debugln("[SG]: value " + value);
+ slist.set(index, value);
+ out.put(index, value);
+ }
+ for (int idx : bsms.bootstrap_arguments) {
+ value = slist.get(idx);
+ if (value == null) {
+ value = visit(cfpool.get(idx), idx);
+ debugln("[SG]: idx " + idx);
+ debugln("[SG]: value " + value);
+ slist.set(idx, value);
+ out.put(idx, value);
+ }
+ }
+ } catch (InvalidIndex ex) {
+ ex.printStackTrace();
+ }
+ }
+ return out;
+ }
+ return new HashMap<>(0);
+ }
+
+ @Override
+ public String visitClass(CONSTANT_Class_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.name_index), c.name_index);
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitDouble(CONSTANT_Double_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ value = Double.toString(c.value);
+ slist.set(p, value);
+ }
+ return value;
+ }
+
+ @Override
+ public String visitFieldref(CONSTANT_Fieldref_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.class_index), c.class_index);
+ value = value.concat(" " + visit(cfpool.get(c.name_and_type_index),
+ c.name_and_type_index));
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitFloat(CONSTANT_Float_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ value = Float.toString(c.value);
+ slist.set(p, value);
+ }
+ return value;
+ }
+
+ @Override
+ public String visitInteger(CONSTANT_Integer_info cnstnt, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ value = Integer.toString(cnstnt.value);
+ slist.set(p, value);
+ }
+ return value;
+ }
+
+ @Override
+ public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info c,
+ Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.class_index), c.class_index);
+ value = value.concat(" " +
+ visit(cfpool.get(c.name_and_type_index),
+ c.name_and_type_index));
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitInvokeDynamic(CONSTANT_InvokeDynamic_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = bsmMap.get(c.bootstrap_method_attr_index) + " "
+ + visit(cfpool.get(c.name_and_type_index), c.name_and_type_index);
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitLong(CONSTANT_Long_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ value = Long.toString(c.value);
+ slist.set(p, value);
+ }
+ return value;
+ }
+
+ @Override
+ public String visitNameAndType(CONSTANT_NameAndType_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.name_index), c.name_index);
+ value = value.concat(" " +
+ visit(cfpool.get(c.type_index), c.type_index));
+ slist.set(p, value);
+ } catch (InvalidIndex ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitMethodref(CONSTANT_Methodref_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.class_index), c.class_index);
+ value = value.concat(" " +
+ visit(cfpool.get(c.name_and_type_index),
+ c.name_and_type_index));
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitMethodHandle(CONSTANT_MethodHandle_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = c.reference_kind.name();
+ value = value.concat(" "
+ + visit(cfpool.get(c.reference_index), c.reference_index));
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitMethodType(CONSTANT_MethodType_info c, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ try {
+ value = visit(cfpool.get(c.descriptor_index), c.descriptor_index);
+ slist.set(p, value);
+ } catch (ConstantPoolException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return value;
+ }
+
+ @Override
+ public String visitString(CONSTANT_String_info c, Integer p) {
+
+ try {
+ String value = slist.get(p);
+ if (value == null) {
+ value = c.getString();
+ slist.set(p, value);
+ }
+ return value;
+ } catch (ConstantPoolException ex) {
+ throw new RuntimeException("Fatal error", ex);
+ }
+ }
+
+ @Override
+ public String visitUtf8(CONSTANT_Utf8_info cnstnt, Integer p) {
+
+ String value = slist.get(p);
+ if (value == null) {
+ value = cnstnt.value;
+ slist.set(p, value);
+ }
+ return value;
+ }
+ }
+}
+
--- a/langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -196,7 +196,7 @@
}
static List<CastInfo> allCastInfo() {
- ListBuffer<CastInfo> buf = ListBuffer.lb();
+ ListBuffer<CastInfo> buf = new ListBuffer<>();
for (CastKind kind : CastKind.values()) {
for (TypeKind b1 : TypeKind.values()) {
if (kind.nbounds == 1) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/methodReferenceExecution/MethodReferenceNullCheckTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8024696
+ * @summary Missing null check in bound method reference capture
+ */
+
+import com.sun.tools.javac.util.Assert;
+import java.util.function.*;
+
+public class MethodReferenceNullCheckTest {
+ public static void main(String[] args) {
+ String s = null;
+ boolean npeFired = false;
+ try {
+ Supplier<Boolean> ss = s::isEmpty;
+ } catch (NullPointerException npe) {
+ npeFired = true;
+ } finally {
+ Assert.check(npeFired, "NPE should have been thrown");
+ }
+ }
+}
--- a/langtools/test/tools/javac/multicatch/Pos05.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/multicatch/Pos05.java Thu Oct 03 19:18:54 2013 +0100
@@ -95,7 +95,7 @@
throw new Error("Code attribute for test() method not found");
}
Exception_data firstExceptionTable = null;
- for (int i = 0 ; i < ea.exception_table_langth; i++) {
+ for (int i = 0 ; i < ea.exception_table_length; i++) {
if (firstExceptionTable == null) {
firstExceptionTable = ea.exception_table[i];
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/type/BoundsTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6499673
+ * @library /tools/javac/lib
+ * @build JavacTestingAbstractProcessor BoundsTest
+ * @run main BoundsTest
+ * @summary Assertion check for TypeVariable.getUpperBound() fails
+ */
+
+import com.sun.source.util.*;
+import com.sun.tools.javac.api.*;
+import com.sun.tools.javac.file.*;
+import javax.annotation.processing.*;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.type.*;
+import javax.lang.model.util.ElementFilter;
+import javax.lang.model.element.*;
+import javax.tools.*;
+import java.util.*;
+import java.io.*;
+
+public class BoundsTest {
+
+ private int errors = 0;
+ private static final String Intersection_name = "IntersectionTest.java";
+ private static final String Intersection_contents =
+ "import java.util.List;\n" +
+ "import java.io.Serializable;\t" +
+ "public class IntersectionTest<S extends List & Serializable> {\n" +
+ " void method(S s) { }\n" +
+ "}";
+ private static final String[] Intersection_bounds = {
+ "java.util.List",
+ "java.io.Serializable"
+ };
+ private static final String[] Intersection_supers = {
+ "java.util.List",
+ "java.io.Serializable"
+ };
+
+ private static final String Single_name = "SingleTest.java";
+ private static final String Single_contents =
+ "import java.util.List;\n" +
+ "public class SingleTest<S extends List> {\n" +
+ " void method(S s) { }\n" +
+ "}";
+ private static final String[] Single_bounds = {
+ "java.util.List",
+ };
+ private static final String[] Single_supers = {
+ "java.lang.Object",
+ "java.util.Collection"
+ };
+
+ private static final String NoBounds_name = "NoBoundsTest.java";
+ private static final String NoBounds_contents =
+ "public class NoBoundsTest<S> {\n" +
+ " void method(S s) { }\n" +
+ "}";
+ private static final String[] NoBounds_bounds = {
+ "java.lang.Object",
+ };
+ private static final String[] NoBounds_supers = {};
+
+ private HashSet<CharSequence> expected_bounds;
+ private HashSet<CharSequence> expected_supers;
+
+ private static final File classesdir = new File("intersectionproperties");
+ private static final JavaCompiler comp =
+ ToolProvider.getSystemJavaCompiler();
+ private static final StandardJavaFileManager fm =
+ comp.getStandardFileManager(null, null, null);
+
+ public void runOne(final String Test_name, final String Test_contents,
+ final String[] Test_bounds, final String[] Test_supers)
+ throws IOException {
+ System.err.println("Testing " + Test_name);
+ expected_bounds = new HashSet<CharSequence>(Arrays.asList(Test_bounds));
+ expected_supers = new HashSet<CharSequence>(Arrays.asList(Test_supers));
+ final Iterable<? extends JavaFileObject> files =
+ fm.getJavaFileObjectsFromFiles(Collections.singleton(writeFile(classesdir, Test_name, Test_contents)));
+ final JavacTask ct =
+ (JavacTask)comp.getTask(null, fm, null, null, null, files);
+ ct.setProcessors(Collections.singleton(new TestProcessor()));
+
+ if (!ct.call()) {
+ System.err.println("Compilation unexpectedly failed");
+ errors++;
+ }
+ }
+
+ public void run() throws IOException {
+ runOne(Intersection_name, Intersection_contents,
+ Intersection_bounds, Intersection_supers);
+ runOne(Single_name, Single_contents,
+ Single_bounds, Single_supers);
+ runOne(NoBounds_name, NoBounds_contents,
+ NoBounds_bounds, NoBounds_supers);
+
+ if (0 != errors)
+ throw new RuntimeException(errors + " errors occurred");
+ }
+
+ public static void main(String... args) throws IOException {
+ new IntersectionPropertiesTest().run();
+ }
+
+ private static File writeFile(File dir, String path, String body)
+ throws IOException {
+ File f = new File(dir, path);
+ f.getParentFile().mkdirs();
+ try (FileWriter out = new FileWriter(f)) {
+ out.write(body);
+ }
+ return f;
+ }
+
+ private class TestProcessor extends JavacTestingAbstractProcessor {
+
+ private Set<? extends Element> rootElements;
+
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ rootElements = roundEnv.getRootElements();
+ if (!rootElements.isEmpty()) {
+ performCheck();
+ }
+ return true;
+ }
+
+ private void performCheck() {
+ TypeElement typeElement = (TypeElement) rootElements.iterator().next();
+ ExecutableElement method = ElementFilter.methodsIn(typeElement.getEnclosedElements()).get(0);
+ TypeVariable typeVariable = (TypeVariable) method.getParameters().get(0).asType();
+
+ final TypeMirror upperBound = typeVariable.getUpperBound();
+
+ TypeParameterElement typeParameterElement = ((TypeParameterElement) typeVariable.asElement());
+ final List<? extends TypeMirror> bounds = typeParameterElement.getBounds();
+ final List<? extends TypeMirror> supers = processingEnv.getTypeUtils().directSupertypes(upperBound);
+
+ final HashSet<CharSequence> actual_bounds = new HashSet<CharSequence>();
+ final HashSet<CharSequence> actual_supers = new HashSet<CharSequence>();
+
+ for(TypeMirror ty : bounds) {
+ actual_bounds.add(((TypeElement)((DeclaredType)ty).asElement()).getQualifiedName());
+ }
+
+ for(TypeMirror ty : supers) {
+ actual_supers.add(((TypeElement)((DeclaredType)ty).asElement()).getQualifiedName());
+ }
+
+
+ if (!expected_bounds.equals(actual_bounds)) {
+ System.err.println("Mismatched expected and actual bounds.");
+ System.err.println("Expected:");
+ for(CharSequence tm : expected_bounds)
+ System.err.println(" " + tm);
+ System.err.println("Actual:");
+ for(CharSequence tm : actual_bounds)
+ System.err.println(" " + tm);
+ errors++;
+ }
+
+ if (!expected_supers.equals(actual_supers)) {
+ System.err.println("Mismatched expected and actual bounds.");
+ System.err.println("Expected:");
+ for(CharSequence tm : expected_supers)
+ System.err.println(" " + tm);
+ System.err.println("Actual:");
+ for(CharSequence tm : actual_supers)
+ System.err.println(" " + tm);
+ errors++;
+ }
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/model/type/IntersectionPropertiesTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 6499673
+ * @library /tools/javac/lib
+ * @build JavacTestingAbstractProcessor IntersectionPropertiesTest
+ * @run main IntersectionPropertiesTest
+ * @summary Assertion check for TypeVariable.getUpperBound() fails
+ */
+
+import com.sun.source.util.*;
+import com.sun.tools.javac.api.*;
+import com.sun.tools.javac.file.*;
+import javax.annotation.processing.*;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.type.*;
+import javax.lang.model.util.ElementFilter;
+import javax.lang.model.element.*;
+import javax.tools.*;
+import java.util.*;
+import java.io.*;
+
+public class IntersectionPropertiesTest {
+
+ private int errors = 0;
+ private static final String Intersection_name = "IntersectionTest.java";
+ private static final String Intersection_contents =
+ "import java.util.List;\n" +
+ "import java.io.Serializable;\t" +
+ "public class IntersectionTest<S extends List & Serializable> {\n" +
+ " void method(S s) { }\n" +
+ "}";
+
+ private static final File classesdir = new File("intersectionproperties");
+ private static final JavaCompiler comp =
+ ToolProvider.getSystemJavaCompiler();
+ private static final StandardJavaFileManager fm =
+ comp.getStandardFileManager(null, null, null);
+
+ public void runOne(final String Test_name, final String Test_contents)
+ throws IOException {
+ System.err.println("Testing " + Test_name);
+ final Iterable<? extends JavaFileObject> files =
+ fm.getJavaFileObjectsFromFiles(Collections.singleton(writeFile(classesdir, Test_name, Test_contents)));
+ final JavacTask ct =
+ (JavacTask)comp.getTask(null, fm, null, null, null, files);
+ ct.setProcessors(Collections.singleton(new TestProcessor()));
+
+ if (!ct.call()) {
+ System.err.println("Compilation unexpectedly failed");
+ errors++;
+ }
+ }
+
+ public void run() throws IOException {
+ runOne(Intersection_name, Intersection_contents);
+
+ if (0 != errors)
+ throw new RuntimeException(errors + " errors occurred");
+ }
+
+ public static void main(String... args) throws IOException {
+ new IntersectionPropertiesTest().run();
+ }
+
+ private static File writeFile(File dir, String path, String body)
+ throws IOException {
+ File f = new File(dir, path);
+ f.getParentFile().mkdirs();
+ try (FileWriter out = new FileWriter(f)) {
+ out.write(body);
+ }
+ return f;
+ }
+
+ private class TestProcessor extends JavacTestingAbstractProcessor {
+
+ private Set<? extends Element> rootElements;
+
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ rootElements = roundEnv.getRootElements();
+ if (!rootElements.isEmpty()) {
+ performCheck();
+ }
+ return true;
+ }
+
+ private void performCheck() {
+ TypeElement typeElement = (TypeElement) rootElements.iterator().next();
+ ExecutableElement method = ElementFilter.methodsIn(typeElement.getEnclosedElements()).get(0);
+ TypeVariable typeVariable = (TypeVariable) method.getParameters().get(0).asType();
+
+ final TypeMirror upperBound = typeVariable.getUpperBound();
+
+ TypeParameterElement typeParameterElement = ((TypeParameterElement) typeVariable.asElement());
+ final List<? extends TypeMirror> bounds = typeParameterElement.getBounds();
+ final HashSet<TypeMirror> actual = new HashSet<TypeMirror>(processingEnv.getTypeUtils().directSupertypes(upperBound));
+ final HashSet<TypeMirror> expected = new HashSet<TypeMirror>(bounds);
+ if (!expected.equals(actual)) {
+ System.err.println("Mismatched expected and actual bounds.");
+ System.err.println("Expected:");
+ for(TypeMirror tm : expected)
+ System.err.println(" " + tm);
+ System.err.println("Actual:");
+ for(TypeMirror tm : actual)
+ System.err.println(" " + tm);
+ errors++;
+ }
+ }
+
+ }
+
+}
--- a/langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -176,7 +176,7 @@
*/
void checkElems(CompoundScope cs, Filter<Symbol> sf) {
int count = 0;
- ListBuffer<Symbol> found = ListBuffer.lb();
+ ListBuffer<Symbol> found = new ListBuffer<>();
List<Symbol> allSymbols = sf == null ?
elems :
filter(elems, sf);
@@ -216,7 +216,7 @@
}
List<Symbol> filter(List<Symbol> elems, Filter<Symbol> sf) {
- ListBuffer<Symbol> res = ListBuffer.lb();
+ ListBuffer<Symbol> res = new ListBuffer<>();
for (Symbol s : elems) {
if (sf.accepts(s)) {
res.append(s);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/MakeQualIdent.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8023835
+ * @summary Verify that TreeMaker.QualIdent(Symbol) field access cascade ends with
+ * the top-level package (when no toplevel is set in TreeMaker)
+ * @run main MakeQualIdent
+ */
+
+import com.sun.source.tree.IdentifierTree;
+import com.sun.source.tree.MemberSelectTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.util.JavacTask;
+import com.sun.source.util.TreeScanner;
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.tree.TreeMaker;
+import com.sun.tools.javac.util.Context;
+import java.util.ArrayList;
+
+public class MakeQualIdent {
+ public static void main(String... args) throws Exception {
+ JavacTool tool = JavacTool.create();
+ JavacTask task = tool.getTask(null, null, null, new ArrayList<String>(), null, null);
+ Context ctx = ((JavacTaskImpl)task).getContext();
+ TreeMaker treeMaker = TreeMaker.instance(ctx);
+ Symtab syms = Symtab.instance(ctx);
+
+ String stringTree = printTree(treeMaker.QualIdent(syms.stringType.tsym));
+
+ if (!"java.lang.String".equals(stringTree)) {
+ throw new IllegalStateException(stringTree);
+ }
+ }
+
+ private static String printTree(Tree tree) {
+ final StringBuilder result = new StringBuilder();
+
+ new TreeScanner<Void, Void>() {
+ @Override public Void visitIdentifier(IdentifierTree node, Void p) {
+ result.append(node.getName());
+ return super.visitIdentifier(node, p);
+ }
+ @Override public Void visitMemberSelect(MemberSelectTree node, Void p) {
+ scan(node.getExpression(), null);
+ result.append(".");
+ result.append(node.getIdentifier());
+ return null;
+ }
+ }.scan(tree, null);
+
+ return result.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/ScopeTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8023835
+ * @summary Verify that implicit type of lambda parameter is correctly attributed
+ * in Scope
+ * @run main ScopeTest
+ */
+
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.MemberSelectTree;
+import com.sun.source.tree.Scope;
+import com.sun.source.util.JavacTask;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.TreePathScanner;
+import com.sun.source.util.Trees;
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.model.JavacTypes;
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collections;
+import javax.lang.model.element.Element;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.util.Types;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+
+public class ScopeTest {
+
+ private static final String SOURCE_CODE =
+ "public class Test {\n" +
+ " private static void test() {\n" +
+ " InvokeOn f = null;\n" +
+ " f.run(x -> { x.correct(); });\n" +
+ " }\n" +
+ " public static final class FooBar {\n" +
+ " public void dontRun() { }\n" +
+ " }\n" +
+ "}\n" +
+ "class InvokeOn {\n" +
+ " public void run(I i) { }\n" +
+ "}\n" +
+ "class FooBar {\n" +
+ " public void correct() { }\n" +
+ "}\n" +
+ "interface I {\n" +
+ " public void run(FooBar f);\n" +
+ "}";
+
+ public static void main(String... args) throws Exception {
+ verifyLambdaScopeCorrect("");
+ verifyLambdaScopeCorrect("package test;");
+ }
+
+ private static void verifyLambdaScopeCorrect(final String packageClause) throws Exception {
+ JavacTool tool = JavacTool.create();
+ JavaFileObject source = new SimpleJavaFileObject(URI.create("mem://Test.java"), Kind.SOURCE) {
+ @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+ return packageClause + SOURCE_CODE;
+ }
+ @Override public boolean isNameCompatible(String simpleName, Kind kind) {
+ return true;
+ }
+ };
+ Iterable<? extends JavaFileObject> fos = Collections.singletonList(source);
+ JavacTask task = tool.getTask(null, null, null, new ArrayList<String>(), null, fos);
+ final Types types = JavacTypes.instance(((JavacTaskImpl) task).getContext());
+ final Trees trees = Trees.instance(task);
+ CompilationUnitTree cu = task.parse().iterator().next();
+
+ task.analyze();
+
+ new TreePathScanner<Void, Void>() {
+ @Override public Void visitMemberSelect(MemberSelectTree node, Void p) {
+ if (node.getIdentifier().contentEquals("correct")) {
+ TypeMirror xType = trees.getTypeMirror(new TreePath(getCurrentPath(), node.getExpression()));
+ Scope scope = trees.getScope(getCurrentPath());
+ for (Element l : scope.getLocalElements()) {
+ if (!l.getSimpleName().contentEquals("x")) continue;
+ if (!types.isSameType(xType, l.asType())) {
+ throw new IllegalStateException("Incorrect variable type in scope: " + l.asType() + "; should be: " + xType);
+ }
+ }
+ }
+ return super.visitMemberSelect(node, p);
+ }
+ }.scan(cu, null);
+ }
+}
--- a/langtools/test/tools/javac/types/TypeHarness.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/types/TypeHarness.java Thu Oct 03 19:18:54 2013 +0100
@@ -213,8 +213,8 @@
/** compute a type substitution on 't' given a list of type mappings */
public Type subst(Type t, Mapping... maps) {
- ListBuffer<Type> from = ListBuffer.lb();
- ListBuffer<Type> to = ListBuffer.lb();
+ ListBuffer<Type> from = new ListBuffer<>();
+ ListBuffer<Type> to = new ListBuffer<>();
for (Mapping tm : maps) {
from.append(tm.from);
to.append(tm.to);
--- a/langtools/test/tools/javac/warnings/6747671/T6747671.java Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/warnings/6747671/T6747671.java Thu Oct 03 19:18:54 2013 +0100
@@ -1,6 +1,6 @@
/**
* @test /nodynamiccopyright/
- * @bug 6747671
+ * @bug 6747671 8022567
* @summary -Xlint:rawtypes
* @compile/ref=T6747671.out -XDrawDiagnostics -Xlint:rawtypes T6747671.java
*/
@@ -32,4 +32,11 @@
A a2 = new A() {};//raw warning (2)
a2.new Z() {};//raw warning
}
+
+ @TA B @TA[] arr = new @TA B @TA [0];//JDK-8022567: raw warning (2)
+ Class<B[]> classes1;//no warning
+ Class<B>[] classes2;//no warning
+
+ @java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)
+ @interface TA { }
}
--- a/langtools/test/tools/javac/warnings/6747671/T6747671.out Sat Sep 14 20:43:34 2013 +0100
+++ b/langtools/test/tools/javac/warnings/6747671/T6747671.out Thu Oct 03 19:18:54 2013 +0100
@@ -7,4 +7,6 @@
T6747671.java:32:9: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
T6747671.java:32:20: compiler.warn.raw.class.use: T6747671.A, T6747671<E>.A<X>
T6747671.java:33:16: compiler.warn.raw.class.use: T6747671.A.Z, T6747671<E>.A<X>.Z<Y>
-9 warnings
+T6747671.java:36:9: compiler.warn.raw.class.use: @T6747671.TA T6747671.B, T6747671.B<X>
+T6747671.java:36:27: compiler.warn.raw.class.use: T6747671.B, T6747671.B<X>
+11 warnings
--- a/make/jprt.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/make/jprt.properties Thu Oct 03 19:18:54 2013 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -43,8 +43,8 @@
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
macosx_x64_10.7-{product|fastdebug}, \
- windows_i586_5.1-{product|fastdebug}, \
- windows_x64_5.2-{product|fastdebug}
+ windows_i586_6.1-{product|fastdebug}, \
+ windows_x64_6.1-{product|fastdebug}
# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}
@@ -58,8 +58,8 @@
linux_i586_2.6-product-{c1|c2}-TESTNAME, \
linux_x64_2.6-product-c2-TESTNAME, \
macosx_x64_10.7-product-c2-TESTNAME, \
- windows_i586_5.1-product-c1-TESTNAME, \
- windows_x64_5.2-product-c2-TESTNAME
+ windows_i586_6.1-product-c1-TESTNAME, \
+ windows_x64_6.1-product-c2-TESTNAME
# Default vm test targets (testset=default)
jprt.vm.default.test.targets= \
--- a/make/scripts/webrev.ksh Sat Sep 14 20:43:34 2013 +0100
+++ b/make/scripts/webrev.ksh Thu Oct 03 19:18:54 2013 +0100
@@ -2704,11 +2704,11 @@
rm -f $WDIR/$DIR/$F.html
its_a_jar=
- if expr $F : '.*\.jar' >/dev/null; then
+ if expr $F : '.*\.jar' \| $F : '.*\.zip' >/dev/null; then
its_a_jar=1
- # It's a JAR file, let's do it differntly
+ # It's a JAR or ZIP file, let's do it differently
if [[ -z $JAR ]]; then
- print "No access to jar, so can't produce diffs for jar files"
+ print "No access to jar, so can't produce diffs for jar or zip files"
else
if [ -f $ofile ]; then
$JAR -tvf $ofile >"$ofile".lst
--- a/nashorn/.hgtags Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/.hgtags Thu Oct 03 19:18:54 2013 +0100
@@ -217,3 +217,6 @@
f484bfb624dd06683cb33b524700a5dd4927a82b jdk8-b105
bf70cbd2c8369fd97ffdfcbe1a80dbc2797408ee jdk8-b106
f35e1255024b66f7cf82517798f45f6e194e5567 jdk8-b107
+445ad3f6d3b4ba62ebc483323e1919110a304053 jdk8-b108
+6ec2f9e5ed5bd60c2900976e6a54fdcac2f37e9e jdk8-b109
+d49a8c2173f5f90c9a39cc4af8e03cfa8f35ee4c jdk8-b110
--- a/nashorn/make/build-benchmark.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/make/build-benchmark.xml Thu Oct 03 19:18:54 2013 +0100
@@ -329,7 +329,7 @@
fork="true"
dir=".">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs.octane}"/>
+ <jvmarg line="${run.test.jvmargs.octane} -Xms${run.test.xms} -Xmx${run.test.xmx}"/>
<arg value="${octane-test-sys-prop.test.js.framework}"/>
<arg value="--"/>
<arg value="${octane-tests}"/>
@@ -357,7 +357,7 @@
classpath="${run.test.classpath}"
fork="true"
dir=".">
- <jvmarg line="${run.test.jvmargs.octane}"/>
+ <jvmarg line="${run.test.jvmargs.octane} -Xms${run.test.xms} -Xmx${run.test.xmx}"/>
<arg value="${octane-test-sys-prop.test.js.framework}"/>
<arg value="${octane-tests}"/>
<arg value="--runtime"/>
@@ -391,7 +391,7 @@
fork="true"
dir=".">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="-timezone=PST"/>
<arg value="--class-cache-size=50"/>
<arg value="${sunspider-test-sys-prop.test.js.framework}"/>
@@ -415,7 +415,7 @@
classpath="${run.test.classpath}"
fork="true"
dir=".">
- <jvmarg line="${run.test.jvmargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="${sunspider-test-sys-prop.test.js.framework}"/>
<arg value="${sunspider-tests}/"/>
</java>
--- a/nashorn/make/build.xml Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/make/build.xml Thu Oct 03 19:18:54 2013 +0100
@@ -66,6 +66,8 @@
<echo message="run.test.jvmargs=${run.test.jvmargs}"/>
<echo message="run.test.jvmargs.octane=${run.test.jvmargs.octane}"/>
+ <echo message="run.test.xms=${run.test.xms}"/>
+ <echo message="run.test.xmx=${run.test.xmx}"/>
</target>
@@ -320,7 +322,7 @@
<testng outputdir="${build.test.results.dir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs} ${run.test.jvmsecurityargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/>
<propertyset>
<propertyref prefix="test-sys-prop."/>
<mapper from="test-sys-prop.*" to="*" type="glob"/>
@@ -336,7 +338,7 @@
<!-- use just build.test.classes.dir to avoid referring to TestNG -->
<java classname="${parallel.test.runner}" dir="${basedir}" classpath="${build.test.classes.dir}" failonerror="true" fork="true">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs} ${run.test.jvmsecurityargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/>
<syspropertyset>
<propertyref prefix="test-sys-prop."/>
<mapper type="glob" from="test-sys-prop.*" to="*"/>
@@ -352,7 +354,7 @@
<testng outputdir="${build.test.results.dir}" classfilesetref="test.classes"
verbose="${testng.verbose}" haltonfailure="true" useDefaultListeners="false" listeners="${testng.listeners}" workingDir="${basedir}">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs} ${run.test.jvmsecurityargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/>
<propertyset>
<propertyref prefix="test262-test-sys-prop."/>
<mapper from="test262-test-sys-prop.*" to="*" type="glob"/>
@@ -369,7 +371,7 @@
<!-- use just build.test.classes.dir to avoid referring to TestNG -->
<java classname="${parallel.test.runner}" dir="${basedir}" fork="true">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs} ${run.test.jvmsecurityargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}"/>
<classpath>
<pathelement path="${run.test.classpath}"/>
</classpath>
@@ -387,7 +389,7 @@
description="Run the shell with a sample script">
<java classname="${nashorn.shell.tool}" fork="true" dir="samples">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="-dump-on-error"/>
<arg value="test.js"/>
</java>
@@ -397,7 +399,7 @@
description="Debug the shell with a sample script">
<java classname="${nashorn.shell.tool}" fork="true" dir="samples">
<jvmarg line="${ext.class.path}"/>
- <jvmarg line="${run.test.jvmargs}"/>
+ <jvmarg line="${run.test.jvmargs} -Xmx${run.test.xmx}"/>
<arg value="--print-code"/>
<arg value="--verify-code"/>
<arg value="--print-symbols"/>
--- a/nashorn/make/project.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/make/project.properties Thu Oct 03 19:18:54 2013 +0100
@@ -216,13 +216,14 @@
src.dir=src
test.src.dir=test/src
+# -Xmx is used for all tests, -Xms only for octane benchmark
run.test.xmx=3G
run.test.xms=2G
run.test.user.language=tr
run.test.user.country=TR
-run.test.jvmargs.common=-server -Xmx${run.test.xmx} -XX:+TieredCompilation -Dfile.encoding=UTF-8 -Duser.language=${run.test.user.language} -Duser.country=${run.test.user.country} -XX:+HeapDumpOnOutOfMemoryError
+run.test.jvmargs.common=-server -XX:+TieredCompilation -Dfile.encoding=UTF-8 -Duser.language=${run.test.user.language} -Duser.country=${run.test.user.country} -XX:+HeapDumpOnOutOfMemoryError
#-XX:-UseCompressedKlassPointers -XX:+PrintHeapAtGC -XX:ClassMetaspaceSize=300M
# -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMethods
@@ -231,12 +232,12 @@
run.test.jvmargs.main=${run.test.jvmargs.common} -ea
#-XX:-UseCompressedKlassPointers -XX:+PrintHeapAtGC -XX:ClassMetaspaceSize=300M
-run.test.jvmargs.octane.main=-Xms${run.test.xms} ${run.test.jvmargs.common}
+run.test.jvmargs.octane.main=${run.test.jvmargs.common}
run.test.jvmsecurityargs=-Xverify:all -Djava.security.properties=${basedir}/make/java.security.override -Djava.security.manager -Djava.security.policy=${basedir}/build/nashorn.policy
# VM options for script tests with @fork option
-test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} ${run.test.jvmsecurityargs}
+test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} ${run.test.jvmsecurityargs}
# path of rhino.jar for benchmarks
rhino.jar=
--- a/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Thu Oct 03 19:18:54 2013 +0100
@@ -185,21 +185,12 @@
@Override
public Object eval(final Reader reader, final ScriptContext ctxt) throws ScriptException {
- try {
- if (reader instanceof URLReader) {
- final URL url = ((URLReader)reader).getURL();
- final Charset cs = ((URLReader)reader).getCharset();
- return evalImpl(compileImpl(new Source(url.toString(), url, cs), ctxt), ctxt);
- }
- return evalImpl(Source.readFully(reader), ctxt);
- } catch (final IOException e) {
- throw new ScriptException(e);
- }
+ return evalImpl(makeSource(reader, ctxt), ctxt);
}
@Override
public Object eval(final String script, final ScriptContext ctxt) throws ScriptException {
- return evalImpl(script.toCharArray(), ctxt);
+ return evalImpl(makeSource(script, ctxt), ctxt);
}
@Override
@@ -221,16 +212,12 @@
@Override
public CompiledScript compile(final Reader reader) throws ScriptException {
- try {
- return asCompiledScript(compileImpl(Source.readFully(reader), context));
- } catch (final IOException e) {
- throw new ScriptException(e);
- }
+ return asCompiledScript(makeSource(reader, context));
}
@Override
public CompiledScript compile(final String str) throws ScriptException {
- return asCompiledScript(compileImpl(str.toCharArray(), context));
+ return asCompiledScript(makeSource(str, context));
}
// Invocable methods
@@ -292,6 +279,29 @@
// Implementation only below this point
+ private static Source makeSource(final Reader reader, final ScriptContext ctxt) throws ScriptException {
+ try {
+ if (reader instanceof URLReader) {
+ final URL url = ((URLReader)reader).getURL();
+ final Charset cs = ((URLReader)reader).getCharset();
+ return new Source(url.toString(), url, cs);
+ } else {
+ return new Source(getScriptName(ctxt), Source.readFully(reader));
+ }
+ } catch (final IOException ioExp) {
+ throw new ScriptException(ioExp);
+ }
+ }
+
+ private static Source makeSource(final String src, final ScriptContext ctxt) {
+ return new Source(getScriptName(ctxt), src);
+ }
+
+ private static String getScriptName(final ScriptContext ctxt) {
+ final Object val = ctxt.getAttribute(ScriptEngine.FILENAME);
+ return (val != null) ? val.toString() : "<eval>";
+ }
+
private <T> T getInterfaceInner(final Object thiz, final Class<T> clazz) {
if (clazz == null || !clazz.isInterface()) {
throw new IllegalArgumentException(getMessage("interface.class.expected"));
@@ -429,7 +439,7 @@
// current ScriptContext exposed as "context"
// "context" is non-writable from script - but script engine still
// needs to set it and so save the context Property object
- contextProperty = newGlobal.addOwnProperty("context", NON_ENUMERABLE_CONSTANT, null);
+ contextProperty = newGlobal.addOwnProperty("context", NON_ENUMERABLE_CONSTANT, ctxt);
// current ScriptEngine instance exposed as "engine". We added @SuppressWarnings("LeakingThisInConstructor") as
// NetBeans identifies this assignment as such a leak - this is a false positive as we're setting this property
// in the Global of a Context we just created - both the Context and the Global were just created and can not be
@@ -509,8 +519,8 @@
throw new IllegalArgumentException(getMessage("interface.on.non.script.object"));
}
- private Object evalImpl(final char[] buf, final ScriptContext ctxt) throws ScriptException {
- return evalImpl(compileImpl(buf, ctxt), ctxt);
+ private Object evalImpl(final Source src, final ScriptContext ctxt) throws ScriptException {
+ return evalImpl(compileImpl(src, ctxt), ctxt);
}
private Object evalImpl(final ScriptFunction script, final ScriptContext ctxt) throws ScriptException {
@@ -561,11 +571,20 @@
}
}
- private CompiledScript asCompiledScript(final ScriptFunction script) {
+ private CompiledScript asCompiledScript(final Source source) throws ScriptException {
+ final ScriptFunction func = compileImpl(source, context);
return new CompiledScript() {
@Override
public Object eval(final ScriptContext ctxt) throws ScriptException {
- return evalImpl(script, ctxt);
+ final ScriptObject global = getNashornGlobalFrom(ctxt);
+ // Are we running the script in the correct global?
+ if (func.getScope() == global) {
+ return evalImpl(func, ctxt, global);
+ } else {
+ // ScriptContext with a different global. Compile again!
+ // Note that we may still hit per-global compilation cache.
+ return evalImpl(compileImpl(source, ctxt), ctxt, global);
+ }
}
@Override
public ScriptEngine getEngine() {
@@ -574,12 +593,6 @@
};
}
- private ScriptFunction compileImpl(final char[] buf, final ScriptContext ctxt) throws ScriptException {
- final Object val = ctxt.getAttribute(ScriptEngine.FILENAME);
- final String fileName = (val != null) ? val.toString() : "<eval>";
- return compileImpl(new Source(fileName, buf), ctxt);
- }
-
private ScriptFunction compileImpl(final Source source, final ScriptContext ctxt) throws ScriptException {
return compileImpl(source, getNashornGlobalFrom(ctxt));
}
--- a/nashorn/src/jdk/nashorn/internal/codegen/Attr.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/codegen/Attr.java Thu Oct 03 19:18:54 2013 +0100
@@ -807,9 +807,11 @@
type = Type.OBJECT;
}
- type = Type.widest(type, newCaseNode.getTest().getType());
- if (type.isBoolean()) {
+ final Type newCaseType = newCaseNode.getTest().getType();
+ if (newCaseType.isBoolean()) {
type = Type.OBJECT; //booleans and integers aren't assignment compatible
+ } else {
+ type = Type.widest(type, newCaseType);
}
}
--- a/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Oct 03 19:18:54 2013 +0100
@@ -852,7 +852,6 @@
final Label loopLabel = new Label("loop");
final Expression init = forNode.getInit();
- assert init instanceof IdentNode;
load(modify);
assert modify.getType().isObject();
@@ -2175,8 +2174,9 @@
method.invoke(ScriptRuntime.OPEN_WITH);
method.storeCompilerConstant(SCOPE);
} else {
- // We just loaded the expression for its side effect; discard it
- method.pop();
+ // We just loaded the expression for its side effect and to check
+ // for null or undefined value.
+ globalCheckObjectCoercible();
}
@@ -3258,6 +3258,10 @@
return method.invokestatic(GLOBAL_OBJECT, "isEval", methodDescriptor(boolean.class, Object.class));
}
+ private MethodEmitter globalCheckObjectCoercible() {
+ return method.invokestatic(GLOBAL_OBJECT, "checkObjectCoercible", methodDescriptor(void.class, Object.class));
+ }
+
private MethodEmitter globalDirectEval() {
return method.invokestatic(GLOBAL_OBJECT, "directEval",
methodDescriptor(Object.class, Object.class, Object.class, Object.class, Object.class, Object.class));
--- a/nashorn/src/jdk/nashorn/internal/ir/WhileNode.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/ir/WhileNode.java Thu Oct 03 19:18:54 2013 +0100
@@ -79,13 +79,12 @@
if (visitor.enterWhileNode(this)) {
if (isDoWhile()) {
return visitor.leaveWhileNode(
- setTest(lc, (Expression)test.accept(visitor)).
- setBody(lc, (Block)body.accept(visitor)));
+ setBody(lc, (Block)body.accept(visitor)).
+ setTest(lc, (Expression)test.accept(visitor)));
}
return visitor.leaveWhileNode(
- setBody(lc, (Block)body.accept(visitor)).
- setTest(lc, (Expression)test.accept(visitor)));
-
+ setTest(lc, (Expression)test.accept(visitor)).
+ setBody(lc, (Block)body.accept(visitor)));
}
return this;
}
--- a/nashorn/src/jdk/nashorn/internal/ir/debug/JSONWriter.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/ir/debug/JSONWriter.java Thu Oct 03 19:18:54 2013 +0100
@@ -410,7 +410,8 @@
comma();
property("id");
- if (functionNode.isAnonymous()) {
+ final FunctionNode.Kind kind = functionNode.getKind();
+ if (functionNode.isAnonymous() || kind == FunctionNode.Kind.GETTER || kind == FunctionNode.Kind.SETTER) {
nullValue();
} else {
functionNode.getIdent().accept(this);
--- a/nashorn/src/jdk/nashorn/internal/objects/Global.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/Global.java Thu Oct 03 19:18:54 2013 +0100
@@ -33,6 +33,7 @@
import java.io.PrintWriter;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.reflect.Field;
import java.util.Arrays;
@@ -691,17 +692,41 @@
* Cache for compiled script classes.
*/
@SuppressWarnings("serial")
- private static class ClassCache extends LinkedHashMap<Source, SoftReference<Class<?>>> {
+ private static class ClassCache extends LinkedHashMap<Source, ClassReference> {
private final int size;
+ private final ReferenceQueue<Class<?>> queue;
ClassCache(int size) {
super(size, 0.75f, true);
this.size = size;
+ this.queue = new ReferenceQueue<>();
+ }
+
+ void cache(final Source source, final Class<?> clazz) {
+ put(source, new ClassReference(clazz, queue, source));
+ }
+
+ @Override
+ protected boolean removeEldestEntry(final Map.Entry<Source, ClassReference> eldest) {
+ return size() > size;
}
@Override
- protected boolean removeEldestEntry(final Map.Entry<Source, SoftReference<Class<?>>> eldest) {
- return size() >= size;
+ public ClassReference get(Object key) {
+ for (ClassReference ref; (ref = (ClassReference)queue.poll()) != null; ) {
+ remove(ref.source);
+ }
+ return super.get(key);
+ }
+
+ }
+
+ private static class ClassReference extends SoftReference<Class<?>> {
+ private final Source source;
+
+ ClassReference(final Class<?> clazz, final ReferenceQueue<Class<?>> queue, final Source source) {
+ super(clazz, queue);
+ this.source = source;
}
}
@@ -709,22 +734,14 @@
@Override
public Class<?> findCachedClass(final Source source) {
assert classCache != null : "Class cache used without being initialized";
- SoftReference<Class<?>> ref = classCache.get(source);
- if (ref != null) {
- final Class<?> clazz = ref.get();
- if (clazz == null) {
- classCache.remove(source);
- }
- return clazz;
- }
-
- return null;
+ ClassReference ref = classCache.get(source);
+ return ref != null ? ref.get() : null;
}
@Override
public void cacheClass(final Source source, final Class<?> clazz) {
assert classCache != null : "Class cache used without being initialized";
- classCache.put(source, new SoftReference<Class<?>>(clazz));
+ classCache.cache(source, clazz);
}
private static <T> T getLazilyCreatedValue(final Object key, final Callable<T> creator, final Map<Object, T> map) {
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Thu Oct 03 19:18:54 2013 +0100
@@ -75,11 +75,11 @@
private static final int FORMAT_LOCAL_TIME = 5;
// Constants defined in ECMA 15.9.1.10
- private static final double hoursPerDay = 24;
- private static final double minutesPerHour = 60;
- private static final double secondsPerMinute = 60;
- private static final double msPerSecond = 1_000;
- private static final double msPerMinute = 60_000;
+ private static final int hoursPerDay = 24;
+ private static final int minutesPerHour = 60;
+ private static final int secondsPerMinute = 60;
+ private static final int msPerSecond = 1_000;
+ private static final int msPerMinute = 60_000;
private static final double msPerHour = 3_600_000;
private static final double msPerDay = 86_400_000;
@@ -926,13 +926,13 @@
case FORMAT_DATE :
case FORMAT_LOCAL_DATE_TIME:
// EEE MMM dd yyyy
- sb.append(weekDays[(int) weekDay(t)])
+ sb.append(weekDays[weekDay(t)])
.append(' ')
- .append(months[(int) monthFromTime(t)])
+ .append(months[monthFromTime(t)])
.append(' ');
- zeroPad(sb, (int) dayFromTime(t), 2);
+ zeroPad(sb, dayFromTime(t), 2);
sb.append(' ');
- zeroPad(sb, (int) yearFromTime(t), 4);
+ zeroPad(sb, yearFromTime(t), 4);
if (format == FORMAT_DATE) {
break;
}
@@ -948,11 +948,11 @@
offset = (offset / 60) * 100 + offset % 60;
// HH:mm:ss GMT+HHmm
- zeroPad(sb, (int) hourFromTime(t), 2);
+ zeroPad(sb, hourFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) minFromTime(t), 2);
+ zeroPad(sb, minFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) secFromTime(t), 2);
+ zeroPad(sb, secFromTime(t), 2);
sb.append(" GMT")
.append(offset < 0 ? '-' : '+');
zeroPad(sb, Math.abs(offset), 4);
@@ -963,20 +963,20 @@
case FORMAT_LOCAL_DATE:
// yyyy-MM-dd
- zeroPad(sb, (int) yearFromTime(t), 4);
+ zeroPad(sb, yearFromTime(t), 4);
sb.append('-');
- zeroPad(sb, (int) monthFromTime(t) + 1, 2);
+ zeroPad(sb, monthFromTime(t) + 1, 2);
sb.append('-');
- zeroPad(sb, (int) dayFromTime(t), 2);
+ zeroPad(sb, dayFromTime(t), 2);
break;
case FORMAT_LOCAL_TIME:
// HH:mm:ss
- zeroPad(sb, (int) hourFromTime(t), 2);
+ zeroPad(sb, hourFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) minFromTime(t), 2);
+ zeroPad(sb, minFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) secFromTime(t), 2);
+ zeroPad(sb, secFromTime(t), 2);
break;
default:
@@ -996,19 +996,19 @@
final StringBuilder sb = new StringBuilder(29);
final double t = nd.getTime();
// EEE, dd MMM yyyy HH:mm:ss z
- sb.append(weekDays[(int) weekDay(t)])
+ sb.append(weekDays[weekDay(t)])
.append(", ");
- zeroPad(sb, (int) dayFromTime(t), 2);
+ zeroPad(sb, dayFromTime(t), 2);
sb.append(' ')
- .append(months[(int) monthFromTime(t)])
+ .append(months[monthFromTime(t)])
.append(' ');
- zeroPad(sb, (int) yearFromTime(t), 4);
+ zeroPad(sb, yearFromTime(t), 4);
sb.append(' ');
- zeroPad(sb, (int) hourFromTime(t), 2);
+ zeroPad(sb, hourFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) minFromTime(t), 2);
+ zeroPad(sb, minFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) secFromTime(t), 2);
+ zeroPad(sb, secFromTime(t), 2);
sb.append(" GMT");
return sb.toString();
}
@@ -1023,19 +1023,19 @@
final StringBuilder sb = new StringBuilder(24);
final double t = nd.getTime();
// yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
- zeroPad(sb, (int) yearFromTime(t), 4);
+ zeroPad(sb, yearFromTime(t), 4);
sb.append('-');
- zeroPad(sb, (int) monthFromTime(t) + 1, 2);
+ zeroPad(sb, monthFromTime(t) + 1, 2);
sb.append('-');
- zeroPad(sb, (int) dayFromTime(t), 2);
+ zeroPad(sb, dayFromTime(t), 2);
sb.append('T');
- zeroPad(sb, (int) hourFromTime(t), 2);
+ zeroPad(sb, hourFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) minFromTime(t), 2);
+ zeroPad(sb, minFromTime(t), 2);
sb.append(':');
- zeroPad(sb, (int) secFromTime(t), 2);
+ zeroPad(sb, secFromTime(t), 2);
sb.append('.');
- zeroPad(sb, (int) msFromTime(t), 3);
+ zeroPad(sb, msFromTime(t), 3);
sb.append("Z");
return sb.toString();
}
@@ -1072,29 +1072,30 @@
}
// ECMA 15.9.1.3 Year Number
- private static double timeFromYear(final double y) {
+ private static double timeFromYear(final int y) {
return dayFromYear(y) * msPerDay;
}
- private static double yearFromTime(final double t) {
- double y = Math.floor(t / (msPerDay * 365.2425)) + 1970;
+ // ECMA 15.9.1.3 Year Number
+ private static int yearFromTime(final double t) {
+ int y = (int) Math.floor(t / (msPerDay * 365.2425)) + 1970;
final double t2 = timeFromYear(y);
if (t2 > t) {
y--;
- } else if (t2 + msPerDay * daysInYear((int) y) <= t) {
+ } else if (t2 + msPerDay * daysInYear(y) <= t) {
y++;
}
return y;
}
- private static double dayWithinYear(final double t, final double year) {
- return day(t) - dayFromYear(year);
+ private static int dayWithinYear(final double t, final int year) {
+ return (int) (day(t) - dayFromYear(year));
}
- private static double monthFromTime(final double t) {
- final double year = yearFromTime(t);
- final double day = dayWithinYear(t, year);
- final int[] firstDay = firstDayInMonth[isLeapYear((int) year) ? 1 : 0];
+ private static int monthFromTime(final double t) {
+ final int year = yearFromTime(t);
+ final int day = dayWithinYear(t, year);
+ final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
int month = 0;
while (month < 11 && firstDay[month + 1] <= day) {
@@ -1103,10 +1104,10 @@
return month;
}
- private static double dayFromTime(final double t) {
- final double year = yearFromTime(t);
- final double day = dayWithinYear(t, year);
- final int[] firstDay = firstDayInMonth[isLeapYear((int) year) ? 1 : 0];
+ private static int dayFromTime(final double t) {
+ final int year = yearFromTime(t);
+ final int day = dayWithinYear(t, year);
+ final int[] firstDay = firstDayInMonth[isLeapYear(year) ? 1 : 0];
int month = 0;
while (month < 11 && firstDay[month + 1] <= day) {
@@ -1121,11 +1122,8 @@
return firstDay[month];
}
- private static double weekDay(final double time) {
- if (isNaN(time)) {
- return NaN;
- }
- final double day = (day(time) + 4) % 7;
+ private static int weekDay(final double time) {
+ final int day = (int) (day(time) + 4) % 7;
return day < 0 ? day + 7 : day;
}
@@ -1140,26 +1138,26 @@
}
// ECMA 15.9.1.10 Hours, Minutes, Second, and Milliseconds
- private static double hourFromTime(final double t) {
- final double h = Math.floor(t / msPerHour) % hoursPerDay;
+ private static int hourFromTime(final double t) {
+ final int h = (int) (Math.floor(t / msPerHour) % hoursPerDay);
return h < 0 ? h + hoursPerDay: h;
}
- private static double minFromTime(final double t) {
- final double m = Math.floor(t / msPerMinute) % minutesPerHour;
+ private static int minFromTime(final double t) {
+ final int m = (int) (Math.floor(t / msPerMinute) % minutesPerHour);
return m < 0 ? m + minutesPerHour : m;
}
- private static double secFromTime(final double t) {
- final double s = Math.floor(t / msPerSecond) % secondsPerMinute;
+ private static int secFromTime(final double t) {
+ final int s = (int) (Math.floor(t / msPerSecond) % secondsPerMinute);
return s < 0 ? s + secondsPerMinute : s;
}
- private static double msFromTime(final double t) {
- final double m = t % msPerSecond;
+ private static int msFromTime(final double t) {
+ final int m = (int) (t % msPerSecond);
return m < 0 ? m + msPerSecond : m;
}
- private static double valueFromTime(final int unit, final double t) {
+ private static int valueFromTime(final int unit, final double t) {
switch (unit) {
case YEAR: return yearFromTime(t);
case MONTH: return monthFromTime(t);
@@ -1180,12 +1178,12 @@
// ECMA 15.9.1.12 MakeDay (year, month, date)
private static double makeDay(final double year, final double month, final double date) {
final double y = year + Math.floor(month / 12);
- double m = month % 12;
+ int m = (int) (month % 12);
if (m < 0) {
m += 12;
}
- double d = Math.floor(dayFromYear(y));
- d += dayFromMonth((int) m, (int) y);
+ double d = dayFromYear(y);
+ d += dayFromMonth(m, (int) y);
return d + date - 1;
}
@@ -1257,13 +1255,13 @@
nullReturn = true;
}
- if (! nullReturn) {
+ if (!nullReturn && !isNaN(time)) {
d[i - start] = valueFromTime(i, time);
}
}
}
- return nullReturn? null : d;
+ return nullReturn ? null : d;
}
// ECMA 15.9.1.14 TimeClip (time)
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeJSON.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJSON.java Thu Oct 03 19:18:54 2013 +0100
@@ -162,22 +162,27 @@
String gap;
- if (space instanceof Number || space instanceof NativeNumber) {
- int indent;
- if (space instanceof NativeNumber) {
- indent = ((NativeNumber)space).intValue();
- } else {
- indent = ((Number)space).intValue();
- }
+ // modifiable 'space' - parameter is final
+ Object modSpace = space;
+ if (modSpace instanceof NativeNumber) {
+ modSpace = JSType.toNumber(JSType.toPrimitive(modSpace, Number.class));
+ } else if (modSpace instanceof NativeString) {
+ modSpace = JSType.toString(JSType.toPrimitive(modSpace, String.class));
+ }
- final StringBuilder sb = new StringBuilder();
- for (int i = 0; i < Math.min(10, indent); i++) {
- sb.append(' ');
+ if (modSpace instanceof Number) {
+ int indent = Math.min(10, JSType.toInteger(modSpace));
+ if (indent < 1) {
+ gap = "";
+ } else {
+ final StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < indent; i++) {
+ sb.append(' ');
+ }
+ gap = sb.toString();
}
- gap = sb.toString();
-
- } else if (space instanceof String || space instanceof ConsString || space instanceof NativeString) {
- final String str = (space instanceof String) ? (String)space : space.toString();
+ } else if (modSpace instanceof String || modSpace instanceof ConsString) {
+ final String str = modSpace.toString();
gap = str.substring(0, Math.min(10, str.length()));
} else {
gap = "";
--- a/nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Thu Oct 03 19:18:54 2013 +0100
@@ -191,23 +191,21 @@
public static NativeRegExp newRegExp(final Object regexp, final Object flags) {
String patternString = "";
String flagString = "";
- boolean flagsDefined = false;
-
- if (flags != UNDEFINED) {
- flagsDefined = true;
- flagString = JSType.toString(flags);
- }
if (regexp != UNDEFINED) {
if (regexp instanceof NativeRegExp) {
- if (!flagsDefined) {
- return (NativeRegExp)regexp; // 15.10.3.1 - undefined flags and regexp as
+ if (flags != UNDEFINED) {
+ throw typeError("regex.cant.supply.flags");
}
- throw typeError("regex.cant.supply.flags");
+ return (NativeRegExp)regexp; // 15.10.3.1 - undefined flags and regexp as
}
patternString = JSType.toString(regexp);
}
+ if (flags != UNDEFINED) {
+ flagString = JSType.toString(flags);
+ }
+
return new NativeRegExp(patternString, flagString);
}
@@ -697,8 +695,13 @@
appendReplacement(matcher, string, replacement, sb);
}
+ thisIndex = matcher.end();
+ if (thisIndex == string.length() && matcher.start() == matcher.end()) {
+ // Avoid getting empty match at end of string twice
+ break;
+ }
+
// ECMA 15.5.4.10 String.prototype.match(regexp)
- thisIndex = matcher.end();
if (thisIndex == previousLastIndex) {
setLastIndex(thisIndex + 1);
previousLastIndex = thisIndex + 1;
@@ -883,7 +886,7 @@
* @return last index property as int
*/
public int getLastIndex() {
- return JSType.toInt32(lastIndex);
+ return JSType.toInteger(lastIndex);
}
/**
--- a/nashorn/src/jdk/nashorn/internal/parser/JSONParser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/parser/JSONParser.java Thu Oct 03 19:18:54 2013 +0100
@@ -349,6 +349,10 @@
case COMMARIGHT:
next();
+ // check for trailing comma - not allowed in JSON
+ if (type == RBRACKET) {
+ throw error(AbstractParser.message("trailing.comma.in.json", type.getNameOrType()));
+ }
break;
default:
@@ -388,6 +392,10 @@
case COMMARIGHT:
next();
+ // check for trailing comma - not allowed in JSON
+ if (type == RBRACE) {
+ throw error(AbstractParser.message("trailing.comma.in.json", type.getNameOrType()));
+ }
break;
default:
--- a/nashorn/src/jdk/nashorn/internal/parser/Parser.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java Thu Oct 03 19:18:54 2013 +0100
@@ -59,6 +59,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import jdk.internal.dynalink.support.NameCodec;
import jdk.nashorn.internal.codegen.CompilerConstants;
import jdk.nashorn.internal.codegen.Namespace;
import jdk.nashorn.internal.ir.AccessNode;
@@ -2108,7 +2109,7 @@
case "get":
final PropertyKey getIdent = propertyName();
final String getterName = getIdent.getPropertyName();
- final IdentNode getNameNode = new IdentNode(((Node)getIdent).getToken(), finish, "get " + getterName);
+ final IdentNode getNameNode = new IdentNode(((Node)getIdent).getToken(), finish, "get " + NameCodec.encode(getterName));
expect(LPAREN);
expect(RPAREN);
functionNode = functionBody(getSetToken, getNameNode, new ArrayList<IdentNode>(), FunctionNode.Kind.GETTER);
@@ -2117,7 +2118,7 @@
case "set":
final PropertyKey setIdent = propertyName();
final String setterName = setIdent.getPropertyName();
- final IdentNode setNameNode = new IdentNode(((Node)setIdent).getToken(), finish, "set " + setterName);
+ final IdentNode setNameNode = new IdentNode(((Node)setIdent).getToken(), finish, "set " + NameCodec.encode(setterName));
expect(LPAREN);
final IdentNode argIdent = getIdent();
verifyStrictIdent(argIdent, "setter argument");
--- a/nashorn/src/jdk/nashorn/internal/runtime/GlobalFunctions.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/GlobalFunctions.java Thu Oct 03 19:18:54 2013 +0100
@@ -90,6 +90,7 @@
public static double parseInt(final Object self, final Object string, final Object rad) {
final String str = JSType.trimLeft(JSType.toString(string));
final int length = str.length();
+ int radix = JSType.toInt32(rad);
// empty string is not valid
if (length == 0) {
@@ -113,7 +114,6 @@
}
boolean stripPrefix = true;
- int radix = JSType.toInt32(rad);
if (radix != 0) {
if (radix < 2 || radix > 36) {
@@ -211,7 +211,7 @@
switch (ch) {
case '.':
// dot allowed only once
- if (dotSeen) {
+ if (exponentOffset != -1 || dotSeen) {
break loop;
}
dotSeen = true;
--- a/nashorn/src/jdk/nashorn/internal/runtime/Source.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Thu Oct 03 19:18:54 2013 +0100
@@ -169,7 +169,7 @@
final Source src = (Source)obj;
// Only compare content as a last resort measure
- return length == src.length && Objects.equals(name, src.name) && Arrays.equals(content, src.content);
+ return length == src.length && Objects.equals(url, src.url) && Objects.equals(name, src.name) && Arrays.equals(content, src.content);
}
@Override
--- a/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Thu Oct 03 19:18:54 2013 +0100
@@ -57,6 +57,7 @@
parser.error.regex.unsupported.flag=Unsupported RegExp flag: {0}
parser.error.regex.repeated.flag=Repeated RegExp flag: {0}
parser.error.regex.syntax={0}
+parser.error.trailing.comma.in.json=Trailing comma is not allowed in JSON
# strict mode error messages
parser.error.strict.no.with="with" statement cannot be used in strict mode
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8024972.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8024972: for (LeftHandSideExpression in Expression) crashes the compiler
+ *
+ * @test
+ * @run
+ */
+
+var obj = {};
+
+var arr = [2, 45, -1, 445];
+for (obj.x in arr) {
+ print(obj.x + "->"+ arr[obj.x]);
+}
+
+var abc = { foo: 'bar', hello: 'world' };
+for (obj.x in abc) {
+ print(obj.x + "->" + abc[obj.x]);
+}
+
+for (obj.x in 0) {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8024972.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,6 @@
+0->2
+1->45
+2->-1
+3->445
+foo->bar
+hello->world
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025048-2.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025048: true as case label results in ClassCastException
+ *
+ * @test
+ * @run
+ */
+
+function func(x) {
+ switch(x) {
+ case 8: break; case false:
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025048.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025048: true as case label results in ClassCastException
+ *
+ * @test
+ * @run
+ */
+
+function func(x) {
+ switch(x) {
+ case 8: break; case true:
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025080.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025080: Object literal getter, setter function with number format property name results in ClassFormatError
+ *
+ * @test
+ * @run
+ */
+
+var obj = {
+ get 1e81() { print("1e81 getter"); },
+ set 1e81(x) { print("1e81 setter"); },
+ get 3.14e-2() { print("3.14e-2 getter");},
+ set 3.14e-2(x) { print("3.14e-2 setter"); }
+};
+
+obj[1e81];
+obj[1e81] = 23;
+
+obj[3.14e-2];
+obj[3.14e-2] = 42;
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025080.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,4 @@
+1e81 getter
+1e81 setter
+3.14e-2 getter
+3.14e-2 setter
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025090.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025090: 'while' statement with 'test' using var before being declared in body results in VerifyError
+ *
+ * @test
+ * @run
+ */
+
+// The following used to result in VerifyError
+function f() {
+ while (x += 2) { var x = 44 }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025111.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025111: undefined or null 'with' expression in empty with block should throw TypeError
+ *
+ * @test
+ * @run
+ */
+
+function check(callback, arg) {
+ try {
+ callback(arg);
+ fail("should have thrown TypeError: " + callback + " on " + arg);
+ } catch (e) {
+ if (! (e instanceof TypeError)) {
+ fail("Expected TypeError, got " + e);
+ }
+ }
+}
+
+function func(obj) {
+ with(obj) {}
+}
+
+check(func);
+check(func, undefined);
+check(func, null);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025147.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025147: Trailing comma is not allowed in JSONArray and JSONObject
+ *
+ * @test
+ * @run
+ */
+
+function check(str) {
+ try {
+ JSON.parse(str);
+ fail("should have thrown SyntaxError for " + str);
+ } catch (e) {
+ print(e);
+ }
+}
+
+check("{ \"a\": 333, }");
+check("[ 4343, ]");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025147.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,6 @@
+SyntaxError: Invalid JSON: <json>:1:12 Trailing comma is not allowed in JSON
+{ "a": 333, }
+ ^
+SyntaxError: Invalid JSON: <json>:1:8 Trailing comma is not allowed in JSON
+[ 4343, ]
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025149.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025149: JSON.stringify does not handle 'space' argument as per the spec.
+ *
+ * @test
+ * @run
+ */
+
+print(JSON.stringify({ foo : 23, bar: { x : 22} }, undefined ,new Number(Infinity)));
+
+print(JSON.stringify({ foo : 23, bar: { x : 22} }, undefined ,new Number(-Infinity)));
+
+try {
+ JSON.stringify({},[],
+ (n = new Number(0), n.valueOf = function() { throw ("inside n.valueOf") }, n));
+} catch (e) {
+ print(e);
+}
+
+try {
+ JSON.stringify({},[],
+ (s = new String(""), s.toString = function() { throw ("inside s.toString") }, s));
+} catch (e) {
+ print(e);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025149.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,9 @@
+{
+ "foo": 23,
+ "bar": {
+ "x": 22
+ }
+}
+{"foo":23,"bar":{"x":22}}
+inside n.valueOf
+inside s.toString
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025163.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025163: Date methods should not return -0
+ *
+ * @test
+ * @run
+ */
+
+print(1 / (new Date(0, 0, 1)).getYear());
+print(1 / (new Date(1969, 1, 2)).getDay());
+print(1 / (new Date(1969, 0, 1)).getHours());
+print(1 / (new Date(1969, 0, 1)).getHours());
+print(1 / (new Date(1969, 0, 1)).getMinutes());
+print(1 / (new Date(1969, 0, 1)).getSeconds());
+print(1 / (new Date(1969, 0, 1)).getMilliseconds());
+print(1 / (new Date(1969, 0, 1)).getMilliseconds());
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025163.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,8 @@
+Infinity
+Infinity
+Infinity
+Infinity
+Infinity
+Infinity
+Infinity
+Infinity
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025197.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025197: String replace method fails with regexp /$/gi
+ *
+ * @test
+ * @run
+ */
+
+print('dog'.replace(/$/gi, 's'));
+print('dog'.replace(/(?:g)$/gi, 's'));
+print('dog'.replace(/(?:a)$/gi, 's'));
+print('dog'.replace(/(?!g)$/gi, 's'));
+print('dog'.replace(/(?!a)$/gi, 's'));
+print('dog'.replace(/g?$/gi, 's'));
+print('dog'.replace(/.?$/gi, 's'));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025197.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,7 @@
+dogs
+dos
+dog
+dogs
+dogs
+doss
+doss
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025312.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025312: parseInt should convert 'radix' argument to ToInt32 even if empty string is parsed
+ *
+ * @test
+ * @run
+ */
+
+parseInt("", {
+ valueOf: function() {
+ print("inside valueOf of 'radix'");
+ }
+});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025312.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,1 @@
+inside valueOf of 'radix'
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025325.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025325: parseFloat does not handle '.' in exponent part
+ *
+ * @test
+ * @run
+ */
+
+print(parseFloat("2e2."));
+print(parseFloat("2e2.3"));
+print(parseFloat("2e2.fdgdf"));
+print(parseFloat("2e2. gdfgdf"));
+print(parseFloat("2e2. "));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025325.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,5 @@
+200
+200
+200
+200
+200
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025434.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025434: RegExp lastIndex can exceed int range
+ *
+ * @test
+ * @run
+ */
+
+var r = /a/g;
+
+r.lastIndex = 0x100000000;
+if (r.test("a")) {
+ throw new Error("Expected no match");
+}
+
+r.lastIndex = 0x100000000000000;
+if (r.test("a")) {
+ throw new Error("Expected no match");
+}
+
+r.lastIndex = -0x100000000;
+if (r.test("a")) {
+ throw new Error("Expected match");
+}
+
+r.lastIndex = -0x100000000000000;
+if (r.test("a")) {
+ throw new Error("Expected no match");
+}
+
+r.lastIndex = 1;
+if (r.test("a")) {
+ throw new Error("Expected no match");
+}
+
+r.lastIndex = -1;
+if (r.test("a")) {
+ throw new Error("Expected no match");
+}
+
+r.lastIndex = 0;
+if (!r.test("a")) {
+ throw new Error("Expected match");
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025486.js Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8025486: RegExp constructor arguments are not evaluated in right order
+ *
+ * @test
+ * @run
+ */
+
+new RegExp({
+ toString: function() {
+ print("source");
+ return "a";
+ }
+}, {
+ toString: function() {
+ print("flags");
+ return "g";
+ }
+});
+
+try {
+ new RegExp(/asdf/, {
+ toString: function() {
+ fail("toString should not be called");
+ }
+ });
+ fail("expected TypeError");
+} catch (e) {
+ if (!(e instanceof TypeError)) {
+ fail("expected TypeError");
+ }
+ print(e);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8025486.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -0,0 +1,3 @@
+source
+flags
+TypeError: Cannot supply flags when constructing one RegExp from another
--- a/nashorn/test/script/basic/parser/objectLitExpr.js.EXPECTED Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/test/script/basic/parser/objectLitExpr.js.EXPECTED Thu Oct 03 19:18:54 2013 +0100
@@ -126,10 +126,7 @@
},
"value": {
"type": "FunctionExpression",
- "id": {
- "type": "Identifier",
- "name": "get x"
- },
+ "id": null,
"params": [],
"defaults": [],
"rest": null,
@@ -157,10 +154,7 @@
},
"value": {
"type": "FunctionExpression",
- "id": {
- "type": "Identifier",
- "name": "get y"
- },
+ "id": null,
"params": [],
"defaults": [],
"rest": null,
--- a/nashorn/test/script/trusted/JDK-8008305.js Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/test/script/trusted/JDK-8008305.js Thu Oct 03 19:18:54 2013 +0100
@@ -54,6 +54,6 @@
fail("Expected SecurityException from script!");
} catch (e) {
if (! (e instanceof SecurityException)) {
- faile("Expected SecurityException, but got " + e);
+ fail("Expected SecurityException, but got " + e);
}
}
--- a/nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Sat Sep 14 20:43:34 2013 +0100
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Thu Oct 03 19:18:54 2013 +0100
@@ -37,10 +37,12 @@
import java.util.concurrent.Callable;
import javax.script.Compilable;
import javax.script.CompiledScript;
+import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
+import javax.script.SimpleScriptContext;
import org.testng.annotations.Test;
/**
@@ -231,6 +233,17 @@
}
@Test
+ public void compileAndEvalInDiffContextTest() throws ScriptException {
+ final ScriptEngineManager m = new ScriptEngineManager();
+ final ScriptEngine engine = m.getEngineByName("js");
+ final Compilable compilable = (Compilable) engine;
+ final CompiledScript compiledScript = compilable.compile("foo");
+ final ScriptContext ctxt = new SimpleScriptContext();
+ ctxt.setAttribute("foo", "hello", ScriptContext.ENGINE_SCOPE);
+ assertEquals(compiledScript.eval(ctxt), "hello");
+ }
+
+ @Test
public void accessGlobalTest() {
final ScriptEngineManager m = new ScriptEngineManager();
final ScriptEngine e = m.getEngineByName("nashorn");