# HG changeset patch # User alanb # Date 1550867802 0 # Node ID 7a45c67e73d0ad4444509777b6e7eaa28867a12c # Parent 30695f27d7ea32dd157a00bff39542dc6a407e78# Parent 7a6fd71449e7de1d20fae6f7e89e29c111ce44ab Merge diff -r 30695f27d7ea -r 7a45c67e73d0 .hgtags --- a/.hgtags Fri Feb 22 17:03:09 2019 +0000 +++ b/.hgtags Fri Feb 22 20:36:42 2019 +0000 @@ -543,3 +543,6 @@ 021917019cda1c0c5853255322274f37693a2431 jdk-13+7 b5f7bb57de2f797be34f6c75d45c3245ad37ab97 jdk-12+31 a535ba736cabc6886acdff36de3a096c46e5ddc5 jdk-13+8 +4ce47bc1fb92cf94c6e3d1f49d582f02dcb851ab jdk-12+32 +c081f3ea6b9300265a4a34e38f970b1e3ddaae9f jdk-13+9 +b67884871b5fff79c5ef3eb8ac74dd48d71ea9b1 jdk-12+33 diff -r 30695f27d7ea -r 7a45c67e73d0 make/RunTests.gmk --- a/make/RunTests.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/RunTests.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -112,6 +112,9 @@ GTEST_VARIANTS := $(strip $(patsubst $(TEST_IMAGE_DIR)/hotspot/gtest/%, %, \ $(GTEST_LAUNCHER_DIRS))) +COV_ENVIRONMENT := +JTREG_COV_OPTIONS := + ifeq ($(TEST_OPTS_JCOV), true) JCOV_OUTPUT_DIR := $(TEST_RESULTS_DIR)/jcov-output JCOV_GRABBER_LOG := $(JCOV_OUTPUT_DIR)/grabber.log @@ -122,12 +125,18 @@ # Replace our normal test JDK with the JCov image. JDK_UNDER_TEST := $(JCOV_IMAGE_DIR) - JCOV_ENVIRONMENT := JAVA_TOOL_OPTIONS="$(JCOV_MEM_OPTIONS)" \ + COV_ENVIRONMENT += JAVA_TOOL_OPTIONS="$(JCOV_MEM_OPTIONS)" \ _JAVA_OPTIONS="$(JCOV_MEM_OPTIONS)" - JTREG_JCOV_OPTIONS := -e:JAVA_TOOL_OPTIONS='$(JCOV_MEM_OPTIONS)' \ + JTREG_COV_OPTIONS += -e:JAVA_TOOL_OPTIONS='$(JCOV_MEM_OPTIONS)' \ -e:_JAVA_OPTIONS='$(JCOV_MEM_OPTIONS)' endif +ifeq ($(GCOV_ENABLED), true) + GCOV_OUTPUT_DIR := $(TEST_RESULTS_DIR)/gcov-output + COV_ENVIRONMENT += GCOV_PREFIX="$(GCOV_OUTPUT_DIR)" + JTREG_COV_OPTIONS += -e:GCOV_PREFIX="$(GCOV_OUTPUT_DIR)" +endif + ################################################################################ # Optionally create AOT libraries for specified modules before running tests. # Note, this could not be done during JDK build time. @@ -170,6 +179,7 @@ $$(call LogWarn, Generating $$(patsubst $$(OUTPUTDIR)/%, %, $$@)) $$(call MakeTargetDir) $$(call ExecuteWithLog, $$@, \ + $((COV_ENVIRONMENT) \ $$(FIXPATH) $$(JDK_UNDER_TEST)/bin/jaotc \ $$($1_JAOTC_OPTS) --output $$@ --module $$($1_MODULE) \ ) @@ -658,6 +668,8 @@ # Current tests needs to open java.io $1_MICRO_JAVA_OPTIONS += --add-opens=java.base/java.io=ALL-UNNAMED + # Set library path for native dependencies + $1_MICRO_JAVA_OPTIONS += -Djava.library.path=$$(TEST_IMAGE_DIR)/micro/native # Save output as JSON or CSV file ifneq ($$(MICRO_RESULTS_FORMAT), ) @@ -690,7 +702,8 @@ $$(call LogWarn, Running test '$$($1_TEST)') $$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR)) $$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/micro, \ - $$($1_MICRO_TEST_JDK)/bin/java $$($1_MICRO_JAVA_OPTIONS) -jar $$($1_MICRO_BENCHMARKS_JAR) \ + $$(FIXPATH) $$($1_MICRO_TEST_JDK)/bin/java $$($1_MICRO_JAVA_OPTIONS) \ + -jar $$($1_MICRO_BENCHMARKS_JAR) \ $$($1_MICRO_ITER) $$($1_MICRO_FORK) $$($1_MICRO_TIME) \ $$($1_MICRO_WARMUP_ITER) $$($1_MICRO_WARMUP_TIME) \ $$($1_MICRO_VM_OPTIONS) $$($1_MICRO_BASIC_OPTIONS) $$(MICRO_OPTIONS) \ @@ -904,7 +917,7 @@ $$(call LogWarn, Running test '$$($1_TEST)') $$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR)) $$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/jtreg, \ - $$(JCOV_ENVIRONMENT) \ + $$(COV_ENVIRONMENT) \ $$(JAVA) $$($1_JTREG_LAUNCHER_OPTIONS) \ -Dprogram=jtreg -jar $$(JT_HOME)/lib/jtreg.jar \ $$($1_JTREG_BASIC_OPTIONS) \ @@ -914,7 +927,7 @@ -workDir:$$($1_TEST_SUPPORT_DIR) \ $$(JTREG_OPTIONS) \ $$(JTREG_FAILURE_HANDLER_OPTIONS) \ - $$(JTREG_JCOV_OPTIONS) \ + $$(JTREG_COV_OPTIONS) \ $$($1_TEST_NAME) \ && $$(ECHO) $$$$? > $$($1_EXITCODE) \ || $$(ECHO) $$$$? > $$($1_EXITCODE) \ diff -r 30695f27d7ea -r 7a45c67e73d0 make/autoconf/basics.m4 --- a/make/autoconf/basics.m4 Fri Feb 22 17:03:09 2019 +0000 +++ b/make/autoconf/basics.m4 Fri Feb 22 20:36:42 2019 +0000 @@ -618,14 +618,6 @@ BASIC_PATH_PROGS(CPIO, [cpio bsdcpio]) BASIC_PATH_PROGS(NICE, nice) - BASIC_PATH_PROGS(PANDOC, pandoc) - if test -n "$PANDOC"; then - ENABLE_PANDOC="true" - else - ENABLE_PANDOC="false" - fi - AC_SUBST(ENABLE_PANDOC) - BASIC_PATH_PROGS(LSB_RELEASE, lsb_release) BASIC_PATH_PROGS(CMD, [cmd.exe /mnt/c/Windows/System32/cmd.exe]) ]) @@ -1193,6 +1185,7 @@ BASIC_CHECK_FIND_DELETE BASIC_CHECK_TAR BASIC_CHECK_GREP + BASIC_SETUP_PANDOC # These tools might not be installed by default, # need hint on how to install them. @@ -1379,6 +1372,34 @@ ################################################################################ # +# Setup Pandoc +# +AC_DEFUN_ONCE([BASIC_SETUP_PANDOC], +[ + BASIC_PATH_PROGS(PANDOC, pandoc) + + PANDOC_MARKDOWN_FLAG="markdown" + if test -n "$PANDOC"; then + AC_MSG_CHECKING(if the pandoc smart extension needs to be disabled for markdown) + if $PANDOC --list-extensions | $GREP -q '\+smart'; then + AC_MSG_RESULT([yes]) + PANDOC_MARKDOWN_FLAG="markdown-smart" + else + AC_MSG_RESULT([no]) + fi + fi + + if test -n "$PANDOC"; then + ENABLE_PANDOC="true" + else + ENABLE_PANDOC="false" + fi + AC_SUBST(ENABLE_PANDOC) + AC_SUBST(PANDOC_MARKDOWN_FLAG) +]) + +################################################################################ +# # Default make target # AC_DEFUN_ONCE([BASIC_SETUP_DEFAULT_MAKE_TARGET], diff -r 30695f27d7ea -r 7a45c67e73d0 make/autoconf/flags-cflags.m4 --- a/make/autoconf/flags-cflags.m4 Fri Feb 22 17:03:09 2019 +0000 +++ b/make/autoconf/flags-cflags.m4 Fri Feb 22 20:36:42 2019 +0000 @@ -121,7 +121,11 @@ # -g0 enables debug symbols without disabling inlining. CFLAGS_DEBUG_SYMBOLS="-g0 -xs" elif test "x$TOOLCHAIN_TYPE" = xxlc; then - CFLAGS_DEBUG_SYMBOLS="-g" + if test "x$XLC_USES_CLANG" = xtrue; then + CFLAGS_DEBUG_SYMBOLS="-g1" + else + CFLAGS_DEBUG_SYMBOLS="-g" + fi elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then CFLAGS_DEBUG_SYMBOLS="-Z7 -d2Zi+" fi diff -r 30695f27d7ea -r 7a45c67e73d0 make/autoconf/jdk-options.m4 --- a/make/autoconf/jdk-options.m4 Fri Feb 22 17:03:09 2019 +0000 +++ b/make/autoconf/jdk-options.m4 Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -364,7 +364,7 @@ ################################################################################ # -# Gcov coverage data for hotspot +# Native and Java code coverage # AC_DEFUN_ONCE([JDKOPT_SETUP_CODE_COVERAGE], [ @@ -372,23 +372,26 @@ [enable native compilation with code coverage data@<:@disabled@:>@])]) GCOV_ENABLED="false" if test "x$enable_native_coverage" = "xyes"; then - if test "x$TOOLCHAIN_TYPE" = "xgcc"; then - AC_MSG_CHECKING([if native coverage is enabled]) - AC_MSG_RESULT([yes]) - GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" - GCOV_LDFLAGS="-fprofile-arcs" - JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" - JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" - CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" - CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" - CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" - CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $GCOV_CFLAGS" - LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $GCOV_LDFLAGS" - LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $GCOV_LDFLAGS" - GCOV_ENABLED="true" - else - AC_MSG_ERROR([--enable-native-coverage only works with toolchain type gcc]) - fi + case $TOOLCHAIN_TYPE in + gcc | clang) + AC_MSG_CHECKING([if native coverage is enabled]) + AC_MSG_RESULT([yes]) + GCOV_CFLAGS="-fprofile-arcs -ftest-coverage -fno-inline" + GCOV_LDFLAGS="-fprofile-arcs" + JVM_CFLAGS="$JVM_CFLAGS $GCOV_CFLAGS" + JVM_LDFLAGS="$JVM_LDFLAGS $GCOV_LDFLAGS" + CFLAGS_JDKLIB="$CFLAGS_JDKLIB $GCOV_CFLAGS" + CFLAGS_JDKEXE="$CFLAGS_JDKEXE $GCOV_CFLAGS" + CXXFLAGS_JDKLIB="$CXXFLAGS_JDKLIB $GCOV_CFLAGS" + CXXFLAGS_JDKEXE="$CXXFLAGS_JDKEXE $GCOV_CFLAGS" + LDFLAGS_JDKLIB="$LDFLAGS_JDKLIB $GCOV_LDFLAGS" + LDFLAGS_JDKEXE="$LDFLAGS_JDKEXE $GCOV_LDFLAGS" + GCOV_ENABLED="true" + ;; + *) + AC_MSG_ERROR([--enable-native-coverage only works with toolchain type gcc or clang]) + ;; + esac elif test "x$enable_native_coverage" = "xno"; then AC_MSG_CHECKING([if native coverage is enabled]) AC_MSG_RESULT([no]) diff -r 30695f27d7ea -r 7a45c67e73d0 make/autoconf/spec.gmk.in --- a/make/autoconf/spec.gmk.in Fri Feb 22 17:03:09 2019 +0000 +++ b/make/autoconf/spec.gmk.in Fri Feb 22 20:36:42 2019 +0000 @@ -774,6 +774,7 @@ UCRT_DLL_DIR:=@UCRT_DLL_DIR@ STLPORT_LIB:=@STLPORT_LIB@ ENABLE_PANDOC:=@ENABLE_PANDOC@ +PANDOC_MARKDOWN_FLAG:=@PANDOC_MARKDOWN_FLAG@ #################################################### # diff -r 30695f27d7ea -r 7a45c67e73d0 make/autoconf/toolchain.m4 --- a/make/autoconf/toolchain.m4 Fri Feb 22 17:03:09 2019 +0000 +++ b/make/autoconf/toolchain.m4 Fri Feb 22 20:36:42 2019 +0000 @@ -276,6 +276,20 @@ fi AC_SUBST(TOOLCHAIN_TYPE) + # on AIX, check for xlclang++ on the PATH and TOOLCHAIN_PATH and use it if it is available + if test "x$OPENJDK_TARGET_OS" = xaix; then + if test "x$TOOLCHAIN_PATH" != x; then + XLC_TEST_PATH=${TOOLCHAIN_PATH}/ + fi + + XLCLANG_VERSION_OUTPUT=`${XLC_TEST_PATH}xlclang++ -qversion 2>&1 | $HEAD -n 1` + $ECHO "$XLCLANG_VERSION_OUTPUT" | $GREP "IBM XL C/C++ for AIX" > /dev/null + if test $? -eq 0; then + AC_MSG_NOTICE([xlclang++ output: $XLCLANG_VERSION_OUTPUT]) + XLC_USES_CLANG=true + fi + fi + TOOLCHAIN_CC_BINARY_clang="clang" TOOLCHAIN_CC_BINARY_gcc="gcc" TOOLCHAIN_CC_BINARY_microsoft="cl$EXE_SUFFIX" @@ -288,6 +302,14 @@ TOOLCHAIN_CXX_BINARY_solstudio="CC" TOOLCHAIN_CXX_BINARY_xlc="xlC_r" + if test "x$OPENJDK_TARGET_OS" = xaix; then + if test "x$XLC_USES_CLANG" = xtrue; then + AC_MSG_NOTICE([xlclang++ detected, using it]) + TOOLCHAIN_CC_BINARY_xlc="xlclang" + TOOLCHAIN_CXX_BINARY_xlc="xlclang++" + fi + fi + # Use indirect variable referencing toolchain_var_name=TOOLCHAIN_DESCRIPTION_$TOOLCHAIN_TYPE TOOLCHAIN_DESCRIPTION=${!toolchain_var_name} diff -r 30695f27d7ea -r 7a45c67e73d0 make/common/MakeBase.gmk --- a/make/common/MakeBase.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/common/MakeBase.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -392,9 +392,10 @@ # # Param 1 - Dirs to find in # Param 2 - (optional) specialization. Normally "-a \( ... \)" expression. + # Param 3 - (optional) options to find. define CacheFind $(if $(filter-out $(addsuffix /%,- $(FIND_CACHE_DIRS)) $(FIND_CACHE_DIRS),$1), \ - $(if $(wildcard $1), $(shell $(FIND) $(wildcard $1) \( -type f -o -type l \) $2 \ + $(if $(wildcard $1), $(shell $(FIND) $3 $(wildcard $1) \( -type f -o -type l \) $2 \ | $(TR) ' ' '?')), \ $(filter $(addsuffix /%,$(patsubst %/,%,$1)) $1,$(FIND_CACHE))) endef diff -r 30695f27d7ea -r 7a45c67e73d0 make/common/ProcessMarkdown.gmk --- a/make/common/ProcessMarkdown.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/common/ProcessMarkdown.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -80,7 +80,8 @@ $$(call LogInfo, Converting $2 to $$($1_FORMAT)) $$(call MakeDir, $$(SUPPORT_OUTPUTDIR)/markdown $$(dir $$($1_$2_PANDOC_OUTPUT))) $$(call ExecuteWithLog, $$(SUPPORT_OUTPUTDIR)/markdown/$$($1_$2_MARKER), \ - $$(PANDOC) $$($1_OPTIONS) -f markdown-smart -t $$($1_FORMAT) --standalone \ + $$(PANDOC) $$($1_OPTIONS) -f $$(PANDOC_MARKDOWN_FLAG) \ + -t $$($1_FORMAT) --standalone \ $$($1_$2_CSS_OPTION) $$($1_$2_OPTIONS) '$$($1_$2_PANDOC_INPUT)' \ -o '$$($1_$2_PANDOC_OUTPUT)') ifneq ($$(findstring $$(LOG_LEVEL), debug trace),) diff -r 30695f27d7ea -r 7a45c67e73d0 make/common/ZipArchive.gmk --- a/make/common/ZipArchive.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/common/ZipArchive.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -62,8 +62,9 @@ $1_FIND_LIST := $$($1_SRC) endif - # Find all files in the source tree. - $1_ALL_SRCS := $$(call not-containing,_the.,$$(call CacheFind,$$($1_FIND_LIST))) + # Find all files in the source tree. Follow symlinks in this find since that is + # what zip does. + $1_ALL_SRCS := $$(call not-containing,_the.,$$(call CacheFind,$$($1_FIND_LIST), , -L)) # Filter on suffixes if set ifneq ($$($1_SUFFIXES),) @@ -126,10 +127,14 @@ $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS) $$(call LogWarn, Updating $$($1_NAME)) $$(call MakeTargetDir) - $$(foreach s,$$($1_SRC),(cd $$s && $(ZIPEXE) -qru $$($1_ZIP_OPTIONS) $$@ . \ - $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* \ - $$($1_ZIP_EXCLUDES_$$s) \ - || test "$$$$?" = "12" )$$(NEWLINE)) true + $$(foreach s,$$($1_SRC), $$(call ExecuteWithLog, \ + $$(SUPPORT_OUTPUTDIR)/zip/$$(patsubst $$(OUTPUTDIR)/%,%, $$@), \ + (cd $$s && $(ZIPEXE) -qru $$($1_ZIP_OPTIONS) $$@ . \ + $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* \ + $$($1_ZIP_EXCLUDES_$$s) \ + || test "$$$$?" = "12" \ + ))$$(NEWLINE) \ + ) true \ $(TOUCH) $$@ # Add zip to target list diff -r 30695f27d7ea -r 7a45c67e73d0 make/conf/jib-profiles.js --- a/make/conf/jib-profiles.js Fri Feb 22 17:03:09 2019 +0000 +++ b/make/conf/jib-profiles.js Fri Feb 22 20:36:42 2019 +0000 @@ -241,7 +241,7 @@ common.main_profile_names = [ "linux-x64", "linux-x86", "macosx-x64", "solaris-x64", "solaris-sparcv9", "windows-x64", "windows-x86", - "linux-aarch64", "linux-arm32" + "linux-aarch64", "linux-arm32", "linux-ppc64le", "linux-s390x" ]; // These are the base setttings for all the main build profiles. @@ -464,6 +464,28 @@ "--with-abi-profile=arm-vfp-hflt", "--disable-warnings-as-errors" ], }, + + "linux-ppc64le": { + target_os: "linux", + target_cpu: "ppc64le", + build_cpu: "x64", + dependencies: ["devkit", "build_devkit", "cups"], + configure_args: [ + "--openjdk-target=ppc64le-linux-gnu", "--with-freetype=bundled", + "--disable-warnings-as-errors" + ], + }, + + "linux-s390x": { + target_os: "linux", + target_cpu: "s390x", + build_cpu: "x64", + dependencies: ["devkit", "build_devkit", "cups"], + configure_args: [ + "--openjdk-target=s390x-linux-gnu", "--with-freetype=bundled", + "--disable-warnings-as-errors" + ], + }, }; // Add the base settings to all the main profiles @@ -499,6 +521,15 @@ profiles[maketestName].default_make_targets = [ "test-make" ]; }); + // Generate -gcov profiles + [ "linux-x64", "macosx-x64" ].forEach(function (name) { + var gcovName = name + "-gcov"; + profiles[gcovName] = clone(profiles[name]); + profiles[gcovName].default_make_targets = ["product-bundles", "test-bundles"]; + profiles[gcovName].configure_args = concat(profiles[gcovName].configure_args, + ["--enable-native-coverage", "--disable-warnings-as-errors"]); + }); + // Profiles for building the zero jvm variant. These are used for verification. var zeroProfiles = { "linux-x64-zero": { @@ -626,6 +657,12 @@ }, "linux-arm32": { platform: "linux-arm32", + }, + "linux-ppc64le": { + platform: "linux-ppc64le", + }, + "linux-s390x": { + platform: "linux-s390x", } } // Generate common artifacts for all main profiles @@ -744,6 +781,40 @@ }; }); + // Artifacts of gcov (native-code-coverage) profiles + [ "linux-x64", "macosx-x64" ].forEach(function (name) { + var o = artifactData[name] + var pf = o.platform + var jdk_subdir = (o.jdk_subdir != null ? o.jdk_subdir : "jdk-" + data.version); + var jdk_suffix = (o.jdk_suffix != null ? o.jdk_suffix : "tar.gz"); + var gcovName = name + "-gcov"; + profiles[gcovName].artifacts = { + jdk: { + local: "bundles/\\(jdk.*bin." + jdk_suffix + "\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov." + jdk_suffix, + ], + subdir: jdk_subdir, + exploded: "images/jdk", + }, + test: { + local: "bundles/\\(jdk.*bin-tests.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov-tests.tar.gz", + ], + exploded: "images/test" + }, + jdk_symbols: { + local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)", + remote: [ + "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-gcov-symbols.tar.gz", + ], + subdir: jdk_subdir, + exploded: "images/jdk" + }, + }; + }); + // Profiles used to run tests. var testOnlyProfiles = { "run-test": { @@ -770,6 +841,10 @@ } else { testedProfileTest = testedProfile + ".test"; } + var testOnlyMake = [ "run-test-prebuilt", "LOG_CMDLINES=true", "JTREG_VERBOSE=fail,error,time" ]; + if (testedProfile.endsWith("-gcov")) { + testOnlyMake = concat(testOnlyMake, "GCOV_ENABLED=true") + } var testOnlyProfilesPrebuilt = { "run-test-prebuilt": { target_os: input.build_os, @@ -779,7 +854,7 @@ testedProfileTest ], src: "src.conf", - make_args: [ "run-test-prebuilt", "LOG_CMDLINES=true", "JTREG_VERBOSE=fail,error,time" ], + make_args: testOnlyMake, environment: { "BOOT_JDK": common.boot_jdk_home, "JDK_IMAGE_DIR": input.get(testedProfileJDK, "home_path"), @@ -870,7 +945,9 @@ solaris_sparcv9: "SS12u6-Solaris11u3+1.0", windows_x64: "VS2017-15.5.5+1.0", linux_aarch64: "gcc7.3.0-Fedora27+1.2", - linux_arm: "gcc7.3.0-Fedora27+1.2" + linux_arm: "gcc7.3.0-Fedora27+1.2", + linux_ppc64le: "gcc7.3.0-Fedora27+1.0", + linux_s390x: "gcc7.3.0-Fedora27+1.0" }; var devkit_platform = (input.target_cpu == "x86" @@ -930,7 +1007,7 @@ jtreg: { server: "javare", revision: "4.2", - build_number: "b13", + build_number: "b14", checksum_file: "MD5_VALUES", file: "jtreg_bin-4.2.zip", environment_name: "JT_HOME", diff -r 30695f27d7ea -r 7a45c67e73d0 make/copy/CopyCommon.gmk --- a/make/copy/CopyCommon.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/copy/CopyCommon.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -66,6 +66,8 @@ # Setup make rules for copying legal files. This is only needed if the files # need to be filtered due to optional components being enabled/disabled. # Otherwise CreateJmods.gmk will find the legal files in the original src dirs. +# If multiple license files with the same name are found, only the first one +# found will get copied. # # Parameter 1 is the name of the rule. # @@ -75,10 +77,12 @@ define SetupCopyLegalFilesBody $$(foreach f, $$(filter-out $$(addprefix %/, $$($1_EXCLUDES)), \ $$(wildcard $$(addsuffix /*, $$(call FindModuleLegalSrcDirs, $$(MODULE))))), \ - $$(eval $$(call SetupCopyFiles, $1_$$(notdir $$f), \ - DEST := $$(LEGAL_DST_DIR), \ - FILES := $$f, \ - )) \ - $$(eval $1 += $$($1_$$(notdir $$f))) \ + $$(if $$(filter $$($1_$$(notdir $$f)), $$($1)), , \ + $$(eval $$(call SetupCopyFiles, $1_$$(notdir $$f), \ + DEST := $$(LEGAL_DST_DIR), \ + FILES := $$f, \ + )) \ + $$(eval $1 += $$($1_$$(notdir $$f))) \ + ) \ ) endef diff -r 30695f27d7ea -r 7a45c67e73d0 make/test/BuildMicrobenchmark.gmk --- a/make/test/BuildMicrobenchmark.gmk Fri Feb 22 17:03:09 2019 +0000 +++ b/make/test/BuildMicrobenchmark.gmk Fri Feb 22 20:36:42 2019 +0000 @@ -30,6 +30,7 @@ include MakeBase.gmk include JavaCompilation.gmk include SetupJavaCompilers.gmk +include TestFilesCompilation.gmk ifeq ($(JMH_CORE_JAR), ) $(info Error: JMH is missing. Please use configure --with-jmh.) @@ -39,7 +40,8 @@ #### Variables MICROBENCHMARK_SRC := $(TOPDIR)/test/micro -MICROBENCHMARK_JAR := $(IMAGES_OUTPUTDIR)/test/micro/benchmarks.jar +MICROBENCHMARK_IMAGE_DIR := $(TEST_IMAGE_DIR)/micro +MICROBENCHMARK_JAR := $(MICROBENCHMARK_IMAGE_DIR)/benchmarks.jar MICROBENCHMARK_OUTPUT := $(SUPPORT_OUTPUTDIR)/test/micro MICROBENCHMARK_CLASSES := $(MICROBENCHMARK_OUTPUT)/classes @@ -54,6 +56,11 @@ MICROBENCHMARK_CLASSPATH := $(call PathList, $(JMH_COMPILE_JARS)) +# Native dependencies +MICROBENCHMARK_NATIVE_SRC_DIRS := $(MICROBENCHMARK_SRC) +MICROBENCHMARK_NATIVE_OUTPUT := $(MICROBENCHMARK_OUTPUT)/native +MICROBENCHMARK_NATIVE_EXCLUDE := + ### # Need double \n to get new lines and no trailing spaces @@ -108,6 +115,22 @@ JAR := $(MICROBENCHMARK_JAR), \ )) -all: $(MICROBENCHMARK_JAR) +# Setup compilation of native library dependencies +$(eval $(call SetupTestFilesCompilation, BUILD_MICROBENCHMARK_LIBRARIES, \ + TYPE := LIBRARY, \ + SOURCE_DIRS := $(MICROBENCHMARK_NATIVE_SRC_DIRS), \ + OUTPUT_DIR := $(MICROBENCHMARK_NATIVE_OUTPUT), \ + EXCLUDE := $(MICROBENCHMARK_NATIVE_EXCLUDE), \ +)) + +# Setup copy of native dependencies to image output dir +$(eval $(call SetupCopyFiles, COPY_MICROBENCHMARK_NATIVE, \ + SRC := $(MICROBENCHMARK_NATIVE_OUTPUT), \ + DEST := $(MICROBENCHMARK_IMAGE_DIR)/native, \ + FILES := $(BUILD_MICROBENCHMARK_LIBRARIES), \ + FLATTEN := true, \ +)) + +all: $(MICROBENCHMARK_JAR) $(BUILD_MICROBENCHMARK_LIBRARIES) $(COPY_MICROBENCHMARK_NATIVE) .PHONY: all diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/ppc/nativeInst_ppc.cpp --- a/src/hotspot/cpu/ppc/nativeInst_ppc.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/ppc/nativeInst_ppc.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2015 SAP SE. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -362,8 +362,8 @@ void NativeGeneralJump::insert_unconditional(address code_pos, address entry) { CodeBuffer cb(code_pos, BytesPerInstWord + 1); - MacroAssembler* a = new MacroAssembler(&cb); - a->b(entry); + MacroAssembler a(&cb); + a.b(entry); ICache::ppc64_flush_icache_bytes(code_pos, NativeGeneralJump::instruction_size); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/s390/frame_s390.cpp --- a/src/hotspot/cpu/s390/frame_s390.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/s390/frame_s390.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016 SAP SE. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019, SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -479,6 +479,7 @@ // name Method* method = *(Method**)((address)current_fp + _z_ijava_state_neg(method)); if (method) { + ResourceMark rm; if (method->is_synchronized()) st->print("synchronized "); if (method->is_static()) st->print("static "); if (method->is_native()) st->print("native "); @@ -543,6 +544,7 @@ // name Method* method = ((nmethod *)blob)->method(); if (method) { + ResourceMark rm; method->name_and_sig_as_C_string(buf, sizeof(buf)); st->print("%s ", buf); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/s390/stubGenerator_s390.cpp --- a/src/hotspot/cpu/s390/stubGenerator_s390.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/s390/stubGenerator_s390.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016, 2017, SAP SE. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019, SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1842,6 +1842,51 @@ } + // Compute GHASH function. + address generate_ghash_processBlocks() { + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "ghash_processBlocks"); + unsigned int start_off = __ offset(); // Remember stub start address (is rtn value). + + const Register state = Z_ARG1; + const Register subkeyH = Z_ARG2; + const Register data = Z_ARG3; // 1st of even-odd register pair. + const Register blocks = Z_ARG4; + const Register len = blocks; // 2nd of even-odd register pair. + + const int param_block_size = 4 * 8; + const int frame_resize = param_block_size + 8; // Extra space for copy of fp. + + // Reserve stack space for parameter block (R1). + __ z_lgr(Z_R1, Z_SP); + __ resize_frame(-frame_resize, Z_R0, true); + __ z_aghi(Z_R1, -param_block_size); + + // Fill parameter block. + __ z_mvc(Address(Z_R1) , Address(state) , 16); + __ z_mvc(Address(Z_R1, 16), Address(subkeyH), 16); + + // R4+5: data pointer + length + __ z_llgfr(len, blocks); // Cast to 64-bit. + + // R0: function code + __ load_const_optimized(Z_R0, (int)VM_Version::MsgDigest::_GHASH); + + // Compute. + __ z_sllg(len, len, 4); // In bytes. + __ kimd(data); + + // Copy back result and free parameter block. + __ z_mvc(Address(state), Address(Z_R1), 16); + __ z_xc(Address(Z_R1), param_block_size, Address(Z_R1)); + __ z_aghi(Z_SP, frame_resize); + + __ z_br(Z_R14); + + return __ addr_at(start_off); + } + + // Call interface for all SHA* stubs. // // Z_ARG1 - source data block. Ptr to leftmost byte to be processed. @@ -2305,6 +2350,11 @@ StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_AES_decrypt("AES_decryptBlock_chaining"); } + // Generate GHASH intrinsics code + if (UseGHASHIntrinsics) { + StubRoutines::_ghash_processBlocks = generate_ghash_processBlocks(); + } + // Generate SHA1/SHA256/SHA512 intrinsics code. if (UseSHA1Intrinsics) { StubRoutines::_sha1_implCompress = generate_SHA1_stub(false, "SHA1_singleBlock"); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/s390/vm_version_s390.cpp --- a/src/hotspot/cpu/s390/vm_version_s390.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/s390/vm_version_s390.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016, 2018 SAP SE. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -165,8 +165,10 @@ FLAG_SET_DEFAULT(UseAESCTRIntrinsics, false); } - // TODO: implement GHASH intrinsics - if (UseGHASHIntrinsics) { + if (FLAG_IS_DEFAULT(UseGHASHIntrinsics) && has_Crypto_GHASH()) { + FLAG_SET_DEFAULT(UseGHASHIntrinsics, true); + } + if (UseGHASHIntrinsics && !has_Crypto_GHASH()) { warning("GHASH intrinsics are not available on this CPU"); FLAG_SET_DEFAULT(UseGHASHIntrinsics, false); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/x86/c2_init_x86.cpp --- a/src/hotspot/cpu/x86/c2_init_x86.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/x86/c2_init_x86.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -29,6 +29,8 @@ // processor dependent initialization for i486 +LP64_ONLY(extern void reg_mask_init();) + void Compile::pd_compiler2_init() { guarantee(CodeEntryAlignment >= InteriorEntryAlignment, "" ); // QQQ presumably all 64bit cpu's support this. Seems like the ifdef could @@ -58,4 +60,5 @@ OptoReg::invalidate(i); } } + LP64_ONLY(reg_mask_init();) } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp --- a/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/x86/gc/z/zBarrierSetAssembler_x86.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -359,7 +359,7 @@ // ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded(). static address generate_load_barrier_stub(StubCodeGenerator* cgen, Register raddr, DecoratorSet decorators) { // Don't generate stub for invalid registers - if (raddr == rsp || raddr == r12 || raddr == r15) { + if (raddr == rsp || raddr == r15) { return NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/x86/gc/z/z_x86_64.ad --- a/src/hotspot/cpu/x86/gc/z/z_x86_64.ad Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/x86/gc/z/z_x86_64.ad Fri Feb 22 20:36:42 2019 +0000 @@ -26,9 +26,8 @@ #include "gc/z/zBarrierSetAssembler.hpp" static void z_load_barrier_slow_reg(MacroAssembler& _masm, Register dst, Address src, bool weak) { - assert(dst != r12, "Invalid register"); + assert(dst != rsp, "Invalid register"); assert(dst != r15, "Invalid register"); - assert(dst != rsp, "Invalid register"); const address stub = weak ? ZBarrierSet::assembler()->load_barrier_weak_slow_stub(dst) : ZBarrierSet::assembler()->load_barrier_slow_stub(dst); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/x86/vm_version_x86.hpp --- a/src/hotspot/cpu/x86/vm_version_x86.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/x86/vm_version_x86.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -336,7 +336,7 @@ #define CPU_AVX512_VPOPCNTDQ ((uint64_t)UCONST64(0x2000000000)) // Vector popcount #define CPU_VPCLMULQDQ ((uint64_t)UCONST64(0x4000000000)) //Vector carryless multiplication #define CPU_VAES ((uint64_t)UCONST64(0x8000000000)) // Vector AES instructions -#define CPU_VNNI ((uint64_t)UCONST64(0x16000000000)) // Vector Neural Network Instructions +#define CPU_VNNI ((uint64_t)UCONST64(0x10000000000)) // Vector Neural Network Instructions enum Extended_Family { // AMD diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/cpu/x86/x86_64.ad --- a/src/hotspot/cpu/x86/x86_64.ad Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/cpu/x86/x86_64.ad Fri Feb 22 20:36:42 2019 +0000 @@ -169,135 +169,94 @@ // Empty register class. reg_class no_reg(); -// Class for all pointer registers (including RSP and RBP) -reg_class any_reg_with_rbp(RAX, RAX_H, - RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - RSP, RSP_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R12, R12_H, - R13, R13_H, - R14, R14_H, - R15, R15_H); - -// Class for all pointer registers (including RSP, but excluding RBP) -reg_class any_reg_no_rbp(RAX, RAX_H, - RDX, RDX_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - RSP, RSP_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R12, R12_H, - R13, R13_H, - R14, R14_H, - R15, R15_H); - -// Dynamic register class that selects at runtime between register classes -// any_reg_no_rbp and any_reg_with_rbp (depending on the value of the flag PreserveFramePointer). -// Equivalent to: return PreserveFramePointer ? any_reg_no_rbp : any_reg_with_rbp; -reg_class_dynamic any_reg(any_reg_no_rbp, any_reg_with_rbp, %{ PreserveFramePointer %}); +// Class for all pointer/long registers +reg_class all_reg(RAX, RAX_H, + RDX, RDX_H, + RBP, RBP_H, + RDI, RDI_H, + RSI, RSI_H, + RCX, RCX_H, + RBX, RBX_H, + RSP, RSP_H, + R8, R8_H, + R9, R9_H, + R10, R10_H, + R11, R11_H, + R12, R12_H, + R13, R13_H, + R14, R14_H, + R15, R15_H); + +// Class for all int registers +reg_class all_int_reg(RAX + RDX, + RBP, + RDI, + RSI, + RCX, + RBX, + R8, + R9, + R10, + R11, + R12, + R13, + R14); + +// Class for all pointer registers +reg_class any_reg %{ + return _ANY_REG_mask; +%} // Class for all pointer registers (excluding RSP) -reg_class ptr_reg_with_rbp(RAX, RAX_H, - RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); +reg_class ptr_reg %{ + return _PTR_REG_mask; +%} // Class for all pointer registers (excluding RSP and RBP) -reg_class ptr_reg_no_rbp(RAX, RAX_H, - RDX, RDX_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between ptr_reg_no_rbp and ptr_reg_with_rbp. -reg_class_dynamic ptr_reg(ptr_reg_no_rbp, ptr_reg_with_rbp, %{ PreserveFramePointer %}); +reg_class ptr_reg_no_rbp %{ + return _PTR_REG_NO_RBP_mask; +%} // Class for all pointer registers (excluding RAX and RSP) -reg_class ptr_no_rax_reg_with_rbp(RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Class for all pointer registers (excluding RAX, RSP, and RBP) -reg_class ptr_no_rax_reg_no_rbp(RDX, RDX_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between ptr_no_rax_reg_no_rbp and ptr_no_rax_reg_with_rbp. -reg_class_dynamic ptr_no_rax_reg(ptr_no_rax_reg_no_rbp, ptr_no_rax_reg_with_rbp, %{ PreserveFramePointer %}); +reg_class ptr_no_rax_reg %{ + return _PTR_NO_RAX_REG_mask; +%} // Class for all pointer registers (excluding RAX, RBX, and RSP) -reg_class ptr_no_rax_rbx_reg_with_rbp(RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Class for all pointer registers (excluding RAX, RBX, RSP, and RBP) -reg_class ptr_no_rax_rbx_reg_no_rbp(RDX, RDX_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between ptr_no_rax_rbx_reg_no_rbp and ptr_no_rax_rbx_reg_with_rbp. -reg_class_dynamic ptr_no_rax_rbx_reg(ptr_no_rax_rbx_reg_no_rbp, ptr_no_rax_rbx_reg_with_rbp, %{ PreserveFramePointer %}); +reg_class ptr_no_rax_rbx_reg %{ + return _PTR_NO_RAX_RBX_REG_mask; +%} + +// Class for all long registers (excluding RSP) +reg_class long_reg %{ + return _LONG_REG_mask; +%} + +// Class for all long registers (excluding RAX, RDX and RSP) +reg_class long_no_rax_rdx_reg %{ + return _LONG_NO_RAX_RDX_REG_mask; +%} + +// Class for all long registers (excluding RCX and RSP) +reg_class long_no_rcx_reg %{ + return _LONG_NO_RCX_REG_mask; +%} + +// Class for all int registers (excluding RSP) +reg_class int_reg %{ + return _INT_REG_mask; +%} + +// Class for all int registers (excluding RAX, RDX, and RSP) +reg_class int_no_rax_rdx_reg %{ + return _INT_NO_RAX_RDX_REG_mask; +%} + +// Class for all int registers (excluding RCX and RSP) +reg_class int_no_rcx_reg %{ + return _INT_NO_RCX_REG_mask; +%} // Singleton class for RAX pointer register reg_class ptr_rax_reg(RAX, RAX_H); @@ -317,96 +276,6 @@ // Singleton class for TLS pointer reg_class ptr_r15_reg(R15, R15_H); -// Class for all long registers (excluding RSP) -reg_class long_reg_with_rbp(RAX, RAX_H, - RDX, RDX_H, - RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Class for all long registers (excluding RSP and RBP) -reg_class long_reg_no_rbp(RAX, RAX_H, - RDX, RDX_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between long_reg_no_rbp and long_reg_with_rbp. -reg_class_dynamic long_reg(long_reg_no_rbp, long_reg_with_rbp, %{ PreserveFramePointer %}); - -// Class for all long registers (excluding RAX, RDX and RSP) -reg_class long_no_rax_rdx_reg_with_rbp(RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Class for all long registers (excluding RAX, RDX, RSP, and RBP) -reg_class long_no_rax_rdx_reg_no_rbp(RDI, RDI_H, - RSI, RSI_H, - RCX, RCX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between long_no_rax_rdx_reg_no_rbp and long_no_rax_rdx_reg_with_rbp. -reg_class_dynamic long_no_rax_rdx_reg(long_no_rax_rdx_reg_no_rbp, long_no_rax_rdx_reg_with_rbp, %{ PreserveFramePointer %}); - -// Class for all long registers (excluding RCX and RSP) -reg_class long_no_rcx_reg_with_rbp(RBP, RBP_H, - RDI, RDI_H, - RSI, RSI_H, - RAX, RAX_H, - RDX, RDX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Class for all long registers (excluding RCX, RSP, and RBP) -reg_class long_no_rcx_reg_no_rbp(RDI, RDI_H, - RSI, RSI_H, - RAX, RAX_H, - RDX, RDX_H, - RBX, RBX_H, - R8, R8_H, - R9, R9_H, - R10, R10_H, - R11, R11_H, - R13, R13_H, - R14, R14_H); - -// Dynamic register class that selects between long_no_rcx_reg_no_rbp and long_no_rcx_reg_with_rbp. -reg_class_dynamic long_no_rcx_reg(long_no_rcx_reg_no_rbp, long_no_rcx_reg_with_rbp, %{ PreserveFramePointer %}); - // Singleton class for RAX long register reg_class long_rax_reg(RAX, RAX_H); @@ -416,96 +285,6 @@ // Singleton class for RDX long register reg_class long_rdx_reg(RDX, RDX_H); -// Class for all int registers (excluding RSP) -reg_class int_reg_with_rbp(RAX, - RDX, - RBP, - RDI, - RSI, - RCX, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Class for all int registers (excluding RSP and RBP) -reg_class int_reg_no_rbp(RAX, - RDX, - RDI, - RSI, - RCX, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Dynamic register class that selects between int_reg_no_rbp and int_reg_with_rbp. -reg_class_dynamic int_reg(int_reg_no_rbp, int_reg_with_rbp, %{ PreserveFramePointer %}); - -// Class for all int registers (excluding RCX and RSP) -reg_class int_no_rcx_reg_with_rbp(RAX, - RDX, - RBP, - RDI, - RSI, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Class for all int registers (excluding RCX, RSP, and RBP) -reg_class int_no_rcx_reg_no_rbp(RAX, - RDX, - RDI, - RSI, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Dynamic register class that selects between int_no_rcx_reg_no_rbp and int_no_rcx_reg_with_rbp. -reg_class_dynamic int_no_rcx_reg(int_no_rcx_reg_no_rbp, int_no_rcx_reg_with_rbp, %{ PreserveFramePointer %}); - -// Class for all int registers (excluding RAX, RDX, and RSP) -reg_class int_no_rax_rdx_reg_with_rbp(RBP, - RDI, - RSI, - RCX, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Class for all int registers (excluding RAX, RDX, RSP, and RBP) -reg_class int_no_rax_rdx_reg_no_rbp(RDI, - RSI, - RCX, - RBX, - R8, - R9, - R10, - R11, - R13, - R14); - -// Dynamic register class that selects between int_no_rax_rdx_reg_no_rbp and int_no_rax_rdx_reg_with_rbp. -reg_class_dynamic int_no_rax_rdx_reg(int_no_rax_rdx_reg_no_rbp, int_no_rax_rdx_reg_with_rbp, %{ PreserveFramePointer %}); - // Singleton class for RAX int register reg_class int_rax_reg(RAX); @@ -529,12 +308,123 @@ //----------SOURCE BLOCK------------------------------------------------------- // This is a block of C++ code which provides values, functions, and // definitions necessary in the rest of the architecture description +source_hpp %{ + +extern RegMask _ANY_REG_mask; +extern RegMask _PTR_REG_mask; +extern RegMask _PTR_REG_NO_RBP_mask; +extern RegMask _PTR_NO_RAX_REG_mask; +extern RegMask _PTR_NO_RAX_RBX_REG_mask; +extern RegMask _LONG_REG_mask; +extern RegMask _LONG_NO_RAX_RDX_REG_mask; +extern RegMask _LONG_NO_RCX_REG_mask; +extern RegMask _INT_REG_mask; +extern RegMask _INT_NO_RAX_RDX_REG_mask; +extern RegMask _INT_NO_RCX_REG_mask; + +extern RegMask _STACK_OR_PTR_REG_mask; +extern RegMask _STACK_OR_LONG_REG_mask; +extern RegMask _STACK_OR_INT_REG_mask; + +inline const RegMask& STACK_OR_PTR_REG_mask() { return _STACK_OR_PTR_REG_mask; } +inline const RegMask& STACK_OR_LONG_REG_mask() { return _STACK_OR_LONG_REG_mask; } +inline const RegMask& STACK_OR_INT_REG_mask() { return _STACK_OR_INT_REG_mask; } + +%} + source %{ #define RELOC_IMM64 Assembler::imm_operand #define RELOC_DISP32 Assembler::disp32_operand #define __ _masm. +RegMask _ANY_REG_mask; +RegMask _PTR_REG_mask; +RegMask _PTR_REG_NO_RBP_mask; +RegMask _PTR_NO_RAX_REG_mask; +RegMask _PTR_NO_RAX_RBX_REG_mask; +RegMask _LONG_REG_mask; +RegMask _LONG_NO_RAX_RDX_REG_mask; +RegMask _LONG_NO_RCX_REG_mask; +RegMask _INT_REG_mask; +RegMask _INT_NO_RAX_RDX_REG_mask; +RegMask _INT_NO_RCX_REG_mask; +RegMask _STACK_OR_PTR_REG_mask; +RegMask _STACK_OR_LONG_REG_mask; +RegMask _STACK_OR_INT_REG_mask; + +static bool need_r12_heapbase() { + return UseCompressedOops || UseCompressedClassPointers; +} + +void reg_mask_init() { + // _ALL_REG_mask is generated by adlc from the all_reg register class below. + // We derive a number of subsets from it. + _ANY_REG_mask = _ALL_REG_mask; + + if (PreserveFramePointer) { + _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _ANY_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + } + if (need_r12_heapbase()) { + _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); + _ANY_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg()->next())); + } + + _PTR_REG_mask = _ANY_REG_mask; + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg())); + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(rsp->as_VMReg()->next())); + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg())); + _PTR_REG_mask.Remove(OptoReg::as_OptoReg(r15->as_VMReg()->next())); + + _STACK_OR_PTR_REG_mask = _PTR_REG_mask; + _STACK_OR_PTR_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + + _PTR_REG_NO_RBP_mask = _PTR_REG_mask; + _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + _PTR_REG_NO_RBP_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg()->next())); + + _PTR_NO_RAX_REG_mask = _PTR_REG_mask; + _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _PTR_NO_RAX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + + _PTR_NO_RAX_RBX_REG_mask = _PTR_NO_RAX_REG_mask; + _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg())); + _PTR_NO_RAX_RBX_REG_mask.Remove(OptoReg::as_OptoReg(rbx->as_VMReg()->next())); + + _LONG_REG_mask = _PTR_REG_mask; + _STACK_OR_LONG_REG_mask = _LONG_REG_mask; + _STACK_OR_LONG_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + + _LONG_NO_RAX_RDX_REG_mask = _LONG_REG_mask; + _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg()->next())); + _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + _LONG_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg()->next())); + + _LONG_NO_RCX_REG_mask = _LONG_REG_mask; + _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); + _LONG_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg()->next())); + + _INT_REG_mask = _ALL_INT_REG_mask; + if (PreserveFramePointer) { + _INT_REG_mask.Remove(OptoReg::as_OptoReg(rbp->as_VMReg())); + } + if (need_r12_heapbase()) { + _INT_REG_mask.Remove(OptoReg::as_OptoReg(r12->as_VMReg())); + } + + _STACK_OR_INT_REG_mask = _INT_REG_mask; + _STACK_OR_INT_REG_mask.OR(STACK_OR_STACK_SLOTS_mask()); + + _INT_NO_RAX_RDX_REG_mask = _INT_REG_mask; + _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rax->as_VMReg())); + _INT_NO_RAX_RDX_REG_mask.Remove(OptoReg::as_OptoReg(rdx->as_VMReg())); + + _INT_NO_RCX_REG_mask = _INT_REG_mask; + _INT_NO_RCX_REG_mask.Remove(OptoReg::as_OptoReg(rcx->as_VMReg())); +} + static bool generate_vzeroupper(Compile* C) { return (VM_Version::supports_vzeroupper() && (C->max_vector_size() > 16 || C->clear_upper_avx() == true)) ? true: false; // Generate vzeroupper } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/aix/os_aix.inline.hpp --- a/src/hotspot/os/aix/os_aix.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/aix/os_aix.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -27,6 +27,7 @@ #define OS_AIX_OS_AIX_INLINE_HPP #include "runtime/os.hpp" +#include "os_posix.inline.hpp" // System includes diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/aix/os_perf_aix.cpp --- a/src/hotspot/os/aix/os_perf_aix.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/aix/os_perf_aix.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -859,11 +859,7 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::allocate_string(const char* str) const { if (str != NULL) { - size_t len = strlen(str); - char* tmp = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); - strncpy(tmp, str, len); - tmp[len] = '\0'; - return tmp; + return os::strdup_check_oom(str, mtInternal); } return NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/bsd/os_bsd.cpp --- a/src/hotspot/os/bsd/os_bsd.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/bsd/os_bsd.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -37,6 +37,7 @@ #include "memory/filemap.hpp" #include "oops/oop.inline.hpp" #include "os_bsd.inline.hpp" +#include "os_posix.inline.hpp" #include "os_share_bsd.hpp" #include "prims/jniFastGetField.hpp" #include "prims/jvm_misc.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/bsd/os_bsd.inline.hpp --- a/src/hotspot/os/bsd/os_bsd.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/bsd/os_bsd.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -26,6 +26,7 @@ #define OS_BSD_OS_BSD_INLINE_HPP #include "runtime/os.hpp" +#include "os_posix.inline.hpp" // System includes diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/linux/globals_linux.hpp --- a/src/hotspot/os/linux/globals_linux.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/linux/globals_linux.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -70,7 +70,12 @@ diagnostic(bool, DumpPrivateMappingsInCore, true, \ "If true, sets bit 2 of /proc/PID/coredump_filter, thus " \ "resulting in file-backed private mappings of the process to "\ - "be dumped into the corefile, if UseSharedSpaces is true.") \ + "be dumped into the corefile.") \ + \ + diagnostic(bool, DumpSharedMappingsInCore, true, \ + "If true, sets bit 3 of /proc/PID/coredump_filter, thus " \ + "resulting in file-backed shared mappings of the process to " \ + "be dumped into the corefile.") \ \ diagnostic(bool, UseCpuAllocPath, false, \ "Use CPU_ALLOC code path in os::active_processor_count ") diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/linux/os_linux.cpp --- a/src/hotspot/os/linux/os_linux.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/linux/os_linux.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -38,6 +38,7 @@ #include "memory/filemap.hpp" #include "oops/oop.inline.hpp" #include "os_linux.inline.hpp" +#include "os_posix.inline.hpp" #include "os_share_linux.hpp" #include "osContainer_linux.hpp" #include "prims/jniFastGetField.hpp" @@ -131,6 +132,7 @@ enum CoredumpFilterBit { FILE_BACKED_PVT_BIT = 1 << 2, + FILE_BACKED_SHARED_BIT = 1 << 3, LARGEPAGES_BIT = 1 << 6, DAX_SHARED_BIT = 1 << 8 }; @@ -1357,11 +1359,9 @@ void os::abort(bool dump_core, void* siginfo, const void* context) { os::shutdown(); if (dump_core) { -#if INCLUDE_CDS - if (UseSharedSpaces && DumpPrivateMappingsInCore) { + if (DumpPrivateMappingsInCore) { ClassLoader::close_jrt_image(); } -#endif #ifndef PRODUCT fdStream out(defaultStream::output_fd()); out.print_raw("Current thread is "); @@ -3432,8 +3432,6 @@ return result; } -// Set the coredump_filter bits to include largepages in core dump (bit 6) -// // From the coredump_filter documentation: // // - (bit 0) anonymous private memory @@ -5131,11 +5129,13 @@ set_coredump_filter(DAX_SHARED_BIT); } -#if INCLUDE_CDS - if (UseSharedSpaces && DumpPrivateMappingsInCore) { + if (DumpPrivateMappingsInCore) { set_coredump_filter(FILE_BACKED_PVT_BIT); } -#endif + + if (DumpSharedMappingsInCore) { + set_coredump_filter(FILE_BACKED_SHARED_BIT); + } return JNI_OK; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/linux/os_perf_linux.cpp --- a/src/hotspot/os/linux/os_perf_linux.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/linux/os_perf_linux.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -861,11 +861,7 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::allocate_string(const char* str) const { if (str != NULL) { - size_t len = strlen(str); - char* tmp = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); - strncpy(tmp, str, len); - tmp[len] = '\0'; - return tmp; + return os::strdup_check_oom(str, mtInternal); } return NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/posix/os_posix.cpp --- a/src/hotspot/os/posix/os_posix.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/posix/os_posix.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -180,13 +180,14 @@ const char name_template[] = "/jvmheap.XXXXXX"; - char *fullname = (char*)os::malloc((strlen(dir) + strlen(name_template) + 1), mtInternal); + size_t fullname_len = strlen(dir) + strlen(name_template); + char *fullname = (char*)os::malloc(fullname_len + 1, mtInternal); if (fullname == NULL) { vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno))); return -1; } - (void)strncpy(fullname, dir, strlen(dir)+1); - (void)strncat(fullname, name_template, strlen(name_template)); + int n = snprintf(fullname, fullname_len + 1, "%s%s", dir, name_template); + assert((size_t)n == fullname_len, "Unexpected number of characters in string"); os::native_path(fullname); @@ -2218,22 +2219,6 @@ assert_status(status == 0, status, "mutex_destroy"); } -void os::PlatformMonitor::lock() { - int status = pthread_mutex_lock(&_mutex); - assert_status(status == 0, status, "mutex_lock"); -} - -void os::PlatformMonitor::unlock() { - int status = pthread_mutex_unlock(&_mutex); - assert_status(status == 0, status, "mutex_unlock"); -} - -bool os::PlatformMonitor::try_lock() { - int status = pthread_mutex_trylock(&_mutex); - assert_status(status == 0 || status == EBUSY, status, "mutex_trylock"); - return status == 0; -} - // Must already be locked int os::PlatformMonitor::wait(jlong millis) { assert(millis >= 0, "negative timeout"); @@ -2262,14 +2247,4 @@ } } -void os::PlatformMonitor::notify() { - int status = pthread_cond_signal(&_cond); - assert_status(status == 0, status, "cond_signal"); -} - -void os::PlatformMonitor::notify_all() { - int status = pthread_cond_broadcast(&_cond); - assert_status(status == 0, status, "cond_broadcast"); -} - #endif // !SOLARIS diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/posix/os_posix.hpp --- a/src/hotspot/os/posix/os_posix.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/posix/os_posix.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -177,7 +177,7 @@ * These event objects are type-stable and immortal - we never delete them. * Events are associated with a thread for the lifetime of the thread. */ -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double cachePad[4]; // Increase odds that _mutex is sole occupant of cache line volatile int _event; // Event count/permit: -1, 0 or 1 @@ -212,7 +212,7 @@ // API updates of course). But Parker methods use fastpaths that break that // level of encapsulation - so combining the two remains a future project. -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: enum { REL_INDEX = 0, @@ -230,7 +230,7 @@ }; // Platform specific implementation that underpins VM Monitor/Mutex class -class PlatformMonitor : public CHeapObj { +class PlatformMonitor : public CHeapObj { private: pthread_mutex_t _mutex; // Native mutex for locking pthread_cond_t _cond; // Native condition variable for blocking diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/posix/os_posix.inline.hpp --- a/src/hotspot/os/posix/os_posix.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/posix/os_posix.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -42,6 +42,39 @@ inline int os::Posix::clock_getres(clockid_t clock_id, struct timespec *tp) { return _clock_getres != NULL ? _clock_getres(clock_id, tp) : -1; } + #endif // SUPPORTS_CLOCK_MONOTONIC +#ifndef SOLARIS + +// Platform Monitor implementation + +inline void os::PlatformMonitor::lock() { + int status = pthread_mutex_lock(&_mutex); + assert_status(status == 0, status, "mutex_lock"); +} + +inline void os::PlatformMonitor::unlock() { + int status = pthread_mutex_unlock(&_mutex); + assert_status(status == 0, status, "mutex_unlock"); +} + +inline bool os::PlatformMonitor::try_lock() { + int status = pthread_mutex_trylock(&_mutex); + assert_status(status == 0 || status == EBUSY, status, "mutex_trylock"); + return status == 0; +} + +inline void os::PlatformMonitor::notify() { + int status = pthread_cond_signal(&_cond); + assert_status(status == 0, status, "cond_signal"); +} + +inline void os::PlatformMonitor::notify_all() { + int status = pthread_cond_broadcast(&_cond); + assert_status(status == 0, status, "cond_broadcast"); +} + +#endif // !SOLARIS + #endif // OS_POSIX_OS_POSIX_INLINE_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/solaris/os_perf_solaris.cpp --- a/src/hotspot/os/solaris/os_perf_solaris.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/solaris/os_perf_solaris.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -544,11 +544,7 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::allocate_string(const char* str) const { if (str != NULL) { - size_t len = strlen(str); - char* tmp = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); - strncpy(tmp, str, len); - tmp[len] = '\0'; - return tmp; + return os::strdup_check_oom(str, mtInternal); } return NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/solaris/os_solaris.hpp --- a/src/hotspot/os/solaris/os_solaris.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/solaris/os_solaris.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -281,7 +281,7 @@ }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad[4]; // increase odds that _mutex is sole occupant of cache line volatile int _Event; @@ -317,7 +317,7 @@ void unpark(); }; -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: mutex_t _mutex[1]; cond_t _cond[1]; @@ -336,7 +336,7 @@ }; // Platform specific implementation that underpins VM Monitor/Mutex class -class PlatformMonitor : public CHeapObj { +class PlatformMonitor : public CHeapObj { private: mutex_t _mutex; // Native mutex for locking cond_t _cond; // Native condition variable for blocking diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/windows/os_perf_windows.cpp --- a/src/hotspot/os/windows/os_perf_windows.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/windows/os_perf_windows.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1253,14 +1253,7 @@ char* SystemProcessInterface::SystemProcesses::ProcessIterator::allocate_string(const char* str) const { if (str != NULL) { - size_t len = strlen(str); - char* tmp = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); - if (NULL == tmp) { - return NULL; - } - strncpy(tmp, str, len); - tmp[len] = '\0'; - return tmp; + return os::strdup_check_oom(str, mtInternal); } return NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/windows/os_windows.cpp --- a/src/hotspot/os/windows/os_windows.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/windows/os_windows.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -2970,14 +2970,15 @@ int os::create_file_for_heap(const char* dir) { const char name_template[] = "/jvmheap.XXXXXX"; - char *fullname = (char*)os::malloc((strlen(dir) + strlen(name_template) + 1), mtInternal); + + size_t fullname_len = strlen(dir) + strlen(name_template); + char *fullname = (char*)os::malloc(fullname_len + 1, mtInternal); if (fullname == NULL) { vm_exit_during_initialization(err_msg("Malloc failed during creation of backing file for heap (%s)", os::strerror(errno))); return -1; } - - (void)strncpy(fullname, dir, strlen(dir)+1); - (void)strncat(fullname, name_template, strlen(name_template)); + int n = snprintf(fullname, fullname_len + 1, "%s%s", dir, name_template); + assert((size_t)n == fullname_len, "Unexpected number of characters in string"); os::native_path(fullname); @@ -5319,27 +5320,6 @@ // Platform Monitor implementation -os::PlatformMonitor::PlatformMonitor() { - InitializeConditionVariable(&_cond); - InitializeCriticalSection(&_mutex); -} - -os::PlatformMonitor::~PlatformMonitor() { - DeleteCriticalSection(&_mutex); -} - -void os::PlatformMonitor::lock() { - EnterCriticalSection(&_mutex); -} - -void os::PlatformMonitor::unlock() { - LeaveCriticalSection(&_mutex); -} - -bool os::PlatformMonitor::try_lock() { - return TryEnterCriticalSection(&_mutex); -} - // Must already be locked int os::PlatformMonitor::wait(jlong millis) { assert(millis >= 0, "negative timeout"); @@ -5358,14 +5338,6 @@ return ret; } -void os::PlatformMonitor::notify() { - WakeConditionVariable(&_cond); -} - -void os::PlatformMonitor::notify_all() { - WakeAllConditionVariable(&_cond); -} - // Run the specified command in a separate process. Return its exit value, // or -1 on failure (e.g. can't create a new process). int os::fork_and_exec(char* cmd, bool use_vfork_if_available) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/windows/os_windows.hpp --- a/src/hotspot/os/windows/os_windows.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/windows/os_windows.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -148,7 +148,7 @@ static volatile intptr_t _crash_mux; }; -class PlatformEvent : public CHeapObj { +class PlatformEvent : public CHeapObj { private: double CachePad [4] ; // increase odds that _Event is sole occupant of cache line volatile int _Event ; @@ -174,7 +174,7 @@ -class PlatformParker : public CHeapObj { +class PlatformParker : public CHeapObj { protected: HANDLE _ParkEvent ; @@ -188,7 +188,7 @@ } ; // Platform specific implementation that underpins VM Monitor/Mutex class -class PlatformMonitor : public CHeapObj { +class PlatformMonitor : public CHeapObj { private: CRITICAL_SECTION _mutex; // Native mutex for locking CONDITION_VARIABLE _cond; // Native condition variable for blocking diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/os/windows/os_windows.inline.hpp --- a/src/hotspot/os/windows/os_windows.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/os/windows/os_windows.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -86,4 +86,35 @@ win32::exit_process_or_thread(win32::EPT_PROCESS, num); } +// Platform Monitor implementation + +inline os::PlatformMonitor::PlatformMonitor() { + InitializeConditionVariable(&_cond); + InitializeCriticalSection(&_mutex); +} + +inline os::PlatformMonitor::~PlatformMonitor() { + DeleteCriticalSection(&_mutex); +} + +inline void os::PlatformMonitor::lock() { + EnterCriticalSection(&_mutex); +} + +inline void os::PlatformMonitor::unlock() { + LeaveCriticalSection(&_mutex); +} + +inline bool os::PlatformMonitor::try_lock() { + return TryEnterCriticalSection(&_mutex); +} + +inline void os::PlatformMonitor::notify() { + WakeConditionVariable(&_cond); +} + +inline void os::PlatformMonitor::notify_all() { + WakeAllConditionVariable(&_cond); +} + #endif // OS_WINDOWS_OS_WINDOWS_INLINE_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/adlc/formsopt.hpp --- a/src/hotspot/share/adlc/formsopt.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/adlc/formsopt.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -242,9 +242,6 @@ char* code_snippet() { return _code_snippet; } - void set_stack_version(bool flag) { - assert(false, "User defined register classes are not allowed to spill to the stack."); - } void declare_register_masks(FILE* fp); void build_register_masks(FILE* fp) { // We do not need to generate register masks because we select at runtime diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/c1/c1_Optimizer.cpp --- a/src/hotspot/share/c1/c1_Optimizer.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/c1/c1_Optimizer.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -174,6 +174,12 @@ for_each_phi_fun(t_block, phi, return; ); for_each_phi_fun(f_block, phi, return; ); + // Only replace safepoint gotos if state_before information is available (if is a safepoint) + bool is_safepoint = if_->is_safepoint(); + if (!is_safepoint && (t_goto->is_safepoint() || f_goto->is_safepoint())) { + return; + } + // 2) substitute conditional expression // with an IfOp followed by a Goto // cut if_ away and get node before @@ -202,7 +208,7 @@ // append Goto to successor ValueStack* state_before = if_->state_before(); - Goto* goto_ = new Goto(sux, state_before, if_->is_safepoint() || t_goto->is_safepoint() || f_goto->is_safepoint()); + Goto* goto_ = new Goto(sux, state_before, is_safepoint); // prepare state for Goto ValueStack* goto_state = if_state; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/ci/ciReplay.cpp --- a/src/hotspot/share/ci/ciReplay.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/ci/ciReplay.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -33,6 +33,7 @@ #include "memory/allocation.inline.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.hpp" #include "oops/method.inline.hpp" #include "oops/oop.inline.hpp" #include "runtime/fieldDescriptor.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/classFileParser.cpp --- a/src/hotspot/share/classfile/classFileParser.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/classFileParser.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -5743,16 +5743,13 @@ ClassLoader::package_from_name(unsafe_anonymous_host->name()->as_C_string(), NULL); if (host_pkg_name != NULL) { - size_t host_pkg_len = strlen(host_pkg_name); + int host_pkg_len = (int)strlen(host_pkg_name); int class_name_len = _class_name->utf8_length(); - char* new_anon_name = - NEW_RESOURCE_ARRAY(char, host_pkg_len + 1 + class_name_len); - // Copy host package name and trailing /. - strncpy(new_anon_name, host_pkg_name, host_pkg_len); - new_anon_name[host_pkg_len] = '/'; - // Append unsafe anonymous class name. The unsafe anonymous class name can contain odd - // characters. So, do a strncpy instead of using sprintf("%s..."). - strncpy(new_anon_name + host_pkg_len + 1, (char *)_class_name->base(), class_name_len); + int symbol_len = host_pkg_len + 1 + class_name_len; + char* new_anon_name = NEW_RESOURCE_ARRAY(char, symbol_len + 1); + int n = snprintf(new_anon_name, symbol_len + 1, "%s/%.*s", + host_pkg_name, class_name_len, _class_name->base()); + assert(n == symbol_len, "Unexpected number of characters in string"); // Decrement old _class_name to avoid leaking. _class_name->decrement_refcount(); @@ -5761,9 +5758,7 @@ // The new class name is created with a refcount of one. When installed into the InstanceKlass, // it'll be two and when the ClassFileParser destructor runs, it'll go back to one and get deleted // when the class is unloaded. - _class_name = SymbolTable::new_symbol(new_anon_name, - (int)host_pkg_len + 1 + class_name_len, - CHECK); + _class_name = SymbolTable::new_symbol(new_anon_name, symbol_len, CHECK); } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/classLoader.cpp --- a/src/hotspot/share/classfile/classLoader.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/classLoader.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -101,7 +101,6 @@ static JImageFindResource_t JImageFindResource = NULL; static JImageGetResource_t JImageGetResource = NULL; static JImageResourceIterator_t JImageResourceIterator = NULL; -static JImage_ResourcePath_t JImageResourcePath = NULL; // Globals @@ -621,13 +620,14 @@ update_module_path_entry_list(path, THREAD); } +#endif // INCLUDE_CDS + void ClassLoader::close_jrt_image() { - assert(ClassLoader::has_jrt_entry(), "Not applicable for exploded builds"); + // Not applicable for exploded builds + if (!ClassLoader::has_jrt_entry()) return; _jrt_entry->close_jimage(); } -#endif // INCLUDE_CDS - // Construct the array of module/path pairs as specified to --patch-module // for the boot loader to search ahead of the jimage, if the class being // loaded is defined to a module that has been specified to --patch-module. @@ -1094,8 +1094,6 @@ guarantee(JImageGetResource != NULL, "function JIMAGE_GetResource not found"); JImageResourceIterator = CAST_TO_FN_PTR(JImageResourceIterator_t, os::dll_lookup(handle, "JIMAGE_ResourceIterator")); guarantee(JImageResourceIterator != NULL, "function JIMAGE_ResourceIterator not found"); - JImageResourcePath = CAST_TO_FN_PTR(JImage_ResourcePath_t, os::dll_lookup(handle, "JIMAGE_ResourcePath")); - guarantee(JImageResourcePath != NULL, "function JIMAGE_ResourcePath not found"); } jboolean ClassLoader::decompress(void *in, u8 inSize, void *out, u8 outSize, char **pmsg) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/classLoader.hpp --- a/src/hotspot/share/classfile/classLoader.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/classLoader.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -247,12 +247,12 @@ static void load_zip_library(); static void load_jimage_library(); + + public: static ClassPathEntry* create_class_path_entry(const char *path, const struct stat* st, bool throw_exception, bool is_boot_append, TRAPS); - public: - // If the package for the fully qualified class name is in the boot // loader's package entry table then add_package() sets the classpath_index // field so that get_system_package() will know to return a non-null value diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/classLoaderExt.cpp --- a/src/hotspot/share/classfile/classLoaderExt.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/classLoaderExt.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -203,13 +203,13 @@ file_end = end; } - int name_len = (int)strlen(file_start); + size_t name_len = strlen(file_start); if (name_len > 0) { ResourceMark rm(THREAD); - char* libname = NEW_RESOURCE_ARRAY(char, dir_len + name_len + 1); - *libname = 0; - strncat(libname, dir_name, dir_len); - strncat(libname, file_start, name_len); + size_t libname_len = dir_len + name_len; + char* libname = NEW_RESOURCE_ARRAY(char, libname_len + 1); + int n = snprintf(libname, libname_len + 1, "%.*s%s", dir_len, dir_name, file_start); + assert((size_t)n == libname_len, "Unexpected number of characters in string"); trace_class_path("library = ", libname); ClassLoader::update_class_path_entry_list(libname, true, false); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/klassFactory.cpp --- a/src/hotspot/share/classfile/klassFactory.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/klassFactory.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. +* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,22 +46,22 @@ InstanceKlass* ik, Symbol* class_name, Handle class_loader, - Handle protection_domain, TRAPS) { + Handle protection_domain, + const ClassFileStream *cfs, + TRAPS) { #if INCLUDE_CDS && INCLUDE_JVMTI assert(ik != NULL, "sanity"); assert(ik->is_shared(), "expecting a shared class"); - if (JvmtiExport::should_post_class_file_load_hook()) { assert(THREAD->is_Java_thread(), "must be JavaThread"); // Post the CFLH JvmtiCachedClassFileData* cached_class_file = NULL; - JvmtiCachedClassFileData* archived_class_data = ik->get_archived_class_data(); - assert(archived_class_data != NULL, "shared class has no archived class data"); - unsigned char* ptr = - VM_RedefineClasses::get_cached_class_file_bytes(archived_class_data); - unsigned char* end_ptr = - ptr + VM_RedefineClasses::get_cached_class_file_len(archived_class_data); + if (cfs == NULL) { + cfs = FileMapInfo::open_stream_for_jvmti(ik, CHECK_NULL); + } + unsigned char* ptr = (unsigned char*)cfs->buffer(); + unsigned char* end_ptr = ptr + cfs->length(); unsigned char* old_ptr = ptr; JvmtiExport::post_class_file_load_hook(class_name, class_loader, @@ -75,25 +75,9 @@ ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); int path_index = ik->shared_classpath_index(); - const char* pathname; - if (path_index < 0) { - // shared classes loaded by user defined class loader - // do not have shared_classpath_index - ModuleEntry* mod_entry = ik->module(); - if (mod_entry != NULL && (mod_entry->location() != NULL)) { - ResourceMark rm; - pathname = (const char*)(mod_entry->location()->as_C_string()); - } else { - pathname = ""; - } - } else { - SharedClassPathEntry* ent = - (SharedClassPathEntry*)FileMapInfo::shared_path(path_index); - pathname = ent == NULL ? NULL : ent->name(); - } ClassFileStream* stream = new ClassFileStream(ptr, end_ptr - ptr, - pathname, + cfs->source(), ClassFileStream::verify); ClassFileParser parser(stream, class_name, @@ -236,24 +220,6 @@ #if INCLUDE_CDS if (DumpSharedSpaces) { ClassLoader::record_result(result, stream, THREAD); -#if INCLUDE_JVMTI - assert(cached_class_file == NULL, "Sanity"); - // Archive the class stream data into the optional data section - JvmtiCachedClassFileData *p; - int len; - const unsigned char *bytes; - // event based tracing might set cached_class_file - if ((bytes = result->get_cached_class_file_bytes()) != NULL) { - len = result->get_cached_class_file_len(); - } else { - len = stream->length(); - bytes = stream->buffer(); - } - p = (JvmtiCachedClassFileData*)os::malloc(offset_of(JvmtiCachedClassFileData, data) + len, mtInternal); - p->length = len; - memcpy(p->data, bytes, len); - result->set_archived_class_data(p); -#endif // INCLUDE_JVMTI } #endif // INCLUDE_CDS diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/klassFactory.hpp --- a/src/hotspot/share/classfile/klassFactory.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/klassFactory.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -80,7 +80,9 @@ InstanceKlass* ik, Symbol* class_name, Handle class_loader, - Handle protection_domain, TRAPS); + Handle protection_domain, + const ClassFileStream *cfs, + TRAPS); }; #endif // SHARE_CLASSFILE_KLASSFACTORY_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/stackMapTable.cpp --- a/src/hotspot/share/classfile/stackMapTable.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/stackMapTable.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -26,6 +26,7 @@ #include "classfile/stackMapTable.hpp" #include "classfile/verifier.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.hpp" #include "oops/oop.inline.hpp" #include "runtime/fieldType.hpp" #include "runtime/handles.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/symbolTable.cpp --- a/src/hotspot/share/classfile/symbolTable.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/symbolTable.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -436,18 +436,16 @@ } } -void SymbolTable::add(ClassLoaderData* loader_data, const constantPoolHandle& cp, - int names_count, const char** names, int* lengths, - int* cp_indices, unsigned int* hashValues, TRAPS) { +void SymbolTable::new_symbols(ClassLoaderData* loader_data, const constantPoolHandle& cp, + int names_count, const char** names, int* lengths, + int* cp_indices, unsigned int* hashValues, TRAPS) { bool c_heap = !loader_data->is_the_null_class_loader_data(); for (int i = 0; i < names_count; i++) { const char *name = names[i]; int len = lengths[i]; unsigned int hash = hashValues[i]; - Symbol* sym = SymbolTable::the_table()->lookup_common(name, len, hash); - if (sym == NULL) { - sym = SymbolTable::the_table()->do_add_if_needed(name, len, hash, c_heap, CHECK); - } + assert(SymbolTable::the_table()->lookup_shared(name, len, hash) == NULL, "must have checked already"); + Symbol* sym = SymbolTable::the_table()->do_add_if_needed(name, len, hash, c_heap, CHECK); assert(sym->refcount() != 0, "lookup should have incremented the count"); cp->symbol_at_put(cp_indices[i], sym); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/symbolTable.hpp --- a/src/hotspot/share/classfile/symbolTable.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/symbolTable.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -144,18 +144,11 @@ Symbol* do_add_if_needed(const char* name, int len, uintx hash, bool heap, TRAPS); // Adding elements - static void add(ClassLoaderData* loader_data, - const constantPoolHandle& cp, int names_count, - const char** names, int* lengths, int* cp_indices, - unsigned int* hashValues, TRAPS); - static void new_symbols(ClassLoaderData* loader_data, const constantPoolHandle& cp, int names_count, const char** name, int* lengths, int* cp_indices, unsigned int* hashValues, - TRAPS) { - add(loader_data, cp, names_count, name, lengths, cp_indices, hashValues, THREAD); - } + TRAPS); static Symbol* lookup_shared(const char* name, int len, unsigned int hash); Symbol* lookup_dynamic(const char* name, int len, unsigned int hash); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/systemDictionary.cpp --- a/src/hotspot/share/classfile/systemDictionary.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/systemDictionary.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1174,7 +1174,7 @@ TRAPS) { InstanceKlass* ik = SystemDictionaryShared::find_builtin_class(class_name); if (ik != NULL && ik->is_shared_boot_class()) { - return load_shared_class(ik, Handle(), Handle(), THREAD); + return load_shared_class(ik, Handle(), Handle(), NULL, THREAD); } return NULL; } @@ -1274,7 +1274,9 @@ InstanceKlass* SystemDictionary::load_shared_class(InstanceKlass* ik, Handle class_loader, - Handle protection_domain, TRAPS) { + Handle protection_domain, + const ClassFileStream *cfs, + TRAPS) { if (ik != NULL) { Symbol* class_name = ik->name(); @@ -1321,7 +1323,7 @@ } InstanceKlass* new_ik = KlassFactory::check_shared_class_file_load_hook( - ik, class_name, class_loader, protection_domain, CHECK_NULL); + ik, class_name, class_loader, protection_domain, cfs, CHECK_NULL); if (new_ik != NULL) { // The class is changed by CFLH. Return the new class. The shared class is // not used. diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/systemDictionary.hpp --- a/src/hotspot/share/classfile/systemDictionary.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/systemDictionary.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -628,6 +628,7 @@ static InstanceKlass* load_shared_class(InstanceKlass* ik, Handle class_loader, Handle protection_domain, + const ClassFileStream *cfs, TRAPS); static InstanceKlass* load_shared_boot_class(Symbol* class_name, TRAPS); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/systemDictionaryShared.cpp --- a/src/hotspot/share/classfile/systemDictionaryShared.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/systemDictionaryShared.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -803,7 +803,7 @@ SystemDictionary::is_platform_class_loader(class_loader()))) { Handle protection_domain = SystemDictionaryShared::init_security_info(class_loader, ik, CHECK_NULL); - return load_shared_class(ik, class_loader, protection_domain, THREAD); + return load_shared_class(ik, class_loader, protection_domain, NULL, THREAD); } } return NULL; @@ -873,13 +873,15 @@ } return acquire_class_for_current_thread(record->_klass, class_loader, - protection_domain, THREAD); + protection_domain, cfs, + THREAD); } InstanceKlass* SystemDictionaryShared::acquire_class_for_current_thread( InstanceKlass *ik, Handle class_loader, Handle protection_domain, + const ClassFileStream *cfs, TRAPS) { ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); @@ -900,7 +902,8 @@ loader_data->add_class(ik); // Load and check super/interfaces, restore unsharable info - InstanceKlass* shared_klass = load_shared_class(ik, class_loader, protection_domain, THREAD); + InstanceKlass* shared_klass = load_shared_class(ik, class_loader, protection_domain, + cfs, THREAD); if (shared_klass == NULL || HAS_PENDING_EXCEPTION) { // TODO: clean up so it can be used again return NULL; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/systemDictionaryShared.hpp --- a/src/hotspot/share/classfile/systemDictionaryShared.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/systemDictionaryShared.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -207,6 +207,7 @@ InstanceKlass *ik, Handle class_loader, Handle protection_domain, + const ClassFileStream* cfs, TRAPS); static DumpTimeSharedClassInfo* find_or_allocate_info_for(InstanceKlass* k); static void write_dictionary(RunTimeSharedDictionary* dictionary, bool is_builtin); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/verifier.cpp --- a/src/hotspot/share/classfile/verifier.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/verifier.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2981,18 +2981,16 @@ } // add one dimension to component length++; - arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length); - arr_sig_str[0] = '['; - strncpy(&arr_sig_str[1], component_name, length - 1); + arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length + 1); + int n = snprintf(arr_sig_str, length + 1, "[%s", component_name); + assert(n == length, "Unexpected number of characters in string"); } else { // it's an object or interface const char* component_name = component_type.name()->as_utf8(); // add one dimension to component with 'L' prepended and ';' postpended. length = (int)strlen(component_name) + 3; - arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length); - arr_sig_str[0] = '['; - arr_sig_str[1] = 'L'; - strncpy(&arr_sig_str[2], component_name, length - 2); - arr_sig_str[length - 1] = ';'; + arr_sig_str = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, length + 1); + int n = snprintf(arr_sig_str, length + 1, "[L%s;", component_name); + assert(n == length, "Unexpected number of characters in string"); } Symbol* arr_sig = create_temporary_symbol( arr_sig_str, length, CHECK_VERIFY(this)); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/classfile/verifier.hpp --- a/src/hotspot/share/classfile/verifier.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/classfile/verifier.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -49,7 +49,7 @@ // Return false if the class is loaded by the bootstrap loader, // or if defineClass was called requesting skipping verification - // -Xverify:all/none override this value + // -Xverify:all overrides this value static bool should_verify_for(oop class_loader, bool should_verify_class); // Relax certain access checks to enable some broken 1.1 apps to run on 1.2. diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp --- a/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/cms/concurrentMarkSweepGeneration.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -2761,7 +2761,7 @@ CMSPhaseAccounting::~CMSPhaseAccounting() { _collector->gc_timer_cm()->register_gc_concurrent_end(); _collector->stopTimer(); - log_debug(gc)("Concurrent active time: %.3fms", TimeHelper::counter_to_seconds(_collector->timerTicks())); + log_debug(gc)("Concurrent active time: %.3fms", TimeHelper::counter_to_millis(_collector->timerTicks())); log_trace(gc)(" (CMS %s yielded %d times)", _title, _collector->yields()); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1Allocator.cpp --- a/src/hotspot/share/gc/g1/g1Allocator.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1Allocator.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -321,16 +321,26 @@ } } -void G1PLABAllocator::waste(size_t& wasted, size_t& undo_wasted) { - wasted = 0; - undo_wasted = 0; +size_t G1PLABAllocator::waste() const { + size_t result = 0; for (uint state = 0; state < InCSetState::Num; state++) { PLAB * const buf = _alloc_buffers[state]; if (buf != NULL) { - wasted += buf->waste(); - undo_wasted += buf->undo_waste(); + result += buf->waste(); } } + return result; +} + +size_t G1PLABAllocator::undo_waste() const { + size_t result = 0; + for (uint state = 0; state < InCSetState::Num; state++) { + PLAB * const buf = _alloc_buffers[state]; + if (buf != NULL) { + result += buf->undo_waste(); + } + } + return result; } bool G1ArchiveAllocator::_archive_check_enabled = false; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1Allocator.hpp --- a/src/hotspot/share/gc/g1/g1Allocator.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1Allocator.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -155,7 +155,8 @@ public: G1PLABAllocator(G1Allocator* allocator); - void waste(size_t& wasted, size_t& undo_wasted); + size_t waste() const; + size_t undo_waste() const; // Allocate word_sz words in dest, either directly into the regions or by // allocating a new PLAB. Returns the address of the allocated memory, NULL if diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1CollectedHeap.cpp --- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -3282,10 +3282,6 @@ _root_processor->evacuate_roots(pss, worker_id); - // We pass a weak code blobs closure to the remembered set scanning because we want to avoid - // treating the nmethods visited to act as roots for concurrent marking. - // We only want to make sure that the oops in the nmethods are adjusted with regard to the - // objects copied by the current evacuation. _g1h->g1_rem_set()->oops_into_collection_set_do(pss, worker_id); double strong_roots_sec = os::elapsedTime() - start_strong_roots_sec; @@ -3303,27 +3299,22 @@ G1GCPhaseTimes* p = _g1h->g1_policy()->phase_times(); p->add_time_secs(G1GCPhaseTimes::ObjCopy, worker_id, elapsed_sec - term_sec); + + p->record_or_add_thread_work_item(G1GCPhaseTimes::ObjCopy, + worker_id, + pss->lab_waste_words() * HeapWordSize, + G1GCPhaseTimes::ObjCopyLABWaste); + p->record_or_add_thread_work_item(G1GCPhaseTimes::ObjCopy, + worker_id, + pss->lab_undo_waste_words() * HeapWordSize, + G1GCPhaseTimes::ObjCopyLABUndoWaste); + p->record_time_secs(G1GCPhaseTimes::Termination, worker_id, term_sec); p->record_thread_work_item(G1GCPhaseTimes::Termination, worker_id, evac_term_attempts); } assert(pss->queue_is_empty(), "should be empty"); - if (log_is_enabled(Debug, gc, task, stats)) { - MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag); - size_t lab_waste; - size_t lab_undo_waste; - pss->waste(lab_waste, lab_undo_waste); - _g1h->print_termination_stats(worker_id, - (os::elapsedTime() - start_sec) * 1000.0, /* elapsed time */ - strong_roots_sec * 1000.0, /* strong roots time */ - term_sec * 1000.0, /* evac term time */ - evac_term_attempts, /* evac term attempts */ - lab_waste, /* alloc buffer waste */ - lab_undo_waste /* undo waste */ - ); - } - // Close the inner scope so that the ResourceMark and HandleMark // destructors are executed here and are included as part of the // "GC Worker Time". @@ -3332,31 +3323,6 @@ } }; -void G1CollectedHeap::print_termination_stats_hdr() { - log_debug(gc, task, stats)("GC Termination Stats"); - log_debug(gc, task, stats)(" elapsed --strong roots-- -------termination------- ------waste (KiB)------"); - log_debug(gc, task, stats)("thr ms ms %% ms %% attempts total alloc undo"); - log_debug(gc, task, stats)("--- --------- --------- ------ --------- ------ -------- ------- ------- -------"); -} - -void G1CollectedHeap::print_termination_stats(uint worker_id, - double elapsed_ms, - double strong_roots_ms, - double term_ms, - size_t term_attempts, - size_t alloc_buffer_waste, - size_t undo_waste) const { - log_debug(gc, task, stats) - ("%3d %9.2f %9.2f %6.2f " - "%9.2f %6.2f " SIZE_FORMAT_W(8) " " - SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7) " " SIZE_FORMAT_W(7), - worker_id, elapsed_ms, strong_roots_ms, strong_roots_ms * 100 / elapsed_ms, - term_ms, term_ms * 100 / elapsed_ms, term_attempts, - (alloc_buffer_waste + undo_waste) * HeapWordSize / K, - alloc_buffer_waste * HeapWordSize / K, - undo_waste * HeapWordSize / K); -} - void G1CollectedHeap::complete_cleaning(BoolObjectClosure* is_alive, bool class_unloading_occurred) { uint num_workers = workers()->active_workers(); @@ -3767,8 +3733,6 @@ G1RootProcessor root_processor(this, n_workers); G1ParTask g1_par_task(this, per_thread_states, _task_queues, &root_processor, n_workers); - print_termination_stats_hdr(); - workers()->run_task(&g1_par_task); end_par_time_sec = os::elapsedTime(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1CollectedHeap.hpp --- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -738,16 +738,6 @@ void pre_evacuate_collection_set(); void post_evacuate_collection_set(G1EvacuationInfo& evacuation_info, G1ParScanThreadStateSet* pss); - // Print the header for the per-thread termination statistics. - static void print_termination_stats_hdr(); - // Print actual per-thread termination statistics. - void print_termination_stats(uint worker_id, - double elapsed_ms, - double strong_roots_ms, - double term_ms, - size_t term_attempts, - size_t alloc_buffer_waste, - size_t undo_waste) const; // Update object copying statistics. void record_obj_copy_mem_stats(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1FullGCOopClosures.cpp --- a/src/hotspot/share/gc/g1/g1FullGCOopClosures.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1FullGCOopClosures.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,26 +71,19 @@ } if (!_g1h->is_in_closed_subset(obj)) { HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); - yy.print_cr("Field " PTR_FORMAT - " of live obj " PTR_FORMAT " in region " - "[" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(p), p2i(_containing_obj), - p2i(from->bottom()), p2i(from->end())); + yy.print_cr("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); print_object(&yy, _containing_obj); yy.print_cr("points to obj " PTR_FORMAT " not in the heap", - p2i(obj)); + p2i(obj)); } else { HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj); - yy.print_cr("Field " PTR_FORMAT - " of live obj " PTR_FORMAT " in region " - "[" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(p), p2i(_containing_obj), - p2i(from->bottom()), p2i(from->end())); + yy.print_cr("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); print_object(&yy, _containing_obj); - yy.print_cr("points to dead obj " PTR_FORMAT " in region " - "[" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(obj), p2i(to->bottom()), p2i(to->end())); + yy.print_cr("points to dead obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(obj), HR_FORMAT_PARAMS(to)); print_object(&yy, obj); } yy.print_cr("----------"); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp --- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -60,6 +60,9 @@ _gc_par_phases[SystemDictionaryRoots] = new WorkerDataArray(max_gc_threads, "SystemDictionary Roots (ms):"); _gc_par_phases[CLDGRoots] = new WorkerDataArray(max_gc_threads, "CLDG Roots (ms):"); _gc_par_phases[JVMTIRoots] = new WorkerDataArray(max_gc_threads, "JVMTI Roots (ms):"); +#if INCLUDE_AOT + _gc_par_phases[AOTCodeRoots] = new WorkerDataArray(max_gc_threads, "AOT Root Scan (ms):"); +#endif _gc_par_phases[CMRefRoots] = new WorkerDataArray(max_gc_threads, "CM RefProcessor Roots (ms):"); _gc_par_phases[WaitForStrongCLD] = new WorkerDataArray(max_gc_threads, "Wait For Strong CLD (ms):"); _gc_par_phases[WeakCLDRoots] = new WorkerDataArray(max_gc_threads, "Weak CLD Roots (ms):"); @@ -74,9 +77,6 @@ _gc_par_phases[ScanRS] = new WorkerDataArray(max_gc_threads, "Scan RS (ms):"); _gc_par_phases[OptScanRS] = new WorkerDataArray(max_gc_threads, "Optional Scan RS (ms):"); _gc_par_phases[CodeRoots] = new WorkerDataArray(max_gc_threads, "Code Root Scanning (ms):"); -#if INCLUDE_AOT - _gc_par_phases[AOTCodeRoots] = new WorkerDataArray(max_gc_threads, "AOT Root Scanning (ms):"); -#endif _gc_par_phases[ObjCopy] = new WorkerDataArray(max_gc_threads, "Object Copy (ms):"); _gc_par_phases[OptObjCopy] = new WorkerDataArray(max_gc_threads, "Optional Object Copy (ms):"); _gc_par_phases[Termination] = new WorkerDataArray(max_gc_threads, "Termination (ms):"); @@ -107,6 +107,11 @@ _update_rs_skipped_cards = new WorkerDataArray(max_gc_threads, "Skipped Cards:"); _gc_par_phases[UpdateRS]->link_thread_work_items(_update_rs_skipped_cards, UpdateRSSkippedCards); + _obj_copy_lab_waste = new WorkerDataArray(max_gc_threads, "LAB Waste"); + _gc_par_phases[ObjCopy]->link_thread_work_items(_obj_copy_lab_waste, ObjCopyLABWaste); + _obj_copy_lab_undo_waste = new WorkerDataArray(max_gc_threads, "LAB Undo Waste"); + _gc_par_phases[ObjCopy]->link_thread_work_items(_obj_copy_lab_undo_waste, ObjCopyLABUndoWaste); + _termination_attempts = new WorkerDataArray(max_gc_threads, "Termination Attempts:"); _gc_par_phases[Termination]->link_thread_work_items(_termination_attempts); @@ -383,15 +388,12 @@ for (int i = ThreadRoots; i <= SATBFiltering; i++) { trace_phase(_gc_par_phases[i]); } + if (G1HotCardCache::default_use_cache()) { + debug_phase(_gc_par_phases[ScanHCC]); + } debug_phase(_gc_par_phases[UpdateRS]); - if (G1HotCardCache::default_use_cache()) { - trace_phase(_gc_par_phases[ScanHCC]); - } debug_phase(_gc_par_phases[ScanRS]); debug_phase(_gc_par_phases[CodeRoots]); -#if INCLUDE_AOT - debug_phase(_gc_par_phases[AOTCodeRoots]); -#endif debug_phase(_gc_par_phases[ObjCopy]); debug_phase(_gc_par_phases[Termination]); debug_phase(_gc_par_phases[Other]); @@ -503,6 +505,9 @@ "SystemDictionaryRoots", "CLDGRoots", "JVMTIRoots", +#if INCLUDE_AOT + "AOTCodeRoots", +#endif "CMRefRoots", "WaitForStrongCLD", "WeakCLDRoots", @@ -512,9 +517,6 @@ "ScanRS", "OptScanRS", "CodeRoots", -#if INCLUDE_AOT - "AOTCodeRoots", -#endif "ObjCopy", "OptObjCopy", "Termination", diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp --- a/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1GCPhaseTimes.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -55,6 +55,9 @@ SystemDictionaryRoots, CLDGRoots, JVMTIRoots, +#if INCLUDE_AOT + AOTCodeRoots, +#endif CMRefRoots, WaitForStrongCLD, WeakCLDRoots, @@ -64,9 +67,6 @@ ScanRS, OptScanRS, CodeRoots, -#if INCLUDE_AOT - AOTCodeRoots, -#endif ObjCopy, OptObjCopy, Termination, @@ -93,6 +93,11 @@ UpdateRSSkippedCards }; + enum GCObjCopyWorkItems { + ObjCopyLABWaste, + ObjCopyLABUndoWaste + }; + enum GCOptCSetWorkItems { OptCSetScannedCards, OptCSetClaimedCards, @@ -114,6 +119,9 @@ WorkerDataArray* _scan_rs_claimed_cards; WorkerDataArray* _scan_rs_skipped_cards; + WorkerDataArray* _obj_copy_lab_waste; + WorkerDataArray* _obj_copy_lab_undo_waste; + WorkerDataArray* _opt_cset_scanned_cards; WorkerDataArray* _opt_cset_claimed_cards; WorkerDataArray* _opt_cset_skipped_cards; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1ParScanThreadState.cpp --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,8 +106,12 @@ delete[] _oops_into_optional_regions; } -void G1ParScanThreadState::waste(size_t& wasted, size_t& undo_wasted) { - _plab_allocator->waste(wasted, undo_wasted); +size_t G1ParScanThreadState::lab_waste_words() const { + return _plab_allocator->waste(); +} + +size_t G1ParScanThreadState::lab_undo_waste_words() const { + return _plab_allocator->undo_waste(); } #ifdef ASSERT diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1ParScanThreadState.hpp --- a/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1ParScanThreadState.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -127,9 +127,8 @@ G1EvacuationRootClosures* closures() { return _closures; } uint worker_id() { return _worker_id; } - // Returns the current amount of waste due to alignment or not being able to fit - // objects within LABs and the undo waste. - virtual void waste(size_t& wasted, size_t& undo_wasted); + size_t lab_waste_words() const; + size_t lab_undo_waste_words() const; size_t* surviving_young_words() { // We add one to hide entry 0 which accumulates surviving words for diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/g1RemSet.cpp --- a/src/hotspot/share/gc/g1/g1RemSet.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/g1RemSet.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -409,6 +409,10 @@ void G1ScanRSForRegionClosure::scan_strong_code_roots(HeapRegion* r) { EventGCPhaseParallel event; + // We pass a weak code blobs closure to the remembered set scanning because we want to avoid + // treating the nmethods visited to act as roots for concurrent marking. + // We only want to make sure that the oops in the nmethods are adjusted with regard to the + // objects copied by the current evacuation. r->strong_code_roots_do(_pss->closures()->weak_codeblobs()); event.commit(GCId::current(), _worker_i, G1GCPhaseTimes::phase_name(G1GCPhaseTimes::CodeRoots)); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/g1/heapRegion.cpp --- a/src/hotspot/share/gc/g1/heapRegion.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/g1/heapRegion.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -336,8 +336,8 @@ // Object is in the region. Check that its less than top if (_hr->top() <= (HeapWord*)obj) { // Object is above top - log_error(gc, verify)("Object " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ") is above top " PTR_FORMAT, - p2i(obj), p2i(_hr->bottom()), p2i(_hr->end()), p2i(_hr->top())); + log_error(gc, verify)("Object " PTR_FORMAT " in region " HR_FORMAT " is above top ", + p2i(obj), HR_FORMAT_PARAMS(_hr)); _failures = true; return; } @@ -415,8 +415,8 @@ // on its strong code root list if (is_empty()) { if (strong_code_roots_length > 0) { - log_error(gc, verify)("region [" PTR_FORMAT "," PTR_FORMAT "] is empty but has " SIZE_FORMAT " code root entries", - p2i(bottom()), p2i(end()), strong_code_roots_length); + log_error(gc, verify)("region " HR_FORMAT " is empty but has " SIZE_FORMAT " code root entries", + HR_FORMAT_PARAMS(this), strong_code_roots_length); *failures = true; } return; @@ -524,21 +524,22 @@ ResourceMark rm; if (!_g1h->is_in_closed_subset(obj)) { HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); - log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end())); + log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); LogStream ls(log.error()); print_object(&ls, _containing_obj); HeapRegion* const to = _g1h->heap_region_containing(obj); - log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str()); + log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", + p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str()); } else { HeapRegion* from = _g1h->heap_region_containing((HeapWord*)p); HeapRegion* to = _g1h->heap_region_containing((HeapWord*)obj); - log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(p), p2i(_containing_obj), p2i(from->bottom()), p2i(from->end())); + log.error("Field " PTR_FORMAT " of live obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); LogStream ls(log.error()); print_object(&ls, _containing_obj); - log.error("points to dead obj " PTR_FORMAT " in region [" PTR_FORMAT ", " PTR_FORMAT ")", - p2i(obj), p2i(to->bottom()), p2i(to->end())); + log.error("points to dead obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(obj), HR_FORMAT_PARAMS(to)); print_object(&ls, obj); } log.error("----------"); @@ -593,12 +594,13 @@ log.error("----------"); } log.error("Missing rem set entry:"); - log.error("Field " PTR_FORMAT " of obj " PTR_FORMAT ", in region " HR_FORMAT, - p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); + log.error("Field " PTR_FORMAT " of obj " PTR_FORMAT " in region " HR_FORMAT, + p2i(p), p2i(_containing_obj), HR_FORMAT_PARAMS(from)); ResourceMark rm; LogStream ls(log.error()); _containing_obj->print_on(&ls); - log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str()); + log.error("points to obj " PTR_FORMAT " in region " HR_FORMAT " remset %s", + p2i(obj), HR_FORMAT_PARAMS(to), to->rem_set()->get_state_str()); if (oopDesc::is_oop(obj)) { obj->print_on(&ls); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shared/genOopClosures.hpp --- a/src/hotspot/share/gc/shared/genOopClosures.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shared/genOopClosures.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -29,7 +29,6 @@ #include "oops/oop.hpp" class Generation; -class HeapWord; class CardTableRS; class CardTableBarrierSet; class DefNewGeneration; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shared/spaceDecorator.cpp --- a/src/hotspot/share/gc/shared/spaceDecorator.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shared/spaceDecorator.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ // pattern. bool SpaceMangler::is_mangled(HeapWord* q) { // This test loses precision but is good enough - return badHeapWord == (max_juint & (uintptr_t) q->value()); + return badHeapWord == (max_juint & reinterpret_cast(*q)); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shared/vmStructs_gc.hpp --- a/src/hotspot/share/gc/shared/vmStructs_gc.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shared/vmStructs_gc.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -156,8 +156,6 @@ nonstatic_field(GenCollectedHeap, _young_gen_spec, GenerationSpec*) \ nonstatic_field(GenCollectedHeap, _old_gen_spec, GenerationSpec*) \ \ - nonstatic_field(HeapWord, i, char*) \ - \ nonstatic_field(MemRegion, _start, HeapWord*) \ nonstatic_field(MemRegion, _word_size, size_t) \ \ diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -335,7 +335,7 @@ // Filter marked objects before hitting the SATB queues. The same predicate would // be used by SATBMQ::filter to eliminate already marked objects downstream, but // filtering here helps to avoid wasteful SATB queueing work to begin with. - if (!_heap->requires_marking(obj)) return; + if (!_heap->requires_marking(obj)) return; Thread* thr = Thread::current(); if (thr->is_Java_thread()) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -2639,6 +2639,10 @@ return memory_pools; } +MemoryUsage ShenandoahHeap::memory_usage() { + return _memory_pool->get_memory_usage(); +} + void ShenandoahHeap::enter_evacuation() { _oom_evac_handler.enter_evacuation(); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -511,6 +511,7 @@ GrowableArray memory_managers(); GrowableArray memory_pools(); + MemoryUsage memory_usage(); GCTracer* tracer(); GCTimer* gc_timer() const; CollectorPolicy* collector_policy() const; @@ -676,6 +677,7 @@ void reset_mark_bitmap(); // SATB barriers hooks + template inline bool requires_marking(const void* entry) const; void force_satb_flush_all_threads(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahHeap.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -316,8 +316,13 @@ } } +template inline bool ShenandoahHeap::requires_marking(const void* entry) const { - return !_marking_context->is_marked(oop(entry)); + oop obj = oop(entry); + if (RESOLVE) { + obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); + } + return !_marking_context->is_marked(obj); } template diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahMarkingContext.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as @@ -29,8 +29,6 @@ #include "memory/memRegion.hpp" #include "oops/oopsHierarchy.hpp" -class HeapWord; - /** * Encapsulate a marking bitmap with the top-at-mark-start and top-bitmaps array. */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahMemoryPool.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -26,7 +26,7 @@ ShenandoahMemoryPool::ShenandoahMemoryPool(ShenandoahHeap* heap) : CollectedMemoryPool("Shenandoah", - heap->capacity(), + heap->initial_capacity(), heap->max_capacity(), true /* support_usage_threshold */), _heap(heap) {} @@ -37,9 +37,15 @@ size_t used = used_in_bytes(); size_t committed = _heap->committed(); + // These asserts can never fail: max is stable, and all updates to other values never overflow max. assert(initial <= max, "initial: " SIZE_FORMAT ", max: " SIZE_FORMAT, initial, max); assert(used <= max, "used: " SIZE_FORMAT ", max: " SIZE_FORMAT, used, max); assert(committed <= max, "committed: " SIZE_FORMAT ", max: " SIZE_FORMAT, committed, max); + + // Committed and used are updated concurrently and independently. They can momentarily break + // the assert below, which would also fail in downstream code. To avoid that, adjust values + // to make sense under the race. See JDK-8207200. + committed = MAX2(used, committed); assert(used <= committed, "used: " SIZE_FORMAT ", committed: " SIZE_FORMAT, used, committed); return MemoryUsage(initial, used, committed, max); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp --- a/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahRuntime.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Red Hat, Inc. All rights reserved. + * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as @@ -27,7 +27,6 @@ #include "memory/allocation.hpp" #include "oops/oopsHierarchy.hpp" -class HeapWord; class JavaThread; class oopDesc; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp --- a/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/shenandoah/shenandoahSATBMarkQueueSet.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -49,12 +49,9 @@ return ShenandoahThreadLocalData::satb_mark_queue(t); } -static inline bool discard_entry(const void* entry, ShenandoahHeap* heap) { - return !heap->requires_marking(entry); -} - +template class ShenandoahSATBMarkQueueFilterFn { - ShenandoahHeap* _heap; + ShenandoahHeap* const _heap; public: ShenandoahSATBMarkQueueFilterFn(ShenandoahHeap* heap) : _heap(heap) {} @@ -62,13 +59,17 @@ // Return true if entry should be filtered out (removed), false if // it should be retained. bool operator()(const void* entry) const { - return discard_entry(entry, _heap); + return !_heap->requires_marking(entry); } }; void ShenandoahSATBMarkQueueSet::filter(SATBMarkQueue* queue) { assert(_heap != NULL, "SATB queue set not initialized"); - apply_filter(ShenandoahSATBMarkQueueFilterFn(_heap), queue); + if (_heap->has_forwarded_objects()) { + apply_filter(ShenandoahSATBMarkQueueFilterFn(_heap), queue); + } else { + apply_filter(ShenandoahSATBMarkQueueFilterFn(_heap), queue); + } } bool ShenandoahSATBMarkQueue::should_enqueue_buffer() { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/vmStructs_z.cpp --- a/src/hotspot/share/gc/z/vmStructs_z.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/vmStructs_z.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * 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,6 +26,7 @@ ZGlobalsForVMStructs::ZGlobalsForVMStructs() : _ZGlobalPhase(&ZGlobalPhase), + _ZGlobalSeqNum(&ZGlobalSeqNum), _ZAddressGoodMask(&ZAddressGoodMask), _ZAddressBadMask(&ZAddressBadMask), _ZAddressWeakBadMask(&ZAddressWeakBadMask), diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/vmStructs_z.hpp --- a/src/hotspot/share/gc/z/vmStructs_z.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/vmStructs_z.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -42,6 +42,8 @@ uint32_t* _ZGlobalPhase; + uint32_t* _ZGlobalSeqNum; + uintptr_t* _ZAddressGoodMask; uintptr_t* _ZAddressBadMask; uintptr_t* _ZAddressWeakBadMask; @@ -55,6 +57,7 @@ #define VM_STRUCTS_ZGC(nonstatic_field, volatile_nonstatic_field, static_field) \ static_field(ZGlobalsForVMStructs, _instance_p, ZGlobalsForVMStructs*) \ nonstatic_field(ZGlobalsForVMStructs, _ZGlobalPhase, uint32_t*) \ + nonstatic_field(ZGlobalsForVMStructs, _ZGlobalSeqNum, uint32_t*) \ nonstatic_field(ZGlobalsForVMStructs, _ZAddressGoodMask, uintptr_t*) \ nonstatic_field(ZGlobalsForVMStructs, _ZAddressBadMask, uintptr_t*) \ nonstatic_field(ZGlobalsForVMStructs, _ZAddressWeakBadMask, uintptr_t*) \ @@ -67,7 +70,10 @@ nonstatic_field(ZHeap, _pagetable, ZPageTable) \ \ nonstatic_field(ZPage, _type, const uint8_t) \ + nonstatic_field(ZPage, _seqnum, uint32_t) \ nonstatic_field(ZPage, _virtual, const ZVirtualMemory) \ + volatile_nonstatic_field(ZPage, _top, uintptr_t) \ + volatile_nonstatic_field(ZPage, _refcount, uint32_t) \ nonstatic_field(ZPage, _forwarding, ZForwardingTable) \ \ nonstatic_field(ZPageAllocator, _physical, ZPhysicalMemoryManager) \ @@ -101,6 +107,7 @@ declare_constant(ZAddressOffsetShift) \ declare_constant(ZAddressOffsetBits) \ declare_constant(ZAddressOffsetMask) \ + declare_constant(ZAddressOffsetMax) \ declare_constant(ZAddressSpaceStart) #define VM_TYPES_ZGC(declare_type, declare_toplevel_type, declare_integer_type) \ diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zBarrierSetNMethod.cpp --- a/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zBarrierSetNMethod.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -27,12 +27,12 @@ #include "gc/z/zGlobals.hpp" #include "gc/z/zLock.inline.hpp" #include "gc/z/zOopClosures.hpp" -#include "gc/z/zNMethodTable.hpp" +#include "gc/z/zNMethod.hpp" #include "gc/z/zThreadLocalData.hpp" #include "logging/log.hpp" bool ZBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) { - ZLocker locker(ZNMethodTable::lock_for_nmethod(nm)); + ZLocker locker(ZNMethod::lock_for_nmethod(nm)); log_trace(nmethod, barrier)("Entered critical zone for %p", nm); if (!is_armed(nm)) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zCollectedHeap.cpp --- a/src/hotspot/share/gc/z/zCollectedHeap.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zCollectedHeap.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,7 @@ #include "gc/z/zCollectedHeap.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zHeap.inline.hpp" -#include "gc/z/zNMethodTable.hpp" +#include "gc/z/zNMethod.hpp" #include "gc/z/zServiceability.hpp" #include "gc/z/zStat.hpp" #include "gc/z/zUtils.inline.hpp" @@ -118,10 +118,6 @@ return is_in(p); } -void ZCollectedHeap::fill_with_dummy_object(HeapWord* start, HeapWord* end, bool zap) { - // Does nothing, not a parsable heap -} - HeapWord* ZCollectedHeap::allocate_new_tlab(size_t min_size, size_t requested_size, size_t* actual_size) { const size_t size_in_bytes = ZUtils::words_to_bytes(align_object_size(requested_size)); const uintptr_t addr = _heap.alloc_tlab(size_in_bytes); @@ -259,11 +255,11 @@ } void ZCollectedHeap::register_nmethod(nmethod* nm) { - ZNMethodTable::register_nmethod(nm); + ZNMethod::register_nmethod(nm); } void ZCollectedHeap::unregister_nmethod(nmethod* nm) { - ZNMethodTable::unregister_nmethod(nm); + ZNMethod::unregister_nmethod(nm); } void ZCollectedHeap::verify_nmethod(nmethod* nm) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zCollectedHeap.hpp --- a/src/hotspot/share/gc/z/zCollectedHeap.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zCollectedHeap.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,8 +75,6 @@ virtual bool is_in(const void* p) const; virtual bool is_in_closed_subset(const void* p) const; - virtual void fill_with_dummy_object(HeapWord* start, HeapWord* end, bool zap); - virtual HeapWord* mem_allocate(size_t size, bool* gc_overhead_limit_was_exceeded); virtual MetaWord* satisfy_failed_metadata_allocation(ClassLoaderData* loader_data, size_t size, diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zInitialize.cpp --- a/src/hotspot/share/gc/z/zInitialize.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zInitialize.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,7 +30,7 @@ #include "gc/z/zLargePages.hpp" #include "gc/z/zNUMA.hpp" #include "gc/z/zStat.hpp" -#include "gc/z/zStatTLAB.hpp" +#include "gc/z/zThreadLocalAllocBuffer.hpp" #include "gc/z/zTracer.hpp" #include "logging/log.hpp" #include "runtime/vm_version.hpp" @@ -46,7 +46,7 @@ ZNUMA::initialize(); ZCPU::initialize(); ZStatValue::initialize(); - ZStatTLAB::initialize(); + ZThreadLocalAllocBuffer::initialize(); ZTracer::initialize(); ZLargePages::initialize(); ZBarrierSet::set_barrier_set(barrier_set); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zMark.cpp --- a/src/hotspot/share/gc/z/zMark.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zMark.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * 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,9 +32,9 @@ #include "gc/z/zPageTable.inline.hpp" #include "gc/z/zRootsIterator.hpp" #include "gc/z/zStat.hpp" -#include "gc/z/zStatTLAB.hpp" #include "gc/z/zTask.hpp" #include "gc/z/zThread.hpp" +#include "gc/z/zThreadLocalAllocBuffer.hpp" #include "gc/z/zUtils.inline.hpp" #include "gc/z/zWorkers.inline.hpp" #include "logging/log.hpp" @@ -121,24 +121,19 @@ class ZMarkRootsIteratorClosure : public ZRootsIteratorClosure { public: ZMarkRootsIteratorClosure() { - ZStatTLAB::reset(); + ZThreadLocalAllocBuffer::reset_statistics(); } ~ZMarkRootsIteratorClosure() { - ZStatTLAB::publish(); + ZThreadLocalAllocBuffer::publish_statistics(); } virtual void do_thread(Thread* thread) { - ZRootsIteratorClosure::do_thread(thread); - // Update thread local address bad mask ZThreadLocalData::set_address_bad_mask(thread, ZAddressBadMask); // Retire TLAB - if (UseTLAB && thread->is_Java_thread()) { - thread->tlab().retire(ZStatTLAB::get()); - thread->tlab().resize(); - } + ZThreadLocalAllocBuffer::retire(thread); } virtual void do_oop(oop* p) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethod.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethod.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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 "code/relocInfo.hpp" +#include "code/nmethod.hpp" +#include "code/icBuffer.hpp" +#include "gc/shared/barrierSet.hpp" +#include "gc/shared/barrierSetNMethod.hpp" +#include "gc/z/zGlobals.hpp" +#include "gc/z/zLock.inline.hpp" +#include "gc/z/zNMethod.hpp" +#include "gc/z/zNMethodData.hpp" +#include "gc/z/zNMethodTable.hpp" +#include "gc/z/zOopClosures.inline.hpp" +#include "gc/z/zTask.hpp" +#include "gc/z/zWorkers.hpp" +#include "logging/log.hpp" +#include "memory/allocation.inline.hpp" +#include "memory/iterator.hpp" +#include "memory/resourceArea.hpp" +#include "runtime/atomic.hpp" +#include "runtime/orderAccess.hpp" +#include "utilities/debug.hpp" + +static ZNMethodData* gc_data(const nmethod* nm) { + return nm->gc_data(); +} + +static void set_gc_data(nmethod* nm, ZNMethodData* data) { + return nm->set_gc_data(data); +} + +void ZNMethod::attach_gc_data(nmethod* nm) { + GrowableArray immediate_oops; + bool non_immediate_oops = false; + + // Find all oops relocations + RelocIterator iter(nm); + while (iter.next()) { + if (iter.type() != relocInfo::oop_type) { + // Not an oop + continue; + } + + oop_Relocation* r = iter.oop_reloc(); + + if (!r->oop_is_immediate()) { + // Non-immediate oop found + non_immediate_oops = true; + continue; + } + + if (r->oop_value() != NULL) { + // Non-NULL immediate oop found. NULL oops can safely be + // ignored since the method will be re-registered if they + // are later patched to be non-NULL. + immediate_oops.push(r->oop_addr()); + } + } + + // Attach GC data to nmethod + ZNMethodData* data = gc_data(nm); + if (data == NULL) { + data = ZNMethodData::create(nm); + set_gc_data(nm, data); + } + + // Attach oops in GC data + ZNMethodDataOops* const new_oops = ZNMethodDataOops::create(immediate_oops, non_immediate_oops); + ZNMethodDataOops* const old_oops = data->swap_oops(new_oops); + ZNMethodDataOops::destroy(old_oops); +} + +void ZNMethod::detach_gc_data(nmethod* nm) { + // Destroy GC data + ZNMethodData::destroy(gc_data(nm)); + set_gc_data(nm, NULL); +} + +ZReentrantLock* ZNMethod::lock_for_nmethod(nmethod* nm) { + ZNMethodData* const data = gc_data(nm); + if (data == NULL) { + return NULL; + } + return data->lock(); +} + +void ZNMethod::log_register(const nmethod* nm) { + LogTarget(Trace, gc, nmethod) log; + if (!log.is_enabled()) { + return; + } + + const ZNMethodDataOops* const oops = gc_data(nm)->oops(); + + log.print("Register NMethod: %s.%s (" PTR_FORMAT "), " + "Compiler: %s, Oops: %d, ImmediateOops: " SIZE_FORMAT ", NonImmediateOops: %s", + nm->method()->method_holder()->external_name(), + nm->method()->name()->as_C_string(), + p2i(nm), + nm->compiler_name(), + nm->oops_count() - 1, + oops->immediates_count(), + oops->has_non_immediates() ? "Yes" : "No"); + + LogTarget(Trace, gc, nmethod, oops) log_oops; + if (!log_oops.is_enabled()) { + return; + } + + // Print nmethod oops table + { + oop* const begin = nm->oops_begin(); + oop* const end = nm->oops_end(); + for (oop* p = begin; p < end; p++) { + log_oops.print(" Oop[" SIZE_FORMAT "] " PTR_FORMAT " (%s)", + (p - begin), p2i(*p), (*p)->klass()->external_name()); + } + } + + // Print nmethod immediate oops + { + oop** const begin = oops->immediates_begin(); + oop** const end = oops->immediates_end(); + for (oop** p = begin; p < end; p++) { + log_oops.print(" ImmediateOop[" SIZE_FORMAT "] " PTR_FORMAT " @ " PTR_FORMAT " (%s)", + (p - begin), p2i(**p), p2i(*p), (**p)->klass()->external_name()); + } + } +} + +void ZNMethod::log_unregister(const nmethod* nm) { + LogTarget(Debug, gc, nmethod) log; + if (!log.is_enabled()) { + return; + } + + log.print("Unregister NMethod: %s.%s (" PTR_FORMAT ")", + nm->method()->method_holder()->external_name(), + nm->method()->name()->as_C_string(), + p2i(nm)); +} + +void ZNMethod::register_nmethod(nmethod* nm) { + ResourceMark rm; + + // Create and attach gc data + attach_gc_data(nm); + + log_register(nm); + + ZNMethodTable::register_nmethod(nm); + + // Disarm nmethod entry barrier + disarm_nmethod(nm); +} + +void ZNMethod::unregister_nmethod(nmethod* nm) { + assert(CodeCache_lock->owned_by_self(), "Lock must be held"); + + if (Thread::current()->is_Code_cache_sweeper_thread()) { + // The sweeper must wait for any ongoing iteration to complete + // before it can unregister an nmethod. + ZNMethodTable::wait_until_iteration_done(); + } + + ResourceMark rm; + + log_unregister(nm); + + ZNMethodTable::unregister_nmethod(nm); + + // Destroy and detach gc data + detach_gc_data(nm); +} + +void ZNMethod::disarm_nmethod(nmethod* nm) { + BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod(); + if (bs != NULL) { + bs->disarm(nm); + } +} + +void ZNMethod::nmethod_oops_do(nmethod* nm, OopClosure* cl) { + // Process oops table + { + oop* const begin = nm->oops_begin(); + oop* const end = nm->oops_end(); + for (oop* p = begin; p < end; p++) { + if (*p != Universe::non_oop_word()) { + cl->do_oop(p); + } + } + } + + ZNMethodDataOops* const oops = gc_data(nm)->oops(); + + // Process immediate oops + { + oop** const begin = oops->immediates_begin(); + oop** const end = oops->immediates_end(); + for (oop** p = begin; p < end; p++) { + if (**p != Universe::non_oop_word()) { + cl->do_oop(*p); + } + } + } + + // Process non-immediate oops + if (oops->has_non_immediates()) { + nm->fix_oop_relocations(); + } +} + +class ZNMethodToOopsDoClosure : public NMethodClosure { +private: + OopClosure* _cl; + +public: + ZNMethodToOopsDoClosure(OopClosure* cl) : + _cl(cl) {} + + virtual void do_nmethod(nmethod* nm) { + ZNMethod::nmethod_oops_do(nm, _cl); + } +}; + +void ZNMethod::oops_do_begin() { + ZNMethodTable::nmethods_do_begin(); +} + +void ZNMethod::oops_do_end() { + ZNMethodTable::nmethods_do_end(); +} + +void ZNMethod::oops_do(OopClosure* cl) { + ZNMethodToOopsDoClosure nmethod_cl(cl); + ZNMethodTable::nmethods_do(&nmethod_cl); +} + +class ZNMethodUnlinkClosure : public NMethodClosure { +private: + bool _unloading_occurred; + volatile bool _failed; + + void set_failed() { + Atomic::store(true, &_failed); + } + +public: + ZNMethodUnlinkClosure(bool unloading_occurred) : + _unloading_occurred(unloading_occurred), + _failed(false) {} + + virtual void do_nmethod(nmethod* nm) { + if (failed()) { + return; + } + + if (!nm->is_alive()) { + return; + } + + ZLocker locker(ZNMethod::lock_for_nmethod(nm)); + + if (nm->is_unloading()) { + // Unlinking of the dependencies must happen before the + // handshake separating unlink and purge. + nm->flush_dependencies(false /* delete_immediately */); + + // We don't need to take the lock when unlinking nmethods from + // the Method, because it is only concurrently unlinked by + // the entry barrier, which acquires the per nmethod lock. + nm->unlink_from_method(false /* acquire_lock */); + return; + } + + // Heal oops and disarm + ZNMethodOopClosure cl; + ZNMethod::nmethod_oops_do(nm, &cl); + ZNMethod::disarm_nmethod(nm); + + // Clear compiled ICs and exception caches + if (!nm->unload_nmethod_caches(_unloading_occurred)) { + set_failed(); + } + } + + bool failed() const { + return Atomic::load(&_failed); + } +}; + +class ZNMethodUnlinkTask : public ZTask { +private: + ZNMethodUnlinkClosure _cl; + ICRefillVerifier* _verifier; + +public: + ZNMethodUnlinkTask(bool unloading_occurred, ICRefillVerifier* verifier) : + ZTask("ZNMethodUnlinkTask"), + _cl(unloading_occurred), + _verifier(verifier) { + ZNMethodTable::nmethods_do_begin(); + } + + ~ZNMethodUnlinkTask() { + ZNMethodTable::nmethods_do_end(); + } + + virtual void work() { + ICRefillVerifierMark mark(_verifier); + ZNMethodTable::nmethods_do(&_cl); + } + + bool success() const { + return !_cl.failed(); + } +}; + +void ZNMethod::unlink(ZWorkers* workers, bool unloading_occurred) { + for (;;) { + ICRefillVerifier verifier; + + { + ZNMethodUnlinkTask task(unloading_occurred, &verifier); + workers->run_concurrent(&task); + if (task.success()) { + return; + } + } + + // Cleaning failed because we ran out of transitional IC stubs, + // so we have to refill and try again. Refilling requires taking + // a safepoint, so we temporarily leave the suspendible thread set. + SuspendibleThreadSetLeaver sts; + InlineCacheBuffer::refill_ic_stubs(); + } +} + +class ZNMethodPurgeClosure : public NMethodClosure { +public: + virtual void do_nmethod(nmethod* nm) { + if (nm->is_alive() && nm->is_unloading()) { + nm->make_unloaded(); + } + } +}; + +class ZNMethodPurgeTask : public ZTask { +private: + ZNMethodPurgeClosure _cl; + +public: + ZNMethodPurgeTask() : + ZTask("ZNMethodPurgeTask"), + _cl() { + ZNMethodTable::nmethods_do_begin(); + } + + ~ZNMethodPurgeTask() { + ZNMethodTable::nmethods_do_end(); + } + + virtual void work() { + ZNMethodTable::nmethods_do(&_cl); + } +}; + +void ZNMethod::purge(ZWorkers* workers) { + ZNMethodPurgeTask task; + workers->run_concurrent(&task); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethod.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethod.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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_GC_Z_ZNMETHOD_HPP +#define SHARE_GC_Z_ZNMETHOD_HPP + +#include "memory/allocation.hpp" + +class nmethod; +class OopClosure; +class ZReentrantLock; +class ZWorkers; + +class ZNMethod : public AllStatic { +private: + static void attach_gc_data(nmethod* nm); + static void detach_gc_data(nmethod* nm); + + static void log_register(const nmethod* nm); + static void log_unregister(const nmethod* nm); + +public: + static void register_nmethod(nmethod* nm); + static void unregister_nmethod(nmethod* nm); + + static void disarm_nmethod(nmethod* nm); + + static void nmethod_oops_do(nmethod* nm, OopClosure* cl); + + static void oops_do_begin(); + static void oops_do_end(); + static void oops_do(OopClosure* cl); + + static ZReentrantLock* lock_for_nmethod(nmethod* nm); + + static void unlink(ZWorkers* workers, bool unloading_occurred); + static void purge(ZWorkers* workers); +}; + +#endif // SHARE_GC_Z_ZNMETHOD_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodAllocator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodAllocator.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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/z/zArray.inline.hpp" +#include "gc/z/zNMethodAllocator.hpp" +#include "memory/allocation.hpp" + +ZArray ZNMethodAllocator::_deferred_frees; +bool ZNMethodAllocator::_defer_frees(false); + +void ZNMethodAllocator::immediate_free(void* data) { + FREE_C_HEAP_ARRAY(uint8_t, data); +} + +void ZNMethodAllocator::deferred_free(void* data) { + _deferred_frees.add(data); +} + +void* ZNMethodAllocator::allocate(size_t size) { + return NEW_C_HEAP_ARRAY(uint8_t, size, mtGC); +} + +void ZNMethodAllocator::free(void* data) { + if (data == NULL) { + return; + } + + if (_defer_frees) { + deferred_free(data); + } else { + immediate_free(data); + } +} + +void ZNMethodAllocator::activate_deferred_frees() { + assert(_deferred_frees.is_empty(), "precondition"); + _defer_frees = true; +} + +void ZNMethodAllocator::deactivate_and_process_deferred_frees() { + _defer_frees = false; + + ZArrayIterator iter(&_deferred_frees); + for (void* data; iter.next(&data);) { + immediate_free(data); + } + _deferred_frees.clear(); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodAllocator.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodAllocator.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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_GC_Z_ZNMETHODALLOCATOR_HPP +#define SHARE_GC_Z_ZNMETHODALLOCATOR_HPP + +#include "memory/allocation.hpp" +#include "gc/z/zArray.hpp" + +class ZNMethodAllocator : public AllStatic { +private: + static ZArray _deferred_frees; + static bool _defer_frees; + + static void immediate_free(void* data); + static void deferred_free(void* data); + +public: + static void* allocate(size_t size); + static void free(void* data); + + static void activate_deferred_frees(); + static void deactivate_and_process_deferred_frees(); +}; + +#endif // SHARE_GC_Z_ZNMETHODALLOCATOR_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodData.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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/z/zLock.inline.hpp" +#include "gc/z/zNMethodAllocator.hpp" +#include "gc/z/zNMethodData.hpp" +#include "memory/allocation.hpp" +#include "runtime/atomic.hpp" +#include "runtime/orderAccess.hpp" +#include "utilities/align.hpp" +#include "utilities/debug.hpp" +#include "utilities/growableArray.hpp" + +size_t ZNMethodDataOops::header_size() { + const size_t size = sizeof(ZNMethodDataOops); + assert(is_aligned(size, sizeof(oop*)), "Header misaligned"); + return size; +} + +ZNMethodDataOops* ZNMethodDataOops::create(const GrowableArray& immediates, bool has_non_immediates) { + // Allocate memory for the ZNMethodDataOops object + // plus the immediate oop* array that follows right after. + const size_t size = ZNMethodDataOops::header_size() + (sizeof(oop*) * immediates.length()); + void* const mem = ZNMethodAllocator::allocate(size); + return ::new (mem) ZNMethodDataOops(immediates, has_non_immediates); +} + +void ZNMethodDataOops::destroy(ZNMethodDataOops* oops) { + ZNMethodAllocator::free(oops); +} + +ZNMethodDataOops::ZNMethodDataOops(const GrowableArray& immediates, bool has_non_immediates) : + _nimmediates(immediates.length()), + _has_non_immediates(has_non_immediates) { + // Save all immediate oops + for (size_t i = 0; i < _nimmediates; i++) { + immediates_begin()[i] = immediates.at(i); + } +} + +size_t ZNMethodDataOops::immediates_count() const { + return _nimmediates; +} + +oop** ZNMethodDataOops::immediates_begin() const { + // The immediate oop* array starts immediately after this object + return (oop**)((uintptr_t)this + header_size()); +} + +oop** ZNMethodDataOops::immediates_end() const { + return immediates_begin() + immediates_count(); +} + +bool ZNMethodDataOops::has_non_immediates() const { + return _has_non_immediates; +} + +ZNMethodData* ZNMethodData::create(nmethod* nm) { + void* const mem = ZNMethodAllocator::allocate(sizeof(ZNMethodData)); + return ::new (mem) ZNMethodData(nm); +} + +void ZNMethodData::destroy(ZNMethodData* data) { + ZNMethodAllocator::free(data->oops()); + ZNMethodAllocator::free(data); +} + +ZNMethodData::ZNMethodData(nmethod* nm) : + _lock(), + _oops(NULL) {} + +ZReentrantLock* ZNMethodData::lock() { + return &_lock; +} + +ZNMethodDataOops* ZNMethodData::oops() const { + return OrderAccess::load_acquire(&_oops); +} + +ZNMethodDataOops* ZNMethodData::swap_oops(ZNMethodDataOops* new_oops) { + return Atomic::xchg(new_oops, &_oops); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodData.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodData.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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 "gc/z/zLock.hpp" +#include "oops/oopsHierarchy.hpp" +#include "utilities/globalDefinitions.hpp" + +#ifndef SHARE_GC_Z_ZNMETHODDATA_HPP +#define SHARE_GC_Z_ZNMETHODDATA_HPP + +class nmethod; +template class GrowableArray; + +class ZNMethodDataOops { +private: + const size_t _nimmediates; + bool _has_non_immediates; + + static size_t header_size(); + + ZNMethodDataOops(const GrowableArray& immediates, bool has_non_immediates); + +public: + static ZNMethodDataOops* create(const GrowableArray& immediates, bool has_non_immediates); + static void destroy(ZNMethodDataOops* oops); + + size_t immediates_count() const; + oop** immediates_begin() const; + oop** immediates_end() const; + + bool has_non_immediates() const; +}; + +class ZNMethodData { +private: + ZReentrantLock _lock; + ZNMethodDataOops* volatile _oops; + + ZNMethodData(nmethod* nm); + +public: + static ZNMethodData* create(nmethod* nm); + static void destroy(ZNMethodData* data); + + ZReentrantLock* lock(); + + ZNMethodDataOops* oops() const; + ZNMethodDataOops* swap_oops(ZNMethodDataOops* oops); +}; + +#endif // SHARE_GC_Z_ZNMETHODDATA_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodTable.cpp --- a/src/hotspot/share/gc/z/zNMethodTable.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zNMethodTable.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * 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,205 +27,38 @@ #include "code/icBuffer.hpp" #include "gc/shared/barrierSet.hpp" #include "gc/shared/barrierSetNMethod.hpp" -#include "gc/z/zArray.inline.hpp" #include "gc/z/zGlobals.hpp" #include "gc/z/zHash.inline.hpp" #include "gc/z/zLock.inline.hpp" +#include "gc/z/zNMethodAllocator.hpp" +#include "gc/z/zNMethodData.hpp" #include "gc/z/zNMethodTable.hpp" +#include "gc/z/zNMethodTableEntry.hpp" +#include "gc/z/zNMethodTableIteration.hpp" #include "gc/z/zOopClosures.inline.hpp" #include "gc/z/zTask.hpp" #include "gc/z/zWorkers.hpp" #include "logging/log.hpp" -#include "memory/allocation.inline.hpp" +#include "memory/allocation.hpp" +#include "memory/iterator.hpp" #include "memory/resourceArea.hpp" #include "runtime/atomic.hpp" #include "runtime/orderAccess.hpp" -#include "runtime/os.hpp" #include "utilities/debug.hpp" -class ZNMethodDataImmediateOops { -private: - const size_t _nimmediate_oops; - - static size_t header_size(); - - ZNMethodDataImmediateOops(const GrowableArray& immediate_oops); - -public: - static ZNMethodDataImmediateOops* create(const GrowableArray& immediate_oops); - static void destroy(ZNMethodDataImmediateOops* data_immediate_oops); - - size_t immediate_oops_count() const; - oop** immediate_oops_begin() const; - oop** immediate_oops_end() const; -}; - -size_t ZNMethodDataImmediateOops::header_size() { - const size_t size = sizeof(ZNMethodDataImmediateOops); - assert(is_aligned(size, sizeof(oop*)), "Header misaligned"); - return size; -} - -ZNMethodDataImmediateOops* ZNMethodDataImmediateOops::create(const GrowableArray& immediate_oops) { - // Allocate memory for the ZNMethodDataImmediateOops object - // plus the immediate oop* array that follows right after. - const size_t size = ZNMethodDataImmediateOops::header_size() + (sizeof(oop*) * immediate_oops.length()); - void* const data_immediate_oops = NEW_C_HEAP_ARRAY(uint8_t, size, mtGC); - return ::new (data_immediate_oops) ZNMethodDataImmediateOops(immediate_oops); -} - -void ZNMethodDataImmediateOops::destroy(ZNMethodDataImmediateOops* data_immediate_oops) { - ZNMethodTable::safe_delete(data_immediate_oops); -} - -ZNMethodDataImmediateOops::ZNMethodDataImmediateOops(const GrowableArray& immediate_oops) : - _nimmediate_oops(immediate_oops.length()) { - // Save all immediate oops - for (size_t i = 0; i < _nimmediate_oops; i++) { - immediate_oops_begin()[i] = immediate_oops.at(i); - } -} - -size_t ZNMethodDataImmediateOops::immediate_oops_count() const { - return _nimmediate_oops; -} - -oop** ZNMethodDataImmediateOops::immediate_oops_begin() const { - // The immediate oop* array starts immediately after this object - return (oop**)((uintptr_t)this + header_size()); -} - -oop** ZNMethodDataImmediateOops::immediate_oops_end() const { - return immediate_oops_begin() + immediate_oops_count(); -} - -class ZNMethodData { -private: - ZReentrantLock _lock; - ZNMethodDataImmediateOops* volatile _immediate_oops; - - ZNMethodData(nmethod* nm); - -public: - static ZNMethodData* create(nmethod* nm); - static void destroy(ZNMethodData* data); - - ZReentrantLock* lock(); - - ZNMethodDataImmediateOops* immediate_oops() const; - ZNMethodDataImmediateOops* swap_immediate_oops(const GrowableArray& immediate_oops); -}; - -ZNMethodData* ZNMethodData::create(nmethod* nm) { - void* const method = NEW_C_HEAP_ARRAY(uint8_t, sizeof(ZNMethodData), mtGC); - return ::new (method) ZNMethodData(nm); -} - -void ZNMethodData::destroy(ZNMethodData* data) { - ZNMethodDataImmediateOops::destroy(data->immediate_oops()); - ZNMethodTable::safe_delete(data); -} - -ZNMethodData::ZNMethodData(nmethod* nm) : - _lock(), - _immediate_oops(NULL) {} - -ZReentrantLock* ZNMethodData::lock() { - return &_lock; -} - -ZNMethodDataImmediateOops* ZNMethodData::immediate_oops() const { - return OrderAccess::load_acquire(&_immediate_oops); -} - -ZNMethodDataImmediateOops* ZNMethodData::swap_immediate_oops(const GrowableArray& immediate_oops) { - ZNMethodDataImmediateOops* const data_immediate_oops = - immediate_oops.is_empty() ? NULL : ZNMethodDataImmediateOops::create(immediate_oops); - return Atomic::xchg(data_immediate_oops, &_immediate_oops); -} - -static ZNMethodData* gc_data(const nmethod* nm) { - return nm->gc_data(); -} - -static void set_gc_data(nmethod* nm, ZNMethodData* data) { - return nm->set_gc_data(data); -} - ZNMethodTableEntry* ZNMethodTable::_table = NULL; size_t ZNMethodTable::_size = 0; -ZLock ZNMethodTable::_iter_lock; -ZNMethodTableEntry* ZNMethodTable::_iter_table = NULL; -size_t ZNMethodTable::_iter_table_size = 0; -ZArray ZNMethodTable::_iter_deferred_deletes; size_t ZNMethodTable::_nregistered = 0; size_t ZNMethodTable::_nunregistered = 0; -volatile size_t ZNMethodTable::_claimed = 0; - -void ZNMethodTable::safe_delete(void* data) { - if (data == NULL) { - return; - } +ZNMethodTableIteration ZNMethodTable::_iteration; - ZLocker locker(&_iter_lock); - if (_iter_table != NULL) { - // Iteration in progress, defer delete - _iter_deferred_deletes.add(data); - } else { - // Iteration not in progress, delete now - FREE_C_HEAP_ARRAY(uint8_t, data); - } +ZNMethodTableEntry* ZNMethodTable::create(size_t size) { + void* const mem = ZNMethodAllocator::allocate(size * sizeof(ZNMethodTableEntry)); + return ::new (mem) ZNMethodTableEntry[size]; } -ZNMethodTableEntry ZNMethodTable::create_entry(nmethod* nm) { - GrowableArray immediate_oops; - bool non_immediate_oops = false; - - // Find all oops relocations - RelocIterator iter(nm); - while (iter.next()) { - if (iter.type() != relocInfo::oop_type) { - // Not an oop - continue; - } - - oop_Relocation* r = iter.oop_reloc(); - - if (!r->oop_is_immediate()) { - // Non-immediate oop found - non_immediate_oops = true; - continue; - } - - if (r->oop_value() != NULL) { - // Non-NULL immediate oop found. NULL oops can safely be - // ignored since the method will be re-registered if they - // are later patched to be non-NULL. - immediate_oops.push(r->oop_addr()); - } - } - - // Attach GC data to nmethod - ZNMethodData* data = gc_data(nm); - if (data == NULL) { - data = ZNMethodData::create(nm); - set_gc_data(nm, data); - } - - // Attach immediate oops in GC data - ZNMethodDataImmediateOops* const old_data_immediate_oops = data->swap_immediate_oops(immediate_oops); - ZNMethodDataImmediateOops::destroy(old_data_immediate_oops); - - // Create entry - return ZNMethodTableEntry(nm, non_immediate_oops, !immediate_oops.is_empty()); -} - -ZReentrantLock* ZNMethodTable::lock_for_nmethod(nmethod* nm) { - ZNMethodData* const data = gc_data(nm); - if (data == NULL) { - return NULL; - } - return data->lock(); +void ZNMethodTable::destroy(ZNMethodTableEntry* table) { + ZNMethodAllocator::free(table); } size_t ZNMethodTable::first_index(const nmethod* nm, size_t size) { @@ -241,8 +74,8 @@ return (prev_index + 1) & mask; } -bool ZNMethodTable::register_entry(ZNMethodTableEntry* table, size_t size, ZNMethodTableEntry entry) { - const nmethod* const nm = entry.method(); +bool ZNMethodTable::register_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm) { + const ZNMethodTableEntry entry(nm); size_t index = first_index(nm, size); for (;;) { @@ -265,11 +98,6 @@ } void ZNMethodTable::unregister_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm) { - if (size == 0) { - // Table is empty - return; - } - size_t index = first_index(nm, size); for (;;) { @@ -279,10 +107,6 @@ if (table_entry.registered() && table_entry.method() == nm) { // Remove entry table[index] = ZNMethodTableEntry(true /* unregistered */); - - // Destroy GC data - ZNMethodData::destroy(gc_data(nm)); - set_gc_data(nm, NULL); return; } @@ -291,7 +115,8 @@ } void ZNMethodTable::rebuild(size_t new_size) { - ZLocker locker(&_iter_lock); + assert(CodeCache_lock->owned_by_self(), "Lock must be held"); + assert(is_power_of_2(new_size), "Invalid size"); log_debug(gc, nmethod)("Rebuilding NMethod Table: " @@ -303,20 +128,18 @@ _nunregistered, percent_of(_nunregistered, _size), 0.0); // Allocate new table - ZNMethodTableEntry* const new_table = new ZNMethodTableEntry[new_size]; + ZNMethodTableEntry* const new_table = ZNMethodTable::create(new_size); // Transfer all registered entries for (size_t i = 0; i < _size; i++) { const ZNMethodTableEntry entry = _table[i]; if (entry.registered()) { - register_entry(new_table, new_size, entry); + register_entry(new_table, new_size, entry.method()); } } - if (_iter_table != _table) { - // Delete old table - delete [] _table; - } + // Free old table + ZNMethodTable::destroy(_table); // Install new table _table = new_table; @@ -353,61 +176,6 @@ } } -void ZNMethodTable::log_register(const nmethod* nm, ZNMethodTableEntry entry) { - LogTarget(Trace, gc, nmethod) log; - if (!log.is_enabled()) { - return; - } - - log.print("Register NMethod: %s.%s (" PTR_FORMAT "), " - "Compiler: %s, Oops: %d, ImmediateOops: " SIZE_FORMAT ", NonImmediateOops: %s", - nm->method()->method_holder()->external_name(), - nm->method()->name()->as_C_string(), - p2i(nm), - nm->compiler_name(), - nm->oops_count() - 1, - entry.immediate_oops() ? gc_data(nm)->immediate_oops()->immediate_oops_count() : 0, - entry.non_immediate_oops() ? "Yes" : "No"); - - LogTarget(Trace, gc, nmethod, oops) log_oops; - if (!log_oops.is_enabled()) { - return; - } - - // Print nmethod oops table - oop* const begin = nm->oops_begin(); - oop* const end = nm->oops_end(); - for (oop* p = begin; p < end; p++) { - log_oops.print(" Oop[" SIZE_FORMAT "] " PTR_FORMAT " (%s)", - (p - begin), p2i(*p), (*p)->klass()->external_name()); - } - - if (entry.immediate_oops()) { - // Print nmethod immediate oops - const ZNMethodDataImmediateOops* const nmi = gc_data(nm)->immediate_oops(); - if (nmi != NULL) { - oop** const begin = nmi->immediate_oops_begin(); - oop** const end = nmi->immediate_oops_end(); - for (oop** p = begin; p < end; p++) { - log_oops.print(" ImmediateOop[" SIZE_FORMAT "] " PTR_FORMAT " @ " PTR_FORMAT " (%s)", - (p - begin), p2i(**p), p2i(*p), (**p)->klass()->external_name()); - } - } - } -} - -void ZNMethodTable::log_unregister(const nmethod* nm) { - LogTarget(Debug, gc, nmethod) log; - if (!log.is_enabled()) { - return; - } - - log.print("Unregister NMethod: %s.%s (" PTR_FORMAT ")", - nm->method()->method_holder()->external_name(), - nm->method()->name()->as_C_string(), - p2i(nm)); -} - size_t ZNMethodTable::registered_nmethods() { return _nregistered; } @@ -418,48 +186,29 @@ void ZNMethodTable::register_nmethod(nmethod* nm) { assert(CodeCache_lock->owned_by_self(), "Lock must be held"); - ResourceMark rm; // Grow/Shrink/Prune table if needed rebuild_if_needed(); - // Create entry - const ZNMethodTableEntry entry = create_entry(nm); - - log_register(nm, entry); - // Insert new entry - if (register_entry(_table, _size, entry)) { + if (register_entry(_table, _size, nm)) { // New entry registered. When register_entry() instead returns // false the nmethod was already in the table so we do not want // to increase number of registered entries in that case. _nregistered++; } - - // Disarm nmethod entry barrier - disarm_nmethod(nm); } -void ZNMethodTable::sweeper_wait_for_iteration() { - // The sweeper must wait for any ongoing iteration to complete - // before it can unregister an nmethod. - if (!Thread::current()->is_Code_cache_sweeper_thread()) { - return; - } +void ZNMethodTable::wait_until_iteration_done() { + assert(CodeCache_lock->owned_by_self(), "Lock must be held"); - while (_iter_table != NULL) { - MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - os::naked_short_sleep(1); + while (_iteration.in_progress()) { + CodeCache_lock->wait(Monitor::_no_safepoint_check_flag); } } void ZNMethodTable::unregister_nmethod(nmethod* nm) { assert(CodeCache_lock->owned_by_self(), "Lock must be held"); - ResourceMark rm; - - sweeper_wait_for_iteration(); - - log_unregister(nm); // Remove entry unregister_entry(_table, _size, nm); @@ -467,248 +216,29 @@ _nregistered--; } -void ZNMethodTable::disarm_nmethod(nmethod* nm) { - BarrierSetNMethod* const bs = BarrierSet::barrier_set()->barrier_set_nmethod(); - if (bs != NULL) { - bs->disarm(nm); - } -} +void ZNMethodTable::nmethods_do_begin() { + MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); -void ZNMethodTable::nmethod_entries_do_begin() { - MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - ZLocker locker(&_iter_lock); + // Make sure we don't free data while iterating + ZNMethodAllocator::activate_deferred_frees(); // Prepare iteration - _iter_table = _table; - _iter_table_size = _size; - _claimed = 0; - assert(_iter_deferred_deletes.is_empty(), "Should be emtpy"); -} - -void ZNMethodTable::nmethod_entries_do_end() { - MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - ZLocker locker(&_iter_lock); - - // Finish iteration - if (_iter_table != _table) { - delete [] _iter_table; - } - _iter_table = NULL; - assert(_claimed >= _iter_table_size, "Failed to claim all table entries"); - - // Process deferred deletes - ZArrayIterator iter(&_iter_deferred_deletes); - for (void* data; iter.next(&data);) { - FREE_C_HEAP_ARRAY(uint8_t, data); - } - _iter_deferred_deletes.clear(); -} - -void ZNMethodTable::entry_oops_do(ZNMethodTableEntry entry, OopClosure* cl) { - nmethod* const nm = entry.method(); - - // Process oops table - oop* const begin = nm->oops_begin(); - oop* const end = nm->oops_end(); - for (oop* p = begin; p < end; p++) { - if (*p != Universe::non_oop_word()) { - cl->do_oop(p); - } - } - - // Process immediate oops - if (entry.immediate_oops()) { - const ZNMethodDataImmediateOops* const nmi = gc_data(nm)->immediate_oops(); - if (nmi != NULL) { - oop** const begin = nmi->immediate_oops_begin(); - oop** const end = nmi->immediate_oops_end(); - for (oop** p = begin; p < end; p++) { - if (**p != Universe::non_oop_word()) { - cl->do_oop(*p); - } - } - } - } - - // Process non-immediate oops - if (entry.non_immediate_oops()) { - nmethod* const nm = entry.method(); - nm->fix_oop_relocations(); - } -} - -class ZNMethodTableEntryToOopsDo : public ZNMethodTableEntryClosure { -private: - OopClosure* _cl; - -public: - ZNMethodTableEntryToOopsDo(OopClosure* cl) : - _cl(cl) {} - - void do_nmethod_entry(ZNMethodTableEntry entry) { - ZNMethodTable::entry_oops_do(entry, _cl); - } -}; - -void ZNMethodTable::oops_do(OopClosure* cl) { - ZNMethodTableEntryToOopsDo entry_cl(cl); - nmethod_entries_do(&entry_cl); -} - -void ZNMethodTable::nmethod_entries_do(ZNMethodTableEntryClosure* cl) { - for (;;) { - // Claim table partition. Each partition is currently sized to span - // two cache lines. This number is just a guess, but seems to work well. - const size_t partition_size = (ZCacheLineSize * 2) / sizeof(ZNMethodTableEntry); - const size_t partition_start = MIN2(Atomic::add(partition_size, &_claimed) - partition_size, _iter_table_size); - const size_t partition_end = MIN2(partition_start + partition_size, _iter_table_size); - if (partition_start == partition_end) { - // End of table - break; - } - - // Process table partition - for (size_t i = partition_start; i < partition_end; i++) { - const ZNMethodTableEntry entry = _iter_table[i]; - if (entry.registered()) { - cl->do_nmethod_entry(entry); - } - } - } + _iteration.nmethods_do_begin(_table, _size); } -class ZNMethodTableUnlinkClosure : public ZNMethodTableEntryClosure { -private: - bool _unloading_occurred; - volatile bool _failed; - - void set_failed() { - Atomic::store(true, &_failed); - } - -public: - ZNMethodTableUnlinkClosure(bool unloading_occurred) : - _unloading_occurred(unloading_occurred), - _failed(false) {} - - virtual void do_nmethod_entry(ZNMethodTableEntry entry) { - if (failed()) { - return; - } - - nmethod* const nm = entry.method(); - if (!nm->is_alive()) { - return; - } +void ZNMethodTable::nmethods_do_end() { + MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag); - ZLocker locker(ZNMethodTable::lock_for_nmethod(nm)); - - if (nm->is_unloading()) { - // Unlinking of the dependencies must happen before the - // handshake separating unlink and purge. - nm->flush_dependencies(false /* delete_immediately */); - - // We don't need to take the lock when unlinking nmethods from - // the Method, because it is only concurrently unlinked by - // the entry barrier, which acquires the per nmethod lock. - nm->unlink_from_method(false /* acquire_lock */); - return; - } - - // Heal oops and disarm - ZNMethodOopClosure cl; - ZNMethodTable::entry_oops_do(entry, &cl); - ZNMethodTable::disarm_nmethod(nm); - - // Clear compiled ICs and exception caches - if (!nm->unload_nmethod_caches(_unloading_occurred)) { - set_failed(); - } - } + // Finish iteration + _iteration.nmethods_do_end(); - bool failed() const { - return Atomic::load(&_failed); - } -}; - -class ZNMethodTableUnlinkTask : public ZTask { -private: - ZNMethodTableUnlinkClosure _cl; - ICRefillVerifier* _verifier; - -public: - ZNMethodTableUnlinkTask(bool unloading_occurred, ICRefillVerifier* verifier) : - ZTask("ZNMethodTableUnlinkTask"), - _cl(unloading_occurred), - _verifier(verifier) { - ZNMethodTable::nmethod_entries_do_begin(); - } - - ~ZNMethodTableUnlinkTask() { - ZNMethodTable::nmethod_entries_do_end(); - } + // Process deferred frees + ZNMethodAllocator::deactivate_and_process_deferred_frees(); - virtual void work() { - ICRefillVerifierMark mark(_verifier); - ZNMethodTable::nmethod_entries_do(&_cl); - } - - bool success() const { - return !_cl.failed(); - } -}; - -void ZNMethodTable::unlink(ZWorkers* workers, bool unloading_occurred) { - for (;;) { - ICRefillVerifier verifier; - - { - ZNMethodTableUnlinkTask task(unloading_occurred, &verifier); - workers->run_concurrent(&task); - if (task.success()) { - return; - } - } - - // Cleaning failed because we ran out of transitional IC stubs, - // so we have to refill and try again. Refilling requires taking - // a safepoint, so we temporarily leave the suspendible thread set. - SuspendibleThreadSetLeaver sts; - InlineCacheBuffer::refill_ic_stubs(); - } + // Notify iteration done + CodeCache_lock->notify_all(); } -class ZNMethodTablePurgeClosure : public ZNMethodTableEntryClosure { -public: - virtual void do_nmethod_entry(ZNMethodTableEntry entry) { - nmethod* const nm = entry.method(); - if (nm->is_alive() && nm->is_unloading()) { - nm->make_unloaded(); - } - } -}; - -class ZNMethodTablePurgeTask : public ZTask { -private: - ZNMethodTablePurgeClosure _cl; - -public: - ZNMethodTablePurgeTask() : - ZTask("ZNMethodTablePurgeTask"), - _cl() { - ZNMethodTable::nmethod_entries_do_begin(); - } - - ~ZNMethodTablePurgeTask() { - ZNMethodTable::nmethod_entries_do_end(); - } - - virtual void work() { - ZNMethodTable::nmethod_entries_do(&_cl); - } -}; - -void ZNMethodTable::purge(ZWorkers* workers) { - ZNMethodTablePurgeTask task; - workers->run_concurrent(&task); +void ZNMethodTable::nmethods_do(NMethodClosure* cl) { + _iteration.nmethods_do(cl); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodTable.hpp --- a/src/hotspot/share/gc/z/zNMethodTable.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zNMethodTable.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,66 +24,46 @@ #ifndef SHARE_GC_Z_ZNMETHODTABLE_HPP #define SHARE_GC_Z_ZNMETHODTABLE_HPP -#include "gc/z/zArray.hpp" -#include "gc/z/zGlobals.hpp" -#include "gc/z/zLock.hpp" -#include "gc/z/zNMethodTableEntry.hpp" +#include "gc/z/zNMethodTableIteration.hpp" #include "memory/allocation.hpp" +class nmethod; +class NMethodClosure; +class ZNMethodTableEntry; class ZWorkers; -class ZNMethodTableEntryClosure { -public: - virtual void do_nmethod_entry(ZNMethodTableEntry entry) = 0; -}; - class ZNMethodTable : public AllStatic { private: - static ZNMethodTableEntry* _table; - static size_t _size; - static ZLock _iter_lock; - static ZNMethodTableEntry* _iter_table; - static size_t _iter_table_size; - static ZArray _iter_deferred_deletes; - static size_t _nregistered; - static size_t _nunregistered; - static volatile size_t _claimed ATTRIBUTE_ALIGNED(ZCacheLineSize); + static ZNMethodTableEntry* _table; + static size_t _size; + static size_t _nregistered; + static size_t _nunregistered; + static ZNMethodTableIteration _iteration; - static ZNMethodTableEntry create_entry(nmethod* nm); + static ZNMethodTableEntry* create(size_t size); + static void destroy(ZNMethodTableEntry* table); static size_t first_index(const nmethod* nm, size_t size); static size_t next_index(size_t prev_index, size_t size); - static void sweeper_wait_for_iteration(); - - static bool register_entry(ZNMethodTableEntry* table, size_t size, ZNMethodTableEntry entry); + static bool register_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm); static void unregister_entry(ZNMethodTableEntry* table, size_t size, nmethod* nm); static void rebuild(size_t new_size); static void rebuild_if_needed(); - static void log_register(const nmethod* nm, ZNMethodTableEntry entry); - static void log_unregister(const nmethod* nm); - public: - static void safe_delete(void* data); - static size_t registered_nmethods(); static size_t unregistered_nmethods(); static void register_nmethod(nmethod* nm); static void unregister_nmethod(nmethod* nm); - static void disarm_nmethod(nmethod* nm); - static ZReentrantLock* lock_for_nmethod(nmethod* nm); - - static void oops_do(OopClosure* cl); + static void wait_until_iteration_done(); - static void entry_oops_do(ZNMethodTableEntry entry, OopClosure* cl); - - static void nmethod_entries_do_begin(); - static void nmethod_entries_do_end(); - static void nmethod_entries_do(ZNMethodTableEntryClosure* cl); + static void nmethods_do_begin(); + static void nmethods_do_end(); + static void nmethods_do(NMethodClosure* cl); static void unlink(ZWorkers* workers, bool unloading_occurred); static void purge(ZWorkers* workers); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodTableEntry.hpp --- a/src/hotspot/share/gc/z/zNMethodTableEntry.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zNMethodTableEntry.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -32,16 +32,16 @@ // -------------------------- // // 6 -// 3 3 2 1 0 -// +--------------------------------------------------------------------+-+-+-+ -// |11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111|1|1|1| -// +--------------------------------------------------------------------+-+-+-+ -// | | | | -// | 2-2 Non-immediate Oops Flag (1-bits) * | | -// | | | -// | 1-1 Immediate Oops/Unregistered Flag (1-bits) * | -// | | -// | 0-0 Registered Flag (1-bits) * +// 3 2 1 0 +// +---------------------------------------------------------------------+-+-+ +// |11111111 11111111 11111111 11111111 11111111 11111111 11111111 111111|1|1| +// +---------------------------------------------------------------------+-+-+ +// | | | +// | | | +// | | | +// | 1-1 Unregistered Flag (1-bits) * | +// | | +// | 0-0 Registered Flag (1-bits) * // | // * 63-3 NMethod Address (61-bits) // @@ -52,22 +52,20 @@ private: typedef ZBitField field_registered; typedef ZBitField field_unregistered; - typedef ZBitField field_immediate_oops; - typedef ZBitField field_non_immediate_oops; - typedef ZBitField field_method; + typedef ZBitField field_method; uint64_t _entry; public: explicit ZNMethodTableEntry(bool unregistered = false) : - _entry(field_unregistered::encode(unregistered) | - field_registered::encode(false)) {} + _entry(field_registered::encode(false) | + field_unregistered::encode(unregistered) | + field_method::encode(NULL)) {} - ZNMethodTableEntry(nmethod* method, bool non_immediate_oops, bool immediate_oops) : - _entry(field_method::encode(method) | - field_non_immediate_oops::encode(non_immediate_oops) | - field_immediate_oops::encode(immediate_oops) | - field_registered::encode(true)) {} + explicit ZNMethodTableEntry(nmethod* method) : + _entry(field_registered::encode(true) | + field_unregistered::encode(false) | + field_method::encode(method)) {} bool registered() const { return field_registered::decode(_entry); @@ -77,14 +75,6 @@ return field_unregistered::decode(_entry); } - bool immediate_oops() const { - return field_immediate_oops::decode(_entry); - } - - bool non_immediate_oops() const { - return field_non_immediate_oops::decode(_entry); - } - nmethod* method() const { return field_method::decode(_entry); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodTableIteration.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodTableIteration.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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/z/zNMethodTableEntry.hpp" +#include "gc/z/zNMethodTableIteration.hpp" +#include "memory/iterator.hpp" +#include "runtime/atomic.hpp" +#include "utilities/debug.hpp" +#include "utilities/globalDefinitions.hpp" + +ZNMethodTableIteration::ZNMethodTableIteration() : + _table(NULL), + _size(0), + _claimed(0) {} + +bool ZNMethodTableIteration::in_progress() const { + return _table != NULL; +} + +void ZNMethodTableIteration::nmethods_do_begin(ZNMethodTableEntry* table, size_t size) { + assert(!in_progress(), "precondition"); + + _table = table; + _size = size; + _claimed = 0; +} + +void ZNMethodTableIteration::nmethods_do_end() { + assert(_claimed >= _size, "Failed to claim all table entries"); + + // Finish iteration + _table = NULL; +} + +void ZNMethodTableIteration::nmethods_do(NMethodClosure* cl) { + for (;;) { + // Claim table partition. Each partition is currently sized to span + // two cache lines. This number is just a guess, but seems to work well. + const size_t partition_size = (ZCacheLineSize * 2) / sizeof(ZNMethodTableEntry); + const size_t partition_start = MIN2(Atomic::add(partition_size, &_claimed) - partition_size, _size); + const size_t partition_end = MIN2(partition_start + partition_size, _size); + if (partition_start == partition_end) { + // End of table + break; + } + + // Process table partition + for (size_t i = partition_start; i < partition_end; i++) { + const ZNMethodTableEntry entry = _table[i]; + if (entry.registered()) { + cl->do_nmethod(entry.method()); + } + } + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zNMethodTableIteration.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zNMethodTableIteration.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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_GC_Z_ZNMETHODTABLEITERATION_HPP +#define SHARE_GC_Z_ZNMETHODTABLEITERATION_HPP + +#include "gc/z/zGlobals.hpp" + +class NMethodClosure; +class ZNMethodTableEntry; + +class ZNMethodTableIteration { +private: + ZNMethodTableEntry* _table; + size_t _size; + volatile size_t _claimed ATTRIBUTE_ALIGNED(ZCacheLineSize); + +public: + ZNMethodTableIteration(); + + bool in_progress() const; + + void nmethods_do_begin(ZNMethodTableEntry* table, size_t size); + void nmethods_do_end(); + void nmethods_do(NMethodClosure* cl); +}; + +#endif // SHARE_GC_Z_ZNMETHODTABLEITERATION_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zRelocate.cpp --- a/src/hotspot/share/gc/z/zRelocate.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zRelocate.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * 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,28 +31,20 @@ #include "gc/z/zRelocationSet.inline.hpp" #include "gc/z/zRootsIterator.hpp" #include "gc/z/zTask.hpp" +#include "gc/z/zThreadLocalAllocBuffer.hpp" #include "gc/z/zWorkers.hpp" ZRelocate::ZRelocate(ZWorkers* workers) : _workers(workers) {} class ZRelocateRootsIteratorClosure : public ZRootsIteratorClosure { -private: - static void remap_address(HeapWord** p) { - *p = (HeapWord*)ZAddress::good_or_null((uintptr_t)*p); - } - public: virtual void do_thread(Thread* thread) { - ZRootsIteratorClosure::do_thread(thread); - // Update thread local address bad mask ZThreadLocalData::set_address_bad_mask(thread, ZAddressBadMask); // Remap TLAB - if (UseTLAB && thread->is_Java_thread()) { - thread->tlab().addresses_do(remap_address); - } + ZThreadLocalAllocBuffer::remap(thread); } virtual void do_oop(oop* p) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zRootsIterator.cpp --- a/src/hotspot/share/gc/z/zRootsIterator.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zRootsIterator.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -33,7 +33,7 @@ #include "gc/shared/suspendibleThreadSet.hpp" #include "gc/z/zBarrierSetNMethod.hpp" #include "gc/z/zGlobals.hpp" -#include "gc/z/zNMethodTable.hpp" +#include "gc/z/zNMethod.hpp" #include "gc/z/zOopClosures.inline.hpp" #include "gc/z/zRootsIterator.hpp" #include "gc/z/zStat.hpp" @@ -135,29 +135,38 @@ } } -class ZCodeBlobClosure : public CodeBlobToOopClosure { +class ZRootsIteratorCodeBlobClosure : public CodeBlobToOopClosure { private: BarrierSetNMethod* _bs; public: - ZCodeBlobClosure(OopClosure* cl) : + ZRootsIteratorCodeBlobClosure(OopClosure* cl) : CodeBlobToOopClosure(cl, true /* fix_relocations */), _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {} virtual void do_code_blob(CodeBlob* cb) { nmethod* const nm = cb->as_nmethod_or_null(); - if (nm == NULL || nm->test_set_oops_do_mark()) { - return; + if (nm != NULL && !nm->test_set_oops_do_mark()) { + CodeBlobToOopClosure::do_code_blob(cb); + _bs->disarm(nm); } - CodeBlobToOopClosure::do_code_blob(cb); - _bs->disarm(nm); } }; -void ZRootsIteratorClosure::do_thread(Thread* thread) { - ZCodeBlobClosure code_cl(this); - thread->oops_do(this, ClassUnloading ? &code_cl : NULL); -} +class ZRootsIteratorThreadClosure : public ThreadClosure { +private: + ZRootsIteratorClosure* _cl; + +public: + ZRootsIteratorThreadClosure(ZRootsIteratorClosure* cl) : + _cl(cl) {} + + virtual void do_thread(Thread* thread) { + ZRootsIteratorCodeBlobClosure code_cl(_cl); + thread->oops_do(_cl, ClassUnloading ? &code_cl : NULL); + _cl->do_thread(thread); + } +}; ZRootsIterator::ZRootsIterator() : _universe(this), @@ -175,7 +184,7 @@ if (ClassUnloading) { nmethod::oops_do_marking_prologue(); } else { - ZNMethodTable::nmethod_entries_do_begin(); + ZNMethod::oops_do_begin(); } } @@ -185,7 +194,7 @@ if (ClassUnloading) { nmethod::oops_do_marking_epilogue(); } else { - ZNMethodTable::nmethod_entries_do_end(); + ZNMethod::oops_do_end(); } JvmtiExport::gc_epilogue(); @@ -227,12 +236,13 @@ void ZRootsIterator::do_threads(ZRootsIteratorClosure* cl) { ZStatTimer timer(ZSubPhasePauseRootsThreads); ResourceMark rm; - Threads::possibly_parallel_threads_do(true, cl); + ZRootsIteratorThreadClosure thread_cl(cl); + Threads::possibly_parallel_threads_do(true, &thread_cl); } void ZRootsIterator::do_code_cache(ZRootsIteratorClosure* cl) { ZStatTimer timer(ZSubPhasePauseRootsCodeCache); - ZNMethodTable::oops_do(cl); + ZNMethod::oops_do(cl); } void ZRootsIterator::oops_do(ZRootsIteratorClosure* cl, bool visit_jvmti_weak_export) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zRootsIterator.hpp --- a/src/hotspot/share/gc/z/zRootsIterator.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zRootsIterator.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -31,9 +31,9 @@ #include "runtime/thread.hpp" #include "utilities/globalDefinitions.hpp" -class ZRootsIteratorClosure : public OopClosure, public ThreadClosure { +class ZRootsIteratorClosure : public OopClosure { public: - virtual void do_thread(Thread* thread); + virtual void do_thread(Thread* thread) {} }; typedef OopStorage::ParState ZOopStorageIterator; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zStatTLAB.cpp --- a/src/hotspot/share/gc/z/zStatTLAB.cpp Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 "gc/z/zStatTLAB.hpp" - -ZPerWorker* ZStatTLAB::_stats = NULL; - -void ZStatTLAB::initialize() { - if (UseTLAB) { - assert(_stats == NULL, "Already initialized"); - _stats = new ZPerWorker(); - reset(); - } -} - -void ZStatTLAB::reset() { - if (UseTLAB) { - ZPerWorkerIterator iter(_stats); - for (ThreadLocalAllocStats* stats; iter.next(&stats);) { - stats->reset(); - } - } -} - -ThreadLocalAllocStats* ZStatTLAB::get() { - if (UseTLAB) { - return _stats->addr(); - } - - return NULL; -} - -void ZStatTLAB::publish() { - if (UseTLAB) { - ThreadLocalAllocStats total; - - ZPerWorkerIterator iter(_stats); - for (ThreadLocalAllocStats* stats; iter.next(&stats);) { - total.update(*stats); - } - - total.publish(); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zStatTLAB.hpp --- a/src/hotspot/share/gc/z/zStatTLAB.hpp Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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_GC_Z_ZSTATTLAB_HPP -#define SHARE_GC_Z_ZSTATTLAB_HPP - -#include "gc/shared/threadLocalAllocBuffer.hpp" -#include "gc/z/zValue.hpp" -#include "memory/allocation.hpp" - -class ZStatTLAB : public AllStatic { -private: - static ZPerWorker* _stats; - -public: - static void initialize(); - static void reset(); - static ThreadLocalAllocStats* get(); - static void publish(); -}; - -#endif // SHARE_GC_Z_ZSTATTLAB_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zThreadLocalAllocBuffer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zThreadLocalAllocBuffer.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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/z/zAddress.inline.hpp" +#include "gc/z/zThreadLocalAllocBuffer.hpp" +#include "runtime/globals.hpp" +#include "runtime/thread.hpp" + +ZPerWorker* ZThreadLocalAllocBuffer::_stats = NULL; + +void ZThreadLocalAllocBuffer::initialize() { + if (UseTLAB) { + assert(_stats == NULL, "Already initialized"); + _stats = new ZPerWorker(); + reset_statistics(); + } +} + +void ZThreadLocalAllocBuffer::reset_statistics() { + if (UseTLAB) { + ZPerWorkerIterator iter(_stats); + for (ThreadLocalAllocStats* stats; iter.next(&stats);) { + stats->reset(); + } + } +} + +void ZThreadLocalAllocBuffer::publish_statistics() { + if (UseTLAB) { + ThreadLocalAllocStats total; + + ZPerWorkerIterator iter(_stats); + for (ThreadLocalAllocStats* stats; iter.next(&stats);) { + total.update(*stats); + } + + total.publish(); + } +} + +static void fixup_address(HeapWord** p) { + *p = (HeapWord*)ZAddress::good_or_null((uintptr_t)*p); +} + +void ZThreadLocalAllocBuffer::retire(Thread* thread) { + if (UseTLAB && thread->is_Java_thread()) { + ThreadLocalAllocStats* const stats = _stats->addr(); + thread->tlab().addresses_do(fixup_address); + thread->tlab().retire(stats); + thread->tlab().resize(); + } +} + +void ZThreadLocalAllocBuffer::remap(Thread* thread) { + if (UseTLAB && thread->is_Java_thread()) { + thread->tlab().addresses_do(fixup_address); + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zThreadLocalAllocBuffer.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hotspot/share/gc/z/zThreadLocalAllocBuffer.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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_GC_Z_ZTHREADLOCALALLOCBUFFER_HPP +#define SHARE_GC_Z_ZTHREADLOCALALLOCBUFFER_HPP + +#include "gc/shared/threadLocalAllocBuffer.hpp" +#include "gc/z/zValue.hpp" +#include "memory/allocation.hpp" + +class ZThreadLocalAllocBuffer : public AllStatic { +private: + static ZPerWorker* _stats; + +public: + static void initialize(); + + static void reset_statistics(); + static void publish_statistics(); + + static void retire(Thread* thread); + static void remap(Thread* thread); +}; + +#endif // SHARE_GC_Z_ZTHREADLOCALALLOCBUFFER_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/gc/z/zUnload.cpp --- a/src/hotspot/share/gc/z/zUnload.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/gc/z/zUnload.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -30,7 +30,7 @@ #include "gc/shared/gcBehaviours.hpp" #include "gc/shared/suspendibleThreadSet.hpp" #include "gc/z/zLock.inline.hpp" -#include "gc/z/zNMethodTable.hpp" +#include "gc/z/zNMethod.hpp" #include "gc/z/zOopClosures.hpp" #include "gc/z/zStat.hpp" #include "gc/z/zUnload.hpp" @@ -75,7 +75,7 @@ public: virtual bool is_unloading(CompiledMethod* method) const { nmethod* const nm = method->as_nmethod(); - ZReentrantLock* const lock = ZNMethodTable::lock_for_nmethod(nm); + ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); if (lock == NULL) { return is_unloading(nm); } else { @@ -89,7 +89,7 @@ public: virtual bool lock(CompiledMethod* method) { nmethod* const nm = method->as_nmethod(); - ZReentrantLock* const lock = ZNMethodTable::lock_for_nmethod(nm); + ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); if (lock != NULL) { lock->lock(); } @@ -98,7 +98,7 @@ virtual void unlock(CompiledMethod* method) { nmethod* const nm = method->as_nmethod(); - ZReentrantLock* const lock = ZNMethodTable::lock_for_nmethod(nm); + ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); if (lock != NULL) { lock->unlock(); } @@ -110,7 +110,7 @@ } nmethod* const nm = method->as_nmethod(); - ZReentrantLock* const lock = ZNMethodTable::lock_for_nmethod(nm); + ZReentrantLock* const lock = ZNMethod::lock_for_nmethod(nm); return lock == NULL || lock->is_owned(); } }; @@ -149,7 +149,7 @@ Klass::clean_weak_klass_links(unloading_occurred); - ZNMethodTable::unlink(_workers, unloading_occurred); + ZNMethod::unlink(_workers, unloading_occurred); DependencyContext::cleaning_end(); } @@ -157,7 +157,7 @@ void ZUnload::purge() { { SuspendibleThreadSetJoiner sts; - ZNMethodTable::purge(_workers); + ZNMethod::purge(_workers); } ClassLoaderDataGraph::purge(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/interpreter/linkResolver.cpp --- a/src/hotspot/share/interpreter/linkResolver.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/interpreter/linkResolver.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -39,6 +39,7 @@ #include "logging/logStream.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" +#include "oops/constantPool.hpp" #include "oops/cpCache.inline.hpp" #include "oops/instanceKlass.hpp" #include "oops/method.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/interpreter/rewriter.cpp --- a/src/hotspot/share/interpreter/rewriter.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/interpreter/rewriter.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -28,6 +28,7 @@ #include "interpreter/rewriter.hpp" #include "memory/metadataFactory.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.hpp" #include "oops/generateOopMap.hpp" #include "prims/methodHandles.hpp" #include "runtime/fieldDescriptor.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp --- a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -43,6 +43,7 @@ #include "memory/allocation.inline.hpp" #include "memory/resourceArea.hpp" #include "oops/array.hpp" +#include "oops/constantPool.hpp" #include "oops/instanceKlass.hpp" #include "oops/method.hpp" #include "prims/jvmtiRedefineClasses.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/jni/jfrJniMethod.cpp --- a/src/hotspot/share/jfr/jni/jfrJniMethod.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/jni/jfrJniMethod.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -114,7 +114,7 @@ NO_TRANSITION_END NO_TRANSITION(void, jfr_set_file_notification(JNIEnv* env, jobject jvm, jlong threshold)) - JfrChunkRotation::set_threshold((intptr_t)threshold); + JfrChunkRotation::set_threshold(threshold); NO_TRANSITION_END NO_TRANSITION(void, jfr_set_sample_threads(JNIEnv* env, jobject jvm, jboolean sampleThreads)) diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/metadata/metadata.xml --- a/src/hotspot/share/jfr/metadata/metadata.xml Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/metadata/metadata.xml Fri Feb 22 20:36:42 2019 +0000 @@ -533,12 +533,6 @@ - - - - - diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -44,13 +44,13 @@ } } -static void write_checkpoint_header(u1* pos, jlong size, jlong time, bool flushpoint, juint type_count) { +static void write_checkpoint_header(u1* pos, int64_t size, jlong time, bool flushpoint, u4 type_count) { assert(pos != NULL, "invariant"); JfrBigEndianWriter be_writer(pos, sizeof(JfrCheckpointEntry)); be_writer.write(size); be_writer.write(time); be_writer.write(JfrTicks::now().value() - time); - be_writer.write(flushpoint ? (juint)1 : (juint)0); + be_writer.write(flushpoint ? (u4)1 : (u4)0); be_writer.write(type_count); assert(be_writer.is_valid(), "invariant"); } @@ -71,7 +71,7 @@ assert(this->is_valid(), "invariant"); assert(count() > 0, "invariant"); assert(this->used_size() > sizeof(JfrCheckpointEntry), "invariant"); - const jlong size = this->current_offset(); + const int64_t size = this->current_offset(); assert(size + this->start_pos() == this->current_pos(), "invariant"); write_checkpoint_header(const_cast(this->start_pos()), size, _time, is_flushpoint(), count()); release(); @@ -85,11 +85,11 @@ return _flushpoint; } -juint JfrCheckpointWriter::count() const { +u4 JfrCheckpointWriter::count() const { return _count; } -void JfrCheckpointWriter::set_count(juint count) { +void JfrCheckpointWriter::set_count(u4 count) { _count = count; } @@ -111,7 +111,7 @@ } void JfrCheckpointWriter::write_key(u8 key) { - write(key); + write(key); } void JfrCheckpointWriter::increment() { @@ -119,10 +119,10 @@ } void JfrCheckpointWriter::write_count(u4 nof_entries) { - write((u4)nof_entries); + write(nof_entries); } -void JfrCheckpointWriter::write_count(u4 nof_entries, jlong offset) { +void JfrCheckpointWriter::write_count(u4 nof_entries, int64_t offset) { write_padded_at_offset(nof_entries, offset); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp --- a/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/checkpoint/jfrCheckpointWriter.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -49,21 +49,21 @@ typedef EventWriterHost JfrCheckpointWriterBase; struct JfrCheckpointContext { - jlong offset; - juint count; + int64_t offset; + u4 count; }; class JfrCheckpointWriter : public JfrCheckpointWriterBase { friend class JfrSerializerRegistration; private: JfrTicks _time; - jlong _offset; - juint _count; + int64_t _offset; + u4 _count; bool _flushpoint; bool _header; - juint count() const; - void set_count(juint count); + u4 count() const; + void set_count(u4 count); void increment(); void set_flushpoint(bool flushpoint); bool is_flushpoint() const; @@ -75,7 +75,7 @@ ~JfrCheckpointWriter(); void write_type(JfrTypeId type_id); void write_count(u4 nof_entries); - void write_count(u4 nof_entries, jlong offset); + void write_count(u4 nof_entries, int64_t offset); void write_key(u8 key); const JfrCheckpointContext context() const; void set_context(const JfrCheckpointContext ctx); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrType.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -65,7 +65,7 @@ private: JfrCheckpointWriter& _writer; JfrCheckpointContext _ctx; - const intptr_t _count_position; + const int64_t _count_position; Thread* const _curthread; u4 _count; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetWriter.hpp --- a/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetWriter.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/checkpoint/types/jfrTypeSetWriter.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -35,7 +35,7 @@ WriterImpl _impl; JfrCheckpointWriter* _writer; JfrCheckpointContext _ctx; - jlong _count_offset; + int64_t _count_offset; int _count; bool _skip_header; public: diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.cpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -29,7 +29,7 @@ #include "runtime/handles.inline.hpp" static jobject chunk_monitor = NULL; -static intptr_t threshold = 0; +static int64_t threshold = 0; static bool rotate = false; static jobject install_chunk_monitor(Thread* thread) { @@ -62,7 +62,6 @@ // already in progress return; } - assert(!rotate, "invariant"); if (writer.size_written() > threshold) { rotate = true; notify(); @@ -77,6 +76,6 @@ rotate = false; } -void JfrChunkRotation::set_threshold(intptr_t bytes) { +void JfrChunkRotation::set_threshold(int64_t bytes) { threshold = bytes; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.hpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkRotation.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -36,7 +36,7 @@ class JfrChunkRotation : AllStatic { public: static void evaluate(const JfrChunkWriter& writer); - static void set_threshold(intptr_t bytes); + static void set_threshold(int64_t bytes); static bool should_rotate(); static void on_rotation(); }; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkState.cpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkState.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkState.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -53,19 +53,19 @@ set_previous_checkpoint_offset(0); } -void JfrChunkState::set_previous_checkpoint_offset(jlong offset) { +void JfrChunkState::set_previous_checkpoint_offset(int64_t offset) { _previous_checkpoint_offset = offset; } -jlong JfrChunkState::previous_checkpoint_offset() const { +int64_t JfrChunkState::previous_checkpoint_offset() const { return _previous_checkpoint_offset; } -jlong JfrChunkState::previous_start_ticks() const { +int64_t JfrChunkState::previous_start_ticks() const { return _previous_start_ticks; } -jlong JfrChunkState::previous_start_nanos() const { +int64_t JfrChunkState::previous_start_nanos() const { return _previous_start_nanos; } @@ -92,7 +92,7 @@ save_current_and_update_start_ticks(); } -jlong JfrChunkState::last_chunk_duration() const { +int64_t JfrChunkState::last_chunk_duration() const { return _start_nanos - _previous_start_nanos; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkState.hpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkState.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkState.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -25,7 +25,6 @@ #ifndef SHARE_JFR_RECORDER_REPOSITORY_JFRCHUNKSTATE_HPP #define SHARE_JFR_RECORDER_REPOSITORY_JFRCHUNKSTATE_HPP -#include "jni.h" #include "jfr/utilities/jfrAllocation.hpp" #include "jfr/utilities/jfrTypes.hpp" @@ -33,11 +32,11 @@ friend class JfrChunkWriter; private: char* _path; - jlong _start_ticks; - jlong _start_nanos; - jlong _previous_start_ticks; - jlong _previous_start_nanos; - jlong _previous_checkpoint_offset; + int64_t _start_ticks; + int64_t _start_nanos; + int64_t _previous_start_ticks; + int64_t _previous_start_nanos; + int64_t _previous_checkpoint_offset; void update_start_ticks(); void update_start_nanos(); @@ -47,11 +46,11 @@ JfrChunkState(); ~JfrChunkState(); void reset(); - jlong previous_checkpoint_offset() const; - void set_previous_checkpoint_offset(jlong offset); - jlong previous_start_ticks() const; - jlong previous_start_nanos() const; - jlong last_chunk_duration() const; + int64_t previous_checkpoint_offset() const; + void set_previous_checkpoint_offset(int64_t offset); + int64_t previous_start_ticks() const; + int64_t previous_start_nanos() const; + int64_t last_chunk_duration() const; void update_time_to_now(); void set_path(const char* path); const char* path() const; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.cpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -32,9 +32,8 @@ #include "runtime/os.hpp" #include "runtime/os.inline.hpp" -const u2 JFR_VERSION_MAJOR = 2; -const u2 JFR_VERSION_MINOR = 0; - +static const u2 JFR_VERSION_MAJOR = 2; +static const u2 JFR_VERSION_MINOR = 0; static const size_t MAGIC_LEN = 4; static const size_t FILEHEADER_SLOT_SIZE = 8; static const size_t CHUNK_SIZE_OFFSET = 8; @@ -79,14 +78,14 @@ return is_open; } -size_t JfrChunkWriter::close(intptr_t metadata_offset) { +size_t JfrChunkWriter::close(int64_t metadata_offset) { write_header(metadata_offset); this->flush(); this->close_fd(); - return size_written(); + return (size_t)size_written(); } -void JfrChunkWriter::write_header(intptr_t metadata_offset) { +void JfrChunkWriter::write_header(int64_t metadata_offset) { assert(this->is_valid(), "invariant"); // Chunk size this->write_be_at_offset(size_written(), CHUNK_SIZE_OFFSET); @@ -106,15 +105,15 @@ _chunkstate->set_path(chunk_path); } -intptr_t JfrChunkWriter::size_written() const { +int64_t JfrChunkWriter::size_written() const { return this->is_valid() ? this->current_offset() : 0; } -intptr_t JfrChunkWriter::previous_checkpoint_offset() const { +int64_t JfrChunkWriter::previous_checkpoint_offset() const { return _chunkstate->previous_checkpoint_offset(); } -void JfrChunkWriter::set_previous_checkpoint_offset(intptr_t offset) { +void JfrChunkWriter::set_previous_checkpoint_offset(int64_t offset) { _chunkstate->set_previous_checkpoint_offset(offset); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.hpp --- a/src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrChunkWriter.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -41,16 +41,16 @@ JfrChunkState* _chunkstate; bool open(); - size_t close(intptr_t metadata_offset); - void write_header(intptr_t metadata_offset); + size_t close(int64_t metadata_offset); + void write_header(int64_t metadata_offset); void set_chunk_path(const char* chunk_path); public: JfrChunkWriter(); bool initialize(); - intptr_t size_written() const; - intptr_t previous_checkpoint_offset() const; - void set_previous_checkpoint_offset(intptr_t offset); + int64_t size_written() const; + int64_t previous_checkpoint_offset() const; + void set_previous_checkpoint_offset(int64_t offset); void time_stamp_chunk_now(); }; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrRepository.cpp --- a/src/hotspot/share/jfr/recorder/repository/jfrRepository.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrRepository.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -147,10 +147,10 @@ iso8601_to_date_time(buffer); } -static jlong file_size(fio_fd fd) { +static int64_t file_size(fio_fd fd) { assert(fd != invalid_fd, "invariant"); - const jlong current_offset = os::current_file_offset(fd); - const jlong size = os::lseek(fd, 0, SEEK_END); + const int64_t current_offset = os::current_file_offset(fd); + const int64_t size = os::lseek(fd, 0, SEEK_END); os::seek_to_file_offset(fd, current_offset); return size; } @@ -218,7 +218,7 @@ if (invalid_fd == entry_fd) { return NULL; } - const jlong entry_size = file_size(entry_fd); + const int64_t entry_size = file_size(entry_fd); os::close(entry_fd); if (0 == entry_size) { return NULL; @@ -260,6 +260,7 @@ } } #endif + bool RepositoryIterator::has_next() const { return (_files != NULL && _iterator < _files->length()); } @@ -275,21 +276,27 @@ if (file_copy_block == NULL) { return; } - jlong bytes_written_total = 0; + int64_t bytes_written_total = 0; while (iterator.has_next()) { fio_fd current_fd = invalid_fd; const char* const fqn = iterator.next(); if (fqn != NULL) { current_fd = open_existing(fqn); if (current_fd != invalid_fd) { - const jlong current_filesize = file_size(current_fd); + const int64_t current_filesize = file_size(current_fd); assert(current_filesize > 0, "invariant"); - jlong bytes_read = 0; - jlong bytes_written = 0; + int64_t bytes_read = 0; + int64_t bytes_written = 0; while (bytes_read < current_filesize) { - bytes_read += (jlong)os::read_at(current_fd, file_copy_block, size_of_file_copy_block, bytes_read); - assert(bytes_read - bytes_written <= (jlong)size_of_file_copy_block, "invariant"); - bytes_written += (jlong)os::write(emergency_fd, file_copy_block, bytes_read - bytes_written); + const ssize_t read_result = os::read_at(current_fd, file_copy_block, size_of_file_copy_block, bytes_read); + if (-1 == read_result) { + log_info(jfr) ( // For user, should not be "jfr, system" + "Unable to recover JFR data"); + break; + } + bytes_read += (int64_t)read_result; + assert(bytes_read - bytes_written <= (int64_t)size_of_file_copy_block, "invariant"); + bytes_written += (int64_t)os::write(emergency_fd, file_copy_block, bytes_read - bytes_written); assert(bytes_read == bytes_written, "invariant"); } os::close(current_fd); @@ -468,6 +475,6 @@ return _chunkwriter->open(); } -size_t JfrRepository::close_chunk(jlong metadata_offset) { +size_t JfrRepository::close_chunk(int64_t metadata_offset) { return _chunkwriter->close(metadata_offset); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/repository/jfrRepository.hpp --- a/src/hotspot/share/jfr/recorder/repository/jfrRepository.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/repository/jfrRepository.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -55,7 +55,7 @@ bool set_path(const char* path); void set_chunk_path(const char* path); bool open_chunk(bool vm_error = false); - size_t close_chunk(jlong metadata_offset); + size_t close_chunk(int64_t metadata_offset); void on_vm_error(); static void notify_on_new_chunk_path(); static JfrChunkWriter& chunkwriter(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp --- a/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/recorder/service/jfrRecorderService.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -130,18 +130,18 @@ bool not_acquired() const { return !_acquired; } }; -static intptr_t write_checkpoint_event_prologue(JfrChunkWriter& cw, u8 type_id) { - const intptr_t prev_cp_offset = cw.previous_checkpoint_offset(); - const intptr_t prev_cp_relative_offset = 0 == prev_cp_offset ? 0 : prev_cp_offset - cw.current_offset(); +static int64_t write_checkpoint_event_prologue(JfrChunkWriter& cw, u8 type_id) { + const int64_t prev_cp_offset = cw.previous_checkpoint_offset(); + const int64_t prev_cp_relative_offset = 0 == prev_cp_offset ? 0 : prev_cp_offset - cw.current_offset(); cw.reserve(sizeof(u4)); cw.write(EVENT_CHECKPOINT); cw.write(JfrTicks::now()); - cw.write((jlong)0); + cw.write((int64_t)0); cw.write(prev_cp_relative_offset); // write previous checkpoint offset delta cw.write(false); // flushpoint - cw.write((u4)1); // nof types in this checkpoint - cw.write(type_id); - const intptr_t number_of_elements_offset = cw.current_offset(); + cw.write((u4)1); // nof types in this checkpoint + cw.write(type_id); + const int64_t number_of_elements_offset = cw.current_offset(); cw.reserve(sizeof(u4)); return number_of_elements_offset; } @@ -161,8 +161,8 @@ } bool process() { // current_cp_offset is also offset for the event size header field - const intptr_t current_cp_offset = _cw.current_offset(); - const intptr_t num_elements_offset = write_checkpoint_event_prologue(_cw, _type_id); + const int64_t current_cp_offset = _cw.current_offset(); + const int64_t num_elements_offset = write_checkpoint_event_prologue(_cw, _type_id); // invocation _content_functor.process(); const u4 number_of_elements = (u4)_content_functor.processed(); @@ -468,9 +468,9 @@ JfrMetadataEvent::lock(); } -static jlong write_metadata_event(JfrChunkWriter& chunkwriter) { +static int64_t write_metadata_event(JfrChunkWriter& chunkwriter) { assert(chunkwriter.is_valid(), "invariant"); - const jlong metadata_offset = chunkwriter.current_offset(); + const int64_t metadata_offset = chunkwriter.current_offset(); JfrMetadataEvent::write(chunkwriter, metadata_offset); return metadata_offset; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrEventWriterHost.inline.hpp --- a/src/hotspot/share/jfr/writers/jfrEventWriterHost.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrEventWriterHost.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -49,7 +49,7 @@ inline intptr_t EventWriterHost::end_write(void) { assert(this->is_acquired(), "state corruption, calling end with writer with non-acquired state!"); - return this->is_valid() ? this->used_offset() : 0; + return this->is_valid() ? (intptr_t)this->used_offset() : 0; } template diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrPosition.hpp --- a/src/hotspot/share/jfr/writers/jfrPosition.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrPosition.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -48,8 +48,8 @@ public: size_t available_size() const; - intptr_t used_offset() const; - intptr_t current_offset() const; + int64_t used_offset() const; + int64_t current_offset() const; size_t used_size() const; void reset(); }; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrPosition.inline.hpp --- a/src/hotspot/share/jfr/writers/jfrPosition.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrPosition.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -80,12 +80,12 @@ } template -inline intptr_t Position::used_offset() const { +inline int64_t Position::used_offset() const { return _current_pos - _start_pos; } template -inline intptr_t Position::current_offset() const { +inline int64_t Position::current_offset() const { return this->used_offset(); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrStreamWriterHost.hpp --- a/src/hotspot/share/jfr/writers/jfrStreamWriterHost.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrStreamWriterHost.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -33,9 +33,9 @@ public: typedef typename Adapter::StorageType StorageType; private: - intptr_t _stream_pos; + int64_t _stream_pos; fio_fd _fd; - intptr_t current_stream_position() const; + int64_t current_stream_position() const; protected: StreamWriterHost(StorageType* storage, Thread* thread); @@ -47,8 +47,8 @@ bool has_valid_fd() const; public: - intptr_t current_offset() const; - void seek(intptr_t offset); + int64_t current_offset() const; + void seek(int64_t offset); void flush(); void write_unbuffered(const void* src, size_t len); bool is_valid() const; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrStreamWriterHost.inline.hpp --- a/src/hotspot/share/jfr/writers/jfrStreamWriterHost.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrStreamWriterHost.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -44,7 +44,7 @@ } template -inline intptr_t StreamWriterHost::current_stream_position() const { +inline int64_t StreamWriterHost::current_stream_position() const { return this->used_offset() + _stream_pos; } @@ -73,7 +73,7 @@ inline void StreamWriterHost::flush(size_t size) { assert(size > 0, "invariant"); assert(this->is_valid(), "invariant"); - _stream_pos += os::write(_fd, this->start_pos(), (int)size); + _stream_pos += os::write(_fd, this->start_pos(), (unsigned int)size); StorageHost::reset(); assert(0 == this->used_offset(), "invariant"); } @@ -84,12 +84,12 @@ } template -inline intptr_t StreamWriterHost::current_offset() const { +inline int64_t StreamWriterHost::current_offset() const { return current_stream_position(); } template -void StreamWriterHost::seek(intptr_t offset) { +void StreamWriterHost::seek(int64_t offset) { this->flush(); assert(0 == this->used_offset(), "can only seek from beginning"); _stream_pos = os::seek_to_file_offset(_fd, offset); @@ -110,7 +110,7 @@ this->flush(); assert(0 == this->used_offset(), "can only seek from beginning"); while (len > 0) { - const int n = MIN2((int)len, INT_MAX); + const unsigned int n = MIN2((unsigned int)len, (unsigned int)INT_MAX); _stream_pos += os::write(_fd, buf, n); len -= n; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrWriterHost.hpp --- a/src/hotspot/share/jfr/writers/jfrWriterHost.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrWriterHost.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -91,12 +91,12 @@ void bytes(const void* buf, size_t len); void write_utf8_u2_len(const char* value); template - void write_padded_at_offset(T value, intptr_t offset); + void write_padded_at_offset(T value, int64_t offset); template - void write_at_offset(T value, intptr_t offset); + void write_at_offset(T value, int64_t offset); template - void write_be_at_offset(T value, intptr_t offset); - intptr_t reserve(size_t size); + void write_be_at_offset(T value, int64_t offset); + int64_t reserve(size_t size); }; #endif // SHARE_JFR_WRITERS_JFRWRITERHOST_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/jfr/writers/jfrWriterHost.inline.hpp --- a/src/hotspot/share/jfr/writers/jfrWriterHost.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/jfr/writers/jfrWriterHost.inline.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -196,7 +196,7 @@ template inline void WriterHost::write(double value) { - be_write(*(uintptr_t*)&(value)); + be_write(*(u8*)&(value)); } template @@ -317,9 +317,9 @@ } template -inline intptr_t WriterHost::reserve(size_t size) { +inline int64_t WriterHost::reserve(size_t size) { if (ensure_size(size) != NULL) { - intptr_t reserved_offset = this->current_offset(); + const int64_t reserved_offset = this->current_offset(); this->set_current_pos(size); return reserved_offset; } @@ -329,9 +329,9 @@ template template -inline void WriterHost::write_padded_at_offset(T value, intptr_t offset) { +inline void WriterHost::write_padded_at_offset(T value, int64_t offset) { if (this->is_valid()) { - const intptr_t current = this->current_offset(); + const int64_t current = this->current_offset(); this->seek(offset); write_padded(value); this->seek(current); // restore @@ -340,9 +340,9 @@ template template -inline void WriterHost::write_at_offset(T value, intptr_t offset) { +inline void WriterHost::write_at_offset(T value, int64_t offset) { if (this->is_valid()) { - const intptr_t current = this->current_offset(); + const int64_t current = this->current_offset(); this->seek(offset); write(value); this->seek(current); // restore @@ -351,9 +351,9 @@ template template -inline void WriterHost::write_be_at_offset(T value, intptr_t offset) { +inline void WriterHost::write_be_at_offset(T value, int64_t offset) { if (this->is_valid()) { - const intptr_t current = this->current_offset(); + const int64_t current = this->current_offset(); this->seek(offset); be_write(value); this->seek(current); // restore diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/logging/logFileOutput.cpp --- a/src/hotspot/share/logging/logFileOutput.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/logging/logFileOutput.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -51,6 +51,14 @@ _file_name = make_file_name(name + strlen(Prefix), _pid_str, _vm_start_time_str); } +const char* LogFileOutput::cur_log_file_name() { + if (strlen(_archive_name) == 0) { + return _file_name; + } else { + return _archive_name; + } +} + void LogFileOutput::set_file_name_parameters(jlong vm_start_time) { int res = jio_snprintf(_pid_str, sizeof(_pid_str), "%d", os::current_process_id()); assert(res > 0, "PID buffer too small"); @@ -234,6 +242,7 @@ _file_count_max_digits = number_of_digits(_file_count - 1); _archive_name_len = 2 + strlen(_file_name) + _file_count_max_digits; _archive_name = NEW_C_HEAP_ARRAY(char, _archive_name_len, mtLogging); + _archive_name[0] = 0; } log_trace(logging)("Initializing logging to file '%s' (filecount: %u" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/logging/logFileOutput.hpp --- a/src/hotspot/share/logging/logFileOutput.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/logging/logFileOutput.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -92,6 +92,7 @@ return _name; } + const char* cur_log_file_name(); static const char* const Prefix; static void set_file_name_parameters(jlong start_time); }; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/allocation.hpp --- a/src/hotspot/share/memory/allocation.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/allocation.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -132,6 +132,7 @@ f(mtArguments, "Arguments") \ f(mtModule, "Module") \ f(mtSafepoint, "Safepoint") \ + f(mtSynchronizer, "Synchronization") \ f(mtNone, "Unknown") \ //end diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/filemap.cpp --- a/src/hotspot/share/memory/filemap.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/filemap.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * 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,7 @@ #include "prims/jvmtiExport.hpp" #include "runtime/arguments.hpp" #include "runtime/java.hpp" +#include "runtime/mutexLocker.hpp" #include "runtime/os.inline.hpp" #include "runtime/vm_version.hpp" #include "services/memTracker.hpp" @@ -501,6 +502,16 @@ } _validating_shared_path_table = false; + +#if INCLUDE_JVMTI + if (_classpath_entries_for_jvmti != NULL) { + os::free(_classpath_entries_for_jvmti); + } + size_t sz = sizeof(ClassPathEntry*) * _shared_path_table_size; + _classpath_entries_for_jvmti = (ClassPathEntry**)os::malloc(sz, mtClass); + memset(_classpath_entries_for_jvmti, 0, sz); +#endif + return true; } @@ -1440,3 +1451,57 @@ fail_stop("%s", msg); } } + +#if INCLUDE_JVMTI +ClassPathEntry** FileMapInfo::_classpath_entries_for_jvmti = NULL; + +ClassPathEntry* FileMapInfo::get_classpath_entry_for_jvmti(int i, TRAPS) { + ClassPathEntry* ent = _classpath_entries_for_jvmti[i]; + if (ent == NULL) { + if (i == 0) { + ent = ClassLoader:: get_jrt_entry(); + assert(ent != NULL, "must be"); + } else { + SharedClassPathEntry* scpe = shared_path(i); + assert(scpe->is_jar(), "must be"); // other types of scpe will not produce archived classes + + const char* path = scpe->name(); + struct stat st; + if (os::stat(path, &st) != 0) { + char *msg = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, strlen(path) + 128); ; + jio_snprintf(msg, strlen(path) + 127, "error in opening JAR file %s", path); + THROW_MSG_(vmSymbols::java_io_IOException(), msg, NULL); + } else { + ent = ClassLoader::create_class_path_entry(path, &st, /*throw_exception=*/true, false, CHECK_NULL); + } + } + + MutexLocker mu(CDSClassFileStream_lock, THREAD); + if (_classpath_entries_for_jvmti[i] == NULL) { + _classpath_entries_for_jvmti[i] = ent; + } else { + // Another thread has beat me to creating this entry + delete ent; + ent = _classpath_entries_for_jvmti[i]; + } + } + + return ent; +} + +ClassFileStream* FileMapInfo::open_stream_for_jvmti(InstanceKlass* ik, TRAPS) { + int path_index = ik->shared_classpath_index(); + assert(path_index >= 0, "should be called for shared built-in classes only"); + assert(path_index < (int)_shared_path_table_size, "sanity"); + + ClassPathEntry* cpe = get_classpath_entry_for_jvmti(path_index, CHECK_NULL); + assert(cpe != NULL, "must be"); + + Symbol* name = ik->name(); + const char* const class_name = name->as_C_string(); + const char* const file_name = ClassLoader::file_name_for_class_name(class_name, + name->utf8_length()); + return cpe->open_stream(file_name, THREAD); +} + +#endif diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/filemap.hpp --- a/src/hotspot/share/memory/filemap.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/filemap.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -302,6 +302,10 @@ bool validate_shared_path_table(); static void update_shared_classpath(ClassPathEntry *cpe, SharedClassPathEntry* ent, TRAPS); +#if INCLUDE_JVMTI + static ClassFileStream* open_stream_for_jvmti(InstanceKlass* ik, TRAPS); +#endif + static SharedClassPathEntry* shared_path(int index) { if (index < 0) { return NULL; @@ -348,6 +352,11 @@ } address decode_start_address(CDSFileMapRegion* spc, bool with_current_oop_encoding_mode); + +#if INCLUDE_JVMTI + static ClassPathEntry** _classpath_entries_for_jvmti; + static ClassPathEntry* get_classpath_entry_for_jvmti(int i, TRAPS); +#endif }; #endif // SHARE_MEMORY_FILEMAP_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/iterator.hpp --- a/src/hotspot/share/memory/iterator.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/iterator.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -263,6 +263,11 @@ virtual void do_code_blob(CodeBlob* cb); }; +class NMethodClosure : public Closure { + public: + virtual void do_nmethod(nmethod* n) = 0; +}; + // MonitorClosure is used for iterating over monitors in the monitors cache class ObjectMonitor; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/memRegion.hpp --- a/src/hotspot/share/memory/memRegion.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/memRegion.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -40,8 +40,6 @@ // create MemRegions (in CardTableBarrierSet) in heap so operator // new and operator new [] added for this special case. -class MetaWord; - class MemRegion { friend class VMStructs; private: diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/metaspace.hpp --- a/src/hotspot/share/memory/metaspace.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/metaspace.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -57,7 +57,6 @@ class ClassLoaderData; class MetaspaceTracer; -class MetaWord; class Mutex; class outputStream; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/metaspaceShared.cpp --- a/src/hotspot/share/memory/metaspaceShared.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/metaspaceShared.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -207,7 +207,7 @@ }; -DumpRegion _mc_region("mc"), _ro_region("ro"), _rw_region("rw"), _md_region("md"), _od_region("od"); +DumpRegion _mc_region("mc"), _ro_region("ro"), _rw_region("rw"), _md_region("md"); size_t _total_closed_archive_region_size = 0, _total_open_archive_region_size = 0; char* MetaspaceShared::misc_code_space_alloc(size_t num_bytes) { @@ -598,23 +598,6 @@ } } -static void relocate_cached_class_file() { - for (int i = 0; i < _global_klass_objects->length(); i++) { - Klass* k = _global_klass_objects->at(i); - if (k->is_instance_klass()) { - InstanceKlass* ik = InstanceKlass::cast(k); - JvmtiCachedClassFileData* p = ik->get_archived_class_data(); - if (p != NULL) { - int size = offset_of(JvmtiCachedClassFileData, data) + p->length; - JvmtiCachedClassFileData* q = (JvmtiCachedClassFileData*)_od_region.allocate(size); - q->length = p->length; - memcpy(q->data, p->data, p->length); - ik->set_archived_class_data(q); - } - } - } -} - // Objects of the Metadata types (such as Klass and ConstantPool) have C++ vtables. // (In GCC this is the field ::_vptr, i.e., first word in the object.) // @@ -1438,15 +1421,11 @@ char* vtbl_list = _md_region.top(); MetaspaceShared::allocate_cpp_vtable_clones(); - _md_region.pack(&_od_region); + _md_region.pack(); - // Relocate the archived class file data into the od region - relocate_cached_class_file(); - _od_region.pack(); - - // The 5 core spaces are allocated consecutively mc->rw->ro->md->od, so there total size + // The 4 core spaces are allocated consecutively mc->rw->ro->md, so there total size // is just the spaces between the two ends. - size_t core_spaces_size = _od_region.end() - _mc_region.base(); + size_t core_spaces_size = _md_region.end() - _mc_region.base(); assert(core_spaces_size == (size_t)align_up(core_spaces_size, Metaspace::reserve_alignment()), "should already be aligned"); @@ -1488,7 +1467,6 @@ write_region(mapinfo, MetaspaceShared::rw, &_rw_region, /*read_only=*/false,/*allow_exec=*/false); write_region(mapinfo, MetaspaceShared::ro, &_ro_region, /*read_only=*/true, /*allow_exec=*/false); write_region(mapinfo, MetaspaceShared::md, &_md_region, /*read_only=*/false,/*allow_exec=*/false); - write_region(mapinfo, MetaspaceShared::od, &_od_region, /*read_only=*/true, /*allow_exec=*/false); _total_closed_archive_region_size = mapinfo->write_archive_heap_regions( _closed_archive_heap_regions, @@ -1535,12 +1513,10 @@ // Print statistics of all the regions const size_t total_reserved = _ro_region.reserved() + _rw_region.reserved() + _mc_region.reserved() + _md_region.reserved() + - _od_region.reserved() + _total_closed_archive_region_size + _total_open_archive_region_size; const size_t total_bytes = _ro_region.used() + _rw_region.used() + _mc_region.used() + _md_region.used() + - _od_region.used() + _total_closed_archive_region_size + _total_open_archive_region_size; const double total_u_perc = percent_of(total_bytes, total_reserved); @@ -1549,7 +1525,6 @@ _rw_region.print(total_reserved); _ro_region.print(total_reserved); _md_region.print(total_reserved); - _od_region.print(total_reserved); print_heap_region_stats(_closed_archive_heap_regions, "ca", total_reserved); print_heap_region_stats(_open_archive_heap_regions, "oa", total_reserved); @@ -1931,33 +1906,30 @@ char* rw_base = NULL; char* rw_top; char* mc_base = NULL; char* mc_top; char* md_base = NULL; char* md_top; - char* od_base = NULL; char* od_top; // Map each shared region if ((mc_base = mapinfo->map_region(mc, &mc_top)) != NULL && (rw_base = mapinfo->map_region(rw, &rw_top)) != NULL && (ro_base = mapinfo->map_region(ro, &ro_top)) != NULL && (md_base = mapinfo->map_region(md, &md_top)) != NULL && - (od_base = mapinfo->map_region(od, &od_top)) != NULL && (image_alignment == (size_t)os::vm_allocation_granularity()) && mapinfo->validate_shared_path_table()) { // Success -- set up MetaspaceObj::_shared_metaspace_{base,top} for // fast checking in MetaspaceShared::is_in_shared_metaspace() and // MetaspaceObj::is_shared(). // - // We require that mc->rw->ro->md->od to be laid out consecutively, with no + // We require that mc->rw->ro->md to be laid out consecutively, with no // gaps between them. That way, we can ensure that the OS won't be able to // allocate any new memory spaces inside _shared_metaspace_{base,top}, which // would mess up the simple comparision in MetaspaceShared::is_in_shared_metaspace(). - assert(mc_base < ro_base && mc_base < rw_base && mc_base < md_base && mc_base < od_base, "must be"); - assert(od_top > ro_top && od_top > rw_top && od_top > md_top && od_top > mc_top , "must be"); + assert(mc_base < ro_base && mc_base < rw_base && mc_base < md_base, "must be"); + assert(md_top > ro_top && md_top > rw_top && md_top > mc_top , "must be"); assert(mc_top == rw_base, "must be"); assert(rw_top == ro_base, "must be"); assert(ro_top == md_base, "must be"); - assert(md_top == od_base, "must be"); _core_spaces_size = mapinfo->core_spaces_size(); - MetaspaceObj::set_shared_metaspace_range((void*)mc_base, (void*)od_top); + MetaspaceObj::set_shared_metaspace_range((void*)mc_base, (void*)md_top); return true; } else { // If there was a failure in mapping any of the spaces, unmap the ones @@ -1966,7 +1938,6 @@ if (rw_base != NULL) mapinfo->unmap_region(rw); if (mc_base != NULL) mapinfo->unmap_region(mc); if (md_base != NULL) mapinfo->unmap_region(md); - if (od_base != NULL) mapinfo->unmap_region(od); #ifndef _WINDOWS // Release the entire mapped region shared_rs.release(); @@ -2049,7 +2020,6 @@ _rw_region.print_out_of_space_msg(name, needed_bytes); _ro_region.print_out_of_space_msg(name, needed_bytes); _md_region.print_out_of_space_msg(name, needed_bytes); - _od_region.print_out_of_space_msg(name, needed_bytes); vm_exit_during_initialization(err_msg("Unable to allocate from '%s' region", name), "Please reduce the number of shared classes."); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/memory/metaspaceShared.hpp --- a/src/hotspot/share/memory/metaspaceShared.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/memory/metaspaceShared.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -69,14 +69,10 @@ ro = 2, // read-only shared space in the heap md = 3, // miscellaneous data for initializing tables, etc. num_core_spaces = 4, // number of non-string regions - - // optional mapped spaces - // Currently it only contains class file data. - od = num_core_spaces, - num_non_heap_spaces = od + 1, + num_non_heap_spaces = 4, // mapped java heap regions - first_closed_archive_heap_region = od + 1, + first_closed_archive_heap_region = md + 1, max_closed_archive_heap_region = 2, last_closed_archive_heap_region = first_closed_archive_heap_region + max_closed_archive_heap_region - 1, first_open_archive_heap_region = last_closed_archive_heap_region + 1, diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/array.hpp --- a/src/hotspot/share/oops/array.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/array.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -27,6 +27,7 @@ #include "memory/allocation.hpp" #include "memory/metaspace.hpp" +#include "runtime/orderAccess.hpp" #include "utilities/align.hpp" // Array for metadata allocation @@ -121,8 +122,8 @@ T* adr_at(const int i) { assert(i >= 0 && i< _length, "oob: 0 <= %d < %d", i, _length); return &_data[i]; } int find(const T& x) { return index_of(x); } - T at_acquire(const int which); - void release_at_put(int which, T contents); + T at_acquire(const int i) { return OrderAccess::load_acquire(adr_at(i)); } + void release_at_put(int i, T x) { OrderAccess::release_store(adr_at(i), x); } static int size(int length) { size_t bytes = align_up(byte_sizeof(length), BytesPerWord); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/array.inline.hpp --- a/src/hotspot/share/oops/array.inline.hpp Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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_OOPS_ARRAY_INLINE_HPP -#define SHARE_OOPS_ARRAY_INLINE_HPP - -#include "oops/array.hpp" -#include "runtime/orderAccess.hpp" - -template -inline T Array::at_acquire(const int which) { return OrderAccess::load_acquire(adr_at(which)); } - -template -inline void Array::release_at_put(int which, T contents) { OrderAccess::release_store(adr_at(which), contents); } - -#endif // SHARE_OOPS_ARRAY_INLINE_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/constantPool.cpp --- a/src/hotspot/share/oops/constantPool.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/constantPool.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -39,7 +39,7 @@ #include "memory/metaspaceShared.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" -#include "oops/array.inline.hpp" +#include "oops/array.hpp" #include "oops/constantPool.inline.hpp" #include "oops/cpCache.inline.hpp" #include "oops/instanceKlass.hpp" @@ -56,10 +56,6 @@ #include "runtime/vframe.inline.hpp" #include "utilities/copy.hpp" -constantTag ConstantPool::tag_at(int which) const { return (constantTag)tags()->at_acquire(which); } - -void ConstantPool::release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); } - ConstantPool* ConstantPool::allocate(ClassLoaderData* loader_data, int length, TRAPS) { Array* tags = MetadataFactory::new_array(loader_data, length, 0, CHECK_NULL); int size = ConstantPool::size(length); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/constantPool.hpp --- a/src/hotspot/share/oops/constantPool.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/constantPool.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -131,7 +131,7 @@ void set_tags(Array* tags) { _tags = tags; } void tag_at_put(int which, jbyte t) { tags()->at_put(which, t); } - void release_tag_at_put(int which, jbyte t); + void release_tag_at_put(int which, jbyte t) { tags()->release_at_put(which, t); } u1* tag_addr_at(int which) const { return tags()->adr_at(which); } @@ -379,7 +379,7 @@ // Tag query - constantTag tag_at(int which) const; + constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); } // Fetching constants diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/generateOopMap.cpp --- a/src/hotspot/share/oops/generateOopMap.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/generateOopMap.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -27,6 +27,7 @@ #include "logging/log.hpp" #include "logging/logStream.hpp" #include "memory/allocation.inline.hpp" +#include "oops/constantPool.hpp" #include "oops/generateOopMap.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/instanceKlass.cpp --- a/src/hotspot/share/oops/instanceKlass.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/instanceKlass.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -53,6 +53,7 @@ #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/fieldStreams.hpp" +#include "oops/constantPool.hpp" #include "oops/instanceClassLoaderKlass.hpp" #include "oops/instanceKlass.inline.hpp" #include "oops/instanceMirrorKlass.hpp" @@ -182,8 +183,14 @@ if (name == k->name()) { log_trace(class, nestmates)("- Found it at nest_members[%d] => cp[%d]", i, cp_index); - // names match so check actual klass - this may trigger class loading if - // it doesn't match (but that should be impossible) + // Names match so check actual klass - this may trigger class loading if + // it doesn't match (though that should be impossible). But to be safe we + // have to check for a compiler thread executing here. + if (!THREAD->can_call_java() && !_constants->tag_at(cp_index).is_klass()) { + log_trace(class, nestmates)("- validation required resolution in an unsuitable thread"); + return false; + } + Klass* k2 = _constants->klass_at(cp_index, CHECK_false); if (k2 == k) { log_trace(class, nestmates)("- class is listed as a nest member"); @@ -295,7 +302,7 @@ error); } - if (validationException != NULL) { + if (validationException != NULL && THREAD->can_call_java()) { ResourceMark rm(THREAD); Exceptions::fthrow(THREAD_AND_LOCATION, validationException, @@ -2346,6 +2353,7 @@ #if INCLUDE_JVMTI guarantee(_breakpoints == NULL, "must be"); guarantee(_previous_versions == NULL, "must be"); + _cached_class_file = NULL; #endif _init_thread = NULL; @@ -2502,7 +2510,7 @@ } // deallocate the cached class file - if (_cached_class_file != NULL && !MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) { + if (_cached_class_file != NULL) { os::free(_cached_class_file); _cached_class_file = NULL; } @@ -3963,12 +3971,7 @@ #if INCLUDE_JVMTI JvmtiCachedClassFileData* InstanceKlass::get_cached_class_file() { - if (MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) { - // Ignore the archived class stream data - return NULL; - } else { - return _cached_class_file; - } + return _cached_class_file; } jint InstanceKlass::get_cached_class_file_len() { @@ -3978,19 +3981,4 @@ unsigned char * InstanceKlass::get_cached_class_file_bytes() { return VM_RedefineClasses::get_cached_class_file_bytes(_cached_class_file); } - -#if INCLUDE_CDS -JvmtiCachedClassFileData* InstanceKlass::get_archived_class_data() { - if (DumpSharedSpaces) { - return _cached_class_file; - } else { - assert(this->is_shared(), "class should be shared"); - if (MetaspaceShared::is_in_shared_metaspace(_cached_class_file)) { - return _cached_class_file; - } else { - return NULL; - } - } -} #endif -#endif diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/instanceKlass.hpp --- a/src/hotspot/share/oops/instanceKlass.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/instanceKlass.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -847,14 +847,6 @@ JvmtiCachedClassFieldMap* jvmti_cached_class_field_map() const { return _jvmti_cached_class_field_map; } - -#if INCLUDE_CDS - void set_archived_class_data(JvmtiCachedClassFileData* data) { - _cached_class_file = data; - } - - JvmtiCachedClassFileData * get_archived_class_data(); -#endif // INCLUDE_CDS #else // INCLUDE_JVMTI static void purge_previous_versions(InstanceKlass* ik) { return; }; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/method.cpp --- a/src/hotspot/share/oops/method.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/method.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -42,6 +42,7 @@ #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" #include "oops/constMethod.hpp" +#include "oops/constantPool.hpp" #include "oops/method.inline.hpp" #include "oops/methodData.hpp" #include "oops/objArrayOop.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/oopHandle.hpp --- a/src/hotspot/share/oops/oopHandle.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/oopHandle.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -36,6 +36,7 @@ // future uses for read barriers. class OopHandle { + friend class VMStructs; private: oop* _obj; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/oops/reflectionAccessorImplKlassHelper.cpp --- a/src/hotspot/share/oops/reflectionAccessorImplKlassHelper.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/oops/reflectionAccessorImplKlassHelper.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -26,6 +26,7 @@ #include "precompiled.hpp" #include "classfile/systemDictionary.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.hpp" #include "oops/reflectionAccessorImplKlassHelper.hpp" #include "utilities/constantTag.hpp" #include "utilities/debug.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/opto/escape.cpp --- a/src/hotspot/share/opto/escape.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/opto/escape.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1726,6 +1726,18 @@ // access its field since the field value is unknown after it. // Node* n = field->ideal_node(); + + // Test for an unsafe access that was parsed as maybe off heap + // (with a CheckCastPP to raw memory). + assert(n->is_AddP(), "expect an address computation"); + if (n->in(AddPNode::Base)->is_top() && + n->in(AddPNode::Address)->Opcode() == Op_CheckCastPP) { + assert(n->in(AddPNode::Address)->bottom_type()->isa_rawptr(), "raw address so raw cast expected"); + assert(_igvn->type(n->in(AddPNode::Address)->in(1))->isa_oopptr(), "cast pattern at unsafe access expected"); + jobj->set_scalar_replaceable(false); + return; + } + for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { Node* u = n->fast_out(i); if (u->is_LoadStore() || (u->is_Mem() && u->as_Mem()->is_mismatched_access())) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/prims/jni.cpp --- a/src/hotspot/share/prims/jni.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/prims/jni.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -3953,9 +3953,6 @@ } #endif - // Tracks the time application was running before GC - RuntimeService::record_application_start(); - // Notify JVMTI if (JvmtiExport::should_post_thread_life()) { JvmtiExport::post_thread_start(thread); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/prims/jvm.cpp --- a/src/hotspot/share/prims/jvm.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/prims/jvm.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -45,6 +45,7 @@ #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/access.inline.hpp" +#include "oops/constantPool.hpp" #include "oops/fieldStreams.hpp" #include "oops/instanceKlass.hpp" #include "oops/method.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/prims/jvmtiRedefineClasses.cpp --- a/src/hotspot/share/prims/jvmtiRedefineClasses.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/prims/jvmtiRedefineClasses.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -39,6 +39,7 @@ #include "memory/metaspaceShared.hpp" #include "memory/resourceArea.hpp" #include "memory/universe.hpp" +#include "oops/constantPool.hpp" #include "oops/fieldStreams.hpp" #include "oops/klassVtable.hpp" #include "oops/oop.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/arguments.cpp --- a/src/hotspot/share/runtime/arguments.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/arguments.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -529,6 +529,7 @@ { "InitialRAMFraction", JDK_Version::jdk(10), JDK_Version::undefined(), JDK_Version::undefined() }, { "UseMembar", JDK_Version::jdk(10), JDK_Version::jdk(12), JDK_Version::undefined() }, { "CompilationPolicyChoice", JDK_Version::jdk(13), JDK_Version::jdk(14), JDK_Version::undefined() }, + { "FailOverToOldVerifier", JDK_Version::jdk(13), JDK_Version::jdk(14), JDK_Version::undefined() }, // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, @@ -555,13 +556,13 @@ { "UseImplicitStableValues", JDK_Version::undefined(), JDK_Version::jdk(13), JDK_Version::jdk(14) }, #ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS + // These entries will generate build errors. Their purpose is to test the macros. { "dep > obs", JDK_Version::jdk(9), JDK_Version::jdk(8), JDK_Version::undefined() }, { "dep > exp ", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(8) }, { "obs > exp ", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(8) }, { "not deprecated or obsolete", JDK_Version::undefined(), JDK_Version::undefined(), JDK_Version::jdk(9) }, { "dup option", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, { "dup option", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() }, - { "BytecodeVerificationRemote", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::undefined() }, #endif { NULL, JDK_Version(0), JDK_Version(0) } @@ -2453,9 +2454,15 @@ (is_absolute_path = match_option(option, "-agentpath:", &tail))) { if(tail != NULL) { const char* pos = strchr(tail, '='); - size_t len = (pos == NULL) ? strlen(tail) : pos - tail; - char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1, mtArguments), tail, len); - name[len] = '\0'; + char* name; + if (pos == NULL) { + name = os::strdup_check_oom(tail, mtArguments); + } else { + size_t len = pos - tail; + name = NEW_C_HEAP_ARRAY(char, len + 1, mtArguments); + memcpy(name, tail, len); + name[len] = '\0'; + } char *options = NULL; if(pos != NULL) { @@ -2749,6 +2756,7 @@ if (FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, false) != JVMFlag::SUCCESS) { return JNI_EINVAL; } + warning("Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release."); } else if (is_bad_option(option, args->ignoreUnrecognized, "verification")) { return JNI_EINVAL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/deoptimization.cpp --- a/src/hotspot/share/runtime/deoptimization.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/deoptimization.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -36,6 +36,7 @@ #include "memory/allocation.inline.hpp" #include "memory/oopFactory.hpp" #include "memory/resourceArea.hpp" +#include "oops/constantPool.hpp" #include "oops/method.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/fieldDescriptor.cpp --- a/src/hotspot/share/runtime/fieldDescriptor.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/fieldDescriptor.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -28,6 +28,7 @@ #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/annotations.hpp" +#include "oops/constantPool.hpp" #include "oops/instanceKlass.hpp" #include "oops/oop.inline.hpp" #include "oops/fieldStreams.hpp" diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/init.cpp --- a/src/hotspot/share/runtime/init.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/init.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -174,10 +174,7 @@ ObjectSynchronizer::audit_and_print_stats(true /* on_exit */); } perfMemory_exit(); - if (log_is_enabled(Debug, safepoint, stats)) { - // Print the collected safepoint statistics. - SafepointSynchronize::print_stat_on_exit(); - } + SafepointTracing::statistics_exit_log(); if (PrintStringTableStatistics) { SymbolTable::dump(tty); StringTable::dump(tty); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/monitorChunk.cpp --- a/src/hotspot/share/runtime/monitorChunk.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/monitorChunk.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ MonitorChunk::MonitorChunk(int number_on_monitors) { _number_of_monitors = number_on_monitors; - _monitors = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors, mtInternal); + _monitors = NEW_C_HEAP_ARRAY(BasicObjectLock, number_on_monitors, mtSynchronizer); _next = NULL; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/monitorChunk.hpp --- a/src/hotspot/share/runtime/monitorChunk.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/monitorChunk.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -30,7 +30,7 @@ // Data structure for holding monitors for one activation during // deoptimization. -class MonitorChunk: public CHeapObj { +class MonitorChunk: public CHeapObj { private: int _number_of_monitors; BasicObjectLock* _monitors; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/mutex.hpp --- a/src/hotspot/share/runtime/mutex.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/mutex.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -39,7 +39,7 @@ // TODO: Check if _name[MONITOR_NAME_LEN] should better get replaced by const char*. static const int MONITOR_NAME_LEN = 64; -class Monitor : public CHeapObj { +class Monitor : public CHeapObj { public: // A special lock: Is a lock where you are guaranteed not to block while you are diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/mutexLocker.cpp --- a/src/hotspot/share/runtime/mutexLocker.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/mutexLocker.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -150,6 +150,9 @@ #if INCLUDE_NMT Mutex* NMTQuery_lock = NULL; #endif +#if INCLUDE_CDS && INCLUDE_JVMTI +Mutex* CDSClassFileStream_lock = NULL; +#endif #define MAX_NUM_MUTEX 128 static Monitor * _mutex_array[MAX_NUM_MUTEX]; @@ -339,6 +342,9 @@ #if INCLUDE_NMT def(NMTQuery_lock , PaddedMutex , max_nonleaf, false, Monitor::_safepoint_check_always); #endif +#if INCLUDE_CDS && INCLUDE_JVMTI + def(CDSClassFileStream_lock , PaddedMutex , max_nonleaf, false, Monitor::_safepoint_check_always); +#endif } GCMutexLocker::GCMutexLocker(Monitor * mutex) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/mutexLocker.hpp --- a/src/hotspot/share/runtime/mutexLocker.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/mutexLocker.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -133,6 +133,9 @@ #if INCLUDE_NMT extern Mutex* NMTQuery_lock; // serialize NMT Dcmd queries #endif +#if INCLUDE_CDS && INCLUDE_JVMTI +extern Mutex* CDSClassFileStream_lock; // FileMapInfo::open_stream_for_jvmti +#endif #if INCLUDE_JFR extern Mutex* JfrStacktrace_lock; // used to guard access to the JFR stacktrace table extern Monitor* JfrMsg_lock; // protects JFR messaging diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/safepoint.cpp --- a/src/hotspot/share/runtime/safepoint.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/safepoint.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -103,16 +103,6 @@ } } -static void post_safepoint_wait_blocked_event(EventSafepointWaitBlocked& event, - uint64_t safepoint_id, - int initial_threads_waiting_to_block) { - if (event.should_commit()) { - event.set_safepointId(safepoint_id); - event.set_runningThreadCount(initial_threads_waiting_to_block); - event.commit(); - } -} - static void post_safepoint_cleanup_task_event(EventSafepointCleanupTask& event, uint64_t safepoint_id, const char* name) { @@ -138,27 +128,21 @@ volatile uint64_t SafepointSynchronize::_safepoint_counter = 0; const uint64_t SafepointSynchronize::InactiveSafepointCounter = 0; int SafepointSynchronize::_current_jni_active_count = 0; -long SafepointSynchronize::_end_of_last_safepoint = 0; WaitBarrier* SafepointSynchronize::_wait_barrier; -// We need a place to save the desc since it is released before we need it. -static char stopped_description[64] = ""; -static bool _vm_is_waiting = false; - static volatile bool PageArmed = false; // safepoint polling page is RO|RW vs PROT_NONE static bool timeout_error_printed = false; // Statistic related -julong SafepointSynchronize::_coalesced_vmop_count = 0; static jlong _safepoint_begin_time = 0; -static float _ts_of_current_safepoint = 0.0f; static volatile int _nof_threads_hit_polling_page = 0; void SafepointSynchronize::init(Thread* vmthread) { // WaitBarrier should never be destroyed since we will have // threads waiting on it while exiting. _wait_barrier = new WaitBarrier(vmthread); + SafepointTracing::init(); } void SafepointSynchronize::increment_jni_active_count() { @@ -244,16 +228,13 @@ DEBUG_ONLY(assert_list_is_valid(tss_head, still_running);) *initial_running = still_running; - if (log_is_enabled(Debug, safepoint, stats)) { - begin_statistics(nof_threads, still_running); - } int iterations = 1; // The first iteration is above. while (still_running > 0) { // Check if this has taken too long: if (SafepointTimeout && safepoint_limit_time < os::javaTimeNanos()) { - print_safepoint_timeout(_spinning_timeout); + print_safepoint_timeout(); } if (int(iterations) == -1) { // overflow - something is wrong. // We can only overflow here when we are using global @@ -291,9 +272,6 @@ assert(tss_head == NULL, "Must be empty"); - if (log_is_enabled(Debug, safepoint, stats)) { - update_statistics_on_spin_end(); - } return iterations; } @@ -303,8 +281,11 @@ // stopped by different mechanisms: // // 1. Running interpreted - // The interpreter dispatch table is changed to force it to - // check for a safepoint condition between bytecodes. + // When executing branching/returning byte codes interpreter + // checks if the poll is armed, if so blocks in SS::block(). + // When using global polling the interpreter dispatch table + // is changed to force it to check for a safepoint condition + // between bytecodes. // 2. Running in native code // When returning from the native code, a Java thread must check // the safepoint _state to see if we must block. If the @@ -322,9 +303,9 @@ // block condition until the safepoint operation is complete. // 5. In VM or Transitioning between states // If a Java thread is currently running in the VM or transitioning - // between states, the safepointing code will wait for the thread to - // block itself when it attempts transitions to a new state. - // + // between states, the safepointing code will poll the thread state + // until the thread blocks itself when it attempts transitions to a + // new state or locking a safepoint checked monitor. // We must never miss a thread with correct safepoint id, so we must make sure we arm // the wait barrier for the next safepoint id/counter. @@ -363,17 +344,10 @@ // Roll all threads forward to a safepoint and suspend them all void SafepointSynchronize::begin() { - EventSafepointBegin begin_event; assert(Thread::current()->is_VM_thread(), "Only VM thread may execute a safepoint"); - strncpy(stopped_description, VMThread::vm_safepoint_description(), sizeof(stopped_description) - 1); - stopped_description[sizeof(stopped_description) - 1] = '\0'; - - if (log_is_enabled(Debug, safepoint, stats)) { - _safepoint_begin_time = os::javaTimeNanos(); - _ts_of_current_safepoint = tty->time_stamp().seconds(); - _nof_threads_hit_polling_page = 0; - } + EventSafepointBegin begin_event; + SafepointTracing::begin(VMThread::vm_op_type()); Universe::heap()->safepoint_synchronize_begin(); @@ -385,9 +359,9 @@ int nof_threads = Threads::number_of_threads(); - log_debug(safepoint)("Safepoint synchronization initiated using %s wait barrier. (%d threads)", _wait_barrier->description(), nof_threads); + _nof_threads_hit_polling_page = 0; - RuntimeService::record_safepoint_begin(); + log_debug(safepoint)("Safepoint synchronization initiated using %s wait barrier. (%d threads)", _wait_barrier->description(), nof_threads); // Reset the count of active JNI critical threads _current_jni_active_count = 0; @@ -399,9 +373,9 @@ if (SafepointTimeout) { // Set the limit time, so that it can be compared to see if this has taken // too long to complete. - safepoint_limit_time = os::javaTimeNanos() + (jlong)SafepointTimeoutDelay * MICROUNITS; + safepoint_limit_time = SafepointTracing::start_of_safepoint() + (jlong)SafepointTimeoutDelay * (NANOUNITS / MILLIUNITS); + timeout_error_printed = false; } - timeout_error_printed = false; EventSafepointStateSynchronization sync_event; int initial_running = 0; @@ -413,20 +387,13 @@ int iterations = synchronize_threads(safepoint_limit_time, nof_threads, &initial_running); assert(_waiting_to_block == 0, "No thread should be running"); - post_safepoint_synchronize_event(sync_event, _safepoint_counter, initial_running, - _waiting_to_block, iterations); - - // Keep event from now. - EventSafepointWaitBlocked wait_blocked_event; - #ifndef PRODUCT - if (SafepointTimeout) { + if (safepoint_limit_time != 0) { jlong current_time = os::javaTimeNanos(); if (safepoint_limit_time < current_time) { log_warning(safepoint)("# SafepointSynchronize: Finished after " INT64_FORMAT_W(6) " ms", - (int64_t)((current_time - safepoint_limit_time) / MICROUNITS + - (jlong)SafepointTimeoutDelay)); + (int64_t)(current_time - SafepointTracing::start_of_safepoint()) / (NANOUNITS / MILLIUNITS)); } } #endif @@ -438,8 +405,6 @@ OrderAccess::fence(); - post_safepoint_wait_blocked_event(wait_blocked_event, _safepoint_counter, 0); - #ifdef ASSERT // Make sure all the threads were visited. for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur = jtiwh.next(); ) { @@ -450,12 +415,12 @@ // Update the count of active JNI critical regions GCLocker::set_jni_lock_count(_current_jni_active_count); - log_info(safepoint)("Entering safepoint region: %s", stopped_description); + post_safepoint_synchronize_event(sync_event, + _safepoint_counter, + initial_running, + _waiting_to_block, iterations); - RuntimeService::record_safepoint_synchronized(); - if (log_is_enabled(Debug, safepoint, stats)) { - update_statistics_on_sync_end(os::javaTimeNanos()); - } + SafepointTracing::synchronized(nof_threads, initial_running, _nof_threads_hit_polling_page); // We do the safepoint cleanup first since a GC related safepoint // needs cleanup to be completed before running the GC op. @@ -463,12 +428,8 @@ do_cleanup_tasks(); post_safepoint_cleanup_event(cleanup_event, _safepoint_counter); - if (log_is_enabled(Debug, safepoint, stats)) { - // Record how much time spend on the above cleanup tasks - update_statistics_on_cleanup_end(os::javaTimeNanos()); - } - post_safepoint_begin_event(begin_event, _safepoint_counter, nof_threads, _current_jni_active_count); + SafepointTracing::cleanup(); } void SafepointSynchronize::disarm_safepoint() { @@ -520,10 +481,6 @@ } } // ~JavaThreadIteratorWithHandle - log_info(safepoint)("Leaving safepoint region"); - - RuntimeService::record_safepoint_end(); - // Release threads lock, so threads can be created/destroyed again. Threads_lock->unlock(); @@ -539,19 +496,11 @@ uint64_t safepoint_id = _safepoint_counter; assert(Thread::current()->is_VM_thread(), "Only VM thread can execute a safepoint"); - if (log_is_enabled(Debug, safepoint, stats)) { - end_statistics(os::javaTimeNanos()); - } - disarm_safepoint(); - RuntimeService::record_safepoint_epilog(stopped_description); - Universe::heap()->safepoint_synchronize_end(); - // record this time so VMThread can keep track how much time has elapsed - // since last safepoint. - _end_of_last_safepoint = os::javaTimeMillis(); + SafepointTracing::end(); post_safepoint_end_event(event, safepoint_id); } @@ -915,7 +864,7 @@ assert(SafepointSynchronize::is_synchronizing(), "polling encountered outside safepoint synchronization"); } - if (log_is_enabled(Debug, safepoint, stats)) { + if (log_is_enabled(Info, safepoint, stats)) { Atomic::inc(&_nof_threads_hit_polling_page); } @@ -925,7 +874,7 @@ } -void SafepointSynchronize::print_safepoint_timeout(SafepointTimeoutReason reason) { +void SafepointSynchronize::print_safepoint_timeout() { if (!timeout_error_printed) { timeout_error_printed = true; // Print out the thread info which didn't reach the safepoint for debugging @@ -937,20 +886,10 @@ ls.cr(); ls.print_cr("# SafepointSynchronize::begin: Timeout detected:"); - if (reason == _spinning_timeout) { - ls.print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint."); - } else if (reason == _blocking_timeout) { - ls.print_cr("# SafepointSynchronize::begin: Timed out while waiting for threads to stop."); - } - + ls.print_cr("# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint."); ls.print_cr("# SafepointSynchronize::begin: Threads which did not reach the safepoint:"); - ThreadSafepointState *cur_state; for (JavaThreadIteratorWithHandle jtiwh; JavaThread *cur_thread = jtiwh.next(); ) { - cur_state = cur_thread->safepoint_state(); - - if (cur_thread->thread_state() != _thread_blocked && - ((reason == _spinning_timeout && cur_state->is_running()) || - (reason == _blocking_timeout))) { + if (cur_thread->safepoint_state()->is_running()) { ls.print("# "); cur_thread->print_on(&ls); ls.cr(); @@ -964,11 +903,10 @@ // ShowMessageBoxOnError. if (AbortVMOnSafepointTimeout) { fatal("Safepoint sync time longer than " INTX_FORMAT "ms detected when executing %s.", - SafepointTimeoutDelay, VMThread::vm_safepoint_description()); + SafepointTimeoutDelay, VMThread::vm_operation()->name()); } } - // ------------------------------------------------------------------------------------------------------- // Implementation of ThreadSafepointState @@ -1176,108 +1114,25 @@ } -// -// Statistics & Instrumentations -// -struct SafepointStats { - float _time_stamp; // record when the current safepoint occurs in seconds - int _vmop_type; // tyep of VM operation triggers the safepoint - int _nof_total_threads; // total number of Java threads - int _nof_initial_running_threads; // total number of initially seen running threads - int _nof_threads_wait_to_block; // total number of threads waiting for to block - bool _page_armed; // true if polling page is armed, false otherwise - int _nof_threads_hit_page_trap; // total number of threads hitting the page trap - jlong _time_to_spin; // total time in millis spent in spinning - jlong _time_to_wait_to_block; // total time in millis spent in waiting for to block - jlong _time_to_do_cleanups; // total time in millis spent in performing cleanups - jlong _time_to_sync; // total time in millis spent in getting to _synchronized - jlong _time_to_exec_vmop; // total time in millis spent in vm operation itself -}; - -static const int _statistics_header_count = 30; -static int _cur_stat_index = 0; -static SafepointStats safepoint_stats = {0}; // zero initialize -static SafepointStats* spstat = &safepoint_stats; - -static julong _safepoint_reasons[VM_Operation::VMOp_Terminating]; -static jlong _max_sync_time = 0; -static jlong _max_vmop_time = 0; - -static jlong cleanup_end_time = 0; - -void SafepointSynchronize::begin_statistics(int nof_threads, int nof_running) { - - spstat->_time_stamp = _ts_of_current_safepoint; - - VM_Operation *op = VMThread::vm_operation(); - spstat->_vmop_type = op != NULL ? op->type() : VM_Operation::VMOp_None; - _safepoint_reasons[spstat->_vmop_type]++; - - spstat->_nof_total_threads = nof_threads; - spstat->_nof_initial_running_threads = nof_running; - - // Records the start time of spinning. The real time spent on spinning - // will be adjusted when spin is done. Same trick is applied for time - // spent on waiting for threads to block. - if (nof_running != 0) { - spstat->_time_to_spin = os::javaTimeNanos(); - } else { - spstat->_time_to_spin = 0; - } -} +// ------------------------------------------------------------------------------------------------------- +// Implementation of SafepointTracing -void SafepointSynchronize::update_statistics_on_spin_end() { - jlong cur_time = os::javaTimeNanos(); - - spstat->_nof_threads_wait_to_block = _waiting_to_block; - if (spstat->_nof_initial_running_threads != 0) { - spstat->_time_to_spin = cur_time - spstat->_time_to_spin; - } - - // Records the start time of waiting for to block. Updated when block is done. - if (_waiting_to_block != 0) { - spstat->_time_to_wait_to_block = cur_time; - } else { - spstat->_time_to_wait_to_block = 0; - } -} - -void SafepointSynchronize::update_statistics_on_sync_end(jlong end_time) { - - if (spstat->_nof_threads_wait_to_block != 0) { - spstat->_time_to_wait_to_block = end_time - - spstat->_time_to_wait_to_block; - } +jlong SafepointTracing::_last_safepoint_begin_time_ns = 0; +jlong SafepointTracing::_last_safepoint_sync_time_ns = 0; +jlong SafepointTracing::_last_safepoint_cleanup_time_ns = 0; +jlong SafepointTracing::_last_safepoint_end_time_ns = 0; +jlong SafepointTracing::_last_app_time_ns = 0; +int SafepointTracing::_nof_threads = 0; +int SafepointTracing::_nof_running = 0; +int SafepointTracing::_page_trap = 0; +VM_Operation::VMOp_Type SafepointTracing::_current_type; +jlong SafepointTracing::_max_sync_time = 0; +jlong SafepointTracing::_max_vmop_time = 0; +uint64_t SafepointTracing::_op_count[VM_Operation::VMOp_Terminating] = {0}; - // Records the end time of sync which will be used to calculate the total - // vm operation time. Again, the real time spending in syncing will be deducted - // from the start of the sync time later when end_statistics is called. - spstat->_time_to_sync = end_time - _safepoint_begin_time; - if (spstat->_time_to_sync > _max_sync_time) { - _max_sync_time = spstat->_time_to_sync; - } - - spstat->_time_to_do_cleanups = end_time; -} - -void SafepointSynchronize::update_statistics_on_cleanup_end(jlong end_time) { - - // Record how long spent in cleanup tasks. - spstat->_time_to_do_cleanups = end_time - spstat->_time_to_do_cleanups; - cleanup_end_time = end_time; -} - -void SafepointSynchronize::end_statistics(jlong vmop_end_time) { - - // Update the vm operation time. - spstat->_time_to_exec_vmop = vmop_end_time - cleanup_end_time; - if (spstat->_time_to_exec_vmop > _max_vmop_time) { - _max_vmop_time = spstat->_time_to_exec_vmop; - } - - spstat->_nof_threads_hit_page_trap = _nof_threads_hit_polling_page; - - print_statistics(); +void SafepointTracing::init() { + // Application start + _last_safepoint_end_time_ns = os::javaTimeNanos(); } // Helper method to print the header. @@ -1285,66 +1140,121 @@ // The number of spaces is significant here, and should match the format // specifiers in print_statistics(). - st->print(" vmop " - "[ threads: total initially_running wait_to_block ]" - "[ time: spin block sync cleanup vmop ] "); + st->print("VM Operation " + "[ threads: total initial_running ]" + "[ time: sync cleanup vmop total ]"); - st->print_cr("page_trap_count"); + st->print_cr(" page_trap_count"); } // This prints a nice table. To get the statistics to not shift due to the logging uptime -// decorator, use the option as: -Xlog:safepoint+stats=debug:[outputfile]:none -void SafepointSynchronize::print_statistics() { - LogTarget(Debug, safepoint, stats) lt; +// decorator, use the option as: -Xlog:safepoint+stats:[outputfile]:none +void SafepointTracing::statistics_log() { + LogTarget(Info, safepoint, stats) lt; assert (lt.is_enabled(), "should only be called when printing statistics is enabled"); LogStream ls(lt); + static int _cur_stat_index = 0; + // Print header every 30 entries - if ((_cur_stat_index % _statistics_header_count) == 0) { + if ((_cur_stat_index % 30) == 0) { print_header(&ls); _cur_stat_index = 1; // wrap } else { _cur_stat_index++; } - ls.print("%8.3f: ", spstat->_time_stamp); - ls.print("%-28s [ " - INT32_FORMAT_W(8) " " INT32_FORMAT_W(17) " " INT32_FORMAT_W(13) " " + ls.print("%-28s [ " + INT32_FORMAT_W(8) " " INT32_FORMAT_W(8) " " "]", - VM_Operation::name(spstat->_vmop_type), - spstat->_nof_total_threads, - spstat->_nof_initial_running_threads, - spstat->_nof_threads_wait_to_block); - // "/ MICROUNITS " is to convert the unit from nanos to millis. + VM_Operation::name(_current_type), + _nof_threads, + _nof_running); ls.print("[ " - INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " " - INT64_FORMAT_W(7) " " INT64_FORMAT_W(7) " " - INT64_FORMAT_W(7) " ] ", - (int64_t)(spstat->_time_to_spin / MICROUNITS), - (int64_t)(spstat->_time_to_wait_to_block / MICROUNITS), - (int64_t)(spstat->_time_to_sync / MICROUNITS), - (int64_t)(spstat->_time_to_do_cleanups / MICROUNITS), - (int64_t)(spstat->_time_to_exec_vmop / MICROUNITS)); + INT64_FORMAT_W(10) " " INT64_FORMAT_W(10) " " + INT64_FORMAT_W(10) " " INT64_FORMAT_W(10) " ]", + (int64_t)(_last_safepoint_sync_time_ns - _last_safepoint_begin_time_ns), + (int64_t)(_last_safepoint_cleanup_time_ns - _last_safepoint_sync_time_ns), + (int64_t)(_last_safepoint_end_time_ns - _last_safepoint_cleanup_time_ns), + (int64_t)(_last_safepoint_end_time_ns - _last_safepoint_begin_time_ns)); - ls.print_cr(INT32_FORMAT_W(15) " ", spstat->_nof_threads_hit_page_trap); + ls.print_cr(INT32_FORMAT_W(16), _page_trap); } // This method will be called when VM exits. This tries to summarize the sampling. // Current thread may already be deleted, so don't use ResourceMark. -void SafepointSynchronize::print_stat_on_exit() { - +void SafepointTracing::statistics_exit_log() { + if (!log_is_enabled(Info, safepoint, stats)) { + return; + } for (int index = 0; index < VM_Operation::VMOp_Terminating; index++) { - if (_safepoint_reasons[index] != 0) { - log_debug(safepoint, stats)("%-28s" UINT64_FORMAT_W(10), VM_Operation::name(index), - _safepoint_reasons[index]); + if (_op_count[index] != 0) { + log_info(safepoint, stats)("%-28s" UINT64_FORMAT_W(10), VM_Operation::name(index), + _op_count[index]); } } - log_debug(safepoint, stats)("VM operations coalesced during safepoint " INT64_FORMAT, - _coalesced_vmop_count); - log_debug(safepoint, stats)("Maximum sync time " INT64_FORMAT" ms", - (int64_t)(_max_sync_time / MICROUNITS)); - log_debug(safepoint, stats)("Maximum vm operation time (except for Exit VM operation) " - INT64_FORMAT " ms", - (int64_t)(_max_vmop_time / MICROUNITS)); + log_info(safepoint, stats)("VM operations coalesced during safepoint " INT64_FORMAT, + VMThread::get_coalesced_count()); + log_info(safepoint, stats)("Maximum sync time " INT64_FORMAT" ns", + (int64_t)(_max_sync_time)); + log_info(safepoint, stats)("Maximum vm operation time (except for Exit VM operation) " + INT64_FORMAT " ns", + (int64_t)(_max_vmop_time)); +} + +void SafepointTracing::begin(VM_Operation::VMOp_Type type) { + _op_count[type]++; + _current_type = type; + + // update the time stamp to begin recording safepoint time + _last_safepoint_begin_time_ns = os::javaTimeNanos(); + _last_safepoint_sync_time_ns = 0; + _last_safepoint_cleanup_time_ns = 0; + + _last_app_time_ns = _last_safepoint_begin_time_ns - _last_safepoint_end_time_ns; + _last_safepoint_end_time_ns = 0; + + RuntimeService::record_safepoint_begin(_last_app_time_ns); +} + +void SafepointTracing::synchronized(int nof_threads, int nof_running, int traps) { + _last_safepoint_sync_time_ns = os::javaTimeNanos(); + _nof_threads = nof_threads; + _nof_running = nof_running; + _page_trap = traps; + RuntimeService::record_safepoint_synchronized(_last_safepoint_sync_time_ns - _last_safepoint_begin_time_ns); } + +void SafepointTracing::cleanup() { + _last_safepoint_cleanup_time_ns = os::javaTimeNanos(); +} + +void SafepointTracing::end() { + _last_safepoint_end_time_ns = os::javaTimeNanos(); + + if (_max_sync_time < (_last_safepoint_sync_time_ns - _last_safepoint_begin_time_ns)) { + _max_sync_time = _last_safepoint_sync_time_ns - _last_safepoint_begin_time_ns; + } + if (_max_vmop_time < (_last_safepoint_end_time_ns - _last_safepoint_sync_time_ns)) { + _max_vmop_time = _last_safepoint_end_time_ns - _last_safepoint_sync_time_ns; + } + if (log_is_enabled(Info, safepoint, stats)) { + statistics_log(); + } + + log_info(safepoint)( + "Safepoint \"%s\", " + "Time since last: " JLONG_FORMAT " ns, " + "Reaching safepoint: " JLONG_FORMAT " ns, " + "At safepoint: " JLONG_FORMAT " ns, " + "Total: " JLONG_FORMAT " ns", + VM_Operation::name(_current_type), + _last_app_time_ns, + _last_safepoint_cleanup_time_ns - _last_safepoint_begin_time_ns, + _last_safepoint_end_time_ns - _last_safepoint_cleanup_time_ns, + _last_safepoint_end_time_ns - _last_safepoint_begin_time_ns + ); + + RuntimeService::record_safepoint_end(_last_safepoint_end_time_ns - _last_safepoint_cleanup_time_ns); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/safepoint.hpp --- a/src/hotspot/share/runtime/safepoint.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/safepoint.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -28,6 +28,7 @@ #include "memory/allocation.hpp" #include "runtime/os.hpp" #include "runtime/thread.hpp" +#include "runtime/vmOperations.hpp" #include "utilities/ostream.hpp" #include "utilities/waitBarrier.hpp" @@ -77,11 +78,6 @@ friend class ThreadSafepointState; friend class HandshakeState; - enum SafepointTimeoutReason { - _spinning_timeout = 0, - _blocking_timeout = 1 - }; - // Threads might read this flag directly, without acquiring the Threads_lock: static volatile SynchronizeState _state; // Number of threads we are waiting for to block: @@ -110,7 +106,7 @@ static void print_statistics(); // For debug long safepoint - static void print_safepoint_timeout(SafepointTimeoutReason timeout_reason); + static void print_safepoint_timeout(); // Helper methods for safepoint procedure: static void arm_safepoint(); @@ -150,19 +146,9 @@ // Exception handling for page polling static void handle_polling_page_exception(JavaThread *thread); - // VM Thread interface for determining safepoint rate - static long last_non_safepoint_interval() { - return os::javaTimeMillis() - _end_of_last_safepoint; - } - static long end_of_last_safepoint() { - return _end_of_last_safepoint; - } static bool is_cleanup_needed(); static void do_cleanup_tasks(); - static void print_stat_on_exit(); - static void inc_vmop_coalesced_count() { _coalesced_vmop_count++; } - static void set_is_at_safepoint() { _state = _synchronized; } static void set_is_not_at_safepoint() { _state = _not_synchronized; } @@ -197,7 +183,7 @@ assert(!SafepointSynchronize::is_at_safepoint(), __VA_ARGS__) // State class for a thread suspended at a safepoint -class ThreadSafepointState: public CHeapObj { +class ThreadSafepointState: public CHeapObj { private: // At polling page safepoint (NOT a poll return safepoint): volatile bool _at_poll_safepoint; @@ -247,6 +233,48 @@ static void destroy(JavaThread *thread); }; +class SafepointTracing : public AllStatic { +private: + // Absolute + static jlong _last_safepoint_begin_time_ns; + static jlong _last_safepoint_sync_time_ns; + static jlong _last_safepoint_cleanup_time_ns; + static jlong _last_safepoint_end_time_ns; + // Relative + static jlong _last_app_time_ns; + static int _nof_threads; + static int _nof_running; + static int _page_trap; + + static VM_Operation::VMOp_Type _current_type; + static jlong _max_sync_time; + static jlong _max_vmop_time; + static uint64_t _op_count[VM_Operation::VMOp_Terminating]; + + static void statistics_log(); + +public: + static void init(); + + static void begin(VM_Operation::VMOp_Type type); + static void synchronized(int nof_threads, int nof_running, int traps); + static void cleanup(); + static void end(); + + static void statistics_exit_log(); + + static jlong time_since_last_safepoint_ms() { + return (os::javaTimeNanos() - _last_safepoint_end_time_ns) / (NANOUNITS / MILLIUNITS); + } + + static jlong end_of_last_safepoint_ms() { + return _last_safepoint_end_time_ns / (NANOUNITS / MILLIUNITS); + } + + static jlong start_of_safepoint() { + return _last_safepoint_begin_time_ns; + } +}; #endif // SHARE_RUNTIME_SAFEPOINT_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/semaphore.hpp --- a/src/hotspot/share/runtime/semaphore.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/semaphore.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -40,7 +40,7 @@ class JavaThread; // Implements the limited, platform independent Semaphore API. -class Semaphore : public CHeapObj { +class Semaphore : public CHeapObj { SemaphoreImpl _impl; // Prevent copying and assignment of Semaphore instances. diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/tieredThresholdPolicy.cpp --- a/src/hotspot/share/runtime/tieredThresholdPolicy.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/tieredThresholdPolicy.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -479,7 +479,7 @@ // We don't update the rate if we've just came out of a safepoint. // delta_s is the time since last safepoint in milliseconds. - jlong delta_s = t - SafepointSynchronize::end_of_last_safepoint(); + jlong delta_s = t - SafepointTracing::end_of_last_safepoint_ms(); jlong delta_t = t - (m->prev_time() != 0 ? m->prev_time() : start_time()); // milliseconds since the last measurement // How many events were there since the last time? int event_count = m->invocation_count() + m->backedge_count(); @@ -504,7 +504,7 @@ // Check if this method has been stale from a given number of milliseconds. // See select_task(). bool TieredThresholdPolicy::is_stale(jlong t, jlong timeout, Method* m) { - jlong delta_s = t - SafepointSynchronize::end_of_last_safepoint(); + jlong delta_s = t - SafepointTracing::end_of_last_safepoint_ms(); jlong delta_t = t - m->prev_time(); if (delta_t > timeout && delta_s > timeout) { int event_count = m->invocation_count() + m->backedge_count(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/vmOperations.hpp --- a/src/hotspot/share/runtime/vmOperations.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/vmOperations.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -41,6 +41,7 @@ // Note: When new VM_XXX comes up, add 'XXX' to the template table. #define VM_OPS_DO(template) \ template(None) \ + template(Cleanup) \ template(ThreadStop) \ template(ThreadDump) \ template(PrintThreads) \ @@ -213,7 +214,7 @@ // Debugging virtual void print_on_error(outputStream* st) const; - const char* name() const { return _names[type()]; } + virtual const char* name() const { return _names[type()]; } static const char* name(int type) { assert(type >= 0 && type < VMOp_Terminating, "invalid VM operation type"); return _names[type]; @@ -223,6 +224,21 @@ #endif }; +class VM_None: public VM_Operation { + const char* _reason; + public: + VM_None(const char* reason) : _reason(reason) {} + const char* name() const { return _reason; } + VMOp_Type type() const { return VMOp_None; } + void doit() {}; +}; + +class VM_Cleanup: public VM_Operation { + public: + VMOp_Type type() const { return VMOp_Cleanup; } + void doit() {}; +}; + class VM_ThreadStop: public VM_Operation { private: oop _thread; // The Thread that the Throwable is thrown against diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/vmStructs.cpp --- a/src/hotspot/share/runtime/vmStructs.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/vmStructs.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -332,6 +332,7 @@ unchecked_nonstatic_field(Symbol, _body, sizeof(u1)) /* NOTE: no type */ \ nonstatic_field(Symbol, _body[0], u1) \ nonstatic_field(TypeArrayKlass, _max_length, jint) \ + nonstatic_field(OopHandle, _obj, oop*) \ \ /***********************/ \ /* Constant Pool Cache */ \ @@ -1299,7 +1300,8 @@ declare_oop_type(oop) \ declare_oop_type(narrowOop) \ declare_oop_type(typeArrayOop) \ - declare_oop_type(OopHandle) \ + \ + declare_toplevel_type(OopHandle) \ \ /*************************************/ \ /* MethodOop-related data structures */ \ diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/vmThread.cpp --- a/src/hotspot/share/runtime/vmThread.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/vmThread.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -48,19 +48,13 @@ #include "utilities/vmError.hpp" #include "utilities/xmlstream.hpp" -// Dummy VM operation to act as first element in our circular double-linked list -class VM_None: public VM_Operation { - VMOp_Type type() const { return VMOp_None; } - void doit() {}; -}; - VMOperationQueue::VMOperationQueue() { // The queue is a circular doubled-linked list, which always contains // one element (i.e., one element means empty). for(int i = 0; i < nof_priorities; i++) { _queue_length[i] = 0; _queue_counter = 0; - _queue[i] = new VM_None(); + _queue[i] = new VM_None("QueueHead"); _queue[i]->set_next(_queue[i]); _queue[i]->set_prev(_queue[i]); } @@ -229,14 +223,14 @@ //------------------------------------------------------------------------------------------------------------------ // Implementation of VMThread stuff -bool VMThread::_should_terminate = false; +bool VMThread::_should_terminate = false; bool VMThread::_terminated = false; Monitor* VMThread::_terminate_lock = NULL; VMThread* VMThread::_vm_thread = NULL; VM_Operation* VMThread::_cur_vm_operation = NULL; VMOperationQueue* VMThread::_vm_queue = NULL; PerfCounter* VMThread::_perf_accumulated_vm_operation_time = NULL; -const char* VMThread::_no_op_reason = NULL; +uint64_t VMThread::_coalesced_count = 0; VMOperationTimeoutTask* VMThread::_timeout_task = NULL; @@ -283,6 +277,8 @@ _vm_thread = NULL; // VM thread is gone } +static VM_None halt_op("Halt"); + void VMThread::run() { assert(this == vm_thread(), "check"); @@ -320,7 +316,7 @@ } // 4526887 let VM thread exit at Safepoint - _no_op_reason = "Halt"; + _cur_vm_operation = &halt_op; SafepointSynchronize::begin(); if (VerifyBeforeExit) { @@ -435,24 +431,25 @@ } } -bool VMThread::no_op_safepoint_needed(bool check_time) { +static VM_None safepointALot_op("SafepointALot"); +static VM_Cleanup cleanup_op; + +VM_Operation* VMThread::no_op_safepoint(bool check_time) { if (SafepointALot) { - _no_op_reason = "SafepointALot"; - return true; + return &safepointALot_op; } if (!SafepointSynchronize::is_cleanup_needed()) { - return false; + return NULL; } if (check_time) { - long interval = SafepointSynchronize::last_non_safepoint_interval(); + long interval_ms = SafepointTracing::time_since_last_safepoint_ms(); bool max_time_exceeded = GuaranteedSafepointInterval != 0 && - (interval > GuaranteedSafepointInterval); + (interval_ms > GuaranteedSafepointInterval); if (!max_time_exceeded) { - return false; + return NULL; } } - _no_op_reason = "Cleanup"; - return true; + return &cleanup_op; } void VMThread::loop() { @@ -494,7 +491,7 @@ exit(-1); } - if (timedout && VMThread::no_op_safepoint_needed(false)) { + if (timedout && (_cur_vm_operation = VMThread::no_op_safepoint(false)) != NULL) { MutexUnlockerEx mul(VMOperationQueue_lock, Mutex::_no_safepoint_check_flag); // Force a safepoint since we have not had one for at least @@ -506,6 +503,7 @@ if (GCALotAtAllSafepoints) InterfaceSupport::check_gc_alot(); #endif SafepointSynchronize::end(); + _cur_vm_operation = NULL; } _cur_vm_operation = _vm_queue->remove_next(); @@ -555,9 +553,7 @@ _vm_queue->set_drain_list(next); evaluate_operation(_cur_vm_operation); _cur_vm_operation = next; - if (log_is_enabled(Debug, safepoint, stats)) { - SafepointSynchronize::inc_vmop_coalesced_count(); - } + _coalesced_count++; } while (_cur_vm_operation != NULL); } // There is a chance that a thread enqueued a safepoint op @@ -622,10 +618,11 @@ // // We want to make sure that we get to a safepoint regularly. // - if (VMThread::no_op_safepoint_needed(true)) { + if ((_cur_vm_operation = VMThread::no_op_safepoint(false)) != NULL) { HandleMark hm(VMThread::vm_thread()); SafepointSynchronize::begin(); SafepointSynchronize::end(); + _cur_vm_operation = NULL; } } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/runtime/vmThread.hpp --- a/src/hotspot/share/runtime/vmThread.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/runtime/vmThread.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -119,12 +119,11 @@ static bool _terminated; static Monitor * _terminate_lock; static PerfCounter* _perf_accumulated_vm_operation_time; - - static const char* _no_op_reason; + static uint64_t _coalesced_count; static VMOperationTimeoutTask* _timeout_task; - static bool no_op_safepoint_needed(bool check_time); + static VM_Operation* no_op_safepoint(bool check_time); void evaluate_operation(VM_Operation* op); @@ -155,9 +154,8 @@ // Returns the current vm operation if any. static VM_Operation* vm_operation() { return _cur_vm_operation; } - - // Returns the current vm operation name or set reason - static const char* vm_safepoint_description() { return _cur_vm_operation != NULL ? _cur_vm_operation->name() : _no_op_reason; }; + static VM_Operation::VMOp_Type vm_op_type() { return _cur_vm_operation->type(); } + static uint64_t get_coalesced_count() { return _coalesced_count; } // Returns the single instance of VMThread. static VMThread* vm_thread() { return _vm_thread; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/services/attachListener.cpp --- a/src/hotspot/share/services/attachListener.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/services/attachListener.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -257,19 +257,40 @@ // See also: ClassHistogramDCmd class // // Input arguments :- -// arg0: "-live" or "-all" +// arg0: Name of the dump file or NULL +// arg1: "-live" or "-all" static jint heap_inspection(AttachOperation* op, outputStream* out) { bool live_objects_only = true; // default is true to retain the behavior before this change is made - const char* arg0 = op->arg(0); - if (arg0 != NULL && (strlen(arg0) > 0)) { - if (strcmp(arg0, "-all") != 0 && strcmp(arg0, "-live") != 0) { - out->print_cr("Invalid argument to inspectheap operation: %s", arg0); + outputStream* os = out; // if path not specified or path is NULL, use out + fileStream* fs = NULL; + const char* path = op->arg(0); + if (path != NULL) { + if (path[0] == '\0') { + out->print_cr("No dump file specified"); + } else { + // create file + fs = new (ResourceObj::C_HEAP, mtInternal) fileStream(path); + if (fs == NULL) { + out->print_cr("Failed to allocate space for file: %s", path); + return JNI_ERR; + } + os = fs; + } + } + const char* arg1 = op->arg(1); + if (arg1 != NULL && (strlen(arg1) > 0)) { + if (strcmp(arg1, "-all") != 0 && strcmp(arg1, "-live") != 0) { + out->print_cr("Invalid argument to inspectheap operation: %s", arg1); return JNI_ERR; } - live_objects_only = strcmp(arg0, "-live") == 0; + live_objects_only = strcmp(arg1, "-live") == 0; } - VM_GC_HeapInspection heapop(out, live_objects_only /* request full gc */); + VM_GC_HeapInspection heapop(os, live_objects_only /* request full gc */); VMThread::execute(&heapop); + if (os != NULL && os != out) { + out->print_cr("Heap inspection file created: %s", path); + delete fs; + } return JNI_OK; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/services/attachListener.hpp --- a/src/hotspot/share/services/attachListener.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/services/attachListener.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -106,7 +106,7 @@ enum { name_length_max = 16, // maximum length of name arg_length_max = 1024, // maximum length of argument - arg_count_max = 3 // maximum number of arguments + arg_count_max = 4 // maximum number of arguments }; // name of special operation that can be enqueued when all diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/services/diagnosticArgument.cpp --- a/src/hotspot/share/services/diagnosticArgument.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/services/diagnosticArgument.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -179,9 +179,9 @@ if (str == NULL) { _value = NULL; } else { - _value = NEW_C_HEAP_ARRAY(char, len+1, mtInternal); - strncpy(_value, str, len); - _value[len] = 0; + _value = NEW_C_HEAP_ARRAY(char, len + 1, mtInternal); + int n = snprintf(_value, len + 1, "%.*s", (int)len, str); + assert((size_t)n <= len, "Unexpected number of characters in string"); } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/services/runtimeService.cpp --- a/src/hotspot/share/services/runtimeService.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/services/runtimeService.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -25,7 +25,7 @@ #include "precompiled.hpp" #include "classfile/classLoader.hpp" #include "logging/log.hpp" -#include "runtime/timer.hpp" +#include "logging/logStream.hpp" #include "runtime/vm_version.hpp" #include "services/attachListener.hpp" #include "services/management.hpp" @@ -35,18 +35,12 @@ #include "utilities/macros.hpp" #if INCLUDE_MANAGEMENT -TimeStamp RuntimeService::_app_timer; -TimeStamp RuntimeService::_safepoint_timer; PerfCounter* RuntimeService::_sync_time_ticks = NULL; PerfCounter* RuntimeService::_total_safepoints = NULL; PerfCounter* RuntimeService::_safepoint_time_ticks = NULL; PerfCounter* RuntimeService::_application_time_ticks = NULL; -jlong RuntimeService::_last_safepoint_sync_time_ns = 0; -jlong RuntimeService::_last_safepoint_end_time_ns = 0; -jlong RuntimeService::_last_app_time_ns = 0; void RuntimeService::init() { - if (UsePerfData) { EXCEPTION_MARK; @@ -87,85 +81,27 @@ } } -void RuntimeService::record_safepoint_begin() { +void RuntimeService::record_safepoint_begin(jlong app_ticks) { HS_PRIVATE_SAFEPOINT_BEGIN(); - - // Print the time interval in which the app was executing - if (_app_timer.is_updated()) { - _last_app_time_ns = _app_timer.ticks_since_update(); - log_info(safepoint)("Application time: %3.7f seconds", TimeHelper::counter_to_seconds(_last_app_time_ns)); - } - - // update the time stamp to begin recording safepoint time - _last_safepoint_sync_time_ns = 0; - _last_safepoint_end_time_ns = 0; - _safepoint_timer.update(); if (UsePerfData) { _total_safepoints->inc(); - if (_app_timer.is_updated()) { - _application_time_ticks->inc(_app_timer.ticks_since_update()); - } - } -} - -void RuntimeService::record_safepoint_synchronized() { - if (UsePerfData) { - _sync_time_ticks->inc(_safepoint_timer.ticks_since_update()); - } - if (log_is_enabled(Info, safepoint) || log_is_enabled(Info, safepoint, stats)) { - _last_safepoint_sync_time_ns = _safepoint_timer.ticks_since_update(); + _application_time_ticks->inc(app_ticks); } } -void RuntimeService::record_safepoint_end() { - HS_PRIVATE_SAFEPOINT_END(); - - // Logging of safepoint+stats=info needs _last_safepoint_end_time_ns to be set. - // Logging of safepoint=info needs _last_safepoint_end_time_ns for following log. - if (log_is_enabled(Info, safepoint) || log_is_enabled(Info, safepoint, stats)) { - _last_safepoint_end_time_ns = _safepoint_timer.ticks_since_update(); - log_info(safepoint)( - "Total time for which application threads were stopped: %3.7f seconds, " - "Stopping threads took: %3.7f seconds", - TimeHelper::counter_to_seconds(_last_safepoint_end_time_ns), - TimeHelper::counter_to_seconds(_last_safepoint_sync_time_ns)); - } - - // update the time stamp to begin recording app time - _app_timer.update(); +void RuntimeService::record_safepoint_synchronized(jlong sync_ticks) { if (UsePerfData) { - _safepoint_time_ticks->inc(_safepoint_timer.ticks_since_update()); + _sync_time_ticks->inc(sync_ticks); } } -void RuntimeService::record_safepoint_epilog(const char* operation_name) { - if (!log_is_enabled(Info, safepoint, stats)) { - return; +void RuntimeService::record_safepoint_end(jlong safepoint_ticks) { + HS_PRIVATE_SAFEPOINT_END(); + if (UsePerfData) { + _safepoint_time_ticks->inc(safepoint_ticks); } - - log_info(safepoint, stats)( - "Safepoint \"%s\", " - "Time since last: " JLONG_FORMAT " ns; " - "Reaching safepoint: " JLONG_FORMAT " ns; " - "At safepoint: " JLONG_FORMAT " ns; " - "Total: " JLONG_FORMAT " ns", - operation_name, - _last_app_time_ns, - _last_safepoint_sync_time_ns, - _last_safepoint_end_time_ns - _last_safepoint_sync_time_ns, - _last_safepoint_end_time_ns - ); } -void RuntimeService::record_application_start() { - // update the time stamp to begin recording app time - _app_timer.update(); -} - -// Don't need to record application end because we currently -// exit at a safepoint and record_safepoint_begin() handles updating -// the application time counter at VM exit. - jlong RuntimeService::safepoint_sync_time_ms() { return UsePerfData ? Management::ticks_to_ms(_sync_time_ticks->get_value()) : -1; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/services/runtimeService.hpp --- a/src/hotspot/share/services/runtimeService.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/services/runtimeService.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -35,12 +35,6 @@ static PerfCounter* _safepoint_time_ticks; // Accumulated time at safepoints static PerfCounter* _application_time_ticks; // Accumulated time not at safepoints - static TimeStamp _safepoint_timer; - static TimeStamp _app_timer; - static jlong _last_safepoint_sync_time_ns; - static jlong _last_safepoint_end_time_ns; - static jlong _last_app_time_ns; - public: static void init(); @@ -50,12 +44,9 @@ static jlong application_time_ms(); // callbacks - static void record_safepoint_begin() NOT_MANAGEMENT_RETURN; - static void record_safepoint_synchronized() NOT_MANAGEMENT_RETURN; - static void record_safepoint_end() NOT_MANAGEMENT_RETURN; - static void record_safepoint_epilog(const char* operation_name) NOT_MANAGEMENT_RETURN; - static void record_application_start() NOT_MANAGEMENT_RETURN; - + static void record_safepoint_begin(jlong app_ticks) NOT_MANAGEMENT_RETURN; + static void record_safepoint_synchronized(jlong sync_ticks) NOT_MANAGEMENT_RETURN; + static void record_safepoint_end(jlong safepoint_ticks) NOT_MANAGEMENT_RETURN; }; #endif // SHARE_SERVICES_RUNTIMESERVICE_HPP diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/utilities/events.cpp --- a/src/hotspot/share/utilities/events.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/utilities/events.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -36,7 +36,7 @@ EventLog* Events::_logs = NULL; StringEventLog* Events::_messages = NULL; -ExtendedStringEventLog* Events::_exceptions = NULL; +ExceptionsEventLog* Events::_exceptions = NULL; StringEventLog* Events::_redefinitions = NULL; UnloadingEventLog* Events::_class_unloading = NULL; StringEventLog* Events::_deopt_messages = NULL; @@ -67,7 +67,7 @@ void Events::init() { if (LogEvents) { _messages = new StringEventLog("Events"); - _exceptions = new ExtendedStringEventLog("Internal exceptions"); + _exceptions = new ExceptionsEventLog("Internal exceptions"); _redefinitions = new StringEventLog("Classes redefined"); _class_unloading = new UnloadingEventLog("Classes unloaded"); _deopt_messages = new StringEventLog("Deoptimization events"); @@ -112,3 +112,20 @@ st.print("Unloading class " INTPTR_FORMAT " ", p2i(ik)); ik->name()->print_value_on(&st); } + +void ExceptionsEventLog::log(Thread* thread, Handle h_exception, const char* message, const char* file, int line) { + if (!should_log()) return; + + double timestamp = fetch_timestamp(); + MutexLockerEx ml(&_mutex, Mutex::_no_safepoint_check_flag); + int index = compute_log_index(); + _records[index].thread = thread; + _records[index].timestamp = timestamp; + stringStream st = _records[index].data.stream(); + st.print("Exception <"); + h_exception->print_value_on(&st); + st.print("%s%s> (" INTPTR_FORMAT ") \n" + "thrown [%s, line %d]\nfor thread " INTPTR_FORMAT, + message ? ": " : "", message ? message : "", + p2i(h_exception()), file, line, p2i(thread)); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/utilities/events.hpp --- a/src/hotspot/share/utilities/events.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/utilities/events.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -183,6 +183,14 @@ void log(Thread* thread, InstanceKlass* ik); }; +// Event log for exceptions +class ExceptionsEventLog : public ExtendedStringEventLog { + public: + ExceptionsEventLog(const char* name, int count = LogEventsBufferEntries) : ExtendedStringEventLog(name, count) {} + + void log(Thread* thread, Handle h_exception, const char* message, const char* file, int line); +}; + class Events : AllStatic { friend class EventLog; @@ -195,7 +203,7 @@ // A log for internal exception related messages, like internal // throws and implicit exceptions. - static ExtendedStringEventLog* _exceptions; + static ExceptionsEventLog* _exceptions; // Deoptization related messages static StringEventLog* _deopt_messages; @@ -216,6 +224,7 @@ // Log exception related message static void log_exception(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); + static void log_exception(Thread* thread, Handle h_exception, const char* message, const char* file, int line); static void log_redefinition(Thread* thread, const char* format, ...) ATTRIBUTE_PRINTF(2, 3); @@ -245,6 +254,12 @@ } } +inline void Events::log_exception(Thread* thread, Handle h_exception, const char* message, const char* file, int line) { + if (LogEvents) { + _exceptions->log(thread, h_exception, message, file, line); + } +} + inline void Events::log_redefinition(Thread* thread, const char* format, ...) { if (LogEvents) { va_list ap; diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/utilities/exceptions.cpp --- a/src/hotspot/share/utilities/exceptions.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/utilities/exceptions.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -131,15 +131,17 @@ } void Exceptions::_throw(Thread* thread, const char* file, int line, Handle h_exception, const char* message) { - ResourceMark rm; + ResourceMark rm(thread); assert(h_exception() != NULL, "exception should not be NULL"); // tracing (do this up front - so it works during boot strapping) + // Note, the print_value_string() argument is not called unless logging is enabled! log_info(exceptions)("Exception <%s%s%s> (" INTPTR_FORMAT ") \n" "thrown [%s, line %d]\nfor thread " INTPTR_FORMAT, h_exception->print_value_string(), message ? ": " : "", message ? message : "", p2i(h_exception()), file, line, p2i(thread)); + // for AbortVMOnException flag Exceptions::debug_check_abort(h_exception, message); @@ -162,11 +164,7 @@ thread->set_pending_exception(h_exception(), file, line); // vm log - if (LogEvents){ - Events::log_exception(thread, "Exception <%s%s%s> (" INTPTR_FORMAT ") thrown at [%s, line %d]", - h_exception->print_value_string(), message ? ": " : "", message ? message : "", - p2i(h_exception()), file, line); - } + Events::log_exception(thread, h_exception, message, file, line); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/utilities/globalDefinitions.hpp --- a/src/hotspot/share/utilities/globalDefinitions.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/utilities/globalDefinitions.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -165,29 +165,18 @@ // Size of a char[] needed to represent a jint as a string in decimal. const int jintAsStringSize = 12; -// An opaque struct of heap-word width, so that HeapWord* can be a generic -// pointer into the heap. We require that object sizes be measured in -// units of heap words, so that that -// HeapWord* hw; +// An opaque type, so that HeapWord* can be a generic pointer into the heap. +// We require that object sizes be measured in units of heap words (e.g. +// pointer-sized values), so that given HeapWord* hw, // hw += oop(hw)->foo(); // works, where foo is a method (like size or scavenge) that returns the // object size. -class HeapWord { - friend class VMStructs; - private: - char* i; -#ifndef PRODUCT - public: - char* value() { return i; } -#endif -}; +class HeapWordImpl; // Opaque, never defined. +typedef HeapWordImpl* HeapWord; -// Analogous opaque struct for metadata allocated from -// metaspaces. -class MetaWord { - private: - char* i; -}; +// Analogous opaque struct for metadata allocated from metaspaces. +class MetaWordImpl; // Opaque, never defined. +typedef MetaWordImpl* MetaWord; // HeapWordSize must be 2^LogHeapWordSize. const int HeapWordSize = sizeof(HeapWord); diff -r 30695f27d7ea -r 7a45c67e73d0 src/hotspot/share/utilities/xmlstream.cpp --- a/src/hotspot/share/utilities/xmlstream.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/hotspot/share/utilities/xmlstream.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -353,11 +353,15 @@ guarantee(format_len + 10 < sizeof(buffer), "bigger format buffer"); const char* kind = format; const char* kind_end = strchr(kind, ' '); - size_t kind_len = (kind_end != NULL) ? (kind_end - kind) : format_len; - strncpy(buffer, kind, kind_len); - strcpy(buffer + kind_len, "_done"); + size_t kind_len; if (kind_end != NULL) { - strncat(buffer, format + kind_len, sizeof(buffer) - (kind_len + 5 /* _done */) - 1); + kind_len = kind_end - kind; + int n = snprintf(buffer, sizeof(buffer), "%.*s_done", (int)kind_len, kind); + assert((size_t)n < sizeof(buffer), "Unexpected number of characters in string"); + } else { + kind_len = format_len; + int n = snprintf(buffer, sizeof(buffer), "%s_done%s", kind, kind + kind_len); + assert((size_t)n < sizeof(buffer), "Unexpected number of characters in string"); } // Output the trailing event with the timestamp. va_begin_elem(buffer, ap); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/java/nio/Bits.java --- a/src/java.base/share/classes/java/nio/Bits.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/java/nio/Bits.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -172,7 +172,10 @@ } // no luck - throw new OutOfMemoryError("Direct buffer memory"); + throw new OutOfMemoryError + ("Cannot reserve " + + size + " bytes of direct buffer memory (allocated: " + + RESERVED_MEMORY.get() + ", limit: " + MAX_MEMORY +")"); } finally { if (interrupted) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template --- a/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/java/nio/Direct-X-Buffer.java.template Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import java.io.FileDescriptor; import java.lang.ref.Reference; +import java.util.Objects; import jdk.internal.misc.VM; import jdk.internal.ref.Cleaner; import sun.nio.ch.DirectBuffer; @@ -325,6 +326,40 @@ #end[rw] } + public $Type$Buffer get(int index, $type$[] dst, int offset, int length) { +#if[rw] + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, dst.length); + + long dstOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$); + try { +#if[!byte] + if (order() != ByteOrder.nativeOrder()) + UNSAFE.copySwapMemory(null, + ix(index), + dst, + dstOffset, + (long)length << $LG_BYTES_PER_VALUE$, + (long)1 << $LG_BYTES_PER_VALUE$); + else +#end[!byte] + UNSAFE.copyMemory(null, + ix(index), + dst, + dstOffset, + (long)length << $LG_BYTES_PER_VALUE$); + } finally { + Reference.reachabilityFence(this); + } + } else { + super.get(index, dst, offset, length); + } + return this; +#else[rw] + throw new ReadOnlyBufferException(); +#end[rw] + } #end[rw] public $Type$Buffer put($type$ x) { @@ -440,6 +475,42 @@ #end[rw] } + public $Type$Buffer put(int index, $type$[] src, int offset, int length) { +#if[rw] + if (((long)length << $LG_BYTES_PER_VALUE$) > Bits.JNI_COPY_FROM_ARRAY_THRESHOLD) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, src.length); + + + long srcOffset = ARRAY_BASE_OFFSET + ((long)offset << $LG_BYTES_PER_VALUE$); + try { +#if[!byte] + if (order() != ByteOrder.nativeOrder()) + UNSAFE.copySwapMemory(src, + srcOffset, + null, + ix(index), + (long)length << $LG_BYTES_PER_VALUE$, + (long)1 << $LG_BYTES_PER_VALUE$); + else +#end[!byte] + UNSAFE.copyMemory(src, + srcOffset, + null, + ix(index), + (long)length << $LG_BYTES_PER_VALUE$); + } finally { + Reference.reachabilityFence(this); + } + } else { + super.put(index, src, offset, length); + } + return this; +#else[rw] + throw new ReadOnlyBufferException(); +#end[rw] + } + public $Type$Buffer compact() { #if[rw] int pos = position(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template --- a/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/java/nio/Heap-X-Buffer.java.template Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * 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,6 +38,8 @@ #end[rw] */ +import java.util.Objects; + class Heap$Type$Buffer$RW$ extends {#if[ro]?Heap}$Type$Buffer { @@ -181,6 +183,13 @@ return this; } + public $Type$Buffer get(int index, $type$[] dst, int offset, int length) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, dst.length); + System.arraycopy(hb, ix(index), dst, offset, length); + return this; + } + public boolean isDirect() { return false; } @@ -250,6 +259,36 @@ #end[rw] } + public $Type$Buffer put(int index, $type$[] src, int offset, int length) { +#if[rw] + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, src.length); + System.arraycopy(src, offset, hb, ix(index), length); + return this; +#else[rw] + throw new ReadOnlyBufferException(); +#end[rw] + } + +#if[char] + + public $Type$Buffer put(String src, int start, int end) { + int length = end - start; + checkBounds(start, length, src.length()); + if (isReadOnly()) + throw new ReadOnlyBufferException(); + int pos = position(); + int lim = limit(); + int rem = (pos <= lim) ? lim - pos : 0; + if (length > rem) + throw new BufferOverflowException(); + src.getChars(start, end, hb, ix(pos)); + position(pos + length); + return this; + } + +#end[char] + public $Type$Buffer compact() { #if[rw] System.arraycopy(hb, ix(position()), hb, ix(0), remaining()); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/java/nio/X-Buffer.java.template --- a/src/java.base/share/classes/java/nio/X-Buffer.java.template Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/java/nio/X-Buffer.java.template Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,7 @@ import java.util.stream.$Streamtype$Stream; #end[streamableType] +import java.util.Objects; import jdk.internal.util.ArraysSupport; /** @@ -50,11 +51,11 @@ * {@link #put($type$) put} methods that read and write * single $type$s;

* - *
  • Relative {@link #get($type$[]) bulk get} + *

  • Absolute and relative {@link #get($type$[]) bulk get} * methods that transfer contiguous sequences of $type$s from this buffer * into an array; {#if[!byte]?and}

  • * - *
  • Relative {@link #put($type$[]) bulk put} + *

  • Absolute and relative {@link #put($type$[]) bulk put} * methods that transfer contiguous sequences of $type$s from $a$ * $type$ array{#if[char]?, a string,} or some other $type$ * buffer into this buffer;{#if[!byte]? and}

  • @@ -209,6 +210,8 @@ *

    This class implements the {@link CharSequence} interface so that * character buffers may be used wherever character sequences are accepted, for * example in the regular-expression package {@link java.util.regex}. + * The methods defined by {@code CharSequence} operate relative to the current + * position of the buffer when they are invoked. *

    * #end[char] @@ -434,7 +437,6 @@ * @return The number of characters added to the buffer, or * -1 if this source of characters is at its end * @throws IOException if an I/O error occurs - * @throws NullPointerException if target is null * @throws ReadOnlyBufferException if target is a read only buffer * @since 1.5 */ @@ -762,6 +764,89 @@ return get(dst, 0, dst.length); } + /** + * Absolute bulk get method. + * + *

    This method transfers {@code length} $type$s from this + * buffer into the given array, starting at the given index in this + * buffer and at the given offset in the array. The position of this + * buffer is unchanged. + * + *

    An invocation of this method of the form + * src.get(index, dst, offset, length) + * has exactly the same effect as the following loop except that it first + * checks the consistency of the supplied parameters and it is potentially + * much more efficient: + * + *

    {@code
    +     *     for (int i = offset, j = index; i < offset + length; i++, j++)
    +     *         dst[i] = src.get(j);
    +     * }
    + * + * @param index + * The index in this buffer from which the first $type$ will be + * read; must be non-negative and less than {@code limit()} + * + * @param dst + * The destination array + * + * @param offset + * The offset within the array of the first $type$ to be + * written; must be non-negative and less than + * {@code dst.length} + * + * @param length + * The number of $type$s to be written to the given array; + * must be non-negative and no larger than the smaller of + * {@code limit() - index} and {@code dst.length - offset} + * + * @return This buffer + * + * @throws IndexOutOfBoundsException + * If the preconditions on the {@code index}, {@code offset}, and + * {@code length} parameters do not hold + * + * @since 13 + */ + public $Type$Buffer get(int index, $type$[] dst, int offset, int length) { + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, dst.length); + int end = offset + length; + for (int i = offset, j = index; i < end; i++, j++) + dst[i] = get(j); + return this; + } + + /** + * Absolute bulk get method. + * + *

    This method transfers $type$s from this buffer into the given + * destination array. The position of this buffer is unchanged. An + * invocation of this method of the form + * src.get(index, dst) behaves in exactly the same + * way as the invocation: + * + *

    +     *     src.get(index, dst, 0, dst.length) 
    + * + * @param index + * The index in this buffer from which the first $type$ will be + * read; must be non-negative and less than {@code limit()} + * + * @param dst + * The destination array + * + * @return This buffer + * + * @throws IndexOutOfBoundsException + * If {@code index} is negative, not smaller than {@code limit()}, + * or {@code limit() - index < dst.length} + * + * @since 13 + */ + public $Type$Buffer get(int index, $type$[] dst) { + return get(index, dst, 0, dst.length); + } // -- Bulk put operations -- @@ -840,7 +925,7 @@ * *
    {@code
          *     for (int i = off; i < off + len; i++)
    -     *         dst.put(a[i]);
    +     *         dst.put(src[i]);
          * }
    * * except that it first checks that there is sufficient space in this @@ -851,12 +936,12 @@ * * @param offset * The offset within the array of the first $type$ to be read; - * must be non-negative and no larger than {@code array.length} + * must be non-negative and no larger than {@code src.length} * * @param length * The number of $type$s to be read from the given array; * must be non-negative and no larger than - * {@code array.length - offset} + * {@code src.length - offset} * * @return This buffer * @@ -906,6 +991,95 @@ return put(src, 0, src.length); } + /** + * Absolute bulk put method  (optional operation). + * + *

    This method transfers {@code length} $type$s from the given + * array, starting at the given offset in the array and at the given index + * in this buffer. The position of this buffer is unchanged. + * + *

    An invocation of this method of the form + * dst.put(index, src, offset, length) + * has exactly the same effect as the following loop except that it first + * checks the consistency of the supplied parameters and it is potentially + * much more efficient: + * + *

    {@code
    +     *     for (int i = offset, j = index; i < offset + length; i++, j++)
    +     *         dst.put(j, src[i]);
    +     * }
    + * + * @param index + * The index in this buffer at which the first $type$ will be + * written; must be non-negative and less than {@code limit()} + * + * @param src + * The array from which $type$s are to be read + * + * @param offset + * The offset within the array of the first $type$ to be read; + * must be non-negative and less than {@code src.length} + * + * @param length + * The number of $type$s to be read from the given array; + * must be non-negative and no larger than the smaller of + * {@code limit() - index} and {@code src.length - offset} + * + * @return This buffer + * + * @throws IndexOutOfBoundsException + * If the preconditions on the {@code index}, {@code offset}, and + * {@code length} parameters do not hold + * + * @throws ReadOnlyBufferException + * If this buffer is read-only + * + * @since 13 + */ + public $Type$Buffer put(int index, $type$[] src, int offset, int length) { + if (isReadOnly()) + throw new ReadOnlyBufferException(); + Objects.checkFromIndexSize(index, length, limit()); + Objects.checkFromIndexSize(offset, length, src.length); + int end = offset + length; + for (int i = offset, j = index; i < end; i++, j++) + this.put(j, src[i]); + return this; + } + + /** + * Absolute bulk put method  (optional operation). + * + *

    This method copies $type$s into this buffer from the given source + * array. The position of this buffer is unchanged. An invocation of this + * method of the form dst.put(index, src) + * behaves in exactly the same way as the invocation: + * + *

    +     *     dst.put(index, src, 0, src.length); 
    + * + * @param index + * The index in this buffer at which the first $type$ will be + * written; must be non-negative and less than {@code limit()} + * + * @param src + * The array from which $type$s are to be read + * + * @return This buffer + * + * @throws IndexOutOfBoundsException + * If {@code index} is negative, not smaller than {@code limit()}, + * or {@code limit() - index < src.length} + * + * @throws ReadOnlyBufferException + * If this buffer is read-only + * + * @since 13 + */ + public $Type$Buffer put(int index, $type$[] src) { + return put(index, src, 0, src.length); + } + #if[char] /** diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/security/ssl/ClientHello.java --- a/src/java.base/share/classes/sun/security/ssl/ClientHello.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/security/ssl/ClientHello.java Fri Feb 22 20:36:42 2019 +0000 @@ -803,13 +803,8 @@ shc.sslConfig.getEnabledExtensions( SSLHandshake.CLIENT_HELLO); - ClientHelloMessage chm; - try { - chm = new ClientHelloMessage(shc, message, enabledExtensions); - } catch (Exception e) { - throw shc.conContext.fatal(Alert.HANDSHAKE_FAILURE, - "ClientHelloMessage failure", e); - } + ClientHelloMessage chm = + new ClientHelloMessage(shc, message, enabledExtensions); if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) { SSLLogger.fine("Consuming ClientHello handshake message", chm); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/security/ssl/HandshakeContext.java --- a/src/java.base/share/classes/sun/security/ssl/HandshakeContext.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/security/ssl/HandshakeContext.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * 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,6 +26,8 @@ package sun.security.ssl; import java.io.IOException; +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.security.AlgorithmConstraints; import java.security.CryptoPrimitive; @@ -443,6 +445,10 @@ throw conContext.fatal(Alert.UNEXPECTED_MESSAGE, "Unsupported handshake message: " + SSLHandshake.nameOf(handshakeType), unsoe); + } catch (BufferUnderflowException | BufferOverflowException be) { + throw conContext.fatal(Alert.DECODE_ERROR, + "Illegal handshake message: " + + SSLHandshake.nameOf(handshakeType), be); } // update handshake hash after handshake message consumption. diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/security/ssl/PostHandshakeContext.java --- a/src/java.base/share/classes/sun/security/ssl/PostHandshakeContext.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/security/ssl/PostHandshakeContext.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * 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,6 +26,8 @@ package sun.security.ssl; import java.io.IOException; +import java.nio.BufferOverflowException; +import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -74,6 +76,10 @@ throw conContext.fatal(Alert.UNEXPECTED_MESSAGE, "Unsupported post-handshake message: " + SSLHandshake.nameOf(handshakeType), unsoe); + } catch (BufferUnderflowException | BufferOverflowException be) { + throw conContext.fatal(Alert.DECODE_ERROR, + "Illegal handshake message: " + + SSLHandshake.nameOf(handshakeType), be); } } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java --- a/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -921,29 +921,45 @@ static { Exception reserved = null; - TrustManager[] tmMediator; + TrustManager[] tmMediator = null; try { tmMediator = getTrustManagers(); } catch (Exception e) { reserved = e; - tmMediator = new TrustManager[0]; + if (SSLLogger.isOn && SSLLogger.isOn("ssl,defaultctx")) { + SSLLogger.warning( + "Failed to load default trust managers", e); + } } - trustManagers = tmMediator; + KeyManager[] kmMediator = null; if (reserved == null) { - KeyManager[] kmMediator; try { kmMediator = getKeyManagers(); } catch (Exception e) { reserved = e; - kmMediator = new KeyManager[0]; + if (SSLLogger.isOn && SSLLogger.isOn("ssl,defaultctx")) { + SSLLogger.warning( + "Failed to load default key managers", e); + } } - keyManagers = kmMediator; - } else { - keyManagers = new KeyManager[0]; } - reservedException = reserved; + if (reserved != null) { + trustManagers = new TrustManager[0]; + keyManagers = new KeyManager[0]; + + // Important note: please don't reserve the original exception + // object, which may be not garbage collection friendly as + // 'reservedException' is a static filed. + reservedException = + new KeyManagementException(reserved.getMessage()); + } else { + trustManagers = tmMediator; + keyManagers = kmMediator; + + reservedException = null; + } } private static TrustManager[] getTrustManagers() throws Exception { @@ -1071,21 +1087,30 @@ private static final class DefaultSSLContextHolder { private static final SSLContextImpl sslContext; - static Exception reservedException = null; + private static final Exception reservedException; static { + Exception reserved = null; SSLContextImpl mediator = null; if (DefaultManagersHolder.reservedException != null) { - reservedException = DefaultManagersHolder.reservedException; + reserved = DefaultManagersHolder.reservedException; } else { try { mediator = new DefaultSSLContext(); } catch (Exception e) { - reservedException = e; + // Important note: please don't reserve the original + // exception object, which may be not garbage collection + // friendly as 'reservedException' is a static filed. + reserved = new KeyManagementException(e.getMessage()); + if (SSLLogger.isOn && SSLLogger.isOn("ssl,defaultctx")) { + SSLLogger.warning( + "Failed to load default SSLContext", e); + } } } sslContext = mediator; + reservedException = reserved; } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/security/x509/CertificateExtensions.java --- a/src/java.base/share/classes/sun/security/x509/CertificateExtensions.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/security/x509/CertificateExtensions.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -355,7 +355,7 @@ class UnparseableExtension extends Extension { private String name; - private Throwable why; + private String exceptionDescription; public UnparseableExtension(Extension ext, Throwable why) { super(ext); @@ -371,12 +371,13 @@ // If we cannot find the name, just ignore it } - this.why = why; + this.exceptionDescription = why.toString(); } @Override public String toString() { return super.toString() + - "Unparseable " + name + "extension due to\n" + why + "\n\n" + + "Unparseable " + name + "extension due to\n" + + exceptionDescription + "\n\n" + new HexDumpEncoder().encodeBuffer(getExtensionValue()); } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/util/cldr/CLDRCalendarDataProviderImpl.java --- a/src/java.base/share/classes/sun/util/cldr/CLDRCalendarDataProviderImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/util/cldr/CLDRCalendarDataProviderImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,7 +80,8 @@ String region = locale.getCountry(); if (region.isEmpty()) { - return 0; + // Use "US" as default + region = "US"; } Integer val = map.get(region); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/util/locale/provider/CalendarDataUtility.java --- a/src/java.base/share/classes/sun/util/locale/provider/CalendarDataUtility.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/util/locale/provider/CalendarDataUtility.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -256,7 +256,9 @@ default: throw new InternalError("invalid requestID: " + requestID); } - return (value != 0) ? value : null; + + assert value != 0; + return value; } } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java --- a/src/java.base/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -283,8 +283,8 @@ return providersObj; } else if (isObjectProvider) { config(LocaleServiceProviderPool.class, - "A locale sensitive service provider returned null for a localized objects, which should not happen. provider: " - + lsp + " locale: " + locale); + "A locale sensitive service object provider returned null, " + + "which should not happen. Provider: " + lsp + " Locale: " + locale); } } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/native/libjimage/imageFile.cpp --- a/src/java.base/share/native/libjimage/imageFile.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/native/libjimage/imageFile.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -481,65 +481,6 @@ return 0; // not found } -// Assemble the location path from the string fragments indicated in the location attributes. -void ImageFileReader::location_path(ImageLocation& location, char* path, size_t max) const { - // Manage the image string table. - ImageStrings strings(_string_bytes, _header.strings_size(_endian)); - // Position to first character of the path buffer. - char* next = path; - // Temp for string length. - size_t length; - // Get module string. - const char* module = location.get_attribute(ImageLocation::ATTRIBUTE_MODULE, strings); - // If module string is not empty string. - if (*module != '\0') { - // Get length of module name. - length = strlen(module); - // Make sure there is no buffer overflow. - assert(next - path + length + 2 < max && "buffer overflow"); - // Append '/module/'. - *next++ = '/'; - strncpy(next, module, length); next += length; - *next++ = '/'; - } - // Get parent (package) string. - const char* parent = location.get_attribute(ImageLocation::ATTRIBUTE_PARENT, strings); - // If parent string is not empty string. - if (*parent != '\0') { - // Get length of module string. - length = strlen(parent); - // Make sure there is no buffer overflow. - assert(next - path + length + 1 < max && "buffer overflow"); - // Append 'patent/' . - strncpy(next, parent, length); next += length; - *next++ = '/'; - } - // Get base name string. - const char* base = location.get_attribute(ImageLocation::ATTRIBUTE_BASE, strings); - // Get length of base name. - length = strlen(base); - // Make sure there is no buffer overflow. - assert(next - path + length < max && "buffer overflow"); - // Append base name. - strncpy(next, base, length); next += length; - // Get extension string. - const char* extension = location.get_attribute(ImageLocation::ATTRIBUTE_EXTENSION, strings); - // If extension string is not empty string. - if (*extension != '\0') { - // Get length of extension string. - length = strlen(extension); - // Make sure there is no buffer overflow. - assert(next - path + length + 1 < max && "buffer overflow"); - // Append '.extension' . - *next++ = '.'; - strncpy(next, extension, length); next += length; - } - // Make sure there is no buffer overflow. - assert((size_t)(next - path) < max && "buffer overflow"); - // Terminate string. - *next = '\0'; -} - // Verify that a found location matches the supplied path (without copying.) bool ImageFileReader::verify_location(ImageLocation& location, const char* path) const { // Manage the image string table. diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/native/libjimage/imageFile.hpp --- a/src/java.base/share/native/libjimage/imageFile.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/native/libjimage/imageFile.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -564,9 +564,6 @@ // ImageFileReader::NOT_FOUND otherwise. u4 find_location_index(const char* path, u8 *size) const; - // Assemble the location path. - void location_path(ImageLocation& location, char* path, size_t max) const; - // Verify that a found location matches the supplied path. bool verify_location(ImageLocation& location, const char* path) const; diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/native/libjimage/jimage.cpp --- a/src/java.base/share/native/libjimage/jimage.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/native/libjimage/jimage.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -215,29 +215,3 @@ } } } - -/* - * JIMAGE_ResourcePath- Given an open image file, a location reference, a buffer - * and a maximum buffer size, copy the path of the resource into the buffer. - * Returns false if not a valid location reference. - * - * Ex. - * JImageLocationRef location = ... - * char path[JIMAGE_MAX_PATH]; - * (*JImageResourcePath)(image, location, path, JIMAGE_MAX_PATH); - */ -extern "C" JNIEXPORT bool -JIMAGE_ResourcePath(JImageFile* image, JImageLocationRef locationRef, - char* path, size_t max) { - ImageFileReader* imageFile = (ImageFileReader*) image; - - u4 offset = (u4) locationRef; - if (offset >= imageFile->locations_size()) { - return false; - } - - ImageLocation location(imageFile->get_location_offset_data(offset)); - imageFile->location_path(location, path, max); - - return true; -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.base/share/native/libjimage/jimage.hpp --- a/src/java.base/share/native/libjimage/jimage.hpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.base/share/native/libjimage/jimage.hpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -191,20 +191,3 @@ typedef void (*JImageResourceIterator_t)(JImageFile* jimage, JImageResourceVisitor_t visitor, void* arg); - -/* - * JIMAGE_ResourcePath- Given an open image file, a location reference, a buffer - * and a maximum buffer size, copy the path of the resource into the buffer. - * Returns false if not a valid location reference. - * - * Ex. - * JImageLocationRef location = ... - * char path[JIMAGE_MAX_PATH]; - * (*JImageResourcePath)(image, location, path, JIMAGE_MAX_PATH); - */ -extern "C" JNIEXPORT bool -JIMAGE_ResourcePath(JImageFile* image, JImageLocationRef locationRef, - char* path, size_t max); - -typedef bool (*JImage_ResourcePath_t)(JImageFile* jimage, JImageLocationRef location, - char* buffer, jlong size); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CTrayIcon.java Fri Feb 22 20:36:42 2019 +0000 @@ -208,11 +208,13 @@ CImage cimage = CImage.getCreator().createFromImage(image, observer); boolean imageAutoSize = target.isImageAutoSize(); - cimage.execute(imagePtr -> { - execute(ptr -> { - setNativeImage(ptr, imagePtr, imageAutoSize); + if (cimage != null) { + cimage.execute(imagePtr -> { + execute(ptr -> { + setNativeImage(ptr, imagePtr, imageAutoSize); + }); }); - }); + } } private native void setNativeImage(final long model, final long nsimage, final boolean autosize); @@ -357,7 +359,7 @@ class IconObserver implements ImageObserver { @Override public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) { - if (image != target.getImage()) // if the image has been changed + if (target == null || image != target.getImage()) //if the image has been changed { return false; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java --- a/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Fri Feb 22 20:36:42 2019 +0000 @@ -739,7 +739,8 @@ region == Region.TOOL_BAR_DRAG_WINDOW || region == Region.TOOL_TIP || region == Region.TREE || - region == Region.VIEWPORT) { + region == Region.VIEWPORT || + region == Region.TEXT_PANE) { return true; } if (!GTKLookAndFeel.is3()) { @@ -747,8 +748,7 @@ region == Region.FORMATTED_TEXT_FIELD || region == Region.PASSWORD_FIELD || region == Region.SPINNER || - region == Region.TEXT_FIELD || - region == Region.TEXT_PANE) { + region == Region.TEXT_FIELD) { return true; } } @@ -767,6 +767,14 @@ if (classKey != null) { Object value = getClassSpecificValue(classKey); if (value != null) { + //This is a workaround as the "slider-length" property has been + //deprecated for GtkScale from gtk 3.20, so default value of 31 + //is used and makes redering of slider wrong. Value 14 is being + //used as default value for Slider.thumbHeight is 14 and making + //width 14 as well makes slider thumb render in proper shape + if ("Slider.thumbWidth".equals(key) && value.equals(31)) { + return 14; + } return value; } } @@ -779,8 +787,15 @@ return getColorForState(context, ColorType.FOREGROUND); } else if (key == "ScrollBar.minimumThumbSize") { + //This is a workaround as the "min-slider-length" property has been + //deprecated for GtkScrollBar from gtk 3.20, so default value of 21 + //is used and makes ScrollBar thumb very small. Value 40 is being + //used as this is the value mentioned in css files int len = getClassSpecificIntValue(context, "min-slider-length", 21); + if (len == 21) { + len = 40; + } JScrollBar sb = (JScrollBar)context.getComponent(); if (sb.getOrientation() == JScrollBar.HORIZONTAL) { return new DimensionUIResource(len, 0); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/java/awt/Font.java --- a/src/java.desktop/share/classes/java/awt/Font.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/java/awt/Font.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -495,13 +495,7 @@ private Font2D getFont2D() { FontManager fm = FontManagerFactory.getInstance(); - if (fm.usingPerAppContextComposites() && - font2DHandle != null && - font2DHandle.font2D instanceof CompositeFont && - ((CompositeFont)(font2DHandle.font2D)).isStdComposite()) { - return fm.findFont2D(name, style, - FontManager.LOGICAL_FALLBACK); - } else if (font2DHandle == null) { + if (font2DHandle == null) { font2DHandle = fm.findFont2D(name, style, FontManager.LOGICAL_FALLBACK).handle; diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/sun/awt/AWTSecurityManager.java --- a/src/java.desktop/share/classes/sun/awt/AWTSecurityManager.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.awt; - -/** - * The AWTSecurityManager class provides the ability to secondarily - * index AppContext objects through SecurityManager extensions. - * As noted in AppContext.java, AppContexts are primarily indexed by - * ThreadGroup. In the case where the ThreadGroup doesn't provide - * enough information to determine AppContext (e.g. system threads), - * if a SecurityManager is installed which derives from - * AWTSecurityManager, the AWTSecurityManager's getAppContext() - * method is called to determine the AppContext. - * - * A typical example of the use of this class is where an applet - * is called by a system thread, yet the system AppContext is - * inappropriate, because applet code is currently executing. - * In this case, the getAppContext() method can walk the call stack - * to determine the applet code being executed and return the applet's - * AppContext object. - * - * @author Fred Ecks - */ -public class AWTSecurityManager extends SecurityManager { - - /** - * Get the AppContext corresponding to the current context. - * The default implementation returns null, but this method - * may be overridden by various SecurityManagers - * (e.g. AppletSecurity) to index AppContext objects by the - * calling context. - * - * @return the AppContext corresponding to the current context. - * @see sun.awt.AppContext - * @see java.lang.SecurityManager - * @since 1.2.1 - */ - public AppContext getAppContext() { - return null; // Default implementation returns null - } - -} /* class AWTSecurityManager */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/sun/awt/AppContext.java --- a/src/java.desktop/share/classes/sun/awt/AppContext.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/sun/awt/AppContext.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -123,17 +123,6 @@ * therefore safely invoke any of its methods without worry of being * blocked. * - * Note: If a SecurityManager is installed which derives from - * sun.awt.AWTSecurityManager, it may override the - * AWTSecurityManager.getAppContext() method to return the proper - * AppContext based on the execution context, in the case where - * the default ThreadGroup-based AppContext indexing would return - * the main "system" AppContext. For example, in an applet situation, - * if a system thread calls into an applet, rather than returning the - * main "system" AppContext (the one corresponding to the system thread), - * an installed AWTSecurityManager may return the applet's AppContext - * based on the execution context. - * * @author Thomas Ball * @author Fred Ecks */ @@ -287,10 +276,7 @@ /** * Returns the appropriate AppContext for the caller, - * as determined by its ThreadGroup. If the main "system" AppContext - * would be returned and there's an AWTSecurityManager installed, it - * is called to get the proper AppContext based on the execution - * context. + * as determined by its ThreadGroup. * * @return the AppContext for the caller. * @see java.lang.ThreadGroup @@ -384,18 +370,6 @@ return (ctx != null && ctx == mainAppContext); } - private static AppContext getExecutionAppContext() { - SecurityManager securityManager = System.getSecurityManager(); - if ((securityManager != null) && - (securityManager instanceof AWTSecurityManager)) - { - AWTSecurityManager awtSecMgr = (AWTSecurityManager) securityManager; - AppContext secAppContext = awtSecMgr.getAppContext(); - return secAppContext; // Return what we're told - } - return null; - } - private long DISPOSAL_TIMEOUT = 5000; // Default to 5-second timeout // for disposal of all Frames // (we wait for this time twice, @@ -872,8 +846,7 @@ // context since we don't need it. if (numAppContexts.get() == 0) return null; - // Get the context from the security manager - AppContext ecx = getExecutionAppContext(); + AppContext ecx = null; // Not sure we really need to re-check numAppContexts here. // If all applets have gone away then we could have a diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/sun/font/FontDesignMetrics.java --- a/src/java.desktop/share/classes/sun/font/FontDesignMetrics.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/sun/font/FontDesignMetrics.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * 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,22 +25,18 @@ package sun.font; -import java.lang.ref.ReferenceQueue; -import java.lang.ref.SoftReference; - +import java.awt.Font; import java.awt.FontMetrics; -import java.awt.Font; import java.awt.GraphicsEnvironment; -import java.awt.geom.AffineTransform; -import java.awt.geom.NoninvertibleTransformException; -import java.awt.geom.Rectangle2D; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; - +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; - +import java.lang.ref.ReferenceQueue; +import java.lang.ref.SoftReference; import java.util.concurrent.ConcurrentHashMap; import sun.java2d.Disposer; @@ -263,7 +259,7 @@ * by this code as they use the metrics of the physical anyway. */ SunFontManager fm = SunFontManager.getInstance(); - if (fm.maybeUsingAlternateCompositeFonts() && + if (fm.usingAlternateCompositeFonts() && FontUtilities.getFont2D(font) instanceof CompositeFont) { return new FontDesignMetrics(font, frc); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/sun/font/FontManager.java --- a/src/java.desktop/share/classes/sun/font/FontManager.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/sun/font/FontManager.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,16 +22,12 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ + package sun.font; import java.awt.Font; import java.awt.FontFormatException; import java.io.File; -import java.util.Locale; -import java.util.TreeMap; - -import javax.swing.plaf.FontUIResource; - /** * Interface between Java Fonts (java.awt.Font) and the underlying @@ -93,13 +89,6 @@ throws FontFormatException; /** - * If usingPerAppContextComposites is true, we are in "applet" - * (eg browser) environment and at least one context has selected - * an alternate composite font behaviour. - */ - public boolean usingPerAppContextComposites(); - - /** * Creates a derived composite font from the specified font (handle). * * @param family the font family of the derived font diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/classes/sun/font/SunFontManager.java --- a/src/java.desktop/share/classes/sun/font/SunFontManager.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/classes/sun/font/SunFontManager.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,7 @@ import java.util.concurrent.ConcurrentHashMap; import javax.swing.plaf.FontUIResource; -import sun.awt.AppContext; + import sun.awt.FontConfiguration; import sun.awt.SunToolkit; import sun.awt.util.ThreadGroupUtils; @@ -256,11 +256,6 @@ return t1Filter; } - @Override - public boolean usingPerAppContextComposites() { - return _usingPerAppContextComposites; - } - static { java.security.AccessController.doPrivileged( @@ -1936,7 +1931,6 @@ public Font2D findFont2D(String name, int style, int fallback) { String lowerCaseName = name.toLowerCase(Locale.ENGLISH); String mapName = lowerCaseName + dotStyleStr(style); - Font2D font; /* If preferLocaleFonts() or preferProportionalFonts() has been * called we may be using an alternate set of composite fonts in this @@ -1944,19 +1938,7 @@ * this is so, and gives access to the alternate composite for the * name. */ - if (_usingPerAppContextComposites) { - @SuppressWarnings("unchecked") - ConcurrentHashMap altNameCache = - (ConcurrentHashMap) - AppContext.getAppContext().get(CompositeFont.class); - if (altNameCache != null) { - font = altNameCache.get(mapName); - } else { - font = null; - } - } else { - font = fontNameCache.get(mapName); - } + Font2D font = fontNameCache.get(mapName); if (font != null) { return font; } @@ -2161,25 +2143,9 @@ * cache for these. */ - if (fontsAreRegistered || fontsAreRegisteredPerAppContext) { - Hashtable familyTable = null; - Hashtable nameTable; - - if (fontsAreRegistered) { - familyTable = createdByFamilyName; - nameTable = createdByFullName; - } else { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable tmp1 = - (Hashtable)appContext.get(regFamilyKey); - familyTable = tmp1; - - @SuppressWarnings("unchecked") - Hashtable tmp2 = - (Hashtable)appContext.get(regFullNameKey); - nameTable = tmp2; - } + if (fontsAreRegistered) { + Hashtable familyTable = createdByFamilyName; + Hashtable nameTable = createdByFullName; family = familyTable.get(lowerCaseName); if (family != null) { @@ -2684,9 +2650,6 @@ * Calling the methods below is "heavyweight" but it is expected that * these methods will be called very rarely. * - * If _usingPerAppContextComposites is true, we are in "applet" - * (eg browser) environment and at least one context has selected - * an alternate composite font behaviour. * If _usingAlternateComposites is true, we are not in an "applet" * environment and the (single) application has selected * an alternate composite font behaviour. @@ -2698,21 +2661,13 @@ * but that may have to wait. The results should be correct, just not * optimal. */ - private static final Object altJAFontKey = new Object(); - private static final Object localeFontKey = new Object(); - private static final Object proportionalFontKey = new Object(); - private boolean _usingPerAppContextComposites = false; private boolean _usingAlternateComposites = false; - /* These values are used only if we are running as a standalone - * application, as determined by maybeMultiAppContext(); - */ private static boolean gAltJAFont = false; private boolean gLocalePref = false; private boolean gPropPref = false; - /* This method doesn't check if alternates are selected in this app - * context. Its used by the FontMetrics caching code which in such + /* Its used by the FontMetrics caching code which in such * a case cannot retrieve a cached metrics solely on the basis of * the Font.equals() method since it needs to also check if the Font2D * is the same. @@ -2724,26 +2679,8 @@ * logical font definitions we may need to revisit this if GTK reports * combined metrics instead. For now though this test can be simple. */ - public boolean maybeUsingAlternateCompositeFonts() { - return _usingAlternateComposites || _usingPerAppContextComposites; - } - public boolean usingAlternateCompositeFonts() { - return (_usingAlternateComposites || - (_usingPerAppContextComposites && - AppContext.getAppContext().get(CompositeFont.class) != null)); - } - - private static boolean maybeMultiAppContext() { - Boolean appletSM = (Boolean) - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public Object run() { - SecurityManager sm = System.getSecurityManager(); - return sm instanceof sun.awt.AWTSecurityManager; - } - }); - return appletSM.booleanValue(); + return _usingAlternateComposites; } /* Modifies the behaviour of a subsequent call to preferLocaleFonts() @@ -2758,22 +2695,11 @@ if (!FontUtilities.isWindows) { return; } - - if (!maybeMultiAppContext()) { - gAltJAFont = true; - } else { - AppContext appContext = AppContext.getAppContext(); - appContext.put(altJAFontKey, altJAFontKey); - } + gAltJAFont = true; } public boolean usingAlternateFontforJALocales() { - if (!maybeMultiAppContext()) { - return gAltJAFont; - } else { - AppContext appContext = AppContext.getAppContext(); - return appContext.get(altJAFontKey) == altJAFontKey; - } + return gAltJAFont; } public synchronized void preferLocaleFonts() { @@ -2784,29 +2710,12 @@ if (!FontConfiguration.willReorderForStartupLocale()) { return; } - - if (!maybeMultiAppContext()) { - if (gLocalePref == true) { - return; - } - gLocalePref = true; - createCompositeFonts(fontNameCache, gLocalePref, gPropPref); - _usingAlternateComposites = true; - } else { - AppContext appContext = AppContext.getAppContext(); - if (appContext.get(localeFontKey) == localeFontKey) { - return; - } - appContext.put(localeFontKey, localeFontKey); - boolean acPropPref = - appContext.get(proportionalFontKey) == proportionalFontKey; - ConcurrentHashMap - altNameCache = new ConcurrentHashMap (); - /* If there is an existing hashtable, we can drop it. */ - appContext.put(CompositeFont.class, altNameCache); - _usingPerAppContextComposites = true; - createCompositeFonts(altNameCache, true, acPropPref); + if (gLocalePref == true) { + return; } + gLocalePref = true; + createCompositeFonts(fontNameCache, gLocalePref, gPropPref); + _usingAlternateComposites = true; } public synchronized void preferProportionalFonts() { @@ -2820,29 +2729,12 @@ if (!FontConfiguration.hasMonoToPropMap()) { return; } - - if (!maybeMultiAppContext()) { - if (gPropPref == true) { - return; - } - gPropPref = true; - createCompositeFonts(fontNameCache, gLocalePref, gPropPref); - _usingAlternateComposites = true; - } else { - AppContext appContext = AppContext.getAppContext(); - if (appContext.get(proportionalFontKey) == proportionalFontKey) { - return; - } - appContext.put(proportionalFontKey, proportionalFontKey); - boolean acLocalePref = - appContext.get(localeFontKey) == localeFontKey; - ConcurrentHashMap - altNameCache = new ConcurrentHashMap (); - /* If there is an existing hashtable, we can drop it. */ - appContext.put(CompositeFont.class, altNameCache); - _usingPerAppContextComposites = true; - createCompositeFonts(altNameCache, acLocalePref, true); + if (gPropPref == true) { + return; } + gPropPref = true; + createCompositeFonts(fontNameCache, gLocalePref, gPropPref); + _usingAlternateComposites = true; } private static HashSet installedNames = null; @@ -2865,13 +2757,10 @@ return installedNames; } - /* Keys are used to lookup per-AppContext Hashtables */ - private static final Object regFamilyKey = new Object(); - private static final Object regFullNameKey = new Object(); + private static final Object regFamilyLock = new Object(); private Hashtable createdByFamilyName; private Hashtable createdByFullName; private boolean fontsAreRegistered = false; - private boolean fontsAreRegisteredPerAppContext = false; public boolean registerFont(Font font) { /* This method should not be called with "null". @@ -2882,7 +2771,7 @@ } /* Initialise these objects only once we start to use this API */ - synchronized (regFamilyKey) { + synchronized (regFamilyLock) { if (createdByFamilyName == null) { createdByFamilyName = new Hashtable(); createdByFullName = new Hashtable(); @@ -2919,31 +2808,10 @@ } /* Checks passed, now register the font */ - Hashtable familyTable; - Hashtable fullNameTable; - if (!maybeMultiAppContext()) { - familyTable = createdByFamilyName; - fullNameTable = createdByFullName; - fontsAreRegistered = true; - } else { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable tmp1 = - (Hashtable)appContext.get(regFamilyKey); - familyTable = tmp1; - @SuppressWarnings("unchecked") - Hashtable tmp2 = - (Hashtable)appContext.get(regFullNameKey); - fullNameTable = tmp2; - - if (familyTable == null) { - familyTable = new Hashtable(); - fullNameTable = new Hashtable(); - appContext.put(regFamilyKey, familyTable); - appContext.put(regFullNameKey, fullNameTable); - } - fontsAreRegisteredPerAppContext = true; - } + Hashtable familyTable = createdByFamilyName; + Hashtable fullNameTable = createdByFullName; + fontsAreRegistered = true; + /* Create the FontFamily and add font to the tables */ Font2D font2D = FontUtilities.getFont2D(font); int style = font2D.getStyle(); @@ -2989,12 +2857,6 @@ Hashtable familyTable; if (fontsAreRegistered) { familyTable = createdByFamilyName; - } else if (fontsAreRegisteredPerAppContext) { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable tmp = - (Hashtable)appContext.get(regFamilyKey); - familyTable = tmp; } else { return null; } @@ -3019,12 +2881,6 @@ Hashtable nameTable; if (fontsAreRegistered) { nameTable = createdByFullName; - } else if (fontsAreRegisteredPerAppContext) { - AppContext appContext = AppContext.getAppContext(); - @SuppressWarnings("unchecked") - Hashtable tmp = - (Hashtable)appContext.get(regFullNameKey); - nameTable = tmp; } else { return null; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/native/libfontmanager/harfbuzz/hb-atomic-private.hh --- a/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-atomic-private.hh Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-atomic-private.hh Fri Feb 22 20:36:42 2019 +0000 @@ -115,7 +115,7 @@ #endif -#elif !defined(HB_NO_MT) && defined(_AIX) && defined(__IBMCPP__) +#elif !defined(HB_NO_MT) && defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__)) #include diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/share/native/liblcms/cmsxform.c --- a/src/java.desktop/share/native/liblcms/cmsxform.c Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/share/native/liblcms/cmsxform.c Fri Feb 22 20:36:42 2019 +0000 @@ -836,7 +836,7 @@ // Save the day? (Ignore the warning) if (Plugin->OldXform) { - p->OldXform = (_cmsTransformFn) p->xform; + p->OldXform = (_cmsTransformFn)(void*) p->xform; p->xform = _cmsTransform2toTransformAdaptor; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c --- a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c Fri Feb 22 20:36:42 2019 +0000 @@ -258,6 +258,7 @@ static gboolean gtk3_version_3_10 = TRUE; static gboolean gtk3_version_3_14 = FALSE; +static gboolean gtk3_version_3_20 = FALSE; GtkApi* gtk3_load(JNIEnv *env, const char* lib_name) { @@ -400,6 +401,18 @@ } gtk3_version_3_14 = !fp_gtk_check_version(3, 14, 0); + if (!fp_gtk_check_version(3, 20, 0)) { + gtk3_version_3_20 = TRUE; + fp_gtk_widget_path_copy = dl_symbol("gtk_widget_path_copy"); + fp_gtk_widget_path_new = dl_symbol("gtk_widget_path_new"); + fp_gtk_widget_path_append_type = dl_symbol("gtk_widget_path_append_type"); + fp_gtk_widget_path_iter_set_object_name = dl_symbol("gtk_widget_path_iter_set_object_name"); + fp_gtk_style_context_set_path = dl_symbol("gtk_style_context_set_path"); + fp_gtk_widget_path_unref = dl_symbol("gtk_widget_path_unref"); + fp_gtk_style_context_get_path = dl_symbol("gtk_style_context_get_path"); + fp_gtk_style_context_new = dl_symbol("gtk_style_context_new"); + } + fp_gdk_window_create_similar_surface = dl_symbol("gdk_window_create_similar_surface"); fp_gtk_settings_get_for_screen = @@ -561,7 +574,6 @@ "gtk_combo_box_new_with_entry"); fp_gtk_separator_tool_item_new = dlsym(gtk3_libhandle, "gtk_separator_tool_item_new"); - fp_g_list_append = dl_symbol("g_list_append"); fp_g_list_free = dl_symbol("g_list_free"); fp_g_list_free_full = dl_symbol("g_list_free_full"); @@ -1362,6 +1374,90 @@ return result; } +static void append_element (GtkWidgetPath *path, const gchar *selector) +{ + fp_gtk_widget_path_append_type (path, G_TYPE_NONE); + fp_gtk_widget_path_iter_set_object_name (path, -1, selector); +} + +static GtkWidgetPath* createWidgetPath(const GtkWidgetPath* path) { + if (path == NULL) { + return fp_gtk_widget_path_new(); + } else { + return fp_gtk_widget_path_copy(path); + } +} + +static GtkStyleContext* get_style(WidgetType widget_type, const gchar *detail) +{ + if (!gtk3_version_3_20) { + gtk3_widget = gtk3_get_widget(widget_type); + GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); + fp_gtk_style_context_save (context); + if (detail != 0) { + transform_detail_string(detail, context); + } + return context; + } else { + gtk3_widget = gtk3_get_widget(widget_type); + GtkStyleContext* widget_context = fp_gtk_widget_get_style_context (gtk3_widget); + GtkWidgetPath *path = NULL; + if (detail != 0) { + if (strcmp(detail, "checkbutton") == 0) { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, "check"); + } else if (strcmp(detail, "radiobutton") == 0) { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, "radio"); + } else if (strcmp(detail, "vscale") == 0 || strcmp(detail, "hscale") == 0) { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, "slider"); + } else if (strcmp(detail, "trough") == 0) { + //This is a fast solution to the scrollbar trough not being rendered properly + if (widget_type == HSCROLL_BAR || widget_type == HSCROLL_BAR_TRACK || + widget_type == VSCROLL_BAR || widget_type == VSCROLL_BAR_TRACK) { + path = createWidgetPath (NULL); + } else { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + } + append_element(path, detail); + } else if (strcmp(detail, "bar") == 0) { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, "trough"); + append_element(path, "progress"); + } else if (strcmp(detail, "vscrollbar") == 0 || strcmp(detail, "hscrollbar") == 0) { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, "button"); + } else if (strcmp(detail, "check") == 0) { + path = createWidgetPath (NULL); + append_element(path, detail); + } else if (strcmp(detail, "option") == 0) { + path = createWidgetPath (NULL); + append_element(path, "radio"); + } else { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + append_element(path, detail); + } + } else { + path = createWidgetPath (fp_gtk_style_context_get_path (widget_context)); + } + + GtkStyleContext *context = fp_gtk_style_context_new (); + fp_gtk_style_context_set_path (context, path); + fp_gtk_widget_path_unref (path); + return context; + } +} + +static void disposeOrRestoreContext(GtkStyleContext *context) +{ + if (!gtk3_version_3_20) { + fp_gtk_style_context_restore (context); + } else { + fp_g_object_unref (context); + } +} + static void gtk3_paint_arrow(WidgetType widget_type, GtkStateType state_type, GtkShadowType shadow_type, const gchar *detail, gint x, gint y, gint width, gint height, @@ -1509,13 +1605,9 @@ */ gtk3_set_direction(gtk3_widget, dir); - GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); - fp_gtk_style_context_save (context); - - transform_detail_string(detail, context); + GtkStyleContext* context = get_style(widget_type, detail); GtkStateFlags flags = get_gtk_flags(state_type); - if (shadow_type == GTK_SHADOW_IN && widget_type != COMBO_BOX_ARROW_BUTTON) { flags |= GTK_STATE_FLAG_ACTIVE; } @@ -1532,23 +1624,31 @@ fp_gtk_style_context_add_class (context, "default"); } + if (fp_gtk_style_context_has_class(context, "trough")) { + flags |= GTK_STATE_FLAG_BACKDROP; + } + fp_gtk_style_context_set_state (context, flags); - if (fp_gtk_style_context_has_class(context, "progressbar")) { - fp_gtk_render_activity (context, cr, x, y, width, height); - } else { - fp_gtk_render_background (context, cr, x, y, width, height); - if (shadow_type != GTK_SHADOW_NONE) { - fp_gtk_render_frame(context, cr, x, y, width, height); - } + fp_gtk_render_background (context, cr, x, y, width, height); + if (shadow_type != GTK_SHADOW_NONE) { + fp_gtk_render_frame(context, cr, x, y, width, height); } - fp_gtk_style_context_restore (context); + disposeOrRestoreContext(context); + /* * Reset the text direction to the default value so that we don't * accidentally affect other operations and widgets. */ gtk3_set_direction(gtk3_widget, GTK_TEXT_DIR_LTR); + + //This is a fast solution to the scrollbar trough not being rendered properly + if ((widget_type == HSCROLL_BAR || widget_type == HSCROLL_BAR_TRACK || + widget_type == VSCROLL_BAR || widget_type == VSCROLL_BAR_TRACK) && detail != 0) { + gtk3_paint_box(widget_type, state_type, shadow_type, NULL, + x, y, width, height, synth_state, dir); + } } static void gtk3_paint_box_gap(WidgetType widget_type, GtkStateType state_type, @@ -1580,23 +1680,19 @@ static void gtk3_paint_check(WidgetType widget_type, gint synth_state, const gchar *detail, gint x, gint y, gint width, gint height) { - gtk3_widget = gtk3_get_widget(widget_type); - - GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); - - fp_gtk_style_context_save (context); + GtkStyleContext* context = get_style(widget_type, detail); GtkStateFlags flags = get_gtk_state_flags(synth_state); if (gtk3_version_3_14 && (synth_state & SELECTED)) { - flags = GTK_STATE_FLAG_CHECKED; + flags &= ~GTK_STATE_FLAG_SELECTED; + flags |= GTK_STATE_FLAG_CHECKED; } fp_gtk_style_context_set_state(context, flags); - fp_gtk_style_context_add_class (context, "check"); - - fp_gtk_render_check (context, cr, x, y, width, height); - - fp_gtk_style_context_restore (context); + fp_gtk_render_background(context, cr, x, y, width, height); + fp_gtk_render_frame(context, cr, x, y, width, height); + fp_gtk_render_check(context, cr, x, y, width, height); + disposeOrRestoreContext(context); } @@ -1684,7 +1780,6 @@ gtk3_widget = gtk3_get_widget(widget_type); GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); - fp_gtk_style_context_save (context); if (detail != 0) { @@ -1787,25 +1882,19 @@ static void gtk3_paint_option(WidgetType widget_type, gint synth_state, const gchar *detail, gint x, gint y, gint width, gint height) { - gtk3_widget = gtk3_get_widget(widget_type); - - GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); - - fp_gtk_style_context_save (context); + GtkStyleContext* context = get_style(widget_type, detail); GtkStateFlags flags = get_gtk_state_flags(synth_state); if (gtk3_version_3_14 && (synth_state & SELECTED)) { - flags = GTK_STATE_FLAG_CHECKED; + flags &= ~GTK_STATE_FLAG_SELECTED; + flags |= GTK_STATE_FLAG_CHECKED; } fp_gtk_style_context_set_state(context, flags); - if (detail != 0) { - transform_detail_string(detail, context); - } - + fp_gtk_render_background(context, cr, x, y, width, height); + fp_gtk_render_frame(context, cr, x, y, width, height); fp_gtk_render_option(context, cr, x, y, width, height); - - fp_gtk_style_context_restore (context); + disposeOrRestoreContext(context); } static void gtk3_paint_shadow(WidgetType widget_type, GtkStateType state_type, @@ -1864,15 +1953,7 @@ gint x, gint y, gint width, gint height, GtkOrientation orientation, gboolean has_focus) { - gtk3_widget = gtk3_get_widget(widget_type); - - GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget); - - fp_gtk_style_context_save (context); - - if (detail) { - transform_detail_string(detail, context); - } + GtkStyleContext *context = get_style(widget_type, detail); GtkStateFlags flags = get_gtk_flags(state_type); @@ -1886,9 +1967,10 @@ fp_gtk_style_context_set_state (context, flags); + fp_gtk_render_background (context, cr, x, y, width, height); + fp_gtk_render_frame(context, cr, x, y, width, height); (*fp_gtk_render_slider)(context, cr, x, y, width, height, orientation); - - fp_gtk_style_context_restore (context); + disposeOrRestoreContext(context); } static void gtk3_paint_background(WidgetType widget_type, @@ -2278,6 +2360,11 @@ init_containers(); + if (widget_type == TEXT_FIELD && state_type == GTK_STATE_SELECTED && + color_type == TEXT_BACKGROUND) { + widget_type = TEXT_AREA; + } + gtk3_widget = gtk3_get_widget(widget_type); GtkStyleContext* context = fp_gtk_widget_get_style_context(gtk3_widget); diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.h --- a/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.h Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.h Fri Feb 22 20:36:42 2019 +0000 @@ -162,6 +162,7 @@ typedef void GtkRange; typedef void GtkProgressBar; typedef void GtkProgress; +typedef void GtkWidgetPath; /* Some real structures */ typedef struct @@ -238,7 +239,6 @@ GType owner_type; } GParamSpec; - static gchar* (*fp_glib_check_version)(guint required_major, guint required_minor, guint required_micro); @@ -573,5 +573,18 @@ static void (*fp_gtk_widget_size_request)(GtkWidget *widget, GtkRequisition *requisition); static GtkAdjustment* (*fp_gtk_range_get_adjustment)(GtkRange* range); +static GtkWidgetPath* (*fp_gtk_widget_path_copy) + (const GtkWidgetPath *path); +static const GtkWidgetPath* (*fp_gtk_style_context_get_path) + (GtkStyleContext *context); +static GtkWidgetPath* (*fp_gtk_widget_path_new) (void); +static gint (*fp_gtk_widget_path_append_type) + (GtkWidgetPath *path, GType type); +static void (*fp_gtk_widget_path_iter_set_object_name) + (GtkWidgetPath *path, gint pos, const char *name); +static void (*fp_gtk_style_context_set_path) + (GtkStyleContext *context, GtkWidgetPath *path); +static void (*fp_gtk_widget_path_unref) (GtkWidgetPath *path); +static GtkStyleContext* (*fp_gtk_style_context_new) (void); #endif /* !_GTK3_INTERFACE_H */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java --- a/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/windows/classes/sun/awt/windows/WInputMethod.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,7 @@ private Locale currentLocale; // indicate whether status window is hidden or not. private boolean statusWindowHidden = false; + private boolean hasCompositionString = false; // attribute definition in Win32 (in IMM.H) public static final byte ATTR_INPUT = 0x00; @@ -246,6 +247,7 @@ } else if (locale.getLanguage().equals(Locale.KOREAN.getLanguage())) { if (subset1 == UnicodeBlock.BASIC_LATIN || subset1 == InputSubset.LATIN_DIGITS) { setOpenStatus(context, false); + setConversionStatus(context, IME_CMODE_ALPHANUMERIC); } else { if (subset1 == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || subset1 == InputSubset.HANJA @@ -263,11 +265,14 @@ } else if (locale.getLanguage().equals(Locale.CHINESE.getLanguage())) { if (subset1 == UnicodeBlock.BASIC_LATIN || subset1 == InputSubset.LATIN_DIGITS) { setOpenStatus(context, false); + newmode = getConversionStatus(context); + newmode &= ~IME_CMODE_FULLSHAPE; + setConversionStatus(context, newmode); } else { if (subset1 == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || subset1 == InputSubset.TRADITIONAL_HANZI || subset1 == InputSubset.SIMPLIFIED_HANZI) - newmode = IME_CMODE_NATIVE; + newmode = IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE; else if (subset1 == InputSubset.FULLWIDTH_LATIN) newmode = IME_CMODE_FULLSHAPE; else @@ -318,6 +323,15 @@ setLocale(currentLocale, true); } + // Compare IM's composition string with Java's composition string + if (hasCompositionString && !isCompositionStringAvailable(context)) { + endCompositionNative(context, DISCARD_INPUT); + sendInputMethodEvent(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED, + EventQueue.getMostRecentEventTime(), + null, null, null, null, null, 0, 0, 0); + hasCompositionString = false; + } + /* If the status window or Windows language bar is turned off due to native input method was switched to java input method, we have to turn it on otherwise it is gone for good until next time @@ -345,6 +359,7 @@ isLastFocussedActiveClient = haveActiveClient(); } isActive = false; + hasCompositionString = isCompositionStringAvailable(context); } /** @@ -649,4 +664,5 @@ static native Locale getNativeLocale(); static native boolean setNativeLocale(String localeName, boolean onActivate); private native void openCandidateWindow(WComponentPeer peer, int x, int y); + private native boolean isCompositionStringAvailable(int context); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/windows/native/libawt/windows/awt_Component.cpp --- a/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/windows/native/libawt/windows/awt_Component.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3869,6 +3869,11 @@ return; } COMPOSITIONFORM cf = {CFS_DEFAULT, {0, 0}, {0, 0, 0, 0}}; + LOGFONT lf; + HFONT hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); + if (GetObject(hFont, sizeof(lf), (LPVOID)&lf) == sizeof(lf)) { + ImmSetCompositionFont(hIMC, &lf); + } ImmSetCompositionWindow(hIMC, &cf); ImmReleaseContext(hwnd, hIMC); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp --- a/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.desktop/windows/native/libawt/windows/awt_InputMethod.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -528,6 +528,23 @@ CATCH_BAD_ALLOC_RET(NULL); } +/* + * Class: sun_awt_windows_WInputMethod + * Method: isCompositionStringAvailable + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_sun_awt_windows_WInputMethod_isCompositionStringAvailable + (JNIEnv *env, jobject self, jint context) +{ + LONG length; + length = ImmGetCompositionString((HIMC)IntToPtr(context), GCS_COMPSTR, NULL, 0); + if (length > 0) { + return JNI_TRUE; + } else { + return JNI_FALSE; + } +} + /** * Class: sun_awt_windows_WInputMethod * Method: getNativeIMMDescription diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.logging/share/classes/java/util/logging/Handler.java --- a/src/java.logging/share/classes/java/util/logging/Handler.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.logging/share/classes/java/util/logging/Handler.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -329,12 +329,13 @@ * handler from logging the {@code LogRecord}. It will return false if * the {@code LogRecord} is null. * - * @param record a {@code LogRecord} + * @param record a {@code LogRecord} (may be null). * @return true if the {@code LogRecord} would be logged. * */ public boolean isLoggable(LogRecord record) { final int levelValue = getLevel().intValue(); + if (record == null) return false; if (record.getLevel().intValue() < levelValue || levelValue == offValue) { return false; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.logging/share/classes/java/util/logging/MemoryHandler.java --- a/src/java.logging/share/classes/java/util/logging/MemoryHandler.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.logging/share/classes/java/util/logging/MemoryHandler.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -270,7 +270,7 @@ * check whether the {@code LogRecord} would result in a "push" of the * buffer contents. It will return false if the {@code LogRecord} is null. * - * @param record a {@code LogRecord} + * @param record a {@code LogRecord} (may be null). * @return true if the {@code LogRecord} would be logged. * */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.logging/share/classes/java/util/logging/StreamHandler.java --- a/src/java.logging/share/classes/java/util/logging/StreamHandler.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.logging/share/classes/java/util/logging/StreamHandler.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -225,7 +225,7 @@ * whether it satisfies any {@code Filter}. It will also return false if * no output stream has been assigned yet or the LogRecord is null. * - * @param record a {@code LogRecord} + * @param record a {@code LogRecord} (may be null). * @return true if the {@code LogRecord} would be logged. * */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/java.rmi/share/classes/java/rmi/server/RMIFailureHandler.java --- a/src/java.rmi/share/classes/java/rmi/server/RMIFailureHandler.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/java.rmi/share/classes/java/rmi/server/RMIFailureHandler.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved. * 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,13 +26,13 @@ package java.rmi.server; /** - * An RMIFailureHandler can be registered via the - * RMISocketFactory.setFailureHandler call. The - * failure method of the handler is invoked when the RMI - * runtime is unable to create a ServerSocket to listen - * for incoming calls. The failure method returns a boolean + * An {@code RMIFailureHandler} can be registered via the + * {@code RMISocketFactory.setFailureHandler} call. The + * {@code failure} method of the handler is invoked when the RMI + * runtime is unable to create a {@code ServerSocket} to listen + * for incoming calls. The {@code failure} method returns a boolean * indicating whether the runtime should attempt to re-create the - * ServerSocket. + * {@code ServerSocket}. * * @author Ann Wollrath * @since 1.1 @@ -40,18 +40,18 @@ public interface RMIFailureHandler { /** - * The failure callback is invoked when the RMI - * runtime is unable to create a ServerSocket via the - * RMISocketFactory. An RMIFailureHandler + * The {@code failure} callback is invoked when the RMI + * runtime is unable to create a {@code ServerSocket} via the + * {@code RMISocketFactory}. An {@code RMIFailureHandler} * is registered via a call to - * RMISocketFacotry.setFailureHandler. If no failure + * {@code RMISocketFactory.setFailureHandler}. If no failure * handler is installed, the default behavior is to attempt to * re-create the ServerSocket. * - * @param ex the exception that occurred during ServerSocket + * @param ex the exception that occurred during {@code ServerSocket} * creation * @return if true, the RMI runtime attempts to retry - * ServerSocket creation + * {@code ServerSocket} creation * @see java.rmi.server.RMISocketFactory#setFailureHandler(RMIFailureHandler) * @since 1.1 */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java --- a/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2018, SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -138,7 +138,7 @@ * Execute the given command in the target VM. */ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { - assert args.length <= 3; // includes null + assert args.length <= 4; // includes null // did we detach? synchronized (this) { @@ -166,7 +166,7 @@ writeString(s, PROTOCOL_VERSION); writeString(s, cmd); - for (int i=0; i<3; i++) { + for (int i = 0; i < 4; i++) { if (i < args.length && args[i] != null) { writeString(s, (String)args[i]); } else { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java --- a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * 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,7 +143,7 @@ * Execute the given command in the target VM. */ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { - assert args.length <= 3; // includes null + assert args.length <= 4; // includes null // did we detach? synchronized (this) { @@ -171,7 +171,7 @@ writeString(s, PROTOCOL_VERSION); writeString(s, cmd); - for (int i=0; i<3; i++) { + for (int i = 0; i < 4; i++) { if (i < args.length && args[i] != null) { writeString(s, (String)args[i]); } else { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java --- a/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,7 +139,7 @@ * Execute the given command in the target VM. */ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { - assert args.length <= 3; // includes null + assert args.length <= 4; // includes null // did we detach? synchronized (this) { @@ -167,7 +167,7 @@ writeString(s, PROTOCOL_VERSION); writeString(s, cmd); - for (int i=0; i<3; i++) { + for (int i = 0; i < 4; i++) { if (i < args.length && args[i] != null) { writeString(s, (String)args[i]); } else { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java --- a/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.attach/solaris/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -126,7 +126,7 @@ * Execute the given command in the target VM. */ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { - assert args.length <= 3; // includes null + assert args.length <= 4; // includes null // first check that we are still attached int door; diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java --- a/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,7 +77,7 @@ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { - assert args.length <= 3; // includes null + assert args.length <= 4; // includes null // create a pipe using a random name Random rnd = new Random(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java --- a/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/P11Key.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -106,7 +106,7 @@ static { PrivilegedAction getKeyExtractionProp = () -> System.getProperty( - "sun.security.pkcs11.disableKeyExtraction", "true"); + "sun.security.pkcs11.disableKeyExtraction", "false"); String disableKeyExtraction = AccessController.doPrivileged(getKeyExtractionProp); DISABLE_NATIVE_KEYS_EXTRACTION = diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c --- a/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.crypto.cryptoki/share/native/libj2pkcs11/p11_keymgmt.c Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. @@ -151,14 +151,14 @@ unsigned int i = 0U; unsigned long totalDataSize = 0UL, attributesCount = 0UL; unsigned long totalCkAttributesSize = 0UL, totalNativeKeyInfoArraySize = 0UL; - unsigned long* wrappedKeySizePtr = NULL; + jbyte* wrappedKeySizePtr = NULL; jbyte* nativeKeyInfoArrayRawCkAttributes = NULL; jbyte* nativeKeyInfoArrayRawCkAttributesPtr = NULL; jbyte* nativeKeyInfoArrayRawDataPtr = NULL; CK_MECHANISM ckMechanism; char iv[16] = {0x0}; CK_ULONG ckWrappedKeyLength = 0U; - unsigned long* wrappedKeySizeWrappedKeyArrayPtr = NULL; + jbyte* wrappedKeySizeWrappedKeyArrayPtr = NULL; CK_BYTE_PTR wrappedKeyBufferPtr = NULL; CK_FUNCTION_LIST_PTR ckpFunctions = getFunctionList(env, obj); CK_OBJECT_CLASS class; @@ -234,7 +234,7 @@ // * sizes are expressed in bytes and data type is unsigned long totalCkAttributesSize = attributesCount * sizeof(CK_ATTRIBUTE); TRACE1("DEBUG: GetNativeKeyInfo attributesCount = %lu\n", attributesCount); - TRACE1("DEBUG: GetNativeKeyInfo sizeof CK_ATTRIBUTE = %lu\n", sizeof(CK_ATTRIBUTE)); + TRACE1("DEBUG: GetNativeKeyInfo sizeof CK_ATTRIBUTE = %zu\n", sizeof(CK_ATTRIBUTE)); TRACE1("DEBUG: GetNativeKeyInfo totalCkAttributesSize = %lu\n", totalCkAttributesSize); TRACE1("DEBUG: GetNativeKeyInfo totalDataSize = %lu\n", totalDataSize); @@ -254,8 +254,8 @@ goto cleanup; } - wrappedKeySizePtr = (unsigned long*)(nativeKeyInfoArrayRaw + - sizeof(unsigned long)*2 + totalCkAttributesSize + totalDataSize); + wrappedKeySizePtr = nativeKeyInfoArrayRaw + + sizeof(unsigned long)*2 + totalCkAttributesSize + totalDataSize; memcpy(nativeKeyInfoArrayRaw, &totalCkAttributesSize, sizeof(unsigned long)); memcpy(nativeKeyInfoArrayRaw + sizeof(unsigned long) + totalCkAttributesSize, @@ -330,15 +330,15 @@ memcpy(nativeKeyInfoWrappedKeyArrayRaw, nativeKeyInfoArrayRaw, totalNativeKeyInfoArraySize); wrappedKeySizeWrappedKeyArrayPtr = - (unsigned long*)(nativeKeyInfoWrappedKeyArrayRaw + + nativeKeyInfoWrappedKeyArrayRaw + sizeof(unsigned long)*2 + totalCkAttributesSize + - totalDataSize); + totalDataSize; memcpy(wrappedKeySizeWrappedKeyArrayPtr, &ckWrappedKeyLength, sizeof(unsigned long)); TRACE1("DEBUG: GetNativeKeyInfo 1st C_WrapKey wrappedKeyLength = %lu\n", ckWrappedKeyLength); wrappedKeyBufferPtr = - (unsigned char*)wrappedKeySizeWrappedKeyArrayPtr + - sizeof(unsigned long); + (CK_BYTE_PTR) (wrappedKeySizeWrappedKeyArrayPtr + + sizeof(unsigned long)); rv = (*ckpFunctions->C_WrapKey)(ckSessionHandle, &ckMechanism, jLongToCKULong(jWrappingKeyHandle),ckObjectHandle, wrappedKeyBufferPtr, &ckWrappedKeyLength); @@ -414,7 +414,7 @@ jbyte* nativeKeyInfoArrayRawCkAttributesPtr = NULL; jbyte* nativeKeyInfoArrayRawDataPtr = NULL; unsigned long totalDataSize = 0UL; - unsigned long* wrappedKeySizePtr = NULL; + jbyte* wrappedKeySizePtr = NULL; unsigned int i = 0U; CK_MECHANISM ckMechanism; char iv[16] = {0x0}; @@ -443,8 +443,8 @@ sizeof(unsigned long)); TRACE1("DEBUG: createNativeKey totalDataSize = %lu\n", totalDataSize); - wrappedKeySizePtr = (unsigned long*)(nativeKeyInfoArrayRaw + - sizeof(unsigned long)*2 + totalCkAttributesSize + totalDataSize); + wrappedKeySizePtr = nativeKeyInfoArrayRaw + + sizeof(unsigned long)*2 + totalCkAttributesSize + totalDataSize; memcpy(&ckWrappedKeyLength, wrappedKeySizePtr, sizeof(unsigned long)); TRACE1("DEBUG: createNativeKey wrappedKeyLength = %lu\n", ckWrappedKeyLength); @@ -470,7 +470,8 @@ jMechanismToCKMechanism(env, jWrappingMech, &ckMechanism); rv = (*ckpFunctions->C_UnwrapKey)(ckSessionHandle, &ckMechanism, jLongToCKULong(jWrappingKeyHandle), - (CK_BYTE_PTR)(wrappedKeySizePtr + 1), ckWrappedKeyLength, + (CK_BYTE_PTR)(wrappedKeySizePtr + sizeof(unsigned long)), + ckWrappedKeyLength, (CK_ATTRIBUTE_PTR)nativeKeyInfoArrayRawCkAttributes, jLongToCKULong(nativeKeyInfoCkAttributesCount), &ckObjectHandle); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,6 @@ package sun.jvm.hotspot.classfile; -import java.io.PrintStream; import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.memory.*; import sun.jvm.hotspot.runtime.*; @@ -42,14 +41,14 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("ClassLoaderData"); - classLoaderField = type.getAddressField("_class_loader"); + classLoaderFieldOffset = type.getAddressField("_class_loader").getOffset(); nextField = type.getAddressField("_next"); klassesField = new MetadataField(type.getAddressField("_klasses"), 0); isUnsafeAnonymousField = new CIntField(type.getCIntegerField("_is_unsafe_anonymous"), 0); dictionaryField = type.getAddressField("_dictionary"); } - private static AddressField classLoaderField; + private static long classLoaderFieldOffset; private static AddressField nextField; private static MetadataField klassesField; private static CIntField isUnsafeAnonymousField; @@ -72,13 +71,9 @@ } public Oop getClassLoader() { - Address handle = classLoaderField.getValue(getAddress()); - if (handle != null) { - // Load through the handle - OopHandle refs = handle.getOopHandleAt(0); - return (Instance)VM.getVM().getObjectHeap().newOop(refs); - } - return null; + Address addr = getAddress().addOffsetTo(classLoaderFieldOffset); + VMOopHandle vmOopHandle = VMObjectFactory.newObject(VMOopHandle.class, addr); + return vmOopHandle.resolve(); } public boolean getisUnsafeAnonymous() { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/CompactibleFreeListSpace.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/CompactibleFreeListSpace.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/CompactibleFreeListSpace.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,7 @@ import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; -public class CompactibleFreeListSpace extends CompactibleSpace { +public class CompactibleFreeListSpace extends CompactibleSpace implements LiveRegionsProvider { private static AddressField collectorField; private static AddressField indexedFreeListField; private static AddressField dictionaryField; @@ -93,10 +93,10 @@ } public long used0() { - List regions = getLiveRegions(); + List regions = getLiveRegions(); long usedSize = 0L; - for (Iterator itr = regions.iterator(); itr.hasNext();) { - MemRegion mr = (MemRegion) itr.next(); + for (Iterator itr = regions.iterator(); itr.hasNext();) { + MemRegion mr = itr.next(); usedSize += mr.byteSize(); } return usedSize; @@ -154,8 +154,9 @@ return addr; } - public List/**/ getLiveRegions() { - List res = new ArrayList(); // List + @Override + public List getLiveRegions() { + List res = new ArrayList<>(); VM vm = VM.getVM(); Debugger dbg = vm.getDebugger(); ObjectHeap heap = vm.getObjectHeap(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/ConcurrentMarkSweepGeneration.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/ConcurrentMarkSweepGeneration.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/cms/ConcurrentMarkSweepGeneration.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * 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,6 +66,9 @@ public void spaceIterate(SpaceClosure blk, boolean usedOnly) { blk.doSpace(cmsSpace()); } + public void liveRegionsIterate(LiveRegionsClosure closure) { + closure.doLiveRegions(cmsSpace()); + } public Generation.Name kind() { return Generation.Name.CONCURRENT_MARK_SWEEP; diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/epsilon/EpsilonHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/epsilon/EpsilonHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/epsilon/EpsilonHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -66,11 +66,26 @@ return CollectedHeapName.EPSILON; } + @Override + public long capacity() { + return space.capacity(); + } + + @Override + public long used() { + return space.used(); + } + public ContiguousSpace space() { return space; } @Override + public void liveRegionsIterate(LiveRegionsClosure closure) { + closure.doLiveRegions(space()); + } + + @Override public void printOn(PrintStream tty) { MemRegion mr = reservedRegion(); tty.println("Epsilon heap"); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/G1CollectedHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. * 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,8 +32,9 @@ import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.gc.shared.CollectedHeap; import sun.jvm.hotspot.gc.shared.CollectedHeapName; +import sun.jvm.hotspot.gc.shared.LiveRegionsClosure; +import sun.jvm.hotspot.gc.shared.PrintRegionClosure; import sun.jvm.hotspot.gc.shared.SpaceClosure; -import sun.jvm.hotspot.gc.shared.PrintRegionClosure; import sun.jvm.hotspot.memory.MemRegion; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.runtime.VMObjectFactory; @@ -138,6 +139,15 @@ } @Override + public void liveRegionsIterate(LiveRegionsClosure closure) { + Iterator iter = heapRegionIterator(); + while (iter.hasNext()) { + HeapRegion hr = iter.next(); + closure.doLiveRegions(hr); + } + } + + @Override public void printOn(PrintStream tty) { MemRegion mr = reservedRegion(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegion.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegion.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/g1/HeapRegion.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. * 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 sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.debugger.OopHandle; import sun.jvm.hotspot.gc.shared.CompactibleSpace; +import sun.jvm.hotspot.gc.shared.LiveRegionsProvider; import sun.jvm.hotspot.memory.MemRegion; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.runtime.VMObjectFactory; @@ -43,7 +44,7 @@ // Mirror class for HeapRegion. Currently we don't actually include // any of its fields but only iterate over it. -public class HeapRegion extends CompactibleSpace { +public class HeapRegion extends CompactibleSpace implements LiveRegionsProvider { // static int GrainBytes; static private CIntegerField grainBytesField; static private AddressField topField; @@ -86,8 +87,8 @@ } @Override - public List getLiveRegions() { - List res = new ArrayList(); + public List getLiveRegions() { + List res = new ArrayList<>(); res.add(new MemRegion(bottom(), top())); return res; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ImmutableSpace.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ImmutableSpace.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ImmutableSpace.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * 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 @@ } /** returns all MemRegions where live objects are */ - public abstract List/**/ getLiveRegions(); + public abstract List getLiveRegions(); /** Returned value is in bytes */ public long capacity() { return end().minus(bottom()); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/MutableSpace.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/MutableSpace.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/MutableSpace.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,8 +62,8 @@ } /** returns all MemRegions where live objects are */ - public List/**/ getLiveRegions() { - List res = new ArrayList(); + public List getLiveRegions() { + List res = new ArrayList<>(); res.add(new MemRegion(bottom(), top())); return res; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ParallelScavengeHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ParallelScavengeHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/parallel/ParallelScavengeHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,7 @@ import sun.jvm.hotspot.debugger.*; import sun.jvm.hotspot.gc.shared.*; +import sun.jvm.hotspot.memory.MemRegion; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; @@ -88,6 +89,35 @@ return CollectedHeapName.PARALLEL; } + // Simple wrapper to provide toString() usable for debugging. + private class LiveRegionProviderImpl implements LiveRegionsProvider { + private String name; + private MutableSpace space; + + public LiveRegionProviderImpl(String name, MutableSpace space) { + this.name = name; + this.space = space; + } + + @Override + public List getLiveRegions() { + return space.getLiveRegions(); + } + @Override + public String toString() { + return name; + } + } + + public void liveRegionsIterate(LiveRegionsClosure closure) { + // Add eden space + closure.doLiveRegions(new LiveRegionProviderImpl("eden", youngGen().edenSpace())); + // Add from-space but not to-space + closure.doLiveRegions(new LiveRegionProviderImpl("from", youngGen().fromSpace())); + + closure.doLiveRegions(new LiveRegionProviderImpl("old ", oldGen().objectSpace())); + } + public void printOn(PrintStream tty) { tty.print("ParallelScavengeHeap [ "); youngGen().printOn(tty); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/DefNewGeneration.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -94,6 +94,11 @@ } } + public void liveRegionsIterate(LiveRegionsClosure closure) { + closure.doLiveRegions(eden()); + closure.doLiveRegions(from()); + } + public void printOn(PrintStream tty) { tty.print(" eden"); eden().printOn(tty); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/serial/TenuredGeneration.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -76,6 +76,10 @@ blk.doSpace(theSpace()); } + public void liveRegionsIterate(LiveRegionsClosure closure) { + closure.doLiveRegions(theSpace()); + } + public void printOn(PrintStream tty) { tty.print(" old "); theSpace().printOn(tty); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/CollectedHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,12 @@ import java.util.*; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.gc.shared.*; import sun.jvm.hotspot.memory.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; +import sun.jvm.hotspot.utilities.BitMapInterface; +import sun.jvm.hotspot.utilities.BitMapSegmented; public abstract class CollectedHeap extends VMObject { private static long reservedFieldOffset; @@ -58,8 +61,8 @@ return reservedRegion().start(); } - public long capacity() { return 0; } - public long used() { return 0; } + public abstract long capacity(); + public abstract long used(); public MemRegion reservedRegion() { return new MemRegion(addr.addOffsetTo(reservedFieldOffset)); @@ -75,6 +78,8 @@ public abstract CollectedHeapName kind(); + public abstract void liveRegionsIterate(LiveRegionsClosure closure); + public String oopAddressDescription(OopHandle handle) { return handle.toString(); } @@ -83,10 +88,18 @@ return handle.getOopHandleAt(offset); } + public OopHandle oop_load_in_native(Address addr) { + return addr.getOopHandleAt(0); + } + public void print() { printOn(System.out); } public void printOn(PrintStream tty) { MemRegion mr = reservedRegion(); tty.println("unknown subtype of CollectedHeap @ " + getAddress() + " (" + mr.start() + "," + mr.end() + ")"); } + + public BitMapInterface createBitMap(long bits) { + return new BitMapSegmented(bits); + } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/ContiguousSpace.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/ContiguousSpace.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/ContiguousSpace.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * 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,7 +32,7 @@ import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; -public class ContiguousSpace extends CompactibleSpace { +public class ContiguousSpace extends CompactibleSpace implements LiveRegionsProvider { private static AddressField topField; static { @@ -79,8 +79,8 @@ } /** Returns regions of Space where live objects live */ - public List/**/ getLiveRegions() { - List res = new ArrayList(); + public List getLiveRegions() { + List res = new ArrayList<>(); res.add(new MemRegion(bottom(), top())); return res; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenCollectedHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenCollectedHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenCollectedHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,7 @@ import java.util.*; import sun.jvm.hotspot.debugger.*; +import sun.jvm.hotspot.gc.shared.*; import sun.jvm.hotspot.runtime.*; import sun.jvm.hotspot.types.*; import sun.jvm.hotspot.utilities.*; @@ -134,6 +135,14 @@ } } + public void liveRegionsIterate(LiveRegionsClosure closure) { + // Run through all generations, obtaining bottom-top pairs. + for (int i = 0; i < nGens(); i++) { + Generation gen = getGen(i); + gen.liveRegionsIterate(closure); + } + } + public void printOn(PrintStream tty) { for (int i = 0; i < nGens(); i++) { tty.print("Gen " + i + ": "); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Generation.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -184,6 +184,7 @@ /** Iteration - do not use for time critical operations */ public abstract void spaceIterate(SpaceClosure blk, boolean usedOnly); + public abstract void liveRegionsIterate(LiveRegionsClosure closure); public void print() { printOn(System.out); } public abstract void printOn(PrintStream tty); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationFactory.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationFactory.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/GenerationFactory.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,6 +65,8 @@ } public void spaceIterate(SpaceClosure blk, boolean usedOnly) { } + public void liveRegionsIterate(LiveRegionsClosure closure) { + } public void printOn(java.io.PrintStream tty) { tty.println("unknown subtype of Generation @ " + getAddress() + " (" + virtualSpace().low() + "," + virtualSpace().high() + ")"); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/LiveRegionsClosure.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/LiveRegionsClosure.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.gc.shared; + +public interface LiveRegionsClosure { + public void doLiveRegions(LiveRegionsProvider lrp); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/LiveRegionsProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/LiveRegionsProvider.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.gc.shared; + +import java.util.List; + +import sun.jvm.hotspot.memory.MemRegion; + +public interface LiveRegionsProvider { + public List getLiveRegions(); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Space.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Space.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shared/Space.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,9 +89,6 @@ return handle.addOffsetToAsOopHandle(size); } - /** returns all MemRegions where live objects are */ - public abstract List/**/ getLiveRegions(); - /** Returned value is in bytes */ public long capacity() { return end().minus(bottom()); } /** Returned value is in bytes */ diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/shenandoah/ShenandoahHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -25,6 +25,7 @@ import sun.jvm.hotspot.gc.shared.CollectedHeap; import sun.jvm.hotspot.gc.shared.CollectedHeapName; +import sun.jvm.hotspot.gc.shared.LiveRegionsClosure; import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.types.Type; @@ -64,6 +65,11 @@ } @Override + public long capacity() { + return numOfRegions() * ShenandoahHeapRegion.regionSizeBytes(); + } + + @Override public long used() { return used.getValue(addr); } @@ -73,6 +79,12 @@ } @Override + public void liveRegionsIterate(LiveRegionsClosure closure) { + // Operation (currently) not supported with Shenandoah GC. + System.err.println("Warning: Operation not supported with Shenandoah GC"); + } + + @Override public void printOn(PrintStream tty) { MemRegion mr = reservedRegion(); tty.print("Shenandoah heap"); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddress.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ value |= ZGlobals.ZAddressSpaceStart; } - return ZOop.to_address(value); + return ZUtils.longToAddress(value); } static Address good(Address value) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddressRangeMapForPageTable.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddressRangeMapForPageTable.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZAddressRangeMapForPageTable.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,15 +54,38 @@ return mapField.getValue(addr); } + public long size() { + return ZGlobals.ZAddressOffsetMax >> AddressRangeShift; + } + private long index_for_addr(Address addr) { long index = ZAddress.offset(addr) >> AddressRangeShift; return index; } + Address at(long index) { + return map().getAddressAt(index * VM.getVM().getBytesPerLong()); + } + Address get(Address addr) { long index = index_for_addr(addr); + return at(index); + } - return map().getAddressAt(index * VM.getVM().getBytesPerLong()); + public class Iterator { + private long next = 0; + + boolean hasNext() { + return next < size(); + } + + Address next() { + if (next >= size()) { + throw new RuntimeException("OOIBE"); + } + + return at(next++); + } } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZCollectedHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZCollectedHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZCollectedHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * 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,20 +25,22 @@ package sun.jvm.hotspot.gc.z; import java.io.PrintStream; +import java.util.Iterator; import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.debugger.OopHandle; import sun.jvm.hotspot.gc.shared.CollectedHeap; import sun.jvm.hotspot.gc.shared.CollectedHeapName; +import sun.jvm.hotspot.gc.shared.LiveRegionsClosure; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.runtime.VMObjectFactory; import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; +import sun.jvm.hotspot.utilities.BitMapInterface; // Mirror class for ZCollectedHeap. public class ZCollectedHeap extends CollectedHeap { - private static long zHeapFieldOffset; static { @@ -70,11 +72,19 @@ super(addr); } - public OopHandle oop_load_at(OopHandle handle, long offset) { - assert(!VM.getVM().isCompressedOopsEnabled()); + @Override + public long capacity() { + return heap().capacity(); + } - Address oopAddress = handle.getAddressAt(offset); + @Override + public long used() { + return heap().used(); + } + + + private OopHandle oop_load_barrier(Address oopAddress) { oopAddress = ZBarrier.weak_barrier(oopAddress); if (oopAddress == null) { return null; @@ -83,6 +93,23 @@ return oopAddress.addOffsetToAsOopHandle(0); } + @Override + public OopHandle oop_load_at(OopHandle handle, long offset) { + assert(!VM.getVM().isCompressedOopsEnabled()); + + Address oopAddress = handle.getAddressAt(offset); + + return oop_load_barrier(oopAddress); + } + + // addr can be either in heap or in native + @Override + public OopHandle oop_load_in_native(Address addr) { + Address oopAddress = addr.getAddressAt(0); + + return oop_load_barrier(oopAddress); + } + public String oopAddressDescription(OopHandle handle) { Address origOop = ZOop.to_address(handle); Address loadBarrieredOop = ZBarrier.weak_barrier(origOop); @@ -92,4 +119,19 @@ return handle.toString(); } } + + @Override + public void liveRegionsIterate(LiveRegionsClosure closure) { + Iterator iter = heap().pageTable().activePagesIterator(); + while (iter.hasNext()) { + ZPage page = iter.next(); + closure.doLiveRegions(page); + } + } + + @Override + public BitMapInterface createBitMap(long size) { + // Ignores the size + return new ZExternalBitMap(this); + } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZExternalBitMap.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZExternalBitMap.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.gc.z; + +import java.util.HashMap; + +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.utilities.BitMap; +import sun.jvm.hotspot.utilities.BitMapInterface; + +/** Discontiguous bitmap for ZGC. */ +public class ZExternalBitMap implements BitMapInterface { + private ZPageTable pageTable; + private final long oopSize; + + private HashMap pageToBitMap = new HashMap(); + + public ZExternalBitMap(ZCollectedHeap collectedHeap) { + pageTable = collectedHeap.heap().pageTable(); + oopSize = VM.getVM().getOopSize(); + } + + private ZPage getPage(long zOffset) { + if (zOffset > ZGlobals.ZAddressOffsetMask) { + throw new RuntimeException("Not a Z offset: " + zOffset); + } + + ZPage page = pageTable.get(ZUtils.longToAddress(zOffset)); + if (page == null) { + throw new RuntimeException("Address not in pageTable: " + zOffset); + } + return page; + } + + private BitMap getOrAddBitMap(ZPage page) { + BitMap bitMap = pageToBitMap.get(page); + if (bitMap == null) { + long size = page.size(); + + long maxNumObjects = size >>> page.object_alignment_shift(); + if (maxNumObjects > Integer.MAX_VALUE) { + throw new RuntimeException("int overflow"); + } + int intMaxNumObjects = (int)maxNumObjects; + + bitMap = new BitMap(intMaxNumObjects); + pageToBitMap.put(page, bitMap); + } + + return bitMap; + } + + private int pageLocalBitMapIndex(ZPage page, long zOffset) { + long pageLocalZOffset = zOffset - page.start(); + return (int)(pageLocalZOffset >>> page.object_alignment_shift()); + } + + private long convertToZOffset(long offset) { + long addr = ZGlobals.ZAddressSpaceStart + oopSize * offset; + return addr & ZGlobals.ZAddressOffsetMask; + } + + @Override + public boolean at(long offset) { + long zOffset = convertToZOffset(offset); + ZPage page = getPage(zOffset); + BitMap bitMap = getOrAddBitMap(page); + int index = pageLocalBitMapIndex(page, zOffset); + + return bitMap.at(index); + } + + @Override + public void atPut(long offset, boolean value) { + long zOffset = convertToZOffset(offset); + ZPage page = getPage(zOffset); + BitMap bitMap = getOrAddBitMap(page); + int index = pageLocalBitMapIndex(page, zOffset); + + bitMap.atPut(index, value); + } + + @Override + public void clear() { + for (BitMap bitMap : pageToBitMap.values()) { + bitMap.clear(); + } + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobals.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobals.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobals.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,7 @@ // Pointer part of address public static long ZAddressOffsetBits; public static long ZAddressOffsetMask; + public static long ZAddressOffsetMax; // Address space start/end/size public static long ZAddressSpaceStart; @@ -84,6 +85,7 @@ ZAddressOffsetBits = db.lookupLongConstant("ZAddressOffsetBits").longValue(); ZAddressOffsetMask = db.lookupLongConstant("ZAddressOffsetMask").longValue(); + ZAddressOffsetMax = db.lookupLongConstant("ZAddressOffsetMax").longValue(); ZAddressSpaceStart = db.lookupLongConstant("ZAddressSpaceStart").longValue(); } @@ -96,6 +98,10 @@ return instance().ZGlobalPhase(); } + public static int ZGlobalSeqNum() { + return instance().ZGlobalSeqNum(); + } + public static long ZAddressGoodMask() { return instance().ZAddressGoodMask(); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobalsForVMStructs.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobalsForVMStructs.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZGlobalsForVMStructs.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * 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 @@ class ZGlobalsForVMStructs extends VMObject { private static AddressField ZGlobalPhaseField; + private static AddressField ZGlobalSeqNumField; private static AddressField ZAddressGoodMaskField; private static AddressField ZAddressBadMaskField; private static AddressField ZAddressWeakBadMaskField; @@ -47,6 +48,7 @@ Type type = db.lookupType("ZGlobalsForVMStructs"); ZGlobalPhaseField = type.getAddressField("_ZGlobalPhase"); + ZGlobalSeqNumField = type.getAddressField("_ZGlobalSeqNum"); ZAddressGoodMaskField = type.getAddressField("_ZAddressGoodMask"); ZAddressBadMaskField = type.getAddressField("_ZAddressBadMask"); ZAddressWeakBadMaskField = type.getAddressField("_ZAddressWeakBadMask"); @@ -62,6 +64,10 @@ return ZGlobalPhaseField.getValue(addr).getJIntAt(0); } + int ZGlobalSeqNum() { + return ZGlobalSeqNumField.getValue(addr).getJIntAt(0); + } + long ZAddressGoodMask() { return ZAddressGoodMaskField.getValue(addr).getJLongAt(0); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZOop.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZOop.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZOop.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * 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,23 +26,9 @@ import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.debugger.OopHandle; -import sun.jvm.hotspot.runtime.VM; class ZOop { - private static final long MSB = ~0L ^ (~0L >>> 1); - - private static Address msbAddress() { - return VM.getVM().getUniverse().heap().start().orWithMask(MSB).andWithMask(MSB); - } - - static Address to_address(long value) { - // If the value of an Address becomes 0, null is returned instead of an Address. - // Start with a one-bit address and as a last step, remove that bit. - Address oneAddress = msbAddress(); - return oneAddress.orWithMask(value).xorWithMask(ZAddress.as_long(oneAddress)); - } - static Address to_address(OopHandle oop) { - return to_address(ZAddress.as_long(oop)); + return ZUtils.longToAddress(ZAddress.as_long(oop)); } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPage.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPage.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPage.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,17 +24,29 @@ package sun.jvm.hotspot.gc.z; +import java.util.ArrayList; +import java.util.List; + import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.debugger.OopHandle; +import sun.jvm.hotspot.gc.shared.LiveRegionsProvider; +import sun.jvm.hotspot.memory.MemRegion; +import sun.jvm.hotspot.oops.Oop; +import sun.jvm.hotspot.oops.UnknownOopException; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.runtime.VMObject; import sun.jvm.hotspot.runtime.VMObjectFactory; +import sun.jvm.hotspot.types.AddressField; import sun.jvm.hotspot.types.CIntegerField; import sun.jvm.hotspot.types.Type; import sun.jvm.hotspot.types.TypeDataBase; -public class ZPage extends VMObject { +public class ZPage extends VMObject implements LiveRegionsProvider { private static CIntegerField typeField; + private static CIntegerField seqnumField; private static long virtualFieldOffset; + private static AddressField topField; + private static CIntegerField refcountField; private static long forwardingFieldOffset; static { @@ -45,7 +57,10 @@ Type type = db.lookupType("ZPage"); typeField = type.getCIntegerField("_type"); + seqnumField = type.getCIntegerField("_seqnum"); virtualFieldOffset = type.getField("_virtual").getOffset(); + topField = type.getAddressField("_top"); + refcountField = type.getCIntegerField("_refcount"); forwardingFieldOffset = type.getField("_forwarding").getOffset(); } @@ -57,18 +72,50 @@ return typeField.getJByte(addr); } + private int seqnum() { + return seqnumField.getJInt(addr); + } + private ZVirtualMemory virtual() { - return (ZVirtualMemory)VMObjectFactory.newObject(ZVirtualMemory.class, addr.addOffsetTo(virtualFieldOffset)); + return VMObjectFactory.newObject(ZVirtualMemory.class, addr.addOffsetTo(virtualFieldOffset)); + } + + private Address top() { + return topField.getValue(addr); + } + + private int refcount() { + // refcount is uint32_t so need to be cautious when using this field. + return refcountField.getJInt(addr); } private ZForwardingTable forwarding() { - return (ZForwardingTable)VMObjectFactory.newObject(ZForwardingTable.class, addr.addOffsetTo(forwardingFieldOffset)); + return VMObjectFactory.newObject(ZForwardingTable.class, addr.addOffsetTo(forwardingFieldOffset)); + } + + private boolean is_forwarding() { + return forwarding().table() != null; + } + + private boolean is_relocatable() { + return is_active() && seqnum() < ZGlobals.ZGlobalSeqNum(); } - private long start() { + private boolean isPageRelocating() { + assert(is_active()); + // is_forwarding(): Has a (relocation) forwarding table + // is_relocatable(): Has not been freed yet + return is_forwarding() && is_relocatable(); + } + + long start() { return virtual().start(); } + long size() { + return virtual().end() - virtual().start(); + } + Address forward_object(Address from) { // Lookup address in forwarding table long from_offset = ZAddress.offset(from); @@ -94,7 +141,6 @@ return ZAddress.good(from); } - long object_alignment_shift() { if (type() == ZGlobals.ZPageTypeSmall) { return ZGlobals.ZObjectAlignmentSmallShift(); @@ -105,4 +151,94 @@ return ZGlobals.ZObjectAlignmentLargeShift; } } + + long objectAlignmentSize() { + return 1 << object_alignment_shift(); + } + + public boolean is_active() { + return refcount() != 0; + } + + private long getObjectSize(Address good) { + OopHandle handle = good.addOffsetToAsOopHandle(0); + Oop obj = null; + + try { + obj = VM.getVM().getObjectHeap().newOop(handle); + } catch (UnknownOopException exp) { + throw new RuntimeException(" UnknownOopException " + exp); + } + + return VM.getVM().alignUp(obj.getObjectSize(), objectAlignmentSize()); + } + + private void addNotRelocatedRegions(List regions) { + MemRegion mr = null; + + // Some objects have already been forwarded to new locations. + long topValue = top().asLongValue(); + for (long offsetValue = start(); offsetValue < topValue;) { + Address from = ZAddress.good(ZUtils.longToAddress(offsetValue)); + + Address to = relocate_object(from); + + long byteSize; + try { + byteSize = getObjectSize(to); + } catch (Exception e) { + // Parsing the ZHeap is inherently unsafe + // when classes have been unloaded. Dead objects + // might have stale Klass pointers, and there's + // no way to get the size of the dead object. + // + // If possible, run with -XX:-ClassUnloading + // to ensure that all Klasses are kept alive. + System.err.println("Unparsable regions found. Skipping: " + + from + + " " + + from.addOffsetTo(topValue - offsetValue)); + + // Can't proceed further. Just return the collected regions. + return; + } + + if (from.equals(to)) { + // Not relocated - add region + if (mr == null) { + mr = new MemRegion(from, 0 /* wordSize */); + regions.add(mr); + } + + long wordSize = byteSize / VM.getVM().getBytesPerWord(); + mr.setWordSize(mr.wordSize() + wordSize); + } else { + // Forwarded somewhere else, split region. + mr = null; + } + + offsetValue += byteSize; + } + } + + public List getLiveRegions() { + List res = new ArrayList<>(); + + if (isPageRelocating()) { + addNotRelocatedRegions(res); + } else { + Address start = ZAddress.good(ZUtils.longToAddress(start())); + + // Can't convert top() to a "good" address because it might + // be at the top of the "offset" range, and therefore also + // looks like one of the color bits. Instead use the "good" + // address and add the size. + long size = top().asLongValue() - start(); + Address end = start.addOffsetTo(size); + + res.add(new MemRegion(start, end)); + } + + return res; + } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageAllocator.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageAllocator.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageAllocator.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * 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,7 +37,7 @@ public class ZPageAllocator extends VMObject { - private static AddressField physicalField; + private static long physicalFieldOffset; private static CIntegerField usedField; static { @@ -47,12 +47,12 @@ static private synchronized void initialize(TypeDataBase db) { Type type = db.lookupType("ZPageAllocator"); - physicalField = type.getAddressField("_physical"); + physicalFieldOffset = type.getAddressField("_physical").getOffset(); usedField = type.getCIntegerField("_used"); } private ZPhysicalMemoryManager physical() { - Address physicalAddr = physicalField.getValue(addr); + Address physicalAddr = addr.addOffsetTo(physicalFieldOffset); return (ZPhysicalMemoryManager)VMObjectFactory.newObject(ZPhysicalMemoryManager.class, physicalAddr); } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTable.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTable.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTable.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,6 +24,8 @@ package sun.jvm.hotspot.gc.z; +import java.util.Iterator; + import sun.jvm.hotspot.debugger.Address; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.runtime.VMObject; @@ -63,4 +65,112 @@ boolean is_relocating(Address o) { return getEntry(o).relocating(); } + + private class ZPagesIterator implements Iterator { + private ZAddressRangeMapForPageTable.Iterator mapIter; + private ZPage next; + + ZPagesIterator() { + mapIter = map().new Iterator(); + positionToNext(); + } + + private ZPage positionToNext() { + ZPage current = next; + + // Find next + ZPage found = null; + while (mapIter.hasNext()) { + ZPageTableEntry entry = new ZPageTableEntry(mapIter.next()); + if (!entry.isEmpty()) { + ZPage page = entry.page(); + // Medium pages have repeated entries for all covered slots, + // therefore we need to compare against the current page. + if (page != null && !page.equals(current)) { + found = page; + break; + } + } + } + + next = found; + + return current; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public ZPage next() { + return positionToNext(); + } + + @Override + public void remove() { + /* not supported */ + } + } + + abstract class ZPageFilter { + public abstract boolean accept(ZPage page); + } + + class ZPagesFilteredIterator implements Iterator { + private ZPage next; + private ZPagesIterator iter = new ZPagesIterator(); + private ZPageFilter filter; + + ZPagesFilteredIterator(ZPageFilter filter) { + this.filter = filter; + positionToNext(); + } + + public ZPage positionToNext() { + ZPage current = next; + + // Find next + ZPage found = null; + while (iter.hasNext()) { + ZPage page = iter.next(); + if (filter.accept(page)) { + found = page; + break; + } + } + + next = found; + + return current; + } + + @Override + public boolean hasNext() { + return next != null; + } + + @Override + public ZPage next() { + return positionToNext(); + } + + @Override + public void remove() { + /* not supported */ + } + } + + public Iterator iterator() { + return new ZPagesIterator(); + } + + public Iterator activePagesIterator() { + return new ZPagesFilteredIterator(new ZPageFilter() { + public boolean accept(ZPage page) { + return page.is_active(); + } + }); + } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTableEntry.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTableEntry.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZPageTableEntry.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,10 +35,18 @@ } ZPage page() { - return (ZPage)VMObjectFactory.newObject(ZPage.class, entry.andWithMask(~1L)); + return (ZPage)VMObjectFactory.newObject(ZPage.class, zPageBits()); + } + + private Address zPageBits() { + return entry.andWithMask(~1L); } boolean relocating() { return (entry.asLongValue() & 1) == 1; } + + boolean isEmpty() { + return entry == null || zPageBits() == null; + } } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZUtils.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/gc/z/ZUtils.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.gc.z; + +import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.runtime.VM; + +class ZUtils { + private static final long MSB = ~0L ^ (~0L >>> 1); + + private static Address msbAddress() { + return VM.getVM().getUniverse().heap().start().orWithMask(MSB).andWithMask(MSB); + } + + static Address longToAddress(long value) { + // If the value of an Address becomes 0, null is returned instead of an Address. + // Start with a one-bit address and as a last step, remove that bit. + Address oneAddress = msbAddress(); + return oneAddress.orWithMask(value).xorWithMask(ZAddress.as_long(oneAddress)); + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * 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 @@ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException { Type type = db.lookupType("Klass"); - javaMirror = type.getAddressField("_java_mirror"); + javaMirrorFieldOffset = type.getField("_java_mirror").getOffset(); superField = new MetadataField(type.getAddressField("_super"), 0); layoutHelper = new IntField(type.getJIntField("_layout_helper"), 0); name = type.getAddressField("_name"); @@ -89,7 +89,7 @@ public boolean isArrayKlass() { return false; } // Fields - private static AddressField javaMirror; + private static long javaMirrorFieldOffset; private static MetadataField superField; private static IntField layoutHelper; private static AddressField name; @@ -101,23 +101,15 @@ private static CIntField vtableLen; private static AddressField classLoaderData; - private Address getValue(AddressField field) { - return addr.getAddressAt(field.getOffset()); - } - protected Symbol getSymbol(AddressField field) { return Symbol.create(addr.getAddressAt(field.getOffset())); } // Accessors for declared fields public Instance getJavaMirror() { - Address handle = javaMirror.getValue(getAddress()); - if (handle != null) { - // Load through the handle - OopHandle refs = handle.getOopHandleAt(0); - return (Instance)VM.getVM().getObjectHeap().newOop(refs); - } - return null; + Address addr = getAddress().addOffsetTo(javaMirrorFieldOffset); + VMOopHandle vmOopHandle = VMObjectFactory.newObject(VMOopHandle.class, addr); + return vmOopHandle.resolve(); } public Klass getSuper() { return (Klass) superField.getValue(this); } public Klass getJavaSuper() { return null; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -304,87 +304,48 @@ visitor.epilogue(); } - private void addLiveRegions(String name, List input, List output) { - for (Iterator itr = input.iterator(); itr.hasNext();) { - MemRegion reg = (MemRegion) itr.next(); + private static class LiveRegionsCollector implements LiveRegionsClosure { + LiveRegionsCollector(List
    l) { + liveRegions = l; + } + + @Override + public void doLiveRegions(LiveRegionsProvider lrp) { + for (MemRegion reg : lrp.getLiveRegions()) { Address top = reg.end(); Address bottom = reg.start(); if (Assert.ASSERTS_ENABLED) { - Assert.that(top != null, "top address in a live region should not be null"); + Assert.that(top != null, "top address in a live region should not be null"); } if (Assert.ASSERTS_ENABLED) { - Assert.that(bottom != null, "bottom address in a live region should not be null"); + Assert.that(bottom != null, "bottom address in a live region should not be null"); } - output.add(top); - output.add(bottom); + liveRegions.add(top); + liveRegions.add(bottom); if (DEBUG) { - System.err.println("Live region: " + name + ": " + bottom + ", " + top); - } - } + System.err.println("Live region: " + lrp + ": " + bottom + ", " + top); + } + } } - private class LiveRegionsCollector implements SpaceClosure { - LiveRegionsCollector(List l) { - liveRegions = l; - } - - public void doSpace(Space s) { - addLiveRegions(s.toString(), s.getLiveRegions(), liveRegions); - } - private List liveRegions; + private List
    liveRegions; } // Returns a List
    where the addresses come in pairs. These // designate the live regions of the heap. - private List collectLiveRegions() { + private List
    collectLiveRegions() { // We want to iterate through all live portions of the heap, but // do not want to abort the heap traversal prematurely if we find // a problem (like an allocated but uninitialized object at the // top of a generation). To do this we enumerate all generations' // bottom and top regions, and factor in TLABs if necessary. - // List
    . Addresses come in pairs. - List liveRegions = new ArrayList(); + // Addresses come in pairs. + List
    liveRegions = new ArrayList<>(); LiveRegionsCollector lrc = new LiveRegionsCollector(liveRegions); CollectedHeap heap = VM.getVM().getUniverse().heap(); - - if (heap instanceof GenCollectedHeap) { - GenCollectedHeap genHeap = (GenCollectedHeap) heap; - // Run through all generations, obtaining bottom-top pairs. - for (int i = 0; i < genHeap.nGens(); i++) { - Generation gen = genHeap.getGen(i); - gen.spaceIterate(lrc, true); - } - } else if (heap instanceof ParallelScavengeHeap) { - ParallelScavengeHeap psh = (ParallelScavengeHeap) heap; - PSYoungGen youngGen = psh.youngGen(); - // Add eden space - addLiveRegions("eden", youngGen.edenSpace().getLiveRegions(), liveRegions); - // Add from-space but not to-space - addLiveRegions("from", youngGen.fromSpace().getLiveRegions(), liveRegions); - PSOldGen oldGen = psh.oldGen(); - addLiveRegions("old ", oldGen.objectSpace().getLiveRegions(), liveRegions); - } else if (heap instanceof G1CollectedHeap) { - G1CollectedHeap g1h = (G1CollectedHeap) heap; - g1h.heapRegionIterate(lrc); - } else if (heap instanceof ShenandoahHeap) { - // Operation (currently) not supported with Shenandoah GC. Print - // a warning and leave the list of live regions empty. - System.err.println("Warning: Operation not supported with Shenandoah GC"); - } else if (heap instanceof ZCollectedHeap) { - // Operation (currently) not supported with ZGC. Print - // a warning and leave the list of live regions empty. - System.err.println("Warning: Operation not supported with ZGC"); - } else if (heap instanceof EpsilonHeap) { - EpsilonHeap eh = (EpsilonHeap) heap; - liveRegions.add(eh.space().top()); - liveRegions.add(eh.space().bottom()); - } else { - if (Assert.ASSERTS_ENABLED) { - Assert.that(false, "Unexpected CollectedHeap type: " + heap.getClass().getName()); - } - } + heap.liveRegionsIterate(lrc); // If UseTLAB is enabled, snip out regions associated with TLABs' // dead regions. Note that TLABs can be present in any generation. @@ -440,11 +401,9 @@ return liveRegions; } - private void sortLiveRegions(List liveRegions) { - Collections.sort(liveRegions, new Comparator() { - public int compare(Object o1, Object o2) { - Address a1 = (Address) o1; - Address a2 = (Address) o2; + private void sortLiveRegions(List
    liveRegions) { + Collections.sort(liveRegions, new Comparator
    () { + public int compare(Address a1, Address a2) { if (AddressOps.lt(a1, a2)) { return -1; } else if (AddressOps.gt(a1, a2)) { diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/VMOopHandle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/VMOopHandle.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.oops; + +import sun.jvm.hotspot.debugger.Address; +import sun.jvm.hotspot.debugger.OopHandle; +import sun.jvm.hotspot.runtime.VM; +import sun.jvm.hotspot.runtime.VMObject; +import sun.jvm.hotspot.types.AddressField; +import sun.jvm.hotspot.types.Type; +import sun.jvm.hotspot.types.TypeDataBase; + +public class VMOopHandle extends VMObject { + private static AddressField objField; + + static { + VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase())); + } + + private static synchronized void initialize(TypeDataBase db) { + Type type = db.lookupType("OopHandle"); + + objField = type.getAddressField("_obj"); + } + + public VMOopHandle(Address addr) { + super(addr); + } + + public Address getObj() { + return objField.getValue(addr); + } + + public Instance resolve() { + Address handle = getObj(); + if (handle != null) { + // Load through the handle + OopHandle refs = VM.getVM().getUniverse().heap().oop_load_in_native(handle); + return (Instance)VM.getVM().getObjectHeap().newOop(refs); + } + return null; + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMObjectFactory.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMObjectFactory.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VMObjectFactory.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,14 +45,14 @@ */ public class VMObjectFactory { - public static Object newObject(Class clazz, Address addr) + public static T newObject(Class clazz, Address addr) throws ConstructionException { try { if (addr == null) { return null; } - Constructor c = clazz.getConstructor(new Class[] { + Constructor c = clazz.getConstructor(new Class[] { Address.class }); return c.newInstance(new Object[] { addr }); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/BitMapInterface.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/BitMapInterface.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.utilities; + +/** Minimal bitmap interface to support bitmaps spanning more than Integer.MAX_VALUE bits. */ +public interface BitMapInterface { + public boolean at(long offset); + public void atPut(long offset, boolean value); + public void clear(); +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/BitMapSegmented.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/BitMapSegmented.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along 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.jvm.hotspot.utilities; + +/** A BitMap implementing the BitMapInterface. */ +public class BitMapSegmented implements BitMapInterface { + private static final int SegmentSizeBits = 30; + private static final int SegmentSize = 1 << (SegmentSizeBits - 1); + + public BitMapSegmented(long sizeInBits) { + this.size = sizeInBits; + + if (sizeInBits == 0) { + segmentBitMaps = new BitMap[0]; + return; + } + + int lastSegmentSize = (int)(sizeInBits % SegmentSize); + + int segments = segmentIndex(sizeInBits - 1) + 1; + int completeSegments = segments - ((lastSegmentSize != 0) ? 1 : 0); + + segmentBitMaps = new BitMap[segments]; + + for (int i = 0; i < completeSegments; i++) { + segmentBitMaps[i] = new BitMap(SegmentSize); + } + + if (lastSegmentSize != 0) { + segmentBitMaps[completeSegments] = new BitMap(lastSegmentSize); + } + } + + public long size() { + return size; + } + + // Accessors + public boolean at(long offset) { + assert offset < size; + + int segmentIndex = segmentIndex(offset); + int segmentOffset = segmentOffset(offset); + return segmentBitMaps[segmentIndex].at(segmentOffset); + } + + public void atPut(long offset, boolean value) { + assert offset < size; + + int segmentIndex = segmentIndex(offset); + int segmentOffset = segmentOffset(offset); + segmentBitMaps[segmentIndex].atPut(segmentOffset, value); + } + + public void clear() { + for (BitMap map : segmentBitMaps) { + map.clear(); + } + } + + //---------------------------------------------------------------------- + // Internals only below this point + // + private final long size; // in bits + private final BitMap[] segmentBitMaps; + + private int segmentIndex(long offset) { + long longIndex = offset / SegmentSize; + + assert longIndex < Integer.MAX_VALUE; + return (int)longIndex; + } + + private int segmentOffset(long offset) { + return (int)(offset % SegmentSize); + } +} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Fri Feb 22 20:36:42 2019 +0000 @@ -390,9 +390,6 @@ public synchronized void write(String fileName) throws IOException { VM vm = VM.getVM(); - if (vm.getUniverse().heap() instanceof ZCollectedHeap) { - throw new RuntimeException("This operation is not supported with ZGC."); - } // open file stream and create buffered data output stream fos = new FileOutputStream(fileName); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/MarkBits.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/MarkBits.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/MarkBits.java Fri Feb 22 20:36:42 2019 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved. * 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,8 +41,7 @@ start = reserved.start(); end = reserved.end(); long numOopHandles = end.minus(start) / VM.getVM().getOopSize(); - // FIXME: will have trouble with larger heap sizes - bits = new BitMap((int) numOopHandles); + bits = heap.createBitMap(numOopHandles); } public void clear() { @@ -60,34 +59,22 @@ } OopHandle handle = obj.getHandle(); - // FIXME: will have trouble with larger heap sizes long idx = handle.minus(start) / VM.getVM().getOopSize(); - if ((idx < 0) || (idx >= bits.size())) { - System.err.println("MarkBits: WARNING: object " + handle + " outside of heap, ignoring"); - return false; - } - int intIdx = (int) idx; - if (bits.at(intIdx)) { + if (bits.at(idx)) { return false; // already marked } - bits.atPut(intIdx, true); + bits.atPut(idx, true); return true; } /** Forces clearing of a given mark bit. */ public void clear(Oop obj) { OopHandle handle = obj.getHandle(); - // FIXME: will have trouble with larger heap sizes long idx = handle.minus(start) / VM.getVM().getOopSize(); - if ((idx < 0) || (idx >= bits.size())) { - System.err.println("MarkBits: WARNING: object " + handle + " outside of heap, ignoring"); - return; - } - int intIdx = (int) idx; - bits.atPut(intIdx, false); + bits.atPut(idx, false); } - private BitMap bits; + private BitMapInterface bits; private Address start; private Address end; } diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/AbstractWindowsTerminal.java --- a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/AbstractWindowsTerminal.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/terminal/impl/AbstractWindowsTerminal.java Fri Feb 22 20:36:42 2019 +0000 @@ -86,8 +86,8 @@ super(name, type, selectCharset(encoding, codepage), signalHandler); NonBlockingPumpReader reader = NonBlocking.nonBlockingPumpReader(); this.slaveInputPipe = reader.getWriter(); - this.reader = reader; this.input = inputStreamWrapper.apply(NonBlocking.nonBlockingStream(reader, encoding())); + this.reader = NonBlocking.nonBlocking(name, input, encoding()); this.writer = new PrintWriter(writer); this.output = new WriterOutputStream(writer, encoding()); parseInfoCmp(); diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/NonBlocking.java --- a/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/NonBlocking.java Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.internal.le/share/classes/jdk/internal/org/jline/utils/NonBlocking.java Fri Feb 22 20:36:42 2019 +0000 @@ -123,9 +123,9 @@ } if (bytes.hasRemaining()) { if (isPeek) { - return bytes.get(bytes.position()); + return Byte.toUnsignedInt(bytes.get(bytes.position())); } else { - return bytes.get(); + return Byte.toUnsignedInt(bytes.get()); } } else { return READ_EXPIRED; diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.internal.le/windows/native/lible/Kernel32.cpp --- a/src/jdk.internal.le/windows/native/lible/Kernel32.cpp Fri Feb 22 17:03:09 2019 +0000 +++ b/src/jdk.internal.le/windows/native/lible/Kernel32.cpp Fri Feb 22 20:36:42 2019 +0000 @@ -460,7 +460,7 @@ HANDLE h = GetStdHandle((jint) env->GetLongField(in_hConsoleOutput, pointerValue)); INPUT_RECORD *buffer = new INPUT_RECORD[in_nLength]; DWORD numberOfEventsRead; - if (!ReadConsoleInput(h, buffer, in_nLength, &numberOfEventsRead)) { + if (!ReadConsoleInputW(h, buffer, in_nLength, &numberOfEventsRead)) { delete buffer; DWORD error = GetLastError(); jobject exc = env->NewObject(lastErrorExceptionClass, diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotatedType.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotatedType.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents an annotated type. - * For example: - *
    - *      {@code @NonNull String}
    - *      {@code @Positive int}
    - * 
    - * - * @author Mahmood Ali - * @since 1.8 - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface AnnotatedType extends Type { - - /** - * Returns the annotations associated with this type. - * @return the annotations associated with this type - */ - AnnotationDesc[] annotations(); - - /** - * Returns the underlying type. - * @return the underlying type - */ - Type underlyingType(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationDesc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationDesc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents an annotation. - * An annotation associates a value with each element of an annotation type. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface AnnotationDesc { - - /** - * Returns the annotation type of this annotation. - * - * @return the annotation type of this annotation. - */ - AnnotationTypeDoc annotationType(); - - /** - * Returns this annotation's elements and their values. - * Only those explicitly present in the annotation are - * included, not those assuming their default values. - * Returns an empty array if there are none. - * - * @return this annotation's elements and their values. - */ - ElementValuePair[] elementValues(); - - /** - * Check for the synthesized bit on the annotation. - * - * @return true if the annotation is synthesized. - */ - boolean isSynthesized(); - - /** - * Represents an association between an annotation type element - * and one of its values. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ - @Deprecated(since="9", forRemoval=true) - public interface ElementValuePair { - - /** - * Returns the annotation type element. - * - * @return the annotation type element. - */ - AnnotationTypeElementDoc element(); - - /** - * Returns the value associated with the annotation type element. - * - * @return the value associated with the annotation type element. - */ - AnnotationValue value(); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationTypeDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationTypeDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents an annotation type. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface AnnotationTypeDoc extends ClassDoc { - - /** - * Returns the elements of this annotation type. - * Returns an empty array if there are none. - * - * @return the elements of this annotation type. - */ - AnnotationTypeElementDoc[] elements(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationTypeElementDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationTypeElementDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents an element of an annotation type. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface AnnotationTypeElementDoc extends MethodDoc { - - /** - * Returns the default value of this element. - * Returns null if this element has no default. - * - * @return the default value of this element. - */ - AnnotationValue defaultValue(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationValue.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/AnnotationValue.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents a value of an annotation type element. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface AnnotationValue { - - /** - * Returns the value. - * The type of the returned object is one of the following: - *
    • a wrapper class for a primitive type - *
    • {@code String} - *
    • {@code Type} (representing a class literal) - *
    • {@code FieldDoc} (representing an enum constant) - *
    • {@code AnnotationDesc} - *
    • {@code AnnotationValue[]} - *
    - * - * @return the value. - */ - Object value(); - - /** - * Returns a string representation of the value. - * - * @return the text of a Java language annotation value expression - * whose value is the value of this element. - */ - String toString(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ClassDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ClassDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,362 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents a java class or interface and provides access to - * information about the class, the class's comment and tags, and the - * members of the class. A ClassDoc only exists if it was - * processed in this run of javadoc. References to classes - * which may or may not have been processed in this run are - * referred to using Type (which can be converted to ClassDoc, - * if possible). - * - * @see Type - * - * @since 1.2 - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ClassDoc extends ProgramElementDoc, Type { - - /** - * Return true if this class is abstract. Return true - * for all interfaces. - * - * @return true if this class is abstract. Return true - * for all interfaces. - */ - boolean isAbstract(); - - /** - * Return true if this class implements or interface extends - * {@code java.io.Serializable}. - * - * Since {@code java.io.Externalizable} extends - * {@code java.io.Serializable}, - * Externalizable objects are also Serializable. - * - * @return true if this class implements or interface extends - * {@code java.io.Serializable}. - */ - boolean isSerializable(); - - /** - * Return true if this class implements or interface extends - * {@code java.io.Externalizable}. - * - * @return true if this class implements or interface extends - * {@code java.io.Externalizable}. - */ - boolean isExternalizable(); - - /** - * Return the serialization methods for this class or - * interface. - * - * @return an array of MethodDoc objects that represents - * the serialization methods for this class or interface. - */ - MethodDoc[] serializationMethods(); - - /** - * Return the Serializable fields of this class or interface. - *

    - * Return either a list of default fields documented by - * {@code serial} tag
    - * or return a single {@code FieldDoc} for - * {@code serialPersistentField} member. - * There should be a {@code serialField} tag for - * each Serializable field defined by an {@code ObjectStreamField} - * array component of {@code serialPersistentField}. - * - * @return an array of {@code FieldDoc} objects for the Serializable - * fields of this class or interface. - * - * @see #definesSerializableFields() - * @see SerialFieldTag - */ - FieldDoc[] serializableFields(); - - /** - * Return true if Serializable fields are explicitly defined with - * the special class member {@code serialPersistentFields}. - * - * @return true if Serializable fields are explicitly defined with - * the special class member {@code serialPersistentFields}. - * - * @see #serializableFields() - * @see SerialFieldTag - */ - boolean definesSerializableFields(); - - /** - * Return the superclass of this class. Return null if this is an - * interface. - * - *

    This method cannot accommodate certain generic type constructs. - * The {@code superclassType} method should be used instead. - * - * @return the ClassDoc for the superclass of this class, null if - * there is no superclass. - * @see #superclassType - */ - ClassDoc superclass(); - - /** - * Return the superclass of this class. Return null if this is an - * interface. A superclass is represented by either a - * {@code ClassDoc} or a {@code ParametrizedType}. - * - * @return the superclass of this class, or null if there is no superclass. - * @since 1.5 - */ - Type superclassType(); - - /** - * Test whether this class is a subclass of the specified class. - * If this is an interface, return false for all classes except - * {@code java.lang.Object} (we must keep this unexpected - * behavior for compatibility reasons). - * - * @param cd the candidate superclass. - * @return true if cd is a superclass of this class. - */ - boolean subclassOf(ClassDoc cd); - - /** - * Return interfaces implemented by this class or interfaces extended - * by this interface. Includes only directly-declared interfaces, not - * inherited interfaces. - * Return an empty array if there are no interfaces. - * - *

    This method cannot accommodate certain generic type constructs. - * The {@code interfaceTypes} method should be used instead. - * - * @return an array of ClassDoc objects representing the interfaces. - * @see #interfaceTypes - */ - ClassDoc[] interfaces(); - - /** - * Return interfaces implemented by this class or interfaces extended - * by this interface. Includes only directly-declared interfaces, not - * inherited interfaces. - * Return an empty array if there are no interfaces. - * - * @return an array of interfaces, each represented by a - * {@code ClassDoc} or a {@code ParametrizedType}. - * @since 1.5 - */ - Type[] interfaceTypes(); - - /** - * Return the formal type parameters of this class or interface. - * Return an empty array if there are none. - * - * @return the formal type parameters of this class or interface. - * @since 1.5 - */ - TypeVariable[] typeParameters(); - - /** - * Return the type parameter tags of this class or interface. - * Return an empty array if there are none. - * - * @return the type parameter tags of this class or interface. - * @since 1.5 - */ - ParamTag[] typeParamTags(); - - /** - * Return - * included - * fields in this class or interface. - * Excludes enum constants if this is an enum type. - * - * @return an array of FieldDoc objects representing the included - * fields in this class or interface. - */ - FieldDoc[] fields(); - - /** - * Return fields in this class or interface, filtered to the specified - * access - * modifier option. - * Excludes enum constants if this is an enum type. - * - * @param filter Specify true to filter according to the specified access - * modifier option. - * Specify false to include all fields regardless of - * access modifier option. - * @return an array of FieldDoc objects representing the included - * fields in this class or interface. - */ - FieldDoc[] fields(boolean filter); - - /** - * Return the enum constants if this is an enum type. - * Return an empty array if there are no enum constants, or if - * this is not an enum type. - * - * @return the enum constants if this is an enum type. - */ - FieldDoc[] enumConstants(); - - /** - * Return - * included - * methods in this class or interface. - * Same as {@code methods(true)}. - * - * @return an array of MethodDoc objects representing the included - * methods in this class or interface. Does not include - * constructors or annotation type elements. - */ - MethodDoc[] methods(); - - /** - * Return methods in this class or interface, filtered to the specified - * access - * modifier option. Does not include constructors or annotation - * type elements. - * - * @param filter Specify true to filter according to the specified access - * modifier option. - * Specify false to include all methods regardless of - * access modifier option. - * - * @return an array of MethodDoc objects representing the included - * methods in this class or interface. - */ - MethodDoc[] methods(boolean filter); - - /** - * Return - * included - * constructors in this class. An array containing the default - * no-arg constructor is returned if no other constructors exist. - * Return empty array if this is an interface. - * - * @return an array of ConstructorDoc objects representing the included - * constructors in this class. - */ - ConstructorDoc[] constructors(); - - /** - * Return constructors in this class, filtered to the specified - * access - * modifier option. Return an array containing the default - * no-arg constructor if no other constructors exist. - * - * @param filter Specify true to filter according to the specified access - * modifier option. - * Specify false to include all constructors regardless of - * access modifier option. - * @return an array of ConstructorDoc objects representing the included - * constructors in this class. - */ - ConstructorDoc[] constructors(boolean filter); - - - /** - * Return - * included - * nested classes and interfaces within this class or interface. - * This includes both static and non-static nested classes. - * (This method should have been named {@code nestedClasses()}, - * as inner classes are technically non-static.) Anonymous and local classes - * or interfaces are not included. - * - * @return an array of ClassDoc objects representing the included classes - * and interfaces defined in this class or interface. - */ - ClassDoc[] innerClasses(); - - /** - * Return nested classes and interfaces within this class or interface - * filtered to the specified - * access - * modifier option. - * This includes both static and non-static nested classes. - * Anonymous and local classes are not included. - * - * @param filter Specify true to filter according to the specified access - * modifier option. - * Specify false to include all nested classes regardless of - * access modifier option. - * @return a filtered array of ClassDoc objects representing the included - * classes and interfaces defined in this class or interface. - */ - ClassDoc[] innerClasses(boolean filter); - - /** - * Find the specified class or interface within the context of this class doc. - * Search order: 1) qualified name, 2) nested in this class or interface, - * 3) in this package, 4) in the class imports, 5) in the package imports. - * Return the ClassDoc if found, null if not found. - * @param className Specify the class name to find as a String. - * @return the ClassDoc if found, null if not found. - */ - ClassDoc findClass(String className); - - /** - * Get the list of classes and interfaces declared as imported. - * These are called "single-type-import declarations" in - * The Java™ Language Specification. - * - * @return an array of ClassDoc representing the imported classes. - * - * @deprecated Import declarations are implementation details that - * should not be exposed here. In addition, not all imported - * classes are imported through single-type-import declarations. - */ - @Deprecated(since="9", forRemoval=true) - ClassDoc[] importedClasses(); - - /** - * Get the list of packages declared as imported. - * These are called "type-import-on-demand declarations" in - * The Java™ Language Specification. - * - * @return an array of PackageDoc representing the imported packages. - * - * @deprecated Import declarations are implementation details that - * should not be exposed here. In addition, this method's - * return type does not allow for all type-import-on-demand - * declarations to be returned. - */ - @Deprecated(since="9", forRemoval=true) - PackageDoc[] importedPackages(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ConstructorDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ConstructorDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a constructor of a java class. - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ConstructorDoc extends ExecutableMemberDoc { -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/Doc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/Doc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -import java.text.BreakIterator; -import java.util.Locale; - -/** - * Represents Java language constructs (package, class, constructor, - * method, field) which have comments and have been processed by this - * run of javadoc. All Doc objects are unique, that is, they - * are == comparable. - * - * @since 1.2 - * @author Robert Field - * @author Scott Seligman (generics, enums, annotations) - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface Doc extends Comparable { - - /** - * Return the text of the comment for this doc item. - * Tags have been removed. - * - * @return the text of the comment for this doc item. - */ - String commentText(); - - /** - * Return all tags in this Doc item. - * - * @return an array of {@link Tag} objects containing all tags on - * this Doc item. - */ - Tag[] tags(); - - /** - * Return tags of the specified {@linkplain Tag#kind() kind} in - * this Doc item. - * - * For example, if 'tagname' has value "@serial", all tags in - * this Doc item of kind "@serial" will be returned. - * - * @param tagname name of the tag kind to search for. - * @return an array of Tag containing all tags whose 'kind()' - * matches 'tagname'. - */ - Tag[] tags(String tagname); - - /** - * Return the see also tags in this Doc item. - * - * @return an array of SeeTag containing all @see tags. - */ - SeeTag[] seeTags(); - - /** - * Return comment as an array of tags. Includes inline tags - * (i.e. {@link reference} tags) but not - * block tags. - * Each section of plain text is represented as a {@link Tag} - * of {@linkplain Tag#kind() kind} "Text". - * Inline tags are represented as a {@link SeeTag} of kind "@see" - * and name "@link". - * - * @return an array of {@link Tag}s representing the comment - */ - Tag[] inlineTags(); - - /** - * Return the first sentence of the comment as an array of tags. - * Includes inline tags - * (i.e. {@link reference} tags) but not - * block tags. - * Each section of plain text is represented as a {@link Tag} - * of {@linkplain Tag#kind() kind} "Text". - * Inline tags are represented as a {@link SeeTag} of kind "@see" - * and name "@link". - *

    - * If the locale is English language, the first sentence is - * determined by the rules described in the Java Language - * Specification (first version): "This sentence ends - * at the first period that is followed by a blank, tab, or - * line terminator or at the first tagline.", in - * addition a line will be terminated by block - * HTML tags: <p> </p> <h1> - * <h2> <h3> <h4> <h5> <h6> - * <hr> <pre> or </pre>. - * If the locale is not English, the sentence end will be - * determined by - * {@link BreakIterator#getSentenceInstance(Locale)}. - - * @return an array of {@link Tag}s representing the - * first sentence of the comment - */ - Tag[] firstSentenceTags(); - - /** - * Return the full unprocessed text of the comment. Tags - * are included as text. Used mainly for store and retrieve - * operations like internalization. - * - * @return the full unprocessed text of the comment. - */ - String getRawCommentText(); - - /** - * Set the full unprocessed text of the comment. Tags - * are included as text. Used mainly for store and retrieve - * operations like internalization. - * - * @param rawDocumentation A String containing the full unprocessed text of the comment. - */ - void setRawCommentText(String rawDocumentation); - - /** - * Returns the non-qualified name of this Doc item. - * - * @return the name - */ - String name(); - - /** - * Compares this doc object with the specified object for order. Returns a - * negative integer, zero, or a positive integer as this doc object is less - * than, equal to, or greater than the given object. - *

    - * This method satisfies the {@link java.lang.Comparable} interface. - * - * @param obj the {@code Object} to be compared. - * @return a negative integer, zero, or a positive integer as this Object - * is less than, equal to, or greater than the given Object. - * @exception ClassCastException the specified Object's type prevents it - * from being compared to this Object. - */ - int compareTo(Object obj); - - /** - * Is this Doc item a field (but not an enum constant)? - * - * @return true if it represents a field - */ - boolean isField(); - - /** - * Is this Doc item an enum constant? - * - * @return true if it represents an enum constant - * @since 1.5 - */ - boolean isEnumConstant(); - - /** - * Is this Doc item a constructor? - * - * @return true if it represents a constructor - */ - boolean isConstructor(); - - /** - * Is this Doc item a method (but not a constructor or annotation - * type element)? - * - * @return true if it represents a method - */ - boolean isMethod(); - - /** - * Is this Doc item an annotation type element? - * - * @return true if it represents an annotation type element - * @since 1.5 - */ - boolean isAnnotationTypeElement(); - - /** - * Is this Doc item an interface (but not an annotation type)? - * - * @return true if it represents an interface - */ - boolean isInterface(); - - /** - * Is this Doc item an exception class? - * - * @return true if it represents an exception - */ - boolean isException(); - - /** - * Is this Doc item an error class? - * - * @return true if it represents a error - */ - boolean isError(); - - /** - * Is this Doc item an enum type? - * - * @return true if it represents an enum type - * @since 1.5 - */ - boolean isEnum(); - - /** - * Is this Doc item an annotation type? - * - * @return true if it represents an annotation type - * @since 1.5 - */ - boolean isAnnotationType(); - - /** - * Is this Doc item an - * ordinary - * class? - * (i.e. not an interface, annotation type, enum, exception, or error)? - * - * @return true if it represents an ordinary class - */ - boolean isOrdinaryClass(); - - /** - * Is this Doc item a - * class - * (and not an interface or annotation type)? - * This includes ordinary classes, enums, errors and exceptions. - * - * @return true if it represents a class - */ - boolean isClass(); - - /** - * Return true if this Doc item is - * included - * in the result set. - * - * @return true if this Doc item is - * included - * in the result set. - */ - boolean isIncluded(); - - /** - * Return the source position of the first line of the - * corresponding declaration, or null if - * no position is available. A default constructor returns - * null because it has no location in the source file. - * - * @since 1.4 - * @return the source positino of the first line of the - * corresponding declaration, or null if - * no position is available. A default constructor returns - * null because it has no location in the source file. - */ - SourcePosition position(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/DocErrorReporter.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/DocErrorReporter.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * This interface provides error, warning and notice printing. - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface DocErrorReporter { - - /** - * Print error message and increment error count. - * - * @param msg message to print - */ - void printError(String msg); - - /** - * Print an error message and increment error count. - * - * @param pos the position item where the error occurs - * @param msg message to print - * @since 1.4 - */ - void printError(SourcePosition pos, String msg); - - /** - * Print warning message and increment warning count. - * - * @param msg message to print - */ - void printWarning(String msg); - - /** - * Print warning message and increment warning count. - * - * @param pos the position item where the warning occurs - * @param msg message to print - * @since 1.4 - */ - void printWarning(SourcePosition pos, String msg); - - /** - * Print a message. - * - * @param msg message to print - */ - void printNotice(String msg); - - /** - * Print a message. - * - * @param pos the position item where the message occurs - * @param msg message to print - * @since 1.4 - */ - void printNotice(SourcePosition pos, String msg); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/Doclet.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/Doclet.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * This is an example of a starting class for a doclet, - * showing the entry-point methods. A starting class must - * import com.sun.javadoc.* and implement the - * {@code start(RootDoc)} method, as described in the - * package - * description. If the doclet takes command line options, - * it must also implement {@code optionLength} and - * {@code validOptions}. - * - *

    A doclet supporting the language features added since 1.1 - * (such as generics and annotations) should indicate this - * by implementing {@code languageVersion}. In the absence of - * this the doclet should not invoke any of the Doclet API methods - * added since 1.5, and - * the results of several other methods are modified so as - * to conceal the new constructs (such as type parameters) from - * the doclet. - * - *

    To start the doclet, pass - * {@code -doclet} followed by the fully-qualified - * name of the starting class on the javadoc tool command line. - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public abstract class Doclet { - - /** - * Generate documentation here. - * This method is required for all doclets. - * - * @param root Supply the RootDoc to the method. - * @return true on success. - */ - public static boolean start(RootDoc root) { - return true; - } - - /** - * Check for doclet-added options. Returns the number of - * arguments you must specify on the command line for the - * given option. For example, "-d docs" would return 2. - *

    - * This method is required if the doclet contains any options. - * If this method is missing, Javadoc will print an invalid flag - * error for every option. - * - * @param option the option for which the number of arguements is returned. - * @return number of arguments on the command line for an option - * including the option name itself. Zero return means - * option not known. Negative value means error occurred. - */ - public static int optionLength(String option) { - return 0; // default is option unknown - } - - /** - * Check that options have the correct arguments. - *

    - * This method is not required, but is recommended, - * as every option will be considered valid if this method - * is not present. It will default gracefully (to true) - * if absent. - *

    - * Printing option related error messages (using the provided - * DocErrorReporter) is the responsibility of this method. - * - * @param options Supply valid options as an array of Strings. - * @param reporter The DocErrorReporter responsible for these options. - * @return true if the options are valid. - */ - public static boolean validOptions(String options[][], - DocErrorReporter reporter) { - return true; // default is options are valid - } - - /** - * Return the version of the Java Programming Language supported - * by this doclet. - *

    - * This method is required by any doclet supporting a language version - * newer than 1.1. - * - * @return the language version supported by this doclet. - * @since 1.5 - */ - public static LanguageVersion languageVersion() { - return LanguageVersion.JAVA_1_1; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ExecutableMemberDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ExecutableMemberDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a method or constructor of a java class. - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ExecutableMemberDoc extends MemberDoc { - - /** - * Return exceptions this method or constructor throws. - * If the type of the exception is a type variable, return the - * {@code ClassDoc} of its erasure. - * - *

    The {@code thrownExceptions} method cannot - * accommodate certain generic type constructs. The - * {@code thrownExceptionTypes} method should be used - * instead. - * - * @return an array of ClassDoc[] representing the exceptions - * thrown by this method. - * @see #thrownExceptionTypes - */ - ClassDoc[] thrownExceptions(); - - /** - * Return exceptions this method or constructor throws. - * - * @return an array representing the exceptions thrown by this method. - * Each array element is either a {@code ClassDoc} or a - * {@code TypeVariable}. - * @since 1.5 - */ - Type[] thrownExceptionTypes(); - - /** - * Return true if this method is native - * - * @return true if this method is native - */ - boolean isNative(); - - /** - * Return true if this method is synchronized - * - * @return true if this method is synchronized - */ - boolean isSynchronized(); - - /** - * Return true if this method was declared to take a variable number - * of arguments. - * - * @since 1.5 - * @return true if this method was declared to take a variable number of arguments. - */ - public boolean isVarArgs(); - - /** - * Get argument information. - * - * @see Parameter - * - * @return an array of Parameter, one element per argument - * in the order the arguments are present. - */ - Parameter[] parameters(); - - /** - * Get the receiver type of this executable element. - * - * @return the receiver type of this executable element. - * @since 1.8 - */ - Type receiverType(); - - /** - * Return the throws tags in this method. - * - * @return an array of ThrowTag containing all {@code @exception} - * and {@code @throws} tags. - */ - ThrowsTag[] throwsTags(); - - /** - * Return the param tags in this method, excluding the type - * parameter tags. - * - * @return an array of ParamTag containing all {@code @param} tags - * corresponding to the parameters of this method. - */ - ParamTag[] paramTags(); - - /** - * Return the type parameter tags in this method. - * - * @return an array of ParamTag containing all {@code @param} tags - * corresponding to the type parameters of this method. - * @since 1.5 - */ - ParamTag[] typeParamTags(); - - /** - * Get the signature. It is the parameter list, type is qualified. - * For instance, for a method {@code mymethod(String x, int y)}, - * it will return {@code (java.lang.String,int)}. - * - * @return the parameter list where type is qualified. - */ - String signature(); - - /** - * get flat signature. all types are not qualified. - * return a String, which is the flat signiture of this member. - * It is the parameter list, type is not qualified. - * For instance, for a method {@code mymethod(String x, int y)}, - * it will return {@code (String, int)}. - * - * @return a String, which is the flat signiture of this member. - */ - String flatSignature(); - - /** - * Return the formal type parameters of this method or constructor. - * Return an empty array if this method or constructor is not generic. - * - * @return the formal type parameters of this method or constructor. - * @since 1.5 - */ - TypeVariable[] typeParameters(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/FieldDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/FieldDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a field in a java class. - * - * @see MemberDoc - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface FieldDoc extends MemberDoc { - - /** - * Get type of this field. - * - * @return the type of this field. - */ - Type type(); - - /** - * Return true if this field is transient - * - * @return true if this field is transient - */ - boolean isTransient(); - - /** - * Return true if this field is volatile - * - * @return true if this field is volatile - */ - boolean isVolatile(); - - /** - * Return the serialField tags in this FieldDoc item. - * - * @return an array of {@code SerialFieldTag} objects containing - * all {@code @serialField} tags. - */ - SerialFieldTag[] serialFieldTags(); - - /** - * Get the value of a constant field. - * - * @return the value of a constant field. The value is - * automatically wrapped in an object if it has a primitive type. - * If the field is not constant, returns null. - */ - Object constantValue(); - - /** - * Get the value of a constant field. - * - * @return the text of a Java language expression whose value - * is the value of the constant. The expression uses no identifiers - * other than primitive literals. If the field is - * not constant, returns null. - */ - String constantValueExpression(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/LanguageVersion.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/LanguageVersion.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Java Programming Language version. The constants of this enum - * identify the JDK and J2SE releases containing language changes - * relevant to doclets. - *

    - * All doclets support at least the 1.1 language version. - * The first release subsequent to this with language changes - * affecting doclets is 1.5. - * - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public enum LanguageVersion { - - /** 1.1 added nested classes and interfaces. */ - JAVA_1_1, - - /** 1.5 added generic types, annotations, enums, and varArgs. */ - JAVA_1_5 -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/MemberDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/MemberDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a member of a java class: field, constructor, or method. - * This is an abstract class dealing with information common to - * method, constructor and field members. Class members of a class - * (innerclasses) are represented instead by ClassDoc. - * - * @see MethodDoc - * @see FieldDoc - * @see ClassDoc - * - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface MemberDoc extends ProgramElementDoc { - - /** - * Returns true if this member was synthesized by the compiler. - * - * @return true if this member was synthesized by the compiler. - */ - boolean isSynthetic(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/MethodDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/MethodDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a method of a java class. - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface MethodDoc extends ExecutableMemberDoc { - - /** - * Return true if this method is abstract - * - * @return true if this method is abstract - */ - boolean isAbstract(); - - /** - * Return true if this method is default - * - * @return true if this method is default - */ - boolean isDefault(); - - /** - * Get return type. - * - * @return the return type of this method, null if it - * is a constructor. - */ - Type returnType(); - - /** - * Return the class containing the method that this method overrides. - * - *

    The {@code overriddenClass} method cannot - * accommodate certain generic type constructs. The - * {@code overriddenType} method should be used instead. - * - * @return a ClassDoc representing the superclass - * defining a method that this method overrides, or null if - * this method does not override. - */ - ClassDoc overriddenClass(); - - /** - * Return the type containing the method that this method overrides. - * It may be a {@code ClassDoc} or a {@code ParameterizedType}. - * - * @return the supertype whose method is overridden, or null if this - * method does not override another in a superclass - * @since 1.5 - */ - Type overriddenType(); - - /** - * Return the method that this method overrides. - * - * @return a MethodDoc representing a method definition - * in a superclass this method overrides, null if - * this method does not override. - */ - MethodDoc overriddenMethod(); - - /** - * Tests whether this method overrides another. - * The overridden method may be one declared in a superclass or - * a superinterface (unlike {@link #overriddenMethod()}). - * - *

    When a non-abstract method overrides an abstract one, it is - * also said to implement the other. - * - * @param meth the other method to examine - * @return {@code true} if this method overrides the other - * @since 1.5 - */ - boolean overrides(MethodDoc meth); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/PackageDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/PackageDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a java package. Provides access to information - * about the package, the package's comment and tags, and the - * classes in the package. - *

    - * Each method whose return type is an array will return an empty - * array (never null) when there are no objects in the result. - * - * @since 1.2 - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface PackageDoc extends Doc { - - /** - * Get all classes and interfaces in the package, filtered to the specified - * access - * modifier option. - * - * @return filtered classes and interfaces in this package - * @param filter Specifying true filters according to the specified access - * modifier option. - * Specifying false includes all classes and interfaces - * regardless of access modifier option. - * @since 1.4 - */ - ClassDoc[] allClasses(boolean filter); - - /** - * Get all - * included - * classes and interfaces in the package. Same as allClasses(true). - * - * @return all included classes and interfaces in this package. - */ - ClassDoc[] allClasses(); - - /** - * Get included - * ordinary - * classes (that is, exclude exceptions, errors, enums, interfaces, and - * annotation types) - * in this package. - * - * @return included ordinary classes in this package. - */ - ClassDoc[] ordinaryClasses(); - - /** - * Get included Exception classes in this package. - * - * @return included Exceptions in this package. - */ - ClassDoc[] exceptions(); - - /** - * Get included Error classes in this package. - * - * @return included Errors in this package. - */ - ClassDoc[] errors(); - - /** - * Get included enum types in this package. - * - * @return included enum types in this package. - * @since 1.5 - */ - ClassDoc[] enums(); - - /** - * Get included interfaces in this package, omitting annotation types. - * - * @return included interfaces in this package. - */ - ClassDoc[] interfaces(); - - /** - * Get included annotation types in this package. - * - * @return included annotation types in this package. - * @since 1.5 - */ - AnnotationTypeDoc[] annotationTypes(); - - /** - * Get the annotations of this package. - * Return an empty array if there are none. - * - * @return the annotations of this package. - * @since 1.5 - */ - AnnotationDesc[] annotations(); - - /** - * Lookup a class or interface within this package. - * - * @param className A String containing the name of the class to look up. - * @return ClassDoc of found class or interface, - * or null if not found. - */ - ClassDoc findClass(String className); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ParamTag.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ParamTag.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents an @param documentation tag. - * Stores the name and comment parts of the parameter tag. - * An @param tag may represent either a method or constructor parameter, - * or a type parameter. - * - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ParamTag extends Tag { - - /** - * Return the name of the parameter or type parameter - * associated with this {@code ParamTag}. - * The angle brackets delimiting a type parameter are not part of - * its name. - * - * @return the parameter name. - */ - String parameterName(); - - /** - * Return the parameter comment - * associated with this {@code ParamTag}. - * - * @return the parameter comment. - */ - String parameterComment(); - - /** - * Return true if this {@code ParamTag} corresponds to a type - * parameter. Return false if it corresponds to an ordinary parameter - * of a method or constructor. - * - * @return true if this {@code ParamTag} corresponds to a type - * parameter. - * @since 1.5 - */ - boolean isTypeParameter(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/Parameter.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/Parameter.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Parameter information. - * This includes a parameter type and parameter name. - * - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface Parameter { - - /** - * Get the type of this parameter. - * - * @return the type of this parameter. - */ - Type type(); - - /** - * Get local name of this parameter. - * For example if parameter is the short 'index', returns "index". - * - * @return the name of this parameter as a string. - */ - String name(); - - /** - * Get type name of this parameter. - * For example if parameter is the short 'index', returns "short". - *

    - * This method returns a complete string - * representation of the type, including the dimensions of arrays and - * the type arguments of parameterized types. Names are qualified. - * - * @return a complete string representation of the type. - */ - String typeName(); - - /** - * Returns a string representation of the parameter. - *

    - * For example if parameter is the short 'index', returns "short index". - * - * @return type and parameter name of this parameter. - */ - String toString(); - - /** - * Get the annotations of this parameter. - * Return an empty array if there are none. - * - * @return the annotations of this parameter. - * @since 1.5 - */ - AnnotationDesc[] annotations(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ParameterizedType.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ParameterizedType.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents an invocation of a generic class or interface. For example, - * given the generic interface {@code List}, possible invocations - * include: - *

    - *      {@code List}
    - *      {@code List}
    - *      {@code List}
    - * 
    - * A generic inner class {@code Outer.Inner} might be invoked as: - *
    - *      {@code Outer.Inner}
    - * 
    - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ParameterizedType extends Type { - - /** - * Return the generic class or interface that declared this type. - * - * @return the generic class or interface that declared this type. - */ - ClassDoc asClassDoc(); - - /** - * Return the actual type arguments of this type. - * For a generic type that is nested within some other generic type - * (such as {@code Outer.Inner}), - * only the type arguments of the innermost type are included. - * - * @return the actual type arguments of this type. - */ - Type[] typeArguments(); - - /** - * Return the class type that is a direct supertype of this one. - * This is the superclass of this type's declaring class, - * with type arguments substituted in. - * Return null if this is an interface type. - * - *

    For example, if this parameterized type is - * {@code java.util.ArrayList}, the result will be - * {@code java.util.AbstractList}. - * - * @return the class type that is a direct supertype of this one. - */ - Type superclassType(); - - /** - * Return the interface types directly implemented by or extended by this - * parameterized type. - * These are the interfaces directly implemented or extended - * by this type's declaring class or interface, - * with type arguments substituted in. - * Return an empty array if there are no interfaces. - * - *

    For example, the interface extended by - * {@code java.util.Set} is {@code java.util.Collection}. - * - * @return the interface types directly implemented by or extended by this - * parameterized type. - */ - Type[] interfaceTypes(); - - /** - * Return the type that contains this type as a member. - * Return null is this is a top-level type. - * - *

    For example, the containing type of - * {@code AnInterface.Nested} is the {@code ClassDoc} - * representing {@code AnInterface}, and the containing type of - * {@code Outer.Inner} is the - * {@code ParameterizedType} representing {@code Outer}. - * - * @return the type that contains this type as a member. - */ - Type containingType(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ProgramElementDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ProgramElementDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,148 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a java program element: class, interface, field, - * constructor, or method. - * This is an abstract class dealing with information common to - * these elements. - * - * @see MemberDoc - * @see ClassDoc - * - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ProgramElementDoc extends Doc { - - /** - * Get the containing class or interface of this program element. - * - * @return a ClassDoc for this element's containing class or interface. - * If this is a top-level class or interface, return null. - */ - ClassDoc containingClass(); - - /** - * Get the package that this program element is contained in. - * - * @return a PackageDoc for this element containing package. - * If in the unnamed package, this PackageDoc will have the - * name "". - */ - PackageDoc containingPackage(); - - /** - * Get the fully qualified name of this program element. - * For example, for the class {@code java.util.Hashtable}, - * return "java.util.Hashtable". - *

    - * For the method {@code bar()} in class {@code Foo} - * in the unnamed package, return "Foo.bar". - * - * @return the qualified name of the program element as a String. - */ - String qualifiedName(); - - /** - * Get the modifier specifier integer. - * - * @see java.lang.reflect.Modifier - * - * @return Get the modifier specifier integer. - */ - int modifierSpecifier(); - - /** - * Get modifiers string. - * For example, for: - *

    -     *   public abstract int foo() { ... }
    -     * 
    - * return "public abstract". - * Annotations are not included. - * - * @return "public abstract". - */ - String modifiers(); - - /** - * Get the annotations of this program element. - * Return an empty array if there are none. - * - * @return the annotations of this program element. - * @since 1.5 - */ - AnnotationDesc[] annotations(); - - /** - * Return true if this program element is public. - * - * @return true if this program element is public. - */ - boolean isPublic(); - - /** - * Return true if this program element is protected. - * - * @return true if this program element is protected. - */ - boolean isProtected(); - - /** - * Return true if this program element is private. - * - * @return true if this program element is private. - */ - boolean isPrivate(); - - /** - * Return true if this program element is package private. - * - * @return true if this program element is package private. - */ - boolean isPackagePrivate(); - /** - * Return true if this program element is static. - * - * @return true if this program element is static. - */ - boolean isStatic(); - - /** - * Return true if this program element is final. - * - * @return true if this program element is final. - */ - boolean isFinal(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/RootDoc.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/RootDoc.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents the root of the program structure information - * for one run of javadoc. From this root all other program - * structure information can be extracted. - * Also represents the command line information -- the - * packages, classes and options specified by the user. - * - * @since 1.2 - * @author Robert Field - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface RootDoc extends Doc, DocErrorReporter { - - /** - * Command line options. - *

    - * For example, given: - *

    -     *     javadoc -foo this that -bar other ...
    - * - * this method will return: - *
    -     *      options()[0][0] = "-foo"
    -     *      options()[0][1] = "this"
    -     *      options()[0][2] = "that"
    -     *      options()[1][0] = "-bar"
    -     *      options()[1][1] = "other"
    - * - * @return an array of arrays of String. - */ - String[][] options(); - - /** - * Return the packages - * specified - * on the command line. - * If {@code -subpackages} and {@code -exclude} options - * are used, return all the non-excluded packages. - * - * @return packages specified on the command line. - */ - PackageDoc[] specifiedPackages(); - - /** - * Return the classes and interfaces - * specified - * as source file names on the command line. - * - * @return classes and interfaces specified on the command line. - */ - ClassDoc[] specifiedClasses(); - - /** - * Return the - * included - classes and interfaces in all packages. - * - * @return included classes and interfaces in all packages. - */ - ClassDoc[] classes(); - - /** - * Return a PackageDoc for the specified package name. - * - * @param name package name - * - * @return a PackageDoc holding the specified package, null if - * this package is not referenced. - */ - PackageDoc packageNamed(String name); - - /** - * Return a ClassDoc for the specified class or interface name. - * - * @param qualifiedName - * qualified - * class or package name - * - * @return a ClassDoc holding the specified class, null if - * this class is not referenced. - */ - ClassDoc classNamed(String qualifiedName); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/SeeTag.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/SeeTag.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a user-defined cross-reference to related documentation. - * The tag can reference a package, class or member, or can hold - * plain text. (The plain text might be a reference - * to something not online, such as a printed book, or be a hard-coded - * HTML link.) The reference can either be inline with the comment, - * using {@code {@link}}, or a separate block comment, - * using {@code @see}. - * Method {@code name()} returns "@link" (no curly braces) or - * "@see", depending on the tag. - * Method {@code kind()} returns "@see" for both tags. - * - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * @author Atul M Dambalkar - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface SeeTag extends Tag { - - /** - * Get the label of the {@code @see} tag. - * Return null if no label is present. - * For example, for: - *

    - *   {@code @see String#trim() the trim method} - *

    - * return "the trim method". - * - * @return "the trim method". - */ - String label(); - - /** - * Get the package doc when {@code @see} references only a package. - * Return null if the package cannot be found, or if - * {@code @see} references any other element (class, - * interface, field, constructor, method) or non-element. - * For example, for: - *

    - *   {@code @see java.lang} - *

    - * return the {@code PackageDoc} for {@code java.lang}. - * - * @return the {@code PackageDoc} for {@code java.lang}. - */ - public PackageDoc referencedPackage(); - - /** - * Get the class or interface name of the {@code @see} reference. - * The name is fully qualified if the name specified in the - * original {@code @see} tag was fully qualified, or if the class - * or interface can be found; otherwise it is unqualified. - * If {@code @see} references only a package name, then return - * the package name instead. - * For example, for: - *

    - *   {@code @see String#valueOf(java.lang.Object)} - *

    - * return "java.lang.String". - * For "{@code @see java.lang}", return "java.lang". - * Return null if {@code @see} references a non-element, such as - * {@code @see }. - * - * @return null if {@code @see} references a non-element, such as - * {@code @see }. - */ - String referencedClassName(); - - /** - * Get the class doc referenced by the class name part of @see. - * Return null if the class cannot be found. - * For example, for: - *

    - *   {@code @see String#valueOf(java.lang.Object)} - *

    - * return the {@code ClassDoc} for {@code java.lang.String}. - * - * @return the {@code ClassDoc} for {@code java.lang.String}. - */ - ClassDoc referencedClass(); - - /** - * Get the field, constructor or method substring of the {@code @see} - * reference. Return null if the reference is to any other - * element or to any non-element. - * References to member classes (nested classes) return null. - * For example, for: - *

    - *   {@code @see String#startsWith(String)} - *

    - * return "startsWith(String)". - * - * @return "startsWith(String)". - */ - String referencedMemberName(); - - /** - * Get the member doc for the field, constructor or method - * referenced by {@code @see}. Return null if the member cannot - * be found or if the reference is to any other element or to any - * non-element. - * References to member classes (nested classes) return null. - * For example, for: - *

    - *   {@code @see String#startsWith(java.lang.String)} - *

    - * return the {@code MethodDoc} for {@code startsWith}. - * - * @return the {@code MethodDoc} for {@code startsWith}. - */ - MemberDoc referencedMember(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/SerialFieldTag.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/SerialFieldTag.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Documents a Serializable field defined by an ObjectStreamField. - *
    - * The class parses and stores the three serialField tag parameters:
    - *
    - * - field name
    - * - field type name
    - *      (fully-qualified or visible from the current import context)
    - * - description of the valid values for the field
    -
    - * 
    - * This tag is only allowed in the javadoc for the special member - * serialPersistentFields. - * - * @author Joe Fialli - * - * @see java.io.ObjectStreamField - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface SerialFieldTag extends Tag, Comparable { - - /** - * Return the serializable field name. - * - * @return the serializable field name. - */ - public String fieldName(); - - /** - * Return the field type string. - * - * @return the field type string. - */ - public String fieldType(); - - /** - * Return the ClassDoc for field type. - * - * @return null if no ClassDoc for field type is visible from - * containingClass context. - */ - public ClassDoc fieldTypeDoc(); - - /** - * Return the field comment. If there is no serialField comment, return - * javadoc comment of corresponding FieldDoc. - * - * @return the field comment. If there is no serialField comment, return - * javadoc comment of corresponding FieldDoc. - */ - public String description(); - - /** - * Compares this Object with the specified Object for order. Returns a - * negative integer, zero, or a positive integer as this Object is less - * than, equal to, or greater than the given Object. - *

    - * Included to make SerialFieldTag items java.lang.Comparable. - * - * @param obj the {@code Object} to be compared. - * @return a negative integer, zero, or a positive integer as this Object - * is less than, equal to, or greater than the given Object. - * @exception ClassCastException the specified Object's type prevents it - * from being compared to this Object. - * @since 1.2 - */ - public int compareTo(Object obj); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/SourcePosition.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/SourcePosition.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -import java.io.File; - -/** - * This interface describes a source position: filename, line number, - * and column number. - * - * @since 1.4 - * @author Neal M Gafter - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface SourcePosition { - /** The source file. Returns null if no file information is - * available. - * - * @return the source file as a File. - */ - File file(); - - /** The line in the source file. The first line is numbered 1; - * 0 means no line number information is available. - * - * @return the line number in the source file as an integer. - */ - int line(); - - /** The column in the source file. The first column is - * numbered 1; 0 means no column information is available. - * Columns count characters in the input stream; a tab - * advances the column number to the next 8-column tab stop. - * - * @return the column on the source line as an integer. - */ - int column(); - - /** Convert the source position to the form "Filename:line". */ - String toString(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/Tag.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/Tag.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,177 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -import java.text.BreakIterator; -import java.util.Locale; - -/** - * Represents a simple documentation tag, such as @since, @author, @version. - * Given a tag (e.g. "@since 1.2"), holds tag name (e.g. "@since") - * and tag text (e.g. "1.2"). Tags with structure or which require - * special processing are handled by subclasses such as ParamTag - * (for @param), SeeTag (for @see and {@link}), and ThrowsTag - * (for @throws). - * - * @author Robert Field - * @author Atul M Dambalkar - * @see SeeTag - * @see ParamTag - * @see ThrowsTag - * @see SerialFieldTag - * @see Doc#tags() - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface Tag { - - /** - * Return the name of this tag. The name is the string - * starting with "@" that is used in a doc comment, such as - * {@code @return}. For inline tags, such as - * {@code {@link}}, the curly brackets - * are not part of the name, so in this example the name - * would be simply {@code @link}. - * - * @return the name of this tag - */ - String name(); - - /** - * Return the containing {@link Doc} of this Tag element. - * - * @return the containing {@link Doc} of this Tag element - */ - Doc holder(); - - /** - * Return the kind of this tag. - * For most tags, - * {@code kind() == name()}; - * the following table lists those cases where there is more - * than one tag of a given kind: - * - * - * - * - * - * - * - *
    Related Tags
    {@code name() } {@code kind() } - *
    {@code @exception } {@code @throws } - *
    {@code @link } {@code @see } - *
    {@code @linkplain } {@code @see } - *
    {@code @see } {@code @see } - *
    {@code @serial } {@code @serial } - *
    {@code @serialData } {@code @serial } - *
    {@code @throws } {@code @throws } - *
    - * - * @return the kind of this tag. - */ - String kind(); - - /** - * Return the text of this tag, that is, the portion beyond tag name. - * - * @return the text of this tag - */ - String text(); - - /** - * Convert this object to a string. - */ - String toString(); - - /** - * For a documentation comment with embedded {@code {@link}} - * tags, return an array of {@code Tag} objects. The entire - * doc comment is broken down into strings separated by - * {@code {@link}} tags, where each successive element - * of the array represents either a string or - * {@code {@link}} tag, in order, from start to end. - * Each string is represented by a {@code Tag} object of - * name "Text", where {@link #text()} returns the string. Each - * {@code {@link}} tag is represented by a - * {@link SeeTag} of name "@link" and kind "@see". - * For example, given the following comment - * tag: - *

    - * {@code This is a {@link Doc commentlabel} example.} - *

    - * return an array of Tag objects: - *

      - *
    • tags[0] is a {@link Tag} with name "Text" and text consisting - * of "This is a " - *
    • tags[1] is a {@link SeeTag} with name "@link", referenced - * class {@code Doc} and label "commentlabel" - *
    • tags[2] is a {@link Tag} with name "Text" and text consisting - * of " example." - *
    - * - * @return Tag[] array of tags - * @see ParamTag - * @see ThrowsTag - */ - Tag[] inlineTags(); - - /** - * Return the first sentence of the comment as an array of tags. - * Includes inline tags - * (i.e. {@link reference} tags) but not - * block tags. - * Each section of plain text is represented as a {@link Tag} - * of kind "Text". - * Inline tags are represented as a {@link SeeTag} of kind "@link". - * If the locale is English language, the first sentence is - * determined by the rules described in the Java Language - * Specification (first version): "This sentence ends - * at the first period that is followed by a blank, tab, or - * line terminator or at the first tagline.", in - * addition a line will be terminated by paragraph and - * section terminating HTML tags: <p> </p> <h1> - * <h2> <h3> <h4> <h5> <h6> - * <hr> <pre> or </pre>. - * If the locale is not English, the sentence end will be - * determined by - * {@link BreakIterator#getSentenceInstance(Locale)}. - * - * @return an array of {@link Tag} objects representing the - * first sentence of the comment - */ - Tag[] firstSentenceTags(); - - /** - * Return the source position of this tag. - * @return the source position of this tag. - */ - public SourcePosition position(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/ThrowsTag.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/ThrowsTag.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * Copyright (c) 1998, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a @throws or @exception documentation tag. - * Parses and holds the exception name and exception comment. - * Note: @exception is a backwards compatible synonymy for @throws. - * - * @author Robert Field - * @author Atul M Dambalkar - * @see ExecutableMemberDoc#throwsTags() - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface ThrowsTag extends Tag { - - /** - * Return the name of the exception - * associated with this {@code ThrowsTag}. - * - * @return name of the exception. - */ - String exceptionName(); - - /** - * Return the exception comment - * associated with this {@code ThrowsTag}. - * - * @return exception comment. - */ - String exceptionComment(); - - /** - * Return a {@code ClassDoc} that represents the exception. - * If the type of the exception is a type variable, return the - * {@code ClassDoc} of its erasure. - * - *

    This method cannot accommodate certain generic type - * constructs. The {@code exceptionType} method - * should be used instead. - * - * @return {@code ClassDoc} that represents the exception. - * @see #exceptionType - */ - ClassDoc exception(); - - /** - * Return the type of the exception - * associated with this {@code ThrowsTag}. - * This may be a {@code ClassDoc} or a {@code TypeVariable}. - * - * @return the type of the exception. - * @since 1.5 - */ - Type exceptionType(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/Type.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/Type.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,183 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -/** - * Represents a type. A type can be a class or interface, an - * invocation (like {@code List}) of a generic class or interface, - * a type variable, a wildcard type ("{@code ?}"), - * or a primitive data type (like {@code char}). - * - * @since 1.2 - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * @author Scott Seligman (generics) - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface Type { - - /** - * Return unqualified name of type excluding any dimension information. - *

    - * For example, a two dimensional array of String returns - * "{@code String}". - * @return unqualified name of type excluding any dimension information. - */ - String typeName(); - - /** - * Return qualified name of type excluding any dimension information. - *

    - * For example, a two dimensional array of String - * returns "{@code java.lang.String}". - * @return qualified name of this type excluding any dimension information. - */ - String qualifiedTypeName(); - - /** - * Return the simple name of this type excluding any dimension information. - * This is the unqualified name of the type, except that for nested types - * only the identifier of the innermost type is included. - *

    - * For example, the class {@code Outer.Inner} returns - * "{@code Inner}". - * - * @since 1.5 - * @return the simple name of this type excluding any dimension information. - */ - String simpleTypeName(); - - /** - * Return the type's dimension information, as a string. - *

    - * For example, a two dimensional array of String returns - * "{@code [][]}". - * @return the type's dimension information as a string. - */ - String dimension(); - - /** - * Return a string representation of the type. - * This includes any dimension information and type arguments. - *

    - * For example, a two dimensional array of String may return - * "{@code java.lang.String[][]}", - * and the parameterized type {@code List} may return - * "{@code java.util.List}". - * - * @return a string representation of the type. - */ - String toString(); - - /** - * Return true if this type represents a primitive type. - * - * @return true if this type represents a primitive type. - * @since 1.5 - */ - boolean isPrimitive(); - - /** - * Return this type as a {@code ClassDoc} if it represents a class - * or interface. Array dimensions are ignored. - * If this type is a {@code ParameterizedType}, - * {@code TypeVariable}, or {@code WildcardType}, return - * the {@code ClassDoc} of the type's erasure. If this is an - * {@code AnnotationTypeDoc}, return this as a {@code ClassDoc} - * (but see {@link #asAnnotationTypeDoc()}). - * If this is a primitive type, return null. - * - * @return the {@code ClassDoc} of this type, - * or null if it is a primitive type. - */ - ClassDoc asClassDoc(); - - /** - * Return this type as a {@code ParameterizedType} if it represents - * an invocation of a generic class or interface. Array dimensions - * are ignored. - * - * @return a {@code ParameterizedType} if the type is an - * invocation of a generic type, or null if it is not. - * @since 1.5 - */ - ParameterizedType asParameterizedType(); - - /** - * Return this type as a {@code TypeVariable} if it represents - * a type variable. Array dimensions are ignored. - * - * @return a {@code TypeVariable} if the type is a type variable, - * or null if it is not. - * @since 1.5 - */ - TypeVariable asTypeVariable(); - - /** - * Return this type as a {@code WildcardType} if it represents - * a wildcard type. - * - * @return a {@code WildcardType} if the type is a wildcard type, - * or null if it is not. - * @since 1.5 - */ - WildcardType asWildcardType(); - - /** - * Returns this type as a {@code AnnotatedType} if it represents - * an annotated type. - * - * @return a {@code AnnotatedType} if the type if an annotated type, - * or null if it is not - * @since 1.8 - */ - AnnotatedType asAnnotatedType(); - - /** - * Return this type as an {@code AnnotationTypeDoc} if it represents - * an annotation type. Array dimensions are ignored. - * - * @return an {@code AnnotationTypeDoc} if the type is an annotation - * type, or null if it is not. - * @since 1.5 - */ - AnnotationTypeDoc asAnnotationTypeDoc(); - - /** - * If this type is an array type, return the element type of the - * array. Otherwise, return null. - * - * @return a {@code Type} representing the element type or null. - * @since 1.8 - */ - Type getElementType(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/TypeVariable.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/TypeVariable.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents a type variable. - * For example, the generic interface {@code List} has a single - * type variable {@code E}. - * A type variable may have explicit bounds, as in - * {@code C}. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface TypeVariable extends Type { - - /** - * Return the bounds of this type variable. - * These are the types given by the extends clause. - * Return an empty array if there are no explicit bounds. - * - * @return the bounds of this type variable. - */ - Type[] bounds(); - - /** - * Return the class, interface, method, or constructor within - * which this type variable is declared. - * - * @return the class, interface, method, or constructor within - * which this type variable is declared. - */ - ProgramElementDoc owner(); - - /** - * Get the annotations of this program element. - * Return an empty array if there are none. - * - * @return the annotations of this program element or - * an empty array if there are none. - */ - public AnnotationDesc[] annotations(); - -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/WildcardType.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/WildcardType.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - - -/** - * Represents a wildcard type argument. - * Examples include:

    - * {@code }
    - * {@code }
    - * {@code }
    - * 
    - * A wildcard type can have explicit extends bounds - * or explicit super bounds or neither, but not both. - * - * @author Scott Seligman - * @since 1.5 - * - * @deprecated - * The declarations in this package have been superseded by those - * in the package {@code jdk.javadoc.doclet}. - * For more information, see the Migration Guide in the documentation for that package. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public interface WildcardType extends Type { - - /** - * Return the upper bounds of this wildcard type argument - * as given by the extends clause. - * Return an empty array if no such bounds are explicitly given. - * - * @return the extends bounds of this wildcard type argument - */ - Type[] extendsBounds(); - - /** - * Return the lower bounds of this wildcard type argument - * as given by the super clause. - * Return an empty array if no such bounds are explicitly given. - * - * @return the super bounds of this wildcard type argument - */ - Type[] superBounds(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/javadoc/package-info.java --- a/src/jdk.javadoc/share/classes/com/sun/javadoc/package-info.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -/* - * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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. - */ - -/** -

    -Note: The declarations in this package have been superseded by those -in the package {@link jdk.javadoc.doclet}. -For more information, see the Migration Guide in the documentation for that package. -

    - -The Doclet API (also called the Javadoc API) provides a mechanism -for clients to inspect the source-level structure of programs and -libraries, including javadoc comments embedded in the source. -This is useful for documentation, program checking, automatic -code generation and many other tools. -

    - -Doclets are invoked by javadoc and use this API to write out -program information to files. For example, the standard doclet is called -by default and writes out documentation to HTML files. -

    - -The invocation is defined by the abstract {@link com.sun.javadoc.Doclet} class --- the entry point is the {@link com.sun.javadoc.Doclet#start(RootDoc) start} method: -

    -    public static boolean start(RootDoc root)
    -
    -The {@link com.sun.javadoc.RootDoc} instance holds the root of the program structure -information. From this root all other program structure -information can be extracted. -

    - - -

    Terminology

    - - -When calling javadoc, you pass in package names and source file names -- -these are called the specified packages and classes. -You also pass in Javadoc options; the access control Javadoc options -({@code -public}, {@code -protected}, {@code -package}, -and {@code -private}) filter program elements, producing a -result set, called the included set, or "documented" set. -(The unfiltered set is also available through -{@link com.sun.javadoc.PackageDoc#allClasses(boolean) allClasses(false)}.) -

    - - -Throughout this API, the term class is normally a -shorthand for "class or interface", as in: {@link com.sun.javadoc.ClassDoc}, -{@link com.sun.javadoc.PackageDoc#allClasses() allClasses()}, and -{@link com.sun.javadoc.PackageDoc#findClass(String) findClass(String)}. -In only a couple of other places, it means "class, as opposed to interface", -as in: {@link com.sun.javadoc.Doc#isClass()}. -In the second sense, this API calls out four kinds of classes: -{@linkplain com.sun.javadoc.Doc#isOrdinaryClass() ordinary classes}, -{@linkplain com.sun.javadoc.Doc#isEnum() enums}, -{@linkplain com.sun.javadoc.Doc#isError() errors} and -{@linkplain com.sun.javadoc.Doc#isException() exceptions}. -Throughout the API, the detailed description of each program element -describes explicitly which meaning is being used. -

    - - -A qualified class or interface name is one that has its package -name prepended to it, such as {@code java.lang.String}. A non-qualified -name has no package name, such as {@code String}. -

    - - -

    Example

    - -The following is an example doclet that -displays information in the {@code @param} tags of the processed -classes: -
    -import com.sun.javadoc.*;
    -
    -public class ListParams extends Doclet {
    -
    -    public static boolean start(RootDoc root) {
    -        ClassDoc[] classes = root.classes();
    -        for (int i = 0; i < classes.length; ++i) {
    -            ClassDoc cd = classes[i];
    -            printMembers(cd.constructors());
    -            printMembers(cd.methods());
    -        }
    -        return true;
    -    }
    -
    -    static void printMembers(ExecutableMemberDoc[] mems) {
    -        for (int i = 0; i < mems.length; ++i) {
    -            ParamTag[] params = mems[i].paramTags();
    -            System.out.println(mems[i].qualifiedName());
    -            for (int j = 0; j < params.length; ++j) {
    -                System.out.println("   " + params[j].parameterName()
    -                    + " - " + params[j].parameterComment());
    -            }
    -        }
    -    }
    -}
    -
    -Interfaces and methods from the Javadoc API are marked in -red. -{@link com.sun.javadoc.Doclet Doclet} is an abstract class that specifies -the invocation interface for doclets, -{@link com.sun.javadoc.Doclet Doclet} holds class or interface information, -{@link com.sun.javadoc.ExecutableMemberDoc} is a -superinterface of {@link com.sun.javadoc.MethodDoc} and -{@link com.sun.javadoc.ConstructorDoc}, -and {@link com.sun.javadoc.ParamTag} holds information -from "{@code @param}" tags. -

    -This doclet when invoked with a command line like: -

    -    javadoc -doclet ListParams -sourcepath <source-location> java.util
    -
    -producing output like: -
    -    ...
    -    java.util.ArrayList.add
    -       index - index at which the specified element is to be inserted.
    -       element - element to be inserted.
    -    java.util.ArrayList.remove
    -       index - the index of the element to removed.
    -    ...
    -
    -
    -@see com.sun.javadoc.Doclet -@see com.sun.javadoc.RootDoc -*/ -package com.sun.javadoc; diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/Standard.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/Standard.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.standard; - -import com.sun.javadoc.RootDoc; - -/** - * This is not the doclet you are looking for. - * @deprecated The doclet has been superseded by its replacement, - * {@link jdk.javadoc.doclet.StandardDoclet}. - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") - -public class Standard { - - public static boolean start(RootDoc root) { - root.printNotice("Notice: " + "This is not the Standard Doclet"); - return true; - } - - public static int optionLength(String option) { - return 0; // all options are unsupported - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/package-info.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/doclets/standard/package-info.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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. - */ - -/** -

    -Note: The declarations in this package have been replaced by those -in the new package {@link jdk.javadoc.doclet}. -

    -*/ - -package com.sun.tools.doclets.standard; diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc; - -import java.io.PrintWriter; - -import com.sun.tools.javadoc.main.Start; - -/** - * Provides external entry points (tool and programmatic) - * for the javadoc program. - * - *

    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. - * - * @deprecated - * This class is now deprecated and may be removed in a future release. - * See - * {@code javax.tools.ToolProvider::getSystemDocumentationTool} - * and - * {@code javax.tools.DocumentationTool} - * for replacement functionality. - * - * @since 1.4 - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class Main { - - /** - * Constructor should never be called. - */ - private Main() { - } - - /** - * Command line interface. - * @param args The command line parameters. - */ - public static void main(String... args) { - System.exit(execute(args)); - } - - /** - * Programmatic interface. - * @param args The command line parameters. - * @return The return code. - */ - public static int execute(String... args) { - Start jdoc = new Start(); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param args The command line parameters. - * @param docletParentClassLoader The parent class loader used when - * creating the doclet classloader. If null, the class loader used - * to instantiate doclets will be created without specifying a parent - * class loader. - * @return The return code. - * @since 1.7 - */ - public static int execute(ClassLoader docletParentClassLoader, String... args) { - Start jdoc = new Start(docletParentClassLoader); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param args The command line parameters. - * @return The return code. - */ - public static int execute(String programName, String... args) { - Start jdoc = new Start(programName); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param args The command line parameters. - * @param docletParentClassLoader The parent class loader used when - * creating the doclet classloader. If null, the class loader used - * to instantiate doclets will be created without specifying a parent - * class loader. - * @return The return code. - * @since 1.7 - */ - public static int execute(String programName, ClassLoader docletParentClassLoader, String... args) { - Start jdoc = new Start(programName, docletParentClassLoader); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param defaultDocletClassName Fully qualified class name. - * @param args The command line parameters. - * @return The return code. - */ - public static int execute(String programName, - String defaultDocletClassName, - String... args) { - Start jdoc = new Start(programName, defaultDocletClassName); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param defaultDocletClassName Fully qualified class name. - * @param docletParentClassLoader The parent class loader used when - * creating the doclet classloader. If null, the class loader used - * to instantiate doclets will be created without specifying a parent - * class loader. - * @param args The command line parameters. - * @return The return code. - * @since 1.7 - */ - public static int execute(String programName, - String defaultDocletClassName, - ClassLoader docletParentClassLoader, - String... args) { - Start jdoc = new Start(programName, defaultDocletClassName, docletParentClassLoader); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param errWriter PrintWriter to receive error messages. - * @param warnWriter PrintWriter to receive error messages. - * @param noticeWriter PrintWriter to receive error messages. - * @param defaultDocletClassName Fully qualified class name. - * @param args The command line parameters. - * @return The return code. - */ - public static int execute(String programName, - PrintWriter errWriter, - PrintWriter warnWriter, - PrintWriter noticeWriter, - String defaultDocletClassName, - String... args) { - Start jdoc = new Start(programName, - errWriter, warnWriter, noticeWriter, - defaultDocletClassName); - return jdoc.begin(args); - } - - /** - * Programmatic interface. - * @param programName Name of the program (for error messages). - * @param errWriter PrintWriter to receive error messages. - * @param warnWriter PrintWriter to receive error messages. - * @param noticeWriter PrintWriter to receive error messages. - * @param defaultDocletClassName Fully qualified class name. - * @param docletParentClassLoader The parent class loader used when - * creating the doclet classloader. If null, the class loader used - * to instantiate doclets will be created without specifying a parent - * class loader. - * @param args The command line parameters. - * @return The return code. - * @since 1.7 - */ - public static int execute(String programName, - PrintWriter errWriter, - PrintWriter warnWriter, - PrintWriter noticeWriter, - String defaultDocletClassName, - ClassLoader docletParentClassLoader, - String... args) { - Start jdoc = new Start(programName, - errWriter, warnWriter, noticeWriter, - defaultDocletClassName, - docletParentClassLoader); - return jdoc.begin(args); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AbstractTypeImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AbstractTypeImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.tools.javac.code.Type; - - -/** - * Abstract implementation of Type, with useful - * defaults for the methods in Type (and a couple from - * ProgramElementDoc). - * - *

    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. - * - * @author Scott Seligman - * @since 1.5 - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -abstract class AbstractTypeImpl implements com.sun.javadoc.Type { - - protected final DocEnv env; - protected final Type type; - - protected AbstractTypeImpl(DocEnv env, Type type) { - this.env = env; - this.type = type; - } - - public String typeName() { - return type.tsym.name.toString(); - } - - public String qualifiedTypeName() { - return type.tsym.getQualifiedName().toString(); - } - - public com.sun.javadoc.Type getElementType() { - return null; - } - - public String simpleTypeName() { - return type.tsym.name.toString(); - } - - public String name() { - return typeName(); - } - - public String qualifiedName() { - return qualifiedTypeName(); - } - - public String toString() { - return qualifiedTypeName(); - } - - public String dimension() { - return ""; - } - - public boolean isPrimitive() { - return false; - } - - public ClassDoc asClassDoc() { - return null; - } - - public TypeVariable asTypeVariable() { - return null; - } - - public WildcardType asWildcardType() { - return null; - } - - public ParameterizedType asParameterizedType() { - return null; - } - - public AnnotationTypeDoc asAnnotationTypeDoc() { - return null; - } - - public AnnotatedType asAnnotatedType() { - return null; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotatedTypeImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotatedTypeImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; -import com.sun.tools.javac.code.Attribute; -import com.sun.tools.javac.code.Attribute.TypeCompound; -import com.sun.tools.javac.util.List; - -/** - * Implementation of AnnotatedType, which - * represents an annotated type. - * - * @author Mahmood Ali - * @since 1.8 - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class AnnotatedTypeImpl - extends AbstractTypeImpl implements AnnotatedType { - - AnnotatedTypeImpl(DocEnv env, com.sun.tools.javac.code.Type type) { - super(env, type); - } - - /** - * Get the annotations of this program element. - * Return an empty array if there are none. - */ - @Override - public AnnotationDesc[] annotations() { - List tas = type.getAnnotationMirrors(); - if (tas == null || - tas.isEmpty()) { - return new AnnotationDesc[0]; - } - AnnotationDesc res[] = new AnnotationDesc[tas.length()]; - int i = 0; - for (Attribute.Compound a : tas) { - res[i++] = new AnnotationDescImpl(env, a); - } - return res; - } - - @Override - public com.sun.javadoc.Type underlyingType() { - return TypeMaker.getType(env, type, true, false); - } - - @Override - public AnnotatedType asAnnotatedType() { - return this; - } - - @Override - public String toString() { - return typeName(); - } - - @Override - public String typeName() { - return this.underlyingType().typeName(); - } - - @Override - public String qualifiedTypeName() { - return this.underlyingType().qualifiedTypeName(); - } - - @Override - public String simpleTypeName() { - return this.underlyingType().simpleTypeName(); - } - - @Override - public String dimension() { - return this.underlyingType().dimension(); - } - - @Override - public boolean isPrimitive() { - return this.underlyingType().isPrimitive(); - } - - @Override - public ClassDoc asClassDoc() { - return this.underlyingType().asClassDoc(); - } - - @Override - public TypeVariable asTypeVariable() { - return this.underlyingType().asTypeVariable(); - } - - @Override - public WildcardType asWildcardType() { - return this.underlyingType().asWildcardType(); - } - - @Override - public ParameterizedType asParameterizedType() { - return this.underlyingType().asParameterizedType(); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationDescImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationDescImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.tools.javac.code.Attribute; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.util.List; -import com.sun.tools.javac.util.Pair; - - -/** - * Represents an annotation. - * An annotation associates a value with each element of an annotation type. - * Sure it ought to be called "Annotation", but that clashes with - * java.lang.annotation.Annotation. - * - *

    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. - * - * @author Scott Seligman - * @since 1.5 - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class AnnotationDescImpl implements AnnotationDesc { - - private final DocEnv env; - private final Attribute.Compound annotation; - - - AnnotationDescImpl(DocEnv env, Attribute.Compound annotation) { - this.env = env; - this.annotation = annotation; - } - - /** - * Returns the annotation type of this annotation. - */ - public AnnotationTypeDoc annotationType() { - ClassSymbol atsym = (ClassSymbol)annotation.type.tsym; - if (annotation.type.isErroneous()) { - env.warning(null, "javadoc.class_not_found", annotation.type.toString()); - return new AnnotationTypeDocImpl(env, atsym); - } else { - return (AnnotationTypeDoc)env.getClassDoc(atsym); - } - } - - /** - * Returns this annotation's elements and their values. - * Only those explicitly present in the annotation are - * included, not those assuming their default values. - * Returns an empty array if there are none. - */ - public ElementValuePair[] elementValues() { - List> vals = annotation.values; - ElementValuePair res[] = new ElementValuePair[vals.length()]; - int i = 0; - for (Pair val : vals) { - res[i++] = new ElementValuePairImpl(env, val.fst, val.snd); - } - return res; - } - - /** - * Check for the synthesized bit on the annotation. - * - * @return true if the annotation is synthesized. - */ - public boolean isSynthesized() { - return annotation.isSynthesized(); - } - - /** - * Returns a string representation of this annotation. - * String is of one of the forms: - *

    -     *     {@code @com.example.foo(name1=val1, name2=val2)}
    -     *     {@code @com.example.foo(val)}
    -     *     {@code @com.example.foo}
    -     * 
    - * Omit parens for marker annotations, and omit "value=" when allowed. - */ - @Override - public String toString() { - StringBuilder sb = new StringBuilder("@"); - sb.append(annotation.type.tsym); - - ElementValuePair vals[] = elementValues(); - if (vals.length > 0) { // omit parens for marker annotation - sb.append('('); - boolean first = true; - for (ElementValuePair val : vals) { - if (!first) { - sb.append(", "); - } - first = false; - - String name = val.element().name(); - if (vals.length == 1 && name.equals("value")) { - sb.append(val.value()); - } else { - sb.append(val); - } - } - sb.append(')'); - } - return sb.toString(); - } - - - /** - * Represents an association between an annotation type element - * and one of its values. - */ - public static class ElementValuePairImpl implements ElementValuePair { - - private final DocEnv env; - private final MethodSymbol meth; - private final Attribute value; - - ElementValuePairImpl(DocEnv env, MethodSymbol meth, Attribute value) { - this.env = env; - this.meth = meth; - this.value = value; - } - - /** - * Returns the annotation type element. - */ - public AnnotationTypeElementDoc element() { - return env.getAnnotationTypeElementDoc(meth); - } - - /** - * Returns the value associated with the annotation type element. - */ - public AnnotationValue value() { - return new AnnotationValueImpl(env, value); - } - - /** - * Returns a string representation of this pair - * of the form "name=value". - */ - @Override - public String toString() { - return meth.name + "=" + value(); - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeDocImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeDocImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.source.util.TreePath; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.util.List; - -import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; - -import static com.sun.tools.javac.code.Kinds.Kind.*; - -/** - * Represents an annotation type. - * - *

    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. - * - * @author Scott Seligman - * @since 1.5 - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class AnnotationTypeDocImpl - extends ClassDocImpl implements AnnotationTypeDoc { - - public AnnotationTypeDocImpl(DocEnv env, ClassSymbol sym) { - this(env, sym, null); - } - - public AnnotationTypeDocImpl(DocEnv env, ClassSymbol sym, TreePath treePath) { - super(env, sym, treePath); - } - - /** - * Returns true, as this is an annotation type. - * (For legacy doclets, return false.) - */ - public boolean isAnnotationType() { - return !isInterface(); - } - - /** - * Returns false. Though technically an interface, an annotation - * type is not considered an interface for this purpose. - * (For legacy doclets, returns true.) - */ - public boolean isInterface() { - return env.legacyDoclet; - } - - /** - * Returns an empty array, as all methods are annotation type elements. - * (For legacy doclets, returns the elements.) - * @see #elements() - */ - public MethodDoc[] methods(boolean filter) { - return env.legacyDoclet - ? (MethodDoc[])elements() - : new MethodDoc[0]; - } - - /** - * Returns the elements of this annotation type. - * Returns an empty array if there are none. - * Elements are always public, so no need to filter them. - */ - public AnnotationTypeElementDoc[] elements() { - List elements = List.nil(); - for (Symbol sym : tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null && sym.kind == MTH) { - MethodSymbol s = (MethodSymbol)sym; - elements = elements.prepend(env.getAnnotationTypeElementDoc(s)); - } - } - return - elements.toArray(new AnnotationTypeElementDoc[elements.length()]); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeElementDocImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationTypeElementDocImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.source.util.TreePath; -import com.sun.tools.javac.code.Symbol.*; - -/** - * Represents an element of an annotation type. - * - *

    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. - * - * @author Scott Seligman - * @since 1.5 - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class AnnotationTypeElementDocImpl - extends MethodDocImpl implements AnnotationTypeElementDoc { - - public AnnotationTypeElementDocImpl(DocEnv env, MethodSymbol sym) { - super(env, sym); - } - - public AnnotationTypeElementDocImpl(DocEnv env, MethodSymbol sym, TreePath treePath) { - super(env, sym, treePath); - } - - /** - * Returns true, as this is an annotation type element. - * (For legacy doclets, return false.) - */ - public boolean isAnnotationTypeElement() { - return !isMethod(); - } - - /** - * Returns false. Although this is technically a method, we don't - * consider it one for this purpose. - * (For legacy doclets, return true.) - */ - public boolean isMethod() { - return env.legacyDoclet; - } - - /** - * Returns false, even though this is indeed abstract. See - * MethodDocImpl.isAbstract() for the (il)logic behind this. - */ - public boolean isAbstract() { - return false; - } - - /** - * Returns the default value of this element. - * Returns null if this element has no default. - */ - public AnnotationValue defaultValue() { - return (sym.defaultValue == null) - ? null - : new AnnotationValueImpl(env, sym.defaultValue); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationValueImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/AnnotationValueImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,178 +0,0 @@ -/* - * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.tools.javac.code.Attribute; - -import static com.sun.tools.javac.code.TypeTag.BOOLEAN; - -/** - * Represents a value of an annotation type element. - * - *

    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. - * - * @author Scott Seligman - * @since 1.5 - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class AnnotationValueImpl implements AnnotationValue { - - private final DocEnv env; - private final Attribute attr; - - - AnnotationValueImpl(DocEnv env, Attribute attr) { - this.env = env; - this.attr = attr; - } - - /** - * Returns the value. - * The type of the returned object is one of the following: - *

    • a wrapper class for a primitive type - *
    • String - *
    • Type (representing a class literal) - *
    • FieldDoc (representing an enum constant) - *
    • AnnotationDesc - *
    • AnnotationValue[] - *
    - */ - public Object value() { - ValueVisitor vv = new ValueVisitor(); - attr.accept(vv); - return vv.value; - } - - private class ValueVisitor implements Attribute.Visitor { - public Object value; - - public void visitConstant(Attribute.Constant c) { - if (c.type.hasTag(BOOLEAN)) { - // javac represents false and true as integers 0 and 1 - value = Boolean.valueOf( - ((Integer)c.value).intValue() != 0); - } else { - value = c.value; - } - } - - public void visitClass(Attribute.Class c) { - value = TypeMaker.getType(env, - env.types.erasure(c.classType)); - } - - public void visitEnum(Attribute.Enum e) { - value = env.getFieldDoc(e.value); - } - - public void visitCompound(Attribute.Compound c) { - value = new AnnotationDescImpl(env, c); - } - - public void visitArray(Attribute.Array a) { - AnnotationValue vals[] = new AnnotationValue[a.values.length]; - for (int i = 0; i < vals.length; i++) { - vals[i] = new AnnotationValueImpl(env, a.values[i]); - } - value = vals; - } - - public void visitError(Attribute.Error e) { - value = ""; - } - } - - /** - * Returns a string representation of the value. - * - * @return the text of a Java language annotation value expression - * whose value is the value of this annotation type element. - */ - @Override - public String toString() { - ToStringVisitor tv = new ToStringVisitor(); - attr.accept(tv); - return tv.toString(); - } - - private class ToStringVisitor implements Attribute.Visitor { - private final StringBuilder sb = new StringBuilder(); - - @Override - public String toString() { - return sb.toString(); - } - - public void visitConstant(Attribute.Constant c) { - if (c.type.hasTag(BOOLEAN)) { - // javac represents false and true as integers 0 and 1 - sb.append(((Integer)c.value).intValue() != 0); - } else { - sb.append(FieldDocImpl.constantValueExpression(c.value)); - } - } - - public void visitClass(Attribute.Class c) { - sb.append(c); - } - - public void visitEnum(Attribute.Enum e) { - sb.append(e); - } - - public void visitCompound(Attribute.Compound c) { - sb.append(new AnnotationDescImpl(env, c)); - } - - public void visitArray(Attribute.Array a) { - // Omit braces from singleton. - if (a.values.length != 1) sb.append('{'); - - boolean first = true; - for (Attribute elem : a.values) { - if (first) { - first = false; - } else { - sb.append(", "); - } - elem.accept(this); - } - // Omit braces from singleton. - if (a.values.length != 1) sb.append('}'); - } - - public void visitError(Attribute.Error e) { - sb.append(""); - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ClassDocImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1331 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Modifier; -import java.net.URI; -import java.util.HashSet; -import java.util.Set; - -import javax.tools.FileObject; -import javax.tools.JavaFileManager.Location; -import javax.tools.StandardJavaFileManager; -import javax.tools.StandardLocation; - -import com.sun.javadoc.*; -import com.sun.source.util.TreePath; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Kinds; -import com.sun.tools.javac.code.Kinds.KindSelector; -import com.sun.tools.javac.code.Scope; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.code.TypeTag; -import com.sun.tools.javac.comp.AttrContext; -import com.sun.tools.javac.comp.Env; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCFieldAccess; -import com.sun.tools.javac.tree.JCTree.JCImport; -import com.sun.tools.javac.tree.TreeInfo; -import com.sun.tools.javac.util.List; -import com.sun.tools.javac.util.ListBuffer; -import com.sun.tools.javac.util.Name; -import com.sun.tools.javac.util.Names; -import com.sun.tools.javac.util.Position; -import static com.sun.tools.javac.code.Kinds.Kind.*; -import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE; -import static com.sun.tools.javac.code.TypeTag.CLASS; -import static com.sun.tools.javac.tree.JCTree.Tag.*; - -/** - * Represents a java class and provides access to information - * about the class, the class' comment and tags, and the - * members of the class. A ClassDocImpl only exists if it was - * processed in this run of javadoc. References to classes - * which may or may not have been processed in this run are - * referred to using Type (which can be converted to ClassDocImpl, - * if possible). - * - *

    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. - * - * @see Type - * - * @since 1.2 - * @author Robert Field - * @author Neal Gafter (rewrite) - * @author Scott Seligman (generics, enums, annotations) - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { - - public final ClassType type; // protected->public for debugging - public final ClassSymbol tsym; - - boolean isIncluded = false; // Set in RootDocImpl - - private SerializedForm serializedForm; - - /** - * Constructor - */ - public ClassDocImpl(DocEnv env, ClassSymbol sym) { - this(env, sym, null); - } - - /** - * Constructor - */ - public ClassDocImpl(DocEnv env, ClassSymbol sym, TreePath treePath) { - super(env, sym, treePath); - this.type = (ClassType)sym.type; - this.tsym = sym; - } - - public com.sun.javadoc.Type getElementType() { - return null; - } - - /** - * Returns the flags in terms of javac's flags - */ - protected long getFlags() { - return getFlags(tsym); - } - - /** - * Returns the flags of a ClassSymbol in terms of javac's flags - */ - static long getFlags(ClassSymbol clazz) { - try { - return clazz.flags(); - } catch (CompletionFailure ex) { - /* Quietly ignore completion failures and try again - the type - * for which the CompletionFailure was thrown shouldn't be completed - * again by the completer that threw the CompletionFailure. - */ - return getFlags(clazz); - } - } - - /** - * Is a ClassSymbol an annotation type? - */ - static boolean isAnnotationType(ClassSymbol clazz) { - return (getFlags(clazz) & Flags.ANNOTATION) != 0; - } - - /** - * Identify the containing class - */ - protected ClassSymbol getContainingClass() { - return tsym.owner.enclClass(); - } - - /** - * Return true if this is a class, not an interface. - */ - @Override - public boolean isClass() { - return !Modifier.isInterface(getModifiers()); - } - - /** - * Return true if this is a ordinary class, - * not an enumeration, exception, an error, or an interface. - */ - @Override - public boolean isOrdinaryClass() { - if (isEnum() || isInterface() || isAnnotationType()) { - return false; - } - for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { - if (t.tsym == env.syms.errorType.tsym || - t.tsym == env.syms.exceptionType.tsym) { - return false; - } - } - return true; - } - - /** - * Return true if this is an enumeration. - * (For legacy doclets, return false.) - */ - @Override - public boolean isEnum() { - return (getFlags() & Flags.ENUM) != 0 - && - !env.legacyDoclet; - } - - /** - * Return true if this is an interface, but not an annotation type. - * Overridden by AnnotationTypeDocImpl. - */ - @Override - public boolean isInterface() { - return Modifier.isInterface(getModifiers()); - } - - /** - * Return true if this is an exception class - */ - @Override - public boolean isException() { - if (isEnum() || isInterface() || isAnnotationType()) { - return false; - } - for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { - if (t.tsym == env.syms.exceptionType.tsym) { - return true; - } - } - return false; - } - - /** - * Return true if this is an error class - */ - @Override - public boolean isError() { - if (isEnum() || isInterface() || isAnnotationType()) { - return false; - } - for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { - if (t.tsym == env.syms.errorType.tsym) { - return true; - } - } - return false; - } - - /** - * Return true if this is a throwable class - */ - public boolean isThrowable() { - if (isEnum() || isInterface() || isAnnotationType()) { - return false; - } - for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { - if (t.tsym == env.syms.throwableType.tsym) { - return true; - } - } - return false; - } - - /** - * Return true if this class is abstract - */ - public boolean isAbstract() { - return Modifier.isAbstract(getModifiers()); - } - - /** - * Returns true if this class was synthesized by the compiler. - */ - public boolean isSynthetic() { - return (getFlags() & Flags.SYNTHETIC) != 0; - } - - /** - * Return true if this class is included in the active set. - * A ClassDoc is included iff either it is specified on the - * commandline, or if it's containing package is specified - * on the command line, or if it is a member class of an - * included class. - */ - - public boolean isIncluded() { - if (isIncluded) { - return true; - } - if (env.shouldDocument(tsym)) { - // Class is nameable from top-level and - // the class and all enclosing classes - // pass the modifier filter. - if (containingPackage().isIncluded()) { - return isIncluded=true; - } - ClassDoc outer = containingClass(); - if (outer != null && outer.isIncluded()) { - return isIncluded=true; - } - } - return false; - } - - /** - * Return the package that this class is contained in. - */ - @Override - public PackageDoc containingPackage() { - PackageDocImpl p = env.getPackageDoc(tsym.packge()); - if (p.setDocPath == false) { - FileObject docPath; - try { - Location location = env.fileManager.hasLocation(StandardLocation.SOURCE_PATH) - ? StandardLocation.SOURCE_PATH : StandardLocation.CLASS_PATH; - - docPath = env.fileManager.getFileForInput( - location, p.qualifiedName(), "package.html"); - } catch (IOException e) { - docPath = null; - } - - if (docPath == null) { - // fall back on older semantics of looking in same directory as - // source file for this class - SourcePosition po = position(); - if (env.fileManager instanceof StandardJavaFileManager && - po instanceof SourcePositionImpl) { - URI uri = ((SourcePositionImpl) po).filename.toUri(); - if ("file".equals(uri.getScheme())) { - File f = new File(uri); - File dir = f.getParentFile(); - if (dir != null) { - File pf = new File(dir, "package.html"); - if (pf.exists()) { - StandardJavaFileManager sfm = (StandardJavaFileManager) env.fileManager; - docPath = sfm.getJavaFileObjects(pf).iterator().next(); - } - } - - } - } - } - - p.setDocPath(docPath); - } - return p; - } - - /** - * Return the class name without package qualifier - but with - * enclosing class qualifier - as a String. - *

    -     * Examples:
    -     *  for java.util.Hashtable
    -     *  return Hashtable
    -     *  for java.util.Map.Entry
    -     *  return Map.Entry
    -     * 
    - */ - public String name() { - if (name == null) { - name = getClassName(tsym, false); - } - return name; - } - - private String name; - - /** - * Return the qualified class name as a String. - *
    -     * Example:
    -     *  for java.util.Hashtable
    -     *  return java.util.Hashtable
    -     *  if no qualifier, just return flat name
    -     * 
    - */ - public String qualifiedName() { - if (qualifiedName == null) { - qualifiedName = getClassName(tsym, true); - } - return qualifiedName; - } - - private String qualifiedName; - - /** - * Return unqualified name of type excluding any dimension information. - *

    - * For example, a two dimensional array of String returns 'String'. - */ - public String typeName() { - return name(); - } - - /** - * Return qualified name of type excluding any dimension information. - *

    - * For example, a two dimensional array of String - * returns 'java.lang.String'. - */ - public String qualifiedTypeName() { - return qualifiedName(); - } - - /** - * Return the simple name of this type. - */ - public String simpleTypeName() { - if (simpleTypeName == null) { - simpleTypeName = tsym.name.toString(); - } - return simpleTypeName; - } - - private String simpleTypeName; - - /** - * Return the qualified name and any type parameters. - * Each parameter is a type variable with optional bounds. - */ - @Override - public String toString() { - return classToString(env, tsym, true); - } - - /** - * Return the class name as a string. If "full" is true the name is - * qualified, otherwise it is qualified by its enclosing class(es) only. - */ - static String getClassName(ClassSymbol c, boolean full) { - if (full) { - return c.getQualifiedName().toString(); - } else { - String n = ""; - for ( ; c != null; c = c.owner.enclClass()) { - n = c.name + (n.isEmpty() ? "" : ".") + n; - } - return n; - } - } - - /** - * Return the class name with any type parameters as a string. - * Each parameter is a type variable with optional bounds. - * If "full" is true all names are qualified, otherwise they are - * qualified by their enclosing class(es) only. - */ - static String classToString(DocEnv env, ClassSymbol c, boolean full) { - StringBuilder s = new StringBuilder(); - if (!c.isInner()) { // if c is not an inner class - s.append(getClassName(c, full)); - } else { - // c is an inner class, so include type params of outer. - ClassSymbol encl = c.owner.enclClass(); - s.append(classToString(env, encl, full)) - .append('.') - .append(c.name); - } - s.append(TypeMaker.typeParametersString(env, c, full)); - return s.toString(); - } - - /** - * Is this class (or any enclosing class) generic? That is, does - * it have type parameters? - */ - static boolean isGeneric(ClassSymbol c) { - return c.type.allparams().nonEmpty(); - } - - /** - * Return the formal type parameters of this class or interface. - * Return an empty array if there are none. - */ - public TypeVariable[] typeParameters() { - if (env.legacyDoclet) { - return new TypeVariable[0]; - } - TypeVariable res[] = new TypeVariable[type.getTypeArguments().length()]; - TypeMaker.getTypes(env, type.getTypeArguments(), res); - return res; - } - - /** - * Return the type parameter tags of this class or interface. - */ - public ParamTag[] typeParamTags() { - return (env.legacyDoclet) - ? new ParamTag[0] - : comment().typeParamTags(); - } - - /** - * Return the modifier string for this class. If it's an interface - * exclude 'abstract' keyword from the modifier string - */ - @Override - public String modifiers() { - return Modifier.toString(modifierSpecifier()); - } - - @Override - public int modifierSpecifier() { - int modifiers = getModifiers(); - return (isInterface() || isAnnotationType()) - ? modifiers & ~Modifier.ABSTRACT - : modifiers; - } - - /** - * Return the superclass of this class - * - * @return the ClassDocImpl for the superclass of this class, null - * if there is no superclass. - */ - public ClassDoc superclass() { - if (isInterface() || isAnnotationType()) return null; - if (tsym == env.syms.objectType.tsym) return null; - ClassSymbol c = (ClassSymbol)env.types.supertype(type).tsym; - if (c == null || c == tsym) c = (ClassSymbol)env.syms.objectType.tsym; - return env.getClassDoc(c); - } - - /** - * Return the superclass of this class. Return null if this is an - * interface. A superclass is represented by either a - * ClassDoc or a ParameterizedType. - */ - public com.sun.javadoc.Type superclassType() { - if (isInterface() || isAnnotationType() || - (tsym == env.syms.objectType.tsym)) - return null; - Type sup = env.types.supertype(type); - return TypeMaker.getType(env, - (sup.hasTag(TypeTag.NONE)) ? env.syms.objectType : sup); - } - - /** - * Test whether this class is a subclass of the specified class. - * - * @param cd the candidate superclass. - * @return true if cd is a superclass of this class. - */ - public boolean subclassOf(ClassDoc cd) { - return tsym.isSubClass(((ClassDocImpl)cd).tsym, env.types); - } - - /** - * Return interfaces implemented by this class or interfaces - * extended by this interface. - * - * @return An array of ClassDocImpl representing the interfaces. - * Return an empty array if there are no interfaces. - */ - public ClassDoc[] interfaces() { - ListBuffer ta = new ListBuffer<>(); - for (Type t : env.types.interfaces(type)) { - ta.append(env.getClassDoc((ClassSymbol)t.tsym)); - } - //### Cache ta here? - return ta.toArray(new ClassDocImpl[ta.length()]); - } - - /** - * Return interfaces implemented by this class or interfaces extended - * by this interface. Includes only directly-declared interfaces, not - * inherited interfaces. - * Return an empty array if there are no interfaces. - */ - public com.sun.javadoc.Type[] interfaceTypes() { - //### Cache result here? - return TypeMaker.getTypes(env, env.types.interfaces(type)); - } - - /** - * Return fields in class. - * @param filter include only the included fields if filter==true - */ - public FieldDoc[] fields(boolean filter) { - return fields(filter, false); - } - - /** - * Return included fields in class. - */ - public FieldDoc[] fields() { - return fields(true, false); - } - - /** - * Return the enum constants if this is an enum type. - */ - public FieldDoc[] enumConstants() { - return fields(false, true); - } - - /** - * Return fields in class. - * @param filter if true, return only the included fields - * @param enumConstants if true, return the enum constants instead - */ - private FieldDoc[] fields(boolean filter, boolean enumConstants) { - List fields = List.nil(); - for (Symbol sym : tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null && sym.kind == VAR) { - VarSymbol s = (VarSymbol)sym; - boolean isEnum = ((s.flags() & Flags.ENUM) != 0) && - !env.legacyDoclet; - if (isEnum == enumConstants && - (!filter || env.shouldDocument(s))) { - fields = fields.prepend(env.getFieldDoc(s)); - } - } - } - return fields.toArray(new FieldDocImpl[fields.length()]); - } - - /** - * Return methods in class. - * This method is overridden by AnnotationTypeDocImpl. - * - * @param filter include only the included methods if filter==true - * @return an array of MethodDocImpl for representing the visible - * methods in this class. Does not include constructors. - */ - public MethodDoc[] methods(boolean filter) { - Names names = tsym.name.table.names; - List methods = List.nil(); - for (Symbol sym :tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null - && sym.kind == MTH - && sym.name != names.init - && sym.name != names.clinit) { - MethodSymbol s = (MethodSymbol)sym; - if (!filter || env.shouldDocument(s)) { - methods = methods.prepend(env.getMethodDoc(s)); - } - } - } - //### Cache methods here? - return methods.toArray(new MethodDocImpl[methods.length()]); - } - - /** - * Return included methods in class. - * - * @return an array of MethodDocImpl for representing the visible - * methods in this class. Does not include constructors. - */ - public MethodDoc[] methods() { - return methods(true); - } - - /** - * Return constructors in class. - * - * @param filter include only the included constructors if filter==true - * @return an array of ConstructorDocImpl for representing the visible - * constructors in this class. - */ - public ConstructorDoc[] constructors(boolean filter) { - Names names = tsym.name.table.names; - List constructors = List.nil(); - for (Symbol sym : tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null && - sym.kind == MTH && sym.name == names.init) { - MethodSymbol s = (MethodSymbol)sym; - if (!filter || env.shouldDocument(s)) { - constructors = constructors.prepend(env.getConstructorDoc(s)); - } - } - } - //### Cache constructors here? - return constructors.toArray(new ConstructorDocImpl[constructors.length()]); - } - - /** - * Return included constructors in class. - * - * @return an array of ConstructorDocImpl for representing the visible - * constructors in this class. - */ - public ConstructorDoc[] constructors() { - return constructors(true); - } - - /** - * Adds all inner classes of this class, and their - * inner classes recursively, to the list l. - */ - void addAllClasses(ListBuffer l, boolean filtered) { - try { - if (isSynthetic()) return; - // sometimes synthetic classes are not marked synthetic - if (!JavadocTool.isValidClassName(tsym.name.toString())) return; - if (filtered && !env.shouldDocument(tsym)) return; - if (l.contains(this)) return; - l.append(this); - List more = List.nil(); - for (Symbol sym : tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null && sym.kind == TYP) { - ClassSymbol s = (ClassSymbol)sym; - ClassDocImpl c = env.getClassDoc(s); - if (c.isSynthetic()) continue; - if (c != null) more = more.prepend(c); - } - } - // this extra step preserves the ordering from oldjavadoc - for (; more.nonEmpty(); more=more.tail) { - more.head.addAllClasses(l, filtered); - } - } catch (CompletionFailure e) { - // quietly ignore completion failures - } - } - - /** - * Return inner classes within this class. - * - * @param filter include only the included inner classes if filter==true. - * @return an array of ClassDocImpl for representing the visible - * classes defined in this class. Anonymous and local classes - * are not included. - */ - public ClassDoc[] innerClasses(boolean filter) { - ListBuffer innerClasses = new ListBuffer<>(); - for (Symbol sym : tsym.members().getSymbols(NON_RECURSIVE)) { - if (sym != null && sym.kind == TYP) { - ClassSymbol s = (ClassSymbol)sym; - if ((s.flags_field & Flags.SYNTHETIC) != 0) continue; - if (!filter || env.isVisible(s)) { - innerClasses.prepend(env.getClassDoc(s)); - } - } - } - //### Cache classes here? - return innerClasses.toArray(new ClassDocImpl[innerClasses.length()]); - } - - /** - * Return included inner classes within this class. - * - * @return an array of ClassDocImpl for representing the visible - * classes defined in this class. Anonymous and local classes - * are not included. - */ - public ClassDoc[] innerClasses() { - return innerClasses(true); - } - - /** - * Find a class within the context of this class. - * Search order: qualified name, in this class (inner), - * in this package, in the class imports, in the package - * imports. - * Return the ClassDocImpl if found, null if not found. - */ - //### The specified search order is not the normal rule the - //### compiler would use. Leave as specified or change it? - public ClassDoc findClass(String className) { - ClassDoc searchResult = searchClass(className); - if (searchResult == null) { - ClassDocImpl enclosingClass = (ClassDocImpl)containingClass(); - //Expand search space to include enclosing class. - while (enclosingClass != null && enclosingClass.containingClass() != null) { - enclosingClass = (ClassDocImpl)enclosingClass.containingClass(); - } - searchResult = enclosingClass == null ? - null : enclosingClass.searchClass(className); - } - return searchResult; - } - - private ClassDoc searchClass(String className) { - Names names = tsym.name.table.names; - - // search by qualified name first - ClassDoc cd = env.lookupClass(className); - if (cd != null) { - return cd; - } - - // search inner classes - //### Add private entry point to avoid creating array? - //### Replicate code in innerClasses here to avoid consing? - for (ClassDoc icd : innerClasses()) { - if (icd.name().equals(className) || - //### This is from original javadoc but it looks suspicious to me... - //### I believe it is attempting to compensate for the confused - //### convention of including the nested class qualifiers in the - //### 'name' of the inner class, rather than the true simple name. - icd.name().endsWith("." + className)) { - return icd; - } else { - ClassDoc innercd = ((ClassDocImpl) icd).searchClass(className); - if (innercd != null) { - return innercd; - } - } - } - - // check in this package - cd = containingPackage().findClass(className); - if (cd != null) { - return cd; - } - - // make sure that this symbol has been completed - tsym.complete(); - - // search imports - - if (tsym.sourcefile != null) { - - //### This information is available only for source classes. - - Env compenv = env.enter.getEnv(tsym); - if (compenv == null) return null; - - Scope s = compenv.toplevel.namedImportScope; - for (Symbol sym : s.getSymbolsByName(names.fromString(className))) { - if (sym.kind == TYP) { - ClassDoc c = env.getClassDoc((ClassSymbol)sym); - return c; - } - } - - s = compenv.toplevel.starImportScope; - for (Symbol sym : s.getSymbolsByName(names.fromString(className))) { - if (sym.kind == TYP) { - ClassDoc c = env.getClassDoc((ClassSymbol)sym); - return c; - } - } - } - - return null; // not found - } - - - private boolean hasParameterTypes(MethodSymbol method, String[] argTypes) { - - if (argTypes == null) { - // wildcard - return true; - } - - int i = 0; - List types = method.type.getParameterTypes(); - - if (argTypes.length != types.length()) { - return false; - } - - for (Type t : types) { - String argType = argTypes[i++]; - // For vararg method, "T..." matches type T[]. - if (i == argTypes.length) { - argType = argType.replace("...", "[]"); - } - if (!hasTypeName(env.types.erasure(t), argType)) { //###(gj) - return false; - } - } - return true; - } - // where - private boolean hasTypeName(Type t, String name) { - return - name.equals(TypeMaker.getTypeName(t, true)) - || - name.equals(TypeMaker.getTypeName(t, false)) - || - (qualifiedName() + "." + name).equals(TypeMaker.getTypeName(t, true)); - } - - - - /** - * Find a method in this class scope. - * Search order: this class, interfaces, superclasses, outerclasses. - * Note that this is not necessarily what the compiler would do! - * - * @param methodName the unqualified name to search for. - * @param paramTypes the array of Strings for method parameter types. - * @return the first MethodDocImpl which matches, null if not found. - */ - public MethodDocImpl findMethod(String methodName, String[] paramTypes) { - // Use hash table 'searched' to avoid searching same class twice. - //### It is not clear how this could happen. - return searchMethod(methodName, paramTypes, new HashSet()); - } - - private MethodDocImpl searchMethod(String methodName, - String[] paramTypes, Set searched) { - //### Note that this search is not necessarily what the compiler would do! - - Names names = tsym.name.table.names; - // do not match constructors - if (names.init.contentEquals(methodName)) { - return null; - } - - ClassDocImpl cdi; - MethodDocImpl mdi; - - if (searched.contains(this)) { - return null; - } - searched.add(this); - - //DEBUG - /*---------------------------------* - System.out.print("searching " + this + " for " + methodName); - if (paramTypes == null) { - System.out.println("()"); - } else { - System.out.print("("); - for (int k=0; k < paramTypes.length; k++) { - System.out.print(paramTypes[k]); - if ((k + 1) < paramTypes.length) { - System.out.print(", "); - } - } - System.out.println(")"); - } - *---------------------------------*/ - - // search current class - - //### Using modifier filter here isn't really correct, - //### but emulates the old behavior. Instead, we should - //### apply the normal rules of visibility and inheritance. - - if (paramTypes == null) { - // If no parameters specified, we are allowed to return - // any method with a matching name. In practice, the old - // code returned the first method, which is now the last! - // In order to provide textually identical results, we - // attempt to emulate the old behavior. - MethodSymbol lastFound = null; - for (Symbol sym : tsym.members().getSymbolsByName(names.fromString(methodName))) { - if (sym.kind == MTH) { - //### Should intern methodName as Name. - if (sym.name.toString().equals(methodName)) { - lastFound = (MethodSymbol)sym; - } - } - } - if (lastFound != null) { - return env.getMethodDoc(lastFound); - } - } else { - for (Symbol sym : tsym.members().getSymbolsByName(names.fromString(methodName))) { - if (sym != null && - sym.kind == MTH) { - //### Should intern methodName as Name. - if (hasParameterTypes((MethodSymbol)sym, paramTypes)) { - return env.getMethodDoc((MethodSymbol)sym); - } - } - } - } - - //### If we found a MethodDoc above, but which did not pass - //### the modifier filter, we should return failure here! - - // search superclass - cdi = (ClassDocImpl)superclass(); - if (cdi != null) { - mdi = cdi.searchMethod(methodName, paramTypes, searched); - if (mdi != null) { - return mdi; - } - } - - // search interfaces - for (ClassDoc intf : interfaces()) { - cdi = (ClassDocImpl) intf; - mdi = cdi.searchMethod(methodName, paramTypes, searched); - if (mdi != null) { - return mdi; - } - } - - // search enclosing class - cdi = (ClassDocImpl)containingClass(); - if (cdi != null) { - mdi = cdi.searchMethod(methodName, paramTypes, searched); - if (mdi != null) { - return mdi; - } - } - - //###(gj) As a temporary measure until type variables are better - //### handled, try again without the parameter types. - //### This should most often find the right method, and occassionally - //### find the wrong one. - //if (paramTypes != null) { - // return findMethod(methodName, null); - //} - - return null; - } - - /** - * Find constructor in this class. - * - * @param constrName the unqualified name to search for. - * @param paramTypes the array of Strings for constructor parameters. - * @return the first ConstructorDocImpl which matches, null if not found. - */ - public ConstructorDoc findConstructor(String constrName, - String[] paramTypes) { - Names names = tsym.name.table.names; - for (Symbol sym : tsym.members().getSymbolsByName(names.fromString(""))) { - if (sym.kind == MTH) { - if (hasParameterTypes((MethodSymbol)sym, paramTypes)) { - return env.getConstructorDoc((MethodSymbol)sym); - } - } - } - - //###(gj) As a temporary measure until type variables are better - //### handled, try again without the parameter types. - //### This will often find the right constructor, and occassionally - //### find the wrong one. - //if (paramTypes != null) { - // return findConstructor(constrName, null); - //} - - return null; - } - - /** - * Find a field in this class scope. - * Search order: this class, outerclasses, interfaces, - * superclasses. IMP: If see tag is defined in an inner class, - * which extends a super class and if outerclass and the super - * class have a visible field in common then Java compiler cribs - * about the ambiguity, but the following code will search in the - * above given search order. - * - * @param fieldName the unqualified name to search for. - * @return the first FieldDocImpl which matches, null if not found. - */ - public FieldDoc findField(String fieldName) { - return searchField(fieldName, new HashSet()); - } - - private FieldDocImpl searchField(String fieldName, Set searched) { - Names names = tsym.name.table.names; - if (searched.contains(this)) { - return null; - } - searched.add(this); - - for (Symbol sym : tsym.members().getSymbolsByName(names.fromString(fieldName))) { - if (sym.kind == VAR) { - //### Should intern fieldName as Name. - return env.getFieldDoc((VarSymbol)sym); - } - } - - //### If we found a FieldDoc above, but which did not pass - //### the modifier filter, we should return failure here! - - ClassDocImpl cdi = (ClassDocImpl)containingClass(); - if (cdi != null) { - FieldDocImpl fdi = cdi.searchField(fieldName, searched); - if (fdi != null) { - return fdi; - } - } - - // search superclass - cdi = (ClassDocImpl)superclass(); - if (cdi != null) { - FieldDocImpl fdi = cdi.searchField(fieldName, searched); - if (fdi != null) { - return fdi; - } - } - - // search interfaces - for (ClassDoc intf : interfaces()) { - cdi = (ClassDocImpl) intf; - FieldDocImpl fdi = cdi.searchField(fieldName, searched); - if (fdi != null) { - return fdi; - } - } - - return null; - } - - /** - * Get the list of classes declared as imported. - * These are called "single-type-import declarations" in the JLS. - * This method is deprecated in the ClassDoc interface. - * - * @return an array of ClassDocImpl representing the imported classes. - * - * @deprecated Import declarations are implementation details that - * should not be exposed here. In addition, not all imported - * classes are imported through single-type-import declarations. - */ - @Deprecated(since="9", forRemoval=true) - public ClassDoc[] importedClasses() { - // information is not available for binary classfiles - if (tsym.sourcefile == null) return new ClassDoc[0]; - - ListBuffer importedClasses = new ListBuffer<>(); - - Env compenv = env.enter.getEnv(tsym); - if (compenv == null) return new ClassDocImpl[0]; - - Name asterisk = tsym.name.table.names.asterisk; - for (JCTree t : compenv.toplevel.defs) { - if (t.hasTag(IMPORT)) { - JCTree imp = ((JCImport) t).qualid; - if ((TreeInfo.name(imp) != asterisk) && - imp.type.tsym.kind.matches(KindSelector.TYP)) { - importedClasses.append( - env.getClassDoc((ClassSymbol)imp.type.tsym)); - } - } - } - - return importedClasses.toArray(new ClassDocImpl[importedClasses.length()]); - } - - /** - * Get the list of packages declared as imported. - * These are called "type-import-on-demand declarations" in the JLS. - * This method is deprecated in the ClassDoc interface. - * - * @return an array of PackageDocImpl representing the imported packages. - * - * ###NOTE: the syntax supports importing all inner classes from a class as well. - * @deprecated Import declarations are implementation details that - * should not be exposed here. In addition, this method's - * return type does not allow for all type-import-on-demand - * declarations to be returned. - */ - @Deprecated(since="9", forRemoval=true) - public PackageDoc[] importedPackages() { - // information is not available for binary classfiles - if (tsym.sourcefile == null) return new PackageDoc[0]; - - ListBuffer importedPackages = new ListBuffer<>(); - - //### Add the implicit "import java.lang.*" to the result - Names names = tsym.name.table.names; - importedPackages.append(env.getPackageDoc(env.syms.enterPackage(env.syms.java_base, names.java_lang))); - - Env compenv = env.enter.getEnv(tsym); - if (compenv == null) return new PackageDocImpl[0]; - - for (JCTree t : compenv.toplevel.defs) { - if (t.hasTag(IMPORT)) { - JCTree imp = ((JCImport) t).qualid; - if (TreeInfo.name(imp) == names.asterisk) { - JCFieldAccess sel = (JCFieldAccess)imp; - Symbol s = sel.selected.type.tsym; - PackageDocImpl pdoc = env.getPackageDoc(s.packge()); - if (!importedPackages.contains(pdoc)) - importedPackages.append(pdoc); - } - } - } - - return importedPackages.toArray(new PackageDocImpl[importedPackages.length()]); - } - - /** - * Return the type's dimension information. - * Always return "", as this is not an array type. - */ - public String dimension() { - return ""; - } - - /** - * Return this type as a class, which it already is. - */ - public ClassDoc asClassDoc() { - return this; - } - - /** - * Return null (unless overridden), as this is not an annotation type. - */ - public AnnotationTypeDoc asAnnotationTypeDoc() { - return null; - } - - /** - * Return null, as this is not a class instantiation. - */ - public ParameterizedType asParameterizedType() { - return null; - } - - /** - * Return null, as this is not a type variable. - */ - public TypeVariable asTypeVariable() { - return null; - } - - /** - * Return null, as this is not a wildcard type. - */ - public WildcardType asWildcardType() { - return null; - } - - /** - * Returns null, as this is not an annotated type. - */ - public AnnotatedType asAnnotatedType() { - return null; - } - - /** - * Return false, as this is not a primitive type. - */ - public boolean isPrimitive() { - return false; - } - - //--- Serialization --- - - //### These methods ignore modifier filter. - - /** - * Return true if this class implements java.io.Serializable. - * - * Since java.io.Externalizable extends - * java.io.Serializable, - * Externalizable objects are also Serializable. - */ - public boolean isSerializable() { - try { - return env.types.isSubtype(type, env.syms.serializableType); - } catch (CompletionFailure ex) { - // quietly ignore completion failures - return false; - } - } - - /** - * Return true if this class implements - * java.io.Externalizable. - */ - public boolean isExternalizable() { - try { - return env.types.isSubtype(type, env.externalizableSym.type); - } catch (CompletionFailure ex) { - // quietly ignore completion failures - return false; - } - } - - /** - * Return the serialization methods for this class. - * - * @return an array of MethodDocImpl that represents - * the serialization methods for this class. - */ - public MethodDoc[] serializationMethods() { - if (serializedForm == null) { - serializedForm = new SerializedForm(env, tsym, this); - } - //### Clone this? - return serializedForm.methods(); - } - - /** - * Return the Serializable fields of class.

    - * - * Return either a list of default fields documented by - * serial tag
    - * or return a single FieldDoc for - * serialPersistentField member. - * There should be a serialField tag for - * each Serializable field defined by an ObjectStreamField - * array component of serialPersistentField. - * - * @return an array of {@code FieldDoc} for the Serializable fields - * of this class. - * - * @see #definesSerializableFields() - * @see SerialFieldTagImpl - */ - public FieldDoc[] serializableFields() { - if (serializedForm == null) { - serializedForm = new SerializedForm(env, tsym, this); - } - //### Clone this? - return serializedForm.fields(); - } - - /** - * Return true if Serializable fields are explicitly defined with - * the special class member serialPersistentFields. - * - * @see #serializableFields() - * @see SerialFieldTagImpl - */ - public boolean definesSerializableFields() { - if (!isSerializable() || isExternalizable()) { - return false; - } else { - if (serializedForm == null) { - serializedForm = new SerializedForm(env, tsym, this); - } - //### Clone this? - return serializedForm.definesSerializableFields(); - } - } - - /** - * Determine if a class is a RuntimeException. - *

    - * Used only by ThrowsTagImpl. - */ - boolean isRuntimeException() { - return tsym.isSubClass(env.syms.runtimeExceptionType.tsym, env.types); - } - - /** - * Return the source position of the entity, or null if - * no position is available. - */ - @Override - public SourcePosition position() { - if (tsym.sourcefile == null) return null; - return SourcePositionImpl.make(tsym.sourcefile, - (tree==null) ? Position.NOPOS : tree.pos, - lineMap); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Comment.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/Comment.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,462 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import com.sun.javadoc.*; -import com.sun.tools.javac.util.ListBuffer; - -/** - * Comment contains all information in comment part. - * It allows users to get first sentence of this comment, get - * comment for different tags... - * - *

    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. - * - * @author Kaiyang Liu (original) - * @author Robert Field (rewrite) - * @author Atul M Dambalkar - * @author Neal Gafter (rewrite) - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -class Comment { - - /** - * sorted comments with different tags. - */ - private final ListBuffer tagList = new ListBuffer<>(); - - /** - * text minus any tags. - */ - private String text; - - /** - * Doc environment - */ - private final DocEnv docenv; - - /** - * constructor of Comment. - */ - Comment(final DocImpl holder, final String commentString) { - this.docenv = holder.env; - - /** - * Separate the comment into the text part and zero to N tags. - * Simple state machine is in one of three states: - *

    -         * IN_TEXT: parsing the comment text or tag text.
    -         * TAG_NAME: parsing the name of a tag.
    -         * TAG_GAP: skipping through the gap between the tag name and
    -         * the tag text.
    -         * 
    - */ - @SuppressWarnings("fallthrough") - class CommentStringParser { - /** - * The entry point to the comment string parser - */ - void parseCommentStateMachine() { - final int IN_TEXT = 1; - final int TAG_GAP = 2; - final int TAG_NAME = 3; - int state = TAG_GAP; - boolean newLine = true; - String tagName = null; - int tagStart = 0; - int textStart = 0; - int lastNonWhite = -1; - int len = commentString.length(); - for (int inx = 0; inx < len; ++inx) { - char ch = commentString.charAt(inx); - boolean isWhite = Character.isWhitespace(ch); - switch (state) { - case TAG_NAME: - if (isWhite) { - tagName = commentString.substring(tagStart, inx); - state = TAG_GAP; - } - break; - case TAG_GAP: - if (isWhite) { - break; - } - textStart = inx; - state = IN_TEXT; - /* fall thru */ - case IN_TEXT: - if (newLine && ch == '@') { - parseCommentComponent(tagName, textStart, - lastNonWhite+1); - tagStart = inx; - state = TAG_NAME; - } - break; - } - if (ch == '\n') { - newLine = true; - } else if (!isWhite) { - lastNonWhite = inx; - newLine = false; - } - } - // Finish what's currently being processed - switch (state) { - case TAG_NAME: - tagName = commentString.substring(tagStart, len); - /* fall thru */ - case TAG_GAP: - textStart = len; - /* fall thru */ - case IN_TEXT: - parseCommentComponent(tagName, textStart, lastNonWhite+1); - break; - } - } - - /** - * Save away the last parsed item. - */ - void parseCommentComponent(String tagName, - int from, int upto) { - String tx = upto <= from ? "" : commentString.substring(from, upto); - if (tagName == null) { - text = tx; - } else { - TagImpl tag; - switch (tagName) { - case "@exception": - case "@throws": - warnIfEmpty(tagName, tx); - tag = new ThrowsTagImpl(holder, tagName, tx); - break; - case "@param": - warnIfEmpty(tagName, tx); - tag = new ParamTagImpl(holder, tagName, tx); - break; - case "@see": - warnIfEmpty(tagName, tx); - tag = new SeeTagImpl(holder, tagName, tx); - break; - case "@serialField": - warnIfEmpty(tagName, tx); - tag = new SerialFieldTagImpl(holder, tagName, tx); - break; - case "@return": - warnIfEmpty(tagName, tx); - tag = new TagImpl(holder, tagName, tx); - break; - case "@author": - warnIfEmpty(tagName, tx); - tag = new TagImpl(holder, tagName, tx); - break; - case "@version": - warnIfEmpty(tagName, tx); - tag = new TagImpl(holder, tagName, tx); - break; - default: - tag = new TagImpl(holder, tagName, tx); - break; - } - tagList.append(tag); - } - } - - void warnIfEmpty(String tagName, String tx) { - if (tx.length() == 0) { - docenv.warning(holder, "tag.tag_has_no_arguments", tagName); - } - } - - } - - new CommentStringParser().parseCommentStateMachine(); - } - - /** - * Return the text of the comment. - */ - String commentText() { - return text; - } - - /** - * Return all tags in this comment. - */ - Tag[] tags() { - return tagList.toArray(new Tag[tagList.length()]); - } - - /** - * Return tags of the specified kind in this comment. - */ - Tag[] tags(String tagname) { - ListBuffer found = new ListBuffer<>(); - String target = tagname; - if (target.charAt(0) != '@') { - target = "@" + target; - } - for (Tag tag : tagList) { - if (tag.kind().equals(target)) { - found.append(tag); - } - } - return found.toArray(new Tag[found.length()]); - } - - /** - * Return throws tags in this comment. - */ - ThrowsTag[] throwsTags() { - ListBuffer found = new ListBuffer<>(); - for (Tag next : tagList) { - if (next instanceof ThrowsTag) { - found.append((ThrowsTag)next); - } - } - return found.toArray(new ThrowsTag[found.length()]); - } - - /** - * Return param tags (excluding type param tags) in this comment. - */ - ParamTag[] paramTags() { - return paramTags(false); - } - - /** - * Return type param tags in this comment. - */ - ParamTag[] typeParamTags() { - return paramTags(true); - } - - /** - * Return param tags in this comment. If typeParams is true - * include only type param tags, otherwise include only ordinary - * param tags. - */ - private ParamTag[] paramTags(boolean typeParams) { - ListBuffer found = new ListBuffer<>(); - for (Tag next : tagList) { - if (next instanceof ParamTag) { - ParamTag p = (ParamTag)next; - if (typeParams == p.isTypeParameter()) { - found.append(p); - } - } - } - return found.toArray(new ParamTag[found.length()]); - } - - /** - * Return see also tags in this comment. - */ - SeeTag[] seeTags() { - ListBuffer found = new ListBuffer<>(); - for (Tag next : tagList) { - if (next instanceof SeeTag) { - found.append((SeeTag)next); - } - } - return found.toArray(new SeeTag[found.length()]); - } - - /** - * Return serialField tags in this comment. - */ - SerialFieldTag[] serialFieldTags() { - ListBuffer found = new ListBuffer<>(); - for (Tag next : tagList) { - if (next instanceof SerialFieldTag) { - found.append((SerialFieldTag)next); - } - } - return found.toArray(new SerialFieldTag[found.length()]); - } - - /** - * Return array of tags with text and inline See Tags for a Doc comment. - */ - static Tag[] getInlineTags(DocImpl holder, String inlinetext) { - ListBuffer taglist = new ListBuffer<>(); - int delimend = 0, textstart = 0, len = inlinetext.length(); - boolean inPre = false; - DocEnv docenv = holder.env; - - if (len == 0) { - return taglist.toArray(new Tag[taglist.length()]); - } - while (true) { - int linkstart; - if ((linkstart = inlineTagFound(holder, inlinetext, - textstart)) == -1) { - taglist.append(new TagImpl(holder, "Text", - inlinetext.substring(textstart))); - break; - } else { - inPre = scanForPre(inlinetext, textstart, linkstart, inPre); - int seetextstart = linkstart; - for (int i = linkstart; i < inlinetext.length(); i++) { - char c = inlinetext.charAt(i); - if (Character.isWhitespace(c) || - c == '}') { - seetextstart = i; - break; - } - } - String linkName = inlinetext.substring(linkstart+2, seetextstart); - if (!(inPre && (linkName.equals("code") || linkName.equals("literal")))) { - //Move past the white space after the inline tag name. - while (Character.isWhitespace(inlinetext. - charAt(seetextstart))) { - if (inlinetext.length() <= seetextstart) { - taglist.append(new TagImpl(holder, "Text", - inlinetext.substring(textstart, seetextstart))); - docenv.warning(holder, - "tag.Improper_Use_Of_Link_Tag", - inlinetext); - return taglist.toArray(new Tag[taglist.length()]); - } else { - seetextstart++; - } - } - } - taglist.append(new TagImpl(holder, "Text", - inlinetext.substring(textstart, linkstart))); - textstart = seetextstart; // this text is actually seetag - if ((delimend = findInlineTagDelim(inlinetext, textstart)) == -1) { - //Missing closing '}' character. - // store the text as it is with the {@link. - taglist.append(new TagImpl(holder, "Text", - inlinetext.substring(textstart))); - docenv.warning(holder, - "tag.End_delimiter_missing_for_possible_SeeTag", - inlinetext); - return taglist.toArray(new Tag[taglist.length()]); - } else { - //Found closing '}' character. - if (linkName.equals("see") - || linkName.equals("link") - || linkName.equals("linkplain")) { - taglist.append( new SeeTagImpl(holder, "@" + linkName, - inlinetext.substring(textstart, delimend))); - } else { - taglist.append( new TagImpl(holder, "@" + linkName, - inlinetext.substring(textstart, delimend))); - } - textstart = delimend + 1; - } - } - if (textstart == inlinetext.length()) { - break; - } - } - return taglist.toArray(new Tag[taglist.length()]); - } - - /** regex for case-insensitive match for {@literal
     } and  {@literal 
    }. */ - private static final Pattern prePat = Pattern.compile("(?i)<(/?)pre>"); - - private static boolean scanForPre(String inlinetext, int start, int end, boolean inPre) { - Matcher m = prePat.matcher(inlinetext).region(start, end); - while (m.find()) { - inPre = m.group(1).isEmpty(); - } - return inPre; - } - - /** - * Recursively find the index of the closing '}' character for an inline tag - * and return it. If it can't be found, return -1. - * @param inlineText the text to search in. - * @param searchStart the index of the place to start searching at. - * @return the index of the closing '}' character for an inline tag. - * If it can't be found, return -1. - */ - private static int findInlineTagDelim(String inlineText, int searchStart) { - int delimEnd, nestedOpenBrace; - if ((delimEnd = inlineText.indexOf("}", searchStart)) == -1) { - return -1; - } else if (((nestedOpenBrace = inlineText.indexOf("{", searchStart)) != -1) && - nestedOpenBrace < delimEnd){ - //Found a nested open brace. - int nestedCloseBrace = findInlineTagDelim(inlineText, nestedOpenBrace + 1); - return (nestedCloseBrace != -1) ? - findInlineTagDelim(inlineText, nestedCloseBrace + 1) : - -1; - } else { - return delimEnd; - } - } - - /** - * Recursively search for the characters '{', '@', followed by - * name of inline tag and white space, - * if found - * return the index of the text following the white space. - * else - * return -1. - */ - private static int inlineTagFound(DocImpl holder, String inlinetext, int start) { - DocEnv docenv = holder.env; - int linkstart = inlinetext.indexOf("{@", start); - if (start == inlinetext.length() || linkstart == -1) { - return -1; - } else if (inlinetext.indexOf('}', linkstart) == -1) { - //Missing '}'. - docenv.warning(holder, "tag.Improper_Use_Of_Link_Tag", - inlinetext.substring(linkstart, inlinetext.length())); - return -1; - } else { - return linkstart; - } - } - - - /** - * Return array of tags for the locale specific first sentence in the text. - */ - static Tag[] firstSentenceTags(DocImpl holder, String text) { - DocLocale doclocale = holder.env.doclocale; - return getInlineTags(holder, - doclocale.localeSpecificFirstSentence(holder, text)); - } - - /** - * Return text for this Doc comment. - */ - @Override - public String toString() { - return text; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ConstructorDocImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/ConstructorDocImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import com.sun.javadoc.*; - -import com.sun.source.util.TreePath; -import com.sun.tools.javac.code.Symbol.ClassSymbol; -import com.sun.tools.javac.code.Symbol.MethodSymbol; - -/** - * Represents a constructor of a java class. - * - *

    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. - * - * @since 1.2 - * @author Robert Field - * @author Neal Gafter (rewrite) - */ - -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class ConstructorDocImpl - extends ExecutableMemberDocImpl implements ConstructorDoc { - - /** - * constructor. - */ - public ConstructorDocImpl(DocEnv env, MethodSymbol sym) { - super(env, sym); - } - - /** - * constructor. - */ - public ConstructorDocImpl(DocEnv env, MethodSymbol sym, TreePath treePath) { - super(env, sym, treePath); - } - - /** - * Return true if it is a constructor, which it is. - * - * @return true - */ - public boolean isConstructor() { - return true; - } - - /** - * Get the name. - * - * @return the name of the member. - */ - public String name() { - ClassSymbol c = sym.enclClass(); - return c.name.toString(); - } - - /** - * Get the name. - * - * @return the qualified name of the member. - */ - public String qualifiedName() { - return sym.enclClass().getQualifiedName().toString(); - } - - /** - * Returns a string representation of this constructor. Includes the - * qualified signature and any type parameters. - * Type parameters precede the class name, as they do in the syntax - * for invoking constructors with explicit type parameters using "new". - * (This is unlike the syntax for invoking methods with explicit type - * parameters.) - */ - public String toString() { - return typeParametersString() + qualifiedName() + signature(); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocEnv.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocEnv.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,881 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import java.lang.reflect.Modifier; -import java.util.*; - -import javax.tools.JavaFileManager; - -import com.sun.javadoc.*; -import com.sun.source.tree.CompilationUnitTree; -import com.sun.source.util.JavacTask; -import com.sun.source.util.TreePath; -import com.sun.tools.doclint.DocLint; -import com.sun.tools.javac.api.BasicJavacTask; -import com.sun.tools.javac.code.*; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.Symbol.ClassSymbol; -import com.sun.tools.javac.code.Symbol.CompletionFailure; -import com.sun.tools.javac.code.Symbol.MethodSymbol; -import com.sun.tools.javac.code.Symbol.PackageSymbol; -import com.sun.tools.javac.code.Symbol.VarSymbol; -import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.comp.Check; -import com.sun.tools.javac.comp.Enter; -import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCClassDecl; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; -import com.sun.tools.javac.tree.JCTree.JCPackageDecl; -import com.sun.tools.javac.util.Context; -import com.sun.tools.javac.util.Convert; -import com.sun.tools.javac.util.Name; -import com.sun.tools.javac.util.Names; - -/** - * Holds the environment for a run of javadoc. - * Holds only the information needed throughout the - * run and not the compiler info that could be GC'ed - * or ported. - * - *

    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. - * - * @since 1.4 - * @author Robert Field - * @author Neal Gafter (rewrite) - * @author Scott Seligman (generics) - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public class DocEnv { - protected static final Context.Key docEnvKey = new Context.Key<>(); - - public static DocEnv instance(Context context) { - DocEnv instance = context.get(docEnvKey); - if (instance == null) - instance = new DocEnv(context); - return instance; - } - - DocLocale doclocale; - - private final Messager messager; - - /** Predefined symbols known to the compiler. */ - final Symtab syms; - - /** Referenced directly in RootDocImpl. */ - private final ClassFinder finder; - - /** Javadoc's own version of the compiler's enter phase. */ - final Enter enter; - - /** The name table. */ - private final Names names; - - /** The encoding name. */ - private String encoding; - - final Symbol externalizableSym; - - /** Access filter (public, protected, ...). */ - protected ModifierFilter showAccess; - - /** True if we are using a sentence BreakIterator. */ - boolean breakiterator; - - /** - * True if we do not want to print any notifications at all. - */ - boolean quiet = false; - - Check chk; - Types types; - JavaFileManager fileManager; - Context context; - DocLint doclint; - JavaScriptScanner javaScriptScanner; - - WeakHashMap treePaths = new WeakHashMap<>(); - - /** Allow documenting from class files? */ - boolean docClasses = false; - - /** Does the doclet only expect pre-1.5 doclet API? */ - protected boolean legacyDoclet = true; - - /** - * Set this to true if you would like to not emit any errors, warnings and - * notices. - */ - private boolean silent = false; - - /** - * The source language version. - */ - protected Source source; - - /** - * Constructor - * - * @param context Context for this javadoc instance. - */ - protected DocEnv(Context context) { - context.put(docEnvKey, this); - this.context = context; - - messager = Messager.instance0(context); - syms = Symtab.instance(context); - finder = JavadocClassFinder.instance(context); - enter = JavadocEnter.instance(context); - names = Names.instance(context); - externalizableSym = syms.enterClass(syms.java_base, names.fromString("java.io.Externalizable")); - chk = Check.instance(context); - types = Types.instance(context); - fileManager = context.get(JavaFileManager.class); - if (fileManager instanceof JavacFileManager) { - ((JavacFileManager)fileManager).setSymbolFileEnabled(false); - } - - // Default. Should normally be reset with setLocale. - this.doclocale = new DocLocale(this, "", breakiterator); - source = Source.instance(context); - } - - public void setSilent(boolean silent) { - this.silent = silent; - } - - /** - * Look up ClassDoc by qualified name. - */ - public ClassDocImpl lookupClass(String name) { - ClassSymbol c = getClassSymbol(name); - if (c != null) { - return getClassDoc(c); - } else { - return null; - } - } - - /** - * Load ClassDoc by qualified name. - */ - public ClassDocImpl loadClass(String name) { - try { - Name nameImpl = names.fromString(name); - ModuleSymbol mod = syms.inferModule(Convert.packagePart(nameImpl)); - ClassSymbol c = finder.loadClass(mod != null ? mod : syms.errModule, nameImpl); - return getClassDoc(c); - } catch (CompletionFailure ex) { - chk.completionError(null, ex); - return null; - } - } - - /** - * Look up PackageDoc by qualified name. - */ - public PackageDocImpl lookupPackage(String name) { - //### Jing alleges that class check is needed - //### to avoid a compiler bug. Most likely - //### instead a dummy created for error recovery. - //### Should investigate this. - Name nameImpl = names.fromString(name); - ModuleSymbol mod = syms.inferModule(nameImpl); - PackageSymbol p = mod != null ? syms.getPackage(mod, nameImpl) : null; - ClassSymbol c = getClassSymbol(name); - if (p != null && c == null) { - return getPackageDoc(p); - } else { - return null; - } - } - // where - /** Retrieve class symbol by fully-qualified name. - */ - ClassSymbol getClassSymbol(String name) { - // Name may contain nested class qualification. - // Generate candidate flatnames with successively shorter - // package qualifiers and longer nested class qualifiers. - int nameLen = name.length(); - char[] nameChars = name.toCharArray(); - int idx = name.length(); - for (;;) { - Name nameImpl = names.fromChars(nameChars, 0, nameLen); - ModuleSymbol mod = syms.inferModule(Convert.packagePart(nameImpl)); - ClassSymbol s = mod != null ? syms.getClass(mod, nameImpl) : null; - if (s != null) - return s; // found it! - idx = name.substring(0, idx).lastIndexOf('.'); - if (idx < 0) break; - nameChars[idx] = '$'; - } - return null; - } - - /** - * Set the locale. - */ - public void setLocale(String localeName) { - // create locale specifics - doclocale = new DocLocale(this, localeName, breakiterator); - // update Messager if locale has changed. - messager.setLocale(doclocale.locale); - } - - /** Check whether this member should be documented. */ - public boolean shouldDocument(VarSymbol sym) { - long mod = sym.flags(); - - if ((mod & Flags.SYNTHETIC) != 0) { - return false; - } - - return showAccess.checkModifier(translateModifiers(mod)); - } - - /** Check whether this member should be documented. */ - public boolean shouldDocument(MethodSymbol sym) { - long mod = sym.flags(); - - if ((mod & Flags.SYNTHETIC) != 0) { - return false; - } - - return showAccess.checkModifier(translateModifiers(mod)); - } - - /** check whether this class should be documented. */ - public boolean shouldDocument(ClassSymbol sym) { - return - (sym.flags_field&Flags.SYNTHETIC) == 0 && // no synthetics - (docClasses || getClassDoc(sym).tree != null) && - isVisible(sym); - } - - //### Comment below is inaccurate wrt modifier filter testing - /** - * Check the visibility if this is an nested class. - * if this is not a nested class, return true. - * if this is an static visible nested class, - * return true. - * if this is an visible nested class - * if the outer class is visible return true. - * else return false. - * IMPORTANT: This also allows, static nested classes - * to be defined inside an nested class, which is not - * allowed by the compiler. So such an test case will - * not reach upto this method itself, but if compiler - * allows it, then that will go through. - */ - protected boolean isVisible(ClassSymbol sym) { - long mod = sym.flags_field; - if (!showAccess.checkModifier(translateModifiers(mod))) { - return false; - } - ClassSymbol encl = sym.owner.enclClass(); - return (encl == null || (mod & Flags.STATIC) != 0 || isVisible(encl)); - } - - //---------------- print forwarders ----------------// - - /** - * Print error message, increment error count. - * - * @param msg message to print. - */ - public void printError(String msg) { - if (silent) - return; - messager.printError(msg); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - */ - public void error(DocImpl doc, String key) { - if (silent) - return; - messager.error(doc==null ? null : doc.position(), key); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - */ - public void error(SourcePosition pos, String key) { - if (silent) - return; - messager.error(pos, key); - } - - /** - * Print error message, increment error count. - * - * @param msg message to print. - */ - public void printError(SourcePosition pos, String msg) { - if (silent) - return; - messager.printError(pos, msg); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument - */ - public void error(DocImpl doc, String key, String a1) { - if (silent) - return; - messager.error(doc==null ? null : doc.position(), key, a1); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - */ - public void error(DocImpl doc, String key, String a1, String a2) { - if (silent) - return; - messager.error(doc==null ? null : doc.position(), key, a1, a2); - } - - /** - * Print error message, increment error count. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - * @param a3 third argument - */ - public void error(DocImpl doc, String key, String a1, String a2, String a3) { - if (silent) - return; - messager.error(doc==null ? null : doc.position(), key, a1, a2, a3); - } - - /** - * Print warning message, increment warning count. - * - * @param msg message to print. - */ - public void printWarning(String msg) { - if (silent) - return; - messager.printWarning(msg); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - */ - public void warning(DocImpl doc, String key) { - if (silent) - return; - messager.warning(doc==null ? null : doc.position(), key); - } - - /** - * Print warning message, increment warning count. - * - * @param msg message to print. - */ - public void printWarning(SourcePosition pos, String msg) { - if (silent) - return; - messager.printWarning(pos, msg); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument - */ - public void warning(DocImpl doc, String key, String a1) { - if (silent) - return; - // suppress messages that have (probably) been covered by doclint - if (doclint != null && doc != null && key.startsWith("tag")) - return; - messager.warning(doc==null ? null : doc.position(), key, a1); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - */ - public void warning(DocImpl doc, String key, String a1, String a2) { - if (silent) - return; - messager.warning(doc==null ? null : doc.position(), key, a1, a2); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - * @param a3 third argument - */ - public void warning(DocImpl doc, String key, String a1, String a2, String a3) { - if (silent) - return; - messager.warning(doc==null ? null : doc.position(), key, a1, a2, a3); - } - - /** - * Print warning message, increment warning count. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - * @param a3 third argument - */ - public void warning(DocImpl doc, String key, String a1, String a2, String a3, - String a4) { - if (silent) - return; - messager.warning(doc==null ? null : doc.position(), key, a1, a2, a3, a4); - } - - /** - * Print a message. - * - * @param msg message to print. - */ - public void printNotice(String msg) { - if (silent || quiet) - return; - messager.printNotice(msg); - } - - - /** - * Print a message. - * - * @param key selects message from resource - */ - public void notice(String key) { - if (silent || quiet) - return; - messager.notice(key); - } - - /** - * Print a message. - * - * @param msg message to print. - */ - public void printNotice(SourcePosition pos, String msg) { - if (silent || quiet) - return; - messager.printNotice(pos, msg); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument - */ - public void notice(String key, String a1) { - if (silent || quiet) - return; - messager.notice(key, a1); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - */ - public void notice(String key, String a1, String a2) { - if (silent || quiet) - return; - messager.notice(key, a1, a2); - } - - /** - * Print a message. - * - * @param key selects message from resource - * @param a1 first argument - * @param a2 second argument - * @param a3 third argument - */ - public void notice(String key, String a1, String a2, String a3) { - if (silent || quiet) - return; - messager.notice(key, a1, a2, a3); - } - - /** - * Exit, reporting errors and warnings. - */ - public void exit() { - // Messager should be replaced by a more general - // compilation environment. This can probably - // subsume DocEnv as well. - messager.exit(); - } - - protected Map packageMap = new HashMap<>(); - /** - * Return the PackageDoc of this package symbol. - */ - public PackageDocImpl getPackageDoc(PackageSymbol pack) { - PackageDocImpl result = packageMap.get(pack); - if (result != null) return result; - result = new PackageDocImpl(this, pack); - packageMap.put(pack, result); - return result; - } - - /** - * Create the PackageDoc (or a subtype) for a package symbol. - */ - void makePackageDoc(PackageSymbol pack, TreePath treePath) { - PackageDocImpl result = packageMap.get(pack); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - } else { - result = new PackageDocImpl(this, pack, treePath); - packageMap.put(pack, result); - } - } - - - protected Map classMap = new HashMap<>(); - /** - * Return the ClassDoc (or a subtype) of this class symbol. - */ - public ClassDocImpl getClassDoc(ClassSymbol clazz) { - ClassDocImpl result = classMap.get(clazz); - if (result != null) return result; - if (isAnnotationType(clazz)) { - result = new AnnotationTypeDocImpl(this, clazz); - } else { - result = new ClassDocImpl(this, clazz); - } - classMap.put(clazz, result); - return result; - } - - /** - * Create the ClassDoc (or a subtype) for a class symbol. - */ - protected void makeClassDoc(ClassSymbol clazz, TreePath treePath) { - ClassDocImpl result = classMap.get(clazz); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - return; - } - if (isAnnotationType((JCClassDecl) treePath.getLeaf())) { // flags of clazz may not yet be set - result = new AnnotationTypeDocImpl(this, clazz, treePath); - } else { - result = new ClassDocImpl(this, clazz, treePath); - } - classMap.put(clazz, result); - } - - protected static boolean isAnnotationType(ClassSymbol clazz) { - return ClassDocImpl.isAnnotationType(clazz); - } - - protected static boolean isAnnotationType(JCClassDecl tree) { - return (tree.mods.flags & Flags.ANNOTATION) != 0; - } - - protected Map fieldMap = new HashMap<>(); - /** - * Return the FieldDoc of this var symbol. - */ - public FieldDocImpl getFieldDoc(VarSymbol var) { - FieldDocImpl result = fieldMap.get(var); - if (result != null) return result; - result = new FieldDocImpl(this, var); - fieldMap.put(var, result); - return result; - } - /** - * Create a FieldDoc for a var symbol. - */ - protected void makeFieldDoc(VarSymbol var, TreePath treePath) { - FieldDocImpl result = fieldMap.get(var); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - } else { - result = new FieldDocImpl(this, var, treePath); - fieldMap.put(var, result); - } - } - - protected Map methodMap = new HashMap<>(); - /** - * Create a MethodDoc for this MethodSymbol. - * Should be called only on symbols representing methods. - */ - protected void makeMethodDoc(MethodSymbol meth, TreePath treePath) { - MethodDocImpl result = (MethodDocImpl)methodMap.get(meth); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - } else { - result = new MethodDocImpl(this, meth, treePath); - methodMap.put(meth, result); - } - } - - /** - * Return the MethodDoc for a MethodSymbol. - * Should be called only on symbols representing methods. - */ - public MethodDocImpl getMethodDoc(MethodSymbol meth) { - assert !meth.isConstructor() : "not expecting a constructor symbol"; - MethodDocImpl result = (MethodDocImpl)methodMap.get(meth); - if (result != null) return result; - result = new MethodDocImpl(this, meth); - methodMap.put(meth, result); - return result; - } - - /** - * Create the ConstructorDoc for a MethodSymbol. - * Should be called only on symbols representing constructors. - */ - protected void makeConstructorDoc(MethodSymbol meth, TreePath treePath) { - ConstructorDocImpl result = (ConstructorDocImpl)methodMap.get(meth); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - } else { - result = new ConstructorDocImpl(this, meth, treePath); - methodMap.put(meth, result); - } - } - - /** - * Return the ConstructorDoc for a MethodSymbol. - * Should be called only on symbols representing constructors. - */ - public ConstructorDocImpl getConstructorDoc(MethodSymbol meth) { - assert meth.isConstructor() : "expecting a constructor symbol"; - ConstructorDocImpl result = (ConstructorDocImpl)methodMap.get(meth); - if (result != null) return result; - result = new ConstructorDocImpl(this, meth); - methodMap.put(meth, result); - return result; - } - - /** - * Create the AnnotationTypeElementDoc for a MethodSymbol. - * Should be called only on symbols representing annotation type elements. - */ - protected void makeAnnotationTypeElementDoc(MethodSymbol meth, TreePath treePath) { - AnnotationTypeElementDocImpl result = - (AnnotationTypeElementDocImpl)methodMap.get(meth); - if (result != null) { - if (treePath != null) result.setTreePath(treePath); - } else { - result = - new AnnotationTypeElementDocImpl(this, meth, treePath); - methodMap.put(meth, result); - } - } - - /** - * Return the AnnotationTypeElementDoc for a MethodSymbol. - * Should be called only on symbols representing annotation type elements. - */ - public AnnotationTypeElementDocImpl getAnnotationTypeElementDoc( - MethodSymbol meth) { - - AnnotationTypeElementDocImpl result = - (AnnotationTypeElementDocImpl)methodMap.get(meth); - if (result != null) return result; - result = new AnnotationTypeElementDocImpl(this, meth); - methodMap.put(meth, result); - return result; - } - -// private Map parameterizedTypeMap = -// new HashMap(); - /** - * Return the ParameterizedType of this instantiation. -// * ### Could use Type.sameTypeAs() instead of equality matching in hashmap -// * ### to avoid some duplication. - */ - ParameterizedTypeImpl getParameterizedType(ClassType t) { - return new ParameterizedTypeImpl(this, t); -// ParameterizedTypeImpl result = parameterizedTypeMap.get(t); -// if (result != null) return result; -// result = new ParameterizedTypeImpl(this, t); -// parameterizedTypeMap.put(t, result); -// return result; - } - - TreePath getTreePath(JCCompilationUnit tree) { - TreePath p = treePaths.get(tree); - if (p == null) - treePaths.put(tree, p = new TreePath(tree)); - return p; - } - - TreePath getTreePath(JCCompilationUnit toplevel, JCPackageDecl tree) { - TreePath p = treePaths.get(tree); - if (p == null) - treePaths.put(tree, p = new TreePath(getTreePath(toplevel), tree)); - return p; - } - - TreePath getTreePath(JCCompilationUnit toplevel, JCClassDecl tree) { - TreePath p = treePaths.get(tree); - if (p == null) - treePaths.put(tree, p = new TreePath(getTreePath(toplevel), tree)); - return p; - } - - TreePath getTreePath(JCCompilationUnit toplevel, JCClassDecl cdecl, JCTree tree) { - return new TreePath(getTreePath(toplevel, cdecl), tree); - } - - /** - * Set the encoding. - */ - public void setEncoding(String encoding) { - this.encoding = encoding; - } - - /** - * Get the encoding. - */ - public String getEncoding() { - return encoding; - } - - /** - * Convert modifier bits from private coding used by - * the compiler to that of java.lang.reflect.Modifier. - */ - static int translateModifiers(long flags) { - int result = 0; - if ((flags & Flags.ABSTRACT) != 0) - result |= Modifier.ABSTRACT; - if ((flags & Flags.FINAL) != 0) - result |= Modifier.FINAL; - if ((flags & Flags.INTERFACE) != 0) - result |= Modifier.INTERFACE; - if ((flags & Flags.NATIVE) != 0) - result |= Modifier.NATIVE; - if ((flags & Flags.PRIVATE) != 0) - result |= Modifier.PRIVATE; - if ((flags & Flags.PROTECTED) != 0) - result |= Modifier.PROTECTED; - if ((flags & Flags.PUBLIC) != 0) - result |= Modifier.PUBLIC; - if ((flags & Flags.STATIC) != 0) - result |= Modifier.STATIC; - if ((flags & Flags.SYNCHRONIZED) != 0) - result |= Modifier.SYNCHRONIZED; - if ((flags & Flags.TRANSIENT) != 0) - result |= Modifier.TRANSIENT; - if ((flags & Flags.VOLATILE) != 0) - result |= Modifier.VOLATILE; - return result; - } - - void initDoclint(Collection opts, Collection customTagNames, String htmlVersion) { - ArrayList doclintOpts = new ArrayList<>(); - boolean msgOptionSeen = false; - - for (String opt : opts) { - if (opt.startsWith(DocLint.XMSGS_OPTION)) { - if (opt.equals(DocLint.XMSGS_CUSTOM_PREFIX + "none")) - return; - msgOptionSeen = true; - } - doclintOpts.add(opt); - } - - if (!msgOptionSeen) { - doclintOpts.add(DocLint.XMSGS_OPTION); - } - - String sep = ""; - StringBuilder customTags = new StringBuilder(); - for (String customTag : customTagNames) { - customTags.append(sep); - customTags.append(customTag); - sep = DocLint.SEPARATOR; - } - doclintOpts.add(DocLint.XCUSTOM_TAGS_PREFIX + customTags.toString()); - doclintOpts.add(DocLint.XHTML_VERSION_PREFIX + htmlVersion); - - JavacTask t = BasicJavacTask.instance(context); - doclint = new DocLint(); - // standard doclet normally generates H1, H2 - doclintOpts.add(DocLint.XIMPLICIT_HEADERS + "2"); - doclint.init(t, doclintOpts.toArray(new String[doclintOpts.size()]), false); - } - - JavaScriptScanner initJavaScriptScanner(boolean allowScriptInComments) { - if (allowScriptInComments) { - javaScriptScanner = null; - } else { - javaScriptScanner = new JavaScriptScanner(); - } - return javaScriptScanner; - } - - boolean showTagMessages() { - return (doclint == null); - } - - Map shouldCheck = new HashMap<>(); - - boolean shouldCheck(CompilationUnitTree unit) { - return shouldCheck.computeIfAbsent(unit, doclint :: shouldCheck); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocImpl.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocImpl.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,455 +0,0 @@ -/* - * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.text.CollationKey; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.tools.FileObject; - -import com.sun.javadoc.*; -import com.sun.source.util.TreePath; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; -import com.sun.tools.javac.util.Position; - -/** - * abstract base class of all Doc classes. Doc item's are representations - * of java language constructs (class, package, method,...) which have - * comments and have been processed by this run of javadoc. All Doc items - * are unique, that is, they are == comparable. - * - *

    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. - * - * @since 1.2 - * @author Robert Field - * @author Atul M Dambalkar - * @author Neal Gafter (rewrite) - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -public abstract class DocImpl implements Doc, Comparable { - - /** - * Doc environment - */ - protected final DocEnv env; //### Rename this everywhere to 'docenv' ? - - /** - * Back pointer to the tree node for this doc item. - * May be null if there is no associated tree. - */ - protected TreePath treePath; - - /** - * The complex comment object, lazily initialized. - */ - private Comment comment; - - /** - * The cached sort key, to take care of Natural Language Text sorting. - */ - private CollationKey collationkey = null; - - /** - * Raw documentation string. - */ - protected String documentation; // Accessed in PackageDocImpl, RootDocImpl - - /** - * Cached first sentence. - */ - private Tag[] firstSentence; - - /** - * Cached inline tags. - */ - private Tag[] inlineTags; - - /** - * Constructor. - */ - DocImpl(DocEnv env, TreePath treePath) { - this.treePath = treePath; - this.documentation = getCommentText(treePath); - this.env = env; - } - - private static String getCommentText(TreePath p) { - if (p == null) - return null; - - JCCompilationUnit topLevel = (JCCompilationUnit) p.getCompilationUnit(); - JCTree tree = (JCTree) p.getLeaf(); - return topLevel.docComments.getCommentText(tree); - } - - /** - * So subclasses have the option to do lazy initialization of - * "documentation" string. - */ - protected String documentation() { - if (documentation == null) documentation = ""; - return documentation; - } - - /** - * For lazy initialization of comment. - */ - Comment comment() { - if (comment == null) { - String d = documentation(); - if (env.javaScriptScanner != null) { - env.javaScriptScanner.parse(d, new JavaScriptScanner.Reporter() { - @Override - public void report() { - env.error(DocImpl.this, "javadoc.JavaScript_in_comment"); - throw new Error(); - } - }); - } - if (env.doclint != null - && treePath != null - && env.shouldCheck(treePath.getCompilationUnit()) - && d.equals(getCommentText(treePath))) { - env.doclint.scan(treePath); - } - comment = new Comment(this, d); - } - return comment; - } - - /** - * Return the text of the comment for this doc item. - * TagImpls have been removed. - */ - public String commentText() { - return comment().commentText(); - } - - /** - * Return all tags in this Doc item. - * - * @return an array of TagImpl containing all tags on this Doc item. - */ - public Tag[] tags() { - return comment().tags(); - } - - /** - * Return tags of the specified kind in this Doc item. - * - * @param tagname name of the tag kind to search for. - * @return an array of TagImpl containing all tags whose 'kind()' - * matches 'tagname'. - */ - public Tag[] tags(String tagname) { - return comment().tags(tagname); - } - - /** - * Return the see also tags in this Doc item. - * - * @return an array of SeeTag containing all @see tags. - */ - public SeeTag[] seeTags() { - return comment().seeTags(); - } - - public Tag[] inlineTags() { - if (inlineTags == null) { - inlineTags = Comment.getInlineTags(this, commentText()); - } - return inlineTags; - } - - public Tag[] firstSentenceTags() { - if (firstSentence == null) { - //Parse all sentences first to avoid duplicate warnings. - inlineTags(); - try { - env.setSilent(true); - firstSentence = Comment.firstSentenceTags(this, commentText()); - } finally { - env.setSilent(false); - } - } - return firstSentence; - } - - /** - * Utility for subclasses which read HTML documentation files. - */ - String readHTMLDocumentation(InputStream input, FileObject filename) throws IOException { - byte[] filecontents = new byte[input.available()]; - try { - DataInputStream dataIn = new DataInputStream(input); - dataIn.readFully(filecontents); - } finally { - input.close(); - } - String encoding = env.getEncoding(); - String rawDoc = (encoding!=null) - ? new String(filecontents, encoding) - : new String(filecontents); - Pattern bodyPat = Pattern.compile("(?is).*]*>(.*) - * Default is name(). - */ - CollationKey generateKey() { - String k = name(); - // System.out.println("COLLATION KEY FOR " + this + " is \"" + k + "\""); - return env.doclocale.collator.getCollationKey(k); - } - - /** - * Returns a string representation of this Doc item. - */ - @Override - public String toString() { - return qualifiedName(); - } - - /** - * Returns the name of this Doc item. - * - * @return the name - */ - public abstract String name(); - - /** - * Returns the qualified name of this Doc item. - * - * @return the name - */ - public abstract String qualifiedName(); - - /** - * Compares this Object with the specified Object for order. Returns a - * negative integer, zero, or a positive integer as this Object is less - * than, equal to, or greater than the given Object. - *

    - * Included so that Doc item are java.lang.Comparable. - * - * @param obj the {@code Object} to be compared. - * @return a negative integer, zero, or a positive integer as this Object - * is less than, equal to, or greater than the given Object. - * @exception ClassCastException the specified Object's type prevents it - * from being compared to this Object. - */ - public int compareTo(Object obj) { - // System.out.println("COMPARE \"" + this + "\" to \"" + obj + "\" = " + key().compareTo(((DocImpl)obj).key())); - return key().compareTo(((DocImpl)obj).key()); - } - - /** - * Is this Doc item a field? False until overridden. - * - * @return true if it represents a field - */ - public boolean isField() { - return false; - } - - /** - * Is this Doc item an enum constant? False until overridden. - * - * @return true if it represents an enum constant - */ - public boolean isEnumConstant() { - return false; - } - - /** - * Is this Doc item a constructor? False until overridden. - * - * @return true if it represents a constructor - */ - public boolean isConstructor() { - return false; - } - - /** - * Is this Doc item a method (but not a constructor or annotation - * type element)? - * False until overridden. - * - * @return true if it represents a method - */ - public boolean isMethod() { - return false; - } - - /** - * Is this Doc item an annotation type element? - * False until overridden. - * - * @return true if it represents an annotation type element - */ - public boolean isAnnotationTypeElement() { - return false; - } - - /** - * Is this Doc item a interface (but not an annotation type)? - * False until overridden. - * - * @return true if it represents a interface - */ - public boolean isInterface() { - return false; - } - - /** - * Is this Doc item a exception class? False until overridden. - * - * @return true if it represents a exception - */ - public boolean isException() { - return false; - } - - /** - * Is this Doc item a error class? False until overridden. - * - * @return true if it represents a error - */ - public boolean isError() { - return false; - } - - /** - * Is this Doc item an enum type? False until overridden. - * - * @return true if it represents an enum type - */ - public boolean isEnum() { - return false; - } - - /** - * Is this Doc item an annotation type? False until overridden. - * - * @return true if it represents an annotation type - */ - public boolean isAnnotationType() { - return false; - } - - /** - * Is this Doc item an ordinary class (i.e. not an interface, - * annotation type, enumeration, exception, or error)? - * False until overridden. - * - * @return true if it represents an ordinary class - */ - public boolean isOrdinaryClass() { - return false; - } - - /** - * Is this Doc item a class - * (and not an interface or annotation type)? - * This includes ordinary classes, enums, errors and exceptions. - * False until overridden. - * - * @return true if it represents a class - */ - public boolean isClass() { - return false; - } - - /** - * return true if this Doc is include in the active set. - */ - public abstract boolean isIncluded(); - - /** - * Return the source position of the entity, or null if - * no position is available. - */ - public SourcePosition position() { return null; } -} diff -r 30695f27d7ea -r 7a45c67e73d0 src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocLocale.java --- a/src/jdk.javadoc/share/classes/com/sun/tools/javadoc/main/DocLocale.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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.javadoc.main; - -import java.text.BreakIterator; -import java.text.Collator; -import java.util.Locale; - -/** - * This class holds the information about locales. - * - *

    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. - * - * @since 1.4 - * @author Robert Field - */ -@Deprecated(since="9", forRemoval=true) -@SuppressWarnings("removal") -class DocLocale { - - /** - * The locale name will be set by Main, if option is provided on the - * command line. - */ - final String localeName; - - /** - * The locale to be used. If user doesn't provide this, - * then set it to default locale value. - */ - final Locale locale; - - /** - * The collator for this application. This is to take care of Locale - * Specific or Natural Language Text sorting. - */ - final Collator collator; - - /** - * Enclosing DocEnv - */ - private final DocEnv docenv; - - /** - * Sentence instance from the BreakIterator. - */ - private final BreakIterator sentenceBreaker; - - /** - * True is we should use BreakIterator - * to compute first sentence. - */ - private boolean useBreakIterator = false; - - /** - * The HTML sentence terminators. - */ - static final String[] sentenceTerminators = - { - "

    ", "

    ", "

    ", "

    ", - "

    ", "

    ", "

    ", "
    ", - "
    ", "", "", "", "", - "", "
    ", "
    ", "
    " - }; - - /** - * Constructor - */ - DocLocale(DocEnv docenv, String localeName, boolean useBreakIterator) { - this.docenv = docenv; - this.localeName = localeName; - this.useBreakIterator = useBreakIterator; - locale = getLocale(); - if (locale == null) { - docenv.exit(); - } else { - Locale.setDefault(locale); // NOTE: updating global state - } - collator = Collator.getInstance(locale); - sentenceBreaker = BreakIterator.getSentenceInstance(locale); - } - - /** - * Get the locale if specified on the command line - * else return null and if locale option is not used - * then return default locale. - */ - private Locale getLocale() { - Locale userlocale = null; - if (localeName.length() > 0) { - int firstuscore = localeName.indexOf('_'); - int seconduscore = -1; - String language = null; - String country = null; - String variant = null; - if (firstuscore == 2) { - language = localeName.substring(0, firstuscore); - seconduscore = localeName.indexOf('_', firstuscore + 1); - if (seconduscore > 0) { - if (seconduscore != firstuscore + 3 || - localeName.length() <= seconduscore + 1) { - docenv.error(null, "main.malformed_locale_name", localeName); - return null; - } - country = localeName.substring(firstuscore + 1, - seconduscore); - variant = localeName.substring(seconduscore + 1); - } else if (localeName.length() == firstuscore + 3) { - country = localeName.substring(firstuscore + 1); - } else { - docenv.error(null, "main.malformed_locale_name", localeName); - return null; - } - } else if (firstuscore == -1 && localeName.length() == 2) { - language = localeName; - } else { - docenv.error(null, "main.malformed_locale_name", localeName); - return null; - } - userlocale = searchLocale(language, country, variant); - if (userlocale == null) { - docenv.error(null, "main.illegal_locale_name", localeName); - return null; - } else { - return userlocale; - } - } else { - return Locale.getDefault(); - } - } - - /** - * Search the locale for specified language, specified country and - * specified variant. - */ - private Locale searchLocale(String language, String country, - String variant) { - for (Locale loc : Locale.getAvailableLocales()) { - if (loc.getLanguage().equals(language) && - (country == null || loc.getCountry().equals(country)) && - (variant == null || loc.getVariant().equals(variant))) { - return loc; - } - } - return null; - } - - String localeSpecificFirstSentence(DocImpl doc, String s) { - if (s == null || s.length() == 0) { - return ""; - } - int index = s.indexOf("-->"); - if(s.trim().startsWith(" - - - - -Voice or no voice, the people can always be brought to the bidding of -the leaders. That is easy. All you have to do is tell them they are -being attacked, and denounce the peacemakers for lack of patriotism -and exposing the country to danger. It works the same in any country. -
    -        Hermann Goering
    -        Commander in Chief, Luftwaffe
    -
    - - - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotatePackage/pkg2/B.java --- a/test/langtools/tools/javadoc/annotations/annotatePackage/pkg2/B.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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. - */ - -/** - * Doc comment here is ignored. - */ -package pkg2; - -public class B { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotatePackage/pkg2/package.html --- a/test/langtools/tools/javadoc/annotations/annotatePackage/pkg2/package.html Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ - - - - -Albert Einstein commenting on the book -110 German Scientists Against Einstein: -"If I had been wrong it would only have needed one." - - - - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotateParams/Main.java --- a/test/langtools/tools/javadoc/annotations/annotateParams/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 5031171 - * @summary Test parameter annotations. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (PackageDoc pkg : root.specifiedPackages()) { - for (ClassDoc cd : pkg.ordinaryClasses()) { - for (ConstructorDoc c : cd.constructors()) { - tester.println(c); - tester.println(); - for (Parameter p : c.parameters()) { - tester.printParameter(p); - } - tester.println(); - } - for (MethodDoc m : cd.methods()) { - tester.println(m); - tester.println(); - for (Parameter p : m.parameters()) { - tester.printParameter(p); - } - tester.println(); - } - } - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotateParams/expected.out --- a/test/langtools/tools/javadoc/annotations/annotateParams/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -pkg1.C(boolean) - -parameter boolean p0 - annotations: - @pkg1.A("p0") - -pkg1.C.m(int, int, java.lang.String) - -parameter int p1 - annotations: - @pkg1.A("p1") -parameter int p2 -parameter String p3 - annotations: - @java.lang.Deprecated - @pkg1.A("p3") - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotateParams/pkg1/A.java --- a/test/langtools/tools/javadoc/annotations/annotateParams/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface A { - String value(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/annotateParams/pkg1/C.java --- a/test/langtools/tools/javadoc/annotations/annotateParams/pkg1/C.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class C { - - public C(@A("p0") boolean p0) { - } - - public void m(@A("p1") int p1, - int p2, - @Deprecated @A("p3") String p3) { - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/badVals/Main.java --- a/test/langtools/tools/javadoc/annotations/badVals/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 5029874 - * @summary Verify that bad annotation values don't result in NPE - * @library ../../lib - * @modules jdk.javadoc - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/badVals/pkg1/A.java --- a/test/langtools/tools/javadoc/annotations/badVals/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -import java.lang.annotation.*; - -public class A { - - @Retention(BOGUS) // illegal - public @interface A1 {} - - @Target({BOGUS}) // illegal - public @interface A2 {} - - @Retention(true) // illegal - public @interface A3 {} - - public @interface A4 { - ElementType value() default BOGUS; // illegal - } - - public @interface A5 { - int[] value() default {true}; // illegal - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/defaults/Main.java --- a/test/langtools/tools/javadoc/annotations/defaults/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4904495 - * @summary Test an annotation type with default element values, and - * annotations that use them. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; -import com.sun.javadoc.AnnotationDesc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (AnnotationTypeDoc at : - root.specifiedPackages()[0].annotationTypes()) { - tester.printAnnotationType(at); - tester.println(); - } - - for (ClassDoc cd : - root.specifiedPackages()[0].interfaces()) { - for (MethodDoc m : cd.methods()) { - tester.printMethod(m); - } - tester.println(); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/defaults/expected.out --- a/test/langtools/tools/javadoc/annotations/defaults/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -@interface pkg1.A - elements: - String value() default "sigh" - int i() default 2 - double d() default 3.14 - boolean b() default true - java.lang.Class c() default java.lang.Boolean.class - java.lang.Class w() default java.lang.Long.class - ElementType e() default java.lang.annotation.ElementType.TYPE - A a() default @pkg1.A(d=2.718) - java.lang.String[] sa() default {"up", "down"} - -method pkg1.B.m1() - signature: () - () - annotations: - @pkg1.A - returns: - void -method pkg1.B.m2() - signature: () - () - annotations: - @pkg1.A("flip") - returns: - void -method pkg1.B.m3() - signature: () - () - annotations: - @pkg1.A("flop") - returns: - void -method pkg1.B.m4() - signature: () - () - annotations: - @pkg1.A(c=java.lang.Boolean.class, w=java.lang.Long.class, sa={}) - returns: - void -method pkg1.B.m5() - signature: () - () - annotations: - @pkg1.A(i=0, e=java.lang.annotation.ElementType.FIELD) - returns: - void -method pkg1.B.m6() - signature: () - () - annotations: - @pkg1.A(a=@pkg1.A("splat")) - returns: - void - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/defaults/pkg1/A.java --- a/test/langtools/tools/javadoc/annotations/defaults/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface A { - String value() default "sigh"; - int i() default 1+1; - double d() default 3.14; - boolean b() default true; - Class c() default Boolean.class; - Class w() default Long.class; - java.lang.annotation.ElementType e() default java.lang.annotation.ElementType.TYPE; - A a() default @A(d=2.718); - String[] sa() default {"up", "down"}; -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/defaults/pkg1/B.java --- a/test/langtools/tools/javadoc/annotations/defaults/pkg1/B.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public interface B { - @A void m1(); - @A("flip") void m2(); - @A(value="flop") void m3(); - @A(c=Boolean.class, w=Long.class, sa={}) - void m4(); - @A(i=0, e=java.lang.annotation.ElementType.FIELD) void m5(); - @A(a=@A("splat")) void m6(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/elementTypes/Main.java --- a/test/langtools/tools/javadoc/annotations/elementTypes/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4904495 - * @summary Test an annotation type and annotations with elements of various - * types. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import java.util.Arrays; -import com.sun.javadoc.*; -import com.sun.javadoc.AnnotationDesc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - ClassDoc[] cds = root.classes(); - Arrays.sort(cds); - for (ClassDoc cd : cds) { - tester.printClass(cd); - tester.println(); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/elementTypes/expected.out --- a/test/langtools/tools/javadoc/annotations/elementTypes/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -@interface pkg1.A - elements: - int i() - double d() - boolean b() - String s() - java.lang.Class c() - java.lang.Class w() - ElementType e() - A a() - java.lang.String[] sa() - -interface pkg1.B - name: B / B / pkg1.B - annotations: - @pkg1.A(i=2, d=3.14, b=true, s="sigh", c=java.lang.Boolean.class, w=java.lang.Long.class, e=java.lang.annotation.ElementType.TYPE, a=@pkg1.A, sa={"up", "down"}) - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/elementTypes/pkg1/A.java --- a/test/langtools/tools/javadoc/annotations/elementTypes/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface A { - int i(); - double d(); - boolean b(); - String s(); - Class c(); - Class w(); - java.lang.annotation.ElementType e(); - A a(); - String[] sa(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/elementTypes/pkg1/B.java --- a/test/langtools/tools/javadoc/annotations/elementTypes/pkg1/B.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -@A(i = 1+1, - d = 3.14, - b = true, - s = "sigh", - c = Boolean.class, - w = Long.class, - e = java.lang.annotation.ElementType.TYPE, - a = @A, - sa = {"up", "down"}) -public interface B { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/missing/Main.java --- a/test/langtools/tools/javadoc/annotations/missing/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/* - * Copyright 2009 Google, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6709246 - * @summary Class-cast exception when annotation type is missing. - * @library ../../lib - * @modules jdk.javadoc - */ - -import java.io.IOException; -import com.sun.javadoc.RootDoc; -import com.sun.javadoc.ClassDoc; -import com.sun.javadoc.AnnotationDesc; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "somepackage"); - - public static void main(String... args) throws Exception { - tester.run(); - } - - public static boolean start(RootDoc root) { - for (ClassDoc d : root.classes()) { - for (AnnotationDesc a : d.annotations()) { - System.out.println(a.annotationType()); - } - } - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/missing/somepackage/MissingAnnotationClass.java --- a/test/langtools/tools/javadoc/annotations/missing/somepackage/MissingAnnotationClass.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -/* - * Copyright 2009 Google, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 somepackage; - -/** - * This class has an annotation which is not available. - */ -@NoSuchAnnotation -public class MissingAnnotationClass { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/Main.java --- a/test/langtools/tools/javadoc/annotations/shortcuts/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4904495 - * @summary Verify that "shortcuts" are used when printing annotations. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - if (cd.isInterface()) { - tester.printClass(cd); - } - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/expected.out --- a/test/langtools/tools/javadoc/annotations/shortcuts/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -interface pkg1.A - name: A / A / pkg1.A - annotations: - @pkg1.Value("there is only one") - @pkg1.Array(favoriteNumbers=3.5) - @pkg1.Marker diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/pkg1/A.java --- a/test/langtools/tools/javadoc/annotations/shortcuts/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -@Value("there is only one") -@Array(favoriteNumbers={3.5}) -@Marker -public interface A { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Array.java --- a/test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Array.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface Array { - double[] favoriteNumbers(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Marker.java --- a/test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Marker.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface Marker { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Value.java --- a/test/langtools/tools/javadoc/annotations/shortcuts/pkg1/Value.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public @interface Value { - String value(); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/APITest.java --- a/test/langtools/tools/javadoc/api/basic/APITest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,250 +0,0 @@ -/* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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.lang.annotation.Annotation; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URI; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.TreeSet; -import java.util.stream.*; - -import javax.tools.JavaFileObject; -import javax.tools.SimpleJavaFileObject; - - -/* - * Superclass with utility methods for API tests. - */ -class APITest { - protected APITest() { } - - /** Marker annotation for test cases. */ - @Retention(RetentionPolicy.RUNTIME) - @interface Test { } - - /** Invoke all methods annotated with @Test. */ - protected void run() throws Exception { - for (Method m: getClass().getDeclaredMethods()) { - Annotation a = m.getAnnotation(Test.class); - if (a != null) { - testCount++; - testName = m.getName(); - System.err.println("test: " + testName); - try { - m.invoke(this, new Object[] { }); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - throw (cause instanceof Exception) ? ((Exception) cause) : e; - } - System.err.println(); - } - } - - if (testCount == 0) - error("no tests found"); - - StringBuilder summary = new StringBuilder(); - if (testCount != 1) - summary.append(testCount).append(" tests"); - if (errorCount > 0) { - if (summary.length() > 0) summary.append(", "); - summary.append(errorCount).append(" errors"); - } - System.err.println(summary); - if (errorCount > 0) - throw new Exception(errorCount + " errors found"); - } - - /** - * Create a directory in which to store generated doc files. - * Avoid using the default (current) directory, so that we can - * be sure that javadoc is writing in the intended location, - * not a default location. - */ - protected File getOutDir() { - File dir = new File(testName); - dir.mkdirs(); - return dir; - } - - /** - * Create a directory in which to store generated doc files. - * Avoid using the default (current) directory, so that we can - * be sure that javadoc is writing in the intended location, - * not a default location. - */ - protected File getOutDir(String path) { - File dir = new File(testName, path); - dir.mkdirs(); - return dir; - } - - protected JavaFileObject createSimpleJavaFileObject() { - return createSimpleJavaFileObject("pkg/C", "package pkg; public class C { }"); - } - - protected JavaFileObject createSimpleJavaFileObject(final String binaryName, final String content) { - return new SimpleJavaFileObject( - URI.create("myfo:///" + binaryName + ".java"), JavaFileObject.Kind.SOURCE) { - @Override - public CharSequence getCharContent(boolean ignoreEncoding) { - return content; - } - }; - } - - protected void checkFiles(File dir, Set expectFiles) { - Set files = new HashSet(); - listFiles(dir, files); - Set foundFiles = new HashSet(); - URI dirURI = dir.toURI(); - for (File f: files) - foundFiles.add(dirURI.relativize(f.toURI()).getPath()); - checkFiles(foundFiles, expectFiles, dir); - } - - protected void checkFiles(Path dir, Set expectFiles) throws IOException { - Set files = new HashSet(); - listFiles(dir, files); - Set foundFiles = new HashSet(); - for (Path f: files) { - foundFiles.add(dir.relativize(f).toString().replace(f.getFileSystem().getSeparator(), "/")); - } - checkFiles(foundFiles, expectFiles, dir); - } - - private void checkFiles(Set foundFiles, Set expectFiles, Object where) { - if (!foundFiles.equals(expectFiles)) { - Set missing = new TreeSet(expectFiles); - missing.removeAll(foundFiles); - if (!missing.isEmpty()) - error("the following files were not found in " + where + ": " + missing); - Set unexpected = new TreeSet(foundFiles); - unexpected.removeAll(expectFiles); - if (!unexpected.isEmpty()) - error("the following unexpected files were found in " + where + ": " + unexpected); - } - } - - protected void listFiles(File dir, Set files) { - for (File f: dir.listFiles()) { - if (f.isDirectory()) - listFiles(f, files); - else if (f.isFile()) - files.add(f); - } - } - - private void listFiles(Path dir, Set files) throws IOException { - try (DirectoryStream ds = Files.newDirectoryStream(dir)) { - for (Path f: ds) { - if (Files.isDirectory(f)) - listFiles(f, files); - else if (Files.isRegularFile(f)) - files.add(f); - } - } - } - - protected void error(String msg) { - System.err.println("Error: " + msg); - errorCount++; - } - - protected int testCount; - protected int errorCount; - - protected String testName; - - /** - * Standard files generated by processing a documented class pkg.C. - */ - protected static Set standardExpectFiles = new HashSet<>(Arrays.asList( - "allclasses-index.html", - "allpackages-index.html", - "constant-values.html", - "deprecated-list.html", - "help-doc.html", - "index-all.html", - "index.html", - "jquery/jquery-3.3.1.js", - "jquery/jquery-migrate-3.0.1.js", - "jquery/jquery-ui.js", - "jquery/jquery-ui.css", - "jquery/jquery-ui.min.js", - "jquery/jquery-ui.min.css", - "jquery/jquery-ui.structure.min.css", - "jquery/jquery-ui.structure.css", - "jquery/external/jquery/jquery.js", - "jquery/jszip/dist/jszip.js", - "jquery/jszip/dist/jszip.min.js", - "jquery/jszip-utils/dist/jszip-utils.js", - "jquery/jszip-utils/dist/jszip-utils.min.js", - "jquery/jszip-utils/dist/jszip-utils-ie.js", - "jquery/jszip-utils/dist/jszip-utils-ie.min.js", - "jquery/images/ui-bg_glass_65_dadada_1x400.png", - "jquery/images/ui-icons_454545_256x240.png", - "jquery/images/ui-bg_glass_95_fef1ec_1x400.png", - "jquery/images/ui-bg_glass_75_dadada_1x400.png", - "jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png", - "jquery/images/ui-icons_888888_256x240.png", - "jquery/images/ui-icons_2e83ff_256x240.png", - "jquery/images/ui-icons_cd0a0a_256x240.png", - "jquery/images/ui-bg_glass_55_fbf9ee_1x400.png", - "jquery/images/ui-icons_222222_256x240.png", - "jquery/images/ui-bg_glass_75_e6e6e6_1x400.png", - "member-search-index.js", - "member-search-index.zip", - "overview-tree.html", - "element-list", - "package-search-index.js", - "package-search-index.zip", - "pkg/C.html", - "pkg/package-summary.html", - "pkg/package-tree.html", - "resources/glass.png", - "resources/x.png", - "script.js", - "search.js", - "stylesheet.css", - "type-search-index.js", - "type-search-index.zip" - )); - - protected static Set noIndexFiles = standardExpectFiles.stream() - .filter(s -> !s.startsWith("jquery") && !s.startsWith("resources") && !s.endsWith("zip") - && !s.equals("index-all.html") && !s.equals("search.js") && !s.endsWith("-search-index.js") - && !s.equals("allclasses-index.html") && !s.equals("allpackages-index.html")) - .collect(Collectors.toSet()); -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/DocletPathTest.java --- a/test/langtools/tools/javadoc/api/basic/DocletPathTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main DocletPathTest - */ - -import java.io.File; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Arrays; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaCompiler; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.StandardLocation; -import javax.tools.ToolProvider; - -/** - * Tests for locating a doclet via the file manager's DOCLET_PATH. - */ -public class DocletPathTest extends APITest { - public static void main(String... args) throws Exception { - new DocletPathTest().run(); - } - - /** - * Verify that an alternate doclet can be specified, and located via - * the file manager's DOCLET_PATH. - */ - @Test - public void testDocletPath() throws Exception { - JavaFileObject docletSrc = - createSimpleJavaFileObject("DocletOnDocletPath", docletSrcText); - File docletDir = getOutDir("classes"); - JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); - try (StandardJavaFileManager cfm = compiler.getStandardFileManager(null, null, null)) { - cfm.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(docletDir)); - Iterable cfiles = Arrays.asList(docletSrc); - if (!compiler.getTask(null, cfm, null, null, null, cfiles).call()) - throw new Exception("cannot compile doclet"); - } - - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir("api"); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - fm.setLocation(DocumentationTool.Location.DOCLET_PATH, Arrays.asList(docletDir)); - Iterable files = Arrays.asList(srcFile); - Iterable options = Arrays.asList("-doclet", "DocletOnDocletPath"); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - DocumentationTask t = tool.getTask(pw, fm, null, null, options, files); - boolean ok = t.call(); - String out = sw.toString(); - System.err.println(">>" + out + "<<"); - if (ok) { - if (out.contains(TEST_STRING)) { - System.err.println("doclet executed as expected"); - } else { - error("test string not found in doclet output"); - } - } else { - error("task failed"); - } - } - } - - private static final String TEST_STRING = "DocletOnDocletPath found and running"; - - private static final String docletSrcText = - "import com.sun.javadoc.*;\n" + - "public class DocletOnDocletPath {\n" + - " public static boolean start(RootDoc doc) {\n" + - " doc.printNotice(\"" + TEST_STRING + "\");\n" + - " return true;\n" + - " }\n" + - " public static int optionLength(String option) { return 0; }\n" + - " public static boolean validOptions(String options[][],\n" + - " DocErrorReporter reporter) { return true; }\n" + - " public static LanguageVersion languageVersion() {\n" + - " return LanguageVersion.JAVA_1_1;\n" + - " }\n" + - "}\n"; -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/DocumentationToolLocationTest.java --- a/test/langtools/tools/javadoc/api/basic/DocumentationToolLocationTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 8025844 - * @summary test DocumentationTool.Location methods - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main DocumentationToolLocationTest - */ - -import javax.tools.DocumentationTool; -import java.util.Objects; - -/** - * Test for DocumentationTool.Location methods. - */ -public class DocumentationToolLocationTest extends APITest { - public static void main(String[] args) throws Exception { - new DocumentationToolLocationTest().run(); - } - - /** - * Test getName() method - */ - @Test - public void testGetName() throws Exception { - // getName() returns name(). This is for test coverage of getName. - for (DocumentationTool.Location dl: DocumentationTool.Location.values()) { - String expect = dl.name(); - String found = dl.getName(); - if (!Objects.equals(expect, found)) - throw new Exception("mismatch for " + dl + "; expected " + expect + ", found " + found); - } - } - - /** - * Test generated enum methods values() and valueOf() - */ - @Test - public void testEnumMethods() throws Exception { - DocumentationTool.Location[] values = DocumentationTool.Location.values(); - if (values.length != 3) - throw new Exception("unexpected number of values returned"); - - for (DocumentationTool.Location dl: values) { - DocumentationTool.Location expect = dl; - DocumentationTool.Location found = DocumentationTool.Location.valueOf(dl.name()); - if (!Objects.equals(expect, found)) - throw new Exception("mismatch for " + dl + "; expected " + expect + ", found " + found); - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetSourceVersionsTest.java --- a/test/langtools/tools/javadoc/api/basic/GetSourceVersionsTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main GetSourceVersionsTest - */ - -import java.util.EnumSet; -import java.util.Set; -import javax.lang.model.SourceVersion; -import javax.tools.DocumentationTool; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getSourceVersions method. - */ -public class GetSourceVersionsTest extends APITest { - public static void main(String... args) throws Exception { - new GetSourceVersionsTest().run(); - } - - /** - * Verify getSourceVersions. - */ - @Test - public void testRun() throws Exception { - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - Set found = tool.getSourceVersions(); - Set expect = EnumSet.range(SourceVersion.RELEASE_3, SourceVersion.latest()); - if (!expect.equals(found)) { - System.err.println("expect: " + expect); - System.err.println(" found: " + expect); - error("unexpected versions"); - } - } -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_DiagListenerTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_DiagListenerTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main GetTask_DiagListenerTest - */ - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticCollector; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getTask diagnosticListener parameter. - */ -public class GetTask_DiagListenerTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_DiagListenerTest().run(); - } - - /** - * Verify that a diagnostic listener can be specified. - * Note that messages from the tool and doclet are imperfectly modeled - * because the DocErrorReporter API works in terms of localized strings - * and file:line positions. Therefore, messages reported via DocErrorReporter - * and simply wrapped and passed through. - */ - @Test - public void testDiagListener() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject("pkg/C", "package pkg; public error { }"); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DiagnosticCollector dc = new DiagnosticCollector(); - DocumentationTask t = tool.getTask(null, fm, dc, null, null, files); - if (t.call()) { - throw new Exception("task succeeded unexpectedly"); - } else { - List diagCodes = new ArrayList(); - for (Diagnostic d: dc.getDiagnostics()) { - System.err.println(d); - diagCodes.add(d.getCode()); - } - List expect = Arrays.asList( - "javadoc.note.msg", // Loading source file - "compiler.err.expected3", // class, interface, or enum expected - "javadoc.note.msg"); // 1 error - if (!diagCodes.equals(expect)) - throw new Exception("unexpected diagnostics occurred"); - System.err.println("diagnostics received as expected"); - } - } - } - -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_DocletClassTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_DocletClassTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules jdk.javadoc - * @build APITest - * @run main GetTask_DocletClassTest - * @key randomness - */ - -import com.sun.javadoc.DocErrorReporter; -import com.sun.javadoc.LanguageVersion; -import com.sun.javadoc.RootDoc; -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.Random; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getTask docletClass parameter. - */ -public class GetTask_DocletClassTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_DocletClassTest().run(); - } - - /** - * Verify that an alternate doclet can be specified. - * - * There is no standard interface or superclass for a doclet; - * the only requirement is that it provides static methods that - * can be invoked via reflection. So, for now, the doclet is - * specified as a class. - * Because we cannot create and use a unique instance of the class, - * we verify that the doclet has been called by having it record - * (in a static field!) the comment from the last time it was invoked, - * which is randomly generated each time the test is run. - */ - @Test - public void testDoclet() throws Exception { - Random r = new Random(); - int key = r.nextInt(); - JavaFileObject srcFile = createSimpleJavaFileObject( - "pkg/C", - "package pkg; /** " + key + "*/ public class C { }"); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, TestDoclet.class, null, files); - if (t.call()) { - System.err.println("task succeeded"); - if (TestDoclet.lastCaller.equals(String.valueOf(key))) - System.err.println("found expected key: " + key); - else - error("Expected key not found"); - checkFiles(outDir, Collections.emptySet()); - } else { - throw new Exception("task failed"); - } - } - } - - public static class TestDoclet { - static String lastCaller; - public static boolean start(RootDoc root) { - lastCaller = root.classNamed("pkg.C").commentText().trim(); - return true; - } - - public static int optionLength(String option) { - return 0; // default is option unknown - } - - public static boolean validOptions(String options[][], - DocErrorReporter reporter) { - return true; // default is options are valid - } - - public static LanguageVersion languageVersion() { - return LanguageVersion.JAVA_1_1; - } - } - - /** - * Verify that exceptions from a doclet are thrown as expected. - */ - @Test - public void testBadDoclet() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, BadDoclet.class, null, files); - try { - t.call(); - error("call completed without exception"); - } catch (RuntimeException e) { - Throwable c = e.getCause(); - if (c.getClass() == UnexpectedError.class) - System.err.println("exception caught as expected: " + c); - else - throw e; - } - } - } - - public static class UnexpectedError extends Error { } - - public static class BadDoclet { - public static boolean start(RootDoc root) { - throw new UnexpectedError(); - } - - public static int optionLength(String option) { - return 0; // default is option unknown - } - - public static boolean validOptions(String options[][], - DocErrorReporter reporter) { - return true; // default is options are valid - } - - public static LanguageVersion languageVersion() { - return LanguageVersion.JAVA_1_1; - } - } - -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_FileManagerTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_FileManagerTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 8024434 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules jdk.compiler/com.sun.tools.javac.file - * jdk.compiler/com.sun.tools.javac.util - * @build APITest - * @run main GetTask_FileManagerTest - */ - -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Set; - -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.FileObject; -import javax.tools.ForwardingJavaFileManager; -import javax.tools.JavaFileObject; -import javax.tools.JavaFileObject.Kind; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.util.Context; - -/** - * Tests for DocumentationTool.getTask fileManager parameter. - */ -public class GetTask_FileManagerTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_FileManagerTest().run(); - } - - /** - * Verify that an alternate file manager can be specified: - * in this case, a TestFileManager. - */ - @Test - public void testFileManager() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - StandardJavaFileManager fm = new TestFileManager(); - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, null, Arrays.asList("-verbose"), files); - if (t.call()) { - System.err.println("task succeeded"); - checkFiles(outDir, standardExpectFiles); - } else { - throw new Exception("task failed"); - } - } - - /** - * Verify that exceptions from a bad file manager are thrown as expected. - */ - @Test - public void testBadFileManager() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - StandardJavaFileManager fm = new TestFileManager() { - @Override - public Iterable list(Location location, - String packageName, - Set kinds, - boolean recurse) - throws IOException { - throw new UnexpectedError(); - } - }; - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(getOutDir())); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - try { - t.call(); - error("call completed without exception"); - } catch (RuntimeException e) { - Throwable c = e.getCause(); - if (c.getClass() == UnexpectedError.class) - System.err.println("exception caught as expected: " + c); - else - throw e; - } - } - - public static class UnexpectedError extends Error { } - - /* - * A JavaFileManager which is not a JavacFileManager, even though it uses one internally for - * convenience. - */ - static class TestFileManager extends ForwardingJavaFileManager - implements StandardJavaFileManager { - TestFileManager() { - super(new JavacFileManager(new Context(), false, null)); - } - - @Override - public Iterable getJavaFileObjectsFromFiles(Iterable files) { - return fileManager.getJavaFileObjectsFromFiles(files); - } - - @Override - public Iterable getJavaFileObjects(File... files) { - return fileManager.getJavaFileObjects(files); - } - - @Override - public Iterable getJavaFileObjectsFromStrings(Iterable names) { - return fileManager.getJavaFileObjectsFromStrings(names); - } - - @Override - public Iterable getJavaFileObjects(String... names) { - return fileManager.getJavaFileObjects(names); - } - - @Override - public void setLocation(Location location, Iterable path) throws IOException { - fileManager.setLocation(location, path); - } - - @Override - public Iterable getLocation(Location location) { - return fileManager.getLocation(location); - } - - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_FileObjectsTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_FileObjectsTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main GetTask_FileObjectsTest - */ - -import java.io.File; -import java.util.Arrays; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getTask fileObjects parameter. - */ -public class GetTask_FileObjectsTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_FileObjectsTest().run(); - } - - /** - * Verify that expected output files are written via the file manager, - * for a source file read from the file system with StandardJavaFileManager. - */ - @Test - public void testStandardFileObject() throws Exception { - File testSrc = new File(System.getProperty("test.src")); - File srcFile = new File(testSrc, "pkg/C.java"); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = fm.getJavaFileObjects(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - if (t.call()) { - System.err.println("task succeeded"); - checkFiles(outDir, standardExpectFiles); - } else { - throw new Exception("task failed"); - } - } - } - - /** - * Verify that expected output files are written via the file manager, - * for an in-memory file object. - */ - @Test - public void testMemoryFileObject() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - if (t.call()) { - System.err.println("task succeeded"); - checkFiles(outDir, standardExpectFiles); - } else { - throw new Exception("task failed"); - } - } - } - - /** - * Verify bad file object is handled correctly. - */ - @Test - public void testBadFileObject() throws Exception { - File testSrc = new File(System.getProperty("test.src")); - File srcFile = new File(testSrc, "pkg/C.class"); // unacceptable file kind - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = fm.getJavaFileObjects(srcFile); - try { - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - error("getTask succeeded, no exception thrown"); - } catch (IllegalArgumentException e) { - System.err.println("exception caught as expected: " + e); - } - } - } - - /** - * Verify null is handled correctly. - */ - @Test - public void testNull() throws Exception { - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList((JavaFileObject) null); - try { - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - error("getTask succeeded, no exception thrown"); - } catch (NullPointerException e) { - System.err.println("exception caught as expected: " + e); - } - } - } - -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_OptionsTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_OptionsTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 8141492 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main GetTask_OptionsTest - */ - -import java.io.File; -import java.util.Arrays; -import java.util.Set; -import java.util.TreeSet; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getTask options parameter. - */ -public class GetTask_OptionsTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_OptionsTest().run(); - } - - /** - * Verify that expected output files are written for given options. - */ - @Test - public void testNoIndex() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - Iterable options = Arrays.asList("-noindex"); - DocumentationTask t = tool.getTask(null, fm, null, null, options, files); - if (t.call()) { - System.err.println("task succeeded"); - Set expectFiles = new TreeSet(noIndexFiles); - checkFiles(outDir, expectFiles); - } else { - error("task failed"); - } - } - } - - /** - * Verify null is handled correctly. - */ - @Test - public void testNull() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable options = Arrays.asList((String) null); - Iterable files = Arrays.asList(srcFile); - try { - DocumentationTask t = tool.getTask(null, fm, null, null, options, files); - error("getTask succeeded, no exception thrown"); - } catch (NullPointerException e) { - System.err.println("exception caught as expected: " + e); - } - } - } - -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/GetTask_WriterTest.java --- a/test/langtools/tools/javadoc/api/basic/GetTask_WriterTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main GetTask_WriterTest - */ - -import java.io.File; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Arrays; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for DocumentationTool.getTask writer parameter. - */ -public class GetTask_WriterTest extends APITest { - public static void main(String... args) throws Exception { - new GetTask_WriterTest().run(); - } - - /** - * Verify that a writer can be provided. - */ - @Test - public void testWriter() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - DocumentationTask t = tool.getTask(pw, fm, null, null, null, files); - if (t.call()) { - System.err.println("task succeeded"); - checkFiles(outDir, standardExpectFiles); - String out = sw.toString(); - System.err.println(">>" + out + "<<"); - for (String f: standardExpectFiles) { - String f1 = f.replace('/', File.separatorChar); - if (f1.endsWith(".html") && !out.contains(f1)) - throw new Exception("expected string not found: " + f1); - } - } else { - throw new Exception("task failed"); - } - } - } -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/Task_reuseTest.java --- a/test/langtools/tools/javadoc/api/basic/Task_reuseTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6493690 - * @summary javadoc should have a javax.tools.Tool service provider - * @modules java.compiler - * jdk.compiler - * @build APITest - * @run main Task_reuseTest - */ - -import java.io.File; -import java.util.Arrays; -import java.util.Locale; -import javax.tools.DocumentationTool; -import javax.tools.DocumentationTool.DocumentationTask; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.ToolProvider; - -/** - * Tests for reusing a documentation task. - */ -public class Task_reuseTest extends APITest { - public static void main(String... args) throws Exception { - new Task_reuseTest().run(); - } - - /** - * Verify that call can only be called once. - */ - @Test - public void testReuse() throws Exception { - DocumentationTask t = getAndRunTask(); - try { - t.call(); - error("task was reused without exception"); - } catch (IllegalStateException e) { - System.err.println("caught exception " + e); - } - } - - /** - * Verify that cannot update task after call - */ - @Test - public void testUpdateSetLocale() throws Exception { - DocumentationTask t = getAndRunTask(); - try { - t.setLocale(Locale.getDefault()); - error("task was reused without exception"); - } catch (IllegalStateException e) { - System.err.println("caught exception " + e); - } - } - - private DocumentationTask getAndRunTask() throws Exception { - JavaFileObject srcFile = createSimpleJavaFileObject(); - DocumentationTool tool = ToolProvider.getSystemDocumentationTool(); - try (StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null)) { - File outDir = getOutDir(); - fm.setLocation(DocumentationTool.Location.DOCUMENTATION_OUTPUT, Arrays.asList(outDir)); - Iterable files = Arrays.asList(srcFile); - DocumentationTask t = tool.getTask(null, fm, null, null, null, files); - if (t.call()) { - System.err.println("task succeeded"); - return t; - } else { - throw new Exception("task failed"); - } - } - } -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/pkg/C.java --- a/test/langtools/tools/javadoc/api/basic/pkg/C.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * Copyright (c) 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. - */ - -package pkg; - -public class C { } - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/api/basic/taglets/UnderlineTaglet.java --- a/test/langtools/tools/javadoc/api/basic/taglets/UnderlineTaglet.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. - * - * Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: - * - * -Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * -Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * Neither the name of Oracle nor the names of - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any - * kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND - * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY - * EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY - * DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR - * RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR - * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE - * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, - * SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER - * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF - * THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that Software is not designed, licensed or - * intended for use in the design, construction, operation or - * maintenance of any nuclear facility. - */ - -import com.sun.tools.doclets.Taglet; -import com.sun.javadoc.*; -import java.util.Map; - -/** - * A sample Inline Taglet representing {@underline ...}. This tag can - * be used in any kind of {@link com.sun.javadoc.Doc}. - * The text is underlined. For example, - * "@underline UNDERLINE ME" would be shown as: UNDERLINE ME. - * - * @author Jamie Ho - * @since 1.4 - */ - -public class UnderlineTaglet implements Taglet { - - private static final String NAME = "underline"; - - /** - * Return the name of this custom tag. - */ - public String getName() { - return NAME; - } - - /** - * @return true since this tag can be used in a field - * doc comment - */ - public boolean inField() { - return true; - } - - /** - * @return true since this tag can be used in a constructor - * doc comment - */ - public boolean inConstructor() { - return true; - } - - /** - * @return true since this tag can be used in a method - * doc comment - */ - public boolean inMethod() { - return true; - } - - /** - * @return true since this tag can be used in an overview - * doc comment - */ - public boolean inOverview() { - return true; - } - - /** - * @return true since this tag can be used in a package - * doc comment - */ - public boolean inPackage() { - return true; - } - - /** - * @return true since this - */ - public boolean inType() { - return true; - } - - /** - * Will return true since this is an inline tag. - * @return true since this is an inline tag. - */ - - public boolean isInlineTag() { - return true; - } - - /** - * Register this Taglet. - * @param tagletMap the map to register this tag to. - */ - public static void register(Map tagletMap) { - UnderlineTaglet tag = new UnderlineTaglet(); - Taglet t = (Taglet) tagletMap.get(tag.getName()); - if (t != null) { - tagletMap.remove(tag.getName()); - } - tagletMap.put(tag.getName(), tag); - } - - /** - * Given the Tag representation of this custom - * tag, return its string representation. - * @param tag he Tag representation of this custom tag. - */ - public String toString(Tag tag) { - return "" + tag.text() + ""; - } - - /** - * This method should not be called since arrays of inline tags do not - * exist. Method {@link #tostring(Tag)} should be used to convert this - * inline tag to a string. - * @param tags the array of Tags representing of this custom tag. - */ - public String toString(Tag[] tags) { - return null; - } -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/completionFailure/CompletionFailure.java --- a/test/langtools/tools/javadoc/completionFailure/CompletionFailure.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4670772 6328529 - * @summary Completion failures should be ignored in javadoc. - * @author gafter - * @modules jdk.javadoc - */ - -import com.sun.javadoc.*; -import java.util.*; - -public class CompletionFailure extends Doclet -{ - public static void main(String[] args) { - // run javadoc on package pkg - if (com.sun.tools.javadoc.Main.execute("javadoc", - "CompletionFailure", - CompletionFailure.class.getClassLoader(), - new String[]{"pkg"}) != 0) - throw new Error(); - } - - public static boolean start(com.sun.javadoc.RootDoc root) { - ClassDoc[] classes = root.classes(); - if (classes.length != 1) - throw new Error("1 " + Arrays.asList(classes)); - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/completionFailure/pkg/A.java --- a/test/langtools/tools/javadoc/completionFailure/pkg/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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; - -public class A { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/completionFailure/pkg/B.java --- a/test/langtools/tools/javadoc/completionFailure/pkg/B.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg.A; - -public class B { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/dupOk/DupOk.java --- a/test/langtools/tools/javadoc/dupOk/DupOk.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4673477 - * @summary The first definition found for each class should be documented - * @author gafter - * @modules jdk.javadoc - */ - -import com.sun.javadoc.*; -import java.util.*; - -public class DupOk extends Doclet -{ - public static void main(String[] args) { - // run javadoc on package p - if (com.sun.tools.javadoc.Main. - execute("javadoc", "DupOk", DupOk.class.getClassLoader(), - new String[] - {"-sourcepath", - System.getProperty("test.src", ".") + java.io.File.separatorChar + "sp1" + - System.getProperty("path.separator") + - System.getProperty("test.src", ".") + java.io.File.separatorChar + "sp2", - "p" - }) != 0) - throw new Error(); - } - - public static boolean start(com.sun.javadoc.RootDoc root) { - ClassDoc[] classes = root.classes(); - if (classes.length != 2) - throw new Error("1 " + Arrays.asList(classes)); - for (int i=0; i - enum constants: - Thoreau - McLuhan - Pynchon - Mencken - Allen - Vidal - Occam - Groening - Juvenal - Eco - methods: - pkg1.QuotablePerson[] values() - QuotablePerson valueOf(String) diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/enum/enumType/pkg1/QuotablePerson.java --- a/test/langtools/tools/javadoc/enum/enumType/pkg1/QuotablePerson.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -/** - * Some people we love to quote. - */ -public enum QuotablePerson { - - /** "Beware of all enterprises that require new clothes." */ - Thoreau, - - /** - * "A point of view can be a dangerous luxury when substituted for - * insight and understanding." - */ - McLuhan, - - /** - * "If they can keep you asking the wrong questions, they don't have to - * worry about the answers." - */ - Pynchon, - - /** - * "For every problem, there is a solution that is simple, elegant, - * and wrong." - */ - Mencken, - - /** - * "Formerly unsolvable equations are dealt with by threats of reprisals." - */ - Allen, - - /** "It is not enough to succeed. Others must fail." */ - Vidal, - - /** "Entia non sunt multiplicanda praeter necessitatem." */ - Occam, - - /** - * "Love is a snowmobile racing across the tundra and then suddenly it - * flips over, pinning you underneath. At night, the ice weasels come." - */ - Groening, - - /** "Sed Quis custodiet ipsos custodes?" */ - Juvenal, - - /** - * "The list could surely go on, and there is nothing more wonderful - * than a list, instrument of wondrous hypotyposis." - */ - Eco -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericClass/Main.java --- a/test/langtools/tools/javadoc/generics/genericClass/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the contents of the ClassDoc of a generic class. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericClass/expected.out --- a/test/langtools/tools/javadoc/generics/genericClass/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -class pkg1.A - name: A / A / pkg1.A - type parameters: - T - superclass: - java.lang.Object - fields: - T t - pkg1.A at - pkg1.A as - constructors: - A() - methods: - void m1(T) - void m2(A) - void m3(A) diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericClass/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/genericClass/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class A { - public T t; - public A at; - public A as; - - public void m1(T t) {} - public void m2(A at) {} - public void m3(A as) {} -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInnerAndOuter/Main.java --- a/test/langtools/tools/javadoc/generics/genericInnerAndOuter/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the contents of the ClassDoc of - * a generic class with a generic inner class. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import java.util.Arrays; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - ClassDoc[] cds = root.classes(); - Arrays.sort(cds); - for (ClassDoc cd : cds) { - tester.printClass(cd); - tester.println(); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInnerAndOuter/expected.out --- a/test/langtools/tools/javadoc/generics/genericInnerAndOuter/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -class pkg1.O - name: O / O / pkg1.O - type parameters: - T - superclass: - java.lang.Object - constructors: - O() - -class pkg1.O.I - name: I / O.I / pkg1.O.I - type parameters: - S - nested in: - pkg1.O - superclass: - java.lang.Object - constructors: - I() - methods: - void m1(O.I) - -class pkg1.X - name: X / X / pkg1.X - type parameters: - T - superclass: - java.lang.Object - constructors: - X() - -class pkg1.X.Y - name: Y / X.Y / pkg1.X.Y - nested in: - pkg1.X - superclass: - java.lang.Object - constructors: - Y() - -class pkg1.X.Y.Z - name: Z / X.Y.Z / pkg1.X.Y.Z - type parameters: - S - nested in: - pkg1.X.Y - superclass: - java.lang.Object - constructors: - Z() - methods: - void m1(X.Y.Z) - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInnerAndOuter/pkg1/O.java --- a/test/langtools/tools/javadoc/generics/genericInnerAndOuter/pkg1/O.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class O { - public class I { - public void m1(O.I a) {} - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInnerAndOuter/pkg1/X.java --- a/test/langtools/tools/javadoc/generics/genericInnerAndOuter/pkg1/X.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class X { - public class Y { - public class Z { - public void m1(X.Y.Z a) {} - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInterface/Main.java --- a/test/langtools/tools/javadoc/generics/genericInterface/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the contents of the ClassDoc of a generic interface. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInterface/expected.out --- a/test/langtools/tools/javadoc/generics/genericInterface/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -interface pkg1.A - name: A / A / pkg1.A - type parameters: - T - methods: - void m1(T) diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericInterface/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/genericInterface/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public interface A { - void m1(T t); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericMethod/Main.java --- a/test/langtools/tools/javadoc/generics/genericMethod/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the reading of generic methods and constructors. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - for (ConstructorDoc c : cd.constructors()) - tester.printConstructor(c); - for (MethodDoc m : cd.methods()) - tester.printMethod(m); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericMethod/expected.out --- a/test/langtools/tools/javadoc/generics/genericMethod/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -constructor pkg1.A() - signature: () - () - type parameters: - T -method pkg1.A.m1(T) - signature: (T) - (T) - type parameters: - T - returns: - void -method pkg1.A.m2(T, U) - signature: (T, U) - (T, U) - type parameters: - T extends java.lang.Number - U - returns: - void diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericMethod/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/genericMethod/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class A { - public A() {} - public void m1(T t) {} - public void m2(T t, U u) {} -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericSuper/Main.java --- a/test/langtools/tools/javadoc/generics/genericSuper/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the contents of the ClassDoc of a generic class. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import java.util.Arrays; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = - new OldToolTester("Main", "pkg1", "-package"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - ClassDoc[] cds = root.classes(); - Arrays.sort(cds); - for (ClassDoc cd : cds) { - tester.printClass(cd); - tester.println(); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericSuper/expected.out --- a/test/langtools/tools/javadoc/generics/genericSuper/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -class pkg1.A - name: A / A / pkg1.A - type parameters: - V - W - superclass: - pkg1.S - interfaces: - pkg1.I - constructors: - A() - -interface pkg1.I - name: I / I / pkg1.I - type parameters: - R - -class pkg1.S - name: S / S / pkg1.S - type parameters: - T - U - superclass: - java.lang.Object - constructors: - S() - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/genericSuper/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/genericSuper/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -class S { -} - -interface I { -} - -public class A extends S implements I { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/supertypes/Main.java --- a/test/langtools/tools/javadoc/generics/supertypes/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4922918 - * @summary Check supertypes and superinterfaces of parameterized types. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import java.util.Comparator; -import java.util.Arrays; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - ClassDoc[] cds = root.classes(); - Arrays.sort(cds); - for (ClassDoc cd : cds) { - ParameterizedType arrayList = - cd.superclassType().asParameterizedType(); - tester.println(arrayList); - tester.println(); - - tester.println(arrayList.superclassType()); - Type[] interfaces = arrayList.interfaceTypes(); - // Sort interfaces by type name, for consistent output. - Arrays.sort(interfaces, - new Comparator() { - public int compare(Type t1, Type t2) { - String name1 = t1.qualifiedTypeName(); - String name2 = t2.qualifiedTypeName(); - return name1.compareTo(name2); - } - }); - for (Type t : interfaces) { - tester.println(t); - } - tester.println(); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/supertypes/expected.out --- a/test/langtools/tools/javadoc/generics/supertypes/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -java.util.ArrayList - -java.util.AbstractList -java.io.Serializable -java.lang.Cloneable -java.util.List -java.util.RandomAccess - -java.util.ArrayList - -java.util.AbstractList -java.io.Serializable -java.lang.Cloneable -java.util.List -java.util.RandomAccess - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/supertypes/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/supertypes/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -import java.util.ArrayList; - -public class A extends ArrayList { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/supertypes/pkg1/B.java --- a/test/langtools/tools/javadoc/generics/supertypes/pkg1/B.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -import java.util.ArrayList; - -public class B extends ArrayList { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/throwsGeneric/Main.java --- a/test/langtools/tools/javadoc/generics/throwsGeneric/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the reading of generic methods and constructors. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - for (MethodDoc m : cd.methods()) - tester.printMethod(m); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/throwsGeneric/expected.out --- a/test/langtools/tools/javadoc/generics/throwsGeneric/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -method pkg1.A.m1() - signature: () - () - throws: - T extends java.lang.Throwable - returns: - void -method pkg1.A.m2() - signature: () - () - type parameters: - U extends java.lang.Throwable - throws: - U extends java.lang.Throwable - returns: - void diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/throwsGeneric/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/throwsGeneric/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public interface A { - void m1() throws T; - void m2() throws U; -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamCycle/Main.java --- a/test/langtools/tools/javadoc/generics/tparamCycle/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Check a type parameter whose bound cycles back on itself. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - } - - public static boolean start(RootDoc root) { - ClassDoc cd = root.classes()[0]; - System.out.println("*** " + cd); - TypeVariable E = cd.typeParameters()[0]; - System.out.println("*** " + E); - Type bound = E.bounds()[0]; - System.out.println("*** " + bound); - - // Verify that we have an instantiation of Enum, and not - // the generic interface. - ParameterizedType enumE = (ParameterizedType)bound; - - if (enumE.asClassDoc() != cd) { - throw new Error("Type declaration and type use don't match up."); - } else { - return true; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamCycle/pkg1/LikeEnum.java --- a/test/langtools/tools/javadoc/generics/tparamCycle/pkg1/LikeEnum.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public interface LikeEnum> { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnMethod/Main.java --- a/test/langtools/tools/javadoc/generics/tparamTagOnMethod/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the reading of type parameter tags on methods. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - for (MethodDoc m : cd.methods()) { - tester.printMethod(m); - } - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnMethod/expected.out --- a/test/langtools/tools/javadoc/generics/tparamTagOnMethod/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -method pkg1.A.m1(T, U) - signature: (T, U) - (T, U) - @param the kind of thing - @param the other kind of thing - @param t the thing itself - @param u the other thing - type parameters: - T - U - returns: - void diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnMethod/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/tparamTagOnMethod/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public interface A { - /** - * @param the kind of thing - * @param the other kind of thing - * @param t the thing itself - * @param u the other thing - */ - public void m1(T t, U u); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnType/Main.java --- a/test/langtools/tools/javadoc/generics/tparamTagOnType/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the reading of a type parameter tag on an interface. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnType/expected.out --- a/test/langtools/tools/javadoc/generics/tparamTagOnType/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -interface pkg1.A - name: A / A / pkg1.A - type parameters: - T - @param the type parameter diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/tparamTagOnType/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/tparamTagOnType/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -/** - * @param the type parameter - */ -public interface A { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/wildcards/Main.java --- a/test/langtools/tools/javadoc/generics/wildcards/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 - * @summary Verify the contents of the ClassDoc of a generic class. - * @library ../../lib - * @modules jdk.javadoc - * @compile ../../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = new OldToolTester("Main", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/wildcards/expected.out --- a/test/langtools/tools/javadoc/generics/wildcards/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -class pkg1.A - name: A / A / pkg1.A - type parameters: - T - superclass: - java.lang.Object - fields: - pkg1.A f1 - pkg1.A f2 - pkg1.A f3 - constructors: - A() - methods: - void m1(A) - void m2(A) - void m3(A) diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/generics/wildcards/pkg1/A.java --- a/test/langtools/tools/javadoc/generics/wildcards/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -public class A { - public A f1; - public A f2; - public A f3; - - public void m1(A p1) {} - public void m2(A p2) {} - public void m3(A p3) {} -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/imports/I.java --- a/test/langtools/tools/javadoc/imports/I.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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. - */ - -// The following imported class is bogus, but should still be returned -// when inquired of. -import bo.o.o.o.Gus; - -public interface I { -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/imports/MissingImport.java --- a/test/langtools/tools/javadoc/imports/MissingImport.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 5012972 - * @summary ClassDoc.getImportedClasses should return a class even if - * it's not in the classpath. - * @modules jdk.javadoc - */ - -import com.sun.javadoc.*; - - -public class MissingImport extends Doclet { - - public static void main(String[] args) { - String thisFile = "" + - new java.io.File(System.getProperty("test.src", "."), - "I.java"); - - if (com.sun.tools.javadoc.Main.execute( - "javadoc", - "MissingImport", - MissingImport.class.getClassLoader(), - new String[] {thisFile}) != 0) - throw new Error("Javadoc encountered warnings or errors."); - } - - /* - * The world's simplest doclet. - */ - public static boolean start(RootDoc root) { - ClassDoc c = root.classNamed("I"); - ClassDoc[] imps = c.importedClasses(); - if (imps.length == 0 || - !imps[0].qualifiedName().equals("bo.o.o.o.Gus")) { - throw new Error("Import bo.o.o.o.Gus not found"); - } - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/lib/OldToolTester.java --- a/test/langtools/tools/javadoc/lib/OldToolTester.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 utility used to invoke and test the javadoc tool. - * - * @author Scott Seligman - */ - - -import java.io.*; -import java.util.*; -import com.sun.javadoc.*; - - -public class OldToolTester { - - protected final String TEST_SRC = System.getProperty("test.src", "."); - protected final String TEST_CLASSES = System.getProperty("test.classes", - "."); - private final String DEFAULT_ARGS[] = { - "-sourcepath", TEST_SRC, - }; - - private final File outputFile = new File(TEST_CLASSES, "testrun.out"); - private final File expectedOutputFile = new File(TEST_SRC, "expected.out"); -// private final File bootstrapMarkerFile = new File("bootstrap"); - - // True if we should "set expectations" by writing the expected output file - // rather than reading it and comparing. -// private final boolean bootstrap = bootstrapMarkerFile.isFile(); - - private String docletName; - private String[] args; - private Writer out = null; - - - /* - * Individual tests can extend this to create generics-aware doclets. - */ - public static abstract class Doclet extends com.sun.javadoc.Doclet { - public static LanguageVersion languageVersion() { - return LanguageVersion.JAVA_1_5; - } - } - - - public OldToolTester(String docletName) { - this(docletName, new String[0]); - } - - public OldToolTester(String docletName, String... additionalArgs) { - this.docletName = docletName; - - int len = DEFAULT_ARGS.length + additionalArgs.length; - args = new String[len]; - System.arraycopy(DEFAULT_ARGS, 0, args, 0, DEFAULT_ARGS.length); - System.arraycopy(additionalArgs, 0, args, DEFAULT_ARGS.length, - additionalArgs.length); - - try { - out = new BufferedWriter(new FileWriter(outputFile)); - } catch (IOException e) { - throw new Error("Could not open output file " + outputFile); - } - } - - public void run() throws IOException { - try { - if (com.sun.tools.javadoc.Main.execute("javadoc", - docletName, - getClass().getClassLoader(), - args) != 0) { - throw new Error("Javadoc errors encountered."); - } - System.out.println("--> Output written to " + outputFile); - } finally { - out.close(); - } - } - - /* - * Compare output of test run to expected output. - * Throw an Error if they don't match. - */ - public void verify() throws IOException { - BufferedReader thisRun = - new BufferedReader(new FileReader(outputFile)); - BufferedReader expected = - new BufferedReader(new FileReader(expectedOutputFile)); - - for (int lineNum = 1; true; lineNum++) { - String line1 = thisRun.readLine(); - String line2 = expected.readLine(); - if (line1 == null && line2 == null) { - return; // EOF with all lines matching - } - if (line1 == null || !line1.equals(line2)) { - throw new Error(outputFile + ":" + lineNum + - ": output doesn't match"); - } - } - } - - - public void println(Object o) throws IOException { - prln(0, o); - } - - public void println() throws IOException { - prln(); - } - - public void printPackage(PackageDoc p) throws IOException { - prPackage(0, p); - } - - public void printClass(ClassDoc cd) throws IOException { - if (cd.isAnnotationType()) - printAnnotationType((AnnotationTypeDoc)cd); - else - prClass(0, cd); - } - - public void printAnnotationType(AnnotationTypeDoc at) throws IOException { - prAnnotationType(0, at); - } - - public void printField(FieldDoc f) throws IOException { - prField(0, f); - } - - public void printParameter(Parameter p) throws IOException { - prParameter(0, p); - } - - public void printMethod(MethodDoc m) throws IOException { - prln(0, "method " + m); - prMethod(0, m); - } - - public void printAnnotationTypeElement(AnnotationTypeElementDoc e) - throws IOException { - prln(0, "element " + e); - prMethod(0, e); - } - - public void printConstructor(ConstructorDoc c) throws IOException { - prln(0, "constructor " + c); - prExecutable(0, c); - } - - - private void prPackage(int off, PackageDoc p) throws IOException { - prln(off, "package " + p); - prAnnotations(off + 2, p.annotations()); - } - - private void prClass(int off, ClassDoc cd) throws IOException { - prln(off, - (cd.isInterface() ? "interface" : cd.isEnum() ? "enum" : "class") - + " " + cd); - prln(off + 2, "name: " + cd.simpleTypeName() + " / " + - cd.typeName() + " / " + cd.qualifiedTypeName()); - prAnnotations(off + 2, cd.annotations()); - prLabel(off + 2, "type parameters"); - for (Type t : cd.typeParameters()) - prln(off + 4, t); - prParamTags(off + 2, cd.typeParamTags()); - prLabel(off + 2, "nested in"); - prln(off + 4, cd.containingClass()); - prLabel(off + 2, "superclass"); - prln(off + 4, cd.superclassType()); - prLabel(off + 2, "interfaces"); - Type[] ts = cd.interfaceTypes(); - Arrays.sort(ts); - for (Type t : ts) - prln(off + 4, t); - prLabel(off + 2, "enum constants"); - for (FieldDoc f : cd.enumConstants()) - prln(off + 4, f.name()); - prLabel(off + 2, "fields"); - for (FieldDoc f : cd.fields()) - prln(off + 4, f.type() + " " + f.name()); - prLabel(off + 2, "constructors"); - for (ConstructorDoc c : cd.constructors()) - prln(off + 4, c.name() + c.flatSignature()); - prLabel(off + 2, "methods"); - for (MethodDoc m : cd.methods()) - prln(off + 4, typeUseString(m.returnType()) + " " + - m.name() + m.flatSignature()); - } - - private void prAnnotationType(int off, AnnotationTypeDoc at) - throws IOException { - prln(off, "@interface " + at); - prAnnotations(off + 2, at.annotations()); - prLabel(off + 2, "elements"); - for (AnnotationTypeElementDoc e : at.elements()) { - String def = (e.defaultValue() == null) - ? "" - : " default " + e.defaultValue(); - prln(off + 4, typeUseString(e.returnType()) + " " + e.name() + - e.flatSignature() + def); - } - } - - private void prField(int off, FieldDoc f) throws IOException { - prln(off, "field " + typeUseString(f.type()) + " " + f.name()); - prAnnotations(off + 2, f.annotations()); - } - - private void prParameter(int off, Parameter p) throws IOException { - prln(off, "parameter " + p); - prAnnotations(off + 2, p.annotations()); - } - - private void prMethod(int off, MethodDoc m) throws IOException { - prExecutable(off, m); - prLabel(off + 2, "returns"); - prln(off + 4, typeUseString(m.returnType())); - prLabel(off + 2, "overridden type"); - prln(off + 4, m.overriddenType()); - } - - private void prExecutable(int off, ExecutableMemberDoc m) - throws IOException { - if (!m.isAnnotationTypeElement()) { - prln(off + 2, "signature: " + m.flatSignature()); - prln(off + 2, " " + m.signature()); - } - prAnnotations(off + 2, m.annotations()); - prParamTags(off + 2, m.typeParamTags()); - prParamTags(off + 2, m.paramTags()); - prLabel(off + 2, "type parameters"); - for (Type t : m.typeParameters()) - prln(off + 4, t); - prLabel(off + 2, "throws"); - Type[] ts = m.thrownExceptionTypes(); - Arrays.sort(ts); - for (Type t : ts) - prln(off + 4, t); - } - - private void prAnnotations(int off, AnnotationDesc[] as) - throws IOException { - prLabel(off, "annotations"); - for (AnnotationDesc a : as) - prln(off + 2, a.toString()); - } - - private void prParamTags(int off, ParamTag tags[]) throws IOException { - for (ParamTag tag : tags) - prParamTag(off, tag); - } - - private void prParamTag(int off, ParamTag tag) throws IOException { - String name = tag.parameterName(); - if (tag.isTypeParameter()) name = "<" + name + ">"; - prln(off, "@param " + name + " " + tag.parameterComment()); - } - - - private String typeUseString(Type t) { - return (t instanceof ClassDoc || t instanceof TypeVariable) - ? t.typeName() - : t.toString(); - } - - - // Labels queued for possible printing. Innermost is first in list. - List labels = new ArrayList(); - - // Print label if its section is nonempty. - void prLabel(int off, String s) { - while (!labels.isEmpty() && labels.get(0).off >= off) - labels.remove(0); - labels.add(0, new Line(off, s)); - } - - // Print queued labels with offsets less than "off". - void popLabels(int off) throws IOException { - while (!labels.isEmpty()) { - Line label = labels.remove(0); - if (label.off < off) - prln(label.off, label.o + ":"); - } - } - - // Print "o" at given offset. - void pr(int off, Object o) throws IOException { - popLabels(off); - for (int i = 0; i < off; i++) - out.write(' '); - if (o != null) - out.write(o.toString()); - } - - // Print "o" (if non-null) at given offset, then newline. - void prln(int off, Object o) throws IOException { - if (o != null) { - pr(off, o); - prln(); - } - } - - // Print newline. - void prln() throws IOException { - out.write('\n'); // don't want platform-dependent separator - } - - - static class Line { - int off; - Object o; - Line(int off, Object o) { this.off = off; this.o = o; } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/lib/ToyDoclet.java --- a/test/langtools/tools/javadoc/lib/ToyDoclet.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.util.Arrays; - -import com.sun.javadoc.ClassDoc; -import com.sun.javadoc.PackageDoc; -import com.sun.javadoc.ProgramElementDoc; -import com.sun.javadoc.RootDoc; - -@SuppressWarnings("deprecation") -public class ToyDoclet { - - public static boolean start(RootDoc root) { - String whoami = "I am a toy doclet"; - root.printNotice("Notice: " + whoami); - boolean status = false; - for (ClassDoc cls : root.classes()) { - if (!status) status = true; - root.printNotice("Classes: " + cls); - printClassMembers(root, cls); - } - for (ClassDoc cls : root.specifiedClasses()) { - if (!status) status = true; - root.printNotice("Specified-classes: " + cls); - printClassMembers(root, cls); - } - for (PackageDoc pkg : root.specifiedPackages()) { - if (!status) status = true; - root.printNotice("Specified-packages: " + pkg); - } - return status; - } - - static void printClassMembers(RootDoc root, ClassDoc cls) { - root.printNotice("Members for: " + cls); - root.printNotice(" extends " + Arrays.asList(cls.superclass())); - root.printNotice(" Fields: "); - printMembers(root, cls.fields()); - root.printNotice(" Constructor: "); - printMembers(root, cls.constructors()); - root.printNotice(" Method: "); - printMembers(root, cls.methods()); - if (cls.superclass() != null && !cls.superclassType().toString().equals("java.lang.Object")) - printClassMembers(root, cls.superclass()); - } - - static void printMembers(RootDoc root, ProgramElementDoc[] pgmDocs) { - for (ProgramElementDoc pgmDoc : pgmDocs) { - root.printNotice(" " + pgmDoc + ", Comments: " + pgmDoc.getRawCommentText()); - } - } - - public static int optionLength(String option) { - System.out.println("option: " + option); - return 0; // all options are unsupported - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/nestedClass/NestedClass.java --- a/test/langtools/tools/javadoc/nestedClass/NestedClass.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4694497 - * @summary BDoclet API: Bad ClassDoc for nested classes when built from .class files - * @author gafter - * @modules jdk.javadoc - * @compile NestedClass.java NestedClassB.java - * @run main NestedClass - */ - -import com.sun.javadoc.*; -import java.util.*; - -public class NestedClass extends Doclet -{ - public NestedClassB b; - - public static void main(String[] args) { - if (com.sun.tools.javadoc.Main. - execute("javadoc", "NestedClass", NestedClass.class.getClassLoader(), - new String[] {System.getProperty("test.src", ".") + - java.io.File.separatorChar + - "NestedClass.java"}) - != 0) - throw new Error(); - } - - public static boolean start(com.sun.javadoc.RootDoc root) { - ClassDoc[] classes = root.classes(); - if (classes.length != 1) - throw new Error("1 " + Arrays.asList(classes)); - ClassDoc self = classes[0]; - FieldDoc B = self.fields()[0]; - ClassDoc[] Binner = B.type().asClassDoc().innerClasses(); - return Binner.length == 1; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/nestedClass/NestedClassB.java --- a/test/langtools/tools/javadoc/nestedClass/NestedClassB.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 NestedClassB { - public static class Inner {} -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/nonConstExprs/Test.java --- a/test/langtools/tools/javadoc/nonConstExprs/Test.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 8010310 - * @summary Error processing sources with -private - * @modules jdk.javadoc - */ - -import java.io.File; - -public class Test { - public static void main(String... args) throws Exception { - File testSrc = new File(System.getProperty("test.src")); - String[] jdoc_args = { - new File(testSrc, Test.class.getSimpleName() + ".java").getPath() - }; - int rc = com.sun.tools.javadoc.Main.execute(jdoc_args); - if (rc != 0) - throw new Exception("unexpected return code from javadoc: " + rc); - } - - static int array[] = { 1, 2, 3}; - static int method(int p) { return p; } - static int value = 0; - - public int not_static_not_final = 1; - public static int static_not_final = 2; - public final int not_static_final = 3; - public static final int static_final = 4; - - public static final int array_index = array[0]; - public static final int method_call = method(0); - public static final int inner_class = new Test() { }.method(0); - public static final int new_class = new Test().method(0); - public static final int pre_inc = ++value; - public static final int pre_dec = --value; - public static final int post_inc = value++; - public static final int post_dec = value--; -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/outputRedirect/Test.java --- a/test/langtools/tools/javadoc/outputRedirect/Test.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* @test - * @bug 4587487 - * @summary com.sun.tools.javadoc.Main.execute ignores PrintWriters - * @author gafter - * @modules jdk.javadoc - * @compile p/OutputRedirect.java - * @run main p.OutputRedirect - */ - -// jtreg description-only file diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/outputRedirect/p/OutputRedirect.java --- a/test/langtools/tools/javadoc/outputRedirect/p/OutputRedirect.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 p; - -import java.io.*; -import com.sun.tools.javadoc.Main; - -public class OutputRedirect { - - public static void main(String[] args) { - PrintStream originalOutput = System.out; - try { - doTest(); - } finally { - // restore things - System.setOut(originalOutput); - } - } - - static void doTest() { - ByteArrayOutputStream redirectedOutput = new ByteArrayOutputStream(); - PrintStream originalOutput = System.out; - - // redirect System.out to a buffer - System.setOut(new PrintStream(redirectedOutput)); - - PrintWriter sink = new PrintWriter(new ByteArrayOutputStream()); - - // execute javadoc - int result = Main.execute("javadoc", sink, sink, sink, - "com.sun.tools.doclets.standard.Standard", - new String[] {"p"} - ); - - - // test whether javadoc did any output to System.out - if (redirectedOutput.toByteArray().length > 0) { - originalOutput.println("Test failed; here's what javadoc wrote on its standard output:"); - originalOutput.println(redirectedOutput.toString()); - throw new Error("javadoc output wasn\'t properly redirected"); - } else if (result != 0) { - throw new Error("javadoc run failed"); - } else { - originalOutput.println("OK, good"); - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/parser/7091528/T7091528.java --- a/test/langtools/tools/javadoc/parser/7091528/T7091528.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 7091528 8029145 8037484 - * @summary ensures javadoc parses unique source files and ignores all class files - * @modules jdk.javadoc/com.sun.tools.doclets.standard - * @library /tools/javadoc/lib - * @build ToyDoclet - * @compile p/C1.java p/q/C2.java - * @run main T7091528 - */ - -import java.io.File; -import java.io.PrintWriter; -import java.io.StringWriter; - -public class T7091528 { - public static void main(String... args) { - new T7091528().run(); - } - void run() { - File testSrc = new File(System.getProperty("test.src")); - File testClasses = new File(System.getProperty("test.classes")); - // 7091528, tests if class files are being ignored - runTest( - "-sourcepath", testClasses + File.pathSeparator + testSrc, - "-subpackages", - "p"); - // 8029145, tests if unique source files are parsed - runTest( - "-sourcepath", testSrc.getAbsolutePath(), - "-subpackages", - "p:p.q"); - File testPkgDir = new File(testSrc, "p"); - File testFile = new File(testPkgDir, "C3.java"); - runTest( - "-sourcepath", testSrc.getAbsolutePath(), - testFile.getAbsolutePath(), - "p"); - runTest( - "-classpath", testSrc.getAbsolutePath(), - testFile.getAbsolutePath(), - "p"); - - } - void runTest(String... args) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - int rc = com.sun.tools.javadoc.Main.execute("example", pw, pw, pw, - "ToyDoclet", getClass().getClassLoader(), args); - pw.close(); - - String out = sw.toString(); - if (!out.isEmpty()) { - System.err.println(out); - } - - if (rc != 0) - throw new Error("javadoc failed: exit code = " + rc); - - if (out.matches("(?s).*p/[^ ]+\\.class.*")) - throw new Error("reading .class files"); - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/parser/7091528/p/C1.java --- a/test/langtools/tools/javadoc/parser/7091528/p/C1.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 p1; - -/** This is class C1. */ -public class C1 { } - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/parser/7091528/p/C3.java --- a/test/langtools/tools/javadoc/parser/7091528/p/C3.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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. - */ - -/** This is class C3, and no package for me please */ -public class C3 {} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/parser/7091528/p/q/C2.java --- a/test/langtools/tools/javadoc/parser/7091528/p/q/C2.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 p.q; - -/** This is class p.q.C2. */ -public class C2 { } - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/sourceOnly/Test.java --- a/test/langtools/tools/javadoc/sourceOnly/Test.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4548768 8034258 - * @summary Javadoc in JDK 1.4 uses classpath and not just source dir - * @author gafter - * @modules jdk.javadoc - * @compile p/SourceOnly.java p/NonSource.jasm - * @run main p.SourceOnly - */ - -// this file is just a dummy to get the javadoc started. -// -// NOTE: this test only seems to work in separate JVM mode for -// reasons having something to do with javing tools.jar -// on the classpath. Until that is sorted out, these tests -// must be run in separate VM mode. diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/sourceOnly/p/NonSource.jasm --- a/test/langtools/tools/javadoc/sourceOnly/p/NonSource.jasm Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 p; - -super public class NonSource - version 46:0 -{ - public Method "":"()V" - stack 1 locals 1 - { - aload_0; - invokespecial Method java/lang/Object."":"()V"; - return; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/sourceOnly/p/SourceOnly.java --- a/test/langtools/tools/javadoc/sourceOnly/p/SourceOnly.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 p; - -/** Test that when running javadoc on a package, we only get - * documentation for those classes for which source was provided. - */ -public class SourceOnly extends com.sun.javadoc.Doclet { - NonSource dependency; // force a compilation error if not on classpath. - - public static void main(String[] args) { - // run javadoc on package p - int result = com.sun.tools.javadoc.Main. - execute("javadoc", "p.SourceOnly", SourceOnly.class.getClassLoader(), new String[] {"p"}); - if (result != 0) - throw new Error(); - } - - public static boolean start(com.sun.javadoc.RootDoc root) { - if (root.classes().length != 1) - throw new Error("wrong set of classes documented: " + java.util.Arrays.asList(root.classes())); - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/sourceOption/SourceOption.java --- a/test/langtools/tools/javadoc/sourceOption/SourceOption.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 6507179 - * @summary Ensure that "-source" option isn't ignored. - * @author Scott Seligman - * @modules jdk.javadoc - * @run main/fail SourceOption 7 - * @run main SourceOption 9 - * @run main SourceOption - */ - -/* - * In order to test whether or not the -source option is working - * correctly, this test tries to parse source code that contains - * a feature that is not available in at least one of the currently - * supported previous versions. - * - * Parsing such code should be expected to fail; if the action - * passes, that means the -source option is (incorrectly) ineffective. - * - * Additional actions are performed to ensure that the source - * provided is valid for the current release of the JDK. - * - * As support for older versions of the platform are dropped, the - * source code (currently p/LambdaConstructTest.java) will need to - * be updated with a more recent feature. - */ - -import com.sun.javadoc.*; - -public class SourceOption extends Doclet { - - public static void main(String[] args) { - String[] params; - if ((args == null) || (args.length==0)) { - params = new String[]{"p"}; - System.out.println("NOTE : -source not provided, default taken"); - } else { - params = new String[]{"-source", args[0], "p"}; - System.out.println("NOTE : -source will be: " + args[0]); - } - - if (com.sun.tools.javadoc.Main.execute( - "javadoc", - "SourceOption", - SourceOption.class.getClassLoader(), - params) != 0) - throw new Error("Javadoc encountered warnings or errors."); - - } - - public static boolean start(RootDoc root) { - root.classes(); // force parser into action - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/sourceOption/p/LambdaConstructTest.java --- a/test/langtools/tools/javadoc/sourceOption/p/LambdaConstructTest.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 LambdaConstructTest { - public static void main(String[] args) { - - System.out.println("=== LambdaConstructTest ==="); - - // Lambda Runnable - Runnable lambda = () -> System.out.println("it's a Lambda world!"); - - // Run it! - lambda.run(); - - } -} - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/subpackageIgnore/SubpackageIgnore.java --- a/test/langtools/tools/javadoc/subpackageIgnore/SubpackageIgnore.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4773013 - * @summary When hunting subpackages, silently ignore any directory name that - * can't be part of a subpackage. - * @modules jdk.javadoc - */ - -import com.sun.javadoc.*; - -public class SubpackageIgnore extends Doclet { - - public static void main(String[] args) { - if (com.sun.tools.javadoc.Main.execute( - "javadoc", - "SubpackageIgnore", - SubpackageIgnore.class.getClassLoader(), - new String[] {"-Xwerror", - "-sourcepath", - System.getProperty("test.src", "."), - "-subpackages", - "pkg1"}) != 0) - throw new Error("Javadoc encountered warnings or errors."); - } - - /* - * The world's simplest doclet. - */ - public static boolean start(RootDoc root) { - return true; - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/subpackageIgnore/pkg1/not-subpkg/SomeJavaFile.java --- a/test/langtools/tools/javadoc/subpackageIgnore/pkg1/not-subpkg/SomeJavaFile.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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. - */ - diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/varArgs/Main.java --- a/test/langtools/tools/javadoc/varArgs/Main.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 4421066 5006659 - * @summary Verify the contents of a ClassDoc containing a varArgs method. - * Verify that see/link tags can use "..." notation. - * @library ../lib - * @modules jdk.javadoc - * @compile ../lib/OldToolTester.java Main.java - * @run main Main - */ - -import java.io.IOException; -import com.sun.javadoc.*; - -public class Main extends OldToolTester.Doclet { - - private static final OldToolTester tester = - new OldToolTester("Main", "-Xwerror", "pkg1"); - - public static void main(String[] args) throws IOException { - tester.run(); - tester.verify(); - } - - public static boolean start(RootDoc root) { - try { - for (ClassDoc cd : root.classes()) { - tester.printClass(cd); - - for (SeeTag tag : cd.seeTags()) { - if (tag.referencedMember() != cd.methods()[0]) { - throw new Error("5006659: @see tag meets varArgs"); - } - } - } - - return true; - } catch (IOException e) { - return false; - } - } -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/varArgs/expected.out --- a/test/langtools/tools/javadoc/varArgs/expected.out Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -interface pkg1.A - name: A / A / pkg1.A - methods: - void m1(int, String...) diff -r 30695f27d7ea -r 7a45c67e73d0 test/langtools/tools/javadoc/varArgs/pkg1/A.java --- a/test/langtools/tools/javadoc/varArgs/pkg1/A.java Fri Feb 22 17:03:09 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along 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 pkg1; - -/** - * Interface A. - * - * @see #m1(int, String[]) - * @see #m1(int, String...) - */ -public interface A { - void m1(int i, String... ss); -} diff -r 30695f27d7ea -r 7a45c67e73d0 test/lib/jdk/test/lib/jfr/EventNames.java --- a/test/lib/jdk/test/lib/jfr/EventNames.java Fri Feb 22 17:03:09 2019 +0000 +++ b/test/lib/jdk/test/lib/jfr/EventNames.java Fri Feb 22 20:36:42 2019 +0000 @@ -66,7 +66,6 @@ public final static String ClassUnload = PREFIX + "ClassUnload"; public final static String SafepointBegin = PREFIX + "SafepointBegin"; public final static String SafepointStateSynchronization = PREFIX + "SafepointStateSynchronization"; - public final static String SafepointWaitBlocked = PREFIX + "SafepointWaitBlocked"; public final static String SafepointCleanup = PREFIX + "SafepointCleanup"; public final static String SafepointCleanupTask = PREFIX + "SafepointCleanupTask"; public final static String SafepointEnd = PREFIX + "SafepointEnd"; diff -r 30695f27d7ea -r 7a45c67e73d0 test/micro/org/openjdk/bench/java/nio/CharBuffers.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/micro/org/openjdk/bench/java/nio/CharBuffers.java Fri Feb 22 20:36:42 2019 +0000 @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute 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 org.openjdk.bench.java.nio; + +import java.nio.CharBuffer; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Level; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Param; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.Setup; +import org.openjdk.jmh.annotations.State; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +@State(Scope.Thread) +public class CharBuffers { + + @Param({"2", "256", "16384"}) + public int numChars; + + public String str; + public CharBuffer buf; + + @Setup(Level.Iteration) + public void createString() { + char[] c = new char[numChars]; + Arrays.fill(c, 'X'); + str = String.valueOf(c); + buf = CharBuffer.allocate(numChars); + } + + @Benchmark + public CharBuffer putString() { + buf.clear(); + return buf.put(str); + } + +} diff -r 30695f27d7ea -r 7a45c67e73d0 test/nashorn/TEST.ROOT --- a/test/nashorn/TEST.ROOT Fri Feb 22 17:03:09 2019 +0000 +++ b/test/nashorn/TEST.ROOT Fri Feb 22 20:36:42 2019 +0000 @@ -8,7 +8,7 @@ groups=TEST.groups # Minimum jtreg version -requiredVersion=4.2 b13 +requiredVersion=4.2 b14 # Use new module options useNewOptions=true