--- a/.hgtags Thu Oct 10 12:36:42 2013 +0100
+++ b/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
514b0b69fb9683ef52062fd962a3e0644431f64d jdk8-b106
892889f445755790ae90e61775bfb59ddc6182b5 jdk8-b107
74049f7a28b48c14910106a75d9f2504169c352e jdk8-b108
+af9a674e12a16da1a4bd53e4990ddb1121a21ef1 jdk8-b109
+b5d2bf482a3ea1cca08c994512804ffbc73de0a1 jdk8-b110
--- a/.hgtags-top-repo Thu Oct 10 12:36:42 2013 +0100
+++ b/.hgtags-top-repo Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
8e7b4d9fb00fdf1334376aeac050c9bca6d1b383 jdk8-b106
0874bb4707b723d5bb108d379c557cf41529d1a7 jdk8-b107
9286a6e61291246d88af713f1ef79adeea30fe2e jdk8-b108
+91f47e8da5c60de58ed195e9b57f3bf192a18f83 jdk8-b109
+4faa09c7fe555de086dd9048d3c5cc92317d6f45 jdk8-b110
--- a/NewMakefile.gmk Thu Oct 10 12:36:42 2013 +0100
+++ b/NewMakefile.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/autoconf/generated-configure.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/autoconf/jdk-options.m4 Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/autoconf/spec.gmk.in Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/bin/compare.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/makefiles/JavaCompilation.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/makefiles/Jprt.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/common/makefiles/Main.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/corba/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
2e3a056c84a71eba78945c18b05397858ffd7ad0 jdk8-b106
23fc34133152692b725db4bd617b4c8dfd6ccb05 jdk8-b107
a4bb3b4500164748a9c33b2283cfda76d89f25ab jdk8-b108
+428428cf5e06163322144cfb5367e1faa86acf20 jdk8-b109
+3d2b7ce93c5c2e3db748f29c3d29620a8b3b748a jdk8-b110
--- a/hotspot/.hgtags Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -379,3 +379,7 @@
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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/os/linux/LinuxDebuggerLocal.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/os/linux/ps_core.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/os/linux/ps_proc.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/os/linux/salibelf.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/os/linux/symtab.c Thu Oct 10 13:33:02 2013 -0700
@@ -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/runtime/VM.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java Thu Oct 10 13:33:02 2013 -0700
@@ -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() {
@@ -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/make/bsd/makefiles/fastdebug.make Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/bsd/makefiles/fastdebug.make Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/bsd/makefiles/gcc.make Thu Oct 10 13:33:02 2013 -0700
@@ -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
--- a/hotspot/make/excludeSrc.make Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/excludeSrc.make Thu Oct 10 13:33:02 2013 -0700
@@ -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 \
--- a/hotspot/make/hotspot_version Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/hotspot_version Thu Oct 10 13:33:02 2013 -0700
@@ -35,7 +35,7 @@
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=51
+HS_BUILD_NUMBER=53
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
--- a/hotspot/make/linux/makefiles/fastdebug.make Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/linux/makefiles/fastdebug.make Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/linux/makefiles/gcc.make Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/make/windows/makefiles/fastdebug.make Thu Oct 10 13:33:02 2013 -0700
@@ -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/frame_sparc.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/frame_sparc.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/methodHandles_sparc.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/methodHandles_sparc.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/nativeInst_sparc.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Thu Oct 10 13:33:02 2013 -0700
@@ -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();
+}
+
+
%}
@@ -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/vtableStubs_sparc.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/sparc/vm/vtableStubs_sparc.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/frame_x86.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/frame_x86.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/methodHandles_x86.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/methodHandles_x86.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/vtableStubs_x86_32.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_32.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/vtableStubs_x86_64.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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);
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Thu Oct 10 13:33:02 2013 -0700
@@ -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
@@ -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/linux/vm/os_linux.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -4839,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",
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/share/vm/adlc/adlparse.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/adlc/adlparse.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/adlc/archDesc.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/adlc/formssel.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/adlc/formssel.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/adlc/output_h.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/c1/c1_Runtime1.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/classfile/classFileParser.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -1787,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;
@@ -2545,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;
}
--- a/hotspot/src/share/vm/classfile/classLoaderData.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/classLoaderData.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/defaultMethods.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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,
@@ -459,8 +464,9 @@
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
};
@@ -670,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();
}
@@ -782,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) {
@@ -988,7 +804,7 @@
}
return false;
}
-#endif // ndef PRODUCT
+#endif
static int assemble_redirect(
BytecodeConstantPool* cp, BytecodeBuffer* buffer,
@@ -1035,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();
@@ -1150,8 +965,7 @@
&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);
}
if (max_stack != 0) {
AccessFlags flags = accessFlags_from(
@@ -1281,4 +1095,3 @@
MetadataFactory::free_array(cld, original_ordering);
}
}
-
--- a/hotspot/src/share/vm/classfile/defaultMethods.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/defaultMethods.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/dictionary.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/symbolTable.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/codeCache.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/codeCache.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -160,7 +160,7 @@
// High-level access to an inline cache. Guaranteed to be MT-safe.
-void CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecode, TRAPS) {
+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?");
@@ -170,8 +170,10 @@
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
- assert(entry != NULL, "entry not computed");
int index = call_info->resolved_method()->itable_index();
assert(index == itable_index, "CallInfo pre-computes this");
#endif //ASSERT
@@ -184,6 +186,9 @@
int vtable_index = call_info->vtable_index();
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);
}
@@ -200,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/compiledIC.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/nmethod.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/nmethod.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/code/vtableStubs.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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;
@@ -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/compiler/compileBroker.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/compiler/compileBroker.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/compiler/oopMap.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -2694,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CardCounts.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/g1CollectedHeap.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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();
@@ -3679,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 */) {
@@ -3687,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?
@@ -4548,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),
@@ -4615,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;
}
@@ -4625,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;
}
@@ -5977,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) { }
@@ -6004,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()) {
@@ -6020,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);
}
@@ -6033,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);
}
@@ -6051,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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.
@@ -1127,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;
@@ -1346,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();
@@ -1875,7 +1877,7 @@
G1CollectedHeap* _g1h;
RefToScanQueue* _refs;
DirtyCardQueue _dcq;
- CardTableModRefBS* _ct_bs;
+ G1SATBCardTableModRefBS* _ct_bs;
G1RemSet* _g1_rem;
G1ParGCAllocBufferContainer _surviving_alloc_buffer;
@@ -1914,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1EvacFailure.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1MarkSweep.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSet.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1RemSetSummary.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -637,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;
}
@@ -951,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 {
@@ -971,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/heapRegionRemSet.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/vmStructs_g1.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/g1/vmStructs_g1.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -34,8 +34,14 @@
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) \
@@ -58,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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),
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/interpreter/bytecodeTracer.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/bytecodeTracer.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/linkResolver.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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
@@ -573,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());
@@ -604,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();
+ }
}
//------------------------------------------------------------------------------------------------------------------------
@@ -795,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);
@@ -844,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
@@ -851,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
@@ -905,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);
}
@@ -927,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);
@@ -936,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
@@ -1012,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);
}
@@ -1042,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);
@@ -1071,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);
@@ -1109,6 +1208,27 @@
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);
}
@@ -1384,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())) {
--- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/cardTableModRefBS.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -64,19 +64,21 @@
vm_exit_during_initialization("Incompatible initial and maximum heap sizes specified");
}
- if (!is_size_aligned(MaxMetaspaceSize, max_alignment())) {
- FLAG_SET_ERGO(uintx, MaxMetaspaceSize,
- restricted_align_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) {
- FLAG_SET_ERGO(uintx, MetaspaceSize, MaxMetaspaceSize);
+ MetaspaceSize = MaxMetaspaceSize;
}
- if (!is_size_aligned(MetaspaceSize, min_alignment())) {
- FLAG_SET_ERGO(uintx, MetaspaceSize,
- restricted_align_down(MetaspaceSize, min_alignment()));
- }
+ MetaspaceSize = restricted_align_down(MetaspaceSize, min_alignment());
assert(MetaspaceSize <= MaxMetaspaceSize, "Must be");
@@ -135,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() {
--- a/hotspot/src/share/vm/memory/gcLocker.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/gcLocker.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/gcLocker.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/genRemSet.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/genRemSet.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/metaspace.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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"
@@ -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);
@@ -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
@@ -276,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);
@@ -314,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
@@ -421,8 +424,6 @@
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
@@ -475,7 +476,6 @@
return _current_virtual_space;
}
- ChunkManager* chunk_manager() { return &_chunk_manager; }
bool is_class() const { return _is_class; }
// Allocate the first virtualspace.
@@ -494,14 +494,7 @@
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);
@@ -582,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;
@@ -626,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) {
@@ -648,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; }
@@ -762,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()));
}
@@ -775,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
@@ -1020,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.
@@ -1042,7 +1032,7 @@
prev_vsl->set_next(vsl->next());
}
- vsl->purge(chunk_manager());
+ vsl->purge(chunk_manager);
dec_reserved_words(vsl->reserved_words());
dec_committed_words(vsl->committed_words());
dec_virtual_space_count();
@@ -1064,36 +1054,6 @@
#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_words(),
- err_msg("Total in free chunks " SIZE_FORMAT
- " greater than total from virtual_spaces " SIZE_FORMAT,
- allocated_by_vs, chunk_manager()->free_chunks_total_words()));
- size_t used =
- allocated_by_vs - chunk_manager()->free_chunks_total_words();
- 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),
@@ -1104,10 +1064,6 @@
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");
}
@@ -1123,9 +1079,6 @@
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);
}
@@ -1142,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);
@@ -1195,15 +1148,8 @@
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
@@ -1221,12 +1167,14 @@
// 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.
assert(current_virtual_space()->expanded_words() == 0,
- "New virtuals space nodes should not have expanded");
+ "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);
@@ -1342,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()->reserved_words() +
- 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;
}
@@ -1536,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_words(),
- vsl->chunk_manager()->free_chunks_count());
+ sm->chunk_manager()->free_chunks_total_words(),
+ sm->chunk_manager()->free_chunks_count());
}
}
} else {
@@ -1796,6 +1745,8 @@
// work.
chunk->set_is_free(false);
#endif
+ chunk->container()->inc_container_count();
+
slow_locked_verify();
return chunk;
}
@@ -1830,9 +1781,9 @@
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();
}
}
@@ -1979,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) {
@@ -2084,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),
@@ -2172,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();
@@ -2188,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.
@@ -2204,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");
@@ -2245,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 {
@@ -2343,9 +2290,7 @@
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(gclog_or_tty);
- }
+ chunk_manager()->locked_print_free_chunks(gclog_or_tty);
}
}
@@ -2361,10 +2306,14 @@
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());
+ // 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())) {
@@ -2644,13 +2593,12 @@
size_t MetaspaceAux::min_chunk_size_words() { return Metaspace::first_chunk_word_size(); }
size_t MetaspaceAux::free_chunks_total_words(Metaspace::MetadataType mdtype) {
- VirtualSpaceList* list = Metaspace::get_space_list(mdtype);
- if (list == NULL) {
+ 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_words();
+ chunk_manager->slow_verify();
+ return chunk_manager->free_chunks_total_words();
}
size_t MetaspaceAux::free_chunks_total_bytes(Metaspace::MetadataType mdtype) {
@@ -2801,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();
}
}
@@ -2874,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
@@ -2981,6 +2932,7 @@
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
@@ -3006,6 +2958,7 @@
// 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
@@ -3073,15 +3026,30 @@
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;
}
@@ -3090,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;
}
@@ -3103,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().
@@ -3114,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);
}
@@ -3134,7 +3104,7 @@
MetaWord* Metaspace::allocate(size_t word_size, MetadataType mdtype) {
// DumpSharedSpaces doesn't use class metadata area (yet)
// Also, don't use class_vsm() unless UseCompressedClassPointers is true.
- if (mdtype == ClassType && using_class_space()) {
+ if (is_class_space_allocation(mdtype)) {
return class_vsm()->allocate(word_size);
} else {
return vsm()->allocate(word_size);
@@ -3282,8 +3252,8 @@
MetaspaceAux::dump(gclog_or_tty);
}
// -XX:+HeapDumpOnOutOfMemoryError and -XX:OnOutOfMemoryError support
- const char* space_string = (mdtype == ClassType) ? "Compressed class 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()) {
@@ -3291,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());
@@ -3333,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);
}
}
@@ -3385,7 +3359,7 @@
#ifndef PRODUCT
-class MetaspaceAuxTest : AllStatic {
+class TestMetaspaceAuxTest : AllStatic {
public:
static void test_reserved() {
size_t reserved = MetaspaceAux::reserved_bytes();
@@ -3425,14 +3399,25 @@
}
}
+ 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 MetaspaceAux_test() {
- MetaspaceAuxTest::test();
+void TestMetaspaceAux_test() {
+ TestMetaspaceAuxTest::test();
}
#endif
--- a/hotspot/src/share/vm/memory/metaspace.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspace.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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);
@@ -199,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;
@@ -217,6 +235,9 @@
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 {
--- a/hotspot/src/share/vm/memory/metaspaceShared.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/metaspaceShared.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/oops/constantPool.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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) {
@@ -840,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");
@@ -1619,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:
@@ -1802,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));
@@ -1812,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;
@@ -1924,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
@@ -2000,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/constantPool.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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);
--- a/hotspot/src/share/vm/oops/cpCache.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/cpCache.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -306,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/instanceKlass.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 */
@@ -1419,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();
@@ -1427,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;
}
}
@@ -2303,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()));
}
@@ -2769,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: ");
@@ -3317,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
@@ -3445,6 +3440,8 @@
return m;
}
}
+ // None found, return null for the caller to handle.
+ return NULL;
}
return m;
}
@@ -3461,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;
}
@@ -3480,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -1126,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
@@ -1149,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;
@@ -1161,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceMirrorKlass.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/instanceRefKlass.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/instanceRefKlass.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/klassVtable.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -292,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;
}
@@ -442,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;
}
@@ -520,7 +522,7 @@
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");
@@ -534,6 +536,8 @@
// "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;
--- a/hotspot/src/share/vm/oops/method.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/method.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -901,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;
}
--- a/hotspot/src/share/vm/oops/methodData.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/methodData.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -333,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/oop.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/oops/oopsHierarchy.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/opto/bytecodeInfo.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/bytecodeInfo.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/callGenerator.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/classes.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/classes.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/classes.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/compile.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/compile.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/compile.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/doCall.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/doCall.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/lcm.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/library_call.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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()));
@@ -3952,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
@@ -3983,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
@@ -3999,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++) {
@@ -4015,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++) {
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/machnode.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/matcher.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/matcher.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/matcher.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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/multnode.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/multnode.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/node.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/subnode.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/subnode.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/type.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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-------------------------------------------
--- a/hotspot/src/share/vm/opto/type.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/opto/type.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jni.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -5046,7 +5046,10 @@
void TestReservedSpace_test();
void TestReserveMemorySpecial_test();
void TestVirtualSpace_test();
-void MetaspaceAux_test();
+void TestMetaspaceAux_test();
+#if INCLUDE_ALL_GCS
+void TestG1BiasedArray_test();
+#endif
void execute_internal_vm_tests() {
if (ExecuteInternalVMTests) {
@@ -5054,7 +5057,7 @@
run_unit_test(TestReservedSpace_test());
run_unit_test(TestReserveMemorySpecial_test());
run_unit_test(TestVirtualSpace_test());
- run_unit_test(MetaspaceAux_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());
@@ -5066,6 +5069,7 @@
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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvm.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/jvmtiEnvBase.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiImpl.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -2807,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);
+ }
+ }
}
}
@@ -2942,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.
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/unsafe.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/runtime/arguments.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -625,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;
@@ -641,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;
@@ -674,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;
@@ -709,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_]"
@@ -850,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();
@@ -904,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>");
}
}
@@ -952,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;
@@ -970,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);
@@ -1100,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.
@@ -1112,6 +1113,7 @@
FLAG_SET_DEFAULT(UseSharedSpaces, false);
}
}
+#endif
void Arguments::set_tiered_flags() {
// With tiered, set default policy to AdvancedThresholdPolicy, which is 3.
@@ -1130,6 +1132,9 @@
Tier3InvokeNotifyFreqLog = 0;
Tier4InvocationThreshold = 0;
}
+ if (FLAG_IS_DEFAULT(NmethodSweepFraction)) {
+ FLAG_SET_DEFAULT(NmethodSweepFraction, 1 + ReservedCodeCacheSize / (16 * M));
+ }
}
#if INCLUDE_ALL_GCS
@@ -1520,16 +1525,18 @@
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();
@@ -2333,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;
}
@@ -2434,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) {
@@ -2521,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;
@@ -3344,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;
}
--- a/hotspot/src/share/vm/runtime/arguments.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/arguments.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -360,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);
--- a/hotspot/src/share/vm/runtime/biasedLocking.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/biasedLocking.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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();
--- a/hotspot/src/share/vm/runtime/frame.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/frame.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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
@@ -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/globals.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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);
@@ -2526,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") \
\
@@ -2827,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") \
\
@@ -3198,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 " \
@@ -3727,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
@@ -3750,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/globals_extension.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/handles.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/handles.inline.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/java.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/safepoint.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/safepoint.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sweeper.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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;
}
@@ -271,9 +277,11 @@
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);
@@ -299,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;
@@ -308,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) {
@@ -351,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");
}
@@ -367,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);
@@ -392,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);
@@ -413,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 {
@@ -432,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 {
@@ -459,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/sweeper.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/thread.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -1444,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;
--- a/hotspot/src/share/vm/runtime/thread.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/thread.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vframeArray.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/vmStructs.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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"
@@ -841,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) \
@@ -1185,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) \
\
@@ -1360,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) \
@@ -1382,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 */ \
@@ -1928,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) \
@@ -2074,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>) \
@@ -2082,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? */\
--- a/hotspot/src/share/vm/runtime/vm_operations.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_operations.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_operations.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/runtime/vm_version.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/attachListener.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/classLoadingService.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/diagnosticArgument.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/dtraceAttacher.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/heapDumper.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/heapDumper.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/management.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/memoryManager.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryManager.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryPool.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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;
--- a/hotspot/src/share/vm/services/memoryService.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/services/memoryService.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/trace/trace.xml Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/trace/trace.xml Thu Oct 10 13:33:02 2013 -0700
@@ -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/utilities/array.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/utilities/array.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/globalDefinitions.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/utilities/globalDefinitions_visCPP.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/utilities/hashtable.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/taskqueue.hpp Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/src/share/vm/utilities/taskqueue.hpp Thu Oct 10 13:33:02 2013 -0700
@@ -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/test/TEST.groups Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/TEST.groups Thu Oct 10 13:33:02 2013 -0700
@@ -193,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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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");
--- a/hotspot/test/gc/g1/TestSummarizeRSetStats.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/gc/g1/TestSummarizeRSetStats.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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/G1AddMetaspaceDependency.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/gc/metaspace/G1AddMetaspaceDependency.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/TestPerfCountersAndMemoryPools.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/gc/metaspace/TestPerfCountersAndMemoryPools.java Thu Oct 10 13:33:02 2013 -0700
@@ -29,10 +29,11 @@
/* @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 TestPerfCountersAndMemoryPools
- * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+UseCompressedOops -XX:+UseCompressedKlassPointers -XX:+UseSerialGC -XX:+UsePerfData TestPerfCountersAndMemoryPools
+ * @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 {
@@ -43,11 +44,11 @@
}
}
- private static MemoryUsage getMemoryUsage(String memoryPoolName) {
+ private static MemoryPoolMXBean getMemoryPool(String memoryPoolName) {
List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean pool : pools) {
if (pool.getName().equals(memoryPoolName)) {
- return pool.getUsage();
+ return pool;
}
}
@@ -57,19 +58,18 @@
private static void checkMemoryUsage(String memoryPoolName, String perfNS)
throws Exception {
- // Need to do a gc before each comparison to update the perf counters
+ MemoryPoolMXBean pool = getMemoryPool(memoryPoolName);
- System.gc();
- MemoryUsage mu = getMemoryUsage(memoryPoolName);
- assertEQ(getMinCapacity(perfNS), mu.getInit());
-
+ // Must do a GC to update performance counters
System.gc();
- mu = getMemoryUsage(memoryPoolName);
- assertEQ(getUsed(perfNS), mu.getUsed());
+ 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();
- mu = getMemoryUsage(memoryPoolName);
- assertEQ(getCapacity(perfNS), mu.getCommitted());
+ assertEQ(getUsed(perfNS), pool.getUsage().getUsed());
+ assertEQ(getCapacity(perfNS), pool.getUsage().getCommitted());
}
private static long getMinCapacity(String ns) throws Exception {
--- a/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/runtime/CDSCompressedKPtrs/XShareAuto.java Thu Oct 10 13:33:02 2013 -0700
@@ -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);
--- a/hotspot/test/testlibrary/AssertsTest.java Thu Oct 10 12:36:42 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 Thu Oct 10 12:36:42 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 Thu Oct 10 12:36:42 2013 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +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
- }
-
- {
- 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/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/com/oracle/java/testlibrary/Platform.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathDirEntry.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarEntry.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassPathJarInDirEntry.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/ClassesListInFile.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/CompileTheWorld.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Compiler.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/PathHandler.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/hotspot/test/testlibrary/ctw/src/sun/hotspot/tools/ctw/Utils.java Thu Oct 10 13:33:02 2013 -0700
@@ -31,8 +31,6 @@
/**
* Auxiliary methods.
- *
- * @author igor.ignatyev@oracle.com
*/
public class Utils {
/**
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/testlibrary_tests/AssertsTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jaxp/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
d3be8e3b429df917e72c1c23e7920c651219b587 jdk8-b106
d6a32e3831aab20a9a3bc78cdc0a60aaad725c6c jdk8-b107
8ade3eed63da87067a7137c111f684a821e9e531 jdk8-b108
+02bfab2aa93899e0f02584f1e85537485a196553 jdk8-b109
+4c84c5b447b09aff27f3b72667ab3a5401e85968 jdk8-b110
--- a/jaxws/.hgtags Thu Oct 10 12:36:42 2013 +0100
+++ b/jaxws/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
6908370afe834ff01739e8ec992d4246c74b7e6e jdk8-b106
e3c9328f75638289a342ce15fbe532f05078946e jdk8-b107
d1ea68556fd7925a3c7078dd9f77c6ca73d5aa9e jdk8-b108
+df5d4d01642572e77fd3c01e4c8703ed3f6eec87 jdk8-b109
+cc682329886be2fc26220fc30597ee4e5bba43ed jdk8-b110
--- a/jdk/.hgtags Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -231,3 +231,4 @@
eea685b9ccaa1980e0a7e07d6a3a84bcc7e9ab82 jdk8-b107
006aaa5f069e7dd98fccdc696866c9f8582c087c jdk8-b108
946f3fd5f8bf0ccd180c258d25e5837fa1bf004c jdk8-b109
+54e099776f08430d3a7f4feabd9f2ba886b55320 jdk8-b110
--- a/jdk/make/bridge/AccessBridgeJava/Makefile Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/make/bridge/AccessBridgeJava/Makefile Thu Oct 10 13:33:02 2013 -0700
@@ -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/sun/lwawt/FILES_export_macosx.gmk Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/make/sun/lwawt/FILES_export_macosx.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/make/sun/xawt/mapfile-vers Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/CompileDemos.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/CompileJavaClasses.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/CompileLaunchers.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -23,7 +23,7 @@
# questions.
#
-defalt: all
+default: all
include $(SPEC)
include MakeBase.gmk
--- a/jdk/makefiles/CompileNativeLibraries.gmk Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/CompileNativeLibraries.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -23,7 +23,7 @@
# questions.
#
-defalt: all
+default: all
include $(SPEC)
include MakeBase.gmk
--- a/jdk/makefiles/CreateJars.gmk Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/CreateJars.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -858,26 +858,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 \
@@ -897,7 +884,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
@@ -948,13 +935,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))
@@ -963,9 +950,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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/GensrcMisc.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/GensrcProperties.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/Images.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/Tools.gmk Thu Oct 10 13:33:02 2013 -0700
@@ -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/mapfiles/libawt_xawt/mapfile-vers Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/makefiles/mapfiles/libawt_xawt/mapfile-vers Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/apple/applescript/AppleScriptEngineFactory.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/com/apple/laf/AquaFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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();
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/macosx/classes/sun/awt/resources/awtosx.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCanvasPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWContainerPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWCursorManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWLightweightFramePeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWMouseInfoPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWPanelPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWRepaintArea.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMenu.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CMenuItem.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTEvent.m Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTView.m Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Thu Oct 10 13:33:02 2013 -0700
@@ -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/imageio/plugins/jpeg/JPEGMetadata.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/motif/MotifFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/windows/WindowsFileChooserUI.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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();
}
}
--- a/jdk/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/AWTKeyStroke.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/CardLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Component.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Container.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ContainerOrderFocusTraversalPolicy.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/DefaultKeyboardFocusManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Dialog.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Event.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/EventQueue.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Frame.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GradientPaintContext.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GraphicsEnvironment.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridBagConstraints.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridBagLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/GridLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/KeyboardFocusManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/MenuBar.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ScrollPane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/ScrollPaneAdjustable.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Scrollbar.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/SequencedEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/SystemTray.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TextComponent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TextField.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/TexturePaintContext.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Toolkit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/WaitDispatchSupport.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/Window.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/datatransfer/DataFlavor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/datatransfer/SystemFlavorMap.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragGestureRecognizer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSource.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceContext.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceDragEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceDropEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DragSourceEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTarget.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTargetDragEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/dnd/DropTargetDropEvent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/event/MouseMotionListener.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/awt/font/TransformAttribute.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/DefaultPersistenceDelegate.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/MethodDescriptor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/PersistenceDelegate.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/ThreadGroupContext.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/java/beans/WeakIdentityMap.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/javax/sound/sampled/AudioFileFormat.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFileFormat.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/sound/sampled/AudioFormat.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JButton.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JCheckBox.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JCheckBoxMenuItem.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JColorChooser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JComboBox.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JComponent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JDesktopPane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JFileChooser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JLayer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JMenuItem.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPanel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPasswordField.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JPopupMenu.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRadioButton.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRadioButtonMenuItem.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JRootPane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JScrollBar.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JScrollPane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSeparator.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSlider.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSpinner.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JSplitPane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTable.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTextArea.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTextField.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToggleButton.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToolBar.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JToolTip.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JTree.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/JViewport.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/KeyStroke.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/OverlayLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/ProgressMonitor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/RowFilter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SizeRequirements.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SizeSequence.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerDateModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerListModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpinnerNumberModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/SpringLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/TransferHandler.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/UIDefaults.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/UnsupportedLookAndFeelException.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/ViewportLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/LayerUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/TextUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicBorders.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicComboBoxUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopIconUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicDesktopPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicGraphicsUtils.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicIconFactory.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameTitlePane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicInternalFrameUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicLabelUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicListUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicMenuUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicOptionPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicPopupMenuUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicProgressBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicScrollPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSplitPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTextUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicToolTipUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicTreeUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/basic/DefaultMenuLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalBorders.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLabelUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalPopupMenuSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalScrollPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalSliderUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalTabbedPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/metal/MetalToolTipUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/AbstractRegionPainter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/Region.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxMenuItemUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthCheckBoxUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthColorChooserUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthComboBoxUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopIconUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthDesktopPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthEditorPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthFormattedTextFieldUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthInternalFrameUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthLabelUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthListUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuItemUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuLayout.java Thu Oct 10 13:33:02 2013 -0700
@@ -31,7 +31,7 @@
import java.awt.Dimension;
/**
- * @inheritDoc
+ * {@inheritDoc}
*
* @author Georges Saab
*/
--- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthOptionPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPainter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPanelUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPasswordFieldUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthPopupMenuUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthProgressBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonMenuItemUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRadioButtonUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthRootPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSeparatorUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSpinnerUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSplitPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTabbedPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableHeaderUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextAreaUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextFieldUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToggleButtonUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolTipUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTreeUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/AbstractDocument.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/AttributeSet.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/BadLocationException.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/BoxView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Caret.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ComponentView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/CompositeView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultCaret.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultHighlighter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DefaultStyledDocument.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Document.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/DocumentFilter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/EditorKit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/FieldView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/FlowView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GapContent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GlyphPainter2.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/GlyphView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Highlighter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/IconView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/JTextComponent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/NavigationFilter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ParagraphView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PasswordView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PlainDocument.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/PlainView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Position.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StringContent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyleContext.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyledDocument.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/StyledEditorKit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TabExpander.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TabableView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/TableView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/Utilities.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/View.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/WrappedPlainView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/ZoneView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/BlockView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/CSS.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/FormView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/HTMLDocument.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/HTMLEditorKit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/ImageView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/InlineView.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/StyleSheet.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/ContentModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/DocumentParser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/text/html/parser/Parser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/AbstractLayoutCache.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellEditor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/DefaultTreeModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/TreeCellRenderer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/tree/TreeModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/javax/swing/undo/UndoManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/awt/AWTAccessor.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/AWTAccessor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/GlobalCursorManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/awt/datatransfer/DataTransferer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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()) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/share/classes/sun/swing/AbstractFilterComboBoxModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/FilePane.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/JLightweightFrame.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/LightweightContent.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/SwingAccessor.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/SwingUtilities2.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/demo/applets/MoleculeViewer/XYZApp.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/XYZApp.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example1.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example2.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/MoleculeViewer/example3.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/ThreeD.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example1.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example2.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example3.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/share/demo/applets/WireFrame/example4.html Thu Oct 10 13:33:02 2013 -0700
@@ -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!
--- a/jdk/src/solaris/bin/java_md_solinux.c Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/bin/java_md_solinux.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XGlobalCursorManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XLightweightFramePeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Oct 10 13:33:02 2013 -0700
@@ -2249,6 +2249,8 @@
XConstants.XkbModifierMapMask |
XConstants.XkbVirtualModsMask,
XConstants.XkbUseCoreKbd);
+
+ XlibWrapper.XkbSetDetectableAutoRepeat(getDisplay(), true);
}
}
}
--- a/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XTrayIconPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XWM.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/classes/sun/java2d/xr/XRMaskImage.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/native/sun/xawt/XlibWrapper.c Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/solaris/native/sun/xawt/XlibWrapper.c Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WComponentPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WDataTransferer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WFileDialogPeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WGlobalCursorManager.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/classes/sun/awt/windows/WLightweightFramePeer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/sun/windows/awt_Container.cpp Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Container.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Container.h Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Cursor.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Font.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_PrintControl.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/src/windows/native/sun/windows/awt_ole.cpp Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/BadHandshakeTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/DoubleAgentTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/ExclusiveBind.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/ExclusiveBind.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/PrivateTransportTest.sh Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/PrivateTransportTest.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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/RunToExit.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/RunToExit.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 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/connect/spi/SimpleLaunchingConnector.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/com/sun/jdi/connect/spi/SimpleLaunchingConnector.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/demo/jvmti/DemoRun.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/awt/FullScreen/TranslucentWindow/TranslucentWindow.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/awt/MenuBar/MenuBarSetFont/MenuBarSetFont.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/awt/Window/MaximizeOffscreen/MaximizeOffscreenTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/beans/Performance/Test7122740.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/beans/Performance/Test7184799.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/Makefile Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/java/nio/channels/spi/SelectorProvider/inheritedChannel/run_tests.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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/javax/swing/JComboBox/6236162/bug6236162.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.html Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JFileChooser/4150029/bug4150029.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JInternalFrame/InternalFrameIsNotCollectedTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JScrollBar/7163696/Test7163696.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JTable/7068740/bug7068740.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/JTree/8013571/Test8013571.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/javax/swing/text/View/8014863/bug8014863.java Thu Oct 10 13:33:02 2013 -0700
@@ -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);
}
});
--- a/jdk/test/sun/security/tools/keytool/autotest.sh Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/sun/security/tools/keytool/autotest.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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
@@ -66,11 +66,8 @@
OS=`uname -s`
case "$OS" in
SunOS )
- if [ $B32 = true ]; then
- LIBNAME="/usr/lib/mps/libsoftokn3.so"
- else
- LIBNAME="/usr/lib/mps/64/libsoftokn3.so"
- fi
+ FS="/"
+ LIBNAME="/usr/lib/mps/`isainfo -n`/libsoftokn3.so"
;;
Linux )
if [ $B32 = true ]; then
--- a/jdk/test/sun/tools/jhat/HatRun.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/sun/tools/jhat/HatRun.java Thu Oct 10 13:33:02 2013 -0700
@@ -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/tools/launcher/6842838/Test6842838.sh Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/6842838/Test6842838.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/ChangeDataModel.java Thu Oct 10 13:33:02 2013 -0700
@@ -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");
}
}
--- a/jdk/test/tools/launcher/ExecutionEnvironment.java Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/ExecutionEnvironment.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/FXLauncherTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/RunpathTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/Test7029048.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/jdk/test/tools/launcher/TestHelper.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -230,3 +230,5 @@
fcd768844b9926c5f994292ec6350c20cc7c0f76 jdk8-b106
3f274927ec1863544b8214262ab02b7de2970da6 jdk8-b107
252f872b8a2f81a416f9127e77924ca56a4578b0 jdk8-b108
+985abf1cd327169a317d4ff4f318a8162a5cd47d jdk8-b109
+41541097533aa3933a018c8c1c426c1871dfd76e jdk8-b110
--- a/langtools/make/netbeans/langtools/build.xml Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/make/netbeans/langtools/build.xml Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/make/tools/anttasks/SelectToolTask.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/classfile/Code_attribute.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/resources/standard_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclet.xml Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/Checker.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/DocLint.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/HtmlTag.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/doclint/resources/doclint_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacAnnoConstructs.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/Tokens.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeCopier.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/GraphUtils.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/List.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/ListBuffer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javadoc/resources/javadoc_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javah/resources/l10n_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/CodeWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/resources/javap_ja.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/BuildState.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/Main.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/src/share/classes/com/sun/tools/sjavac/server/JavacServer.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/lib/JavadocTester.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testAnnotationTypes/TestAnnotationTypes.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testEncoding/EncodeTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testHref/TestHref.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/com/sun/javadoc/testValueTag/pkg1/Class1.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/doclint/ReferenceTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/doclint/ReferenceTest.out Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/doclint/html/InlineTagsTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/doclint/tidy/util/Main.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/doclint/tidy/util/tidy.sh Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/T7093325.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/IntersectionTypeCastTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/model/Model01.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/cast/intersection/model/ModelChecker.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/flow/LVTHarness.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/lambda/8023558/T8023558a.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/lambda/intersection/IntersectionTargetTypeTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/multicatch/Pos05.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/types/TypeHarness.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/warnings/6747671/T6747671.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/langtools/test/tools/javac/warnings/6747671/T6747671.out Thu Oct 10 13:33:02 2013 -0700
@@ -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/scripts/webrev.ksh Thu Oct 10 12:36:42 2013 +0100
+++ b/make/scripts/webrev.ksh Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/.hgtags Thu Oct 10 13:33:02 2013 -0700
@@ -218,3 +218,5 @@
bf70cbd2c8369fd97ffdfcbe1a80dbc2797408ee jdk8-b106
f35e1255024b66f7cf82517798f45f6e194e5567 jdk8-b107
445ad3f6d3b4ba62ebc483323e1919110a304053 jdk8-b108
+6ec2f9e5ed5bd60c2900976e6a54fdcac2f37e9e jdk8-b109
+d49a8c2173f5f90c9a39cc4af8e03cfa8f35ee4c jdk8-b110
--- a/nashorn/make/build-benchmark.xml Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/make/build-benchmark.xml Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/make/build.xml Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/make/project.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/api/scripting/NashornScriptEngine.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/codegen/Attr.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/codegen/CodeGenerator.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/ir/WhileNode.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/ir/debug/JSONWriter.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/Global.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeDate.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeJSON.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/objects/NativeRegExp.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/parser/JSONParser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/parser/Parser.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/GlobalFunctions.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/Source.java Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/src/jdk/nashorn/internal/runtime/resources/Messages.properties Thu Oct 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/test/script/basic/parser/objectLitExpr.js.EXPECTED Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/test/script/trusted/JDK-8008305.js Thu Oct 10 13:33:02 2013 -0700
@@ -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 Thu Oct 10 12:36:42 2013 +0100
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Thu Oct 10 13:33:02 2013 -0700
@@ -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");