diff --git a/.hgtags b/.hgtags index 9863b694071..36ba8ab267f 100644 --- a/.hgtags +++ b/.hgtags @@ -255,3 +255,4 @@ efe7dbc6088691757404e0c8745f894e3ca9c022 jdk9-b09 8c0bdeecd7c0f9ce3f3762a51991f755cb3a972c jdk9-b10 0809c9a4d36e6291f1c4384604c4bbf29e975722 jdk9-b11 0d1f816217dce5e72187f167cc1816080cbeb453 jdk9-b12 +1a30593dcb9802faec3b6edb24d86ca088594e4e jdk9-b13 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index bfc2b48db19..b370baabdcc 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -255,3 +255,5 @@ db045d8faa0924b7378102d24a1a0d850c1e3834 jdk9-b08 fa13f2b926f8426876ec03e7903f3ee0ee150f2e jdk9-b10 ab55a18a95e1990a588929d5d29db3eb9985fea0 jdk9-b11 59f6350295f9681fe5956d8bc889bf341914c6cb jdk9-b12 +5800456add07e1a68170a229fb5e27376f8875e5 jdk9-b13 +4e3aa9723e9972623e3dafc321b368e7db7e9b3b jdk9-b14 diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4 index ae679a9d469..6cd88e8d394 100644 --- a/common/autoconf/boot-jdk.m4 +++ b/common/autoconf/boot-jdk.m4 @@ -331,8 +331,8 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK], # Finally, set some other options... - # When compiling code to be executed by the Boot JDK, force jdk7 compatibility. - BOOT_JDK_SOURCETARGET="-source 7 -target 7" + # When compiling code to be executed by the Boot JDK, force jdk8 compatibility. + BOOT_JDK_SOURCETARGET="-source 8 -target 8" AC_SUBST(BOOT_JDK_SOURCETARGET) AC_SUBST(JAVAC_FLAGS) ]) diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index a146145de81..86905690fb7 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -4253,7 +4253,7 @@ TOOLCHAIN_DESCRIPTION_xlc="IBM XL C/C++" #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1398861894 +DATE_WHEN_GENERATED=1399969244 ############################################################################### # @@ -26014,8 +26014,8 @@ $as_echo "$tool_specified" >&6; } # Finally, set some other options... - # When compiling code to be executed by the Boot JDK, force jdk7 compatibility. - BOOT_JDK_SOURCETARGET="-source 7 -target 7" + # When compiling code to be executed by the Boot JDK, force jdk8 compatibility. + BOOT_JDK_SOURCETARGET="-source 8 -target 8" diff --git a/common/bin/hgforest.sh b/common/bin/hgforest.sh index 04e7814802b..e7fbd1fe13f 100644 --- a/common/bin/hgforest.sh +++ b/common/bin/hgforest.sh @@ -1,5 +1,4 @@ #!/bin/sh - # # Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -23,25 +22,40 @@ # questions. # -# Shell script for a fast parallel forest command +# Shell script for a fast parallel forest/trees command -global_opts="" -status_output="/dev/stdout" -qflag="false" -vflag="false" -sflag="false" +usage() { + echo "usage: $0 [-h|--help] [-q|--quiet] [-v|--verbose] [-s|--sequential] [--] [commands...]" > ${status_output} + echo "Environment variables which modify behaviour:" + echo " HGFOREST_QUIET : (boolean) If 'true' then standard output is redirected to /dev/null" + echo " HGFOREST_VERBOSE : (boolean) If 'true' then Mercurial asked to produce verbose output" + echo " HGFOREST_SEQUENTIAL : (boolean) If 'true' then repos are processed sequentially. Disables concurrency" + echo " HGFOREST_GLOBALOPTS : (string, must begin with space) Additional Mercurial global options" + echo " HGFOREST_REDIRECT : (file path) Redirect standard output to specified file" + echo " HGFOREST_FIFOS : (boolean) Default behaviour for FIFO detection. Does not override FIFOs disabled" + echo " HGFOREST_CONCURRENCY: (positive integer) Number of repos to process concurrently" + echo " HGFOREST_DEBUG : (boolean) If 'true' then temp files are retained" + exit 1 +} + +global_opts="${HGFOREST_GLOBALOPTS:-}" +status_output="${HGFOREST_REDIRECT:-/dev/stdout}" +qflag="${HGFOREST_QUIET:-false}" +vflag="${HGFOREST_VERBOSE:-false}" +sflag="${HGFOREST_SEQUENTIAL:-false}" while [ $# -gt 0 ] do case $1 in + -h | --help ) + usage + ;; + -q | --quiet ) qflag="true" - global_opts="${global_opts} -q" - status_output="/dev/null" ;; -v | --verbose ) vflag="true" - global_opts="${global_opts} -v" ;; -s | --sequential ) @@ -63,39 +77,60 @@ do shift done +# silence standard output? +if [ ${qflag} = "true" ] ; then + global_opts="${global_opts} -q" + status_output="/dev/null" +fi -command="$1"; shift -command_args="$@" +# verbose output? +if [ ${vflag} = "true" ] ; then + global_opts="${global_opts} -v" +fi -usage() { - echo "usage: $0 [-q|--quiet] [-v|--verbose] [-s|--sequential] [--] [commands...]" > ${status_output} - exit 1 -} - -if [ "x" = "x$command" ] ; then +# Make sure we have a command. +if [ $# -lt 1 -o -z "${1:-}" ] ; then echo "ERROR: No command to hg supplied!" usage fi -# Check if we can use fifos for monitoring sub-process completion. -on_windows=`uname -s | egrep -ic -e 'cygwin|msys'` -if [ ${on_windows} = "1" ]; then - # cygwin has (2014-04-18) broken (single writer only) FIFOs - # msys has (2014-04-18) no FIFOs. - have_fifos="false" -else - have_fifos="true" -fi +command="$1"; shift +command_args="${@:-}" # Clean out the temporary directory that stores the pid files. tmp=/tmp/forest.$$ rm -f -r ${tmp} mkdir -p ${tmp} + +if [ "${HGFOREST_DEBUG:-false}" = "true" ] ; then + echo "DEBUG: temp files are in: ${tmp}" +fi + +# Check if we can use fifos for monitoring sub-process completion. +echo "1" > ${tmp}/read +while_subshell=1 +while read line; do + while_subshell=0 + break; +done < ${tmp}/read +rm ${tmp}/read + +on_windows=`uname -s | egrep -ic -e 'cygwin|msys'` + +if [ ${while_subshell} = "1" -o ${on_windows} = "1" ]; then + # cygwin has (2014-04-18) broken (single writer only) FIFOs + # msys has (2014-04-18) no FIFOs. + # older shells create a sub-shell for redirect to while + have_fifos="false" +else + have_fifos="${HGFOREST_FIFOS:-true}" +fi + safe_interrupt () { if [ -d ${tmp} ]; then if [ "`ls ${tmp}/*.pid`" != "" ]; then - echo "Waiting for processes ( `cat ${tmp}/*.pid | tr '\n' ' '`) to terminate nicely!" > ${status_output} + echo "Waiting for processes ( `cat ${tmp}/.*.pid ${tmp}/*.pid 2> /dev/null | tr '\n' ' '`) to terminate nicely!" > ${status_output} sleep 1 # Pipe stderr to dev/null to silence kill, that complains when trying to kill # a subprocess that has already exited. @@ -110,10 +145,12 @@ safe_interrupt () { nice_exit () { if [ -d ${tmp} ]; then - if [ "`ls ${tmp}`" != "" ]; then + if [ "`ls -A ${tmp} 2> /dev/null`" != "" ]; then wait fi - rm -f -r ${tmp} + if [ "${HGFOREST_DEBUG:-false}" != "true" ] ; then + rm -f -r ${tmp} + fi fi } @@ -128,17 +165,20 @@ pull_default="" repos="" repos_extra="" if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone" ] ; then + # we must be a clone if [ ! -f .hg/hgrc ] ; then echo "ERROR: Need initial repository to use this script" > ${status_output} exit 1 fi + # the clone must know where it came from (have a default pull path). pull_default=`hg paths default` if [ "${pull_default}" = "" ] ; then echo "ERROR: Need initial clone with 'hg paths default' defined" > ${status_output} exit 1 fi + # determine which sub repos need to be cloned. for i in ${subrepos} ; do if [ ! -f ${i}/.hg/hgrc ] ; then repos="${repos} ${i}" @@ -147,12 +187,15 @@ if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone pull_default_tail=`echo ${pull_default} | sed -e 's@^.*://[^/]*/\(.*\)@\1@'` - if [ "${command_args}" != "" ] ; then + if [ -n "${command_args}" ] ; then + # if there is an "extra sources" path then reparent "extra" repos to that path if [ "x${pull_default}" = "x${pull_default_tail}" ] ; then echo "ERROR: Need initial clone from non-local source" > ${status_output} exit 1 fi pull_extra="${command_args}/${pull_default_tail}" + + # determine which extra subrepos need to be cloned. for i in ${subrepos_extra} ; do if [ ! -f ${i}/.hg/hgrc ] ; then repos_extra="${repos_extra} ${i}" @@ -160,7 +203,7 @@ if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone done else if [ "x${pull_default}" = "x${pull_default_tail}" ] ; then - # local source repo. Copy the extras ones that exist there. + # local source repo. Clone the "extra" subrepos that exist there. for i in ${subrepos_extra} ; do if [ -f ${pull_default}/${i}/.hg/hgrc -a ! -f ${i}/.hg/hgrc ] ; then # sub-repo there in source but not here @@ -169,13 +212,17 @@ if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone done fi fi - at_a_time=2 + # Any repos to deal with? if [ "${repos}" = "" -a "${repos_extra}" = "" ] ; then echo "No repositories to process." > ${status_output} exit fi + + # Repos to process concurrently. Clone does better with low concurrency. + at_a_time="${HGFOREST_CONCURRENCY:-2}" else + # Process command for all of the present repos for i in . ${subrepos} ${subrepos_extra} ; do if [ -d ${i}/.hg ] ; then repos="${repos} ${i}" @@ -189,6 +236,7 @@ else fi # any of the repos locked? + locked="" for i in ${repos} ; do if [ -h ${i}/.hg/store/lock -o -f ${i}/.hg/store/lock ] ; then locked="${i} ${locked}" @@ -198,34 +246,39 @@ else echo "ERROR: These repositories are locked: ${locked}" > ${status_output} exit 1 fi - at_a_time=8 + + # Repos to process concurrently. + at_a_time="${HGFOREST_CONCURRENCY:-8}" fi # Echo out what repositories we do a command on. echo "# Repositories: ${repos} ${repos_extra}" > ${status_output} if [ "${command}" = "serve" ] ; then - # "serve" is run for all the repos. + # "serve" is run for all the repos as one command. ( ( + cwd=`pwd` + serving=`basename ${cwd}` ( echo "[web]" - echo "description = $(basename $(pwd))" + echo "description = ${serving}" echo "allow_push = *" echo "push_ssl = False" echo "[paths]" - for i in ${repos} ${repos_extra} ; do + for i in ${repos} ; do if [ "${i}" != "." ] ; then - echo "/$(basename $(pwd))/${i} = ${i}" + echo "/${serving}/${i} = ${i}" else - echo "/$(basename $(pwd)) = $(pwd)" + echo "/${serving} = ${cwd}" fi done ) > ${tmp}/serve.web-conf - echo "serving root repo $(basename $(pwd))" + echo "serving root repo ${serving}" > ${status_output} + echo "hg${global_opts} serve" > ${status_output} (PYTHONUNBUFFERED=true hg${global_opts} serve -A ${status_output} -E ${status_output} --pid-file ${tmp}/serve.pid --web-conf ${tmp}/serve.web-conf; echo "$?" > ${tmp}/serve.pid.rc ) 2>&1 & ) 2>&1 | sed -e "s@^@serve: @" > ${status_output} ) & @@ -234,81 +287,93 @@ else # n is the number of subprocess started or which might still be running. n=0 - if [ $have_fifos = "true" ]; then + if [ ${have_fifos} = "true" ]; then # if we have fifos use them to detect command completion. mkfifo ${tmp}/fifo exec 3<>${tmp}/fifo - if [ "${sflag}" = "true" ] ; then - # force sequential - at_a_time=1 - fi fi + # iterate over all of the subrepos. for i in ${repos} ${repos_extra} ; do n=`expr ${n} '+' 1` repopidfile=`echo ${i} | sed -e 's@./@@' -e 's@/@_@g'` reponame=`echo ${i} | sed -e :a -e 's/^.\{1,20\}$/ &/;ta'` pull_base="${pull_default}" - for j in $repos_extra ; do - if [ "$i" = "$j" ] ; then - pull_base="${pull_extra}" + + # regular repo or "extra" repo? + for j in ${repos_extra} ; do + if [ "${i}" = "${j}" ] ; then + # it's an "extra" + pull_base="${pull_extra}" fi done + + # remove trailing slash pull_base="`echo ${pull_base} | sed -e 's@[/]*$@@'`" + + # execute the command on the subrepo ( ( if [ "${command}" = "clone" -o "${command}" = "fclone" -o "${command}" = "tclone" ] ; then - pull_newrepo="${pull_base}/${i}" - path="`dirname ${i}`" - if [ "${path}" != "." ] ; then + # some form of clone + clone_newrepo="${pull_base}/${i}" + parent_path="`dirname ${i}`" + if [ "${parent_path}" != "." ] ; then times=0 - while [ ! -d "${path}" ] ## nested repo, ensure containing dir exists - do + while [ ! -d "${parent_path}" ] ; do ## nested repo, ensure containing dir exists + if [ "${sflag}" = "true" ] ; then + # Missing parent is fatal during sequential operation. + echo "ERROR: Missing parent path: ${parent_path}" > ${status_output} + exit 1 + fi times=`expr ${times} '+' 1` if [ `expr ${times} '%' 10` -eq 0 ] ; then - echo "${path} still not created, waiting..." > ${status_output} + echo "${parent_path} still not created, waiting..." > ${status_output} fi sleep 5 done fi - echo "hg${global_opts} clone ${pull_newrepo} ${i}" > ${status_output} - (PYTHONUNBUFFERED=true hg${global_opts} clone ${pull_newrepo} ${i}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & + # run the clone command. + echo "hg${global_opts} clone ${clone_newrepo} ${i}" > ${status_output} + (PYTHONUNBUFFERED=true hg${global_opts} clone ${clone_newrepo} ${i}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & else + # run the command. echo "cd ${i} && hg${global_opts} ${command} ${command_args}" > ${status_output} cd ${i} && (PYTHONUNBUFFERED=true hg${global_opts} ${command} ${command_args}; echo "$?" > ${tmp}/${repopidfile}.pid.rc ) 2>&1 & fi echo $! > ${tmp}/${repopidfile}.pid ) 2>&1 | sed -e "s@^@${reponame}: @" > ${status_output} - if [ $have_fifos = "true" ]; then - echo "${reponame}" >&3 + # tell the fifo waiter that this subprocess is done. + if [ ${have_fifos} = "true" ]; then + echo "${i}" >&3 fi ) & - if [ $have_fifos = "true" ]; then - # check on count of running subprocesses and possibly wait for completion - if [ ${at_a_time} -lt ${n} ] ; then - # read will block until there are completed subprocesses - while read repo_done; do - n=`expr ${n} '-' 1` - if [ ${n} -lt ${at_a_time} ] ; then - # we should start more subprocesses - break; - fi - done <&3 - fi + if [ "${sflag}" = "true" ] ; then + # complete this task before starting another. + wait else - if [ "${sflag}" = "false" ] ; then + if [ "${have_fifos}" = "true" ]; then + # check on count of running subprocesses and possibly wait for completion + if [ ${n} -ge ${at_a_time} ] ; then + # read will block until there are completed subprocesses + while read repo_done; do + n=`expr ${n} '-' 1` + if [ ${n} -lt ${at_a_time} ] ; then + # we should start more subprocesses + break; + fi + done <&3 + fi + else # Compare completions to starts - completed="`(ls -1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" - while [ ${at_a_time} -lt `expr ${n} '-' ${completed}` ] ; do + completed="`(ls -a1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" + while [ `expr ${n} '-' ${completed}` -ge ${at_a_time} ] ; do # sleep a short time to give time for something to complete sleep 1 - completed="`(ls -1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" + completed="`(ls -a1 ${tmp}/*.pid.rc 2> /dev/null | wc -l) || echo 0`" done - else - # complete this task before starting another. - wait fi fi done @@ -320,11 +385,12 @@ wait # Terminate with exit 0 only if all subprocesses were successful ec=0 if [ -d ${tmp} ]; then - for rc in ${tmp}/*.pid.rc ; do + rcfiles="`(ls -a ${tmp}/*.pid.rc 2> /dev/null) || echo ''`" + for rc in ${rcfiles} ; do exit_code=`cat ${rc} | tr -d ' \n\r'` if [ "${exit_code}" != "0" ] ; then - repo="`echo ${rc} | sed -e s@^${tmp}@@ -e 's@/*\([^/]*\)\.pid\.rc$@\1@' -e 's@_@/@g'`" - echo "WARNING: ${repo} exited abnormally ($exit_code)" > ${status_output} + repo="`echo ${rc} | sed -e 's@^'${tmp}'@@' -e 's@/*\([^/]*\)\.pid\.rc$@\1@' -e 's@_@/@g'`" + echo "WARNING: ${repo} exited abnormally (${exit_code})" > ${status_output} ec=1 fi done diff --git a/corba/.hgtags b/corba/.hgtags index 4760e074949..18cf4e05c86 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -255,3 +255,4 @@ a4bf701ac316946c2e5e83138ad8e687da6a4b30 jdk9-b06 3bd4039dfc632fd7fc8418a25a3dcc34d1cd4019 jdk9-b10 77ea0a2503582a28e4e66be7239a49a0d1dd313f jdk9-b11 e212cdcc8c11f0ba5acf6f5ddb596c4c545a93f9 jdk9-b12 +088eec4c36f4d7f250fcd19c4969bf698e3d2cdc jdk9-b13 diff --git a/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java b/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java index a73a20b3d6c..e597b1daa03 100644 --- a/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java +++ b/corba/src/share/classes/com/sun/corba/se/spi/orb/ORB.java @@ -25,8 +25,6 @@ package com.sun.corba.se.spi.orb; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.Map ; import java.util.HashMap ; import java.util.Properties ; @@ -44,16 +42,13 @@ import com.sun.corba.se.pept.transport.ByteBufferPool; import com.sun.corba.se.spi.protocol.RequestDispatcherRegistry ; import com.sun.corba.se.spi.protocol.ClientDelegateFactory ; import com.sun.corba.se.spi.protocol.CorbaServerRequestDispatcher ; -import com.sun.corba.se.spi.protocol.CorbaMessageMediator ; import com.sun.corba.se.spi.protocol.PIHandler ; import com.sun.corba.se.spi.resolver.LocalResolver ; import com.sun.corba.se.spi.resolver.Resolver ; import com.sun.corba.se.spi.transport.CorbaContactInfoListFactory ; -import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketEndPointInfo; import com.sun.corba.se.spi.legacy.connection.LegacyServerSocketManager; import com.sun.corba.se.spi.monitoring.MonitoringConstants; import com.sun.corba.se.spi.monitoring.MonitoringManager; -import com.sun.corba.se.spi.monitoring.MonitoringManagerFactory; import com.sun.corba.se.spi.monitoring.MonitoringFactories; import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder ; @@ -62,11 +57,6 @@ import com.sun.corba.se.spi.ior.ObjectKey ; import com.sun.corba.se.spi.ior.ObjectKeyFactory ; import com.sun.corba.se.spi.ior.IOR ; -import com.sun.corba.se.spi.orbutil.closure.Closure ; - -import com.sun.corba.se.spi.orb.Operation ; -import com.sun.corba.se.spi.orb.ORBData ; -import com.sun.corba.se.spi.orb.ORBVersion ; import com.sun.corba.se.spi.orbutil.threadpool.ThreadPoolManager; import com.sun.corba.se.spi.oa.OAInvocationInfo ; @@ -99,8 +89,6 @@ import com.sun.corba.se.impl.logging.OMGSystemException ; import com.sun.corba.se.impl.presentation.rmi.PresentationManagerImpl ; -import sun.misc.JavaAWTAccess; - public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB implements Broker, TypeCodeFactory { @@ -146,9 +134,9 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB // This map is needed for resolving recursive type code placeholders // based on the unique repository id. // XXX Should this be a WeakHashMap for GC? - private Map typeCodeMap ; + private Map typeCodeMap; - private TypeCodeImpl[] primitiveTypeCodeConstants ; + private TypeCodeImpl[] primitiveTypeCodeConstants; // ByteBufferPool - needed by both ORBImpl and ORBSingleton ByteBufferPool byteBufferPool; @@ -169,16 +157,18 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB // wrapperMap maintains a table of LogWrapper instances used by // different classes to log exceptions. The key is a StringPair // representing LogDomain and ExceptionGroup. - private Map wrapperMap ; + private Map wrapperMap; static class Holder { static final PresentationManager defaultPresentationManager = setupPresentationManager(); } - private static final Map pmContexts = new HashMap<>(); + private static final Map pmContexts = + new ConcurrentHashMap<>(); - private static Map staticWrapperMap = new ConcurrentHashMap(); + private static Map staticWrapperMap = + new ConcurrentHashMap<>(); protected MonitoringManager monitoringManager; @@ -245,28 +235,12 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB public static PresentationManager getPresentationManager() { SecurityManager sm = System.getSecurityManager(); - JavaAWTAccess javaAwtAccess = sun.misc.SharedSecrets.getJavaAWTAccess(); + sun.misc.JavaAWTAccess javaAwtAccess = sun.misc.SharedSecrets.getJavaAWTAccess(); if (sm != null && javaAwtAccess != null) { - Object appletContext; - try { - Class clazz = JavaAWTAccess.class; - Method method = clazz.getMethod("getAppletContext"); - appletContext = method.invoke(javaAwtAccess); - } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { - InternalError err = new InternalError(); - err.initCause(e); - throw err; - } - + final Object appletContext = javaAwtAccess.getAppletContext(); if (appletContext != null) { - synchronized (pmContexts) { - PresentationManager pm = pmContexts.get(appletContext); - if (pm == null) { - pm = setupPresentationManager(); - pmContexts.put(appletContext, pm); - } - return pm; - } + return pmContexts.computeIfAbsent(appletContext, + x -> setupPresentationManager()); } } @@ -290,13 +264,13 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB { // Initialize logging first, since it is needed nearly // everywhere (for example, in TypeCodeImpl). - wrapperMap = new ConcurrentHashMap(); + wrapperMap = new ConcurrentHashMap<>(); wrapper = ORBUtilSystemException.get( this, CORBALogDomains.RPC_PRESENTATION ) ; omgWrapper = OMGSystemException.get( this, CORBALogDomains.RPC_PRESENTATION ) ; - typeCodeMap = new HashMap(); + typeCodeMap = new HashMap<>(); primitiveTypeCodeConstants = new TypeCodeImpl[] { new TypeCodeImpl(this, TCKind._tk_null), @@ -363,7 +337,7 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB public synchronized TypeCodeImpl getTypeCode(String id) { checkShutdownState(); - return (TypeCodeImpl)typeCodeMap.get(id); + return typeCodeMap.get(id); } public MonitoringManager getMonitoringManager( ) { @@ -526,35 +500,23 @@ public abstract class ORB extends com.sun.corba.se.org.omg.CORBA.ORB /** get the log wrapper class (its type is dependent on the exceptionGroup) for the * given log domain and exception group in this ORB instance. */ - public LogWrapperBase getLogWrapper( String logDomain, - String exceptionGroup, LogWrapperFactory factory ) + public LogWrapperBase getLogWrapper(String logDomain, + String exceptionGroup, LogWrapperFactory factory) { - StringPair key = new StringPair( logDomain, exceptionGroup ) ; - - LogWrapperBase logWrapper = (LogWrapperBase)wrapperMap.get( key ); - if (logWrapper == null) { - logWrapper = factory.create( getLogger( logDomain ) ); - wrapperMap.put( key, logWrapper ); - } - - return logWrapper; + return wrapperMap.computeIfAbsent( + new StringPair(logDomain, exceptionGroup), + x -> factory.create(getLogger(logDomain))); } /** get the log wrapper class (its type is dependent on the exceptionGroup) for the * given log domain and exception group in this ORB instance. */ - public static LogWrapperBase staticGetLogWrapper( String logDomain, - String exceptionGroup, LogWrapperFactory factory ) + public static LogWrapperBase staticGetLogWrapper(String logDomain, + String exceptionGroup, LogWrapperFactory factory) { - StringPair key = new StringPair( logDomain, exceptionGroup ) ; - - LogWrapperBase logWrapper = (LogWrapperBase)staticWrapperMap.get( key ); - if (logWrapper == null) { - logWrapper = factory.create( staticGetLogger( logDomain ) ); - staticWrapperMap.put( key, logWrapper ); - } - - return logWrapper; + return staticWrapperMap.computeIfAbsent( + new StringPair(logDomain, exceptionGroup), + x -> factory.create(staticGetLogger(logDomain))); } // get a reference to a ByteBufferPool, a pool of NIO ByteBuffers diff --git a/hotspot/.hgtags b/hotspot/.hgtags index cf4e40c5b41..97ea5ccc8bc 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -415,3 +415,4 @@ bdc5311e1db7598589b77015119b821bf8c828bd jdk9-b05 ebc44d040cd149d2120d69fe183a3dae7840f4b4 jdk9-b10 783309c3a1a629a452673399dcfa83ef7eca94d8 jdk9-b11 1c383bb39e2849ca62cb763f4e182a29b421d60a jdk9-b12 +456ad9c99133803d4e1433124c85a6fd141b9ac9 jdk9-b13 diff --git a/hotspot/agent/src/os/linux/libproc.h b/hotspot/agent/src/os/linux/libproc.h index 429e6314f3d..c917a938c5a 100644 --- a/hotspot/agent/src/os/linux/libproc.h +++ b/hotspot/agent/src/os/linux/libproc.h @@ -34,19 +34,7 @@ #include "libproc_md.h" #endif -#if defined(sparc) || defined(sparcv9) -/* - If _LP64 is defined ptrace.h should be taken from /usr/include/asm-sparc64 - otherwise it should be from /usr/include/asm-sparc - These two files define pt_regs structure differently -*/ -#ifdef _LP64 -#include "asm-sparc64/ptrace.h" -#else -#include "asm-sparc/ptrace.h" -#endif - -#endif //sparc or sparcv9 +#include /************************************************************************************ diff --git a/hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp b/hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp index 8ba119a67ac..8a9534e260d 100644 --- a/hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/cppInterpreter_ppc.cpp @@ -1,3 +1,4 @@ + /* * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright 2012, 2014 SAP AG. All rights reserved. @@ -403,7 +404,7 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(Label& stack_ov BLOCK_COMMENT("compute_interpreter_state {"); // access_flags = method->access_flags(); - // TODO: PPC port: assert(4 == methodOopDesc::sz_access_flags(), "unexpected field size"); + // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); __ lwa(access_flags, method_(access_flags)); // parameter_count = method->constMethod->size_of_parameters(); @@ -419,10 +420,8 @@ void CppInterpreterGenerator::generate_compute_interpreter_state(Label& stack_ov // TODO: PPC port: assert(2 == ConstMethod::sz_max_stack(), "unexpected field size"); __ lhz(max_stack, in_bytes(ConstMethod::max_stack_offset()), max_stack); - if (EnableInvokeDynamic) { - // Take into account 'extra_stack_entries' needed by method handles (see method.hpp). + // Take into account 'extra_stack_entries' needed by method handles (see method.hpp). __ addi(max_stack, max_stack, Method::extra_stack_entries()); - } // mem_stack_limit = thread->stack_limit(); __ ld(mem_stack_limit, thread_(stack_overflow_limit)); @@ -1055,7 +1054,7 @@ address CppInterpreterGenerator::generate_native_entry(void) { assert(access_flags->is_nonvolatile(), "access_flags must be in a non-volatile register"); // Type check. - // TODO: PPC port: assert(4 == methodOopDesc::sz_access_flags(), "unexpected field size"); + // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); __ lwz(access_flags, method_(access_flags)); // We don't want to reload R19_method and access_flags after calls @@ -1838,7 +1837,7 @@ address CppInterpreterGenerator::generate_normal_entry(void) { // Interpreter state fields. const Register msg = R24_tmp4; - // MethodOop fields. + // Method fields. const Register parameter_count = R25_tmp5; const Register result_index = R26_tmp6; @@ -2023,7 +2022,7 @@ address CppInterpreterGenerator::generate_normal_entry(void) { __ add(R17_tos, R17_tos, parameter_count); // Result stub address array index - // TODO: PPC port: assert(4 == methodOopDesc::sz_result_index(), "unexpected field size"); + // TODO: PPC port: assert(4 == sizeof(AccessFlags), "unexpected field size"); __ lwa(result_index, method_(result_index)); __ li(msg, BytecodeInterpreter::method_resume); @@ -2709,7 +2708,7 @@ address CppInterpreterGenerator::generate_normal_entry(void) { __ ld(R3_ARG1, state_(_result._osr._osr_buf)); __ mtctr(R12_scratch2); - // Load method oop, gc may move it during execution of osr'd method. + // Load method, gc may move it during execution of osr'd method. __ ld(R22_tmp2, state_(_method)); // Load message 'call_method'. __ li(R23_tmp3, BytecodeInterpreter::call_method); diff --git a/hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp b/hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp index 8e46363eac9..6186906a860 100644 --- a/hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp +++ b/hotspot/src/cpu/ppc/vm/frame_ppc.inline.hpp @@ -26,6 +26,8 @@ #ifndef CPU_PPC_VM_FRAME_PPC_INLINE_HPP #define CPU_PPC_VM_FRAME_PPC_INLINE_HPP +#include "code/codeCache.hpp" + // Inline functions for ppc64 frames: // Find codeblob and set deopt_state. diff --git a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp index f71acaca095..98c34b15a33 100644 --- a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp +++ b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.cpp @@ -380,7 +380,6 @@ void InterpreterMacroAssembler::get_cache_index_at_bcp(Register Rdst, int bcp_of if (index_size == sizeof(u2)) { get_2_byte_integer_at_bcp(bcp_offset, Rdst, Unsigned); } else if (index_size == sizeof(u4)) { - assert(EnableInvokeDynamic, "giant index used only for JSR 292"); get_4_byte_integer_at_bcp(bcp_offset, Rdst, Signed); assert(ConstantPool::decode_invokedynamic_index(~123) == 123, "else change next line"); nand(Rdst, Rdst, Rdst); // convert to plain index diff --git a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp index 9846bb5113e..b4c95a6458c 100644 --- a/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp +++ b/hotspot/src/cpu/ppc/vm/interp_masm_ppc_64.hpp @@ -26,7 +26,7 @@ #ifndef CPU_PPC_VM_INTERP_MASM_PPC_64_HPP #define CPU_PPC_VM_INTERP_MASM_PPC_64_HPP -#include "assembler_ppc.inline.hpp" +#include "asm/macroAssembler.hpp" #include "interpreter/invocationCounter.hpp" // This file specializes the assembler with interpreter-specific macros. diff --git a/hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp b/hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp index 5d45d8bf82f..98ab1041dde 100644 --- a/hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/interpreterRT_ppc.cpp @@ -24,6 +24,7 @@ */ #include "precompiled.hpp" +#include "asm/assembler.inline.hpp" #include "interpreter/interpreter.hpp" #include "interpreter/interpreterRuntime.hpp" #include "memory/allocation.inline.hpp" diff --git a/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp b/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp index 80bfc2d2918..a35b1ebb7a1 100644 --- a/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/interpreter_ppc.cpp @@ -139,32 +139,16 @@ address AbstractInterpreterGenerator::generate_slow_signature_handler() { // Signature is in R3_RET. Signature is callee saved. __ mr(signature, R3_RET); - // Reload method, it may have moved. -#ifdef CC_INTERP - __ ld(R19_method, state_(_method)); -#else - __ ld(R19_method, 0, target_sp); - __ ld(R19_method, _ijava_state_neg(method), R19_method); -#endif - // Get the result handler. __ call_VM_leaf(CAST_FROM_FN_PTR(address, InterpreterRuntime::get_result_handler), R16_thread, R19_method); - // Reload method, it may have moved. -#ifdef CC_INTERP - __ ld(R19_method, state_(_method)); -#else - __ ld(R19_method, 0, target_sp); - __ ld(R19_method, _ijava_state_neg(method), R19_method); -#endif - { Label L; // test if static // _access_flags._flags must be at offset 0. // TODO PPC port: requires change in shared code. //assert(in_bytes(AccessFlags::flags_offset()) == 0, - // "MethodOopDesc._access_flags == MethodOopDesc._access_flags._flags"); + // "MethodDesc._access_flags == MethodDesc._access_flags._flags"); // _access_flags must be a 32 bit value. assert(sizeof(AccessFlags) == 4, "wrong size"); __ lwa(R11_scratch1/*access_flags*/, method_(access_flags)); diff --git a/hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp b/hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp index 88cc7f1481d..b16be25c5c0 100644 --- a/hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/jniFastGetField_ppc.cpp @@ -32,7 +32,7 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) { - // we don't have fast jni accessors. + // We don't have fast jni accessors. return (address) -1; } @@ -57,12 +57,12 @@ address JNI_FastGetField::generate_fast_get_int_field() { } address JNI_FastGetField::generate_fast_get_long_field() { - // we don't have fast jni accessors. + // We don't have fast jni accessors. return (address) -1; } address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) { - // e don't have fast jni accessors. + // We don't have fast jni accessors. return (address) -1; } diff --git a/hotspot/src/cpu/ppc/vm/ppc.ad b/hotspot/src/cpu/ppc/vm/ppc.ad index db87a3c46e8..214ea62029b 100644 --- a/hotspot/src/cpu/ppc/vm/ppc.ad +++ b/hotspot/src/cpu/ppc/vm/ppc.ad @@ -898,7 +898,7 @@ source_hpp %{ // To keep related declarations/definitions/uses close together, // we switch between source %{ }% and source_hpp %{ }% freely as needed. - // Returns true if Node n is followed by a MemBar node that + // Returns true if Node n is followed by a MemBar node that // will do an acquire. If so, this node must not do the acquire // operation. bool followed_by_acquire(const Node *n); @@ -908,7 +908,7 @@ source %{ // Optimize load-acquire. // -// Check if acquire is unnecessary due to following operation that does +// Check if acquire is unnecessary due to following operation that does // acquire anyways. // Walk the pattern: // @@ -919,12 +919,12 @@ source %{ // Proj(ctrl) Proj(mem) // | | // MemBarRelease/Volatile -// +// bool followed_by_acquire(const Node *load) { assert(load->is_Load(), "So far implemented only for loads."); // Find MemBarAcquire. - const Node *mba = NULL; + const Node *mba = NULL; for (DUIterator_Fast imax, i = load->fast_outs(imax); i < imax; i++) { const Node *out = load->fast_out(i); if (out->Opcode() == Op_MemBarAcquire) { @@ -937,7 +937,7 @@ bool followed_by_acquire(const Node *load) { // Find following MemBar node. // - // The following node must be reachable by control AND memory + // The following node must be reachable by control AND memory // edge to assure no other operations are in between the two nodes. // // So first get the Proj node, mem_proj, to use it to iterate forward. @@ -1135,6 +1135,7 @@ class CallStubImpl { public: + // Emit call stub, compiled java to interpreter. static void emit_trampoline_stub(MacroAssembler &_masm, int destination_toc_offset, int insts_call_instruction_offset); // Size of call trampoline stub. @@ -2755,7 +2756,7 @@ encode %{ // inputs for new nodes m1->add_req(NULL, n_toc); m2->add_req(NULL, m1); - + // operands for new nodes m1->_opnds[0] = new (C) iRegPdstOper(); // dst m1->_opnds[1] = op_src; // src @@ -2763,29 +2764,29 @@ encode %{ m2->_opnds[0] = new (C) iRegPdstOper(); // dst m2->_opnds[1] = op_src; // src m2->_opnds[2] = new (C) iRegLdstOper(); // base - + // Initialize ins_attrib TOC fields. m1->_const_toc_offset = -1; m2->_const_toc_offset_hi_node = m1; - + // Register allocation for new nodes. ra_->set_pair(m1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); - + nodes->push(m1); nodes->push(m2); assert(m2->bottom_type()->isa_ptr(), "must be ptr"); } else { loadConPNode *m2 = new (C) loadConPNode(); - + // inputs for new nodes m2->add_req(NULL, n_toc); - + // operands for new nodes m2->_opnds[0] = new (C) iRegPdstOper(); // dst m2->_opnds[1] = op_src; // src m2->_opnds[2] = new (C) iRegPdstOper(); // toc - + // Register allocation for new nodes. ra_->set_pair(m2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); @@ -2977,17 +2978,17 @@ encode %{ n_sub_base->_opnds[1] = op_crx; n_sub_base->_opnds[2] = op_src; n_sub_base->_bottom_type = _bottom_type; - + n_shift->add_req(n_region, n_sub_base); n_shift->_opnds[0] = op_dst; n_shift->_opnds[1] = op_dst; n_shift->_bottom_type = _bottom_type; - + ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ra_->set_pair(n_sub_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ra_->set_pair(n_move->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); - + nodes->push(n_move); nodes->push(n_compare); nodes->push(n_sub_base); @@ -3064,20 +3065,20 @@ encode %{ } else { // before Power 7 cond_add_baseNode *n_add_base = new (C) cond_add_baseNode(); - + n_add_base->add_req(n_region, n_compare, n_shift); n_add_base->_opnds[0] = op_dst; n_add_base->_opnds[1] = op_crx; n_add_base->_opnds[2] = op_dst; n_add_base->_bottom_type = _bottom_type; - + assert(ra_->is_oop(this) == true, "A decodeN node must produce an oop!"); ra_->set_oop(n_add_base, true); - + ra_->set_pair(n_shift->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx)); ra_->set_pair(n_add_base->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this)); - + nodes->push(n_compare); nodes->push(n_shift); nodes->push(n_add_base); @@ -3634,11 +3635,11 @@ encode %{ // Req... for (uint i = 0; i < req(); ++i) { // The expanded node does not need toc any more. - // Add the inline cache constant here instead. This expresses the + // Add the inline cache constant here instead. This expresses the // register of the inline cache must be live at the call. // Else we would have to adapt JVMState by -1. if (i == mach_constant_base_node_input()) { - call->add_req(loadConLNodes_IC._last); + call->add_req(loadConLNodes_IC._last); } else { call->add_req(in(i)); } @@ -3666,6 +3667,8 @@ encode %{ %} // Compound version of call dynamic + // Toc is only passed so that it can be used in ins_encode statement. + // In the code we have to use $constanttablebase. enc_class enc_java_dynamic_call(method meth, iRegLdst toc) %{ // TODO: PPC port $archOpcode(ppc64Opcode_compound); MacroAssembler _masm(&cbuf); @@ -3673,14 +3676,17 @@ encode %{ Register Rtoc = (ra_) ? $constanttablebase : R2_TOC; #if 0 + int vtable_index = this->_vtable_index; if (_vtable_index < 0) { // Must be invalid_vtable_index, not nonvirtual_vtable_index. assert(_vtable_index == Method::invalid_vtable_index, "correct sentinel value"); Register ic_reg = as_Register(Matcher::inline_cache_reg_encode()); - AddressLiteral meta = __ allocate_metadata_address((Metadata *)Universe::non_oop_word()); + // Virtual call relocation will point to ic load. address virtual_call_meta_addr = __ pc(); - __ load_const_from_method_toc(ic_reg, meta, Rtoc); + // Load a clear inline cache. + AddressLiteral empty_ic((address) Universe::non_oop_word()); + __ load_const_from_method_toc(ic_reg, empty_ic, Rtoc); // CALL to fixup routine. Fixup routine uses ScopeDesc info // to determine who we intended to call. __ relocate(virtual_call_Relocation::spec(virtual_call_meta_addr)); @@ -3713,7 +3719,6 @@ encode %{ "Fix constant in ret_addr_offset()"); } #endif - guarantee(0, "Fix handling of toc edge: messes up derived/base pairs."); Unimplemented(); // ret_addr_offset not yet fixed. Depends on compressed oops (load klass!). %} @@ -5439,7 +5444,7 @@ instruct loadI_ac(iRegIdst dst, memory mem) %{ ins_pipe(pipe_class_memory); %} -// Match loading integer and casting it to unsigned int in +// Match loading integer and casting it to unsigned int in // long register. // LoadI + ConvI2L + AndL 0xffffffff. instruct loadUI2L(iRegLdst dst, memory mem, immL_32bits mask) %{ @@ -6081,7 +6086,7 @@ instruct loadConNKlass_hi(iRegNdst dst, immNKlass src) %{ ins_pipe(pipe_class_default); %} -// This needs a match rule so that build_oop_map knows this is +// This needs a match rule so that build_oop_map knows this is // not a narrow oop. instruct loadConNKlass_lo(iRegNdst dst, immNKlass_NM src1, iRegNsrc src2) %{ match(Set dst src1); @@ -6705,7 +6710,7 @@ instruct cond_set_0_oop(iRegNdst dst, flagsReg crx, iRegPsrc src1) %{ size(4); ins_encode %{ // This is a Power7 instruction for which no machine description exists. - // TODO: PPC port $archOpcode(ppc64Opcode_compound); + // TODO: PPC port $archOpcode(ppc64Opcode_compound); __ isel_0($dst$$Register, $crx$$CondRegister, Assembler::equal, $src1$$Register); %} ins_pipe(pipe_class_default); @@ -6850,7 +6855,7 @@ instruct cond_set_0_ptr(iRegPdst dst, flagsReg crx, iRegPsrc src1) %{ size(4); ins_encode %{ // This is a Power7 instruction for which no machine description exists. - // TODO: PPC port $archOpcode(ppc64Opcode_compound); + // TODO: PPC port $archOpcode(ppc64Opcode_compound); __ isel_0($dst$$Register, $crx$$CondRegister, Assembler::equal, $src1$$Register); %} ins_pipe(pipe_class_default); @@ -7067,7 +7072,7 @@ instruct decodeNKlass_notNull_addBase_Ex(iRegPdst dst, iRegLsrc base, iRegNsrc s n1->_bottom_type = _bottom_type; decodeNKlass_shiftNode *n2 = new (C) decodeNKlass_shiftNode(); - n2->add_req(n_region, n2); + n2->add_req(n_region, n1); n2->_opnds[0] = op_dst; n2->_opnds[1] = op_dst; n2->_bottom_type = _bottom_type; @@ -7202,7 +7207,7 @@ instruct membar_volatile() %{ // inline_unsafe_load_store). // // Add this node again if we found a good solution for inline_unsafe_load_store(). -// Don't forget to look at the implementation of post_store_load_barrier again, +// Don't forget to look at the implementation of post_store_load_barrier again, // we did other fixes in that method. //instruct unnecessary_membar_volatile() %{ // match(MemBarVolatile); @@ -7240,7 +7245,7 @@ instruct cmovI_reg_isel(cmpOp cmp, flagsReg crx, iRegIdst dst, iRegIsrc src) %{ // exists. Anyways, the scheduler should be off on Power7. // TODO: PPC port $archOpcode(ppc64Opcode_compound); int cc = $cmp$$cmpcode; - __ isel($dst$$Register, $crx$$CondRegister, + __ isel($dst$$Register, $crx$$CondRegister, (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); %} ins_pipe(pipe_class_default); @@ -7286,7 +7291,7 @@ instruct cmovL_reg_isel(cmpOp cmp, flagsReg crx, iRegLdst dst, iRegLsrc src) %{ // exists. Anyways, the scheduler should be off on Power7. // TODO: PPC port $archOpcode(ppc64Opcode_compound); int cc = $cmp$$cmpcode; - __ isel($dst$$Register, $crx$$CondRegister, + __ isel($dst$$Register, $crx$$CondRegister, (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); %} ins_pipe(pipe_class_default); @@ -7332,7 +7337,7 @@ instruct cmovN_reg_isel(cmpOp cmp, flagsReg crx, iRegNdst dst, iRegNsrc src) %{ // exists. Anyways, the scheduler should be off on Power7. // TODO: PPC port $archOpcode(ppc64Opcode_compound); int cc = $cmp$$cmpcode; - __ isel($dst$$Register, $crx$$CondRegister, + __ isel($dst$$Register, $crx$$CondRegister, (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); %} ins_pipe(pipe_class_default); @@ -7379,7 +7384,7 @@ instruct cmovP_reg_isel(cmpOp cmp, flagsReg crx, iRegPdst dst, iRegPsrc src) %{ // exists. Anyways, the scheduler should be off on Power7. // TODO: PPC port $archOpcode(ppc64Opcode_compound); int cc = $cmp$$cmpcode; - __ isel($dst$$Register, $crx$$CondRegister, + __ isel($dst$$Register, $crx$$CondRegister, (Assembler::Condition)(cc & 3), /*invert*/((~cc) & 8), $src$$Register); %} ins_pipe(pipe_class_default); @@ -7525,8 +7530,8 @@ instruct compareAndSwapI_regP_regI_regI(iRegIdst res, iRegPdst mem_ptr, iRegIsrc ins_encode %{ // TODO: PPC port $archOpcode(ppc64Opcode_compound); // CmpxchgX sets CCR0 to cmpX(src1, src2) and Rres to 'true'/'false'. - __ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, - MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), + __ cmpxchgw(CCR0, R0, $src1$$Register, $src2$$Register, $mem_ptr$$Register, + MacroAssembler::MemBarFenceAfter, MacroAssembler::cmpxchgx_hint_atomic_update(), $res$$Register, true); %} ins_pipe(pipe_class_default); @@ -7932,7 +7937,23 @@ instruct subL_reg_imm16(iRegLdst dst, iRegLsrc src1, immL16 src2) %{ // Turn the sign-bit of a long into a 64-bit mask, 0x0...0 for // positive longs and 0xF...F for negative ones. -instruct signmask64I_regI(iRegIdst dst, iRegIsrc src) %{ +instruct signmask64I_regL(iRegIdst dst, iRegLsrc src) %{ + // no match-rule, false predicate + effect(DEF dst, USE src); + predicate(false); + + format %{ "SRADI $dst, $src, #63" %} + size(4); + ins_encode %{ + // TODO: PPC port $archOpcode(ppc64Opcode_sradi); + __ sradi($dst$$Register, $src$$Register, 0x3f); + %} + ins_pipe(pipe_class_default); +%} + +// Turn the sign-bit of a long into a 64-bit mask, 0x0...0 for +// positive longs and 0xF...F for negative ones. +instruct signmask64L_regL(iRegLdst dst, iRegLsrc src) %{ // no match-rule, false predicate effect(DEF dst, USE src); predicate(false); @@ -8896,7 +8917,7 @@ instruct andI_reg_immIpowerOf2(iRegIdst dst, iRegIsrc src1, immIpowerOf2 src2) % size(4); ins_encode %{ // TODO: PPC port $archOpcode(ppc64Opcode_rlwinm); - __ rlwinm($dst$$Register, $src1$$Register, 0, + __ rlwinm($dst$$Register, $src1$$Register, 0, (31-log2_long((jlong) $src2$$constant)) & 0x1f, (31-log2_long((jlong) $src2$$constant)) & 0x1f); %} ins_pipe(pipe_class_default); @@ -9622,14 +9643,14 @@ instruct cmpLTMask_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ins_cost(DEFAULT_COST*4); expand %{ - iRegIdst src1s; - iRegIdst src2s; - iRegIdst diff; - sxtI_reg(src1s, src1); // ensure proper sign extention - sxtI_reg(src2s, src2); // ensure proper sign extention - subI_reg_reg(diff, src1s, src2s); + iRegLdst src1s; + iRegLdst src2s; + iRegLdst diff; + convI2L_reg(src1s, src1); // Ensure proper sign extension. + convI2L_reg(src2s, src2); // Ensure proper sign extension. + subL_reg_reg(diff, src1s, src2s); // Need to consider >=33 bit result, therefore we need signmaskL. - signmask64I_regI(dst, diff); + signmask64I_regL(dst, diff); %} %} @@ -10866,7 +10887,7 @@ instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P supe format %{ "PartialSubtypeCheck $result = ($subklass instanceOf $superklass) tmp: $tmp_klass, $tmp_arrayptr" %} ins_encode %{ // TODO: PPC port $archOpcode(ppc64Opcode_compound); - __ check_klass_subtype_slow_path($subklass$$Register, $superklass$$Register, $tmp_arrayptr$$Register, + __ check_klass_subtype_slow_path($subklass$$Register, $superklass$$Register, $tmp_arrayptr$$Register, $tmp_klass$$Register, NULL, $result$$Register); %} ins_pipe(pipe_class_default); @@ -11181,18 +11202,18 @@ instruct minI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ins_cost(DEFAULT_COST*6); expand %{ - iRegIdst src1s; - iRegIdst src2s; - iRegIdst diff; - iRegIdst sm; - iRegIdst doz; // difference or zero - sxtI_reg(src1s, src1); // Ensure proper sign extention. - sxtI_reg(src2s, src2); // Ensure proper sign extention. - subI_reg_reg(diff, src2s, src1s); + iRegLdst src1s; + iRegLdst src2s; + iRegLdst diff; + iRegLdst sm; + iRegLdst doz; // difference or zero + convI2L_reg(src1s, src1); // Ensure proper sign extension. + convI2L_reg(src2s, src2); // Ensure proper sign extension. + subL_reg_reg(diff, src2s, src1s); // Need to consider >=33 bit result, therefore we need signmaskL. - signmask64I_regI(sm, diff); - andI_reg_reg(doz, diff, sm); // <=0 - addI_reg_reg(dst, doz, src1s); + signmask64L_regL(sm, diff); + andL_reg_reg(doz, diff, sm); // <=0 + addI_regL_regL(dst, doz, src1s); %} %} @@ -11201,19 +11222,18 @@ instruct maxI_reg_reg_Ex(iRegIdst dst, iRegIsrc src1, iRegIsrc src2) %{ ins_cost(DEFAULT_COST*6); expand %{ - immI_minus1 m1 %{ -1 %} - iRegIdst src1s; - iRegIdst src2s; - iRegIdst diff; - iRegIdst sm; - iRegIdst doz; // difference or zero - sxtI_reg(src1s, src1); // Ensure proper sign extention. - sxtI_reg(src2s, src2); // Ensure proper sign extention. - subI_reg_reg(diff, src2s, src1s); + iRegLdst src1s; + iRegLdst src2s; + iRegLdst diff; + iRegLdst sm; + iRegLdst doz; // difference or zero + convI2L_reg(src1s, src1); // Ensure proper sign extension. + convI2L_reg(src2s, src2); // Ensure proper sign extension. + subL_reg_reg(diff, src2s, src1s); // Need to consider >=33 bit result, therefore we need signmaskL. - signmask64I_regI(sm, diff); - andcI_reg_reg(doz, sm, m1, diff); // >=0 - addI_reg_reg(dst, doz, src1s); + signmask64L_regL(sm, diff); + andcL_reg_reg(doz, diff, sm); // >=0 + addI_regL_regL(dst, doz, src1s); %} %} diff --git a/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp b/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp index f1710aa28bb..8a9fae04770 100644 --- a/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp +++ b/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp @@ -81,24 +81,18 @@ address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler(con #if 0 // Call special ClassCastException constructor taking object to cast // and target class as arguments. -address TemplateInterpreterGenerator::generate_ClassCastException_verbose_handler(const char* name) { +address TemplateInterpreterGenerator::generate_ClassCastException_verbose_handler() { address entry = __ pc(); - // Target class oop is in register R6_ARG4 by convention! - // Expression stack must be empty before entering the VM if an // exception happened. __ empty_expression_stack(); - // Setup parameters. + // Thread will be loaded to R3_ARG1. - __ load_const_optimized(R4_ARG2, (address) name); - __ mr(R5_ARG3, R17_tos); - // R6_ARG4 contains specified class. - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose)); -#ifdef ASSERT + // Target class oop is in register R5_ARG3 by convention! + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_ClassCastException_verbose, R17_tos, R5_ARG3)); // Above call must not return here since exception pending. - __ should_not_reach_here(); -#endif + DEBUG_ONLY(__ should_not_reach_here();) return entry; } #endif @@ -1538,14 +1532,32 @@ void TemplateInterpreterGenerator::generate_throw_exception() { __ stw(R0, in_bytes(JavaThread::popframe_condition_offset()), R16_thread); // Get out of the current method and re-execute the call that called us. - __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ return_pc, R11_scratch1, R12_scratch2); + __ merge_frames(/*top_frame_sp*/ R21_sender_SP, /*return_pc*/ noreg, R11_scratch1, R12_scratch2); __ restore_interpreter_state(R11_scratch1); __ ld(R12_scratch2, _ijava_state_neg(top_frame_sp), R11_scratch1); __ resize_frame_absolute(R12_scratch2, R11_scratch1, R0); - __ mtlr(return_pc); if (ProfileInterpreter) { __ set_method_data_pointer_for_bcp(); } +#if INCLUDE_JVMTI + Label L_done; + + __ lbz(R11_scratch1, 0, R14_bcp); + __ cmpwi(CCR0, R11_scratch1, Bytecodes::_invokestatic); + __ bne(CCR0, L_done); + + // The member name argument must be restored if _invokestatic is re-executed after a PopFrame call. + // Detect such a case in the InterpreterRuntime function and return the member name argument, or NULL. + __ ld(R4_ARG2, 0, R18_locals); + __ call_VM(R11_scratch1, CAST_FROM_FN_PTR(address, InterpreterRuntime::member_name_arg_or_null), + R4_ARG2, R19_method, R14_bcp); + + __ cmpdi(CCR0, R11_scratch1, 0); + __ beq(CCR0, L_done); + + __ std(R11_scratch1, wordSize, R15_esp); + __ bind(L_done); +#endif // INCLUDE_JVMTI __ dispatch_next(vtos); } // end of JVMTI PopFrame support diff --git a/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp b/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp index e7846bc2859..367e8fef7d7 100644 --- a/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp +++ b/hotspot/src/cpu/ppc/vm/templateTable_ppc_64.cpp @@ -64,7 +64,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, assert_different_registers(Rtmp1, Rtmp2, Rtmp3, Rval, Rbase); switch (barrier) { -#ifndef SERIALGC +#if INCLUDE_ALL_GCS case BarrierSet::G1SATBCT: case BarrierSet::G1SATBCTLogging: { @@ -104,7 +104,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, __ bind(Ldone); } break; -#endif // SERIALGC +#endif // INCLUDE_ALL_GCS case BarrierSet::CardTableModRef: case BarrierSet::CardTableExtension: { @@ -259,17 +259,17 @@ void TemplateTable::fconst(int value) { switch (value) { default: ShouldNotReachHere(); case 0: { - int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0); + int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0, true); __ lfs(F15_ftos, simm16_offset, R11_scratch1); break; } case 1: { - int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0); + int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0, true); __ lfs(F15_ftos, simm16_offset, R11_scratch1); break; } case 2: { - int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&two, R0); + int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&two, R0, true); __ lfs(F15_ftos, simm16_offset, R11_scratch1); break; } @@ -282,12 +282,12 @@ void TemplateTable::dconst(int value) { static double one = 1.0; switch (value) { case 0: { - int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0); + int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&zero, R0, true); __ lfd(F15_ftos, simm16_offset, R11_scratch1); break; } case 1: { - int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0); + int simm16_offset = __ load_const_optimized(R11_scratch1, (address*)&one, R0, true); __ lfd(F15_ftos, simm16_offset, R11_scratch1); break; } @@ -3453,16 +3453,6 @@ void TemplateTable::invokedynamic(int byte_no) { Rscratch1 = R11_scratch1, Rscratch2 = R12_scratch2; - if (!EnableInvokeDynamic) { - // We should not encounter this bytecode if !EnableInvokeDynamic. - // The verifier will stop it. However, if we get past the verifier, - // this will stop the thread in a reasonable way, without crashing the JVM. - __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); - // The call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - return; - } - prepare_invoke(byte_no, Rmethod, Rret_addr, Rscratch1, noreg, Rflags, Rscratch2); // Profile this call. @@ -3486,12 +3476,6 @@ void TemplateTable::invokehandle(int byte_no) { Rscratch1 = R11_scratch1, Rscratch2 = R12_scratch2; - if (!EnableInvokeDynamic) { - // Rewriter does not generate this bytecode. - __ should_not_reach_here(); - return; - } - prepare_invoke(byte_no, Rmethod, Rret_addr, Rscratch1, Rrecv, Rflags, Rscratch2); __ verify_method_ptr(Rmethod); __ null_check_throw(Rrecv, -1, Rscratch2); @@ -3728,9 +3712,9 @@ void TemplateTable::checkcast() { transition(atos, atos); Label Ldone, Lis_null, Lquicked, Lresolved; - Register Roffset = R5_ARG3, + Register Roffset = R6_ARG4, RobjKlass = R4_ARG2, - RspecifiedKlass = R6_ARG4, // Generate_ClassCastException_verbose_handler will expect this register. + RspecifiedKlass = R5_ARG3, // Generate_ClassCastException_verbose_handler will read value from this register. Rcpool = R11_scratch1, Rtags = R12_scratch2; diff --git a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp index ffbc6f27cf3..db7ff9eca81 100644 --- a/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/assembler_sparc.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -123,8 +123,13 @@ class Assembler : public AbstractAssembler { fpop2_op3 = 0x35, impdep1_op3 = 0x36, aes3_op3 = 0x36, + alignaddr_op3 = 0x36, + faligndata_op3 = 0x36, flog3_op3 = 0x36, + edge_op3 = 0x36, + fsrc_op3 = 0x36, impdep2_op3 = 0x37, + stpartialf_op3 = 0x37, jmpl_op3 = 0x38, rett_op3 = 0x39, trap_op3 = 0x3a, @@ -175,17 +180,23 @@ class Assembler : public AbstractAssembler { enum opfs { // selected opfs + edge8n_opf = 0x01, + fmovs_opf = 0x01, fmovd_opf = 0x02, fnegs_opf = 0x05, fnegd_opf = 0x06, + alignaddr_opf = 0x18, + fadds_opf = 0x41, faddd_opf = 0x42, fsubs_opf = 0x45, fsubd_opf = 0x46, + faligndata_opf = 0x48, + fmuls_opf = 0x49, fmuld_opf = 0x4a, fdivs_opf = 0x4d, @@ -348,6 +359,8 @@ class Assembler : public AbstractAssembler { ASI_PRIMARY = 0x80, ASI_PRIMARY_NOFAULT = 0x82, ASI_PRIMARY_LITTLE = 0x88, + // 8x8-bit partial store + ASI_PST8_PRIMARY = 0xC0, // Block initializing store ASI_ST_BLKINIT_PRIMARY = 0xE2, // Most-Recently-Used (MRU) BIS variant @@ -585,6 +598,9 @@ class Assembler : public AbstractAssembler { // instruction only in VIS1 static void vis1_only() { assert( VM_Version::has_vis1(), "This instruction only works on SPARC with VIS1"); } + // instruction only in VIS2 + static void vis2_only() { assert( VM_Version::has_vis2(), "This instruction only works on SPARC with VIS2"); } + // instruction only in VIS3 static void vis3_only() { assert( VM_Version::has_vis3(), "This instruction only works on SPARC with VIS3"); } @@ -1164,6 +1180,20 @@ public: inline void wrfprs( Register d) { v9_only(); emit_int32( op(arith_op) | rs1(d) | op3(wrreg_op3) | u_field(6, 29, 25)); } + // VIS1 instructions + + void alignaddr( Register s1, Register s2, Register d ) { vis1_only(); emit_int32( op(arith_op) | rd(d) | op3(alignaddr_op3) | rs1(s1) | opf(alignaddr_opf) | rs2(s2)); } + + void faligndata( FloatRegister s1, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, FloatRegisterImpl::D) | op3(faligndata_op3) | fs1(s1, FloatRegisterImpl::D) | opf(faligndata_opf) | fs2(s2, FloatRegisterImpl::D)); } + + void fsrc2( FloatRegisterImpl::Width w, FloatRegister s2, FloatRegister d ) { vis1_only(); emit_int32( op(arith_op) | fd(d, w) | op3(fsrc_op3) | opf(0x7A - w) | fs2(s2, w)); } + + void stpartialf( Register s1, Register s2, FloatRegister d, int ia = -1 ) { vis1_only(); emit_int32( op(ldst_op) | fd(d, FloatRegisterImpl::D) | op3(stpartialf_op3) | rs1(s1) | imm_asi(ia) | rs2(s2)); } + + // VIS2 instructions + + void edge8n( Register s1, Register s2, Register d ) { vis2_only(); emit_int32( op(arith_op) | rd(d) | op3(edge_op3) | rs1(s1) | opf(edge8n_opf) | rs2(s2)); } + // VIS3 instructions void movstosw( FloatRegister s, Register d ) { vis3_only(); emit_int32( op(arith_op) | rd(d) | op3(mftoi_op3) | opf(mstosw_opf) | fs2(s, FloatRegisterImpl::S)); } diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.hpp b/hotspot/src/cpu/sparc/vm/frame_sparc.hpp index 25bfea2a2c3..51a014872d5 100644 --- a/hotspot/src/cpu/sparc/vm/frame_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.hpp @@ -259,8 +259,8 @@ // next two fns read and write Lmonitors value, private: - BasicObjectLock* interpreter_frame_monitors() const { return *interpreter_frame_monitors_addr(); } - void interpreter_frame_set_monitors(BasicObjectLock* monitors) { *interpreter_frame_monitors_addr() = monitors; } + BasicObjectLock* interpreter_frame_monitors() const; + void interpreter_frame_set_monitors(BasicObjectLock* monitors); #else public: inline interpreterState get_interpreterState() const { diff --git a/hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp b/hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp index b87681750d2..8aa0105bf0d 100644 --- a/hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp +++ b/hotspot/src/cpu/sparc/vm/frame_sparc.inline.hpp @@ -226,6 +226,13 @@ inline Method** frame::interpreter_frame_method_addr() const { return (Method**)sp_addr_at( Lmethod->sp_offset_in_saved_window()); } +inline BasicObjectLock* frame::interpreter_frame_monitors() const { + return *interpreter_frame_monitors_addr(); +} + +inline void frame::interpreter_frame_set_monitors(BasicObjectLock* monitors) { + *interpreter_frame_monitors_addr() = monitors; +} // Constant pool cache diff --git a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp index c809d2b2694..6f2e16c3c66 100644 --- a/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/interp_masm_sparc.cpp @@ -727,7 +727,6 @@ void InterpreterMacroAssembler::get_cache_index_at_bcp(Register temp, Register i if (index_size == sizeof(u2)) { get_2_byte_integer_at_bcp(bcp_offset, temp, index, Unsigned); } else if (index_size == sizeof(u4)) { - assert(EnableInvokeDynamic, "giant index used only for JSR 292"); get_4_byte_integer_at_bcp(bcp_offset, temp, index); assert(ConstantPool::decode_invokedynamic_index(~123) == 123, "else change next line"); xor3(index, -1, index); // convert to plain index diff --git a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp index 25023404db8..7cac116fada 100644 --- a/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/stubGenerator_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -83,7 +83,7 @@ class StubGenerator: public StubCodeGenerator { private: #ifdef PRODUCT -#define inc_counter_np(a,b,c) (0) +#define inc_counter_np(a,b,c) #else #define inc_counter_np(counter, t1, t2) \ BLOCK_COMMENT("inc_counter " #counter); \ @@ -1055,7 +1055,7 @@ class StubGenerator: public StubCodeGenerator { Label& L_loop, bool use_prefetch, bool use_bis); void disjoint_copy_core(Register from, Register to, Register count, int log2_elem_size, - int iter_size, CopyLoopFunc copy_loop_func) { + int iter_size, StubGenerator::CopyLoopFunc copy_loop_func) { Label L_copy; assert(log2_elem_size <= 3, "the following code should be changed"); @@ -1206,7 +1206,7 @@ class StubGenerator: public StubCodeGenerator { __ inc(from, 8); __ sllx(O3, left_shift, O3); - disjoint_copy_core(from, to, count, log2_elem_size, 16, copy_16_bytes_shift_loop); + disjoint_copy_core(from, to, count, log2_elem_size, 16, &StubGenerator::copy_16_bytes_shift_loop); __ inccc(count, count_dec>>1 ); // + 8 bytes __ brx(Assembler::negative, true, Assembler::pn, L_copy_last_bytes); @@ -2085,7 +2085,7 @@ class StubGenerator: public StubCodeGenerator { __ dec(count, 4); // The cmp at the beginning guaranty count >= 4 __ sllx(O3, 32, O3); - disjoint_copy_core(from, to, count, 2, 16, copy_16_bytes_loop); + disjoint_copy_core(from, to, count, 2, 16, &StubGenerator::copy_16_bytes_loop); __ br(Assembler::always, false, Assembler::pt, L_copy_4_bytes); __ delayed()->inc(count, 4); // restore 'count' @@ -2366,7 +2366,7 @@ class StubGenerator: public StubCodeGenerator { // count >= 0 (original count - 8) __ mov(from, from64); - disjoint_copy_core(from64, to64, count, 3, 64, copy_64_bytes_loop); + disjoint_copy_core(from64, to64, count, 3, 64, &StubGenerator::copy_64_bytes_loop); // Restore O4(offset0), O5(offset8) __ sub(from64, from, offset0); @@ -3305,9 +3305,12 @@ class StubGenerator: public StubCodeGenerator { } address generate_aescrypt_encryptBlock() { + // required since we read expanded key 'int' array starting first element without alignment considerations + assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, + "the following code assumes that first element of an int array is aligned to 8 bytes"); __ align(CodeEntryAlignment); - StubCodeMark mark(this, "StubRoutines", "aesencryptBlock"); - Label L_doLast128bit, L_storeOutput; + StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); + Label L_load_misaligned_input, L_load_expanded_key, L_doLast128bit, L_storeOutput, L_store_misaligned_output; address start = __ pc(); Register from = O0; // source byte array Register to = O1; // destination byte array @@ -3317,15 +3320,33 @@ class StubGenerator: public StubCodeGenerator { // read expanded key length __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); - // load input into F54-F56; F30-F31 used as temp - __ ldf(FloatRegisterImpl::S, from, 0, F30); - __ ldf(FloatRegisterImpl::S, from, 4, F31); - __ fmov(FloatRegisterImpl::D, F30, F54); - __ ldf(FloatRegisterImpl::S, from, 8, F30); - __ ldf(FloatRegisterImpl::S, from, 12, F31); - __ fmov(FloatRegisterImpl::D, F30, F56); + // Method to address arbitrary alignment for load instructions: + // Check last 3 bits of 'from' address to see if it is aligned to 8-byte boundary + // If zero/aligned then continue with double FP load instructions + // If not zero/mis-aligned then alignaddr will set GSR.align with number of bytes to skip during faligndata + // alignaddr will also convert arbitrary aligned 'from' address to nearest 8-byte aligned address + // load 3 * 8-byte components (to read 16 bytes input) in 3 different FP regs starting at this aligned address + // faligndata will then extract (based on GSR.align value) the appropriate 8 bytes from the 2 source regs - // load expanded key + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input); + __ delayed()->alignaddr(from, G0, from); + + // aligned case: load input into F54-F56 + __ ldf(FloatRegisterImpl::D, from, 0, F54); + __ ldf(FloatRegisterImpl::D, from, 8, F56); + __ ba_short(L_load_expanded_key); + + __ BIND(L_load_misaligned_input); + __ ldf(FloatRegisterImpl::D, from, 0, F54); + __ ldf(FloatRegisterImpl::D, from, 8, F56); + __ ldf(FloatRegisterImpl::D, from, 16, F58); + __ faligndata(F54, F56, F54); + __ faligndata(F56, F58, F56); + + __ BIND(L_load_expanded_key); + // Since we load expanded key buffers starting first element, 8-byte alignment is guaranteed for ( int i = 0; i <= 38; i += 2 ) { __ ldf(FloatRegisterImpl::D, key, i*4, as_FloatRegister(i)); } @@ -3365,8 +3386,7 @@ class StubGenerator: public StubCodeGenerator { __ ldf(FloatRegisterImpl::D, key, 232, F50); __ aes_eround01(F52, F54, F56, F58); //round 13 __ aes_eround23(F46, F54, F56, F60); - __ br(Assembler::always, false, Assembler::pt, L_storeOutput); - __ delayed()->nop(); + __ ba_short(L_storeOutput); __ BIND(L_doLast128bit); __ ldf(FloatRegisterImpl::D, key, 160, F48); @@ -3377,23 +3397,62 @@ class StubGenerator: public StubCodeGenerator { __ aes_eround01_l(F48, F58, F60, F54); //last round __ aes_eround23_l(F50, F58, F60, F56); - // store output into the destination array, F0-F1 used as temp - __ fmov(FloatRegisterImpl::D, F54, F0); - __ stf(FloatRegisterImpl::S, F0, to, 0); - __ stf(FloatRegisterImpl::S, F1, to, 4); - __ fmov(FloatRegisterImpl::D, F56, F0); - __ stf(FloatRegisterImpl::S, F0, to, 8); + // Method to address arbitrary alignment for store instructions: + // Check last 3 bits of 'dest' address to see if it is aligned to 8-byte boundary + // If zero/aligned then continue with double FP store instructions + // If not zero/mis-aligned then edge8n will generate edge mask in result reg (O3 in below case) + // Example: If dest address is 0x07 and nearest 8-byte aligned address is 0x00 then edge mask will be 00000001 + // Compute (8-n) where n is # of bytes skipped by partial store(stpartialf) inst from edge mask, n=7 in this case + // We get the value of n from the andcc that checks 'dest' alignment. n is available in O5 in below case. + // Set GSR.align to (8-n) using alignaddr + // Circular byte shift store values by n places so that the original bytes are at correct position for stpartialf + // Set the arbitrarily aligned 'dest' address to nearest 8-byte aligned address + // Store (partial) the original first (8-n) bytes starting at the original 'dest' address + // Negate the edge mask so that the subsequent stpartialf can store the original (8-n-1)th through 8th bytes at appropriate address + // We need to execute this process for both the 8-byte result values + + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, O5); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output); + __ delayed()->edge8n(to, G0, O3); + + // aligned case: store output into the destination array + __ stf(FloatRegisterImpl::D, F54, to, 0); __ retl(); - __ delayed()->stf(FloatRegisterImpl::S, F1, to, 12); + __ delayed()->stf(FloatRegisterImpl::D, F56, to, 8); + + __ BIND(L_store_misaligned_output); + __ add(to, 8, O4); + __ mov(8, O2); + __ sub(O2, O5, O2); + __ alignaddr(O2, G0, O2); + __ faligndata(F54, F54, F54); + __ faligndata(F56, F56, F56); + __ and3(to, -8, to); + __ and3(O4, -8, O4); + __ stpartialf(to, O3, F54, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(O4, O3, F56, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(O4, 8, O4); + __ orn(G0, O3, O3); + __ stpartialf(to, O3, F54, Assembler::ASI_PST8_PRIMARY); + __ retl(); + __ delayed()->stpartialf(O4, O3, F56, Assembler::ASI_PST8_PRIMARY); return start; } address generate_aescrypt_decryptBlock() { + assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, + "the following code assumes that first element of an int array is aligned to 8 bytes"); + // required since we read original key 'byte' array as well in the decryption stubs + assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, + "the following code assumes that first element of a byte array is aligned to 8 bytes"); __ align(CodeEntryAlignment); - StubCodeMark mark(this, "StubRoutines", "aesdecryptBlock"); + StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); address start = __ pc(); - Label L_expand192bit, L_expand256bit, L_common_transform; + Label L_load_misaligned_input, L_load_original_key, L_expand192bit, L_expand256bit, L_reload_misaligned_input; + Label L_256bit_transform, L_common_transform, L_store_misaligned_output; Register from = O0; // source byte array Register to = O1; // destination byte array Register key = O2; // expanded key array @@ -3403,15 +3462,29 @@ class StubGenerator: public StubCodeGenerator { // read expanded key array length __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); - // load input into F52-F54; F30,F31 used as temp - __ ldf(FloatRegisterImpl::S, from, 0, F30); - __ ldf(FloatRegisterImpl::S, from, 4, F31); - __ fmov(FloatRegisterImpl::D, F30, F52); - __ ldf(FloatRegisterImpl::S, from, 8, F30); - __ ldf(FloatRegisterImpl::S, from, 12, F31); - __ fmov(FloatRegisterImpl::D, F30, F54); + // save 'from' since we may need to recheck alignment in case of 256-bit decryption + __ mov(from, G1); + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input); + __ delayed()->alignaddr(from, G0, from); + + // aligned case: load input into F52-F54 + __ ldf(FloatRegisterImpl::D, from, 0, F52); + __ ldf(FloatRegisterImpl::D, from, 8, F54); + __ ba_short(L_load_original_key); + + __ BIND(L_load_misaligned_input); + __ ldf(FloatRegisterImpl::D, from, 0, F52); + __ ldf(FloatRegisterImpl::D, from, 8, F54); + __ ldf(FloatRegisterImpl::D, from, 16, F56); + __ faligndata(F52, F54, F52); + __ faligndata(F54, F56, F54); + + __ BIND(L_load_original_key); // load original key from SunJCE expanded decryption key + // Since we load original key buffer starting first element, 8-byte alignment is guaranteed for ( int i = 0; i <= 3; i++ ) { __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); } @@ -3432,8 +3505,7 @@ class StubGenerator: public StubCodeGenerator { // perform 128-bit key specific inverse cipher transformation __ fxor(FloatRegisterImpl::D, F42, F54, F54); __ fxor(FloatRegisterImpl::D, F40, F52, F52); - __ br(Assembler::always, false, Assembler::pt, L_common_transform); - __ delayed()->nop(); + __ ba_short(L_common_transform); __ BIND(L_expand192bit); @@ -3457,8 +3529,7 @@ class StubGenerator: public StubCodeGenerator { __ aes_dround01(F44, F52, F54, F56); __ aes_dround23(F42, F56, F58, F54); __ aes_dround01(F40, F56, F58, F52); - __ br(Assembler::always, false, Assembler::pt, L_common_transform); - __ delayed()->nop(); + __ ba_short(L_common_transform); __ BIND(L_expand256bit); @@ -3478,14 +3549,31 @@ class StubGenerator: public StubCodeGenerator { __ aes_kexpand2(F50, F56, F58); for ( int i = 0; i <= 6; i += 2 ) { - __ fmov(FloatRegisterImpl::D, as_FloatRegister(58-i), as_FloatRegister(i)); + __ fsrc2(FloatRegisterImpl::D, as_FloatRegister(58-i), as_FloatRegister(i)); } - // load input into F52-F54 + // reload original 'from' address + __ mov(G1, from); + + // re-check 8-byte alignment + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_reload_misaligned_input); + __ delayed()->alignaddr(from, G0, from); + + // aligned case: load input into F52-F54 __ ldf(FloatRegisterImpl::D, from, 0, F52); __ ldf(FloatRegisterImpl::D, from, 8, F54); + __ ba_short(L_256bit_transform); + + __ BIND(L_reload_misaligned_input); + __ ldf(FloatRegisterImpl::D, from, 0, F52); + __ ldf(FloatRegisterImpl::D, from, 8, F54); + __ ldf(FloatRegisterImpl::D, from, 16, F56); + __ faligndata(F52, F54, F52); + __ faligndata(F54, F56, F54); // perform 256-bit key specific inverse cipher transformation + __ BIND(L_256bit_transform); __ fxor(FloatRegisterImpl::D, F0, F54, F54); __ fxor(FloatRegisterImpl::D, F2, F52, F52); __ aes_dround23(F4, F52, F54, F58); @@ -3515,43 +3603,71 @@ class StubGenerator: public StubCodeGenerator { } } - // store output to destination array, F0-F1 used as temp - __ fmov(FloatRegisterImpl::D, F52, F0); - __ stf(FloatRegisterImpl::S, F0, to, 0); - __ stf(FloatRegisterImpl::S, F1, to, 4); - __ fmov(FloatRegisterImpl::D, F54, F0); - __ stf(FloatRegisterImpl::S, F0, to, 8); + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, O5); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output); + __ delayed()->edge8n(to, G0, O3); + + // aligned case: store output into the destination array + __ stf(FloatRegisterImpl::D, F52, to, 0); __ retl(); - __ delayed()->stf(FloatRegisterImpl::S, F1, to, 12); + __ delayed()->stf(FloatRegisterImpl::D, F54, to, 8); + + __ BIND(L_store_misaligned_output); + __ add(to, 8, O4); + __ mov(8, O2); + __ sub(O2, O5, O2); + __ alignaddr(O2, G0, O2); + __ faligndata(F52, F52, F52); + __ faligndata(F54, F54, F54); + __ and3(to, -8, to); + __ and3(O4, -8, O4); + __ stpartialf(to, O3, F52, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(O4, O3, F54, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(O4, 8, O4); + __ orn(G0, O3, O3); + __ stpartialf(to, O3, F52, Assembler::ASI_PST8_PRIMARY); + __ retl(); + __ delayed()->stpartialf(O4, O3, F54, Assembler::ASI_PST8_PRIMARY); return start; } address generate_cipherBlockChaining_encryptAESCrypt() { + assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, + "the following code assumes that first element of an int array is aligned to 8 bytes"); + assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, + "the following code assumes that first element of a byte array is aligned to 8 bytes"); __ align(CodeEntryAlignment); StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); - Label L_cbcenc128, L_cbcenc192, L_cbcenc256; + Label L_cbcenc128, L_load_misaligned_input_128bit, L_128bit_transform, L_store_misaligned_output_128bit; + Label L_check_loop_end_128bit, L_cbcenc192, L_load_misaligned_input_192bit, L_192bit_transform; + Label L_store_misaligned_output_192bit, L_check_loop_end_192bit, L_cbcenc256, L_load_misaligned_input_256bit; + Label L_256bit_transform, L_store_misaligned_output_256bit, L_check_loop_end_256bit; address start = __ pc(); - Register from = O0; // source byte array - Register to = O1; // destination byte array - Register key = O2; // expanded key array - Register rvec = O3; // init vector - const Register len_reg = O4; // cipher length - const Register keylen = O5; // reg for storing expanded key array length + Register from = I0; // source byte array + Register to = I1; // destination byte array + Register key = I2; // expanded key array + Register rvec = I3; // init vector + const Register len_reg = I4; // cipher length + const Register keylen = I5; // reg for storing expanded key array length - // save cipher len to return in the end - __ mov(len_reg, L1); + // save cipher len before save_frame, to return in the end + __ mov(O4, L0); + __ save_frame(0); // read expanded key length __ ldsw(Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT)), keylen, 0); - // load init vector + // load initial vector, 8-byte alignment is guranteed __ ldf(FloatRegisterImpl::D, rvec, 0, F60); __ ldf(FloatRegisterImpl::D, rvec, 8, F62); + // load key, 8-byte alignment is guranteed __ ldx(key,0,G1); - __ ldx(key,8,G2); + __ ldx(key,8,G5); - // start loading expanded key + // start loading expanded key, 8-byte alignment is guranteed for ( int i = 0, j = 16; i <= 38; i += 2, j += 8 ) { __ ldf(FloatRegisterImpl::D, key, j, as_FloatRegister(i)); } @@ -3571,15 +3687,35 @@ class StubGenerator: public StubCodeGenerator { } // 256-bit original key size - __ br(Assembler::always, false, Assembler::pt, L_cbcenc256); - __ delayed()->nop(); + __ ba_short(L_cbcenc256); __ align(OptoLoopAlignment); __ BIND(L_cbcenc128); + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_128bit); + __ delayed()->mov(from, L1); // save original 'from' address before alignaddr + + // aligned case: load input into G3 and G4 __ ldx(from,0,G3); __ ldx(from,8,G4); + __ ba_short(L_128bit_transform); + + __ BIND(L_load_misaligned_input_128bit); + // can clobber F48, F50 and F52 as they are not used in 128 and 192-bit key encryption + __ alignaddr(from, G0, from); + __ ldf(FloatRegisterImpl::D, from, 0, F48); + __ ldf(FloatRegisterImpl::D, from, 8, F50); + __ ldf(FloatRegisterImpl::D, from, 16, F52); + __ faligndata(F48, F50, F48); + __ faligndata(F50, F52, F50); + __ movdtox(F48, G3); + __ movdtox(F50, G4); + __ mov(L1, from); + + __ BIND(L_128bit_transform); __ xor3(G1,G3,G3); - __ xor3(G2,G4,G4); + __ xor3(G5,G4,G4); __ movxtod(G3,F56); __ movxtod(G4,F58); __ fxor(FloatRegisterImpl::D, F60, F56, F60); @@ -3598,24 +3734,81 @@ class StubGenerator: public StubCodeGenerator { } } + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, L1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_128bit); + __ delayed()->edge8n(to, G0, L2); + + // aligned case: store output into the destination array __ stf(FloatRegisterImpl::D, F60, to, 0); __ stf(FloatRegisterImpl::D, F62, to, 8); + __ ba_short(L_check_loop_end_128bit); + + __ BIND(L_store_misaligned_output_128bit); + __ add(to, 8, L3); + __ mov(8, L4); + __ sub(L4, L1, L4); + __ alignaddr(L4, G0, L4); + // save cipher text before circular right shift + // as it needs to be stored as iv for next block (see code before next retl) + __ movdtox(F60, L6); + __ movdtox(F62, L7); + __ faligndata(F60, F60, F60); + __ faligndata(F62, F62, F62); + __ mov(to, L5); + __ and3(to, -8, to); + __ and3(L3, -8, L3); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(L3, 8, L3); + __ orn(G0, L2, L2); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ mov(L5, to); + __ movxtod(L6, F60); + __ movxtod(L7, F62); + + __ BIND(L_check_loop_end_128bit); __ add(from, 16, from); __ add(to, 16, to); __ subcc(len_reg, 16, len_reg); __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc128); __ delayed()->nop(); + // re-init intial vector for next block, 8-byte alignment is guaranteed __ stf(FloatRegisterImpl::D, F60, rvec, 0); __ stf(FloatRegisterImpl::D, F62, rvec, 8); + __ restore(); __ retl(); - __ delayed()->mov(L1, O0); + __ delayed()->mov(L0, O0); __ align(OptoLoopAlignment); __ BIND(L_cbcenc192); + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_192bit); + __ delayed()->mov(from, L1); // save original 'from' address before alignaddr + + // aligned case: load input into G3 and G4 __ ldx(from,0,G3); __ ldx(from,8,G4); + __ ba_short(L_192bit_transform); + + __ BIND(L_load_misaligned_input_192bit); + // can clobber F48, F50 and F52 as they are not used in 128 and 192-bit key encryption + __ alignaddr(from, G0, from); + __ ldf(FloatRegisterImpl::D, from, 0, F48); + __ ldf(FloatRegisterImpl::D, from, 8, F50); + __ ldf(FloatRegisterImpl::D, from, 16, F52); + __ faligndata(F48, F50, F48); + __ faligndata(F50, F52, F50); + __ movdtox(F48, G3); + __ movdtox(F50, G4); + __ mov(L1, from); + + __ BIND(L_192bit_transform); __ xor3(G1,G3,G3); - __ xor3(G2,G4,G4); + __ xor3(G5,G4,G4); __ movxtod(G3,F56); __ movxtod(G4,F58); __ fxor(FloatRegisterImpl::D, F60, F56, F60); @@ -3634,24 +3827,81 @@ class StubGenerator: public StubCodeGenerator { } } + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, L1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_192bit); + __ delayed()->edge8n(to, G0, L2); + + // aligned case: store output into the destination array __ stf(FloatRegisterImpl::D, F60, to, 0); __ stf(FloatRegisterImpl::D, F62, to, 8); + __ ba_short(L_check_loop_end_192bit); + + __ BIND(L_store_misaligned_output_192bit); + __ add(to, 8, L3); + __ mov(8, L4); + __ sub(L4, L1, L4); + __ alignaddr(L4, G0, L4); + __ movdtox(F60, L6); + __ movdtox(F62, L7); + __ faligndata(F60, F60, F60); + __ faligndata(F62, F62, F62); + __ mov(to, L5); + __ and3(to, -8, to); + __ and3(L3, -8, L3); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(L3, 8, L3); + __ orn(G0, L2, L2); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ mov(L5, to); + __ movxtod(L6, F60); + __ movxtod(L7, F62); + + __ BIND(L_check_loop_end_192bit); __ add(from, 16, from); __ subcc(len_reg, 16, len_reg); __ add(to, 16, to); __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc192); __ delayed()->nop(); + // re-init intial vector for next block, 8-byte alignment is guaranteed __ stf(FloatRegisterImpl::D, F60, rvec, 0); __ stf(FloatRegisterImpl::D, F62, rvec, 8); + __ restore(); __ retl(); - __ delayed()->mov(L1, O0); + __ delayed()->mov(L0, O0); __ align(OptoLoopAlignment); __ BIND(L_cbcenc256); + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_256bit); + __ delayed()->mov(from, L1); // save original 'from' address before alignaddr + + // aligned case: load input into G3 and G4 __ ldx(from,0,G3); __ ldx(from,8,G4); + __ ba_short(L_256bit_transform); + + __ BIND(L_load_misaligned_input_256bit); + // cannot clobber F48, F50 and F52. F56, F58 can be used though + __ alignaddr(from, G0, from); + __ movdtox(F60, L2); // save F60 before overwriting + __ ldf(FloatRegisterImpl::D, from, 0, F56); + __ ldf(FloatRegisterImpl::D, from, 8, F58); + __ ldf(FloatRegisterImpl::D, from, 16, F60); + __ faligndata(F56, F58, F56); + __ faligndata(F58, F60, F58); + __ movdtox(F56, G3); + __ movdtox(F58, G4); + __ mov(L1, from); + __ movxtod(L2, F60); + + __ BIND(L_256bit_transform); __ xor3(G1,G3,G3); - __ xor3(G2,G4,G4); + __ xor3(G5,G4,G4); __ movxtod(G3,F56); __ movxtod(G4,F58); __ fxor(FloatRegisterImpl::D, F60, F56, F60); @@ -3670,26 +3920,69 @@ class StubGenerator: public StubCodeGenerator { } } + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, L1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_256bit); + __ delayed()->edge8n(to, G0, L2); + + // aligned case: store output into the destination array __ stf(FloatRegisterImpl::D, F60, to, 0); __ stf(FloatRegisterImpl::D, F62, to, 8); + __ ba_short(L_check_loop_end_256bit); + + __ BIND(L_store_misaligned_output_256bit); + __ add(to, 8, L3); + __ mov(8, L4); + __ sub(L4, L1, L4); + __ alignaddr(L4, G0, L4); + __ movdtox(F60, L6); + __ movdtox(F62, L7); + __ faligndata(F60, F60, F60); + __ faligndata(F62, F62, F62); + __ mov(to, L5); + __ and3(to, -8, to); + __ and3(L3, -8, L3); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(L3, 8, L3); + __ orn(G0, L2, L2); + __ stpartialf(to, L2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(L3, L2, F62, Assembler::ASI_PST8_PRIMARY); + __ mov(L5, to); + __ movxtod(L6, F60); + __ movxtod(L7, F62); + + __ BIND(L_check_loop_end_256bit); __ add(from, 16, from); __ subcc(len_reg, 16, len_reg); __ add(to, 16, to); __ br(Assembler::notEqual, false, Assembler::pt, L_cbcenc256); __ delayed()->nop(); + // re-init intial vector for next block, 8-byte alignment is guaranteed __ stf(FloatRegisterImpl::D, F60, rvec, 0); __ stf(FloatRegisterImpl::D, F62, rvec, 8); + __ restore(); __ retl(); - __ delayed()->mov(L1, O0); + __ delayed()->mov(L0, O0); return start; } address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { + assert((arrayOopDesc::base_offset_in_bytes(T_INT) & 7) == 0, + "the following code assumes that first element of an int array is aligned to 8 bytes"); + assert((arrayOopDesc::base_offset_in_bytes(T_BYTE) & 7) == 0, + "the following code assumes that first element of a byte array is aligned to 8 bytes"); __ align(CodeEntryAlignment); StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); Label L_cbcdec_end, L_expand192bit, L_expand256bit, L_dec_first_block_start; Label L_dec_first_block128, L_dec_first_block192, L_dec_next2_blocks128, L_dec_next2_blocks192, L_dec_next2_blocks256; + Label L_load_misaligned_input_first_block, L_transform_first_block, L_load_misaligned_next2_blocks128, L_transform_next2_blocks128; + Label L_load_misaligned_next2_blocks192, L_transform_next2_blocks192, L_load_misaligned_next2_blocks256, L_transform_next2_blocks256; + Label L_store_misaligned_output_first_block, L_check_decrypt_end, L_store_misaligned_output_next2_blocks128; + Label L_check_decrypt_loop_end128, L_store_misaligned_output_next2_blocks192, L_check_decrypt_loop_end192; + Label L_store_misaligned_output_next2_blocks256, L_check_decrypt_loop_end256; address start = __ pc(); Register from = I0; // source byte array Register to = I1; // destination byte array @@ -3704,11 +3997,12 @@ class StubGenerator: public StubCodeGenerator { __ save_frame(0); //args are read from I* registers since we save the frame in the beginning // load original key from SunJCE expanded decryption key + // Since we load original key buffer starting first element, 8-byte alignment is guaranteed for ( int i = 0; i <= 3; i++ ) { __ ldf(FloatRegisterImpl::S, original_key, i*4, as_FloatRegister(i)); } - // load initial vector + // load initial vector, 8-byte alignment is guaranteed __ ldx(rvec,0,L0); __ ldx(rvec,8,L1); @@ -3733,11 +4027,10 @@ class StubGenerator: public StubCodeGenerator { __ movdtox(F42,L3); __ and3(len_reg, 16, L4); - __ br_null(L4, false, Assembler::pt, L_dec_next2_blocks128); - __ delayed()->nop(); + __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks128); + __ nop(); - __ br(Assembler::always, false, Assembler::pt, L_dec_first_block_start); - __ delayed()->nop(); + __ ba_short(L_dec_first_block_start); __ BIND(L_expand192bit); // load rest of the 192-bit key @@ -3758,11 +4051,10 @@ class StubGenerator: public StubCodeGenerator { __ movdtox(F50,L3); __ and3(len_reg, 16, L4); - __ br_null(L4, false, Assembler::pt, L_dec_next2_blocks192); - __ delayed()->nop(); + __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks192); + __ nop(); - __ br(Assembler::always, false, Assembler::pt, L_dec_first_block_start); - __ delayed()->nop(); + __ ba_short(L_dec_first_block_start); __ BIND(L_expand256bit); // load rest of the 256-bit key @@ -3785,12 +4077,32 @@ class StubGenerator: public StubCodeGenerator { __ movdtox(F58,L3); __ and3(len_reg, 16, L4); - __ br_null(L4, false, Assembler::pt, L_dec_next2_blocks256); - __ delayed()->nop(); + __ br_null_short(L4, Assembler::pt, L_dec_next2_blocks256); __ BIND(L_dec_first_block_start); + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_input_first_block); + __ delayed()->mov(from, G1); // save original 'from' address before alignaddr + + // aligned case: load input into L4 and L5 __ ldx(from,0,L4); __ ldx(from,8,L5); + __ ba_short(L_transform_first_block); + + __ BIND(L_load_misaligned_input_first_block); + __ alignaddr(from, G0, from); + // F58, F60, F62 can be clobbered + __ ldf(FloatRegisterImpl::D, from, 0, F58); + __ ldf(FloatRegisterImpl::D, from, 8, F60); + __ ldf(FloatRegisterImpl::D, from, 16, F62); + __ faligndata(F58, F60, F58); + __ faligndata(F60, F62, F60); + __ movdtox(F58, L4); + __ movdtox(F60, L5); + __ mov(G1, from); + + __ BIND(L_transform_first_block); __ xor3(L2,L4,G1); __ movxtod(G1,F60); __ xor3(L3,L5,G1); @@ -3833,9 +4145,36 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F56, F60, F60); __ fxor(FloatRegisterImpl::D, F58, F62, F62); + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, G1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_first_block); + __ delayed()->edge8n(to, G0, G2); + + // aligned case: store output into the destination array __ stf(FloatRegisterImpl::D, F60, to, 0); __ stf(FloatRegisterImpl::D, F62, to, 8); + __ ba_short(L_check_decrypt_end); + __ BIND(L_store_misaligned_output_first_block); + __ add(to, 8, G3); + __ mov(8, G4); + __ sub(G4, G1, G4); + __ alignaddr(G4, G0, G4); + __ faligndata(F60, F60, F60); + __ faligndata(F62, F62, F62); + __ mov(to, G1); + __ and3(to, -8, to); + __ and3(G3, -8, G3); + __ stpartialf(to, G2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(G3, G2, F62, Assembler::ASI_PST8_PRIMARY); + __ add(to, 8, to); + __ add(G3, 8, G3); + __ orn(G0, G2, G2); + __ stpartialf(to, G2, F60, Assembler::ASI_PST8_PRIMARY); + __ stpartialf(G3, G2, F62, Assembler::ASI_PST8_PRIMARY); + __ mov(G1, to); + + __ BIND(L_check_decrypt_end); __ add(from, 16, from); __ add(to, 16, to); __ subcc(len_reg, 16, len_reg); @@ -3852,17 +4191,44 @@ class StubGenerator: public StubCodeGenerator { __ BIND(L_dec_next2_blocks128); __ nop(); - // F40:F42 used for first 16-bytes + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks128); + __ delayed()->mov(from, G1); // save original 'from' address before alignaddr + + // aligned case: load input into G4, G5, L4 and L5 __ ldx(from,0,G4); __ ldx(from,8,G5); + __ ldx(from,16,L4); + __ ldx(from,24,L5); + __ ba_short(L_transform_next2_blocks128); + + __ BIND(L_load_misaligned_next2_blocks128); + __ alignaddr(from, G0, from); + // F40, F42, F58, F60, F62 can be clobbered + __ ldf(FloatRegisterImpl::D, from, 0, F40); + __ ldf(FloatRegisterImpl::D, from, 8, F42); + __ ldf(FloatRegisterImpl::D, from, 16, F60); + __ ldf(FloatRegisterImpl::D, from, 24, F62); + __ ldf(FloatRegisterImpl::D, from, 32, F58); + __ faligndata(F40, F42, F40); + __ faligndata(F42, F60, F42); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F58, F62); + __ movdtox(F40, G4); + __ movdtox(F42, G5); + __ movdtox(F60, L4); + __ movdtox(F62, L5); + __ mov(G1, from); + + __ BIND(L_transform_next2_blocks128); + // F40:F42 used for first 16-bytes __ xor3(L2,G4,G1); __ movxtod(G1,F40); __ xor3(L3,G5,G1); __ movxtod(G1,F42); // F60:F62 used for next 16-bytes - __ ldx(from,16,L4); - __ ldx(from,24,L5); __ xor3(L2,L4,G1); __ movxtod(G1,F60); __ xor3(L3,L5,G1); @@ -3891,9 +4257,6 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F46, F40, F40); __ fxor(FloatRegisterImpl::D, F44, F42, F42); - __ stf(FloatRegisterImpl::D, F40, to, 0); - __ stf(FloatRegisterImpl::D, F42, to, 8); - __ movxtod(G4,F56); __ movxtod(G5,F58); __ mov(L4,L0); @@ -3901,32 +4264,93 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F56, F60, F60); __ fxor(FloatRegisterImpl::D, F58, F62, F62); + // For mis-aligned store of 32 bytes of result we can do: + // Circular right-shift all 4 FP registers so that 'head' and 'tail' + // parts that need to be stored starting at mis-aligned address are in a FP reg + // the other 3 FP regs can thus be stored using regular store + // we then use the edge + partial-store mechanism to store the 'head' and 'tail' parts + + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, G1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks128); + __ delayed()->edge8n(to, G0, G2); + + // aligned case: store output into the destination array + __ stf(FloatRegisterImpl::D, F40, to, 0); + __ stf(FloatRegisterImpl::D, F42, to, 8); __ stf(FloatRegisterImpl::D, F60, to, 16); __ stf(FloatRegisterImpl::D, F62, to, 24); + __ ba_short(L_check_decrypt_loop_end128); + __ BIND(L_store_misaligned_output_next2_blocks128); + __ mov(8, G4); + __ sub(G4, G1, G4); + __ alignaddr(G4, G0, G4); + __ faligndata(F40, F42, F56); // F56 can be clobbered + __ faligndata(F42, F60, F42); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F40, F40); + __ mov(to, G1); + __ and3(to, -8, to); + __ stpartialf(to, G2, F40, Assembler::ASI_PST8_PRIMARY); + __ stf(FloatRegisterImpl::D, F56, to, 8); + __ stf(FloatRegisterImpl::D, F42, to, 16); + __ stf(FloatRegisterImpl::D, F60, to, 24); + __ add(to, 32, to); + __ orn(G0, G2, G2); + __ stpartialf(to, G2, F40, Assembler::ASI_PST8_PRIMARY); + __ mov(G1, to); + + __ BIND(L_check_decrypt_loop_end128); __ add(from, 32, from); __ add(to, 32, to); __ subcc(len_reg, 32, len_reg); __ br(Assembler::notEqual, false, Assembler::pt, L_dec_next2_blocks128); __ delayed()->nop(); - __ br(Assembler::always, false, Assembler::pt, L_cbcdec_end); - __ delayed()->nop(); + __ ba_short(L_cbcdec_end); __ align(OptoLoopAlignment); __ BIND(L_dec_next2_blocks192); __ nop(); - // F48:F50 used for first 16-bytes + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks192); + __ delayed()->mov(from, G1); // save original 'from' address before alignaddr + + // aligned case: load input into G4, G5, L4 and L5 __ ldx(from,0,G4); __ ldx(from,8,G5); + __ ldx(from,16,L4); + __ ldx(from,24,L5); + __ ba_short(L_transform_next2_blocks192); + + __ BIND(L_load_misaligned_next2_blocks192); + __ alignaddr(from, G0, from); + // F48, F50, F52, F60, F62 can be clobbered + __ ldf(FloatRegisterImpl::D, from, 0, F48); + __ ldf(FloatRegisterImpl::D, from, 8, F50); + __ ldf(FloatRegisterImpl::D, from, 16, F60); + __ ldf(FloatRegisterImpl::D, from, 24, F62); + __ ldf(FloatRegisterImpl::D, from, 32, F52); + __ faligndata(F48, F50, F48); + __ faligndata(F50, F60, F50); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F52, F62); + __ movdtox(F48, G4); + __ movdtox(F50, G5); + __ movdtox(F60, L4); + __ movdtox(F62, L5); + __ mov(G1, from); + + __ BIND(L_transform_next2_blocks192); + // F48:F50 used for first 16-bytes __ xor3(L2,G4,G1); __ movxtod(G1,F48); __ xor3(L3,G5,G1); __ movxtod(G1,F50); // F60:F62 used for next 16-bytes - __ ldx(from,16,L4); - __ ldx(from,24,L5); __ xor3(L2,L4,G1); __ movxtod(G1,F60); __ xor3(L3,L5,G1); @@ -3955,9 +4379,6 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F54, F48, F48); __ fxor(FloatRegisterImpl::D, F52, F50, F50); - __ stf(FloatRegisterImpl::D, F48, to, 0); - __ stf(FloatRegisterImpl::D, F50, to, 8); - __ movxtod(G4,F56); __ movxtod(G5,F58); __ mov(L4,L0); @@ -3965,32 +4386,87 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F56, F60, F60); __ fxor(FloatRegisterImpl::D, F58, F62, F62); + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, G1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks192); + __ delayed()->edge8n(to, G0, G2); + + // aligned case: store output into the destination array + __ stf(FloatRegisterImpl::D, F48, to, 0); + __ stf(FloatRegisterImpl::D, F50, to, 8); __ stf(FloatRegisterImpl::D, F60, to, 16); __ stf(FloatRegisterImpl::D, F62, to, 24); + __ ba_short(L_check_decrypt_loop_end192); + __ BIND(L_store_misaligned_output_next2_blocks192); + __ mov(8, G4); + __ sub(G4, G1, G4); + __ alignaddr(G4, G0, G4); + __ faligndata(F48, F50, F56); // F56 can be clobbered + __ faligndata(F50, F60, F50); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F48, F48); + __ mov(to, G1); + __ and3(to, -8, to); + __ stpartialf(to, G2, F48, Assembler::ASI_PST8_PRIMARY); + __ stf(FloatRegisterImpl::D, F56, to, 8); + __ stf(FloatRegisterImpl::D, F50, to, 16); + __ stf(FloatRegisterImpl::D, F60, to, 24); + __ add(to, 32, to); + __ orn(G0, G2, G2); + __ stpartialf(to, G2, F48, Assembler::ASI_PST8_PRIMARY); + __ mov(G1, to); + + __ BIND(L_check_decrypt_loop_end192); __ add(from, 32, from); __ add(to, 32, to); __ subcc(len_reg, 32, len_reg); __ br(Assembler::notEqual, false, Assembler::pt, L_dec_next2_blocks192); __ delayed()->nop(); - __ br(Assembler::always, false, Assembler::pt, L_cbcdec_end); - __ delayed()->nop(); + __ ba_short(L_cbcdec_end); __ align(OptoLoopAlignment); __ BIND(L_dec_next2_blocks256); __ nop(); - // F0:F2 used for first 16-bytes + // check for 8-byte alignment since source byte array may have an arbitrary alignment if offset mod 8 is non-zero + __ andcc(from, 7, G0); + __ br(Assembler::notZero, true, Assembler::pn, L_load_misaligned_next2_blocks256); + __ delayed()->mov(from, G1); // save original 'from' address before alignaddr + + // aligned case: load input into G4, G5, L4 and L5 __ ldx(from,0,G4); __ ldx(from,8,G5); + __ ldx(from,16,L4); + __ ldx(from,24,L5); + __ ba_short(L_transform_next2_blocks256); + + __ BIND(L_load_misaligned_next2_blocks256); + __ alignaddr(from, G0, from); + // F0, F2, F4, F60, F62 can be clobbered + __ ldf(FloatRegisterImpl::D, from, 0, F0); + __ ldf(FloatRegisterImpl::D, from, 8, F2); + __ ldf(FloatRegisterImpl::D, from, 16, F60); + __ ldf(FloatRegisterImpl::D, from, 24, F62); + __ ldf(FloatRegisterImpl::D, from, 32, F4); + __ faligndata(F0, F2, F0); + __ faligndata(F2, F60, F2); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F4, F62); + __ movdtox(F0, G4); + __ movdtox(F2, G5); + __ movdtox(F60, L4); + __ movdtox(F62, L5); + __ mov(G1, from); + + __ BIND(L_transform_next2_blocks256); + // F0:F2 used for first 16-bytes __ xor3(L2,G4,G1); __ movxtod(G1,F0); __ xor3(L3,G5,G1); __ movxtod(G1,F2); // F60:F62 used for next 16-bytes - __ ldx(from,16,L4); - __ ldx(from,24,L5); __ xor3(L2,L4,G1); __ movxtod(G1,F60); __ xor3(L3,L5,G1); @@ -4043,9 +4519,6 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F6, F0, F0); __ fxor(FloatRegisterImpl::D, F4, F2, F2); - __ stf(FloatRegisterImpl::D, F0, to, 0); - __ stf(FloatRegisterImpl::D, F2, to, 8); - __ movxtod(G4,F56); __ movxtod(G5,F58); __ mov(L4,L0); @@ -4053,9 +4526,38 @@ class StubGenerator: public StubCodeGenerator { __ fxor(FloatRegisterImpl::D, F56, F60, F60); __ fxor(FloatRegisterImpl::D, F58, F62, F62); + // check for 8-byte alignment since dest byte array may have arbitrary alignment if offset mod 8 is non-zero + __ andcc(to, 7, G1); + __ br(Assembler::notZero, true, Assembler::pn, L_store_misaligned_output_next2_blocks256); + __ delayed()->edge8n(to, G0, G2); + + // aligned case: store output into the destination array + __ stf(FloatRegisterImpl::D, F0, to, 0); + __ stf(FloatRegisterImpl::D, F2, to, 8); __ stf(FloatRegisterImpl::D, F60, to, 16); __ stf(FloatRegisterImpl::D, F62, to, 24); + __ ba_short(L_check_decrypt_loop_end256); + __ BIND(L_store_misaligned_output_next2_blocks256); + __ mov(8, G4); + __ sub(G4, G1, G4); + __ alignaddr(G4, G0, G4); + __ faligndata(F0, F2, F56); // F56 can be clobbered + __ faligndata(F2, F60, F2); + __ faligndata(F60, F62, F60); + __ faligndata(F62, F0, F0); + __ mov(to, G1); + __ and3(to, -8, to); + __ stpartialf(to, G2, F0, Assembler::ASI_PST8_PRIMARY); + __ stf(FloatRegisterImpl::D, F56, to, 8); + __ stf(FloatRegisterImpl::D, F2, to, 16); + __ stf(FloatRegisterImpl::D, F60, to, 24); + __ add(to, 32, to); + __ orn(G0, G2, G2); + __ stpartialf(to, G2, F0, Assembler::ASI_PST8_PRIMARY); + __ mov(G1, to); + + __ BIND(L_check_decrypt_loop_end256); __ add(from, 32, from); __ add(to, 32, to); __ subcc(len_reg, 32, len_reg); @@ -4063,6 +4565,7 @@ class StubGenerator: public StubCodeGenerator { __ delayed()->nop(); __ BIND(L_cbcdec_end); + // re-init intial vector for next block, 8-byte alignment is guaranteed __ stx(L0, rvec, 0); __ stx(L1, rvec, 8); __ restore(); diff --git a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp index a94f5977f9d..880a0261996 100644 --- a/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp +++ b/hotspot/src/cpu/sparc/vm/stubRoutines_sparc.hpp @@ -41,7 +41,7 @@ static bool returns_to_call_stub(address return_pc) { enum /* platform_dependent_constants */ { // %%%%%%%% May be able to shrink this a lot code_size1 = 20000, // simply increase if too small (assembler will crash if too small) - code_size2 = 20000 // simply increase if too small (assembler will crash if too small) + code_size2 = 22000 // simply increase if too small (assembler will crash if too small) }; class Sparc { diff --git a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp index 4ac402494c3..3c173f4d70f 100644 --- a/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/templateInterpreter_sparc.cpp @@ -1888,7 +1888,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { } #if INCLUDE_JVMTI - if (EnableInvokeDynamic) { + { Label L_done; __ ldub(Address(Lbcp, 0), G1_scratch); // Load current bytecode diff --git a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp index 83e083ec1c5..d4eb74f3204 100644 --- a/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/templateTable_sparc.cpp @@ -3209,12 +3209,6 @@ void TemplateTable::invokehandle(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - if (!EnableInvokeDynamic) { - // rewriter does not generate this bytecode - __ should_not_reach_here(); - return; - } - const Register Rret = Lscratch; const Register G4_mtype = G4_scratch; const Register O0_recv = O0; @@ -3240,17 +3234,6 @@ void TemplateTable::invokedynamic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - if (!EnableInvokeDynamic) { - // We should not encounter this bytecode if !EnableInvokeDynamic. - // The verifier will stop it. However, if we get past the verifier, - // this will stop the thread in a reasonable way, without crashing the JVM. - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - return; - } - const Register Rret = Lscratch; const Register G4_callsite = G4_scratch; const Register Rscratch = G3_scratch; diff --git a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp index b75d21f98de..129bcd8b6c3 100644 --- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -266,9 +266,9 @@ void VM_Version::initialize() { if (!has_vis1()) // Drop to 0 if no VIS1 support UseVIS = 0; - // T2 and above should have support for AES instructions + // SPARC T4 and above should have support for AES instructions if (has_aes()) { - if (UseVIS > 0) { // AES intrinsics use FXOR instruction which is VIS1 + if (UseVIS > 2) { // AES intrinsics use MOVxTOd/MOVdTOx which are VIS3 if (FLAG_IS_DEFAULT(UseAES)) { FLAG_SET_DEFAULT(UseAES, true); } @@ -282,7 +282,7 @@ void VM_Version::initialize() { } } else { if (UseAES || UseAESIntrinsics) { - warning("SPARC AES intrinsics require VIS1 instruction support. Intrinsics will be disabled."); + warning("SPARC AES intrinsics require VIS3 instruction support. Intrinsics will be disabled."); if (UseAES) { FLAG_SET_DEFAULT(UseAES, false); } diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index 2fc29eae21e..a89e50b650e 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1766,7 +1766,7 @@ void Assembler::movdqu(Address dst, XMMRegister src) { // Move Unaligned 256bit Vector void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) { - assert(UseAVX, ""); + assert(UseAVX > 0, ""); bool vector256 = true; int encode = vex_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_F3, vector256); emit_int8(0x6F); @@ -1774,7 +1774,7 @@ void Assembler::vmovdqu(XMMRegister dst, XMMRegister src) { } void Assembler::vmovdqu(XMMRegister dst, Address src) { - assert(UseAVX, ""); + assert(UseAVX > 0, ""); InstructionMark im(this); bool vector256 = true; vex_prefix(dst, xnoreg, src, VEX_SIMD_F3, vector256); @@ -1783,7 +1783,7 @@ void Assembler::vmovdqu(XMMRegister dst, Address src) { } void Assembler::vmovdqu(Address dst, XMMRegister src) { - assert(UseAVX, ""); + assert(UseAVX > 0, ""); InstructionMark im(this); bool vector256 = true; // swap src<->dst for encoding diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp index 92f58b4d61a..d9ba3389967 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_32.cpp @@ -207,7 +207,6 @@ void InterpreterMacroAssembler::get_cache_index_at_bcp(Register reg, int bcp_off if (index_size == sizeof(u2)) { load_unsigned_short(reg, Address(rsi, bcp_offset)); } else if (index_size == sizeof(u4)) { - assert(EnableInvokeDynamic, "giant index used only for JSR 292"); movl(reg, Address(rsi, bcp_offset)); // Check if the secondary index definition is still ~x, otherwise // we have to change the following assembler code to calculate the diff --git a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp index 356106e946f..c5969601333 100644 --- a/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/interp_masm_x86_64.cpp @@ -205,7 +205,6 @@ void InterpreterMacroAssembler::get_cache_index_at_bcp(Register index, if (index_size == sizeof(u2)) { load_unsigned_short(index, Address(r13, bcp_offset)); } else if (index_size == sizeof(u4)) { - assert(EnableInvokeDynamic, "giant index used only for JSR 292"); movl(index, Address(r13, bcp_offset)); // Check if the secondary index definition is still ~x, otherwise // we have to change the following assembler code to calculate the diff --git a/hotspot/src/cpu/x86/vm/jni_x86.h b/hotspot/src/cpu/x86/vm/jni_x86.h index f5effdbe279..0c5030de79e 100644 --- a/hotspot/src/cpu/x86/vm/jni_x86.h +++ b/hotspot/src/cpu/x86/vm/jni_x86.h @@ -26,8 +26,14 @@ #ifndef _JAVASOFT_JNI_MD_H_ #define _JAVASOFT_JNI_MD_H_ -#if defined(SOLARIS) || defined(LINUX) || defined(_ALLBSD_SOURCE) +#if defined(_WIN32) + #define JNIEXPORT __declspec(dllexport) + #define JNIIMPORT __declspec(dllimport) + #define JNICALL __stdcall + typedef int jint; + typedef __int64 jlong; +#else // Note: please do not change these without also changing jni_md.h in the JDK // repository @@ -50,13 +56,6 @@ typedef long long jlong; #endif -#else - #define JNIEXPORT __declspec(dllexport) - #define JNIIMPORT __declspec(dllimport) - #define JNICALL __stdcall - - typedef int jint; - typedef __int64 jlong; #endif typedef signed char jbyte; diff --git a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp index 47b6a9cb871..3a14d975927 100644 --- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp @@ -3152,10 +3152,12 @@ void MacroAssembler::fast_pow() { // if fast computation is not possible, result is NaN. Requires // fallback from user of this macro. // increase precision for intermediate steps of the computation + BLOCK_COMMENT("fast_pow {"); increase_precision(); fyl2x(); // Stack: (Y*log2(X)) ... pow_exp_core_encoding(); // Stack: exp(X) ... restore_precision(); + BLOCK_COMMENT("} fast_pow"); } void MacroAssembler::fast_exp() { diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp index e470aa62da2..23dcbee036e 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86.cpp @@ -76,12 +76,7 @@ void AbstractInterpreter::layout_activation(Method* method, Interpreter::stackElementWords; #ifdef ASSERT - if (!EnableInvokeDynamic) { - // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences? - // Probably, since deoptimization doesn't work yet. - assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable"); - } - assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)"); + assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable"); #endif interpreter_frame->interpreter_frame_set_method(method); diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp index d7f85cf3a21..265455bf285 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_32.cpp @@ -1831,7 +1831,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { __ movl(Address(thread, JavaThread::popframe_condition_offset()), JavaThread::popframe_inactive); #if INCLUDE_JVMTI - if (EnableInvokeDynamic) { + { Label L_done; const Register local0 = rdi; diff --git a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp index 652c7060e3a..12b0d0568f9 100644 --- a/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateInterpreter_x86_64.cpp @@ -1848,7 +1848,7 @@ void TemplateInterpreterGenerator::generate_throw_exception() { JavaThread::popframe_inactive); #if INCLUDE_JVMTI - if (EnableInvokeDynamic) { + { Label L_done; const Register local0 = r14; diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp index 3c2ec9f426d..7fc8d33c42f 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_32.cpp @@ -3128,12 +3128,6 @@ void TemplateTable::invokehandle(int byte_no) { const Register rcx_recv = rcx; const Register rdx_flags = rdx; - if (!EnableInvokeDynamic) { - // rewriter does not generate this bytecode - __ should_not_reach_here(); - return; - } - prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv); __ verify_method_ptr(rbx_method); __ verify_oop(rcx_recv); @@ -3156,17 +3150,6 @@ void TemplateTable::invokedynamic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - if (!EnableInvokeDynamic) { - // We should not encounter this bytecode if !EnableInvokeDynamic. - // The verifier will stop it. However, if we get past the verifier, - // this will stop the thread in a reasonable way, without crashing the JVM. - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - return; - } - const Register rbx_method = rbx; const Register rax_callsite = rax; diff --git a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp index 462c0c58f89..60f62077e55 100644 --- a/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -3179,12 +3179,6 @@ void TemplateTable::invokehandle(int byte_no) { const Register rcx_recv = rcx; const Register rdx_flags = rdx; - if (!EnableInvokeDynamic) { - // rewriter does not generate this bytecode - __ should_not_reach_here(); - return; - } - prepare_invoke(byte_no, rbx_method, rax_mtype, rcx_recv); __ verify_method_ptr(rbx_method); __ verify_oop(rcx_recv); @@ -3207,17 +3201,6 @@ void TemplateTable::invokedynamic(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - if (!EnableInvokeDynamic) { - // We should not encounter this bytecode if !EnableInvokeDynamic. - // The verifier will stop it. However, if we get past the verifier, - // this will stop the thread in a reasonable way, without crashing the JVM. - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError)); - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - return; - } - const Register rbx_method = rbx; const Register rax_callsite = rax; diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp index ba5fcb383c6..1fc0e614b6d 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -263,6 +263,10 @@ class VM_Version_StubGenerator: public StubCodeGenerator { // and check upper YMM bits after it. // VM_Version::set_avx_cpuFeatures(); // Enable temporary to pass asserts + intx saved_useavx = UseAVX; + intx saved_usesse = UseSSE; + UseAVX = 1; + UseSSE = 2; // load value into all 32 bytes of ymm7 register __ movl(rcx, VM_Version::ymm_test_value()); @@ -292,6 +296,8 @@ class VM_Version_StubGenerator: public StubCodeGenerator { #endif VM_Version::clean_cpuFeatures(); + UseAVX = saved_useavx; + UseSSE = saved_usesse; // // cpuid(0x7) Structured Extended Features diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp index 8ac274b9fb6..9272724addc 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp @@ -40,6 +40,7 @@ #include "runtime/deoptimization.hpp" #include "runtime/frame.inline.hpp" #include "runtime/interfaceSupport.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/synchronizer.hpp" diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp index 66a1fc0bbfd..1fec56484e5 100644 --- a/hotspot/src/os/aix/vm/os_aix.cpp +++ b/hotspot/src/os/aix/vm/os_aix.cpp @@ -55,6 +55,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/perfMemory.hpp" #include "runtime/sharedRuntime.hpp" diff --git a/hotspot/src/os/aix/vm/os_aix.inline.hpp b/hotspot/src/os/aix/vm/os_aix.inline.hpp index 4a648559f52..0ecd75f37f2 100644 --- a/hotspot/src/os/aix/vm/os_aix.inline.hpp +++ b/hotspot/src/os/aix/vm/os_aix.inline.hpp @@ -26,12 +26,9 @@ #ifndef OS_AIX_VM_OS_AIX_INLINE_HPP #define OS_AIX_VM_OS_AIX_INLINE_HPP -#include "runtime/atomic.hpp" +#include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" -#ifdef TARGET_OS_ARCH_aix_ppc -# include "atomic_aix_ppc.inline.hpp" -# include "orderAccess_aix_ppc.inline.hpp" -#endif // System includes diff --git a/hotspot/src/os/aix/vm/thread_aix.inline.hpp b/hotspot/src/os/aix/vm/thread_aix.inline.hpp index 27120241f61..034f6b4e2e0 100644 --- a/hotspot/src/os/aix/vm/thread_aix.inline.hpp +++ b/hotspot/src/os/aix/vm/thread_aix.inline.hpp @@ -26,13 +26,10 @@ #ifndef OS_AIX_VM_THREAD_AIX_INLINE_HPP #define OS_AIX_VM_THREAD_AIX_INLINE_HPP -#include "runtime/atomic.hpp" #include "runtime/prefetch.hpp" #include "runtime/thread.hpp" #include "runtime/threadLocalStorage.hpp" -#include "atomic_aix_ppc.inline.hpp" -#include "orderAccess_aix_ppc.inline.hpp" #include "prefetch_aix_ppc.inline.hpp" // Contains inlined functions for class Thread and ThreadLocalStorage diff --git a/hotspot/src/os/bsd/vm/os_bsd.cpp b/hotspot/src/os/bsd/vm/os_bsd.cpp index 2ad6e5fd40b..9d3ec5ffd2d 100644 --- a/hotspot/src/os/bsd/vm/os_bsd.cpp +++ b/hotspot/src/os/bsd/vm/os_bsd.cpp @@ -48,6 +48,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/perfMemory.hpp" #include "runtime/sharedRuntime.hpp" diff --git a/hotspot/src/os/bsd/vm/os_bsd.inline.hpp b/hotspot/src/os/bsd/vm/os_bsd.inline.hpp index 8e574855933..925cbaf2007 100644 --- a/hotspot/src/os/bsd/vm/os_bsd.inline.hpp +++ b/hotspot/src/os/bsd/vm/os_bsd.inline.hpp @@ -26,15 +26,9 @@ #define OS_BSD_VM_OS_BSD_INLINE_HPP #include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "orderAccess_bsd_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "orderAccess_bsd_zero.inline.hpp" -#endif - // System includes #include diff --git a/hotspot/src/os/bsd/vm/thread_bsd.inline.hpp b/hotspot/src/os/bsd/vm/thread_bsd.inline.hpp index ba8baaf3df7..622707d4f5d 100644 --- a/hotspot/src/os/bsd/vm/thread_bsd.inline.hpp +++ b/hotspot/src/os/bsd/vm/thread_bsd.inline.hpp @@ -29,18 +29,12 @@ #error "This file should only be included from thread.inline.hpp" #endif -#include "runtime/atomic.hpp" -#include "runtime/prefetch.hpp" #include "runtime/thread.hpp" #include "runtime/threadLocalStorage.hpp" #ifdef TARGET_OS_ARCH_bsd_x86 -# include "atomic_bsd_x86.inline.hpp" -# include "orderAccess_bsd_x86.inline.hpp" # include "prefetch_bsd_x86.inline.hpp" #endif #ifdef TARGET_OS_ARCH_bsd_zero -# include "atomic_bsd_zero.inline.hpp" -# include "orderAccess_bsd_zero.inline.hpp" # include "prefetch_bsd_zero.inline.hpp" #endif diff --git a/hotspot/src/os/linux/vm/os_linux.cpp b/hotspot/src/os/linux/vm/os_linux.cpp index 9386419876a..ce771028a3b 100644 --- a/hotspot/src/os/linux/vm/os_linux.cpp +++ b/hotspot/src/os/linux/vm/os_linux.cpp @@ -49,6 +49,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/perfMemory.hpp" #include "runtime/sharedRuntime.hpp" @@ -5271,7 +5272,6 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { // static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { - static bool proc_task_unchecked = true; pid_t tid = thread->osthread()->thread_id(); char *s; char stat[2048]; @@ -5284,24 +5284,7 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { long ldummy; FILE *fp; - snprintf(proc_name, 64, "/proc/%d/stat", tid); - - // The /proc//stat aggregates per-process usage on - // new Linux kernels 2.6+ where NPTL is supported. - // The /proc/self/task//stat still has the per-thread usage. - // See bug 6328462. - // There possibly can be cases where there is no directory - // /proc/self/task, so we check its availability. - if (proc_task_unchecked && os::Linux::is_NPTL()) { - // This is executed only once - proc_task_unchecked = false; - fp = fopen("/proc/self/task", "r"); - if (fp != NULL) { - snprintf(proc_name, 64, "/proc/self/task/%d/stat", tid); - fclose(fp); - } - } - + snprintf(proc_name, 64, "/proc/self/task/%d/stat", tid); fp = fopen(proc_name, "r"); if ( fp == NULL ) return -1; statlen = fread(stat, 1, 2047, fp); diff --git a/hotspot/src/os/linux/vm/os_linux.inline.hpp b/hotspot/src/os/linux/vm/os_linux.inline.hpp index 5f152d29726..1a71d636598 100644 --- a/hotspot/src/os/linux/vm/os_linux.inline.hpp +++ b/hotspot/src/os/linux/vm/os_linux.inline.hpp @@ -26,24 +26,9 @@ #define OS_LINUX_VM_OS_LINUX_INLINE_HPP #include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" -#ifdef TARGET_OS_ARCH_linux_x86 -# include "orderAccess_linux_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "orderAccess_linux_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "orderAccess_linux_zero.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "orderAccess_linux_arm.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "orderAccess_linux_ppc.inline.hpp" -#endif - // System includes #include diff --git a/hotspot/src/os/linux/vm/thread_linux.inline.hpp b/hotspot/src/os/linux/vm/thread_linux.inline.hpp index f5c9e9c4bf1..76bdd223449 100644 --- a/hotspot/src/os/linux/vm/thread_linux.inline.hpp +++ b/hotspot/src/os/linux/vm/thread_linux.inline.hpp @@ -29,33 +29,22 @@ #error "This file should only be included from thread.inline.hpp" #endif -#include "runtime/atomic.hpp" #include "runtime/prefetch.hpp" #include "runtime/thread.hpp" #include "runtime/threadLocalStorage.hpp" #ifdef TARGET_OS_ARCH_linux_x86 -# include "atomic_linux_x86.inline.hpp" -# include "orderAccess_linux_x86.inline.hpp" # include "prefetch_linux_x86.inline.hpp" #endif #ifdef TARGET_OS_ARCH_linux_sparc -# include "atomic_linux_sparc.inline.hpp" -# include "orderAccess_linux_sparc.inline.hpp" # include "prefetch_linux_sparc.inline.hpp" #endif #ifdef TARGET_OS_ARCH_linux_zero -# include "atomic_linux_zero.inline.hpp" -# include "orderAccess_linux_zero.inline.hpp" # include "prefetch_linux_zero.inline.hpp" #endif #ifdef TARGET_OS_ARCH_linux_arm -# include "atomic_linux_arm.inline.hpp" -# include "orderAccess_linux_arm.inline.hpp" # include "prefetch_linux_arm.inline.hpp" #endif #ifdef TARGET_OS_ARCH_linux_ppc -# include "atomic_linux_ppc.inline.hpp" -# include "orderAccess_linux_ppc.inline.hpp" # include "prefetch_linux_ppc.inline.hpp" #endif diff --git a/hotspot/src/os/solaris/vm/os_solaris.cpp b/hotspot/src/os/solaris/vm/os_solaris.cpp index b0d4ef01294..5272029561b 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.cpp +++ b/hotspot/src/os/solaris/vm/os_solaris.cpp @@ -48,6 +48,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/perfMemory.hpp" #include "runtime/sharedRuntime.hpp" diff --git a/hotspot/src/os/solaris/vm/os_solaris.inline.hpp b/hotspot/src/os/solaris/vm/os_solaris.inline.hpp index 72a9b0b7059..548c0854b28 100644 --- a/hotspot/src/os/solaris/vm/os_solaris.inline.hpp +++ b/hotspot/src/os/solaris/vm/os_solaris.inline.hpp @@ -26,15 +26,9 @@ #define OS_SOLARIS_VM_OS_SOLARIS_INLINE_HPP #include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "orderAccess_solaris_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "orderAccess_solaris_sparc.inline.hpp" -#endif - // System includes #include #include diff --git a/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp b/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp index a76ddeb20c3..affc2c824c6 100644 --- a/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp +++ b/hotspot/src/os/solaris/vm/thread_solaris.inline.hpp @@ -29,18 +29,14 @@ #error "This file should only be included from thread.inline.hpp" #endif -#include "runtime/atomic.hpp" +#include "runtime/atomic.inline.hpp" #include "runtime/prefetch.hpp" #include "runtime/thread.hpp" #include "runtime/threadLocalStorage.hpp" #ifdef TARGET_OS_ARCH_solaris_x86 -# include "atomic_solaris_x86.inline.hpp" -# include "orderAccess_solaris_x86.inline.hpp" # include "prefetch_solaris_x86.inline.hpp" #endif #ifdef TARGET_OS_ARCH_solaris_sparc -# include "atomic_solaris_sparc.inline.hpp" -# include "orderAccess_solaris_sparc.inline.hpp" # include "prefetch_solaris_sparc.inline.hpp" #endif diff --git a/hotspot/src/os/windows/vm/os_windows.cpp b/hotspot/src/os/windows/vm/os_windows.cpp index 668b2c8f910..35c2fcfed64 100644 --- a/hotspot/src/os/windows/vm/os_windows.cpp +++ b/hotspot/src/os/windows/vm/os_windows.cpp @@ -51,6 +51,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/perfMemory.hpp" #include "runtime/sharedRuntime.hpp" diff --git a/hotspot/src/os/windows/vm/os_windows.inline.hpp b/hotspot/src/os/windows/vm/os_windows.inline.hpp index 068c1661d4f..e6f1c46c1a5 100644 --- a/hotspot/src/os/windows/vm/os_windows.inline.hpp +++ b/hotspot/src/os/windows/vm/os_windows.inline.hpp @@ -26,12 +26,9 @@ #define OS_WINDOWS_VM_OS_WINDOWS_INLINE_HPP #include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" -#ifdef TARGET_OS_ARCH_windows_x86 -# include "orderAccess_windows_x86.inline.hpp" -#endif - inline const char* os::file_separator() { return "\\"; } inline const char* os::line_separator() { return "\r\n"; } inline const char* os::path_separator() { return ";"; } diff --git a/hotspot/src/os/windows/vm/thread_windows.inline.hpp b/hotspot/src/os/windows/vm/thread_windows.inline.hpp index d73fabff267..a7af8776325 100644 --- a/hotspot/src/os/windows/vm/thread_windows.inline.hpp +++ b/hotspot/src/os/windows/vm/thread_windows.inline.hpp @@ -29,13 +29,10 @@ #error "This file should only be included from thread.inline.hpp" #endif -#include "runtime/atomic.hpp" #include "runtime/prefetch.hpp" #include "runtime/thread.hpp" #include "runtime/threadLocalStorage.hpp" #ifdef TARGET_OS_ARCH_windows_x86 -# include "atomic_windows_x86.inline.hpp" -# include "orderAccess_windows_x86.inline.hpp" # include "prefetch_windows_x86.inline.hpp" #endif diff --git a/hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp b/hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp index 86ade8265e2..744bb7c38d4 100644 --- a/hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp +++ b/hotspot/src/os_cpu/aix_ppc/vm/atomic_aix_ppc.inline.hpp @@ -26,7 +26,6 @@ #ifndef OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP #define OS_CPU_AIX_OJDKPPC_VM_ATOMIC_AIX_PPC_INLINE_HPP -#include "orderAccess_aix_ppc.inline.hpp" #include "runtime/atomic.hpp" #include "runtime/os.hpp" #include "vm_version_ppc.hpp" diff --git a/hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp b/hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp index d9a8048963d..c8fcf1f64d2 100644 --- a/hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp +++ b/hotspot/src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp @@ -26,7 +26,6 @@ #ifndef OS_CPU_LINUX_PPC_VM_ATOMIC_LINUX_PPC_INLINE_HPP #define OS_CPU_LINUX_PPC_VM_ATOMIC_LINUX_PPC_INLINE_HPP -#include "orderAccess_linux_ppc.inline.hpp" #include "runtime/atomic.hpp" #include "runtime/os.hpp" #include "vm_version_ppc.hpp" @@ -53,41 +52,41 @@ inline void Atomic::store_ptr(void* store_value, volatile void* dest) { * inline jlong Atomic::load(volatile jlong* src) { return *src; } -/* - machine barrier instructions: - - - sync two-way memory barrier, aka fence - - lwsync orders Store|Store, - Load|Store, - Load|Load, - but not Store|Load - - eieio orders memory accesses for device memory (only) - - isync invalidates speculatively executed instructions - From the POWER ISA 2.06 documentation: - "[...] an isync instruction prevents the execution of - instructions following the isync until instructions - preceding the isync have completed, [...]" - From IBM's AIX assembler reference: - "The isync [...] instructions causes the processor to - refetch any instructions that might have been fetched - prior to the isync instruction. The instruction isync - causes the processor to wait for all previous instructions - to complete. Then any instructions already fetched are - discarded and instruction processing continues in the - environment established by the previous instructions." - - semantic barrier instructions: - (as defined in orderAccess.hpp) - - - release orders Store|Store, (maps to lwsync) - Load|Store - - acquire orders Load|Store, (maps to lwsync) - Load|Load - - fence orders Store|Store, (maps to sync) - Load|Store, - Load|Load, - Store|Load -*/ +// +// machine barrier instructions: +// +// - sync two-way memory barrier, aka fence +// - lwsync orders Store|Store, +// Load|Store, +// Load|Load, +// but not Store|Load +// - eieio orders memory accesses for device memory (only) +// - isync invalidates speculatively executed instructions +// From the POWER ISA 2.06 documentation: +// "[...] an isync instruction prevents the execution of +// instructions following the isync until instructions +// preceding the isync have completed, [...]" +// From IBM's AIX assembler reference: +// "The isync [...] instructions causes the processor to +// refetch any instructions that might have been fetched +// prior to the isync instruction. The instruction isync +// causes the processor to wait for all previous instructions +// to complete. Then any instructions already fetched are +// discarded and instruction processing continues in the +// environment established by the previous instructions." +// +// semantic barrier instructions: +// (as defined in orderAccess.hpp) +// +// - release orders Store|Store, (maps to lwsync) +// Load|Store +// - acquire orders Load|Store, (maps to lwsync) +// Load|Load +// - fence orders Store|Store, (maps to sync) +// Load|Store, +// Load|Load, +// Store|Load +// #define strasm_sync "\n sync \n" #define strasm_lwsync "\n lwsync \n" diff --git a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp index 9de203c1191..331eed7a67f 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp @@ -78,12 +78,12 @@ inline intptr_t Atomic::add_ptr(intptr_t add_value, volatile intptr_t* dest) { __asm__ volatile( "1: \n\t" " ldx [%2], %%o2\n\t" - " add %0, %%o2, %%o3\n\t" + " add %1, %%o2, %%o3\n\t" " casx [%2], %%o2, %%o3\n\t" " cmp %%o2, %%o3\n\t" " bne %%xcc, 1b\n\t" " nop\n\t" - " add %0, %%o2, %0\n\t" + " add %1, %%o2, %0\n\t" : "=r" (rv) : "r" (add_value), "r" (dest) : "memory", "o2", "o3"); diff --git a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp index 5eaab2d5259..f8f23122d4d 100644 --- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp +++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @@ -302,29 +302,30 @@ void os::print_register_info(outputStream *st, void *context) { if (context == NULL) return; ucontext_t *uc = (ucontext_t*)context; + sigcontext* sc = (sigcontext*)context; intptr_t *sp = (intptr_t *)os::Linux::ucontext_get_sp(uc); st->print_cr("Register to memory mapping:"); st->cr(); // this is only for the "general purpose" registers - st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON__G1]); - st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON__G2]); - st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON__G3]); - st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON__G4]); - st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON__G5]); - st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON__G6]); - st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON__G7]); + st->print("G1="); print_location(st, SIG_REGS(sc).u_regs[CON_G1]); + st->print("G2="); print_location(st, SIG_REGS(sc).u_regs[CON_G2]); + st->print("G3="); print_location(st, SIG_REGS(sc).u_regs[CON_G3]); + st->print("G4="); print_location(st, SIG_REGS(sc).u_regs[CON_G4]); + st->print("G5="); print_location(st, SIG_REGS(sc).u_regs[CON_G5]); + st->print("G6="); print_location(st, SIG_REGS(sc).u_regs[CON_G6]); + st->print("G7="); print_location(st, SIG_REGS(sc).u_regs[CON_G7]); st->cr(); - st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON__O0]); - st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON__O1]); - st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON__O2]); - st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON__O3]); - st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON__O4]); - st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON__O5]); - st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON__O6]); - st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON__O7]); + st->print("O0="); print_location(st, SIG_REGS(sc).u_regs[CON_O0]); + st->print("O1="); print_location(st, SIG_REGS(sc).u_regs[CON_O1]); + st->print("O2="); print_location(st, SIG_REGS(sc).u_regs[CON_O2]); + st->print("O3="); print_location(st, SIG_REGS(sc).u_regs[CON_O3]); + st->print("O4="); print_location(st, SIG_REGS(sc).u_regs[CON_O4]); + st->print("O5="); print_location(st, SIG_REGS(sc).u_regs[CON_O5]); + st->print("O6="); print_location(st, SIG_REGS(sc).u_regs[CON_O6]); + st->print("O7="); print_location(st, SIG_REGS(sc).u_regs[CON_O7]); st->cr(); st->print("L0="); print_location(st, sp[L0->sp_offset_in_saved_window()]); @@ -516,7 +517,7 @@ inline static bool checkICMiss(sigcontext* uc, address* pc, address* stub) { if (nativeInstruction_at(*pc)->is_ic_miss_trap()) { #ifdef ASSERT #ifdef TIERED - CodeBlob* cb = CodeCache::find_blob_unsafe(pc); + CodeBlob* cb = CodeCache::find_blob_unsafe(*pc); assert(cb->is_compiled_by_c2(), "Wrong compiler"); #endif // TIERED #endif // ASSERT diff --git a/hotspot/src/share/vm/adlc/filebuff.cpp b/hotspot/src/share/vm/adlc/filebuff.cpp index 5f54d724638..71daa5cc4bd 100644 --- a/hotspot/src/share/vm/adlc/filebuff.cpp +++ b/hotspot/src/share/vm/adlc/filebuff.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -89,200 +89,6 @@ char *FileBuff::get_line(void) { return retval; } -//------------------------------FileBuffRegion--------------------------------- -// Create a new region in a FileBuff. -FileBuffRegion::FileBuffRegion( FileBuff* bufr, int soln, int ln, - int off, int len) -: _bfr(bufr), _sol(soln), _line(ln), _offset(off), _length(len) { - _next = NULL; // No chained regions -} - -//------------------------------~FileBuffRegion-------------------------------- -// Delete the entire linked list of buffer regions. -FileBuffRegion::~FileBuffRegion() { - if( _next ) delete _next; -} - -//------------------------------copy------------------------------------------- -// Deep copy a FileBuffRegion -FileBuffRegion *FileBuffRegion::copy() { - if( !this ) return NULL; // The empty buffer region - FileBuffRegion *br = new FileBuffRegion(_bfr,_sol,_line,_offset,_length); - if( _next ) br->_next = _next->copy(); - return br; -} - -//------------------------------merge------------------------------------------ -// Merge another buffer region into this buffer region. Make overlapping areas -// become a single region. Remove (delete) the input FileBuffRegion. -// Since the buffer regions are sorted by file offset, this is a varient of a -// "sorted-merge" running in linear time. -FileBuffRegion *FileBuffRegion::merge( FileBuffRegion *br ) { - if( !br ) return this; // Merging nothing - if( !this ) return br; // Merging into nothing - - assert( _bfr == br->_bfr, "" ); // Check for pointer-equivalent buffers - - if( _offset < br->_offset ) { // "this" starts before "br" - if( _offset+_length < br->_offset ) { // "this" ends before "br" - if( _next ) _next->merge( br ); // Merge with remainder of list - else _next = br; // No more in this list; just append. - } else { // Regions overlap. - int l = br->_offset + br->_length - _offset; - if( l > _length ) _length = l; // Pick larger region - FileBuffRegion *nr = br->_next; // Get rest of region - br->_next = NULL; // Remove indication of rest of region - delete br; // Delete this region (it's been subsumed). - if( nr ) merge( nr ); // Merge with rest of region - } // End of if regions overlap or not. - } else { // "this" starts after "br" - if( br->_offset+br->_length < _offset ) { // "br" ends before "this" - FileBuffRegion *nr = new FileBuffRegion(_bfr,_sol,_line,_offset,_length); - nr->_next = _next; // Structure copy "this" guy to "nr" - *this = *br; // Structure copy "br" over "this". - br->_next = NULL; // Remove indication of rest of region - delete br; // Delete this region (it's been copied) - merge( nr ); // Finish merging - } else { // Regions overlap. - int l = _offset + _length - br->_offset; - if( l > _length ) _length = l; // Pick larger region - _offset = br->_offset; // Start with earlier region - _sol = br->_sol; // Also use earlier line start - _line = br->_line; // Also use earlier line - FileBuffRegion *nr = br->_next; // Get rest of region - br->_next = NULL; // Remove indication of rest of region - delete br; // Delete this region (it's been subsumed). - if( nr ) merge( nr ); // Merge with rest of region - } // End of if regions overlap or not. - } - return this; -} - -//------------------------------expandtab-------------------------------------- -static int expandtab( ostream &os, int off, char c, char fill1, char fill2 ) { - if( c == '\t' ) { // Tab? - do os << fill1; // Expand the tab; Output space - while( (++off) & 7 ); // Expand to tab stop - } else { // Normal character - os << fill2; // Display normal character - off++; // Increment "cursor" offset - } - return off; -} - -//------------------------------printline-------------------------------------- -// Print and highlite a region of a line. Return the amount of highliting left -// to do (i.e. highlite length minus length of line). -static int printline( ostream& os, const char *fname, int line, - const char *_sol, int skip, int len ) { - - // Display the entire tab-expanded line - os << fname << ":" << line << ": "; - const char *t = strchr(_sol,'\n')+1; // End of line - int off = 0; // Cursor offset for tab expansion - const char *s = _sol; // Nice string pointer - while( t-s ) { // Display whole line - char c = *s++; // Get next character to display - off = expandtab(os,off,c,' ',c); - } - - // Display the tab-expanded skippings before underlining. - os << fname << ":" << line << ": "; - off = 0; // Cursor offset for tab expansion - s = _sol; // Restart string pointer - - // Start underlining. - if( skip != -1 ) { // The no-start-indicating flag - const char *u = _sol+skip; // Amount to skip - while( u-s ) // Display skipped part - off = expandtab(os,off,*s++,' ',' '); - os << '^'; // Start region - off++; // Moved cursor - len--; // 1 less char to do - if( *s++ == '\t' ) // Starting character is a tab? - off = expandtab(os,off,'\t','-','^'); - } - - // Long region doesn't end on this line - int llen = (int)(t-s); // Length of line, minus what's already done - if( len > llen ) { // Doing entire rest of line? - while( t-s ) // Display rest of line - off = expandtab(os,off,*s++,'-','-'); - os << '\n'; // EOL - return len-llen; // Return what's not yet done. - } - - // Region does end on this line. This code fails subtly if the region ends - // in a tab character. - int i; - for( i=1; iprint(os); // Print region - brp = brp->_next; // Chain to next - } - return os; // Return final stream -} - -//------------------------------print------------------------------------------ -// Print the FileBuffRegion to a stream. FileBuffRegions are printed with the -// filename and line number to the left, and complete text lines to the right. -// Selected portions (portions of a line actually in the FileBuffRegion are -// underlined. Ellipses are used for long multi-line regions. -//void FileBuffRegion::print( std::ostream& os ) { -void FileBuffRegion::print( ostream& os ) { - if( !this ) return; // Nothing to print - char *s = _bfr->get_line(); - int skip = (int)(_offset - _sol); // Amount to skip to start of data - int len = printline( os, _bfr->_fp->_name, _line, s, skip, _length ); - - if( !len ) return; // All done; exit - - // Here we require at least 2 lines - int off1 = _length - len + skip; // Length of line 1 - int off2 = off1 + _sol; // Offset to start of line 2 - char *s2 = _bfr->get_line(); // Start of line 2 - char *s3 = strchr( s2, '\n' )+1; // Start of line 3 (unread) - if( len <= (s3-s2) ) { // It all fits on the next line - printline( os, _bfr->_fp->_name, _line+1, s2, -1, len ); // Print&underline - return; - } - - // Here we require at least 3 lines - int off3 = off2 + (int)(s3-s2); // Offset to start of line 3 - s3 = _bfr->get_line(); // Start of line 3 (read) - const char *s4 = strchr( s3, '\n' )+1;// Start of line 4 (unread) - if( len < (s4-s3) ) { // It all fits on the next 2 lines - s2 = _bfr->get_line(); - len = printline( os, _bfr->_fp->_name, _line+1, s2, -1, len ); // Line 2 - s3 = _bfr->get_line(); - printline( os, _bfr->_fp->_name, _line+2, s3, -1, len ); // Line 3 - return; - } - - // Here we require at least 4 lines. - // Print only the 1st and last line, with ellipses in middle. - os << "...\n"; // The ellipses - int cline = _line+1; // Skipped 2 lines - do { // Do until find last line - len -= (int)(s3-s2); // Remove length of line - cline++; // Next line - s2 = _bfr->get_line(); // Get next line from end of this line - s3 = strchr( s2, '\n' ) + 1;// Get end of next line - } while( len > (s3-s2) ); // Repeat until last line - printline( os, _bfr->_fp->_name, cline, s2, -1, len ); // Print & underline -} - //------------------------------file_error------------------------------------- void FileBuff::file_error(int flag, int linenum, const char *fmt, ...) { diff --git a/hotspot/src/share/vm/adlc/filebuff.hpp b/hotspot/src/share/vm/adlc/filebuff.hpp index 894a2c5bad2..292fd1781f6 100644 --- a/hotspot/src/share/vm/adlc/filebuff.hpp +++ b/hotspot/src/share/vm/adlc/filebuff.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -46,7 +46,6 @@ class ArchDesc; // This class defines a nicely behaved buffer of text. Entire file of text // is read into buffer at creation, with sentinels at start and end. class FileBuff { - friend class FileBuffRegion; private: long _bufferSize; // Size of text holding buffer. long _offset; // Expected filepointer offset. @@ -82,29 +81,4 @@ class FileBuff { // when the pointer is valid (i.e. just obtained from getline()). long getoff(const char* s) { return _bufoff + (long)(s - _buf); } }; - -//------------------------------FileBuffRegion--------------------------------- -// A buffer region is really a region of some file, specified as a linked list -// of offsets and lengths. These regions can be merged; overlapping regions -// will coalesce. -class FileBuffRegion { - public: // Workaround dev-studio friend/private bug - FileBuffRegion *_next; // Linked list of regions sorted by offset. - private: - FileBuff *_bfr; // The Buffer of the file - int _offset, _length; // The file area - int _sol; // Start of line where the file area starts - int _line; // First line of region - - public: - FileBuffRegion(FileBuff*, int sol, int line, int offset, int len); - ~FileBuffRegion(); - - FileBuffRegion *copy(); // Deep copy - FileBuffRegion *merge(FileBuffRegion*); // Merge 2 regions; delete input - - void print(ostream&); - friend ostream& operator<< (ostream&, FileBuffRegion&); -}; - #endif // SHARE_VM_ADLC_FILEBUFF_HPP diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp index 974bc04cc4d..ac62197debe 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp @@ -1701,6 +1701,15 @@ Values* GraphBuilder::args_list_for_profiling(ciMethod* target, int& start, bool return NULL; } +void GraphBuilder::check_args_for_profiling(Values* obj_args, int expected) { +#ifdef ASSERT + bool ignored_will_link; + ciSignature* declared_signature = NULL; + ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); + assert(expected == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); +#endif +} + // Collect arguments that we want to profile in a list Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver) { int start = 0; @@ -1709,13 +1718,14 @@ Values* GraphBuilder::collect_args_for_profiling(Values* args, ciMethod* target, return NULL; } int s = obj_args->size(); - for (int i = start, j = 0; j < s; i++) { + // if called through method handle invoke, some arguments may have been popped + for (int i = start, j = 0; j < s && i < args->length(); i++) { if (args->at(i)->type()->is_object_kind()) { obj_args->push(args->at(i)); j++; } } - assert(s == obj_args->length(), "missed on arg?"); + check_args_for_profiling(obj_args, s); return obj_args; } @@ -3847,14 +3857,7 @@ bool GraphBuilder::try_inline_full(ciMethod* callee, bool holder_known, Bytecode j++; } } -#ifdef ASSERT - { - bool ignored_will_link; - ciSignature* declared_signature = NULL; - ciMethod* real_target = method()->get_method_at_bci(bci(), ignored_will_link, &declared_signature); - assert(s == obj_args->length() || real_target->is_method_handle_intrinsic(), "missed on arg?"); - } -#endif + check_args_for_profiling(obj_args, s); } profile_call(callee, recv, holder_known ? callee->holder() : NULL, obj_args, true); } diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp index c783878efa1..2caf6142e53 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.hpp @@ -392,6 +392,7 @@ class GraphBuilder VALUE_OBJ_CLASS_SPEC { Values* args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver); Values* collect_args_for_profiling(Values* args, ciMethod* target, bool may_have_receiver); + void check_args_for_profiling(Values* obj_args, int expected); public: NOT_PRODUCT(void print_stats();) diff --git a/hotspot/src/share/vm/c1/c1_IR.cpp b/hotspot/src/share/vm/c1/c1_IR.cpp index ff7587ad737..e2f33a21170 100644 --- a/hotspot/src/share/vm/c1/c1_IR.cpp +++ b/hotspot/src/share/vm/c1/c1_IR.cpp @@ -263,8 +263,7 @@ int CodeEmitInfo::interpreter_frame_size() const { // Implementation of IR IR::IR(Compilation* compilation, ciMethod* method, int osr_bci) : - _locals_size(in_WordSize(-1)) - , _num_loops(0) { + _num_loops(0) { // setup IR fields _compilation = compilation; _top_scope = new IRScope(compilation, NULL, -1, method, osr_bci, true); diff --git a/hotspot/src/share/vm/c1/c1_IR.hpp b/hotspot/src/share/vm/c1/c1_IR.hpp index ccc9c1bd69c..910ce06406d 100644 --- a/hotspot/src/share/vm/c1/c1_IR.hpp +++ b/hotspot/src/share/vm/c1/c1_IR.hpp @@ -293,7 +293,6 @@ class IR: public CompilationResourceObj { private: Compilation* _compilation; // the current compilation IRScope* _top_scope; // the root of the scope hierarchy - WordSize _locals_size; // the space required for all locals int _num_loops; // Total number of loops BlockList* _code; // the blocks in code generation order w/ use counts @@ -310,8 +309,6 @@ class IR: public CompilationResourceObj { BlockBegin* start() const { return top_scope()->start(); } BlockBegin* std_entry() const { return start()->end()->as_Base()->std_entry(); } BlockBegin* osr_entry() const { return start()->end()->as_Base()->osr_entry(); } - WordSize locals_size() const { return _locals_size; } - int locals_size_in_words() const { return in_words(_locals_size); } BlockList* code() const { return _code; } int num_loops() const { return _num_loops; } int max_stack() const { return top_scope()->max_stack(); } // expensive diff --git a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp index 8a8b6ad6066..14bc1993ff6 100644 --- a/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp +++ b/hotspot/src/share/vm/c1/c1_LIRGenerator.cpp @@ -2636,8 +2636,10 @@ ciKlass* LIRGenerator::profile_type(ciMethodData* md, int md_base_offset, int md // LIR_Assembler::emit_profile_type() from emitting useless code profiled_k = ciTypeEntries::with_status(result, profiled_k); } - if (exact_signature_k != NULL && exact_klass != exact_signature_k) { - assert(exact_klass == NULL, "obj and signature disagree?"); + // exact_klass and exact_signature_k can be both non NULL but + // different if exact_klass is loaded after the ciObject for + // exact_signature_k is created. + if (exact_klass == NULL && exact_signature_k != NULL && exact_klass != exact_signature_k) { // sometimes the type of the signature is better than the best type // the compiler has exact_klass = exact_signature_k; @@ -2648,8 +2650,7 @@ ciKlass* LIRGenerator::profile_type(ciMethodData* md, int md_base_offset, int md if (improved_klass == NULL) { improved_klass = comp->cha_exact_type(callee_signature_k); } - if (improved_klass != NULL && exact_klass != improved_klass) { - assert(exact_klass == NULL, "obj and signature disagree?"); + if (exact_klass == NULL && improved_klass != NULL && exact_klass != improved_klass) { exact_klass = exact_signature_k; } } diff --git a/hotspot/src/share/vm/ci/ciEnv.cpp b/hotspot/src/share/vm/ci/ciEnv.cpp index 9da5f98ded5..df6017e0a4a 100644 --- a/hotspot/src/share/vm/ci/ciEnv.cpp +++ b/hotspot/src/share/vm/ci/ciEnv.cpp @@ -51,6 +51,7 @@ #include "runtime/init.hpp" #include "runtime/reflection.hpp" #include "runtime/sharedRuntime.hpp" +#include "runtime/thread.inline.hpp" #include "utilities/dtrace.hpp" #include "utilities/macros.hpp" #ifdef COMPILER1 diff --git a/hotspot/src/share/vm/ci/ciObject.cpp b/hotspot/src/share/vm/ci/ciObject.cpp index 71aa4302fb1..9685356754c 100644 --- a/hotspot/src/share/vm/ci/ciObject.cpp +++ b/hotspot/src/share/vm/ci/ciObject.cpp @@ -181,9 +181,8 @@ bool ciObject::should_be_constant() { if (klass() == env->String_klass() || klass() == env->Class_klass()) { return true; } - if (EnableInvokeDynamic && - (klass()->is_subclass_of(env->MethodHandle_klass()) || - klass()->is_subclass_of(env->CallSite_klass()))) { + if (klass()->is_subclass_of(env->MethodHandle_klass()) || + klass()->is_subclass_of(env->CallSite_klass())) { assert(ScavengeRootsInCode >= 1, "must be"); // We want to treat these aggressively. return true; diff --git a/hotspot/src/share/vm/ci/ciReplay.cpp b/hotspot/src/share/vm/ci/ciReplay.cpp index e880815098d..6acde213d57 100644 --- a/hotspot/src/share/vm/ci/ciReplay.cpp +++ b/hotspot/src/share/vm/ci/ciReplay.cpp @@ -376,11 +376,15 @@ class CompileReplay : public StackObj { int c = getc(_stream); while(c != EOF) { c = get_line(c); - process_command(CHECK); + process_command(THREAD); if (had_error()) { tty->print_cr("Error while parsing line %d: %s\n", line_no, _error_message); - tty->print_cr("%s", _buffer); - return; + if (ReplayIgnoreInitErrors) { + CLEAR_PENDING_EXCEPTION; + _error_message = NULL; + } else { + return; + } } line_no++; } @@ -565,10 +569,14 @@ class CompileReplay : public StackObj { void process_ciMethodData(TRAPS) { Method* method = parse_method(CHECK); if (had_error()) return; - /* jsut copied from Method, to build interpret data*/ + /* just copied from Method, to build interpret data*/ if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { return; } + // To be properly initialized, some profiling in the MDO needs the + // method to be rewritten (number of arguments at a call for + // instance) + method->method_holder()->link_class(CHECK); // methodOopDesc::build_interpreter_method_data(method, CHECK); { // Grab a lock here to prevent multiple diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 51c999fbdf8..8d73c099a71 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -164,11 +164,6 @@ void ClassFileParser::parse_constant_pool_entries(int length, TRAPS) { "Class file version does not support constant tag %u in class file %s", tag, CHECK); } - if (!EnableInvokeDynamic) { - classfile_parse_error( - "This JVM does not support constant tag %u in class file %s", - tag, CHECK); - } if (tag == JVM_CONSTANT_MethodHandle) { cfs->guarantee_more(4, CHECK); // ref_kind, method_index, tag/access_flags u1 ref_kind = cfs->get_u1_fast(); @@ -189,11 +184,6 @@ void ClassFileParser::parse_constant_pool_entries(int length, TRAPS) { "Class file version does not support constant tag %u in class file %s", tag, CHECK); } - if (!EnableInvokeDynamic) { - classfile_parse_error( - "This JVM does not support constant tag %u in class file %s", - tag, CHECK); - } cfs->guarantee_more(5, CHECK); // bsm_index, nt, tag/access_flags u2 bootstrap_specifier_index = cfs->get_u2_fast(); u2 name_and_type_index = cfs->get_u2_fast(); @@ -263,7 +253,7 @@ void ClassFileParser::parse_constant_pool_entries(int length, TRAPS) { verify_legal_utf8((unsigned char*)utf8_buffer, utf8_length, CHECK); } - if (EnableInvokeDynamic && has_cp_patch_at(index)) { + if (has_cp_patch_at(index)) { Handle patch = clear_cp_patch_at(index); guarantee_property(java_lang_String::is_instance(patch()), "Illegal utf8 patch at %d in class file %s", @@ -419,8 +409,7 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { { int ref_index = cp->method_handle_index_at(index); check_property( - valid_cp_range(ref_index, length) && - EnableInvokeDynamic, + valid_cp_range(ref_index, length), "Invalid constant pool index %u in class file %s", ref_index, CHECK_(nullHandle)); constantTag tag = cp->tag_at(ref_index); @@ -466,7 +455,7 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { case JVM_CONSTANT_MethodType : { int ref_index = cp->method_type_index_at(index); - check_property(valid_symbol_at(ref_index) && EnableInvokeDynamic, + check_property(valid_symbol_at(ref_index), "Invalid constant pool index %u in class file %s", ref_index, CHECK_(nullHandle)); } @@ -492,7 +481,6 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { if (_cp_patches != NULL) { // need to treat this_class specially... - assert(EnableInvokeDynamic, ""); int this_class_index; { cfs->guarantee_more(8, CHECK_(nullHandle)); // flags, this_class, super_class, infs_len @@ -640,7 +628,6 @@ constantPoolHandle ClassFileParser::parse_constant_pool(TRAPS) { void ClassFileParser::patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS) { - assert(EnableInvokeDynamic, ""); BasicType patch_type = T_VOID; switch (cp->tag_at(index).value()) { diff --git a/hotspot/src/share/vm/classfile/classFileParser.hpp b/hotspot/src/share/vm/classfile/classFileParser.hpp index 02a4ce20dd3..ba12f26fde0 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.hpp +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp @@ -377,11 +377,9 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { char* skip_over_field_signature(char* signature, bool void_ok, unsigned int length, TRAPS); bool is_anonymous() { - assert(EnableInvokeDynamic || _host_klass.is_null(), ""); return _host_klass.not_null(); } bool has_cp_patch_at(int index) { - assert(EnableInvokeDynamic, ""); assert(index >= 0, "oob"); return (_cp_patches != NULL && index < _cp_patches->length() @@ -404,10 +402,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { // constant pool construction, but in later versions they can. // %%% Let's phase out the old is_klass_reference. bool valid_klass_reference_at(int index) { - return _cp->is_within_bounds(index) && - (EnableInvokeDynamic - ? _cp->tag_at(index).is_klass_or_reference() - : _cp->tag_at(index).is_klass_reference()); + return _cp->is_within_bounds(index) && _cp->tag_at(index).is_klass_or_reference(); } // Checks that the cpool index is in range and is a utf8 diff --git a/hotspot/src/share/vm/classfile/dictionary.cpp b/hotspot/src/share/vm/classfile/dictionary.cpp index 9a2bb74f821..ec64adc2476 100644 --- a/hotspot/src/share/vm/classfile/dictionary.cpp +++ b/hotspot/src/share/vm/classfile/dictionary.cpp @@ -28,6 +28,7 @@ #include "memory/iterator.hpp" #include "oops/oop.inline.hpp" #include "prims/jvmtiRedefineClassesTrace.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/hashtable.inline.hpp" diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index 9e17d77a55c..a9d213948eb 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -2646,7 +2646,7 @@ oop java_lang_invoke_DirectMethodHandle::member(oop dmh) { void java_lang_invoke_DirectMethodHandle::compute_offsets() { Klass* klass_oop = SystemDictionary::DirectMethodHandle_klass(); - if (klass_oop != NULL && EnableInvokeDynamic) { + if (klass_oop != NULL) { compute_offset(_member_offset, klass_oop, vmSymbols::member_name(), vmSymbols::java_lang_invoke_MemberName_signature()); } } @@ -2668,18 +2668,15 @@ int java_lang_invoke_LambdaForm::_vmentry_offset; void java_lang_invoke_MethodHandle::compute_offsets() { Klass* klass_oop = SystemDictionary::MethodHandle_klass(); - if (klass_oop != NULL && EnableInvokeDynamic) { + if (klass_oop != NULL) { compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::java_lang_invoke_MethodType_signature()); - compute_optional_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); - if (_form_offset == 0) { - EnableInvokeDynamic = false; - } + compute_offset(_form_offset, klass_oop, vmSymbols::form_name(), vmSymbols::java_lang_invoke_LambdaForm_signature()); } } void java_lang_invoke_MemberName::compute_offsets() { Klass* klass_oop = SystemDictionary::MemberName_klass(); - if (klass_oop != NULL && EnableInvokeDynamic) { + if (klass_oop != NULL) { compute_offset(_clazz_offset, klass_oop, vmSymbols::clazz_name(), vmSymbols::class_signature()); compute_offset(_name_offset, klass_oop, vmSymbols::name_name(), vmSymbols::string_signature()); compute_offset(_type_offset, klass_oop, vmSymbols::type_name(), vmSymbols::object_signature()); @@ -2690,7 +2687,7 @@ void java_lang_invoke_MemberName::compute_offsets() { void java_lang_invoke_LambdaForm::compute_offsets() { Klass* klass_oop = SystemDictionary::LambdaForm_klass(); - if (klass_oop != NULL && EnableInvokeDynamic) { + if (klass_oop != NULL) { compute_offset(_vmentry_offset, klass_oop, vmSymbols::vmentry_name(), vmSymbols::java_lang_invoke_MemberName_signature()); } } @@ -2905,7 +2902,6 @@ int java_lang_invoke_MethodType::rtype_slot_count(oop mt) { int java_lang_invoke_CallSite::_target_offset; void java_lang_invoke_CallSite::compute_offsets() { - if (!EnableInvokeDynamic) return; Klass* k = SystemDictionary::CallSite_klass(); if (k != NULL) { compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature()); @@ -3296,14 +3292,12 @@ void JavaClasses::compute_offsets() { java_lang_ClassLoader::compute_offsets(); java_lang_Thread::compute_offsets(); java_lang_ThreadGroup::compute_offsets(); - if (EnableInvokeDynamic) { - java_lang_invoke_MethodHandle::compute_offsets(); - java_lang_invoke_DirectMethodHandle::compute_offsets(); - java_lang_invoke_MemberName::compute_offsets(); - java_lang_invoke_LambdaForm::compute_offsets(); - java_lang_invoke_MethodType::compute_offsets(); - java_lang_invoke_CallSite::compute_offsets(); - } + java_lang_invoke_MethodHandle::compute_offsets(); + java_lang_invoke_DirectMethodHandle::compute_offsets(); + java_lang_invoke_MemberName::compute_offsets(); + java_lang_invoke_LambdaForm::compute_offsets(); + java_lang_invoke_MethodType::compute_offsets(); + java_lang_invoke_CallSite::compute_offsets(); java_security_AccessControlContext::compute_offsets(); // Initialize reflection classes. The layouts of these classes // changed with the new reflection implementation in JDK 1.4, and diff --git a/hotspot/src/share/vm/classfile/resolutionErrors.cpp b/hotspot/src/share/vm/classfile/resolutionErrors.cpp index 3ea45d60631..cef42b1888d 100644 --- a/hotspot/src/share/vm/classfile/resolutionErrors.cpp +++ b/hotspot/src/share/vm/classfile/resolutionErrors.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -32,12 +32,13 @@ // add new entry to the table void ResolutionErrorTable::add_entry(int index, unsigned int hash, - constantPoolHandle pool, int cp_index, Symbol* error) + constantPoolHandle pool, int cp_index, + Symbol* error, Symbol* message) { assert_locked_or_safepoint(SystemDictionary_lock); assert(!pool.is_null() && error != NULL, "adding NULL obj"); - ResolutionErrorEntry* entry = new_entry(hash, pool(), cp_index, error); + ResolutionErrorEntry* entry = new_entry(hash, pool(), cp_index, error, message); add_entry(index, entry); } @@ -58,19 +59,26 @@ ResolutionErrorEntry* ResolutionErrorTable::find_entry(int index, unsigned int h } void ResolutionErrorEntry::set_error(Symbol* e) { - assert(e == NULL || _error == NULL, "cannot reset error"); + assert(e != NULL, "must set a value"); _error = e; - if (_error != NULL) _error->increment_refcount(); + _error->increment_refcount(); +} + +void ResolutionErrorEntry::set_message(Symbol* c) { + assert(c != NULL, "must set a value"); + _message = c; + _message->increment_refcount(); } // create new error entry ResolutionErrorEntry* ResolutionErrorTable::new_entry(int hash, ConstantPool* pool, - int cp_index, Symbol* error) + int cp_index, Symbol* error, + Symbol* message) { ResolutionErrorEntry* entry = (ResolutionErrorEntry*)Hashtable::new_entry(hash, pool); entry->set_cp_index(cp_index); - NOT_PRODUCT(entry->set_error(NULL);) entry->set_error(error); + entry->set_message(message); return entry; } @@ -79,6 +87,7 @@ void ResolutionErrorTable::free_entry(ResolutionErrorEntry *entry) { // decrement error refcount assert(entry->error() != NULL, "error should be set"); entry->error()->decrement_refcount(); + entry->message()->decrement_refcount(); Hashtable::free_entry(entry); } diff --git a/hotspot/src/share/vm/classfile/resolutionErrors.hpp b/hotspot/src/share/vm/classfile/resolutionErrors.hpp index 70b762ef14b..c9e76827cb4 100644 --- a/hotspot/src/share/vm/classfile/resolutionErrors.hpp +++ b/hotspot/src/share/vm/classfile/resolutionErrors.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -38,7 +38,8 @@ class ResolutionErrorTable : public Hashtable { public: ResolutionErrorTable(int table_size); - ResolutionErrorEntry* new_entry(int hash, ConstantPool* pool, int cp_index, Symbol* error); + ResolutionErrorEntry* new_entry(int hash, ConstantPool* pool, int cp_index, + Symbol* error, Symbol* message); void free_entry(ResolutionErrorEntry *entry); ResolutionErrorEntry* bucket(int i) { @@ -55,7 +56,7 @@ public: } void add_entry(int index, unsigned int hash, - constantPoolHandle pool, int which, Symbol* error); + constantPoolHandle pool, int which, Symbol* error, Symbol* message); // find error given the constant pool and constant pool index @@ -79,10 +80,10 @@ class ResolutionErrorEntry : public HashtableEntry { private: int _cp_index; Symbol* _error; + Symbol* _message; public: - ConstantPool* pool() const { return (ConstantPool*)literal(); } - ConstantPool** pool_addr() { return (ConstantPool**)literal_addr(); } + ConstantPool* pool() const { return literal(); } int cp_index() const { return _cp_index; } void set_cp_index(int cp_index) { _cp_index = cp_index; } @@ -90,6 +91,9 @@ class ResolutionErrorEntry : public HashtableEntry { Symbol* error() const { return _error; } void set_error(Symbol* e); + Symbol* message() const { return _message; } + void set_message(Symbol* c); + ResolutionErrorEntry* next() const { return (ResolutionErrorEntry*)HashtableEntry::next(); } diff --git a/hotspot/src/share/vm/classfile/systemDictionary.cpp b/hotspot/src/share/vm/classfile/systemDictionary.cpp index aa812159557..8d52bef7194 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.cpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp @@ -52,6 +52,7 @@ #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/signature.hpp" #include "services/classLoadingService.hpp" #include "services/threadService.hpp" @@ -172,12 +173,14 @@ Klass* SystemDictionary::resolve_or_fail(Symbol* class_name, Handle class_loader if (HAS_PENDING_EXCEPTION || klass == NULL) { KlassHandle k_h(THREAD, klass); // can return a null klass - klass = handle_resolution_exception(class_name, class_loader, protection_domain, throw_error, k_h, THREAD); + klass = handle_resolution_exception(class_name, throw_error, k_h, THREAD); } return klass; } -Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS) { +Klass* SystemDictionary::handle_resolution_exception(Symbol* class_name, + bool throw_error, + KlassHandle klass_h, TRAPS) { if (HAS_PENDING_EXCEPTION) { // If we have a pending exception we forward it to the caller, unless throw_error is true, // in which case we have to check whether the pending exception is a ClassNotFoundException, @@ -385,7 +388,7 @@ Klass* SystemDictionary::resolve_super_or_fail(Symbol* child_name, } if (HAS_PENDING_EXCEPTION || superk_h() == NULL) { // can null superk - superk_h = KlassHandle(THREAD, handle_resolution_exception(class_name, class_loader, protection_domain, true, superk_h, THREAD)); + superk_h = KlassHandle(THREAD, handle_resolution_exception(class_name, true, superk_h, THREAD)); } return superk_h(); @@ -971,7 +974,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name, if (host_klass.not_null()) { // Create a new CLD for anonymous class, that uses the same class loader // as the host_klass - assert(EnableInvokeDynamic, ""); guarantee(host_klass->class_loader() == class_loader(), "should be the same"); loader_data = ClassLoaderData::anonymous_class_loader_data(class_loader(), CHECK_NULL); loader_data->record_dependency(host_klass(), CHECK_NULL); @@ -996,7 +998,6 @@ Klass* SystemDictionary::parse_stream(Symbol* class_name, if (host_klass.not_null() && k.not_null()) { - assert(EnableInvokeDynamic, ""); k->set_host_klass(host_klass()); // If it's anonymous, initialize it now, since nobody else will. @@ -1877,13 +1878,7 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) { WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass); WKID jsr292_group_end = WK_KLASS_ENUM_NAME(VolatileCallSite_klass); initialize_wk_klasses_until(jsr292_group_start, scan, CHECK); - if (EnableInvokeDynamic) { - initialize_wk_klasses_through(jsr292_group_end, scan, CHECK); - } else { - // Skip the JSR 292 classes, if not enabled. - scan = WKID(jsr292_group_end + 1); - } - + initialize_wk_klasses_through(jsr292_group_end, scan, CHECK); initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK); _box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass); @@ -2119,12 +2114,13 @@ bool SystemDictionary::add_loader_constraint(Symbol* class_name, // Add entry to resolution error table to record the error when the first // attempt to resolve a reference to a class has failed. -void SystemDictionary::add_resolution_error(constantPoolHandle pool, int which, Symbol* error) { +void SystemDictionary::add_resolution_error(constantPoolHandle pool, int which, + Symbol* error, Symbol* message) { unsigned int hash = resolution_errors()->compute_hash(pool, which); int index = resolution_errors()->hash_to_index(hash); { MutexLocker ml(SystemDictionary_lock, Thread::current()); - resolution_errors()->add_entry(index, hash, pool, which, error); + resolution_errors()->add_entry(index, hash, pool, which, error, message); } } @@ -2134,13 +2130,19 @@ void SystemDictionary::delete_resolution_error(ConstantPool* pool) { } // Lookup resolution error table. Returns error if found, otherwise NULL. -Symbol* SystemDictionary::find_resolution_error(constantPoolHandle pool, int which) { +Symbol* SystemDictionary::find_resolution_error(constantPoolHandle pool, int which, + Symbol** message) { unsigned int hash = resolution_errors()->compute_hash(pool, which); int index = resolution_errors()->hash_to_index(hash); { MutexLocker ml(SystemDictionary_lock, Thread::current()); ResolutionErrorEntry* entry = resolution_errors()->find_entry(index, hash, pool, which); - return (entry != NULL) ? entry->error() : (Symbol*)NULL; + if (entry != NULL) { + *message = entry->message(); + return entry->error(); + } else { + return NULL; + } } } @@ -2221,7 +2223,6 @@ methodHandle SystemDictionary::find_method_handle_intrinsic(vmIntrinsics::ID iid Symbol* signature, TRAPS) { methodHandle empty; - assert(EnableInvokeDynamic, ""); assert(MethodHandles::is_signature_polymorphic(iid) && MethodHandles::is_signature_polymorphic_intrinsic(iid) && iid != vmIntrinsics::_invokeGeneric, @@ -2295,7 +2296,6 @@ methodHandle SystemDictionary::find_method_handle_invoker(Symbol* name, Handle *method_type_result, TRAPS) { methodHandle empty; - assert(EnableInvokeDynamic, ""); assert(!THREAD->is_Compiler_thread(), ""); Handle method_type = SystemDictionary::find_method_handle_type(signature, accessing_klass, CHECK_(empty)); diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 097a1e034d4..dad4b8efa66 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -151,16 +151,16 @@ class Ticks; \ /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \ do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle, Opt ) \ - do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292 ) \ - do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292 ) \ - do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292 ) \ + do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre ) \ + do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre ) \ + do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre ) \ do_klass(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt ) \ - do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre_JSR292 ) \ - do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre_JSR292 ) \ - do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre_JSR292 ) \ - do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre_JSR292 ) \ - do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre_JSR292 ) \ - do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre_JSR292 ) \ + do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre ) \ + do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre ) \ + do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre ) \ + do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre ) \ + do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre ) \ + do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre ) \ /* Note: MethodHandle must be first, and VolatileCallSite last in group */ \ \ do_klass(StringBuffer_klass, java_lang_StringBuffer, Pre ) \ @@ -204,7 +204,6 @@ class SystemDictionary : AllStatic { enum InitOption { Pre, // preloaded; error if not present - Pre_JSR292, // preloaded if EnableInvokeDynamic // Order is significant. Options before this point require resolve_or_fail. // Options after this point will use resolve_or_null instead. @@ -228,7 +227,7 @@ class SystemDictionary : AllStatic { static Klass* resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS); private: // handle error translation for resolve_or_null results - static Klass* handle_resolution_exception(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, KlassHandle klass_h, TRAPS); + static Klass* handle_resolution_exception(Symbol* class_name, bool throw_error, KlassHandle klass_h, TRAPS); public: @@ -385,7 +384,6 @@ public: } static Klass* check_klass_Pre( Klass* k) { return check_klass(k); } - static Klass* check_klass_Pre_JSR292(Klass* k) { return EnableInvokeDynamic ? check_klass(k) : k; } static Klass* check_klass_Opt( Klass* k) { return k; } static Klass* check_klass_Opt_Only_JDK15(Klass* k) { assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only"); @@ -531,9 +529,11 @@ public: // Record the error when the first attempt to resolve a reference from a constant // pool entry to a class fails. - static void add_resolution_error(constantPoolHandle pool, int which, Symbol* error); + static void add_resolution_error(constantPoolHandle pool, int which, Symbol* error, + Symbol* message); static void delete_resolution_error(ConstantPool* pool); - static Symbol* find_resolution_error(constantPoolHandle pool, int which); + static Symbol* find_resolution_error(constantPoolHandle pool, int which, + Symbol** message); private: diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index c75a29d0fbe..d1238f609fa 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -43,7 +43,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/interfaceSupport.hpp" #include "runtime/javaCalls.hpp" -#include "runtime/orderAccess.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" #ifdef TARGET_ARCH_x86 # include "bytes_x86.hpp" @@ -2361,12 +2361,9 @@ void ClassVerifier::verify_invoke_instructions( // Get referenced class type VerificationType ref_class_type; if (opcode == Bytecodes::_invokedynamic) { - if (!EnableInvokeDynamic || - _klass->major_version() < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { + if (_klass->major_version() < Verifier::INVOKEDYNAMIC_MAJOR_VERSION) { class_format_error( - (!EnableInvokeDynamic ? - "invokedynamic instructions not enabled in this JVM" : - "invokedynamic instructions not supported by this class file version"), + "invokedynamic instructions not supported by this class file version", _klass->external_name()); return; } diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 655792688d3..4d3ee6f08dd 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -775,7 +775,7 @@ /* java/lang/ref/Reference */ \ do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ \ - /* support for com.sum.crypto.provider.AESCrypt and some of its callers */ \ + /* support for com.sun.crypto.provider.AESCrypt and some of its callers */ \ do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \ do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ diff --git a/hotspot/src/share/vm/code/dependencies.cpp b/hotspot/src/share/vm/code/dependencies.cpp index bee31fcacfc..21e0f816d83 100644 --- a/hotspot/src/share/vm/code/dependencies.cpp +++ b/hotspot/src/share/vm/code/dependencies.cpp @@ -32,6 +32,7 @@ #include "oops/oop.inline.hpp" #include "runtime/handles.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/thread.inline.hpp" #include "utilities/copy.hpp" diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp index 16b4cce17ed..89604e0caa8 100644 --- a/hotspot/src/share/vm/code/nmethod.cpp +++ b/hotspot/src/share/vm/code/nmethod.cpp @@ -37,6 +37,7 @@ #include "oops/methodData.hpp" #include "prims/jvmtiRedefineClassesTrace.hpp" #include "prims/jvmtiImpl.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/sweeper.hpp" #include "utilities/resourceHash.hpp" @@ -750,7 +751,11 @@ nmethod::nmethod( _hotness_counter = NMethodSweeper::hotness_counter_reset_val(); code_buffer->copy_values_to(this); - debug_only(verify_scavenge_root_oops()); + if (ScavengeRootsInCode && detect_scavenge_root_oops()) { + CodeCache::add_scavenge_root_nmethod(this); + Universe::heap()->register_nmethod(this); + } + DEBUG_ONLY(verify_scavenge_root_oops();) CodeCache::commit(this); } @@ -2284,13 +2289,13 @@ nmethodLocker::nmethodLocker(address pc) { void nmethodLocker::lock_nmethod(nmethod* nm, bool zombie_ok) { if (nm == NULL) return; Atomic::inc(&nm->_lock_count); - guarantee(zombie_ok || !nm->is_zombie(), "cannot lock a zombie method"); + assert(zombie_ok || !nm->is_zombie(), "cannot lock a zombie method"); } void nmethodLocker::unlock_nmethod(nmethod* nm) { if (nm == NULL) return; Atomic::dec(&nm->_lock_count); - guarantee(nm->_lock_count >= 0, "unmatched nmethod lock/unlock"); + assert(nm->_lock_count >= 0, "unmatched nmethod lock/unlock"); } diff --git a/hotspot/src/share/vm/code/nmethod.hpp b/hotspot/src/share/vm/code/nmethod.hpp index 2c36de2c9dd..fa57e9e504d 100644 --- a/hotspot/src/share/vm/code/nmethod.hpp +++ b/hotspot/src/share/vm/code/nmethod.hpp @@ -203,7 +203,7 @@ class nmethod : public CodeBlob { // and is not made into a zombie. However, once the nmethod is made into // a zombie, it will be locked one final time if CompiledMethodUnload // event processing needs to be done. - jint _lock_count; + volatile jint _lock_count; // not_entrant method removal. Each mark_sweep pass will update // this mark to current sweep invocation count if it is seen on the diff --git a/hotspot/src/share/vm/compiler/compileBroker.cpp b/hotspot/src/share/vm/compiler/compileBroker.cpp index 51fff71d54b..8521806cd1f 100644 --- a/hotspot/src/share/vm/compiler/compileBroker.cpp +++ b/hotspot/src/share/vm/compiler/compileBroker.cpp @@ -150,9 +150,8 @@ int CompileBroker::_sum_nmethod_code_size = 0; long CompileBroker::_peak_compilation_time = 0; -CompileQueue* CompileBroker::_c2_method_queue = NULL; -CompileQueue* CompileBroker::_c1_method_queue = NULL; -CompileTask* CompileBroker::_task_free_list = NULL; +CompileQueue* CompileBroker::_c2_compile_queue = NULL; +CompileQueue* CompileBroker::_c1_compile_queue = NULL; GrowableArray* CompileBroker::_compiler_threads = NULL; @@ -220,13 +219,56 @@ CompileTaskWrapper::~CompileTaskWrapper() { // By convention, the compiling thread is responsible for // recycling a non-blocking CompileTask. - CompileBroker::free_task(task); + CompileTask::free(task); } } -// ------------------------------------------------------------------ -// CompileTask::initialize +CompileTask* CompileTask::_task_free_list = NULL; +#ifdef ASSERT +int CompileTask::_num_allocated_tasks = 0; +#endif +/** + * Allocate a CompileTask, from the free list if possible. + */ +CompileTask* CompileTask::allocate() { + MutexLocker locker(CompileTaskAlloc_lock); + CompileTask* task = NULL; + + if (_task_free_list != NULL) { + task = _task_free_list; + _task_free_list = task->next(); + task->set_next(NULL); + } else { + task = new CompileTask(); + DEBUG_ONLY(_num_allocated_tasks++;) + assert (_num_allocated_tasks < 10000, "Leaking compilation tasks?"); + task->set_next(NULL); + task->set_is_free(true); + } + assert(task->is_free(), "Task must be free."); + task->set_is_free(false); + return task; +} + + +/** + * Add a task to the free list. + */ +void CompileTask::free(CompileTask* task) { + MutexLocker locker(CompileTaskAlloc_lock); + if (!task->is_free()) { + task->set_code(NULL); + assert(!task->lock()->is_locked(), "Should not be locked when freed"); + JNIHandles::destroy_global(task->_method_holder); + JNIHandles::destroy_global(task->_hot_method_holder); + + task->set_is_free(true); + task->set_next(_task_free_list); + _task_free_list = task; + } +} + void CompileTask::initialize(int compile_id, methodHandle method, int osr_bci, @@ -284,15 +326,6 @@ void CompileTask::set_code(nmethod* nm) { if (nm == NULL) _code_handle = NULL; // drop the handle also } -// ------------------------------------------------------------------ -// CompileTask::free -void CompileTask::free() { - set_code(NULL); - assert(!_lock->is_locked(), "Should not be locked when freed"); - JNIHandles::destroy_global(_method_holder); - JNIHandles::destroy_global(_hot_method_holder); -} - void CompileTask::mark_on_stack() { // Mark these methods as something redefine classes cannot remove. @@ -555,9 +588,12 @@ void CompileTask::log_task_done(CompileLog* log) { -// Add a CompileTask to a CompileQueue +/** + * Add a CompileTask to a CompileQueue + */ void CompileQueue::add(CompileTask* task) { assert(lock()->owned_by_self(), "must own lock"); + assert(!CompileBroker::is_compilation_disabled_forever(), "Do not add task if compilation is turned off forever"); task->set_next(NULL); task->set_prev(NULL); @@ -579,9 +615,7 @@ void CompileQueue::add(CompileTask* task) { // Mark the method as being in the compile queue. task->method()->set_queued_for_compilation(); - if (CIPrintCompileQueue) { - print(); - } + NOT_PRODUCT(print();) if (LogCompilation && xtty != NULL) { task->log_task_queued(); @@ -591,14 +625,29 @@ void CompileQueue::add(CompileTask* task) { lock()->notify_all(); } -void CompileQueue::delete_all() { - assert(lock()->owned_by_self(), "must own lock"); - if (_first != NULL) { - for (CompileTask* task = _first; task != NULL; task = task->next()) { - delete task; - } - _first = NULL; +/** + * Empties compilation queue by putting all compilation tasks onto + * a freelist. Furthermore, the method wakes up all threads that are + * waiting on a compilation task to finish. This can happen if background + * compilation is disabled. + */ +void CompileQueue::free_all() { + MutexLocker mu(lock()); + CompileTask* next = _first; + + // Iterate over all tasks in the compile queue + while (next != NULL) { + CompileTask* current = next; + next = current->next(); + // Wake up thread that blocks on the compile task. + current->lock()->notify(); + // Put the task back on the freelist. + CompileTask::free(current); } + _first = NULL; + + // Wake up all threads that block on the queue. + lock()->notify_all(); } // ------------------------------------------------------------------ @@ -691,18 +740,24 @@ void CompileQueue::mark_on_stack() { } } -// ------------------------------------------------------------------ -// CompileQueue::print +#ifndef PRODUCT +/** + * Print entire compilation queue. + */ void CompileQueue::print() { - tty->print_cr("Contents of %s", name()); - tty->print_cr("----------------------"); - CompileTask* task = _first; - while (task != NULL) { - task->print_line(); - task = task->next(); + if (CIPrintCompileQueue) { + ttyLocker ttyl; + tty->print_cr("Contents of %s", name()); + tty->print_cr("----------------------"); + CompileTask* task = _first; + while (task != NULL) { + task->print_line(); + task = task->next(); + } + tty->print_cr("----------------------"); } - tty->print_cr("----------------------"); } +#endif // PRODUCT CompilerCounters::CompilerCounters(const char* thread_name, int instance, TRAPS) { @@ -775,9 +830,6 @@ void CompileBroker::compilation_init() { _compilers[1] = new SharkCompiler(); #endif // SHARK - // Initialize the CompileTask free list - _task_free_list = NULL; - // Start the CompilerThreads init_compiler_threads(c1_count, c2_count); // totalTime performance counter is always created as it is required @@ -970,11 +1022,11 @@ void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler #endif // !ZERO && !SHARK // Initialize the compilation queue if (c2_compiler_count > 0) { - _c2_method_queue = new CompileQueue("C2MethodQueue", MethodCompileQueue_lock); + _c2_compile_queue = new CompileQueue("C2 CompileQueue", MethodCompileQueue_lock); _compilers[1]->set_num_compiler_threads(c2_compiler_count); } if (c1_compiler_count > 0) { - _c1_method_queue = new CompileQueue("C1MethodQueue", MethodCompileQueue_lock); + _c1_compile_queue = new CompileQueue("C1 CompileQueue", MethodCompileQueue_lock); _compilers[0]->set_num_compiler_threads(c1_compiler_count); } @@ -989,7 +1041,7 @@ void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler sprintf(name_buffer, "C2 CompilerThread%d", i); CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK); // Shark and C2 - CompilerThread* new_thread = make_compiler_thread(name_buffer, _c2_method_queue, counters, _compilers[1], CHECK); + CompilerThread* new_thread = make_compiler_thread(name_buffer, _c2_compile_queue, counters, _compilers[1], CHECK); _compiler_threads->append(new_thread); } @@ -998,7 +1050,7 @@ void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler sprintf(name_buffer, "C1 CompilerThread%d", i); CompilerCounters* counters = new CompilerCounters("compilerThread", i, CHECK); // C1 - CompilerThread* new_thread = make_compiler_thread(name_buffer, _c1_method_queue, counters, _compilers[0], CHECK); + CompilerThread* new_thread = make_compiler_thread(name_buffer, _c1_compile_queue, counters, _compilers[0], CHECK); _compiler_threads->append(new_thread); } @@ -1008,14 +1060,19 @@ void CompileBroker::init_compiler_threads(int c1_compiler_count, int c2_compiler } -// Set the methods on the stack as on_stack so that redefine classes doesn't -// reclaim them +/** + * Set the methods on the stack as on_stack so that redefine classes doesn't + * reclaim them. This method is executed at a safepoint. + */ void CompileBroker::mark_on_stack() { - if (_c2_method_queue != NULL) { - _c2_method_queue->mark_on_stack(); + assert(SafepointSynchronize::is_at_safepoint(), "sanity check"); + // Since we are at a safepoint, we do not need a lock to access + // the compile queues. + if (_c2_compile_queue != NULL) { + _c2_compile_queue->mark_on_stack(); } - if (_c1_method_queue != NULL) { - _c1_method_queue->mark_on_stack(); + if (_c1_compile_queue != NULL) { + _c1_compile_queue->mark_on_stack(); } } @@ -1031,7 +1088,7 @@ void CompileBroker::compile_method_base(methodHandle method, const char* comment, Thread* thread) { // do nothing if compiler thread(s) is not available - if (!_initialized ) { + if (!_initialized) { return; } @@ -1078,7 +1135,7 @@ void CompileBroker::compile_method_base(methodHandle method, // If this method is already in the compile queue, then // we do not block the current thread. - if (compilation_is_in_queue(method, osr_bci)) { + if (compilation_is_in_queue(method)) { // We may want to decay our counter a bit here to prevent // multiple denied requests for compilation. This is an // open compilation policy issue. Note: The other possibility, @@ -1111,7 +1168,7 @@ void CompileBroker::compile_method_base(methodHandle method, // Make sure the method has not slipped into the queues since // last we checked; note that those checks were "fast bail-outs". // Here we need to be more careful, see 14012000 below. - if (compilation_is_in_queue(method, osr_bci)) { + if (compilation_is_in_queue(method)) { return; } @@ -1132,7 +1189,7 @@ void CompileBroker::compile_method_base(methodHandle method, } // Should this thread wait for completion of the compile? - blocking = is_compile_blocking(method, osr_bci); + blocking = is_compile_blocking(); // We will enter the compilation in the queue. // 14012000: Note that this sets the queued_for_compile bits in @@ -1324,19 +1381,17 @@ bool CompileBroker::compilation_is_complete(methodHandle method, } -// ------------------------------------------------------------------ -// CompileBroker::compilation_is_in_queue -// -// See if this compilation is already requested. -// -// Implementation note: there is only a single "is in queue" bit -// for each method. This means that the check below is overly -// conservative in the sense that an osr compilation in the queue -// will block a normal compilation from entering the queue (and vice -// versa). This can be remedied by a full queue search to disambiguate -// cases. If it is deemed profitible, this may be done. -bool CompileBroker::compilation_is_in_queue(methodHandle method, - int osr_bci) { +/** + * See if this compilation is already requested. + * + * Implementation note: there is only a single "is in queue" bit + * for each method. This means that the check below is overly + * conservative in the sense that an osr compilation in the queue + * will block a normal compilation from entering the queue (and vice + * versa). This can be remedied by a full queue search to disambiguate + * cases. If it is deemed profitable, this may be done. + */ +bool CompileBroker::compilation_is_in_queue(methodHandle method) { return method->queued_for_compilation(); } @@ -1416,13 +1471,11 @@ int CompileBroker::assign_compile_id(methodHandle method, int osr_bci) { #endif } - -// ------------------------------------------------------------------ -// CompileBroker::is_compile_blocking -// -// Should the current thread be blocked until this compilation request -// has been fulfilled? -bool CompileBroker::is_compile_blocking(methodHandle method, int osr_bci) { +/** + * Should the current thread block until this compilation request + * has been fulfilled? + */ +bool CompileBroker::is_compile_blocking() { assert(!InstanceRefKlass::owns_pending_list_lock(JavaThread::current()), "possible deadlock"); return !BackgroundCompilation; } @@ -1450,7 +1503,7 @@ CompileTask* CompileBroker::create_compile_task(CompileQueue* queue, int hot_count, const char* comment, bool blocking) { - CompileTask* new_task = allocate_task(); + CompileTask* new_task = CompileTask::allocate(); new_task->initialize(compile_id, method, osr_bci, comp_level, hot_method, hot_count, comment, blocking); @@ -1459,75 +1512,52 @@ CompileTask* CompileBroker::create_compile_task(CompileQueue* queue, } -// ------------------------------------------------------------------ -// CompileBroker::allocate_task -// -// Allocate a CompileTask, from the free list if possible. -CompileTask* CompileBroker::allocate_task() { - MutexLocker locker(CompileTaskAlloc_lock); - CompileTask* task = NULL; - if (_task_free_list != NULL) { - task = _task_free_list; - _task_free_list = task->next(); - task->set_next(NULL); - } else { - task = new CompileTask(); - task->set_next(NULL); - } - return task; -} - - -// ------------------------------------------------------------------ -// CompileBroker::free_task -// -// Add a task to the free list. -void CompileBroker::free_task(CompileTask* task) { - MutexLocker locker(CompileTaskAlloc_lock); - task->free(); - task->set_next(_task_free_list); - _task_free_list = task; -} - - -// ------------------------------------------------------------------ -// CompileBroker::wait_for_completion -// -// Wait for the given method CompileTask to complete. +/** + * Wait for the compilation task to complete. + */ void CompileBroker::wait_for_completion(CompileTask* task) { if (CIPrintCompileQueue) { + ttyLocker ttyl; tty->print_cr("BLOCKING FOR COMPILE"); } assert(task->is_blocking(), "can only wait on blocking task"); - JavaThread *thread = JavaThread::current(); + JavaThread* thread = JavaThread::current(); thread->set_blocked_on_compilation(true); methodHandle method(thread, task->method()); { MutexLocker waiter(task->lock(), thread); - while (!task->is_complete()) + while (!task->is_complete() && !is_compilation_disabled_forever()) { task->lock()->wait(); + } } + + thread->set_blocked_on_compilation(false); + if (is_compilation_disabled_forever()) { + CompileTask::free(task); + return; + } + // It is harmless to check this status without the lock, because // completion is a stable property (until the task object is recycled). assert(task->is_complete(), "Compilation should have completed"); assert(task->code_handle() == NULL, "must be reset"); - thread->set_blocked_on_compilation(false); - // By convention, the waiter is responsible for recycling a // blocking CompileTask. Since there is only one waiter ever // waiting on a CompileTask, we know that no one else will // be using this CompileTask; we can free it. - free_task(task); + CompileTask::free(task); } -// Initialize compiler thread(s) + compiler object(s). The postcondition -// of this function is that the compiler runtimes are initialized and that -//compiler threads can start compiling. +/** + * Initialize compiler thread(s) + compiler object(s). The postcondition + * of this function is that the compiler runtimes are initialized and that + * compiler threads can start compiling. + */ bool CompileBroker::init_compiler_runtime() { CompilerThread* thread = CompilerThread::current(); AbstractCompiler* comp = thread->compiler(); @@ -1564,7 +1594,6 @@ bool CompileBroker::init_compiler_runtime() { disable_compilation_forever(); // If compiler initialization failed, no compiler thread that is specific to a // particular compiler runtime will ever start to compile methods. - shutdown_compiler_runtime(comp, thread); return false; } @@ -1578,9 +1607,11 @@ bool CompileBroker::init_compiler_runtime() { return true; } -// If C1 and/or C2 initialization failed, we shut down all compilation. -// We do this to keep things simple. This can be changed if it ever turns out to be -// a problem. +/** + * If C1 and/or C2 initialization failed, we shut down all compilation. + * We do this to keep things simple. This can be changed if it ever turns + * out to be a problem. + */ void CompileBroker::shutdown_compiler_runtime(AbstractCompiler* comp, CompilerThread* thread) { // Free buffer blob, if allocated if (thread->get_buffer_blob() != NULL) { @@ -1592,28 +1623,25 @@ void CompileBroker::shutdown_compiler_runtime(AbstractCompiler* comp, CompilerTh // There are two reasons for shutting down the compiler // 1) compiler runtime initialization failed // 2) The code cache is full and the following flag is set: -XX:-UseCodeCacheFlushing - warning("Shutting down compiler %s (no space to run compilers)", comp->name()); + warning("%s initialization failed. Shutting down all compilers", comp->name()); // Only one thread per compiler runtime object enters here // Set state to shut down comp->set_shut_down(); - MutexLocker mu(MethodCompileQueue_lock, thread); - CompileQueue* queue; - if (_c1_method_queue != NULL) { - _c1_method_queue->delete_all(); - queue = _c1_method_queue; - _c1_method_queue = NULL; - delete _c1_method_queue; + // Delete all queued compilation tasks to make compiler threads exit faster. + if (_c1_compile_queue != NULL) { + _c1_compile_queue->free_all(); } - if (_c2_method_queue != NULL) { - _c2_method_queue->delete_all(); - queue = _c2_method_queue; - _c2_method_queue = NULL; - delete _c2_method_queue; + if (_c2_compile_queue != NULL) { + _c2_compile_queue->free_all(); } + // Set flags so that we continue execution with using interpreter only. + UseCompiler = false; + UseInterpreter = true; + // We could delete compiler runtimes also. However, there are references to // the compiler runtime(s) (e.g., nmethod::is_compiled_by_c1()) which then // fail. This can be done later if necessary. diff --git a/hotspot/src/share/vm/compiler/compileBroker.hpp b/hotspot/src/share/vm/compiler/compileBroker.hpp index 75cbcafaac0..dc0b0ba854f 100644 --- a/hotspot/src/share/vm/compiler/compileBroker.hpp +++ b/hotspot/src/share/vm/compiler/compileBroker.hpp @@ -40,6 +40,11 @@ class CompileTask : public CHeapObj { friend class VMStructs; private: + static CompileTask* _task_free_list; +#ifdef ASSERT + static int _num_allocated_tasks; +#endif + Monitor* _lock; uint _compile_id; Method* _method; @@ -52,7 +57,7 @@ class CompileTask : public CHeapObj { int _num_inlined_bytecodes; nmethodLocker* _code_handle; // holder of eventual result CompileTask* _next, *_prev; - + bool _is_free; // Fields used for logging why the compilation was initiated: jlong _time_queued; // in units of os::elapsed_counter() Method* _hot_method; // which method actually triggered this task @@ -69,7 +74,8 @@ class CompileTask : public CHeapObj { methodHandle hot_method, int hot_count, const char* comment, bool is_blocking); - void free(); + static CompileTask* allocate(); + static void free(CompileTask* task); int compile_id() const { return _compile_id; } Method* method() const { return _method; } @@ -98,6 +104,8 @@ class CompileTask : public CHeapObj { void set_next(CompileTask* next) { _next = next; } CompileTask* prev() const { return _prev; } void set_prev(CompileTask* prev) { _prev = prev; } + bool is_free() const { return _is_free; } + void set_is_free(bool val) { _is_free = val; } private: static void print_compilation_impl(outputStream* st, Method* method, int compile_id, int comp_level, @@ -213,8 +221,8 @@ class CompileQueue : public CHeapObj { // Redefine Classes support void mark_on_stack(); - void delete_all(); - void print(); + void free_all(); + NOT_PRODUCT (void print();) ~CompileQueue() { assert (is_empty(), " Compile Queue must be empty"); @@ -267,9 +275,8 @@ class CompileBroker: AllStatic { static int _last_compile_level; static char _last_method_compiled[name_buffer_length]; - static CompileQueue* _c2_method_queue; - static CompileQueue* _c1_method_queue; - static CompileTask* _task_free_list; + static CompileQueue* _c2_compile_queue; + static CompileQueue* _c1_compile_queue; static GrowableArray* _compiler_threads; @@ -322,7 +329,7 @@ class CompileBroker: AllStatic { static void init_compiler_threads(int c1_compiler_count, int c2_compiler_count); static bool compilation_is_complete (methodHandle method, int osr_bci, int comp_level); static bool compilation_is_prohibited(methodHandle method, int osr_bci, int comp_level); - static bool is_compile_blocking (methodHandle method, int osr_bci); + static bool is_compile_blocking (); static void preload_classes (methodHandle method, TRAPS); static CompileTask* create_compile_task(CompileQueue* queue, @@ -334,8 +341,6 @@ class CompileBroker: AllStatic { int hot_count, const char* comment, bool blocking); - static CompileTask* allocate_task(); - static void free_task(CompileTask* task); static void wait_for_completion(CompileTask* task); static void invoke_compiler_on_method(CompileTask* task); @@ -353,8 +358,8 @@ class CompileBroker: AllStatic { const char* comment, Thread* thread); static CompileQueue* compile_queue(int comp_level) { - if (is_c2_compile(comp_level)) return _c2_method_queue; - if (is_c1_compile(comp_level)) return _c1_method_queue; + if (is_c2_compile(comp_level)) return _c2_compile_queue; + if (is_c1_compile(comp_level)) return _c1_compile_queue; return NULL; } static bool init_compiler_runtime(); @@ -372,7 +377,7 @@ class CompileBroker: AllStatic { return NULL; } - static bool compilation_is_in_queue(methodHandle method, int osr_bci); + static bool compilation_is_in_queue(methodHandle method); static int queue_size(int comp_level) { CompileQueue *q = compile_queue(comp_level); return q != NULL ? q->size() : 0; diff --git a/hotspot/src/share/vm/compiler/oopMap.cpp b/hotspot/src/share/vm/compiler/oopMap.cpp index 6179099601e..c4c83fc164d 100644 --- a/hotspot/src/share/vm/compiler/oopMap.cpp +++ b/hotspot/src/share/vm/compiler/oopMap.cpp @@ -467,7 +467,6 @@ void OopMapSet::update_register_map(const frame *fr, RegisterMap *reg_map) { assert(cb != NULL, "no codeblob"); // Any reg might be saved by a safepoint handler (see generate_handler_blob). - const int max_saved_on_entry_reg_count = ConcreteRegisterImpl::number_of_registers; assert( reg_map->_update_for_id == NULL || fr->is_older(reg_map->_update_for_id), "already updated this map; do not 'update' it twice!" ); debug_only(reg_map->_update_for_id = fr->id()); @@ -477,27 +476,20 @@ void OopMapSet::update_register_map(const frame *fr, RegisterMap *reg_map) { !cb->caller_must_gc_arguments(reg_map->thread())), "include_argument_oops should already be set"); - int nof_callee = 0; - oop* locs[2*max_saved_on_entry_reg_count+1]; - VMReg regs[2*max_saved_on_entry_reg_count+1]; - // ("+1" because max_saved_on_entry_reg_count might be zero) - // Scan through oopmap and find location of all callee-saved registers // (we do not do update in place, since info could be overwritten) address pc = fr->pc(); - OopMap* map = cb->oop_map_for_return_address(pc); + assert(map != NULL, "no ptr map found"); + DEBUG_ONLY(int nof_callee = 0;) - assert(map != NULL, " no ptr map found"); - - OopMapValue omv; - for(OopMapStream oms(map,OopMapValue::callee_saved_value); !oms.is_done(); oms.next()) { - omv = oms.current(); - assert(nof_callee < 2*max_saved_on_entry_reg_count, "overflow"); - regs[nof_callee] = omv.content_reg(); - locs[nof_callee] = fr->oopmapreg_to_location(omv.reg(),reg_map); - nof_callee++; + for (OopMapStream oms(map, OopMapValue::callee_saved_value); !oms.is_done(); oms.next()) { + OopMapValue omv = oms.current(); + VMReg reg = omv.content_reg(); + oop* loc = fr->oopmapreg_to_location(omv.reg(), reg_map); + reg_map->set_location(reg, (address) loc); + DEBUG_ONLY(nof_callee++;) } // Check that runtime stubs save all callee-saved registers @@ -506,11 +498,6 @@ void OopMapSet::update_register_map(const frame *fr, RegisterMap *reg_map) { (nof_callee >= SAVED_ON_ENTRY_REG_COUNT || nof_callee >= C_SAVED_ON_ENTRY_REG_COUNT), "must save all"); #endif // COMPILER2 - - // Copy found callee-saved register to reg_map - for(int i = 0; i < nof_callee; i++) { - reg_map->set_location(regs[i], (address)locs[i]); - } } //============================================================================= diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp index 2e5b6caa72c..309fe014aa1 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp @@ -158,7 +158,7 @@ void AdaptiveFreeList::verify_stats() const { " coal_deaths(" SIZE_FORMAT ")" " + count(" SSIZE_FORMAT ")", this, size(), _allocation_stats.prev_sweep(), _allocation_stats.split_births(), - _allocation_stats.split_births(), _allocation_stats.split_deaths(), + _allocation_stats.coal_births(), _allocation_stats.split_deaths(), _allocation_stats.coal_deaths(), count())); } #endif diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp index 378c5e66436..aaa5a1bb770 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp @@ -27,7 +27,7 @@ #include "memory/collectorPolicy.hpp" -class ConcurrentMarkSweepPolicy : public TwoGenerationCollectorPolicy { +class ConcurrentMarkSweepPolicy : public GenCollectorPolicy { protected: void initialize_alignments(); void initialize_generations(); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index aedeecc5db5..bbaffb9bf2e 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -39,6 +39,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/init.hpp" #include "runtime/java.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/copy.hpp" diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index 40ff7b30e40..3d108c28181 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -59,6 +59,7 @@ #include "runtime/globals_extension.hpp" #include "runtime/handles.inline.hpp" #include "runtime/java.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/vmThread.hpp" #include "services/memoryService.hpp" #include "services/runtimeService.hpp" @@ -1560,7 +1561,7 @@ bool CMSCollector::shouldConcurrentCollect() { // this is not likely to be productive in practice because it's probably too // late anyway. GenCollectedHeap* gch = GenCollectedHeap::heap(); - assert(gch->collector_policy()->is_two_generation_policy(), + assert(gch->collector_policy()->is_generation_policy(), "You may want to check the correctness of the following"); if (gch->incremental_collection_will_fail(true /* consult_young */)) { if (Verbose && PrintGCDetails) { @@ -1964,7 +1965,7 @@ void CMSCollector::decide_foreground_collection_type( // has exceeded the threshold set by CMSFullGCsBeforeCompaction, // or if an incremental collection has failed GenCollectedHeap* gch = GenCollectedHeap::heap(); - assert(gch->collector_policy()->is_two_generation_policy(), + assert(gch->collector_policy()->is_generation_policy(), "You may want to check the correctness of the following"); // Inform cms gen if this was due to partial collection failing. // The CMS gen may use this fact to determine its expansion policy. diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp index 29939dd86e7..75c1ddcc0dd 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp @@ -223,12 +223,6 @@ void ConcurrentMarkSweepThread::threads_do(ThreadClosure* tc) { } } -void ConcurrentMarkSweepThread::print_on(outputStream* st) const { - st->print("\"%s\" ", name()); - Thread::print_on(st); - st->cr(); -} - void ConcurrentMarkSweepThread::print_all_on(outputStream* st) { if (_cmst != NULL) { _cmst->print_on(st); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp index 6de07f235bb..7da7511905f 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp @@ -94,8 +94,6 @@ class ConcurrentMarkSweepThread: public ConcurrentGCThread { static void threads_do(ThreadClosure* tc); // Printing - void print_on(outputStream* st) const; - void print() const { print_on(tty); } static void print_all_on(outputStream* st); static void print_all() { print_all_on(tty); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp index 886af56e576..458c3e28c3f 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp @@ -58,6 +58,9 @@ ConcurrentG1RefineThread(ConcurrentG1Refine* cg1r, ConcurrentG1RefineThread *nex } initialize(); create_and_start(); + + // set name + set_name("G1 Concurrent Refinement Thread#%d", worker_id); } void ConcurrentG1RefineThread::initialize() { @@ -247,12 +250,3 @@ void ConcurrentG1RefineThread::stop() { } } -void ConcurrentG1RefineThread::print() const { - print_on(tty); -} - -void ConcurrentG1RefineThread::print_on(outputStream* st) const { - st->print("\"G1 Concurrent Refinement Thread#%d\" ", _worker_id); - Thread::print_on(st); - st->cr(); -} diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp index 05a8dc44ec3..1e599aa335f 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp @@ -77,10 +77,6 @@ public: void initialize(); - // Printing - void print() const; - void print_on(outputStream* st) const; - // Total virtual time so far. double vtime_accum() { return _vtime_accum; } diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp index 5dce0653242..ad11c016e66 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp @@ -46,6 +46,8 @@ ConcurrentMarkThread::ConcurrentMarkThread(ConcurrentMark* cm) : _in_progress(false), _vtime_accum(0.0), _vtime_mark_accum(0.0) { + + set_name("G1 Main Concurrent Mark GC Thread"); create_and_start(); } @@ -322,16 +324,6 @@ void ConcurrentMarkThread::stop() { } } -void ConcurrentMarkThread::print() const { - print_on(tty); -} - -void ConcurrentMarkThread::print_on(outputStream* st) const { - st->print("\"G1 Main Concurrent Mark GC Thread\" "); - Thread::print_on(st); - st->cr(); -} - void ConcurrentMarkThread::sleepBeforeNextCycle() { // We join here because we don't want to do the "shouldConcurrentMark()" // below while the world is otherwise stopped. diff --git a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp index caa7f429c6e..237e022084b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp @@ -60,10 +60,6 @@ class ConcurrentMarkThread: public ConcurrentGCThread { static void makeSurrogateLockerThread(TRAPS); static SurrogateLockerThread* slt() { return _slt; } - // Printing - void print_on(outputStream* st) const; - void print() const; - // Total virtual time so far. double vtime_accum(); // Marking virtual time so far diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp index bb02d6acead..58a76c1dd26 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1AllocRegion.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "gc_implementation/g1/g1AllocRegion.inline.hpp" #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" +#include "runtime/orderAccess.inline.hpp" G1CollectedHeap* G1AllocRegion::_g1h = NULL; HeapRegion* G1AllocRegion::_dummy_region = NULL; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 79a19976658..46feeea2841 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -56,6 +56,7 @@ #include "memory/referenceProcessor.hpp" #include "oops/oop.inline.hpp" #include "oops/oop.pcgc.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/vmThread.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/ticks.hpp" diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp index 833024a1f8a..77918a64aae 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp @@ -1107,20 +1107,11 @@ public: return _gc_time_stamp; } - void reset_gc_time_stamp() { - _gc_time_stamp = 0; - OrderAccess::fence(); - // Clear the cached CSet starting regions and time stamps. - // Their validity is dependent on the GC timestamp. - clear_cset_start_regions(); - } + inline void reset_gc_time_stamp(); void check_gc_time_stamps() PRODUCT_RETURN; - void increment_gc_time_stamp() { - ++_gc_time_stamp; - OrderAccess::fence(); - } + inline void increment_gc_time_stamp(); // Reset the given region's GC timestamp. If it's starts humongous, // also reset the GC timestamp of its corresponding diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp index b7169604b35..b308d4a00dd 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp @@ -33,6 +33,7 @@ #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" #include "gc_implementation/g1/heapRegionSet.inline.hpp" #include "gc_implementation/g1/heapRegionSeq.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/taskqueue.hpp" // Inline functions for G1CollectedHeap @@ -60,6 +61,19 @@ G1CollectedHeap::heap_region_containing(const T addr) const { return hr; } +inline void G1CollectedHeap::reset_gc_time_stamp() { + _gc_time_stamp = 0; + OrderAccess::fence(); + // Clear the cached CSet starting regions and time stamps. + // Their validity is dependent on the GC timestamp. + clear_cset_start_regions(); +} + +inline void G1CollectedHeap::increment_gc_time_stamp() { + ++_gc_time_stamp; + OrderAccess::fence(); +} + inline void G1CollectedHeap::old_set_remove(HeapRegion* hr) { _old_set.remove(hr); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp index 9f20a920b74..756ea3e233b 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp @@ -27,6 +27,7 @@ #include "gc_implementation/g1/heapRegion.hpp" #include "gc_implementation/g1/satbQueue.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/thread.inline.hpp" G1SATBCardTableModRefBS::G1SATBCardTableModRefBS(MemRegion whole_heap, diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp index e59efa7b829..2187fbe89b3 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.cpp @@ -53,12 +53,6 @@ G1StringDedupThread* G1StringDedupThread::thread() { return _thread; } -void G1StringDedupThread::print_on(outputStream* st) const { - st->print("\"%s\" ", name()); - Thread::print_on(st); - st->cr(); -} - void G1StringDedupThread::run() { G1StringDedupStat total_stat; diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp index eb60a0b7614..9ae86042950 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1StringDedupThread.hpp @@ -52,7 +52,6 @@ public: static G1StringDedupThread* thread(); virtual void run(); - virtual void print_on(outputStream* st) const; }; #endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1STRINGDEDUPTHREAD_HPP diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp index a82a9435d0b..57feb98db2e 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp @@ -33,6 +33,7 @@ #include "memory/genOopClosures.inline.hpp" #include "memory/iterator.hpp" #include "oops/oop.inline.hpp" +#include "runtime/orderAccess.inline.hpp" int HeapRegion::LogOfHRGrainBytes = 0; int HeapRegion::LogOfHRGrainWords = 0; diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp index b1dacc870eb..3a03b93a56f 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp @@ -32,6 +32,7 @@ #include "oops/oop.inline.hpp" #include "runtime/java.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/virtualspace.hpp" #include "runtime/vmThread.hpp" diff --git a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp index cc926949990..41c7bb827d8 100644 --- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp @@ -50,7 +50,7 @@ #include "runtime/handles.hpp" #include "runtime/handles.inline.hpp" #include "runtime/java.hpp" -#include "runtime/thread.hpp" +#include "runtime/thread.inline.hpp" #include "utilities/copy.hpp" #include "utilities/globalDefinitions.hpp" #include "utilities/workgroup.hpp" diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp index bf3e3bf001f..ac7a1a31e45 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp @@ -30,6 +30,7 @@ #include "memory/allocation.inline.hpp" #include "runtime/mutex.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" // // GCTask diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp index d8ee14c283d..ec2e28f5674 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp @@ -87,12 +87,6 @@ void GCTaskThread::print_task_time_stamps() { _time_stamp_index = 0; } -void GCTaskThread::print_on(outputStream* st) const { - st->print("\"%s\" ", name()); - Thread::print_on(st); - st->cr(); -} - // GC workers get tasks from the GCTaskManager and execute // them in this method. If there are no tasks to execute, // the GC workers wait in the GCTaskManager's get_task() diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp index 7f8aff2bdbf..0c17989a7d5 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp @@ -69,8 +69,6 @@ private: void start(); void print_task_time_stamps(); - void print_on(outputStream* st) const; - void print() const { print_on(tty); } protected: // Constructor. Clients use factory, but there could be subclasses. diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp index e417cd49599..fd8b1332c7a 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp @@ -45,7 +45,7 @@ void GenerationSizer::initialize_alignments() { void GenerationSizer::initialize_flags() { // Do basic sizing work - TwoGenerationCollectorPolicy::initialize_flags(); + GenCollectorPolicy::initialize_flags(); assert(UseSerialGC || !FLAG_IS_DEFAULT(ParallelGCThreads) || @@ -79,7 +79,7 @@ void GenerationSizer::initialize_size_info() { // Redo everything from the start initialize_flags(); } - TwoGenerationCollectorPolicy::initialize_size_info(); + GenCollectorPolicy::initialize_size_info(); trace_gen_sizes("ps heap rnd"); } diff --git a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp index eb8c78a8c81..70309a7fd59 100644 --- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp +++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp @@ -28,9 +28,9 @@ #include "memory/collectorPolicy.hpp" // There is a nice batch of tested generation sizing code in -// TwoGenerationCollectorPolicy. Lets reuse it! +// GenCollectorPolicy. Lets reuse it! -class GenerationSizer : public TwoGenerationCollectorPolicy { +class GenerationSizer : public GenCollectorPolicy { private: void trace_gen_sizes(const char* const str); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 9453b50febb..6c30983c2ea 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -41,43 +41,10 @@ #include "runtime/frame.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/interfaceSupport.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/threadCritical.hpp" #include "utilities/exceptions.hpp" -#ifdef TARGET_OS_ARCH_linux_x86 -# include "orderAccess_linux_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "orderAccess_linux_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "orderAccess_linux_zero.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "orderAccess_solaris_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "orderAccess_solaris_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_windows_x86 -# include "orderAccess_windows_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "orderAccess_linux_arm.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "orderAccess_linux_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_aix_ppc -# include "orderAccess_aix_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "orderAccess_bsd_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "orderAccess_bsd_zero.inline.hpp" -#endif - // no precompiled headers #ifdef CC_INTERP @@ -507,25 +474,7 @@ BytecodeInterpreter::run(interpreterState istate) { #ifdef ASSERT if (istate->_msg != initialize) { - // We have a problem here if we are running with a pre-hsx24 JDK (for example during bootstrap) - // because in that case, EnableInvokeDynamic is true by default but will be later switched off - // if java_lang_invoke_MethodHandle::compute_offsets() detects that the JDK only has the classes - // for the old JSR292 implementation. - // This leads to a situation where 'istate->_stack_limit' always accounts for - // methodOopDesc::extra_stack_entries() because it is computed in - // CppInterpreterGenerator::generate_compute_interpreter_state() which was generated while - // EnableInvokeDynamic was still true. On the other hand, istate->_method->max_stack() doesn't - // account for extra_stack_entries() anymore because at the time when it is called - // EnableInvokeDynamic was already set to false. - // So we have a second version of the assertion which handles the case where EnableInvokeDynamic was - // switched off because of the wrong classes. - if (EnableInvokeDynamic || FLAG_IS_CMDLINE(EnableInvokeDynamic)) { - assert(labs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + 1), "bad stack limit"); - } else { - const int extra_stack_entries = Method::extra_stack_entries_for_jsr292; - assert(labs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + extra_stack_entries - + 1), "bad stack limit"); - } + assert(labs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + 1), "bad stack limit"); #ifndef SHARK IA32_ONLY(assert(istate->_stack_limit == istate->_thread->last_Java_sp() + 1, "wrong")); #endif // !SHARK @@ -2458,15 +2407,6 @@ run: CASE(_invokedynamic): { - if (!EnableInvokeDynamic) { - // We should not encounter this bytecode if !EnableInvokeDynamic. - // The verifier will stop it. However, if we get past the verifier, - // this will stop the thread in a reasonable way, without crashing the JVM. - CALL_VM(InterpreterRuntime::throw_IncompatibleClassChangeError(THREAD), - handle_exception); - ShouldNotReachHere(); - } - u4 index = Bytes::get_native_u4(pc+1); ConstantPoolCacheEntry* cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index); @@ -2501,10 +2441,6 @@ run: CASE(_invokehandle): { - if (!EnableInvokeDynamic) { - ShouldNotReachHere(); - } - u2 index = Bytes::get_native_u2(pc+1); ConstantPoolCacheEntry* cache = cp->entry_at(index); diff --git a/hotspot/src/share/vm/interpreter/bytecodes.hpp b/hotspot/src/share/vm/interpreter/bytecodes.hpp index 707f210e8e0..2cb49c98cb1 100644 --- a/hotspot/src/share/vm/interpreter/bytecodes.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodes.hpp @@ -224,7 +224,7 @@ class Bytecodes: AllStatic { _invokespecial = 183, // 0xb7 _invokestatic = 184, // 0xb8 _invokeinterface = 185, // 0xb9 - _invokedynamic = 186, // 0xba // if EnableInvokeDynamic + _invokedynamic = 186, // 0xba _new = 187, // 0xbb _newarray = 188, // 0xbc _anewarray = 189, // 0xbd diff --git a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp index 22ffec4301d..0e1c129038d 100644 --- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp +++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp @@ -769,7 +769,6 @@ IRT_END // First time execution: Resolve symbols, create a permanent MethodType object. IRT_ENTRY(void, InterpreterRuntime::resolve_invokehandle(JavaThread* thread)) { - assert(EnableInvokeDynamic, ""); const Bytecodes::Code bytecode = Bytecodes::_invokehandle; // resolve method @@ -789,7 +788,6 @@ IRT_END // First time execution: Resolve symbols, create a permanent CallSite object. IRT_ENTRY(void, InterpreterRuntime::resolve_invokedynamic(JavaThread* thread)) { - assert(EnableInvokeDynamic, ""); const Bytecodes::Code bytecode = Bytecodes::_invokedynamic; //TO DO: consider passing BCI to Java. diff --git a/hotspot/src/share/vm/interpreter/linkResolver.cpp b/hotspot/src/share/vm/interpreter/linkResolver.cpp index 8bcfc1f1ee2..a0f204c6eb2 100644 --- a/hotspot/src/share/vm/interpreter/linkResolver.cpp +++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp @@ -270,7 +270,7 @@ void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle kl } } - if (checkpolymorphism && EnableInvokeDynamic && result_oop != NULL) { + if (checkpolymorphism && result_oop != NULL) { vmIntrinsics::ID iid = result_oop->intrinsic_id(); if (MethodHandles::is_signature_polymorphic(iid)) { // Do not link directly to these. The VM must produce a synthetic one using lookup_polymorphic_method. @@ -345,8 +345,7 @@ void LinkResolver::lookup_polymorphic_method(methodHandle& result, vmIntrinsics::name_at(iid), klass->external_name(), name->as_C_string(), full_signature->as_C_string()); } - if (EnableInvokeDynamic && - klass() == SystemDictionary::MethodHandle_klass() && + if (klass() == SystemDictionary::MethodHandle_klass() && iid != vmIntrinsics::_none) { if (MethodHandles::is_signature_polymorphic_intrinsic(iid)) { // Most of these do not need an up-call to Java to resolve, so can be done anywhere. @@ -1543,7 +1542,6 @@ void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, consta void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) { - assert(EnableInvokeDynamic, ""); // This guy is reached from InterpreterRuntime::resolve_invokehandle. KlassHandle resolved_klass; Symbol* method_name = NULL; @@ -1575,8 +1573,6 @@ void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_kl void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) { - assert(EnableInvokeDynamic, ""); - //resolve_pool(, method_name, method_signature, current_klass, pool, index, CHECK); Symbol* method_name = pool->name_ref_at(index); Symbol* method_signature = pool->signature_ref_at(index); diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp index e975324ad40..ac716bb01e2 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -120,7 +120,7 @@ TreeList >::get_better_list( // chunk. TreeList >* curTL = this; - if (surplus() <= 0) { + if (curTL->surplus() <= 0) { /* Use the hint to find a size with a surplus, and reset the hint. */ TreeList >* hintTL = this; while (hintTL->hint() != 0) { diff --git a/hotspot/src/share/vm/memory/collectorPolicy.cpp b/hotspot/src/share/vm/memory/collectorPolicy.cpp index 772a6df4aff..69d39e4d431 100644 --- a/hotspot/src/share/vm/memory/collectorPolicy.cpp +++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp @@ -200,6 +200,9 @@ GenCollectorPolicy::GenCollectorPolicy() : _initial_gen0_size(0), _max_gen0_size(0), _gen_alignment(0), + _min_gen1_size(0), + _initial_gen1_size(0), + _max_gen1_size(0), _generations(NULL) {} @@ -238,10 +241,6 @@ void GenCollectorPolicy::assert_flags() { assert(FLAG_IS_DEFAULT(MaxNewSize) || MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young gen and heap sizes"); assert(NewSize % _gen_alignment == 0, "NewSize alignment"); assert(FLAG_IS_DEFAULT(MaxNewSize) || MaxNewSize % _gen_alignment == 0, "MaxNewSize alignment"); -} - -void TwoGenerationCollectorPolicy::assert_flags() { - GenCollectorPolicy::assert_flags(); assert(OldSize + NewSize <= MaxHeapSize, "Ergonomics decided on incompatible generation and heap sizes"); assert(OldSize % _gen_alignment == 0, "OldSize alignment"); } @@ -252,6 +251,7 @@ void GenCollectorPolicy::assert_size_info() { assert(MaxNewSize < MaxHeapSize, "Ergonomics decided on incompatible maximum young and heap sizes"); assert(NewSize == _initial_gen0_size, "Discrepancy between NewSize flag and local storage"); assert(MaxNewSize == _max_gen0_size, "Discrepancy between MaxNewSize flag and local storage"); + assert(OldSize == _initial_gen1_size, "Discrepancy between OldSize flag and local storage"); assert(_min_gen0_size <= _initial_gen0_size, "Ergonomics decided on incompatible minimum and initial young gen sizes"); assert(_initial_gen0_size <= _max_gen0_size, "Ergonomics decided on incompatible initial and maximum young gen sizes"); assert(_min_gen0_size % _gen_alignment == 0, "_min_gen0_size alignment"); @@ -263,11 +263,6 @@ void GenCollectorPolicy::assert_size_info() { "Ergonomics made initial young generation larger than initial heap"); assert(_max_gen0_size <= bound_minus_alignment(_max_gen0_size, _max_heap_byte_size), "Ergonomics made maximum young generation lager than maximum heap"); -} - -void TwoGenerationCollectorPolicy::assert_size_info() { - GenCollectorPolicy::assert_size_info(); - assert(OldSize == _initial_gen1_size, "Discrepancy between OldSize flag and local storage"); assert(_min_gen1_size <= _initial_gen1_size, "Ergonomics decided on incompatible minimum and initial old gen sizes"); assert(_initial_gen1_size <= _max_gen1_size, "Ergonomics decided on incompatible initial and maximum old gen sizes"); assert(_max_gen1_size % _gen_alignment == 0, "_max_gen1_size alignment"); @@ -369,12 +364,6 @@ void GenCollectorPolicy::initialize_flags() { vm_exit_during_initialization("Invalid young gen ratio specified"); } - DEBUG_ONLY(GenCollectorPolicy::assert_flags();) -} - -void TwoGenerationCollectorPolicy::initialize_flags() { - GenCollectorPolicy::initialize_flags(); - if (!is_size_aligned(OldSize, _gen_alignment)) { // Setting OldSize directly to preserve information about the possible // setting of OldSize on the command line. @@ -433,7 +422,7 @@ void TwoGenerationCollectorPolicy::initialize_flags() { always_do_update_barrier = UseConcMarkSweepGC; - DEBUG_ONLY(TwoGenerationCollectorPolicy::assert_flags();) + DEBUG_ONLY(GenCollectorPolicy::assert_flags();) } // Values set on the command line win over any ergonomically @@ -445,6 +434,13 @@ void TwoGenerationCollectorPolicy::initialize_flags() { // themselves and with overall heap sizings. // In the absence of explicitly set command line flags, policies // such as the use of NewRatio are used to size the generation. + +// Minimum sizes of the generations may be different than +// the initial sizes. An inconsistency is permitted here +// in the total size that can be specified explicitly by +// command line specification of OldSize and NewSize and +// also a command line specification of -Xms. Issue a warning +// but allow the values to pass. void GenCollectorPolicy::initialize_size_info() { CollectorPolicy::initialize_size_info(); @@ -520,19 +516,6 @@ void GenCollectorPolicy::initialize_size_info() { _min_gen0_size, _initial_gen0_size, _max_gen0_size); } - DEBUG_ONLY(GenCollectorPolicy::assert_size_info();) -} - -// Minimum sizes of the generations may be different than -// the initial sizes. An inconsistency is permitted here -// in the total size that can be specified explicitly by -// command line specification of OldSize and NewSize and -// also a command line specification of -Xms. Issue a warning -// but allow the values to pass. - -void TwoGenerationCollectorPolicy::initialize_size_info() { - GenCollectorPolicy::initialize_size_info(); - // At this point the minimum, initial and maximum sizes // of the overall heap and of gen0 have been determined. // The maximum gen1 size can be determined from the maximum gen0 @@ -625,7 +608,7 @@ void TwoGenerationCollectorPolicy::initialize_size_info() { _min_gen1_size, _initial_gen1_size, _max_gen1_size); } - DEBUG_ONLY(TwoGenerationCollectorPolicy::assert_size_info();) + DEBUG_ONLY(GenCollectorPolicy::assert_size_info();) } HeapWord* GenCollectorPolicy::mem_allocate_work(size_t size, diff --git a/hotspot/src/share/vm/memory/collectorPolicy.hpp b/hotspot/src/share/vm/memory/collectorPolicy.hpp index 36f74b5a016..1fc62b06c43 100644 --- a/hotspot/src/share/vm/memory/collectorPolicy.hpp +++ b/hotspot/src/share/vm/memory/collectorPolicy.hpp @@ -47,7 +47,6 @@ // Forward declarations. class GenCollectorPolicy; -class TwoGenerationCollectorPolicy; class AdaptiveSizePolicy; #if INCLUDE_ALL_GCS class ConcurrentMarkSweepPolicy; @@ -114,7 +113,7 @@ class CollectorPolicy : public CHeapObj { enum Name { CollectorPolicyKind, - TwoGenerationCollectorPolicyKind, + GenCollectorPolicyKind, ConcurrentMarkSweepPolicyKind, ASConcurrentMarkSweepPolicyKind, G1CollectorPolicyKind @@ -135,7 +134,6 @@ class CollectorPolicy : public CHeapObj { // Identification methods. virtual GenCollectorPolicy* as_generation_policy() { return NULL; } - virtual TwoGenerationCollectorPolicy* as_two_generation_policy() { return NULL; } virtual MarkSweepPolicy* as_mark_sweep_policy() { return NULL; } #if INCLUDE_ALL_GCS virtual ConcurrentMarkSweepPolicy* as_concurrent_mark_sweep_policy() { return NULL; } @@ -143,7 +141,6 @@ class CollectorPolicy : public CHeapObj { #endif // INCLUDE_ALL_GCS // Note that these are not virtual. bool is_generation_policy() { return as_generation_policy() != NULL; } - bool is_two_generation_policy() { return as_two_generation_policy() != NULL; } bool is_mark_sweep_policy() { return as_mark_sweep_policy() != NULL; } #if INCLUDE_ALL_GCS bool is_concurrent_mark_sweep_policy() { return as_concurrent_mark_sweep_policy() != NULL; } @@ -225,6 +222,9 @@ friend class TestGenCollectorPolicy; size_t _min_gen0_size; size_t _initial_gen0_size; size_t _max_gen0_size; + size_t _min_gen1_size; + size_t _initial_gen1_size; + size_t _max_gen1_size; // _gen_alignment and _space_alignment will have the same value most of the // time. When using large pages they can differ. @@ -264,8 +264,11 @@ friend class TestGenCollectorPolicy; size_t initial_gen0_size() { return _initial_gen0_size; } size_t max_gen0_size() { return _max_gen0_size; } size_t gen_alignment() { return _gen_alignment; } + size_t min_gen1_size() { return _min_gen1_size; } + size_t initial_gen1_size() { return _initial_gen1_size; } + size_t max_gen1_size() { return _max_gen1_size; } - virtual int number_of_generations() = 0; + int number_of_generations() { return 2; } virtual GenerationSpec **generations() { assert(_generations != NULL, "Sanity check"); @@ -297,47 +300,15 @@ friend class TestGenCollectorPolicy; virtual void post_heap_initialize() { assert(_max_gen0_size == MaxNewSize, "Should be taken care of by initialize_size_info"); } -}; -// All of hotspot's current collectors are subtypes of this -// class. Currently, these collectors all use the same gen[0], -// but have different gen[1] types. If we add another subtype -// of CollectorPolicy, this class should be broken out into -// its own file. - -class TwoGenerationCollectorPolicy : public GenCollectorPolicy { - protected: - size_t _min_gen1_size; - size_t _initial_gen1_size; - size_t _max_gen1_size; - - void initialize_flags(); - void initialize_size_info(); - - DEBUG_ONLY(void assert_flags();) - DEBUG_ONLY(void assert_size_info();) - - public: - TwoGenerationCollectorPolicy() : GenCollectorPolicy(), _min_gen1_size(0), - _initial_gen1_size(0), _max_gen1_size(0) {} - - // Accessors - size_t min_gen1_size() { return _min_gen1_size; } - size_t initial_gen1_size() { return _initial_gen1_size; } - size_t max_gen1_size() { return _max_gen1_size; } - - // Inherited methods - TwoGenerationCollectorPolicy* as_two_generation_policy() { return this; } - - int number_of_generations() { return 2; } BarrierSet::Name barrier_set_name() { return BarrierSet::CardTableModRef; } virtual CollectorPolicy::Name kind() { - return CollectorPolicy::TwoGenerationCollectorPolicyKind; + return CollectorPolicy::GenCollectorPolicyKind; } }; -class MarkSweepPolicy : public TwoGenerationCollectorPolicy { +class MarkSweepPolicy : public GenCollectorPolicy { protected: void initialize_alignments(); void initialize_generations(); diff --git a/hotspot/src/share/vm/memory/gcLocker.cpp b/hotspot/src/share/vm/memory/gcLocker.cpp index 3b208dfff8e..fc267ad84f1 100644 --- a/hotspot/src/share/vm/memory/gcLocker.cpp +++ b/hotspot/src/share/vm/memory/gcLocker.cpp @@ -26,6 +26,7 @@ #include "memory/gcLocker.inline.hpp" #include "memory/resourceArea.hpp" #include "memory/sharedHeap.hpp" +#include "runtime/thread.inline.hpp" volatile jint GC_locker::_jni_lock_count = 0; volatile bool GC_locker::_needs_gc = false; diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.cpp b/hotspot/src/share/vm/memory/genCollectedHeap.cpp index 168ea371406..f3b2a8ec885 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.cpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.cpp @@ -197,9 +197,8 @@ char* GenCollectedHeap::allocate(size_t alignment, void GenCollectedHeap::post_initialize() { SharedHeap::post_initialize(); - TwoGenerationCollectorPolicy *policy = - (TwoGenerationCollectorPolicy *)collector_policy(); - guarantee(policy->is_two_generation_policy(), "Illegal policy type"); + GenCollectorPolicy *policy = (GenCollectorPolicy *)collector_policy(); + guarantee(policy->is_generation_policy(), "Illegal policy type"); DefNewGeneration* def_new_gen = (DefNewGeneration*) get_gen(0); assert(def_new_gen->kind() == Generation::DefNew || def_new_gen->kind() == Generation::ParNew || diff --git a/hotspot/src/share/vm/memory/genCollectedHeap.hpp b/hotspot/src/share/vm/memory/genCollectedHeap.hpp index 4a62aa4b411..dcd389cc90d 100644 --- a/hotspot/src/share/vm/memory/genCollectedHeap.hpp +++ b/hotspot/src/share/vm/memory/genCollectedHeap.hpp @@ -453,7 +453,7 @@ public: // Assumes a 2-generation system; the first disjunct remembers if an // incremental collection failed, even when we thought (second disjunct) // that it would not. - assert(heap()->collector_policy()->is_two_generation_policy(), + assert(heap()->collector_policy()->is_generation_policy(), "the following definition may not be suitable for an n(>2)-generation system"); return incremental_collection_failed() || (consult_young && !get_gen(0)->collection_attempt_is_safe()); diff --git a/hotspot/src/share/vm/memory/metaspace.cpp b/hotspot/src/share/vm/memory/metaspace.cpp index 10b95973192..0ace09a0735 100644 --- a/hotspot/src/share/vm/memory/metaspace.cpp +++ b/hotspot/src/share/vm/memory/metaspace.cpp @@ -42,7 +42,7 @@ #include "runtime/init.hpp" #include "runtime/java.hpp" #include "runtime/mutex.hpp" -#include "runtime/orderAccess.hpp" +#include "runtime/orderAccess.inline.hpp" #include "services/memTracker.hpp" #include "services/memoryService.hpp" #include "utilities/copy.hpp" diff --git a/hotspot/src/share/vm/memory/space.cpp b/hotspot/src/share/vm/memory/space.cpp index b7b9c00adc1..8bff19441d9 100644 --- a/hotspot/src/share/vm/memory/space.cpp +++ b/hotspot/src/share/vm/memory/space.cpp @@ -37,6 +37,7 @@ #include "oops/oop.inline.hpp" #include "oops/oop.inline2.hpp" #include "runtime/java.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/safepoint.hpp" #include "utilities/copy.hpp" #include "utilities/globalDefinitions.hpp" diff --git a/hotspot/src/share/vm/oops/constantPool.cpp b/hotspot/src/share/vm/oops/constantPool.cpp index da69ec2c8b8..bd2ee585149 100644 --- a/hotspot/src/share/vm/oops/constantPool.cpp +++ b/hotspot/src/share/vm/oops/constantPool.cpp @@ -223,14 +223,14 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS) // The original attempt to resolve this constant pool entry failed so find the - // original error and throw it again (JVMS 5.4.3). + // class of the original error and throw another error of the same class (JVMS 5.4.3). + // If there is a detail message, pass that detail message to the error constructor. + // The JVMS does not strictly require us to duplicate the same detail message, + // or any internal exception fields such as cause or stacktrace. But since the + // detail message is often a class name or other literal string, we will repeat it if + // we can find it in the symbol table. if (in_error) { - Symbol* error = SystemDictionary::find_resolution_error(this_cp, which); - guarantee(error != (Symbol*)NULL, "tag mismatch with resolution error table"); - ResourceMark rm; - // exception text will be the class name - const char* className = this_cp->unresolved_klass_at(which)->as_C_string(); - THROW_MSG_0(error, className); + throw_resolution_error(this_cp, which, CHECK_0); } if (do_resolve) { @@ -250,11 +250,6 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS) // Failed to resolve class. We must record the errors so that subsequent attempts // to resolve this constant pool entry fail with the same error (JVMS 5.4.3). if (HAS_PENDING_EXCEPTION) { - ResourceMark rm; - Symbol* error = PENDING_EXCEPTION->klass()->name(); - - bool throw_orig_error = false; - { MonitorLockerEx ml(this_cp->lock()); // some other thread has beaten us and has resolved the class. @@ -264,32 +259,9 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_cp, int which, TRAPS) return entry.get_klass(); } - if (!PENDING_EXCEPTION-> - is_a(SystemDictionary::LinkageError_klass())) { - // Just throw the exception and don't prevent these classes from - // being loaded due to virtual machine errors like StackOverflow - // and OutOfMemoryError, etc, or if the thread was hit by stop() - // Needs clarification to section 5.4.3 of the VM spec (see 6308271) - } - else if (!this_cp->tag_at(which).is_unresolved_klass_in_error()) { - SystemDictionary::add_resolution_error(this_cp, which, error); - this_cp->tag_at_put(which, JVM_CONSTANT_UnresolvedClassInError); - } else { - // some other thread has put the class in error state. - error = SystemDictionary::find_resolution_error(this_cp, which); - assert(error != NULL, "checking"); - throw_orig_error = true; - } - } // unlocked - - if (throw_orig_error) { - CLEAR_PENDING_EXCEPTION; - ResourceMark rm; - const char* className = this_cp->unresolved_klass_at(which)->as_C_string(); - THROW_MSG_0(error, className); - } - - return 0; + // The tag could have changed to in-error before the lock but we have to + // handle that here for the class case. + save_and_throw_exception(this_cp, which, constantTag(JVM_CONSTANT_UnresolvedClass), CHECK_0); } if (TraceClassResolution && !k()->oop_is_array()) { @@ -587,16 +559,55 @@ bool ConstantPool::resolve_class_constants(TRAPS) { return true; } -// If resolution for MethodHandle or MethodType fails, save the exception +Symbol* ConstantPool::exception_message(constantPoolHandle this_cp, int which, constantTag tag, oop pending_exception) { + // Dig out the detailed message to reuse if possible + Symbol* message = NULL; + oop detailed_message = java_lang_Throwable::message(pending_exception); + if (detailed_message != NULL) { + message = java_lang_String::as_symbol_or_null(detailed_message); + if (message != NULL) { + return message; + } + } + + // Return specific message for the tag + switch (tag.value()) { + case JVM_CONSTANT_UnresolvedClass: + // return the class name in the error message + message = this_cp->unresolved_klass_at(which); + break; + case JVM_CONSTANT_MethodHandle: + // return the method handle name in the error message + message = this_cp->method_handle_name_ref_at(which); + break; + case JVM_CONSTANT_MethodType: + // return the method type signature in the error message + message = this_cp->method_type_signature_at(which); + break; + default: + ShouldNotReachHere(); + } + + return message; +} + +void ConstantPool::throw_resolution_error(constantPoolHandle this_cp, int which, TRAPS) { + Symbol* message = NULL; + Symbol* error = SystemDictionary::find_resolution_error(this_cp, which, &message); + assert(error != NULL && message != NULL, "checking"); + CLEAR_PENDING_EXCEPTION; + ResourceMark rm; + THROW_MSG(error, message->as_C_string()); +} + +// If resolution for Class, MethodHandle or MethodType fails, save the exception // in the resolution error table, so that the same exception is thrown again. void ConstantPool::save_and_throw_exception(constantPoolHandle this_cp, int which, - int tag, TRAPS) { - ResourceMark rm; + constantTag tag, TRAPS) { + assert(this_cp->lock()->is_locked(), "constant pool lock should be held"); Symbol* error = PENDING_EXCEPTION->klass()->name(); - MonitorLockerEx ml(this_cp->lock()); // lock cpool to change tag. - int error_tag = (tag == JVM_CONSTANT_MethodHandle) ? - JVM_CONSTANT_MethodHandleInError : JVM_CONSTANT_MethodTypeInError; + int error_tag = tag.error_value(); if (!PENDING_EXCEPTION-> is_a(SystemDictionary::LinkageError_klass())) { @@ -604,20 +615,21 @@ void ConstantPool::save_and_throw_exception(constantPoolHandle this_cp, int whic // being loaded due to virtual machine errors like StackOverflow // and OutOfMemoryError, etc, or if the thread was hit by stop() // Needs clarification to section 5.4.3 of the VM spec (see 6308271) - } else if (this_cp->tag_at(which).value() != error_tag) { - SystemDictionary::add_resolution_error(this_cp, which, error); + Symbol* message = exception_message(this_cp, which, tag, PENDING_EXCEPTION); + SystemDictionary::add_resolution_error(this_cp, which, error, message); this_cp->tag_at_put(which, error_tag); } else { - // some other thread has put the class in error state. - error = SystemDictionary::find_resolution_error(this_cp, which); - assert(error != NULL, "checking"); - CLEAR_PENDING_EXCEPTION; - THROW_MSG(error, ""); + // some other thread put this in error state + throw_resolution_error(this_cp, which, CHECK); } + + // This exits with some pending exception + assert(HAS_PENDING_EXCEPTION, "should not be cleared"); } + // Called to resolve constants in the constant pool and return an oop. // Some constant pool entries cache their resolved oop. This is also // called to create oops from constants to use in arguments for invokedynamic @@ -645,9 +657,9 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index jvalue prim_value; // temp used only in a few cases below - int tag_value = this_cp->tag_at(index).value(); + constantTag tag = this_cp->tag_at(index); - switch (tag_value) { + switch (tag.value()) { case JVM_CONSTANT_UnresolvedClass: case JVM_CONSTANT_UnresolvedClassInError: @@ -672,10 +684,7 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index case JVM_CONSTANT_MethodHandleInError: case JVM_CONSTANT_MethodTypeInError: { - Symbol* error = SystemDictionary::find_resolution_error(this_cp, index); - guarantee(error != (Symbol*)NULL, "tag mismatch with resolution error table"); - ResourceMark rm; - THROW_MSG_0(error, ""); + throw_resolution_error(this_cp, index, CHECK_NULL); break; } @@ -699,7 +708,8 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index THREAD); result_oop = value(); if (HAS_PENDING_EXCEPTION) { - save_and_throw_exception(this_cp, index, tag_value, CHECK_NULL); + MonitorLockerEx ml(this_cp->lock()); // lock cpool to change tag. + save_and_throw_exception(this_cp, index, tag, CHECK_NULL); } break; } @@ -715,7 +725,8 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index Handle value = SystemDictionary::find_method_handle_type(signature, klass, THREAD); result_oop = value(); if (HAS_PENDING_EXCEPTION) { - save_and_throw_exception(this_cp, index, tag_value, CHECK_NULL); + MonitorLockerEx ml(this_cp->lock()); // lock cpool to change tag. + save_and_throw_exception(this_cp, index, tag, CHECK_NULL); } break; } @@ -746,7 +757,7 @@ oop ConstantPool::resolve_constant_at_impl(constantPoolHandle this_cp, int index default: DEBUG_ONLY( tty->print_cr("*** %p: tag at CP[%d/%d] = %d", - this_cp(), index, cache_index, tag_value) ); + this_cp(), index, cache_index, tag.value())); assert(false, "unexpected constant tag"); break; } @@ -1827,9 +1838,7 @@ void ConstantPool::set_on_stack(const bool value) { // We can't do this during classfile parsing, which is how the other indexes are // patched. The other patches are applied early for some error checking // so only defer the pseudo_strings. -void ConstantPool::patch_resolved_references( - GrowableArray* cp_patches) { - assert(EnableInvokeDynamic, ""); +void ConstantPool::patch_resolved_references(GrowableArray* cp_patches) { for (int index = 1; index < cp_patches->length(); index++) { // Index 0 is unused Handle patch = cp_patches->at(index); if (patch.not_null()) { diff --git a/hotspot/src/share/vm/oops/constantPool.hpp b/hotspot/src/share/vm/oops/constantPool.hpp index 169d97f4266..99c766ab7c5 100644 --- a/hotspot/src/share/vm/oops/constantPool.hpp +++ b/hotspot/src/share/vm/oops/constantPool.hpp @@ -413,9 +413,9 @@ class ConstantPool : public Metadata { // Version that can be used before string oop array is created. oop uncached_string_at(int which, TRAPS); - // A "pseudo-string" is an non-string oop that has found is way into + // A "pseudo-string" is an non-string oop that has found its way into // a String entry. - // Under EnableInvokeDynamic this can happen if the user patches a live + // This can happen if the user patches a live // object into a CONSTANT_String entry of an anonymous class. // Method oops internally created for method handles may also // use pseudo-strings to link themselves to related metaobjects. @@ -441,7 +441,6 @@ class ConstantPool : public Metadata { } void pseudo_string_at_put(int which, int obj_index, oop x) { - assert(EnableInvokeDynamic, ""); assert(tag_at(which).is_string(), "Corrupted constant pool"); unresolved_string_at_put(which, NULL); // indicates patched string string_at_put(which, obj_index, x); // this works just fine @@ -823,9 +822,13 @@ class ConstantPool : public Metadata { static void resolve_string_constants_impl(constantPoolHandle this_cp, TRAPS); static oop resolve_constant_at_impl(constantPoolHandle this_cp, int index, int cache_index, TRAPS); - static void save_and_throw_exception(constantPoolHandle this_cp, int which, int tag_value, TRAPS); static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_cp, int index, TRAPS); + // Exception handling + static void throw_resolution_error(constantPoolHandle this_cp, int which, TRAPS); + static Symbol* exception_message(constantPoolHandle this_cp, int which, constantTag tag, oop pending_exception); + static void save_and_throw_exception(constantPoolHandle this_cp, int which, constantTag tag, TRAPS); + public: // Merging ConstantPool* support: bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS); diff --git a/hotspot/src/share/vm/oops/cpCache.cpp b/hotspot/src/share/vm/oops/cpCache.cpp index 5e75ad8917e..cdd3cef4ad1 100644 --- a/hotspot/src/share/vm/oops/cpCache.cpp +++ b/hotspot/src/share/vm/oops/cpCache.cpp @@ -33,6 +33,7 @@ #include "prims/jvmtiRedefineClassesTrace.hpp" #include "prims/methodHandles.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/macros.hpp" #if INCLUDE_ALL_GCS # include "gc_implementation/parallelScavenge/psPromotionManager.hpp" diff --git a/hotspot/src/share/vm/oops/cpCache.hpp b/hotspot/src/share/vm/oops/cpCache.hpp index 1bc7a417938..ee3a664b352 100644 --- a/hotspot/src/share/vm/oops/cpCache.hpp +++ b/hotspot/src/share/vm/oops/cpCache.hpp @@ -27,6 +27,7 @@ #include "interpreter/bytecodes.hpp" #include "memory/allocation.hpp" +#include "runtime/orderAccess.hpp" #include "utilities/array.hpp" class PSPromotionManager; diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index a5d16b6b70c..84775407262 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -55,6 +55,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/thread.inline.hpp" #include "services/classLoadingService.hpp" #include "services/threadService.hpp" @@ -2398,7 +2399,6 @@ const char* InstanceKlass::signature_name() const { // If this is an anonymous class, append a hash to make the name unique if (is_anonymous()) { - assert(EnableInvokeDynamic, "EnableInvokeDynamic was not set."); intptr_t hash = (java_mirror() != NULL) ? java_mirror()->identity_hash() : 0; sprintf(hash_buf, "/" UINTX_FORMAT, (uintx)hash); hash_len = (int)strlen(hash_buf); diff --git a/hotspot/src/share/vm/oops/klass.cpp b/hotspot/src/share/vm/oops/klass.cpp index dc542c34cc0..12e5b5ec708 100644 --- a/hotspot/src/share/vm/oops/klass.cpp +++ b/hotspot/src/share/vm/oops/klass.cpp @@ -36,7 +36,8 @@ #include "oops/instanceKlass.hpp" #include "oops/klass.inline.hpp" #include "oops/oop.inline2.hpp" -#include "runtime/atomic.hpp" +#include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "trace/traceMacros.hpp" #include "utilities/stack.hpp" #include "utilities/macros.hpp" @@ -544,7 +545,6 @@ const char* Klass::external_name() const { if (oop_is_instance()) { InstanceKlass* ik = (InstanceKlass*) this; if (ik->is_anonymous()) { - assert(EnableInvokeDynamic, ""); intptr_t hash = 0; if (ik->java_mirror() != NULL) { // java_mirror might not be created yet, return 0 as hash. diff --git a/hotspot/src/share/vm/oops/klass.hpp b/hotspot/src/share/vm/oops/klass.hpp index 4b42209773b..6aac575cf11 100644 --- a/hotspot/src/share/vm/oops/klass.hpp +++ b/hotspot/src/share/vm/oops/klass.hpp @@ -32,7 +32,6 @@ #include "oops/klassPS.hpp" #include "oops/metadata.hpp" #include "oops/oop.hpp" -#include "runtime/orderAccess.hpp" #include "trace/traceMacros.hpp" #include "utilities/accessFlags.hpp" #include "utilities/macros.hpp" diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp index 8774b9518c4..883ff487b26 100644 --- a/hotspot/src/share/vm/oops/method.cpp +++ b/hotspot/src/share/vm/oops/method.cpp @@ -49,6 +49,7 @@ #include "runtime/compilationPolicy.hpp" #include "runtime/frame.inline.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/relocator.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/signature.hpp" diff --git a/hotspot/src/share/vm/oops/method.hpp b/hotspot/src/share/vm/oops/method.hpp index 9354e5201ce..7d5afaec0b8 100644 --- a/hotspot/src/share/vm/oops/method.hpp +++ b/hotspot/src/share/vm/oops/method.hpp @@ -661,7 +661,7 @@ class Method : public Metadata { // this operates only on invoke methods: // presize interpreter frames for extra interpreter stack entries, if needed // Account for the extra appendix argument for invokehandle/invokedynamic - static int extra_stack_entries() { return EnableInvokeDynamic ? extra_stack_entries_for_jsr292 : 0; } + static int extra_stack_entries() { return extra_stack_entries_for_jsr292; } static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize // RedefineClasses() support: diff --git a/hotspot/src/share/vm/oops/methodData.cpp b/hotspot/src/share/vm/oops/methodData.cpp index bbde4c8f6eb..06d9dcb51bf 100644 --- a/hotspot/src/share/vm/oops/methodData.cpp +++ b/hotspot/src/share/vm/oops/methodData.cpp @@ -34,6 +34,7 @@ #include "runtime/compilationPolicy.hpp" #include "runtime/deoptimization.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/orderAccess.inline.hpp" // ================================================================== // DataLayout diff --git a/hotspot/src/share/vm/oops/objArrayKlass.cpp b/hotspot/src/share/vm/oops/objArrayKlass.cpp index 514fdfbde9e..40b6d1b7ca8 100644 --- a/hotspot/src/share/vm/oops/objArrayKlass.cpp +++ b/hotspot/src/share/vm/oops/objArrayKlass.cpp @@ -42,6 +42,7 @@ #include "oops/symbol.hpp" #include "runtime/handles.inline.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/copy.hpp" #include "utilities/macros.hpp" #if INCLUDE_ALL_GCS diff --git a/hotspot/src/share/vm/oops/oop.inline.hpp b/hotspot/src/share/vm/oops/oop.inline.hpp index adc40333f1b..7dd78ef8eb2 100644 --- a/hotspot/src/share/vm/oops/oop.inline.hpp +++ b/hotspot/src/share/vm/oops/oop.inline.hpp @@ -38,7 +38,8 @@ #include "oops/klass.inline.hpp" #include "oops/markOop.inline.hpp" #include "oops/oop.hpp" -#include "runtime/atomic.hpp" +#include "runtime/atomic.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" #include "utilities/macros.hpp" #ifdef TARGET_ARCH_x86 diff --git a/hotspot/src/share/vm/oops/typeArrayKlass.cpp b/hotspot/src/share/vm/oops/typeArrayKlass.cpp index 8d9c6728cf8..7cc94753a6b 100644 --- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp +++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp @@ -39,6 +39,7 @@ #include "oops/typeArrayKlass.hpp" #include "oops/typeArrayOop.hpp" #include "runtime/handles.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/macros.hpp" bool TypeArrayKlass::compute_is_subtype_of(Klass* k) { diff --git a/hotspot/src/share/vm/oops/typeArrayOop.hpp b/hotspot/src/share/vm/oops/typeArrayOop.hpp index 29ad6cd5c84..20f30dc996d 100644 --- a/hotspot/src/share/vm/oops/typeArrayOop.hpp +++ b/hotspot/src/share/vm/oops/typeArrayOop.hpp @@ -27,39 +27,7 @@ #include "oops/arrayOop.hpp" #include "oops/typeArrayKlass.hpp" -#ifdef TARGET_OS_ARCH_linux_x86 -# include "orderAccess_linux_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "orderAccess_linux_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "orderAccess_linux_zero.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "orderAccess_solaris_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "orderAccess_solaris_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_windows_x86 -# include "orderAccess_windows_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "orderAccess_linux_arm.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "orderAccess_linux_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_aix_ppc -# include "orderAccess_aix_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "orderAccess_bsd_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "orderAccess_bsd_zero.inline.hpp" -#endif +#include "runtime/orderAccess.inline.hpp" // A typeArrayOop is an array containing basic types (non oop elements). // It is used for arrays of {characters, singles, doubles, bytes, shorts, integers, longs} diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 36e39bc9e11..7226a725a7c 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -704,6 +704,7 @@ Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr #endif set_print_inlining(PrintInlining || method()->has_option("PrintInlining") NOT_PRODUCT( || PrintOptoInlining)); set_print_intrinsics(PrintIntrinsics || method()->has_option("PrintIntrinsics")); + set_has_irreducible_loop(true); // conservative until build_loop_tree() reset it if (ProfileTraps RTM_OPT_ONLY( || UseRTMLocking )) { // Make sure the method being compiled gets its own MDO, @@ -988,6 +989,8 @@ Compile::Compile( ciEnv* ci_env, set_print_assembly(PrintFrameConverterAssembly); set_parsed_irreducible_loop(false); #endif + set_has_irreducible_loop(false); // no loops + CompileWrapper cw(this); Init(/*AliasLevel=*/ 0); init_tf((*generator)()); @@ -1158,7 +1161,7 @@ StartNode* Compile::start() const { if( start->is_Start() ) return start->as_Start(); } - ShouldNotReachHere(); + fatal("Did not find Start node!"); return NULL; } diff --git a/hotspot/src/share/vm/opto/compile.hpp b/hotspot/src/share/vm/opto/compile.hpp index 76ff09226ea..3d561556881 100644 --- a/hotspot/src/share/vm/opto/compile.hpp +++ b/hotspot/src/share/vm/opto/compile.hpp @@ -319,6 +319,7 @@ class Compile : public Phase { bool _trace_opto_output; bool _parsed_irreducible_loop; // True if ciTypeFlow detected irreducible loops during parsing #endif + bool _has_irreducible_loop; // Found irreducible loops // JSR 292 bool _has_method_handle_invokes; // True if this method has MethodHandle invokes. RTMState _rtm_state; // State of Restricted Transactional Memory usage @@ -604,6 +605,8 @@ class Compile : public Phase { void set_parsed_irreducible_loop(bool z) { _parsed_irreducible_loop = z; } int _in_dump_cnt; // Required for dumping ir nodes. #endif + bool has_irreducible_loop() const { return _has_irreducible_loop; } + void set_has_irreducible_loop(bool z) { _has_irreducible_loop = z; } // JSR 292 bool has_method_handle_invokes() const { return _has_method_handle_invokes; } diff --git a/hotspot/src/share/vm/opto/graphKit.cpp b/hotspot/src/share/vm/opto/graphKit.cpp index 3a171e9e7a2..123e28fa95b 100644 --- a/hotspot/src/share/vm/opto/graphKit.cpp +++ b/hotspot/src/share/vm/opto/graphKit.cpp @@ -1509,6 +1509,8 @@ Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, Node* ld; if (require_atomic_access && bt == T_LONG) { ld = LoadLNode::make_atomic(C, ctl, mem, adr, adr_type, t, mo); + } else if (require_atomic_access && bt == T_DOUBLE) { + ld = LoadDNode::make_atomic(C, ctl, mem, adr, adr_type, t, mo); } else { ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo); } @@ -1531,6 +1533,8 @@ Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt, Node* st; if (require_atomic_access && bt == T_LONG) { st = StoreLNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); + } else if (require_atomic_access && bt == T_DOUBLE) { + st = StoreDNode::make_atomic(C, ctl, mem, adr, adr_type, val, mo); } else { st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo); } diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index ddc5355cf37..bf2d365a9d3 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -222,7 +222,7 @@ class LibraryCallKit : public GraphKit { bool inline_math_subtractExactL(bool is_decrement); bool inline_exp(); bool inline_pow(); - void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); + Node* finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_min_max(vmIntrinsics::ID id); Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y); // This returns Type::AnyPtr, RawPtr, or OopPtr. @@ -1686,7 +1686,7 @@ bool LibraryCallKit::inline_trig(vmIntrinsics::ID id) { return true; } -void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { +Node* LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName) { //------------------- //result=(result.isNaN())? funcAddr():result; // Check: If isNaN() by checking result!=result? then either trap @@ -1702,7 +1702,7 @@ void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFu uncommon_trap(Deoptimization::Reason_intrinsic, Deoptimization::Action_make_not_entrant); } - set_result(result); + return result; } else { // If this inlining ever returned NaN in the past, we compile a call // to the runtime to properly handle corner cases @@ -1732,9 +1732,10 @@ void LibraryCallKit::finish_pow_exp(Node* result, Node* x, Node* y, const TypeFu result_region->init_req(2, control()); result_val->init_req(2, value); - set_result(result_region, result_val); + set_control(_gvn.transform(result_region)); + return _gvn.transform(result_val); } else { - set_result(result); + return result; } } } @@ -1746,7 +1747,8 @@ bool LibraryCallKit::inline_exp() { Node* arg = round_double_node(argument(0)); Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg)); - finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); + n = finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP"); + set_result(n); C->set_has_split_ifs(true); // Has chance for split-if optimization return true; @@ -1756,27 +1758,48 @@ bool LibraryCallKit::inline_exp() { // Inline power instructions, if possible. bool LibraryCallKit::inline_pow() { // Pseudocode for pow - // if (x <= 0.0) { - // long longy = (long)y; - // if ((double)longy == y) { // if y is long - // if (y + 1 == y) longy = 0; // huge number: even - // result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y); - // } else { - // result = NaN; - // } + // if (y == 2) { + // return x * x; // } else { - // result = DPow(x,y); + // if (x <= 0.0) { + // long longy = (long)y; + // if ((double)longy == y) { // if y is long + // if (y + 1 == y) longy = 0; // huge number: even + // result = ((1&longy) == 0)?-DPow(abs(x), y):DPow(abs(x), y); + // } else { + // result = NaN; + // } + // } else { + // result = DPow(x,y); + // } + // if (result != result)? { + // result = uncommon_trap() or runtime_call(); + // } + // return result; // } - // if (result != result)? { - // result = uncommon_trap() or runtime_call(); - // } - // return result; Node* x = round_double_node(argument(0)); Node* y = round_double_node(argument(2)); Node* result = NULL; + Node* const_two_node = makecon(TypeD::make(2.0)); + Node* cmp_node = _gvn.transform(new (C) CmpDNode(y, const_two_node)); + Node* bool_node = _gvn.transform(new (C) BoolNode(cmp_node, BoolTest::eq)); + IfNode* if_node = create_and_xform_if(control(), bool_node, PROB_STATIC_INFREQUENT, COUNT_UNKNOWN); + Node* if_true = _gvn.transform(new (C) IfTrueNode(if_node)); + Node* if_false = _gvn.transform(new (C) IfFalseNode(if_node)); + + RegionNode* region_node = new (C) RegionNode(3); + region_node->init_req(1, if_true); + + Node* phi_node = new (C) PhiNode(region_node, Type::DOUBLE); + // special case for x^y where y == 2, we can convert it to x * x + phi_node->init_req(1, _gvn.transform(new (C) MulDNode(x, x))); + + // set control to if_false since we will now process the false branch + set_control(if_false); + if (!too_many_traps(Deoptimization::Reason_intrinsic)) { // Short form: skip the fancy tests and just check for NaN result. result = _gvn.transform(new (C) PowDNode(C, control(), x, y)); @@ -1900,7 +1923,15 @@ bool LibraryCallKit::inline_pow() { result = _gvn.transform(phi); } - finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); + result = finish_pow_exp(result, x, y, OptoRuntime::Math_DD_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dpow), "POW"); + + // control from finish_pow_exp is now input to the region node + region_node->set_req(2, control()); + // the result from finish_pow_exp is now input to the phi node + phi_node->init_req(2, result); + set_control(_gvn.transform(region_node)); + record_for_igvn(region_node); + set_result(_gvn.transform(phi_node)); C->set_has_split_ifs(true); // Has chance for split-if optimization return true; diff --git a/hotspot/src/share/vm/opto/loopnode.cpp b/hotspot/src/share/vm/opto/loopnode.cpp index a9406741718..5436fd5f640 100644 --- a/hotspot/src/share/vm/opto/loopnode.cpp +++ b/hotspot/src/share/vm/opto/loopnode.cpp @@ -267,9 +267,9 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) { // Counted loop head must be a good RegionNode with only 3 not NULL // control input edges: Self, Entry, LoopBack. - if (x->in(LoopNode::Self) == NULL || x->req() != 3) + if (x->in(LoopNode::Self) == NULL || x->req() != 3 || loop->_irreducible) { return false; - + } Node *init_control = x->in(LoopNode::EntryControl); Node *back_control = x->in(LoopNode::LoopBackControl); if (init_control == NULL || back_control == NULL) // Partially dead @@ -1523,11 +1523,11 @@ bool IdealLoopTree::beautify_loops( PhaseIdealLoop *phase ) { // If I have one hot backedge, peel off myself loop. // I better be the outermost loop. - if( _head->req() > 3 ) { + if (_head->req() > 3 && !_irreducible) { split_outer_loop( phase ); result = true; - } else if( !_head->is_Loop() && !_irreducible ) { + } else if (!_head->is_Loop() && !_irreducible) { // Make a new LoopNode to replace the old loop head Node *l = new (phase->C) LoopNode( _head->in(1), _head->in(2) ); l = igvn.register_new_node_with_optimizer(l, _head); @@ -2939,6 +2939,7 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) { return pre_order; } } + C->set_has_irreducible_loop(_has_irreducible_loops); } // This Node might be a decision point for loops. It is only if diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 6ffd0186d01..24b7c909923 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -308,33 +308,16 @@ Node *MemNode::Ideal_common(PhaseGVN *phase, bool can_reshape) { int alias_idx = phase->C->get_alias_index(t_adr->is_ptr()); } -#ifdef ASSERT Node* base = NULL; - if (address->is_AddP()) + if (address->is_AddP()) { base = address->in(AddPNode::Base); + } if (base != NULL && phase->type(base)->higher_equal(TypePtr::NULL_PTR) && !t_adr->isa_rawptr()) { // Note: raw address has TOP base and top->higher_equal(TypePtr::NULL_PTR) is true. - Compile* C = phase->C; - tty->cr(); - tty->print_cr("===== NULL+offs not RAW address ====="); - if (C->is_dead_node(this->_idx)) tty->print_cr("'this' is dead"); - if ((ctl != NULL) && C->is_dead_node(ctl->_idx)) tty->print_cr("'ctl' is dead"); - if (C->is_dead_node(mem->_idx)) tty->print_cr("'mem' is dead"); - if (C->is_dead_node(address->_idx)) tty->print_cr("'address' is dead"); - if (C->is_dead_node(base->_idx)) tty->print_cr("'base' is dead"); - tty->cr(); - base->dump(1); - tty->cr(); - this->dump(2); - tty->print("this->adr_type(): "); adr_type()->dump(); tty->cr(); - tty->print("phase->type(address): "); t_adr->dump(); tty->cr(); - tty->print("phase->type(base): "); phase->type(address)->dump(); tty->cr(); - tty->cr(); + // Skip this node optimization if its address has TOP base. + return NodeSentinel; // caller will return NULL } - assert(base == NULL || t_adr->isa_rawptr() || - !phase->type(base)->higher_equal(TypePtr::NULL_PTR), "NULL+offs not RAW address?"); -#endif // Avoid independent memory operations Node* old_mem = mem; @@ -955,6 +938,10 @@ LoadLNode* LoadLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, c return new (C) LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic); } +LoadDNode* LoadDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) { + bool require_atomic = true; + return new (C) LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic); +} @@ -2397,6 +2384,11 @@ StoreLNode* StoreLNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, return new (C) StoreLNode(ctl, mem, adr, adr_type, val, mo, require_atomic); } +StoreDNode* StoreDNode::make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo) { + bool require_atomic = true; + return new (C) StoreDNode(ctl, mem, adr, adr_type, val, mo, require_atomic); +} + //--------------------------bottom_type---------------------------------------- const Type *StoreNode::bottom_type() const { diff --git a/hotspot/src/share/vm/opto/memnode.hpp b/hotspot/src/share/vm/opto/memnode.hpp index 6808875fdc1..000ccdcbbbc 100644 --- a/hotspot/src/share/vm/opto/memnode.hpp +++ b/hotspot/src/share/vm/opto/memnode.hpp @@ -332,7 +332,7 @@ public: virtual uint ideal_reg() const { return Op_RegL; } virtual int store_Opcode() const { return Op_StoreL; } virtual BasicType memory_type() const { return T_LONG; } - bool require_atomic_access() { return _require_atomic_access; } + bool require_atomic_access() const { return _require_atomic_access; } static LoadLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo); #ifndef PRODUCT @@ -367,13 +367,31 @@ public: //------------------------------LoadDNode-------------------------------------- // Load a double (64 bits) from memory class LoadDNode : public LoadNode { + virtual uint hash() const { return LoadNode::hash() + _require_atomic_access; } + virtual uint cmp( const Node &n ) const { + return _require_atomic_access == ((LoadDNode&)n)._require_atomic_access + && LoadNode::cmp(n); + } + virtual uint size_of() const { return sizeof(*this); } + const bool _require_atomic_access; // is piecewise load forbidden? + public: - LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo) - : LoadNode(c, mem, adr, at, t, mo) {} + LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, + MemOrd mo, bool require_atomic_access = false) + : LoadNode(c, mem, adr, at, t, mo), _require_atomic_access(require_atomic_access) {} virtual int Opcode() const; virtual uint ideal_reg() const { return Op_RegD; } virtual int store_Opcode() const { return Op_StoreD; } virtual BasicType memory_type() const { return T_DOUBLE; } + bool require_atomic_access() const { return _require_atomic_access; } + static LoadDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, + const Type* rt, MemOrd mo); +#ifndef PRODUCT + virtual void dump_spec(outputStream *st) const { + LoadNode::dump_spec(st); + if (_require_atomic_access) st->print(" Atomic!"); + } +#endif }; //------------------------------LoadD_unalignedNode---------------------------- @@ -574,7 +592,7 @@ public: : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} virtual int Opcode() const; virtual BasicType memory_type() const { return T_LONG; } - bool require_atomic_access() { return _require_atomic_access; } + bool require_atomic_access() const { return _require_atomic_access; } static StoreLNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); #ifndef PRODUCT virtual void dump_spec(outputStream *st) const { @@ -597,11 +615,28 @@ public: //------------------------------StoreDNode------------------------------------- // Store double to memory class StoreDNode : public StoreNode { + virtual uint hash() const { return StoreNode::hash() + _require_atomic_access; } + virtual uint cmp( const Node &n ) const { + return _require_atomic_access == ((StoreDNode&)n)._require_atomic_access + && StoreNode::cmp(n); + } + virtual uint size_of() const { return sizeof(*this); } + const bool _require_atomic_access; // is piecewise store forbidden? public: - StoreDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, MemOrd mo) - : StoreNode(c, mem, adr, at, val, mo) {} + StoreDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, Node *val, + MemOrd mo, bool require_atomic_access = false) + : StoreNode(c, mem, adr, at, val, mo), _require_atomic_access(require_atomic_access) {} virtual int Opcode() const; virtual BasicType memory_type() const { return T_DOUBLE; } + bool require_atomic_access() const { return _require_atomic_access; } + static StoreDNode* make_atomic(Compile *C, Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, Node* val, MemOrd mo); +#ifndef PRODUCT + virtual void dump_spec(outputStream *st) const { + StoreNode::dump_spec(st); + if (_require_atomic_access) st->print(" Atomic!"); + } +#endif + }; //------------------------------StorePNode------------------------------------- diff --git a/hotspot/src/share/vm/opto/node.cpp b/hotspot/src/share/vm/opto/node.cpp index e201fde52a6..2064b07f451 100644 --- a/hotspot/src/share/vm/opto/node.cpp +++ b/hotspot/src/share/vm/opto/node.cpp @@ -27,6 +27,7 @@ #include "memory/allocation.inline.hpp" #include "opto/cfgnode.hpp" #include "opto/connode.hpp" +#include "opto/loopnode.hpp" #include "opto/machnode.hpp" #include "opto/matcher.hpp" #include "opto/node.hpp" @@ -1263,6 +1264,7 @@ static void kill_dead_code( Node *dead, PhaseIterGVN *igvn ) { Node *top = igvn->C->top(); nstack.push(dead); + bool has_irreducible_loop = igvn->C->has_irreducible_loop(); while (nstack.size() > 0) { dead = nstack.pop(); @@ -1277,13 +1279,31 @@ static void kill_dead_code( Node *dead, PhaseIterGVN *igvn ) { assert (!use->is_Con(), "Control for Con node should be Root node."); use->set_req(0, top); // Cut dead edge to prevent processing nstack.push(use); // the dead node again. + } else if (!has_irreducible_loop && // Backedge could be alive in irreducible loop + use->is_Loop() && !use->is_Root() && // Don't kill Root (RootNode extends LoopNode) + use->in(LoopNode::EntryControl) == dead) { // Dead loop if its entry is dead + use->set_req(LoopNode::EntryControl, top); // Cut dead edge to prevent processing + use->set_req(0, top); // Cut self edge + nstack.push(use); } else { // Else found a not-dead user + // Dead if all inputs are top or null + bool dead_use = !use->is_Root(); // Keep empty graph alive for (uint j = 1; j < use->req(); j++) { - if (use->in(j) == dead) { // Turn all dead inputs into TOP + Node* in = use->in(j); + if (in == dead) { // Turn all dead inputs into TOP use->set_req(j, top); + } else if (in != NULL && !in->is_top()) { + dead_use = false; } } - igvn->_worklist.push(use); + if (dead_use) { + if (use->is_Region()) { + use->set_req(0, top); // Cut self edge + } + nstack.push(use); + } else { + igvn->_worklist.push(use); + } } // Refresh the iterator, since any number of kills might have happened. k = dead->last_outs(kmin); diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index 877090e087a..cabf1675735 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 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 @@ -868,7 +868,7 @@ const TypeFunc* OptoRuntime::updateBytesCRC32_Type() { return TypeFunc::make(domain, range); } -// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning void +// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning int const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() { // create input type (domain) int num_args = 5; diff --git a/hotspot/src/share/vm/precompiled/precompiled.hpp b/hotspot/src/share/vm/precompiled/precompiled.hpp index 5118a398f13..daa60c586aa 100644 --- a/hotspot/src/share/vm/precompiled/precompiled.hpp +++ b/hotspot/src/share/vm/precompiled/precompiled.hpp @@ -193,6 +193,7 @@ # include "runtime/mutexLocker.hpp" # include "runtime/objectMonitor.hpp" # include "runtime/orderAccess.hpp" +# include "runtime/orderAccess.inline.hpp" # include "runtime/os.hpp" # include "runtime/osThread.hpp" # include "runtime/perfData.hpp" diff --git a/hotspot/src/share/vm/prims/forte.cpp b/hotspot/src/share/vm/prims/forte.cpp index 42815d23fcd..f6af607c4ee 100644 --- a/hotspot/src/share/vm/prims/forte.cpp +++ b/hotspot/src/share/vm/prims/forte.cpp @@ -32,7 +32,7 @@ #include "oops/oop.inline2.hpp" #include "prims/forte.hpp" #include "runtime/javaCalls.hpp" -#include "runtime/thread.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vframe.hpp" #include "runtime/vframeArray.hpp" diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index 9e32dbc821a..53215062573 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -67,6 +67,7 @@ #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" #include "runtime/jfieldIDWorkaround.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/reflection.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/signature.hpp" diff --git a/hotspot/src/share/vm/prims/jniCheck.cpp b/hotspot/src/share/vm/prims/jniCheck.cpp index 4313b4bf0ac..7937090cc27 100644 --- a/hotspot/src/share/vm/prims/jniCheck.cpp +++ b/hotspot/src/share/vm/prims/jniCheck.cpp @@ -35,7 +35,7 @@ #include "runtime/handles.hpp" #include "runtime/interfaceSupport.hpp" #include "runtime/jfieldIDWorkaround.hpp" -#include "runtime/thread.hpp" +#include "runtime/thread.inline.hpp" #ifdef TARGET_ARCH_x86 # include "jniTypes_x86.hpp" #endif diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index e6c059c0d30..cc6ec977fdf 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -51,6 +51,7 @@ #include "runtime/java.hpp" #include "runtime/javaCalls.hpp" #include "runtime/jfieldIDWorkaround.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" #include "runtime/perfData.hpp" #include "runtime/reflection.hpp" diff --git a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp index 95129c06b9a..92ff86fcd6d 100644 --- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp +++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp @@ -851,7 +851,7 @@ void JvmtiClassFileReconstituter::copy_bytecodes(methodHandle mh, "sanity check"); int cpci = Bytes::get_native_u2(bcp+1); - bool is_invokedynamic = (EnableInvokeDynamic && code == Bytecodes::_invokedynamic); + bool is_invokedynamic = (code == Bytecodes::_invokedynamic); ConstantPoolCacheEntry* entry; if (is_invokedynamic) { cpci = Bytes::get_native_u4(bcp+1); diff --git a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp index 4e39e767833..97e309f83cc 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp @@ -41,6 +41,7 @@ #include "runtime/objectMonitor.hpp" #include "runtime/objectMonitor.inline.hpp" #include "runtime/signature.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vframe.hpp" #include "runtime/vframe_hp.hpp" #include "runtime/vmThread.hpp" diff --git a/hotspot/src/share/vm/prims/jvmtiExport.cpp b/hotspot/src/share/vm/prims/jvmtiExport.cpp index 8ef2f6ba63b..035288e97de 100644 --- a/hotspot/src/share/vm/prims/jvmtiExport.cpp +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp @@ -47,7 +47,7 @@ #include "runtime/interfaceSupport.hpp" #include "runtime/objectMonitor.hpp" #include "runtime/objectMonitor.inline.hpp" -#include "runtime/thread.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vframe.hpp" #include "services/attachListener.hpp" #include "services/serviceUtil.hpp" diff --git a/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp b/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp index 12e69b369b0..4be4d277055 100644 --- a/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp +++ b/hotspot/src/share/vm/prims/jvmtiRawMonitor.cpp @@ -25,7 +25,8 @@ #include "precompiled.hpp" #include "prims/jvmtiRawMonitor.hpp" #include "runtime/interfaceSupport.hpp" -#include "runtime/thread.hpp" +#include "runtime/orderAccess.inline.hpp" +#include "runtime/thread.inline.hpp" GrowableArray *JvmtiPendingMonitors::_monitors = new (ResourceObj::C_HEAP, mtInternal) GrowableArray(1,true); diff --git a/hotspot/src/share/vm/prims/jvmtiThreadState.inline.hpp b/hotspot/src/share/vm/prims/jvmtiThreadState.inline.hpp index e6af3d4b4ef..1b9926fb1da 100644 --- a/hotspot/src/share/vm/prims/jvmtiThreadState.inline.hpp +++ b/hotspot/src/share/vm/prims/jvmtiThreadState.inline.hpp @@ -27,6 +27,7 @@ #include "prims/jvmtiEnvThreadState.hpp" #include "prims/jvmtiThreadState.hpp" +#include "runtime/thread.inline.hpp" // JvmtiEnvThreadStateIterator implementation diff --git a/hotspot/src/share/vm/prims/methodHandles.cpp b/hotspot/src/share/vm/prims/methodHandles.cpp index e1fafabf54d..f6df49774a5 100644 --- a/hotspot/src/share/vm/prims/methodHandles.cpp +++ b/hotspot/src/share/vm/prims/methodHandles.cpp @@ -59,7 +59,7 @@ MethodHandlesAdapterBlob* MethodHandles::_adapter_code = NULL; // MethodHandles::generate_adapters // void MethodHandles::generate_adapters() { - if (!EnableInvokeDynamic || SystemDictionary::MethodHandle_klass() == NULL) return; + if (SystemDictionary::MethodHandle_klass() == NULL) return; assert(_adapter_code == NULL, "generate only once"); @@ -98,7 +98,7 @@ void MethodHandlesAdapterGenerator::generate() { void MethodHandles::set_enabled(bool z) { if (_enabled != z) { - guarantee(z && EnableInvokeDynamic, "can only enable once, and only if -XX:+EnableInvokeDynamic"); + guarantee(z, "can only enable once"); _enabled = z; } } @@ -1374,11 +1374,6 @@ static bool register_natives(JNIEnv* env, jclass clazz, const JNINativeMethod* m * This one function is exported, used by NativeLookup. */ JVM_ENTRY(void, JVM_RegisterMethodHandleMethods(JNIEnv *env, jclass MHN_class)) { - if (!EnableInvokeDynamic) { - warning("JSR 292 is disabled in this JVM. Use -XX:+UnlockDiagnosticVMOptions -XX:+EnableInvokeDynamic to enable."); - return; // bind nothing - } - assert(!MethodHandles::enabled(), "must not be enabled"); bool enable_MH = true; diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp index d7885ff6ad5..b10516fca7f 100644 --- a/hotspot/src/share/vm/prims/unsafe.cpp +++ b/hotspot/src/share/vm/prims/unsafe.cpp @@ -33,6 +33,7 @@ #include "prims/jvm.h" #include "runtime/globals.hpp" #include "runtime/interfaceSupport.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/reflection.hpp" #include "runtime/synchronizer.hpp" #include "services/threadService.hpp" @@ -1727,14 +1728,10 @@ JVM_ENTRY(void, JVM_RegisterUnsafeMethods(JNIEnv *env, jclass unsafecls)) } // Unsafe.defineAnonymousClass - if (EnableInvokeDynamic) { - register_natives("1.7 define anonymous class method", env, unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod)); - } + register_natives("1.7 define anonymous class method", env, unsafecls, anonk_methods, sizeof(anonk_methods)/sizeof(JNINativeMethod)); // Unsafe.shouldBeInitialized - if (EnableInvokeDynamic) { - register_natives("1.7 LambdaForm support", env, unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod)); - } + register_natives("1.7 LambdaForm support", env, unsafecls, lform_methods, sizeof(lform_methods)/sizeof(JNINativeMethod)); // Fence methods register_natives("1.8 fence methods", env, unsafecls, fence_methods, sizeof(fence_methods)/sizeof(JNINativeMethod)); diff --git a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp index 5483a72d816..a92c36c3e62 100644 --- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp +++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp @@ -449,7 +449,7 @@ void AdvancedThresholdPolicy::method_invocation_event(methodHandle mh, methodHan if (should_create_mdo(mh(), level)) { create_mdo(mh, thread); } - if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) { + if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh)) { CompLevel next_level = call_event(mh(), level); if (next_level != level) { compile(mh, InvocationEntryBci, next_level, thread); @@ -473,7 +473,7 @@ void AdvancedThresholdPolicy::method_back_branch_event(methodHandle mh, methodHa CompLevel next_osr_level = loop_event(imh(), level); CompLevel max_osr_level = (CompLevel)imh->highest_osr_comp_level(); // At the very least compile the OSR version - if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_osr_level != level) { + if (!CompileBroker::compilation_is_in_queue(imh) && (next_osr_level != level)) { compile(imh, bci, next_osr_level, thread); } @@ -507,7 +507,7 @@ void AdvancedThresholdPolicy::method_back_branch_event(methodHandle mh, methodHa nm->make_not_entrant(); } } - if (!CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) { + if (!CompileBroker::compilation_is_in_queue(mh)) { // Fix up next_level if necessary to avoid deopts if (next_level == CompLevel_limited_profile && max_osr_level == CompLevel_full_profile) { next_level = CompLevel_full_profile; @@ -519,7 +519,7 @@ void AdvancedThresholdPolicy::method_back_branch_event(methodHandle mh, methodHa } else { cur_level = comp_level(imh()); next_level = call_event(imh(), cur_level); - if (!CompileBroker::compilation_is_in_queue(imh, bci) && next_level != cur_level) { + if (!CompileBroker::compilation_is_in_queue(imh) && (next_level != cur_level)) { compile(imh, InvocationEntryBci, next_level, thread); } } diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index 0d1655c7997..d146785b53b 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -2399,7 +2399,7 @@ bool Arguments::check_vm_args_consistency() { status &= verify_interval(CodeCacheSegmentSize, 1, 1024, "CodeCacheSegmentSize"); // TieredCompilation needs at least 2 compiler threads. - const int num_min_compiler_threads = (TieredCompilation && (TieredStopAtLevel >= CompLevel_full_optimization)) ? 2 : 1; + const int num_min_compiler_threads = (TieredCompilation && (TieredStopAtLevel >= CompLevel_full_optimization)) ? 2 : CI_COMPILER_COUNT; status &=verify_min_value(CICompilerCount, num_min_compiler_threads, "CICompilerCount"); if (!FLAG_IS_DEFAULT(CICompilerCount) && !FLAG_IS_DEFAULT(CICompilerCountPerCPU) && CICompilerCountPerCPU) { @@ -3638,19 +3638,9 @@ jint Arguments::parse(const JavaVMInitArgs* args) { } #endif // PRODUCT - // JSR 292 is not supported before 1.7 - if (!JDK_Version::is_gte_jdk17x_version()) { - if (EnableInvokeDynamic) { - if (!FLAG_IS_DEFAULT(EnableInvokeDynamic)) { - warning("JSR 292 is not supported before 1.7. Disabling support."); - } - EnableInvokeDynamic = false; - } - } - - if (EnableInvokeDynamic && ScavengeRootsInCode == 0) { + if (ScavengeRootsInCode == 0) { if (!FLAG_IS_DEFAULT(ScavengeRootsInCode)) { - warning("forcing ScavengeRootsInCode non-zero because EnableInvokeDynamic is true"); + warning("forcing ScavengeRootsInCode non-zero"); } ScavengeRootsInCode = 1; } diff --git a/hotspot/src/share/vm/runtime/fprofiler.cpp b/hotspot/src/share/vm/runtime/fprofiler.cpp index 3ddf1a191dc..7e497b73541 100644 --- a/hotspot/src/share/vm/runtime/fprofiler.cpp +++ b/hotspot/src/share/vm/runtime/fprofiler.cpp @@ -38,6 +38,7 @@ #include "runtime/stubCodeGenerator.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/task.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vframe.hpp" #include "utilities/macros.hpp" diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index ae4cc4e2149..b2f622e3c91 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -3784,10 +3784,6 @@ class CommandLineFlags { NOT_LP64(LINUX_ONLY(2*G) NOT_LINUX(0)), \ "Address to allocate shared memory region for class data") \ \ - diagnostic(bool, EnableInvokeDynamic, true, \ - "support JSR 292 (method handles, invokedynamic, " \ - "anonymous classes") \ - \ diagnostic(bool, PrintMethodHandleStubs, false, \ "Print generated stub code for method handles") \ \ diff --git a/hotspot/src/share/vm/runtime/interfaceSupport.cpp b/hotspot/src/share/vm/runtime/interfaceSupport.cpp index cec374fa69d..61bdfcebf85 100644 --- a/hotspot/src/share/vm/runtime/interfaceSupport.cpp +++ b/hotspot/src/share/vm/runtime/interfaceSupport.cpp @@ -30,6 +30,7 @@ #include "memory/resourceArea.hpp" #include "runtime/init.hpp" #include "runtime/interfaceSupport.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/threadLocalStorage.hpp" #include "runtime/vframe.hpp" #include "utilities/preserveException.hpp" diff --git a/hotspot/src/share/vm/runtime/javaFrameAnchor.hpp b/hotspot/src/share/vm/runtime/javaFrameAnchor.hpp index f6340923e32..02d2eec709f 100644 --- a/hotspot/src/share/vm/runtime/javaFrameAnchor.hpp +++ b/hotspot/src/share/vm/runtime/javaFrameAnchor.hpp @@ -26,39 +26,7 @@ #define SHARE_VM_RUNTIME_JAVAFRAMEANCHOR_HPP #include "utilities/globalDefinitions.hpp" -#ifdef TARGET_OS_ARCH_linux_x86 -# include "orderAccess_linux_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "orderAccess_linux_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "orderAccess_linux_zero.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "orderAccess_solaris_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "orderAccess_solaris_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_windows_x86 -# include "orderAccess_windows_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "orderAccess_linux_arm.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "orderAccess_linux_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_aix_ppc -# include "orderAccess_aix_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "orderAccess_bsd_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "orderAccess_bsd_zero.inline.hpp" -#endif +#include "runtime/orderAccess.inline.hpp" // // An object for encapsulating the machine/os dependent part of a JavaThread frame state diff --git a/hotspot/src/share/vm/runtime/mutex.cpp b/hotspot/src/share/vm/runtime/mutex.cpp index 41e10bac28a..8789e5d0df4 100644 --- a/hotspot/src/share/vm/runtime/mutex.cpp +++ b/hotspot/src/share/vm/runtime/mutex.cpp @@ -25,6 +25,7 @@ #include "precompiled.hpp" #include "runtime/mutex.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/thread.inline.hpp" #include "utilities/events.hpp" diff --git a/hotspot/src/share/vm/runtime/objectMonitor.cpp b/hotspot/src/share/vm/runtime/objectMonitor.cpp index b1d04f1483c..1f16ee4ad1c 100644 --- a/hotspot/src/share/vm/runtime/objectMonitor.cpp +++ b/hotspot/src/share/vm/runtime/objectMonitor.cpp @@ -32,6 +32,7 @@ #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" #include "runtime/objectMonitor.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.inline.hpp" diff --git a/hotspot/src/share/vm/runtime/orderAccess.inline.hpp b/hotspot/src/share/vm/runtime/orderAccess.inline.hpp new file mode 100644 index 00000000000..4fdd50d4fe8 --- /dev/null +++ b/hotspot/src/share/vm/runtime/orderAccess.inline.hpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright 2014 SAP AG. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP +#define SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP + +#include "runtime/orderAccess.hpp" + +// Linux +#ifdef TARGET_OS_ARCH_linux_x86 +# include "orderAccess_linux_x86.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_linux_sparc +# include "orderAccess_linux_sparc.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_linux_zero +# include "orderAccess_linux_zero.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_linux_arm +# include "orderAccess_linux_arm.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_linux_ppc +# include "orderAccess_linux_ppc.inline.hpp" +#endif + +// Solaris +#ifdef TARGET_OS_ARCH_solaris_x86 +# include "orderAccess_solaris_x86.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_solaris_sparc +# include "orderAccess_solaris_sparc.inline.hpp" +#endif + +// Windows +#ifdef TARGET_OS_ARCH_windows_x86 +# include "orderAccess_windows_x86.inline.hpp" +#endif + +// AIX +#ifdef TARGET_OS_ARCH_aix_ppc +# include "orderAccess_aix_ppc.inline.hpp" +#endif + +// BSD +#ifdef TARGET_OS_ARCH_bsd_x86 +# include "orderAccess_bsd_x86.inline.hpp" +#endif +#ifdef TARGET_OS_ARCH_bsd_zero +# include "orderAccess_bsd_zero.inline.hpp" +#endif + +#endif // SHARE_VM_RUNTIME_ORDERACCESS_INLINE_HPP diff --git a/hotspot/src/share/vm/runtime/perfMemory.cpp b/hotspot/src/share/vm/runtime/perfMemory.cpp index cf521658215..209288cb680 100644 --- a/hotspot/src/share/vm/runtime/perfMemory.cpp +++ b/hotspot/src/share/vm/runtime/perfMemory.cpp @@ -28,6 +28,7 @@ #include "runtime/java.hpp" #include "runtime/mutex.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" #include "runtime/perfData.hpp" #include "runtime/perfMemory.hpp" diff --git a/hotspot/src/share/vm/runtime/safepoint.cpp b/hotspot/src/share/vm/runtime/safepoint.cpp index 7e7f36788f1..cbf11d17311 100644 --- a/hotspot/src/share/vm/runtime/safepoint.cpp +++ b/hotspot/src/share/vm/runtime/safepoint.cpp @@ -41,6 +41,7 @@ #include "runtime/frame.inline.hpp" #include "runtime/interfaceSupport.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/safepoint.hpp" #include "runtime/signature.hpp" diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 51eea31ced6..ad69dcec364 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -2658,19 +2658,20 @@ JRT_ENTRY_NO_ASYNC(void, SharedRuntime::block_for_jni_critical(JavaThread* threa JRT_END #ifdef HAVE_DTRACE_H -// Create a dtrace nmethod for this method. The wrapper converts the -// java compiled calling convention to the native convention, makes a dummy call -// (actually nops for the size of the call instruction, which become a trap if -// probe is enabled). The returns to the caller. Since this all looks like a -// leaf no thread transition is needed. - +/** + * Create a dtrace nmethod for this method. The wrapper converts the + * Java-compiled calling convention to the native convention, makes a dummy call + * (actually nops for the size of the call instruction, which become a trap if + * probe is enabled), and finally returns to the caller. Since this all looks like a + * leaf, no thread transition is needed. + */ nmethod *AdapterHandlerLibrary::create_dtrace_nmethod(methodHandle method) { ResourceMark rm; nmethod* nm = NULL; if (PrintCompilation) { ttyLocker ttyl; - tty->print("--- n%s "); + tty->print("--- n "); method->print_short_name(tty); if (method->is_static()) { tty->print(" (static)"); diff --git a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp index 11cc67fc1f7..d70e8523a26 100644 --- a/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp +++ b/hotspot/src/share/vm/runtime/simpleThresholdPolicy.cpp @@ -192,6 +192,10 @@ nmethod* SimpleThresholdPolicy::event(methodHandle method, methodHandle inlinee, thread->is_interp_only_mode()) { return NULL; } + if (CompileTheWorld || ReplayCompiles) { + // Don't trigger other compiles in testing mode + return NULL; + } nmethod *osr_nm = NULL; handle_counter_overflow(method()); @@ -235,7 +239,7 @@ void SimpleThresholdPolicy::compile(methodHandle mh, int bci, CompLevel level, J if (bci != InvocationEntryBci && mh->is_not_osr_compilable(level)) { return; } - if (!CompileBroker::compilation_is_in_queue(mh, bci)) { + if (!CompileBroker::compilation_is_in_queue(mh)) { if (PrintTieredEvents) { print_event(COMPILE, mh, mh, bci, level); } @@ -374,7 +378,7 @@ CompLevel SimpleThresholdPolicy::loop_event(Method* method, CompLevel cur_level) // Handle the invocation event. void SimpleThresholdPolicy::method_invocation_event(methodHandle mh, methodHandle imh, CompLevel level, nmethod* nm, JavaThread* thread) { - if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, InvocationEntryBci)) { + if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh)) { CompLevel next_level = call_event(mh(), level); if (next_level != level) { compile(mh, InvocationEntryBci, next_level, thread); @@ -387,7 +391,7 @@ void SimpleThresholdPolicy::method_invocation_event(methodHandle mh, methodHandl void SimpleThresholdPolicy::method_back_branch_event(methodHandle mh, methodHandle imh, int bci, CompLevel level, nmethod* nm, JavaThread* thread) { // If the method is already compiling, quickly bail out. - if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh, bci)) { + if (is_compilation_enabled() && !CompileBroker::compilation_is_in_queue(mh)) { // Use loop event as an opportunity to also check there's been // enough calls. CompLevel cur_level = comp_level(mh()); diff --git a/hotspot/src/share/vm/runtime/sweeper.cpp b/hotspot/src/share/vm/runtime/sweeper.cpp index 115f1094eaa..6d30bd34032 100644 --- a/hotspot/src/share/vm/runtime/sweeper.cpp +++ b/hotspot/src/share/vm/runtime/sweeper.cpp @@ -33,8 +33,10 @@ #include "runtime/atomic.hpp" #include "runtime/compilationPolicy.hpp" #include "runtime/mutexLocker.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/os.hpp" #include "runtime/sweeper.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vm_operations.hpp" #include "trace/tracing.hpp" #include "utilities/events.hpp" diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 53a19218040..0d8b90e11a4 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -58,6 +58,7 @@ #include "runtime/memprofiler.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/objectMonitor.hpp" +#include "runtime/orderAccess.inline.hpp" #include "runtime/osThread.hpp" #include "runtime/safepoint.hpp" #include "runtime/sharedRuntime.hpp" @@ -1198,6 +1199,13 @@ void NamedThread::set_name(const char* format, ...) { va_end(ap); } +void NamedThread::print_on(outputStream* st) const { + st->print("\"%s\" ", name()); + Thread::print_on(st); + st->cr(); +} + + // ======= WatcherThread ======== // The watcher thread exists to simulate timer interrupts. It should @@ -3602,9 +3610,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // It is done after compilers are initialized, because otherwise compilations of // signature polymorphic MH intrinsics can be missed // (see SystemDictionary::find_method_handle_intrinsic). - if (EnableInvokeDynamic) { - initialize_jsr292_core_classes(CHECK_JNI_ERR); - } + initialize_jsr292_core_classes(CHECK_JNI_ERR); #if INCLUDE_MANAGEMENT Management::initialize(THREAD); diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index 6837578f74f..422ba755e48 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -436,18 +436,7 @@ class Thread: public ThreadShadow { jlong allocated_bytes() { return _allocated_bytes; } void set_allocated_bytes(jlong value) { _allocated_bytes = value; } void incr_allocated_bytes(jlong size) { _allocated_bytes += size; } - jlong cooked_allocated_bytes() { - jlong allocated_bytes = OrderAccess::load_acquire(&_allocated_bytes); - if (UseTLAB) { - size_t used_bytes = tlab().used_bytes(); - if ((ssize_t)used_bytes > 0) { - // More-or-less valid tlab. The load_acquire above should ensure - // that the result of the add is <= the instantaneous value - return allocated_bytes + used_bytes; - } - } - return allocated_bytes; - } + inline jlong cooked_allocated_bytes(); TRACE_DATA* trace_data() { return &_trace_data; } @@ -566,7 +555,7 @@ public: void set_lgrp_id(int value) { _lgrp_id = value; } // Printing - void print_on(outputStream* st) const; + virtual void print_on(outputStream* st) const; void print() const { print_on(tty); } virtual void print_on_error(outputStream* st, char* buf, int buflen) const; @@ -700,6 +689,7 @@ class NamedThread: public Thread { virtual char* name() const { return _name == NULL ? (char*)"Unknown Thread" : _name; } JavaThread *processed_thread() { return _processed_thread; } void set_processed_thread(JavaThread *thread) { _processed_thread = thread; } + virtual void print_on(outputStream* st) const; }; // Worker threads are named and have an id of an assigned work. @@ -746,7 +736,6 @@ class WatcherThread: public Thread { // Printing char* name() const { return (char*)"VM Periodic Task Thread"; } void print_on(outputStream* st) const; - void print() const { print_on(tty); } void unpark(); // Returns the single instance of WatcherThread @@ -1046,12 +1035,8 @@ class JavaThread: public Thread { #else // Use membars when accessing volatile _thread_state. See // Threads::create_vm() for size checks. - JavaThreadState thread_state() const { - return (JavaThreadState) OrderAccess::load_acquire((volatile jint*)&_thread_state); - } - void set_thread_state(JavaThreadState s) { - OrderAccess::release_store((volatile jint*)&_thread_state, (jint)s); - } + inline JavaThreadState thread_state() const; + inline void set_thread_state(JavaThreadState s); #endif ThreadSafepointState *safepoint_state() const { return _safepoint_state; } void set_safepoint_state(ThreadSafepointState *state) { _safepoint_state = state; } @@ -1459,7 +1444,6 @@ class JavaThread: public Thread { // Misc. operations char* name() const { return (char*)get_thread_name(); } void print_on(outputStream* st) const; - void print() const { print_on(tty); } void print_value(); void print_thread_state_on(outputStream* ) const PRODUCT_RETURN; void print_thread_state() const PRODUCT_RETURN; @@ -1775,7 +1759,7 @@ public: // clearing/querying jni attach status bool is_attaching_via_jni() const { return _jni_attach_state == _attaching_via_jni; } bool has_attached_via_jni() const { return is_attaching_via_jni() || _jni_attach_state == _attached_via_jni; } - void set_done_attaching_via_jni() { _jni_attach_state = _attached_via_jni; OrderAccess::fence(); } + inline void set_done_attaching_via_jni(); private: // This field is used to determine if a thread has claimed // a par_id: it is UINT_MAX if the thread has not claimed a par_id; diff --git a/hotspot/src/share/vm/runtime/thread.inline.hpp b/hotspot/src/share/vm/runtime/thread.inline.hpp index 2a95d70b6f2..b68e7d1ae38 100644 --- a/hotspot/src/share/vm/runtime/thread.inline.hpp +++ b/hotspot/src/share/vm/runtime/thread.inline.hpp @@ -46,4 +46,32 @@ #undef SHARE_VM_RUNTIME_THREAD_INLINE_HPP_SCOPE +inline jlong Thread::cooked_allocated_bytes() { + jlong allocated_bytes = OrderAccess::load_acquire(&_allocated_bytes); + if (UseTLAB) { + size_t used_bytes = tlab().used_bytes(); + if ((ssize_t)used_bytes > 0) { + // More-or-less valid tlab. The load_acquire above should ensure + // that the result of the add is <= the instantaneous value. + return allocated_bytes + used_bytes; + } + } + return allocated_bytes; +} + +#ifdef PPC64 +inline JavaThreadState JavaThread::thread_state() const { + return (JavaThreadState) OrderAccess::load_acquire((volatile jint*)&_thread_state); +} + +inline void JavaThread::set_thread_state(JavaThreadState s) { + OrderAccess::release_store((volatile jint*)&_thread_state, (jint)s); +} +#endif + +inline void JavaThread::set_done_attaching_via_jni() { + _jni_attach_state = _attached_via_jni; + OrderAccess::fence(); +} + #endif // SHARE_VM_RUNTIME_THREAD_INLINE_HPP diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 2bffd9b33db..67bf7b1033d 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -878,7 +878,7 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; nonstatic_field(nmethod, _entry_point, address) \ nonstatic_field(nmethod, _verified_entry_point, address) \ nonstatic_field(nmethod, _osr_entry_point, address) \ - nonstatic_field(nmethod, _lock_count, jint) \ + volatile_nonstatic_field(nmethod, _lock_count, jint) \ nonstatic_field(nmethod, _stack_traversal_mark, long) \ nonstatic_field(nmethod, _compile_id, int) \ nonstatic_field(nmethod, _comp_level, int) \ diff --git a/hotspot/src/share/vm/runtime/vmThread.cpp b/hotspot/src/share/vm/runtime/vmThread.cpp index e974578a838..a3ff582fab9 100644 --- a/hotspot/src/share/vm/runtime/vmThread.cpp +++ b/hotspot/src/share/vm/runtime/vmThread.cpp @@ -339,12 +339,6 @@ void VMThread::wait_for_vm_thread_exit() { } } -void VMThread::print_on(outputStream* st) const { - st->print("\"%s\" ", name()); - Thread::print_on(st); - st->cr(); -} - void VMThread::evaluate_operation(VM_Operation* op) { ResourceMark rm; diff --git a/hotspot/src/share/vm/runtime/vmThread.hpp b/hotspot/src/share/vm/runtime/vmThread.hpp index 2682d9d5f24..43147e53c36 100644 --- a/hotspot/src/share/vm/runtime/vmThread.hpp +++ b/hotspot/src/share/vm/runtime/vmThread.hpp @@ -128,9 +128,6 @@ class VMThread: public NamedThread { // GC support void oops_do(OopClosure* f, CLDClosure* cld_f, CodeBlobClosure* cf); - // Debugging - void print_on(outputStream* st) const; - void print() const { print_on(tty); } void verify(); // Performance measurement diff --git a/hotspot/src/share/vm/services/management.cpp b/hotspot/src/share/vm/services/management.cpp index 1ec04560777..7c99aa47730 100644 --- a/hotspot/src/share/vm/services/management.cpp +++ b/hotspot/src/share/vm/services/management.cpp @@ -39,6 +39,7 @@ #include "runtime/jniHandles.hpp" #include "runtime/os.hpp" #include "runtime/serviceThread.hpp" +#include "runtime/thread.inline.hpp" #include "services/classLoadingService.hpp" #include "services/diagnosticCommand.hpp" #include "services/diagnosticFramework.hpp" diff --git a/hotspot/src/share/vm/services/memTracker.cpp b/hotspot/src/share/vm/services/memTracker.cpp index 50208a5cbba..213e24e1bd0 100644 --- a/hotspot/src/share/vm/services/memTracker.cpp +++ b/hotspot/src/share/vm/services/memTracker.cpp @@ -29,6 +29,7 @@ #include "runtime/mutexLocker.hpp" #include "runtime/safepoint.hpp" #include "runtime/threadCritical.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vm_operations.hpp" #include "services/memPtr.hpp" #include "services/memReporter.hpp" diff --git a/hotspot/src/share/vm/services/memoryManager.cpp b/hotspot/src/share/vm/services/memoryManager.cpp index f6ada6a8244..646b5e12ebb 100644 --- a/hotspot/src/share/vm/services/memoryManager.cpp +++ b/hotspot/src/share/vm/services/memoryManager.cpp @@ -28,6 +28,7 @@ #include "oops/oop.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" +#include "runtime/orderAccess.inline.hpp" #include "services/lowMemoryDetector.hpp" #include "services/management.hpp" #include "services/memoryManager.hpp" diff --git a/hotspot/src/share/vm/services/memoryPool.cpp b/hotspot/src/share/vm/services/memoryPool.cpp index 5d9c2538b91..1510cd596b4 100644 --- a/hotspot/src/share/vm/services/memoryPool.cpp +++ b/hotspot/src/share/vm/services/memoryPool.cpp @@ -29,6 +29,7 @@ #include "oops/oop.inline.hpp" #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" +#include "runtime/orderAccess.inline.hpp" #include "services/lowMemoryDetector.hpp" #include "services/management.hpp" #include "services/memoryManager.hpp" diff --git a/hotspot/src/share/vm/services/memoryService.cpp b/hotspot/src/share/vm/services/memoryService.cpp index 8115a3e2409..ea9cb59873d 100644 --- a/hotspot/src/share/vm/services/memoryService.cpp +++ b/hotspot/src/share/vm/services/memoryService.cpp @@ -123,12 +123,12 @@ void MemoryService::set_universe_heap(CollectedHeap* heap) { void MemoryService::add_gen_collected_heap_info(GenCollectedHeap* heap) { CollectorPolicy* policy = heap->collector_policy(); - assert(policy->is_two_generation_policy(), "Only support two generations"); + assert(policy->is_generation_policy(), "Only support two generations"); guarantee(heap->n_gens() == 2, "Only support two-generation heap"); - TwoGenerationCollectorPolicy* two_gen_policy = policy->as_two_generation_policy(); - if (two_gen_policy != NULL) { - GenerationSpec** specs = two_gen_policy->generations(); + GenCollectorPolicy* gen_policy = policy->as_generation_policy(); + if (gen_policy != NULL) { + GenerationSpec** specs = gen_policy->generations(); Generation::Name kind = specs[0]->name(); switch (kind) { case Generation::DefNew: diff --git a/hotspot/src/share/vm/services/threadService.cpp b/hotspot/src/share/vm/services/threadService.cpp index 3295580bd5d..a46067981a0 100644 --- a/hotspot/src/share/vm/services/threadService.cpp +++ b/hotspot/src/share/vm/services/threadService.cpp @@ -33,6 +33,7 @@ #include "runtime/init.hpp" #include "runtime/thread.hpp" #include "runtime/vframe.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "runtime/vm_operations.hpp" #include "services/threadService.hpp" diff --git a/hotspot/src/share/vm/utilities/array.hpp b/hotspot/src/share/vm/utilities/array.hpp index 0fbcd94d2be..99c84a6ddfe 100644 --- a/hotspot/src/share/vm/utilities/array.hpp +++ b/hotspot/src/share/vm/utilities/array.hpp @@ -28,6 +28,7 @@ #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "memory/metaspace.hpp" +#include "runtime/orderAccess.hpp" // correct linkage required to compile w/o warnings // (must be on file level - cannot be local) diff --git a/hotspot/src/share/vm/utilities/constantTag.cpp b/hotspot/src/share/vm/utilities/constantTag.cpp index 7bc55690ac2..8f3b68a9b5d 100644 --- a/hotspot/src/share/vm/utilities/constantTag.cpp +++ b/hotspot/src/share/vm/utilities/constantTag.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -76,6 +76,20 @@ jbyte constantTag::non_error_value() const { } +jbyte constantTag::error_value() const { + switch (_tag) { + case JVM_CONSTANT_UnresolvedClass: + return JVM_CONSTANT_UnresolvedClassInError; + case JVM_CONSTANT_MethodHandle: + return JVM_CONSTANT_MethodHandleInError; + case JVM_CONSTANT_MethodType: + return JVM_CONSTANT_MethodTypeInError; + default: + ShouldNotReachHere(); + return JVM_CONSTANT_Invalid; + } +} + const char* constantTag::internal_name() const { switch (_tag) { case JVM_CONSTANT_Invalid : diff --git a/hotspot/src/share/vm/utilities/constantTag.hpp b/hotspot/src/share/vm/utilities/constantTag.hpp index cedddf6a41f..ae99d570693 100644 --- a/hotspot/src/share/vm/utilities/constantTag.hpp +++ b/hotspot/src/share/vm/utilities/constantTag.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 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 @@ -109,6 +109,7 @@ class constantTag VALUE_OBJ_CLASS_SPEC { } jbyte value() const { return _tag; } + jbyte error_value() const; jbyte non_error_value() const; BasicType basic_type() const; // if used with ldc, what kind of value gets pushed? diff --git a/hotspot/src/share/vm/utilities/hashtable.inline.hpp b/hotspot/src/share/vm/utilities/hashtable.inline.hpp index 237fa5f41ee..9356c985ee5 100644 --- a/hotspot/src/share/vm/utilities/hashtable.inline.hpp +++ b/hotspot/src/share/vm/utilities/hashtable.inline.hpp @@ -26,6 +26,7 @@ #define SHARE_VM_UTILITIES_HASHTABLE_INLINE_HPP #include "memory/allocation.inline.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/hashtable.hpp" #include "utilities/dtrace.hpp" diff --git a/hotspot/src/share/vm/utilities/taskqueue.hpp b/hotspot/src/share/vm/utilities/taskqueue.hpp index 2577d79432b..fb9ea619bea 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.hpp +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp @@ -28,40 +28,8 @@ #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "runtime/mutex.hpp" +#include "runtime/orderAccess.inline.hpp" #include "utilities/stack.hpp" -#ifdef TARGET_OS_ARCH_linux_x86 -# include "orderAccess_linux_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_sparc -# include "orderAccess_linux_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_zero -# include "orderAccess_linux_zero.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_x86 -# include "orderAccess_solaris_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_solaris_sparc -# include "orderAccess_solaris_sparc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_windows_x86 -# include "orderAccess_windows_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_arm -# include "orderAccess_linux_arm.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_linux_ppc -# include "orderAccess_linux_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_aix_ppc -# include "orderAccess_aix_ppc.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_x86 -# include "orderAccess_bsd_x86.inline.hpp" -#endif -#ifdef TARGET_OS_ARCH_bsd_zero -# include "orderAccess_bsd_zero.inline.hpp" -#endif // Simple TaskQueue stats that are collected by default in debug builds. diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index e950d338681..097e28de9c5 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -30,7 +30,7 @@ #include "runtime/frame.inline.hpp" #include "runtime/init.hpp" #include "runtime/os.hpp" -#include "runtime/thread.hpp" +#include "runtime/thread.inline.hpp" #include "runtime/vmThread.hpp" #include "runtime/vm_operations.hpp" #include "services/memTracker.hpp" diff --git a/hotspot/test/compiler/5091921/Test7005594.java b/hotspot/test/compiler/5091921/Test7005594.java index 828339f1b21..4a23be13702 100644 --- a/hotspot/test/compiler/5091921/Test7005594.java +++ b/hotspot/test/compiler/5091921/Test7005594.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -25,6 +25,7 @@ /** * @test * @bug 7005594 + * @ignore 7117034 * @summary Array overflow not handled correctly with loop optimzations * * @run shell Test7005594.sh diff --git a/hotspot/test/compiler/7052494/Test7052494.java b/hotspot/test/compiler/7052494/Test7052494.java index 37f453d4aa1..fa454112b6d 100644 --- a/hotspot/test/compiler/7052494/Test7052494.java +++ b/hotspot/test/compiler/7052494/Test7052494.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -25,6 +25,7 @@ /** * @test * @bug 7052494 + * @ignore 7154567 * @summary Eclipse test fails on JDK 7 b142 * * @run main/othervm -Xbatch Test7052494 diff --git a/hotspot/test/compiler/7184394/TestAESBase.java b/hotspot/test/compiler/7184394/TestAESBase.java index 511b97dc6c6..4d3204880bc 100644 --- a/hotspot/test/compiler/7184394/TestAESBase.java +++ b/hotspot/test/compiler/7184394/TestAESBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -40,9 +40,20 @@ abstract public class TestAESBase { int msgSize = Integer.getInteger("msgSize", 646); boolean checkOutput = Boolean.getBoolean("checkOutput"); boolean noReinit = Boolean.getBoolean("noReinit"); + boolean testingMisalignment; + private static final int ALIGN = 8; + int encInputOffset = Integer.getInteger("encInputOffset", 0) % ALIGN; + int encOutputOffset = Integer.getInteger("encOutputOffset", 0) % ALIGN; + int decOutputOffset = Integer.getInteger("decOutputOffset", 0) % ALIGN; + int lastChunkSize = Integer.getInteger("lastChunkSize", 32); int keySize = Integer.getInteger("keySize", 128); + int inputLength; + int encodeLength; + int decodeLength; + int decodeMsgSize; String algorithm = System.getProperty("algorithm", "AES"); String mode = System.getProperty("mode", "CBC"); + String paddingStr = System.getProperty("paddingStr", "PKCS5Padding"); byte[] input; byte[] encode; byte[] expectedEncode; @@ -51,7 +62,6 @@ abstract public class TestAESBase { Random random = new Random(0); Cipher cipher; Cipher dCipher; - String paddingStr = "PKCS5Padding"; AlgorithmParameters algParams; SecretKey key; @@ -67,7 +77,10 @@ abstract public class TestAESBase { public void prepare() { try { - System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit + ", checkOutput=" + checkOutput); + System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", paddingStr=" + paddingStr + ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit + ", checkOutput=" + checkOutput + ", encInputOffset=" + encInputOffset + ", encOutputOffset=" + encOutputOffset + ", decOutputOffset=" + decOutputOffset + ", lastChunkSize=" +lastChunkSize ); + + if (encInputOffset % ALIGN != 0 || encOutputOffset % ALIGN != 0 || decOutputOffset % ALIGN !=0 ) + testingMisalignment = true; int keyLenBytes = (keySize == 0 ? 16 : keySize/8); byte keyBytes[] = new byte[keyLenBytes]; @@ -81,10 +94,6 @@ abstract public class TestAESBase { System.out.println("Algorithm: " + key.getAlgorithm() + "(" + key.getEncoded().length * 8 + "bit)"); } - input = new byte[msgSize]; - for (int i=0; i 0 ? Integer.valueOf(args[0]) : 1000000); + int warmupIters = (args.length > 1 ? Integer.valueOf(args[1]) : 20000); System.out.println(iters + " iterations"); TestAESEncode etest = new TestAESEncode(); etest.prepare(); - // warm-up for 20K iterations + // warm-up System.out.println("Starting encryption warm-up"); - for (int i=0; i<20000; i++) { + for (int i=0; i0) (on Core i7 980X) + * + * @run main ModNaN + */ +public class ModNaN { + /* This bug was seen in the field for a particular version of the VM, + * but never reproduced internally, and the reason was never known, + * nor were the exact circumstances of the failure. + */ + /* + * Failed on Windows 7/Core i7 980X/1.6.0_38 (64-bit): + * + * NaNs (i.e., when it fails, this is what we expect to see): + * + * 8.98846567431158E307 % 1.295163E-318 = NaN + * (0x7FE0000000000000L % 0x0000000000040000L) + * + * 1.7976931348623157E308 % 2.59032E-318 = NaN + * (0x7FEFFFFFFFFFFFFFL % 0x000000000007FFFFL) + * + * 1.7976931348623157E308 % 1.060997895E-314 = NaN + * (0x7FEFFFFFFFFFFFFFL % 0x000000007FFFFFFFL) + * + * 1.7976931348623157E308 % 6.767486E-317 = NaN + * (0x7FEFFFFFFFFFFFFFL % 0x0000000000d10208L) + * + * 1.7976931348623157E308 % 7.528725E-318 = NaN + * (0x7FEFFFFFFFFFFFFFL % 0x0000000000174077L) + * + * These cases did not fail, even when the previous five did: + * 8.98846567431158E307 % 1.29516E-318 = 2.53E-321 + * (0x7fe0000000000000L % 0x000000000003ffffL) + * + * 1.7976931348623157E308 % 2.590327E-318 = 0.0 + * (0x7fefffffffffffffL % 0x0000000000080000L) + * + * 1.7976931348623157E308 % 1.060965516E-314 = 9.35818525E-315 + * (0x7fefffffffffffffL % 0x000000007ffeffffL) + * + */ + + static double[][] bad = new double[][] { + /* + * These hex numbers correspond to the base-10 doubles in the + * comment above; this can be checked by observing the output + * of testWithPrint. + */ + new double[] { Double.longBitsToDouble(0x7FE0000000000000L), + Double.longBitsToDouble(0x0000000000040000L) }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + Double.longBitsToDouble(0x000000000007FFFFL) }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + Double.longBitsToDouble(0x000000007FFFFFFFL) }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + 6.767486E-317 }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + 7.528725E-318 }, }; + + static double[][] good = new double[][] { + new double[] { Double.longBitsToDouble(0x7FE0000000000000L), + Double.longBitsToDouble(0x000000000003FFFFL) }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + Double.longBitsToDouble(0x0000000000080000L) }, + new double[] { Double.longBitsToDouble(0x7FEFFFFFFFFFFFFFL), + Double.longBitsToDouble(0x000000007FFEFFFFL) }, }; + + public static void main(String[] args) throws InterruptedException { + int N = 10000; + testWithPrint(); + for (int i = 0; i < N; i++) + testStrict(); + for (int i = 0; i < N; i++) + test(); + Thread.sleep(1000); // pause to let the compiler work + for (int i = 0; i < 10; i++) + testStrict(); + for (int i = 0; i < 10; i++) + test(); + } + + public strictfp static void testWithPrint() { + for (double[] ab : bad) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + System.out.println("" + a + "("+toHexRep(a)+") mod " + + b + "("+toHexRep(b)+") yields " + + mod + "("+toHexRep(mod)+")"); + } + + for (double[] ab : good) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + System.out.println("" + a + "("+toHexRep(a)+") mod " + + b + "("+toHexRep(b)+") yields " + + mod + "("+toHexRep(mod)+")"); + } + } + + public strictfp static void testStrict() { + for (double[] ab : bad) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + check(mod); + } + + for (double[] ab : good) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + check(mod); + } + } + + public static void test() { + for (double[] ab : bad) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + check(mod); + } + + for (double[] ab : good) { + double a = ab[0]; + double b = ab[1]; + double mod = a % b; + check(mod); + } + } + + static String toHexRep(double d) { + return "0x" + Long.toHexString(Double.doubleToRawLongBits(d)) + "L"; + } + + static void check(double mod) { + if (Double.isNaN(mod)) { + throw new Error("Saw a NaN, fail"); + } + } +} diff --git a/hotspot/test/compiler/profiling/TestMethodHandleInvokesIntrinsic.java b/hotspot/test/compiler/profiling/TestMethodHandleInvokesIntrinsic.java new file mode 100644 index 00000000000..d882cc396a1 --- /dev/null +++ b/hotspot/test/compiler/profiling/TestMethodHandleInvokesIntrinsic.java @@ -0,0 +1,92 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8041458 + * @summary profiling of arguments in C1 at MethodHandle invoke of intrinsic tries to profile popped argument. + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TieredStopAtLevel=3 TestMethodHandleInvokesIntrinsic + * + */ + +import java.lang.invoke.*; + +public class TestMethodHandleInvokesIntrinsic { + + static final MethodHandle mh_nanoTime; + static final MethodHandle mh_getClass; + static { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + MethodType mt = MethodType.methodType(long.class); + MethodHandle MH = null; + try { + MH = lookup.findStatic(System.class, "nanoTime", mt); + } catch(NoSuchMethodException nsme) { + nsme.printStackTrace(); + throw new RuntimeException("TEST FAILED", nsme); + } catch(IllegalAccessException iae) { + iae.printStackTrace(); + throw new RuntimeException("TEST FAILED", iae); + } + mh_nanoTime = MH; + + mt = MethodType.methodType(Class.class); + MH = null; + try { + MH = lookup.findVirtual(Object.class, "getClass", mt); + } catch(NoSuchMethodException nsme) { + nsme.printStackTrace(); + throw new RuntimeException("TEST FAILED", nsme); + } catch(IllegalAccessException iae) { + iae.printStackTrace(); + throw new RuntimeException("TEST FAILED", iae); + } + mh_getClass = MH; + } + + static long m1() throws Throwable { + return (long)mh_nanoTime.invokeExact(); + } + + static Class m2(Object o) throws Throwable { + return (Class)mh_getClass.invokeExact(o); + } + + static public void main(String[] args) { + try { + for (int i = 0; i < 20000; i++) { + m1(); + } + TestMethodHandleInvokesIntrinsic o = new TestMethodHandleInvokesIntrinsic(); + for (int i = 0; i < 20000; i++) { + m2(o); + } + } catch(Throwable t) { + System.out.println("Unexpected exception"); + t.printStackTrace(); + throw new RuntimeException("TEST FAILED", t); + } + + System.out.println("TEST PASSED"); + } +} diff --git a/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java b/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java index 42270469512..d6dd5717635 100644 --- a/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java +++ b/hotspot/test/compiler/profiling/spectrapredefineclass/Agent.java @@ -66,15 +66,6 @@ class Test { public class Agent implements ClassFileTransformer { - static class MemoryChunk { - MemoryChunk other; - long[] array; - MemoryChunk(MemoryChunk other) { - other = other; - array = new long[1024 * 1024 * 1024]; - } - } - static public boolean m2(A a) { boolean res = false; if (a.getClass() == B.class) { diff --git a/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java b/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java index 9142738d962..7a645ab0b8f 100644 --- a/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java +++ b/hotspot/test/compiler/profiling/spectrapredefineclass/Launcher.java @@ -30,7 +30,7 @@ import com.oracle.java.testlibrary.*; * @build Agent * @run main ClassFileInstaller Agent * @run main Launcher - * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 -Xmx1M -XX:ReservedCodeCacheSize=3M Agent + * @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:TypeProfileLevel=222 -XX:ReservedCodeCacheSize=3M Agent */ public class Launcher { public static void main(String[] args) throws Exception { diff --git a/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java b/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java index 39eee00ff8b..bd9d78266e3 100644 --- a/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java +++ b/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnSupportedConfig.java @@ -27,7 +27,7 @@ * @bug 8031320 * @summary Verify UseRTMDeopt option processing on CPUs with rtm support * when rtm locking is supported by VM. - * @library /testlibrary /testlibrary/whitebox + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary * @build TestUseRTMDeoptOptionOnSupportedConfig * @run main ClassFileInstaller sun.hotspot.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions diff --git a/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java b/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java index 68c4ef60194..2f3b8367519 100644 --- a/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java +++ b/hotspot/test/compiler/rtm/cli/TestUseRTMDeoptOptionOnUnsupportedConfig.java @@ -27,7 +27,7 @@ * @bug 8031320 * @summary Verify UseRTMDeopt option processing on CPUs without rtm support * or on VMs without rtm locking support. - * @library /testlibrary /testlibrary/whitebox + * @library /testlibrary /testlibrary/whitebox /compiler/testlibrary * @build TestUseRTMDeoptOptionOnUnsupportedConfig * @run main ClassFileInstaller sun.hotspot.WhiteBox * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions diff --git a/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java b/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java index e7e92d379ac..1cfd757fd0f 100644 --- a/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java +++ b/hotspot/test/compiler/startup/NumCompilerThreadsCheck.java @@ -30,11 +30,28 @@ import com.oracle.java.testlibrary.*; public class NumCompilerThreadsCheck { + public static void main(String[] args) throws Exception { ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-XX:CICompilerCount=-1"); OutputAnalyzer out = new OutputAnalyzer(pb.start()); String expectedOutput = "CICompilerCount of -1 is invalid"; out.shouldContain(expectedOutput); + + if (isZeroVm()) { + String expectedLowWaterMarkText = "must be at least 0"; + out.shouldContain(expectedLowWaterMarkText); + } + } + + private static boolean isZeroVm() { + String vmName = System.getProperty("java.vm.name"); + if (vmName == null) { + throw new RuntimeException("No VM name"); + } + if (vmName.toLowerCase().contains("zero")) { + return true; + } + return false; } } diff --git a/hotspot/test/runtime/ClassResolutionFail/Property.java b/hotspot/test/runtime/ClassResolutionFail/Property.java new file mode 100644 index 00000000000..1339d770188 --- /dev/null +++ b/hotspot/test/runtime/ClassResolutionFail/Property.java @@ -0,0 +1,27 @@ +/* + * 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. + */ + +// Class PropertySuper is not found. + +public class Property extends PropertySuper { +} diff --git a/hotspot/test/runtime/ClassResolutionFail/PropertySuper.java b/hotspot/test/runtime/ClassResolutionFail/PropertySuper.java new file mode 100644 index 00000000000..c83bb82c9ff --- /dev/null +++ b/hotspot/test/runtime/ClassResolutionFail/PropertySuper.java @@ -0,0 +1,28 @@ +/* + * 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. + */ + +// Class PropertySuper should be removed. + +public class PropertySuper { + PropertySuper() { System.out.println("remove me for NoClassDefFoundError"); } +} diff --git a/hotspot/test/runtime/ClassResolutionFail/TestClassResolutionFail.java b/hotspot/test/runtime/ClassResolutionFail/TestClassResolutionFail.java new file mode 100644 index 00000000000..ce9ec504e77 --- /dev/null +++ b/hotspot/test/runtime/ClassResolutionFail/TestClassResolutionFail.java @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* + * @test TestClassResolutionFail + * @bug 8023697 + * @summary This tests that failed class resolution doesn't report different class name in detail message for the first and subsequent times + */ + +import java.io.File; + +public class TestClassResolutionFail { + static String message; + public static void test1() throws RuntimeException { + try { + Property p = new Property(); + } catch (LinkageError e) { + message = e.getMessage(); + } + try { + Property p = new Property(); + } catch (LinkageError e) { + System.out.println(e.getMessage()); + if (!e.getMessage().equals(message)) { + throw new RuntimeException("Wrong message: " + message + " != " + e.getMessage()); + } + } + } + public static void main(java.lang.String[] unused) throws Exception { + // Remove PropertySuper class + String testClasses = System.getProperty("test.classes", "."); + File f = new File(testClasses + File.separator + "PropertySuper.class"); + f.delete(); + test1(); + } +} + diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 7125c0f30c1..f631e59bbe0 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -255,3 +255,4 @@ f93a792fe37279d4d37aea86a99f3abbdc6fe79b jdk9-b09 4ce98701efe3b28f6ce3ab23385445731e968af7 jdk9-b10 6b4280dceb00642f54d5bc1c2cb7d34c99a04992 jdk9-b11 e88cecf5a21b760ff7d7761c2db6bb8c82bc9f0c jdk9-b12 +5eaf717f6e36037a6d3744ffeee0e4c88e64a0d2 jdk9-b13 diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 635ec9d5e4e..b2197334dde 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -258,3 +258,4 @@ c9e8bb8c1144a966ca7b481142c6b5e55d14a29c jdk9-b09 9af43f4d215f6f19b1767f6ac66da931b8ee9535 jdk9-b10 1f953ba7db2b535e19f0354abfee6d67605e0684 jdk9-b11 779f8b21c75f83e3918dac8499e4d0ecb3a54ed7 jdk9-b12 +3d42204854c9f703e3ccdc8891248e73057713ab jdk9-b13 diff --git a/jdk/.hgtags b/jdk/.hgtags index aaf0411d07a..7a9bbb24e71 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -255,3 +255,4 @@ f4e624447514f12dd7c51f1e5b0cb97efcd15be2 jdk9-b07 ab06ba2894313a47e4969ca37792ff119c49e711 jdk9-b10 47feccd164b7187a0147693a922ee47c6629643c jdk9-b11 83d9bc20973de232cae45b139fdff8a4549c130f jdk9-b12 +c7c8002d02721e02131d104549ebeb8b379fb8d2 jdk9-b13 diff --git a/jdk/make/CopyFiles.gmk b/jdk/make/CopyFiles.gmk index 5566d4628d4..c1fa0d4062b 100644 --- a/jdk/make/CopyFiles.gmk +++ b/jdk/make/CopyFiles.gmk @@ -367,8 +367,24 @@ COPY_FILES += $(PROPS_DST) POLICY_SRC := $(JDK_TOPDIR)/src/share/lib/security/java.policy POLICY_DST := $(JDK_OUTPUTDIR)/lib/security/java.policy -$(POLICY_DST): $(POLICY_SRC) - $(call install-file) +POLICY_SRC_LIST := + +ifeq ($(OPENJDK_TARGET_OS), windows) + POLICY_SRC_LIST += $(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS)/lib/security/java.policy +endif +ifndef OPENJDK + ifneq (, $(filter $(OPENJDK_TARGET_OS), windows solaris)) + POLICY_SRC_LIST += $(JDK_TOPDIR)/src/closed/$(OPENJDK_TARGET_OS)/lib/security/java.policy + endif +endif + +POLICY_SRC_LIST += $(POLICY_SRC) + +$(POLICY_DST): $(POLICY_SRC_LIST) + $(MKDIR) -p $(@D) + $(RM) $@ $@.tmp + $(foreach f,$(POLICY_SRC_LIST),$(CAT) $(f) >> $@.tmp;) + $(MV) $@.tmp $@ COPY_FILES += $(POLICY_DST) diff --git a/jdk/make/data/tzdata/VERSION b/jdk/make/data/tzdata/VERSION index 1c96650f231..c735be51ca1 100644 --- a/jdk/make/data/tzdata/VERSION +++ b/jdk/make/data/tzdata/VERSION @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2014b +tzdata2014c diff --git a/jdk/make/data/tzdata/africa b/jdk/make/data/tzdata/africa index 3198e1cc209..6f1a1471e0c 100644 --- a/jdk/make/data/tzdata/africa +++ b/jdk/make/data/tzdata/africa @@ -358,11 +358,54 @@ Rule Egypt 2007 only - Sep Thu>=1 23:00s 0 - # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html # +# From Ahmad El-Dardiry (2014-05-07): +# Egypt is to change back to Daylight system on May 15 +# http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx + +# From Gunther Vermier (2015-05-13): +# our Egypt office confirms that the change will be at 15 May "midnight" (24:00) + +# From Paul Eggert (2014-05-13): +# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says +# the change is because of blackouts in Cairo, even though Ahram Online (cited +# above) says DST had no affect on electricity consumption. The AP story says +# DST will not be observed during Ramadan. There is no information about when +# DST will end. See: +# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833 +# +# For now, guess that later transitions will use 2010's rules, and that +# Egypt will agree with Morocco (see below) about the date Ramadan starts and +# ends, though (unlike Morocco) it will switch at 00:00 standard time. In +# Egypt the spring-forward transitions are removed for 2020-2022, when the +# guessed spring-forward date falls during the estimated Ramadan, and all +# transitions removed for 2023-2038, where the estimated Ramadan falls entirely +# outside the guessed daylight-saving time. Ramadan intrudes on the guessed +# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff. + Rule Egypt 2008 only - Aug lastThu 23:00s 0 - Rule Egypt 2009 only - Aug 20 23:00s 0 - Rule Egypt 2010 only - Aug 11 0:00 0 - Rule Egypt 2010 only - Sep 10 0:00 1:00 S Rule Egypt 2010 only - Sep lastThu 23:00s 0 - +Rule Egypt 2014 only - May 15 24:00 1:00 S +Rule Egypt 2014 only - Jun 29 0:00s 0 - +Rule Egypt 2014 only - Jul 29 0:00s 1:00 S +Rule Egypt 2014 max - Sep lastThu 23:00s 0 - +Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S +Rule Egypt 2015 only - Jun 18 0:00s 0 - +Rule Egypt 2015 only - Jul 18 0:00s 1:00 S +Rule Egypt 2016 only - Jun 7 0:00s 0 - +Rule Egypt 2016 only - Jul 7 0:00s 1:00 S +Rule Egypt 2017 only - May 27 0:00s 0 - +Rule Egypt 2017 only - Jun 26 0:00s 1:00 S +Rule Egypt 2018 only - May 16 0:00s 0 - +Rule Egypt 2018 only - Jun 15 0:00s 1:00 S +Rule Egypt 2019 only - May 6 0:00s 0 - +Rule Egypt 2019 only - Jun 5 0:00s 1:00 S +Rule Egypt 2020 only - May 24 0:00s 1:00 S +Rule Egypt 2021 only - May 13 0:00s 1:00 S +Rule Egypt 2022 only - May 3 0:00s 1:00 S +Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Cairo 2:05:09 - LMT 1900 Oct diff --git a/jdk/make/data/tzdata/asia b/jdk/make/data/tzdata/asia index dc3c94ba9cc..595c8ed7245 100644 --- a/jdk/make/data/tzdata/asia +++ b/jdk/make/data/tzdata/asia @@ -1370,22 +1370,6 @@ Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u # "Jordan will switch to winter time on Friday, October 27". # -# From Phil Pizzey (2009-04-02): -# ...I think I may have spotted an error in the timezone data for -# Jordan. -# The current (2009d) asia file shows Jordan going to daylight -# saving -# time on the last Thursday in March. -# -# Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S -# -# However timeanddate.com, which I usually find reliable, shows Jordan -# going to daylight saving time on the last Friday in March since 2002. -# Please see -# -# http://www.timeanddate.com/worldclock/timezone.html?n=11 -# - # From Steffen Thorsen (2009-04-02): # This single one might be good enough, (2009-03-24, Arabic): # diff --git a/jdk/make/data/tzdata/europe b/jdk/make/data/tzdata/europe index 2b0c5613e60..226c393a0f2 100644 --- a/jdk/make/data/tzdata/europe +++ b/jdk/make/data/tzdata/europe @@ -2989,6 +2989,10 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880 # From Alexander Krivenyshev (2014-03-17): # time change at 2:00 (2am) on March 30, 2014 # http://vz.ru/news/2014/3/17/677464.html +# From Paul Eggert (2014-03-30): +# Simferopol and Sevastopol reportedly changed their central town clocks +# late the previous day, but this appears to have been ceremonial +# and the discrepancies are small enough to not worry about. 2:00 EU EE%sT 2014 Mar 30 2:00 4:00 - MSK diff --git a/jdk/make/gensrc/GensrcMisc.gmk b/jdk/make/gensrc/GensrcMisc.gmk index f23e448cb53..e996f1c9a82 100644 --- a/jdk/make/gensrc/GensrcMisc.gmk +++ b/jdk/make/gensrc/GensrcMisc.gmk @@ -62,25 +62,6 @@ GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/tools/jconsole/Version.java ########################################################################################## -ifeq ($(OPENJDK_TARGET_OS_API), posix) - UPSUFFIX := $(OPENJDK_TARGET_OS) - ifeq ($(OPENJDK_TARGET_OS), macosx) - UPSUFFIX := bsd - endif - # UNIXProcess.java is different for solaris and linux. We need to copy - # the correct UNIXProcess.java over to $(JDK_OUTPUTDIR)/gensrc/java/lang/. - - $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java: \ - $(JDK_TOPDIR)/src/solaris/classes/java/lang/UNIXProcess.java.$(UPSUFFIX) - $(ECHO) $(LOG_INFO) Copying UNIXProcess.java.$(OPENJDK_TARGET_OS) to java/lang/UNIXProcess.java - $(call install-file) - $(CHMOD) u+rw $@ - - GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/java/lang/UNIXProcess.java -endif - -########################################################################################## - GENSRC_MISC += $(JDK_OUTPUTDIR)/gensrc/sun/nio/ch/SocketOptionRegistry.java GENSRC_SOR_SRC := $(JDK_TOPDIR)/make/src/native/genconstants/ch diff --git a/jdk/make/profile-rtjar-includes.txt b/jdk/make/profile-rtjar-includes.txt index 231b1583ae0..95b3357f183 100644 --- a/jdk/make/profile-rtjar-includes.txt +++ b/jdk/make/profile-rtjar-includes.txt @@ -100,9 +100,7 @@ PROFILE_2_RTJAR_INCLUDE_TYPES := PROFILE_2_RTJAR_EXCLUDE_TYPES := -PROFILE_2_INCLUDE_METAINF_SERVICES := \ - META-INF/services/sun.util.spi.XmlPropertiesProvider - +PROFILE_2_INCLUDE_METAINF_SERVICES := PROFILE_3_RTJAR_INCLUDE_PACKAGES := \ com/sun/jmx \ diff --git a/jdk/src/share/classes/jdk/internal/util/xml/BasicXmlPropertiesProvider.java b/jdk/src/share/classes/com/sun/tools/attach/AttachOperationFailedException.java similarity index 54% rename from jdk/src/share/classes/jdk/internal/util/xml/BasicXmlPropertiesProvider.java rename to jdk/src/share/classes/com/sun/tools/attach/AttachOperationFailedException.java index 2c41514decb..7f676ee4993 100644 --- a/jdk/src/share/classes/jdk/internal/util/xml/BasicXmlPropertiesProvider.java +++ b/jdk/src/share/classes/com/sun/tools/attach/AttachOperationFailedException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -22,38 +22,33 @@ * or visit www.oracle.com if you need additional information or have any * questions. */ -package jdk.internal.util.xml; -import java.util.Properties; -import java.util.InvalidPropertiesFormatException; -import java.io.InputStream; -import java.io.OutputStream; +package com.sun.tools.attach; + import java.io.IOException; -import sun.util.spi.XmlPropertiesProvider; - /** - * A {@code XmlPropertiesProvider} implementation that uses the UKit XML parser. + * Exception type to signal that an attach operation failed in the target VM. + * + *

This exception can be thrown by the various operations of + * {@link com.sun.tools.attach.VirtualMachine} when the operation + * fails in the target VM. If there is a communication error, + * a regular IOException will be thrown. + * + * @since 1.9 */ +@jdk.Exported +public class AttachOperationFailedException extends IOException { -public class BasicXmlPropertiesProvider extends XmlPropertiesProvider { + private static final long serialVersionUID = 2140308168167478043L; - public BasicXmlPropertiesProvider() { } - - @Override - public void load(Properties props, InputStream in) - throws IOException, InvalidPropertiesFormatException - { - PropertiesDefaultHandler handler = new PropertiesDefaultHandler(); - handler.load(props, in); - } - - @Override - public void store(Properties props, OutputStream os, String comment, - String encoding) - throws IOException - { - PropertiesDefaultHandler handler = new PropertiesDefaultHandler(); - handler.store(props, os, comment, encoding); + /** + * Constructs an AttachOperationFailedException with + * the specified detail message. + * + * @param s the detail message. + */ + public AttachOperationFailedException(String message) { + super(message); } } diff --git a/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java b/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java index 1bea7512147..642f5516396 100644 --- a/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java +++ b/jdk/src/share/classes/com/sun/tools/attach/VirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -564,8 +564,15 @@ public abstract class VirtualMachine { * * @return The system properties * + * @throws AttachOperationFailedException + * If the target virtual machine is unable to complete the + * attach operation. A more specific error message will be + * given by {@link AttachOperationFailedException#getMessage()}. + * * @throws IOException - * If an I/O error occurs + * If an I/O error occurs, a communication error for example, + * that cannot be identified as an error to indicate that the + * operation failed in the target VM. * * @see java.lang.System#getProperties * @see #loadAgentLibrary @@ -591,8 +598,15 @@ public abstract class VirtualMachine { * * @return The agent properties * + * @throws AttachOperationFailedException + * If the target virtual machine is unable to complete the + * attach operation. A more specific error message will be + * given by {@link AttachOperationFailedException#getMessage()}. + * * @throws IOException - * If an I/O error occurs + * If an I/O error occurs, a communication error for example, + * that cannot be identified as an error to indicate that the + * operation failed in the target VM. */ public abstract Properties getAgentProperties() throws IOException; diff --git a/jdk/src/share/classes/java/lang/Character.java b/jdk/src/share/classes/java/lang/Character.java index 3fda1bbb4a5..3251a49d033 100644 --- a/jdk/src/share/classes/java/lang/Character.java +++ b/jdk/src/share/classes/java/lang/Character.java @@ -4498,7 +4498,6 @@ class Character implements java.io.Serializable, Comparable { * Character case is ignored for all of the valid script names. * The en_US locale's case mapping rules are used to provide * case-insensitive string comparisons for script name validation. - *

* * @param scriptName A {@code UnicodeScript} name. * @return The {@code UnicodeScript} constant identified @@ -5503,7 +5502,7 @@ class Character implements java.io.Serializable, Comparable { * '\u00D0' '\u00D1' '\u00D2' '\u00D3' '\u00D4' '\u00D5' '\u00D6' '\u00D8' * '\u00D9' '\u00DA' '\u00DB' '\u00DC' '\u00DD' '\u00DE' * - *

Many other Unicode characters are uppercase too.

+ *

Many other Unicode characters are uppercase too. * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is uppercase; @@ -5581,7 +5580,7 @@ class Character implements java.io.Serializable, Comparable { *

  • {@code LATIN CAPITAL LETTER N WITH SMALL LETTER J} *
  • {@code LATIN CAPITAL LETTER D WITH SMALL LETTER Z} * - *

    Many other Unicode characters are titlecase too.

    + *

    Many other Unicode characters are titlecase too. * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is titlecase; @@ -6777,7 +6776,6 @@ class Character implements java.io.Serializable, Comparable { *

  • It is {@code '\u005Cu001E'}, U+001E RECORD SEPARATOR. *
  • It is {@code '\u005Cu001F'}, U+001F UNIT SEPARATOR. * - *

    * * @param codePoint the character (Unicode code point) to be tested. * @return {@code true} if the character is a Java whitespace @@ -7121,7 +7119,6 @@ class Character implements java.io.Serializable, Comparable { /** * Converts the character (Unicode code point) argument to uppercase using * information from the UnicodeData file. - *

    * * @param codePoint the character (Unicode code point) to be converted. * @return either the uppercase equivalent of the character, if diff --git a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java index ff9288bab91..d57973042a9 100644 --- a/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java +++ b/jdk/src/share/classes/java/lang/ConditionalSpecialCasing.java @@ -62,6 +62,7 @@ final class ConditionalSpecialCasing { //# Conditional mappings //# ================================================================================ new Entry(0x03A3, new char[]{0x03C2}, new char[]{0x03A3}, null, FINAL_CASED), // # GREEK CAPITAL LETTER SIGMA + new Entry(0x0130, new char[]{0x0069, 0x0307}, new char[]{0x0130}, null, 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE //# ================================================================================ //# Locale-sensitive mappings @@ -77,8 +78,8 @@ final class ConditionalSpecialCasing { //# ================================================================================ //# Turkish and Azeri -// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE -// new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "tr", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE + new Entry(0x0130, new char[]{0x0069}, new char[]{0x0130}, "az", 0), // # LATIN CAPITAL LETTER I WITH DOT ABOVE new Entry(0x0307, new char[]{}, new char[]{0x0307}, "tr", AFTER_I), // # COMBINING DOT ABOVE new Entry(0x0307, new char[]{}, new char[]{0x0307}, "az", AFTER_I), // # COMBINING DOT ABOVE new Entry(0x0049, new char[]{0x0131}, new char[]{0x0049}, "tr", NOT_BEFORE_DOT), // # LATIN CAPITAL LETTER I @@ -147,21 +148,25 @@ final class ConditionalSpecialCasing { private static char[] lookUpTable(String src, int index, Locale locale, boolean bLowerCasing) { HashSet set = entryTable.get(new Integer(src.codePointAt(index))); + char[] ret = null; if (set != null) { Iterator iter = set.iterator(); String currentLang = locale.getLanguage(); while (iter.hasNext()) { Entry entry = iter.next(); - String conditionLang= entry.getLanguage(); + String conditionLang = entry.getLanguage(); if (((conditionLang == null) || (conditionLang.equals(currentLang))) && isConditionMet(src, index, locale, entry.getCondition())) { - return (bLowerCasing ? entry.getLowerCase() : entry.getUpperCase()); + ret = bLowerCasing ? entry.getLowerCase() : entry.getUpperCase(); + if (conditionLang != null) { + break; + } } } } - return null; + return ret; } private static boolean isConditionMet(String src, int index, Locale locale, int condition) { diff --git a/jdk/src/share/classes/java/lang/Math.java b/jdk/src/share/classes/java/lang/Math.java index ae2cd096afe..8740bb1c65a 100644 --- a/jdk/src/share/classes/java/lang/Math.java +++ b/jdk/src/share/classes/java/lang/Math.java @@ -1048,7 +1048,6 @@ public final class Math { * whereas {@code (-4 / 3) == -1}. *

  • * - *

    * * @param x the dividend * @param y the divisor diff --git a/jdk/src/share/classes/java/lang/Runtime.java b/jdk/src/share/classes/java/lang/Runtime.java index 9e53dc939ec..d91b8ad26d3 100644 --- a/jdk/src/share/classes/java/lang/Runtime.java +++ b/jdk/src/share/classes/java/lang/Runtime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 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 @@ -83,7 +83,7 @@ public class Runtime { * blocks indefinitely. * *

    The {@link System#exit(int) System.exit} method is the - * conventional and convenient means of invoking this method.

    + * conventional and convenient means of invoking this method. * * @param status * Termination status. By convention, a nonzero status code @@ -180,7 +180,7 @@ public class Runtime { * method goes awry by, for example, corrupting internal data structures or * attempting to access nonexistent memory. If the virtual machine aborts * then no guarantee can be made about whether or not any shutdown hooks - * will be run.

    + * will be run. * * @param hook * An initialized but unstarted {@link Thread} object @@ -248,7 +248,7 @@ public class Runtime { * hooks to be started and does not run uninvoked finalizers if * finalization-on-exit has been enabled. If the shutdown sequence has * already been initiated then this method does not wait for any running - * shutdown hooks or finalizers to finish their work.

    + * shutdown hooks or finalizers to finish their work. * * @param status * Termination status. By convention, a nonzero status code diff --git a/jdk/src/share/classes/java/lang/SecurityManager.java b/jdk/src/share/classes/java/lang/SecurityManager.java index e0aeb32de17..f7f3a58e4f2 100644 --- a/jdk/src/share/classes/java/lang/SecurityManager.java +++ b/jdk/src/share/classes/java/lang/SecurityManager.java @@ -1242,7 +1242,6 @@ class SecurityManager { * super.checkPropertiesAccess * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to access or modify the system properties. @@ -1320,7 +1319,6 @@ class SecurityManager { * super.checkPrintJobAccess * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to initiate a print job request. @@ -1566,7 +1564,6 @@ class SecurityManager { * super.checkSetFactory * at the point the overridden method would normally throw an * exception. - *

    * * @exception SecurityException if the calling thread does not have * permission to specify a socket factory or a stream diff --git a/jdk/src/share/classes/java/lang/String.java b/jdk/src/share/classes/java/lang/String.java index 4e68fe30dc0..2227a6f26b7 100644 --- a/jdk/src/share/classes/java/lang/String.java +++ b/jdk/src/share/classes/java/lang/String.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -2583,6 +2583,9 @@ public final class String if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA return toLowerCaseEx(result, i, locale, false); } + if (cp == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE + return toLowerCaseEx(result, i, locale, true); + } cp = Character.toLowerCase(cp); if (!Character.isBmpCodePoint(cp)) { return toLowerCaseEx(result, i, locale, false); @@ -2650,7 +2653,7 @@ public final class String * LATIN SMALL LETTER DOTLESS I character. * To obtain correct results for locale insensitive strings, use * {@code toLowerCase(Locale.ROOT)}. - *

    + * * @return the {@code String}, converted to lowercase. * @see java.lang.String#toLowerCase(Locale) */ @@ -2812,7 +2815,7 @@ public final class String * LATIN CAPITAL LETTER I WITH DOT ABOVE character. * To obtain correct results for locale insensitive strings, use * {@code toUpperCase(Locale.ROOT)}. - *

    + * * @return the {@code String}, converted to uppercase. * @see java.lang.String#toUpperCase(Locale) */ diff --git a/jdk/src/share/classes/java/lang/System.java b/jdk/src/share/classes/java/lang/System.java index 69d1d0fe1ef..0a8cc3a4802 100644 --- a/jdk/src/share/classes/java/lang/System.java +++ b/jdk/src/share/classes/java/lang/System.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 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 @@ -133,7 +133,6 @@ public final class System { *

    First, if there is a security manager, its checkPermission * method is called with a RuntimePermission("setIO") permission * to see if it's ok to reassign the "standard" input stream. - *

    * * @param in the new standard input stream. * @@ -762,7 +761,6 @@ public final class System { * permission. This may result in a SecurityException being thrown. * If no exception is thrown, the specified property is set to the given * value. - *

    * * @param key the name of the system property. * @param value the value of the system property. @@ -801,7 +799,6 @@ public final class System { * is called with a PropertyPermission(key, "write") * permission. This may result in a SecurityException being thrown. * If no exception is thrown, the specified property is removed. - *

    * * @param key the name of the system property to be removed. * @return the previous string value of the system property, diff --git a/jdk/src/share/classes/java/lang/instrument/package.html b/jdk/src/share/classes/java/lang/instrument/package.html index e6839e52f9b..b8e34f3f7fb 100644 --- a/jdk/src/share/classes/java/lang/instrument/package.html +++ b/jdk/src/share/classes/java/lang/instrument/package.html @@ -1,5 +1,5 @@ " + - ""+ - "" + - "" + - "" + - ""; - - /** - * Version number for the format of exported properties files. - */ - private static final String EXTERNAL_XML_VERSION = "1.0"; - - @Override - public void load(Properties props, InputStream in) - throws IOException, InvalidPropertiesFormatException - { - Document doc = null; - try { - doc = getLoadingDoc(in); - } catch (SAXException saxe) { - throw new InvalidPropertiesFormatException(saxe); - } - Element propertiesElement = doc.getDocumentElement(); - String xmlVersion = propertiesElement.getAttribute("version"); - if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0) - throw new InvalidPropertiesFormatException( - "Exported Properties file format version " + xmlVersion + - " is not supported. This java installation can read" + - " versions " + EXTERNAL_XML_VERSION + " or older. You" + - " may need to install a newer version of JDK."); - importProperties(props, propertiesElement); - } - - static Document getLoadingDoc(InputStream in) - throws SAXException, IOException - { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setIgnoringElementContentWhitespace(true); - dbf.setValidating(true); - dbf.setCoalescing(true); - dbf.setIgnoringComments(true); - try { - DocumentBuilder db = dbf.newDocumentBuilder(); - db.setEntityResolver(new Resolver()); - db.setErrorHandler(new EH()); - InputSource is = new InputSource(in); - return db.parse(is); - } catch (ParserConfigurationException x) { - throw new Error(x); - } - } - - static void importProperties(Properties props, Element propertiesElement) { - NodeList entries = propertiesElement.getChildNodes(); - int numEntries = entries.getLength(); - int start = numEntries > 0 && - entries.item(0).getNodeName().equals("comment") ? 1 : 0; - for (int i=start; i e : props.entrySet()) { - final Object k = e.getKey(); - final Object v = e.getValue(); - if (k instanceof String && v instanceof String) { - Element entry = (Element)properties.appendChild( - doc.createElement("entry")); - entry.setAttribute("key", (String)k); - entry.appendChild(doc.createTextNode((String)v)); - } - } - } - emitDocument(doc, os, encoding); - } - - static void emitDocument(Document doc, OutputStream os, String encoding) - throws IOException - { - TransformerFactory tf = TransformerFactory.newInstance(); - Transformer t = null; - try { - t = tf.newTransformer(); - t.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, PROPS_DTD_URI); - t.setOutputProperty(OutputKeys.INDENT, "yes"); - t.setOutputProperty(OutputKeys.METHOD, "xml"); - t.setOutputProperty(OutputKeys.ENCODING, encoding); - } catch (TransformerConfigurationException tce) { - assert(false); - } - DOMSource doms = new DOMSource(doc); - StreamResult sr = new StreamResult(os); - try { - t.transform(doms, sr); - } catch (TransformerException te) { - throw new IOException(te); - } - } - - private static class Resolver implements EntityResolver { - public InputSource resolveEntity(String pid, String sid) - throws SAXException - { - if (sid.equals(PROPS_DTD_URI)) { - InputSource is; - is = new InputSource(new StringReader(PROPS_DTD)); - is.setSystemId(PROPS_DTD_URI); - return is; - } - throw new SAXException("Invalid system identifier: " + sid); - } - } - - private static class EH implements ErrorHandler { - public void error(SAXParseException x) throws SAXException { - throw x; - } - public void fatalError(SAXParseException x) throws SAXException { - throw x; - } - public void warning(SAXParseException x) throws SAXException { - throw x; - } - } - -} diff --git a/jdk/src/share/lib/security/java.policy b/jdk/src/share/lib/security/java.policy index 120694d6993..b3165881ac4 100644 --- a/jdk/src/share/lib/security/java.policy +++ b/jdk/src/share/lib/security/java.policy @@ -1,7 +1,39 @@ +// permissions required by each component +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write,delete"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; -// Standard extensions get all permissions by default +grant codeBase "file:${java.home}/lib/ext/cldrdata.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.text.*"; + permission java.lang.RuntimePermission "accessClassInPackage.sun.util.*"; + permission java.util.PropertyPermission "*", "read"; +}; -grant codeBase "file:${{java.ext.dirs}}/*" { +grant codeBase "file:${java.home}/lib/ext/localedata.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.text.*"; + permission java.lang.RuntimePermission "accessClassInPackage.sun.util.*"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant codeBase "file:${java.home}/lib/ext/dnsns.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/nashorn.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunec.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunjce_provider.jar" { + permission java.security.AllPermission; +}; + +grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" { permission java.security.AllPermission; }; diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java b/jdk/src/solaris/classes/java/lang/UNIXProcess.java new file mode 100644 index 00000000000..35d37e6b5d3 --- /dev/null +++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java @@ -0,0 +1,827 @@ +/* + * Copyright (c) 1995, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.security.AccessController; +import static java.security.AccessController.doPrivileged; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; + +/** + * java.lang.Process subclass in the UNIX environment. + * + * @author Mario Wolczko and Ross Knippel. + * @author Konstantin Kladko (ported to Linux and Bsd) + * @author Martin Buchholz + * @author Volker Simonis (ported to AIX) + */ +final class UNIXProcess extends Process { + private static final sun.misc.JavaIOFileDescriptorAccess fdAccess + = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); + + private final int pid; + private int exitcode; + private boolean hasExited; + + private /* final */ OutputStream stdin; + private /* final */ InputStream stdout; + private /* final */ InputStream stderr; + + // only used on Solaris + private /* final */ DeferredCloseInputStream stdout_inner_stream; + + private static enum LaunchMechanism { + // order IS important! + FORK, + POSIX_SPAWN, + VFORK + } + + private static enum Platform { + + LINUX(LaunchMechanism.VFORK, LaunchMechanism.FORK), + + BSD(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK), + + SOLARIS(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK), + + AIX(LaunchMechanism.POSIX_SPAWN, LaunchMechanism.FORK); + + final LaunchMechanism defaultLaunchMechanism; + final Set validLaunchMechanisms; + + Platform(LaunchMechanism ... launchMechanisms) { + this.defaultLaunchMechanism = launchMechanisms[0]; + this.validLaunchMechanisms = + EnumSet.copyOf(Arrays.asList(launchMechanisms)); + } + + private String helperPath(String javahome, String osArch) { + switch (this) { + case SOLARIS: + if (osArch.equals("x86")) { osArch = "i386"; } + else if (osArch.equals("x86_64")) { osArch = "amd64"; } + // fall through... + case LINUX: + case AIX: + return javahome + "/lib/" + osArch + "/jspawnhelper"; + + case BSD: + return javahome + "/lib/jspawnhelper"; + + default: + throw new AssertionError("Unsupported platform: " + this); + } + } + + String helperPath() { + return AccessController.doPrivileged( + (PrivilegedAction) () -> + helperPath(System.getProperty("java.home"), + System.getProperty("os.arch")) + ); + } + + LaunchMechanism launchMechanism() { + return AccessController.doPrivileged( + (PrivilegedAction) () -> { + String s = System.getProperty( + "jdk.lang.Process.launchMechanism"); + LaunchMechanism lm; + if (s == null) { + lm = defaultLaunchMechanism; + s = lm.name().toLowerCase(Locale.ENGLISH); + } else { + try { + lm = LaunchMechanism.valueOf( + s.toUpperCase(Locale.ENGLISH)); + } catch (IllegalArgumentException e) { + lm = null; + } + } + if (lm == null || !validLaunchMechanisms.contains(lm)) { + throw new Error( + s + " is not a supported " + + "process launch mechanism on this platform." + ); + } + return lm; + } + ); + } + + static Platform get() { + String osName = AccessController.doPrivileged( + (PrivilegedAction) () -> System.getProperty("os.name") + ); + + if (osName.equals("Linux")) { return LINUX; } + if (osName.contains("OS X")) { return BSD; } + if (osName.equals("SunOS")) { return SOLARIS; } + if (osName.equals("AIX")) { return AIX; } + + throw new Error(osName + " is not a supported OS platform."); + } + } + + private static final Platform platform = Platform.get(); + private static final LaunchMechanism launchMechanism = platform.launchMechanism(); + private static final byte[] helperpath = toCString(platform.helperPath()); + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + /* this is for the reaping thread */ + private native int waitForProcessExit(int pid); + + /** + * Creates a process. Depending on the {@code mode} flag, this is done by + * one of the following mechanisms: + *

    +     *   1 - fork(2) and exec(2)
    +     *   2 - posix_spawn(3P)
    +     *   3 - vfork(2) and exec(2)
    +     *
    +     *  (4 - clone(2) and exec(2) - obsolete and currently disabled in native code)
    +     * 
    + * @param fds an array of three file descriptors. + * Indexes 0, 1, and 2 correspond to standard input, + * standard output and standard error, respectively. On + * input, a value of -1 means to create a pipe to connect + * child and parent processes. On output, a value which + * is not -1 is the parent pipe fd corresponding to the + * pipe which has been created. An element of this array + * is -1 on input if and only if it is not -1 on + * output. + * @return the pid of the subprocess + */ + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, + byte[] argBlock, int argc, + byte[] envBlock, int envc, + byte[] dir, + int[] fds, + boolean redirectErrorStream) + throws IOException; + + /** + * The thread pool of "process reaper" daemon threads. + */ + private static final Executor processReaperExecutor = + doPrivileged((PrivilegedAction) () -> { + + ThreadGroup tg = Thread.currentThread().getThreadGroup(); + while (tg.getParent() != null) tg = tg.getParent(); + ThreadGroup systemThreadGroup = tg; + + ThreadFactory threadFactory = grimReaper -> { + // Our thread stack requirement is quite modest. + Thread t = new Thread(systemThreadGroup, grimReaper, + "process reaper", 32768); + t.setDaemon(true); + // A small attempt (probably futile) to avoid priority inversion + t.setPriority(Thread.MAX_PRIORITY); + return t; + }; + + return Executors.newCachedThreadPool(threadFactory); + }); + + UNIXProcess(final byte[] prog, + final byte[] argBlock, final int argc, + final byte[] envBlock, final int envc, + final byte[] dir, + final int[] fds, + final boolean redirectErrorStream) + throws IOException { + + pid = forkAndExec(launchMechanism.ordinal() + 1, + helperpath, + prog, + argBlock, argc, + envBlock, envc, + dir, + fds, + redirectErrorStream); + + try { + doPrivileged((PrivilegedExceptionAction) () -> { + initStreams(fds); + return null; + }); + } catch (PrivilegedActionException ex) { + throw (IOException) ex.getException(); + } + } + + static FileDescriptor newFileDescriptor(int fd) { + FileDescriptor fileDescriptor = new FileDescriptor(); + fdAccess.set(fileDescriptor, fd); + return fileDescriptor; + } + + void initStreams(int[] fds) throws IOException { + switch (platform) { + case LINUX: + case BSD: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + + if (stdout instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof ProcessPipeInputStream) + ((ProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + }); + break; + + case SOLARIS: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new BufferedOutputStream( + new FileOutputStream(newFileDescriptor(fds[0]))); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new BufferedInputStream( + stdout_inner_stream = + new DeferredCloseInputStream( + newFileDescriptor(fds[1]))); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseInputStream(newFileDescriptor(fds[2])); + + /* + * For each subprocess forked a corresponding reaper task + * is submitted. That task is the only thread which waits + * for the subprocess to terminate and it doesn't hold any + * locks while doing so. This design allows waitFor() and + * exitStatus() to be safely executed in parallel (and they + * need no native code). + */ + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + }); + break; + + case AIX: + stdin = (fds[0] == -1) ? + ProcessBuilder.NullOutputStream.INSTANCE : + new ProcessPipeOutputStream(fds[0]); + + stdout = (fds[1] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseProcessPipeInputStream(fds[1]); + + stderr = (fds[2] == -1) ? + ProcessBuilder.NullInputStream.INSTANCE : + new DeferredCloseProcessPipeInputStream(fds[2]); + + processReaperExecutor.execute(() -> { + int exitcode = waitForProcessExit(pid); + + synchronized (this) { + this.exitcode = exitcode; + this.hasExited = true; + this.notifyAll(); + } + + if (stdout instanceof DeferredCloseProcessPipeInputStream) + ((DeferredCloseProcessPipeInputStream) stdout).processExited(); + + if (stderr instanceof DeferredCloseProcessPipeInputStream) + ((DeferredCloseProcessPipeInputStream) stderr).processExited(); + + if (stdin instanceof ProcessPipeOutputStream) + ((ProcessPipeOutputStream) stdin).processExited(); + }); + break; + + default: throw new AssertionError("Unsupported platform: " + platform); + } + } + + public OutputStream getOutputStream() { + return stdin; + } + + public InputStream getInputStream() { + return stdout; + } + + public InputStream getErrorStream() { + return stderr; + } + + public synchronized int waitFor() throws InterruptedException { + while (!hasExited) { + wait(); + } + return exitcode; + } + + @Override + public synchronized boolean waitFor(long timeout, TimeUnit unit) + throws InterruptedException + { + if (hasExited) return true; + if (timeout <= 0) return false; + + long timeoutAsNanos = unit.toNanos(timeout); + long startTime = System.nanoTime(); + long rem = timeoutAsNanos; + + while (!hasExited && (rem > 0)) { + wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); + rem = timeoutAsNanos - (System.nanoTime() - startTime); + } + return hasExited; + } + + public synchronized int exitValue() { + if (!hasExited) { + throw new IllegalThreadStateException("process hasn't exited"); + } + return exitcode; + } + + private static native void destroyProcess(int pid, boolean force); + + private void destroy(boolean force) { + switch (platform) { + case LINUX: + case BSD: + case AIX: + // There is a risk that pid will be recycled, causing us to + // kill the wrong process! So we only terminate processes + // that appear to still be running. Even with this check, + // there is an unavoidable race condition here, but the window + // is very small, and OSes try hard to not recycle pids too + // soon, so this is quite safe. + synchronized (this) { + if (!hasExited) + destroyProcess(pid, force); + } + try { stdin.close(); } catch (IOException ignored) {} + try { stdout.close(); } catch (IOException ignored) {} + try { stderr.close(); } catch (IOException ignored) {} + break; + + case SOLARIS: + // There is a risk that pid will be recycled, causing us to + // kill the wrong process! So we only terminate processes + // that appear to still be running. Even with this check, + // there is an unavoidable race condition here, but the window + // is very small, and OSes try hard to not recycle pids too + // soon, so this is quite safe. + synchronized (this) { + if (!hasExited) + destroyProcess(pid, force); + try { + stdin.close(); + if (stdout_inner_stream != null) + stdout_inner_stream.closeDeferred(stdout); + if (stderr instanceof DeferredCloseInputStream) + ((DeferredCloseInputStream) stderr) + .closeDeferred(stderr); + } catch (IOException e) { + // ignore + } + } + break; + + default: throw new AssertionError("Unsupported platform: " + platform); + } + } + + public void destroy() { + destroy(false); + } + + @Override + public Process destroyForcibly() { + destroy(true); + return this; + } + + @Override + public synchronized boolean isAlive() { + return !hasExited; + } + + private static native void init(); + + static { + init(); + } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + */ + private static class ProcessPipeInputStream extends BufferedInputStream { + private final Object closeLock = new Object(); + + ProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + private static byte[] drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; + while ((j = in.available()) > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + n += in.read(a, n, j); + } + return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + synchronized (closeLock) { + try { + InputStream in = this.in; + // this stream is closed if and only if: in == null + if (in != null) { + byte[] stragglers = drainInputStream(in); + in.close(); + this.in = (stragglers == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(stragglers); + } + } catch (IOException ignored) {} + } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other + // methods. Synchronizing helps avoid race with processExited(). + synchronized (closeLock) { + super.close(); + } + } + } + + /** + * A buffered output stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + */ + private static class ProcessPipeOutputStream extends BufferedOutputStream { + ProcessPipeOutputStream(int fd) { + super(new FileOutputStream(newFileDescriptor(fd))); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + OutputStream out = this.out; + if (out != null) { + try { + out.close(); + } catch (IOException ignored) { + // We know of no reason to get an IOException, but if + // we do, there's nothing else to do but carry on. + } + this.out = ProcessBuilder.NullOutputStream.INSTANCE; + } + } + } + + // A FileInputStream that supports the deferment of the actual close + // operation until the last pending I/O operation on the stream has + // finished. This is required on Solaris because we must close the stdin + // and stdout streams in the destroy method in order to reclaim the + // underlying file descriptors. Doing so, however, causes any thread + // currently blocked in a read on one of those streams to receive an + // IOException("Bad file number"), which is incompatible with historical + // behavior. By deferring the close we allow any pending reads to see -1 + // (EOF) as they did before. + // + private static class DeferredCloseInputStream extends FileInputStream + { + DeferredCloseInputStream(FileDescriptor fd) { + super(fd); + } + + private Object lock = new Object(); // For the following fields + private boolean closePending = false; + private int useCount = 0; + private InputStream streamToClose; + + private void raise() { + synchronized (lock) { + useCount++; + } + } + + private void lower() throws IOException { + synchronized (lock) { + useCount--; + if (useCount == 0 && closePending) { + streamToClose.close(); + } + } + } + + // stc is the actual stream to be closed; it might be this object, or + // it might be an upstream object for which this object is downstream. + // + private void closeDeferred(InputStream stc) throws IOException { + synchronized (lock) { + if (useCount == 0) { + stc.close(); + } else { + closePending = true; + streamToClose = stc; + } + } + } + + public void close() throws IOException { + synchronized (lock) { + useCount = 0; + closePending = false; + } + super.close(); + } + + public int read() throws IOException { + raise(); + try { + return super.read(); + } finally { + lower(); + } + } + + public int read(byte[] b) throws IOException { + raise(); + try { + return super.read(b); + } finally { + lower(); + } + } + + public int read(byte[] b, int off, int len) throws IOException { + raise(); + try { + return super.read(b, off, len); + } finally { + lower(); + } + } + + public long skip(long n) throws IOException { + raise(); + try { + return super.skip(n); + } finally { + lower(); + } + } + + public int available() throws IOException { + raise(); + try { + return super.available(); + } finally { + lower(); + } + } + } + + /** + * A buffered input stream for a subprocess pipe file descriptor + * that allows the underlying file descriptor to be reclaimed when + * the process exits, via the processExited hook. + * + * This is tricky because we do not want the user-level InputStream to be + * closed until the user invokes close(), and we need to continue to be + * able to read any buffered data lingering in the OS pipe buffer. + * + * On AIX this is especially tricky, because the 'close()' system call + * will block if another thread is at the same time blocked in a file + * operation (e.g. 'read()') on the same file descriptor. We therefore + * combine 'ProcessPipeInputStream' approach used on Linux and Bsd + * with the DeferredCloseInputStream approach used on Solaris. This means + * that every potentially blocking operation on the file descriptor + * increments a counter before it is executed and decrements it once it + * finishes. The 'close()' operation will only be executed if there are + * no pending operations. Otherwise it is deferred after the last pending + * operation has finished. + * + */ + private static class DeferredCloseProcessPipeInputStream + extends BufferedInputStream { + + private final Object closeLock = new Object(); + private int useCount = 0; + private boolean closePending = false; + + DeferredCloseProcessPipeInputStream(int fd) { + super(new FileInputStream(newFileDescriptor(fd))); + } + + private InputStream drainInputStream(InputStream in) + throws IOException { + int n = 0; + int j; + byte[] a = null; + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + j = in.available(); + } + while (j > 0) { + a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); + synchronized (closeLock) { + if (buf == null) // asynchronous close()? + return null; // discard + n += in.read(a, n, j); + j = in.available(); + } + } + return (a == null) ? + ProcessBuilder.NullInputStream.INSTANCE : + new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); + } + + /** Called by the process reaper thread when the process exits. */ + synchronized void processExited() { + try { + InputStream in = this.in; + if (in != null) { + InputStream stragglers = drainInputStream(in); + in.close(); + this.in = stragglers; + } + } catch (IOException ignored) { } + } + + private void raise() { + synchronized (closeLock) { + useCount++; + } + } + + private void lower() throws IOException { + synchronized (closeLock) { + useCount--; + if (useCount == 0 && closePending) { + closePending = false; + super.close(); + } + } + } + + @Override + public int read() throws IOException { + raise(); + try { + return super.read(); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b) throws IOException { + raise(); + try { + return super.read(b); + } finally { + lower(); + } + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + raise(); + try { + return super.read(b, off, len); + } finally { + lower(); + } + } + + @Override + public long skip(long n) throws IOException { + raise(); + try { + return super.skip(n); + } finally { + lower(); + } + } + + @Override + public int available() throws IOException { + raise(); + try { + return super.available(); + } finally { + lower(); + } + } + + @Override + public void close() throws IOException { + // BufferedInputStream#close() is not synchronized unlike most other + // methods. Synchronizing helps avoid racing with drainInputStream(). + synchronized (closeLock) { + if (useCount == 0) { + super.close(); + } + else { + closePending = true; + } + } + } + } +} diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix deleted file mode 100644 index 24216461657..00000000000 --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.aix +++ /dev/null @@ -1,504 +0,0 @@ -/* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Linux) - * @author Martin Buchholz - * @author Volker Simonis (ported to AIX) - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On AIX, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - clone(2) and exec(2) - * - vfork(2) and exec(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - * - * On AIX this is especially tricky, because the 'close()' system call - * will block if another thread is at the same time blocked in a file - * operation (e.g. 'read()') on the same file descriptor. We therefore - * combine this 'ProcessPipeInputStream' with the DeferredCloseInputStream - * approach used on Solaris (see "UNIXProcess.java.solaris"). This means - * that every potentially blocking operation on the file descriptor - * increments a counter before it is executed and decrements it once it - * finishes. The 'close()' operation will only be executed if there are - * no pending operations. Otherwise it is deferred after the last pending - * operation has finished. - * - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - private int useCount = 0; - private boolean closePending = false; - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - - private InputStream drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - synchronized (closeLock) { - if (buf == null) // asynchronous close()? - return null; // discard - j = in.available(); - } - while (j > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - synchronized (closeLock) { - if (buf == null) // asynchronous close()? - return null; // discard - n += in.read(a, n, j); - j = in.available(); - } - } - return (a == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(n == a.length ? a : Arrays.copyOf(a, n)); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - try { - InputStream in = this.in; - if (in != null) { - InputStream stragglers = drainInputStream(in); - in.close(); - this.in = stragglers; - } - } catch (IOException ignored) { } - } - - private void raise() { - synchronized (closeLock) { - useCount++; - } - } - - private void lower() throws IOException { - synchronized (closeLock) { - useCount--; - if (useCount == 0 && closePending) { - closePending = false; - super.close(); - } - } - } - - @Override - public int read() throws IOException { - raise(); - try { - return super.read(); - } finally { - lower(); - } - } - - @Override - public int read(byte[] b) throws IOException { - raise(); - try { - return super.read(b); - } finally { - lower(); - } - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - raise(); - try { - return super.read(b, off, len); - } finally { - lower(); - } - } - - @Override - public long skip(long n) throws IOException { - raise(); - try { - return super.skip(n); - } finally { - lower(); - } - } - - @Override - public int available() throws IOException { - raise(); - try { - return super.available(); - } finally { - lower(); - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid racing with drainInputStream(). - synchronized (closeLock) { - if (useCount == 0) { - super.close(); - } - else { - closePending = true; - } - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd deleted file mode 100644 index 8f2069e09db..00000000000 --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.bsd +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Bsd) - * @author Martin Buchholz - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On BSD, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - - helperpath = toCString(javahome + "/lib/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - posix_spawn(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - private static byte[] drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - while ((j = in.available()) > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - n += in.read(a, n, j); - } - return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - synchronized (closeLock) { - try { - InputStream in = this.in; - // this stream is closed if and only if: in == null - if (in != null) { - byte[] stragglers = drainInputStream(in); - in.close(); - this.in = (stragglers == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(stragglers); - } - } catch (IOException ignored) {} - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid race with processExited(). - synchronized (closeLock) { - super.close(); - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux deleted file mode 100644 index 33574958c1c..00000000000 --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.lang; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Arrays; -import java.util.concurrent.Executors; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import static java.security.AccessController.doPrivileged; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; - -/** - * java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - * @author Konstantin Kladko (ported to Linux) - * @author Martin Buchholz - */ -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private /* final */ OutputStream stdin; - private /* final */ InputStream stdout; - private /* final */ InputStream stderr; - - private static enum LaunchMechanism { - FORK(1), - VFORK(3); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* default is VFORK on Linux */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "vfork"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - clone(2) and exec(2) - * - vfork(2) and exec(2) - * - * @param fds an array of three file descriptors. - * Indexes 0, 1, and 2 correspond to standard input, - * standard output and standard error, respectively. On - * input, a value of -1 means to create a pipe to connect - * child and parent processes. On output, a value which - * is not -1 is the parent pipe fd corresponding to the - * pipe which has been created. An element of this array - * is -1 on input if and only if it is not -1 on - * output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] fds, - boolean redirectErrorStream) - throws IOException; - - /** - * The thread factory used to create "process reaper" daemon threads. - */ - private static class ProcessReaperThreadFactory implements ThreadFactory { - private final static ThreadGroup group = getRootThreadGroup(); - - private static ThreadGroup getRootThreadGroup() { - return doPrivileged(new PrivilegedAction () { - public ThreadGroup run() { - ThreadGroup root = Thread.currentThread().getThreadGroup(); - while (root.getParent() != null) - root = root.getParent(); - return root; - }}); - } - - public Thread newThread(Runnable grimReaper) { - // Our thread stack requirement is quite modest. - Thread t = new Thread(group, grimReaper, "process reaper", 32768); - t.setDaemon(true); - // A small attempt (probably futile) to avoid priority inversion - t.setPriority(Thread.MAX_PRIORITY); - return t; - } - } - - /** - * The thread pool of "process reaper" daemon threads. - */ - private static final Executor processReaperExecutor = - doPrivileged(new PrivilegedAction() { - public Executor run() { - return Executors.newCachedThreadPool - (new ProcessReaperThreadFactory()); - }}); - - UNIXProcess(final byte[] prog, - final byte[] argBlock, final int argc, - final byte[] envBlock, final int envc, - final byte[] dir, - final int[] fds, - final boolean redirectErrorStream) - throws IOException { - - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - fds, - redirectErrorStream); - - try { - doPrivileged(new PrivilegedExceptionAction() { - public Void run() throws IOException { - initStreams(fds); - return null; - }}); - } catch (PrivilegedActionException ex) { - throw (IOException) ex.getException(); - } - } - - static FileDescriptor newFileDescriptor(int fd) { - FileDescriptor fileDescriptor = new FileDescriptor(); - fdAccess.set(fileDescriptor, fd); - return fileDescriptor; - } - - void initStreams(int[] fds) throws IOException { - stdin = (fds[0] == -1) ? - ProcessBuilder.NullOutputStream.INSTANCE : - new ProcessPipeOutputStream(fds[0]); - - stdout = (fds[1] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[1]); - - stderr = (fds[2] == -1) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ProcessPipeInputStream(fds[2]); - - processReaperExecutor.execute(new Runnable() { - public void run() { - int exitcode = waitForProcessExit(pid); - UNIXProcess.this.processExited(exitcode); - }}); - } - - void processExited(int exitcode) { - synchronized (this) { - this.exitcode = exitcode; - hasExited = true; - notifyAll(); - } - - if (stdout instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stdout).processExited(); - - if (stderr instanceof ProcessPipeInputStream) - ((ProcessPipeInputStream) stderr).processExited(); - - if (stdin instanceof ProcessPipeOutputStream) - ((ProcessPipeOutputStream) stdin).processExited(); - } - - public OutputStream getOutputStream() { - return stdin; - } - - public InputStream getInputStream() { - return stdout; - } - - public InputStream getErrorStream() { - return stderr; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - synchronized (this) { - if (!hasExited) - destroyProcess(pid, force); - } - try { stdin.close(); } catch (IOException ignored) {} - try { stdout.close(); } catch (IOException ignored) {} - try { stderr.close(); } catch (IOException ignored) {} - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - private static native void init(); - - static { - init(); - } - - /** - * A buffered input stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - * - * This is tricky because we do not want the user-level InputStream to be - * closed until the user invokes close(), and we need to continue to be - * able to read any buffered data lingering in the OS pipe buffer. - */ - static class ProcessPipeInputStream extends BufferedInputStream { - private final Object closeLock = new Object(); - - ProcessPipeInputStream(int fd) { - super(new FileInputStream(newFileDescriptor(fd))); - } - private static byte[] drainInputStream(InputStream in) - throws IOException { - int n = 0; - int j; - byte[] a = null; - while ((j = in.available()) > 0) { - a = (a == null) ? new byte[j] : Arrays.copyOf(a, n + j); - n += in.read(a, n, j); - } - return (a == null || n == a.length) ? a : Arrays.copyOf(a, n); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - synchronized (closeLock) { - try { - InputStream in = this.in; - // this stream is closed if and only if: in == null - if (in != null) { - byte[] stragglers = drainInputStream(in); - in.close(); - this.in = (stragglers == null) ? - ProcessBuilder.NullInputStream.INSTANCE : - new ByteArrayInputStream(stragglers); - } - } catch (IOException ignored) {} - } - } - - @Override - public void close() throws IOException { - // BufferedInputStream#close() is not synchronized unlike most other methods. - // Synchronizing helps avoid race with processExited(). - synchronized (closeLock) { - super.close(); - } - } - } - - /** - * A buffered output stream for a subprocess pipe file descriptor - * that allows the underlying file descriptor to be reclaimed when - * the process exits, via the processExited hook. - */ - static class ProcessPipeOutputStream extends BufferedOutputStream { - ProcessPipeOutputStream(int fd) { - super(new FileOutputStream(newFileDescriptor(fd))); - } - - /** Called by the process reaper thread when the process exits. */ - synchronized void processExited() { - OutputStream out = this.out; - if (out != null) { - try { - out.close(); - } catch (IOException ignored) { - // We know of no reason to get an IOException, but if - // we do, there's nothing else to do but carry on. - } - this.out = ProcessBuilder.NullOutputStream.INSTANCE; - } - } - } -} diff --git a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris b/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris deleted file mode 100644 index 7160b24d41f..00000000000 --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java.solaris +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.lang; - -import java.io.*; -import java.util.concurrent.TimeUnit; -import java.security.AccessController; -import java.security.PrivilegedAction; - -/* java.lang.Process subclass in the UNIX environment. - * - * @author Mario Wolczko and Ross Knippel. - */ - -final class UNIXProcess extends Process { - private static final sun.misc.JavaIOFileDescriptorAccess fdAccess - = sun.misc.SharedSecrets.getJavaIOFileDescriptorAccess(); - - private final int pid; - private int exitcode; - private boolean hasExited; - - private OutputStream stdin_stream; - private InputStream stdout_stream; - private DeferredCloseInputStream stdout_inner_stream; - private InputStream stderr_stream; - - private static enum LaunchMechanism { - FORK(1), - POSIX_SPAWN(2); - - private int value; - LaunchMechanism(int x) {value = x;} - }; - - /* On Solaris, the default is to spawn */ - private static final LaunchMechanism launchMechanism; - private static byte[] helperpath; - - private static byte[] toCString(String s) { - if (s == null) - return null; - byte[] bytes = s.getBytes(); - byte[] result = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, - result, 0, - bytes.length); - result[result.length-1] = (byte)0; - return result; - } - - static { - launchMechanism = AccessController.doPrivileged( - new PrivilegedAction() - { - public LaunchMechanism run() { - String javahome = System.getProperty("java.home"); - String osArch = System.getProperty("os.arch"); - if (osArch.equals("x86")) { - osArch = "i386"; - } else if (osArch.equals("x86_64")) { - osArch = "amd64"; - } - - helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); - String s = System.getProperty( - "jdk.lang.Process.launchMechanism", "posix_spawn"); - - try { - return LaunchMechanism.valueOf(s.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new Error(s + " is not a supported " + - "process launch mechanism on this platform."); - } - } - }); - } - - /* this is for the reaping thread */ - private native int waitForProcessExit(int pid); - - /** - * Create a process. Depending on the mode flag, this is done by - * one of the following mechanisms. - * - fork(2) and exec(2) - * - posix_spawn(2) - * - * @param std_fds array of file descriptors. Indexes 0, 1, and - * 2 correspond to standard input, standard output and - * standard error, respectively. On input, a value of -1 - * means to create a pipe to connect child and parent - * processes. On output, a value which is not -1 is the - * parent pipe fd corresponding to the pipe which has - * been created. An element of this array is -1 on input - * if and only if it is not -1 on output. - * @return the pid of the subprocess - */ - private native int forkAndExec(int mode, byte[] helperpath, - byte[] prog, - byte[] argBlock, int argc, - byte[] envBlock, int envc, - byte[] dir, - int[] std_fds, - boolean redirectErrorStream) - throws IOException; - - UNIXProcess(final byte[] prog, - final byte[] argBlock, int argc, - final byte[] envBlock, int envc, - final byte[] dir, - final int[] std_fds, - final boolean redirectErrorStream) - throws IOException { - pid = forkAndExec(launchMechanism.value, - helperpath, - prog, - argBlock, argc, - envBlock, envc, - dir, - std_fds, - redirectErrorStream); - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { public Void run() { - if (std_fds[0] == -1) - stdin_stream = ProcessBuilder.NullOutputStream.INSTANCE; - else { - FileDescriptor stdin_fd = new FileDescriptor(); - fdAccess.set(stdin_fd, std_fds[0]); - stdin_stream = new BufferedOutputStream( - new FileOutputStream(stdin_fd)); - } - - if (std_fds[1] == -1) - stdout_stream = ProcessBuilder.NullInputStream.INSTANCE; - else { - FileDescriptor stdout_fd = new FileDescriptor(); - fdAccess.set(stdout_fd, std_fds[1]); - stdout_inner_stream = new DeferredCloseInputStream(stdout_fd); - stdout_stream = new BufferedInputStream(stdout_inner_stream); - } - - if (std_fds[2] == -1) - stderr_stream = ProcessBuilder.NullInputStream.INSTANCE; - else { - FileDescriptor stderr_fd = new FileDescriptor(); - fdAccess.set(stderr_fd, std_fds[2]); - stderr_stream = new DeferredCloseInputStream(stderr_fd); - } - - return null; }}); - - /* - * For each subprocess forked a corresponding reaper thread - * is started. That thread is the only thread which waits - * for the subprocess to terminate and it doesn't hold any - * locks while doing so. This design allows waitFor() and - * exitStatus() to be safely executed in parallel (and they - * need no native code). - */ - - java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { public Void run() { - Thread t = new Thread("process reaper") { - public void run() { - int res = waitForProcessExit(pid); - synchronized (UNIXProcess.this) { - hasExited = true; - exitcode = res; - UNIXProcess.this.notifyAll(); - } - } - }; - t.setDaemon(true); - t.start(); - return null; }}); - } - - public OutputStream getOutputStream() { - return stdin_stream; - } - - public InputStream getInputStream() { - return stdout_stream; - } - - public InputStream getErrorStream() { - return stderr_stream; - } - - public synchronized int waitFor() throws InterruptedException { - while (!hasExited) { - wait(); - } - return exitcode; - } - - @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException - { - if (hasExited) return true; - if (timeout <= 0) return false; - - long timeoutAsNanos = unit.toNanos(timeout); - long startTime = System.nanoTime(); - long rem = timeoutAsNanos; - - while (!hasExited && (rem > 0)) { - wait(Math.max(TimeUnit.NANOSECONDS.toMillis(rem), 1)); - rem = timeoutAsNanos - (System.nanoTime() - startTime); - } - return hasExited; - } - - public synchronized int exitValue() { - if (!hasExited) { - throw new IllegalThreadStateException("process hasn't exited"); - } - return exitcode; - } - - private static native void destroyProcess(int pid, boolean force); - private synchronized void destroy(boolean force) { - // There is a risk that pid will be recycled, causing us to - // kill the wrong process! So we only terminate processes - // that appear to still be running. Even with this check, - // there is an unavoidable race condition here, but the window - // is very small, and OSes try hard to not recycle pids too - // soon, so this is quite safe. - if (!hasExited) - destroyProcess(pid, force); - try { - stdin_stream.close(); - if (stdout_inner_stream != null) - stdout_inner_stream.closeDeferred(stdout_stream); - if (stderr_stream instanceof DeferredCloseInputStream) - ((DeferredCloseInputStream) stderr_stream) - .closeDeferred(stderr_stream); - } catch (IOException e) { - // ignore - } - } - - public void destroy() { - destroy(false); - } - - @Override - public Process destroyForcibly() { - destroy(true); - return this; - } - - @Override - public synchronized boolean isAlive() { - return !hasExited; - } - - // A FileInputStream that supports the deferment of the actual close - // operation until the last pending I/O operation on the stream has - // finished. This is required on Solaris because we must close the stdin - // and stdout streams in the destroy method in order to reclaim the - // underlying file descriptors. Doing so, however, causes any thread - // currently blocked in a read on one of those streams to receive an - // IOException("Bad file number"), which is incompatible with historical - // behavior. By deferring the close we allow any pending reads to see -1 - // (EOF) as they did before. - // - private static class DeferredCloseInputStream - extends FileInputStream - { - - private DeferredCloseInputStream(FileDescriptor fd) { - super(fd); - } - - private Object lock = new Object(); // For the following fields - private boolean closePending = false; - private int useCount = 0; - private InputStream streamToClose; - - private void raise() { - synchronized (lock) { - useCount++; - } - } - - private void lower() throws IOException { - synchronized (lock) { - useCount--; - if (useCount == 0 && closePending) { - streamToClose.close(); - } - } - } - - // stc is the actual stream to be closed; it might be this object, or - // it might be an upstream object for which this object is downstream. - // - private void closeDeferred(InputStream stc) throws IOException { - synchronized (lock) { - if (useCount == 0) { - stc.close(); - } else { - closePending = true; - streamToClose = stc; - } - } - } - - public void close() throws IOException { - synchronized (lock) { - useCount = 0; - closePending = false; - } - super.close(); - } - - public int read() throws IOException { - raise(); - try { - return super.read(); - } finally { - lower(); - } - } - - public int read(byte[] b) throws IOException { - raise(); - try { - return super.read(b); - } finally { - lower(); - } - } - - public int read(byte[] b, int off, int len) throws IOException { - raise(); - try { - return super.read(b, off, len); - } finally { - lower(); - } - } - - public long skip(long n) throws IOException { - raise(); - try { - return super.skip(n); - } finally { - lower(); - } - } - - public int available() throws IOException { - raise(); - try { - return super.available(); - } finally { - lower(); - } - } - - } - - private static native void init(); - - static { - init(); - } -} diff --git a/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java b/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java index d58a4c100f6..ad344f1411e 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java +++ b/jdk/src/solaris/classes/sun/tools/attach/BsdVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -24,14 +24,14 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; -import java.util.Properties; /* * Bsd implementation of HotSpotVirtualMachine @@ -191,6 +191,8 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { } if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); // In the event of a protocol mismatch then the target VM @@ -205,7 +207,11 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } @@ -237,8 +243,9 @@ public class BsdVirtualMachine extends HotSpotVirtualMachine { if ((off < 0) || (off > bs.length) || (len < 0) || ((off + len) > bs.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); - } else if (len == 0) + } else if (len == 0) { return 0; + } return BsdVirtualMachine.read(s, bs, off, len); } diff --git a/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java b/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java index 1e08d70446e..9dec425da0d 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java +++ b/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -24,14 +24,14 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; -import java.util.Properties; /* * Linux implementation of HotSpotVirtualMachine @@ -207,6 +207,8 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { } if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); // In the event of a protocol mismatch then the target VM @@ -221,7 +223,11 @@ public class LinuxVirtualMachine extends HotSpotVirtualMachine { if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff --git a/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java b/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java index c7dcf21cf03..3c57e4bda6a 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java +++ b/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -24,15 +24,15 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import java.io.InputStream; import java.io.IOException; import java.io.File; import java.io.FileNotFoundException; -import java.util.Properties; /* * Solaris implementation of HotSpotVirtualMachine. @@ -147,11 +147,17 @@ public class SolarisVirtualMachine extends HotSpotVirtualMachine { // If non-0 it means an error but we need to special-case the // "load" command to ensure that the right exception is thrown. if (completionStatus != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(sis); sis.close(); if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff --git a/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c b/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c index dbc751fa366..7735a90b4ba 100644 --- a/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c +++ b/jdk/src/solaris/native/sun/tools/attach/BsdVirtualMachine.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -200,14 +200,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_BsdVirtualMachine_read len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff --git a/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c b/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c index 5646a326542..855ad9299f7 100644 --- a/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c +++ b/jdk/src/solaris/native/sun/tools/attach/LinuxVirtualMachine.c @@ -418,14 +418,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_LinuxVirtualMachine_read len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff --git a/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c b/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c index 45b38eafe5e..32dd249f321 100644 --- a/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c +++ b/jdk/src/solaris/native/sun/tools/attach/SolarisVirtualMachine.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -161,14 +161,14 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_SolarisVirtualMachine_read len = remaining; } - RESTARTABLE(read(fd, buf+off, len), n); + RESTARTABLE(read(fd, buf, len), n); if (n == -1) { JNU_ThrowIOExceptionWithLastError(env, "read"); } else { if (n == 0) { n = -1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)n, (jbyte *)(buf)); } } return n; diff --git a/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java b/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java index 6ea66773f1d..3b34c0d181a 100644 --- a/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java +++ b/jdk/src/windows/classes/sun/tools/attach/WindowsVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 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 @@ -24,15 +24,15 @@ */ package sun.tools.attach; -import com.sun.tools.attach.VirtualMachine; +import com.sun.tools.attach.AttachOperationFailedException; import com.sun.tools.attach.AgentLoadException; import com.sun.tools.attach.AttachNotSupportedException; import com.sun.tools.attach.spi.AttachProvider; + import sun.tools.attach.HotSpotVirtualMachine; + import java.io.IOException; -import java.io.File; import java.io.InputStream; -import java.util.Properties; import java.util.Random; public class WindowsVirtualMachine extends HotSpotVirtualMachine { @@ -105,11 +105,17 @@ public class WindowsVirtualMachine extends HotSpotVirtualMachine { // read completion status int status = readInt(is); if (status != 0) { + // read from the stream and use that as the error message + String message = readErrorMessage(is); // special case the load command so that the right exception is thrown if (cmd.equals("load")) { throw new AgentLoadException("Failed to load agent library"); } else { - throw new IOException("Command failed in target VM"); + if (message == null) { + throw new AttachOperationFailedException("Command failed in target VM"); + } else { + throw new AttachOperationFailedException(message); + } } } diff --git a/jdk/src/windows/lib/security/java.policy b/jdk/src/windows/lib/security/java.policy new file mode 100644 index 00000000000..05368dee3cf --- /dev/null +++ b/jdk/src/windows/lib/security/java.policy @@ -0,0 +1,3 @@ +grant codeBase "file:${java.home}/lib/ext/sunmscapi.jar" { + permission java.security.AllPermission; +}; diff --git a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c index ad6df257d50..94fb2f72ceb 100644 --- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c +++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c @@ -343,7 +343,7 @@ JNIEXPORT jint JNICALL Java_sun_tools_attach_WindowsVirtualMachine_readPipe if (nread == 0) { return (jint)-1; // EOF } else { - (*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf+off)); + (*env)->SetByteArrayRegion(env, ba, off, (jint)nread, (jbyte *)(buf)); } } diff --git a/jdk/test/TEST.groups b/jdk/test/TEST.groups index 812a30e7108..9efa1bd05c3 100644 --- a/jdk/test/TEST.groups +++ b/jdk/test/TEST.groups @@ -97,7 +97,8 @@ jdk_io = \ jdk_nio = \ java/nio \ - sun/nio + sun/nio \ + jdk/nio jdk_net = \ java/net \ @@ -203,7 +204,6 @@ jdk_other = \ com/sun/jndi \ com/sun/corba \ lib/testlibrary \ - jdk/nio/zipfs \ sample # diff --git a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java index 9bc7c86b452..378310cf56a 100644 --- a/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java +++ b/jdk/test/com/sun/management/HotSpotDiagnosticMXBean/CheckOrigin.java @@ -26,6 +26,7 @@ * @bug 8028994 * @author Staffan Larsen * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main CheckOrigin */ diff --git a/jdk/test/com/sun/tools/attach/BasicTests.java b/jdk/test/com/sun/tools/attach/BasicTests.java index 95cf4dcd2fe..f380c28b3a7 100644 --- a/jdk/test/com/sun/tools/attach/BasicTests.java +++ b/jdk/test/com/sun/tools/attach/BasicTests.java @@ -38,7 +38,7 @@ import jdk.testlibrary.ProcessThread; * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil + * @run build jdk.testlibrary.* Agent BadAgent RedefineAgent Application Shutdown RedefineDummy RunnerUtil * @run main BasicTests * * This test will perform a number of basic attach tests. diff --git a/jdk/test/com/sun/tools/attach/PermissionTest.java b/jdk/test/com/sun/tools/attach/PermissionTest.java index 933ec2c23e8..5ac458a3754 100644 --- a/jdk/test/com/sun/tools/attach/PermissionTest.java +++ b/jdk/test/com/sun/tools/attach/PermissionTest.java @@ -34,7 +34,7 @@ import jdk.testlibrary.ProcessThread; * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build Application Shutdown + * @run build jdk.testlibrary.* Application Shutdown * @run main PermissionTest * * Unit test for Attach API - diff --git a/jdk/test/com/sun/tools/attach/ProviderTest.java b/jdk/test/com/sun/tools/attach/ProviderTest.java index 58ea6d5e75a..883951f444d 100644 --- a/jdk/test/com/sun/tools/attach/ProviderTest.java +++ b/jdk/test/com/sun/tools/attach/ProviderTest.java @@ -33,7 +33,7 @@ import com.sun.tools.attach.spi.AttachProvider; * @bug 6173612 6273707 6277253 6335921 6348630 6342019 6381757 * @summary Basic unit tests for the VM attach mechanism. * @library /lib/testlibrary - * @run build SimpleProvider + * @run build jdk.testlibrary.* SimpleProvider * @run main ProviderTest * * The test will attach and detach to/from the running Application. diff --git a/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java b/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java index 2555a1faa5f..74aeda92932 100644 --- a/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java +++ b/jdk/test/java/io/BufferedInputStream/LargeCopyWithMark.java @@ -26,6 +26,7 @@ * @summary BufferedInputStream calculates negative array size with large * streams and mark * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main/othervm LargeCopyWithMark */ diff --git a/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java b/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java index dff61742225..a72cdbe9c99 100644 --- a/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java +++ b/jdk/test/java/lang/ProcessBuilder/SecurityManagerClinit.java @@ -54,9 +54,6 @@ public class SecurityManagerClinit { System.getProperty("java.home") + File.separator + "bin" + File.separator + "java"; - // A funky contrived security setup, just for bug repro purposes. - java.security.Security.setProperty("package.access", "java.util"); - final Policy policy = new Policy (new FilePermission("<>", "execute"), diff --git a/jdk/test/java/lang/String/ToLowerCase.java b/jdk/test/java/lang/String/ToLowerCase.java index c7c43993ec9..5aebf7275e0 100644 --- a/jdk/test/java/lang/String/ToLowerCase.java +++ b/jdk/test/java/lang/String/ToLowerCase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -23,7 +23,7 @@ /* @test - @bug 4217441 4533872 4900935 8020037 8032012 + @bug 4217441 4533872 4900935 8020037 8032012 8041791 @summary toLowerCase should lower-case Greek Sigma correctly depending on the context (final/non-final). Also it should handle Locale specific (lt, tr, and az) lowercasings and supplementary @@ -72,8 +72,10 @@ public class ToLowerCase { // I-dot tests test("\u0130", turkish, "i"); test("\u0130", az, "i"); - test("\u0130", lt, "i"); - test("\u0130", Locale.US, "i"); + test("\u0130", lt, "\u0069\u0307"); + test("\u0130", Locale.US, "\u0069\u0307"); + test("\u0130", Locale.JAPAN, "\u0069\u0307"); + test("\u0130", Locale.ROOT, "\u0069\u0307"); // Remove dot_above in the sequence I + dot_above (Turkish and Azeri) test("I\u0307", turkish, "i"); @@ -111,6 +113,12 @@ public class ToLowerCase { if (cp >= Character.MIN_HIGH_SURROGATE && cp <= Character.MAX_HIGH_SURROGATE) { continue; } + if (cp == 0x0130) { + // Although UnicodeData.txt has the lower case char as \u0069, it should be + // handled with the rules in SpecialCasing.txt, i.e., \u0069\u0307 in + // non Turkic locales. + continue; + } int lowerCase = Character.toLowerCase(cp); if (lowerCase == -1) { //Character.ERROR continue; diff --git a/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java index 9d08a7bd9ec..d9710d3bece 100644 --- a/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java +++ b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java @@ -30,7 +30,7 @@ import jdk.testlibrary.Utils; * @bug 6289149 * @summary test when the agent's class is missing the premain() function. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run shell ../MakeJAR3.sh NoPremainAgent * @run main NoPremainAgentTest */ diff --git a/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java b/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java index 9ebe4a68d2c..2d20ae98dc0 100644 --- a/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java +++ b/jdk/test/java/lang/instrument/PremainClass/PremainClassTest.java @@ -30,7 +30,7 @@ import jdk.testlibrary.Utils; * @bug 5055293 * @summary Test non ascii characters in the Premain-Class attribute. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run main PremainClassTest */ public class PremainClassTest { diff --git a/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java index 7b67e4c31b7..fb6fab1a677 100644 --- a/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java +++ b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java @@ -30,7 +30,7 @@ import jdk.testlibrary.Utils; * @bug 6289149 * @summary test when the agent's class has a zero arg premain() function. * @library /lib/testlibrary - * @run build DummyMain + * @run build jdk.testlibrary.* DummyMain * @run shell ../MakeJAR3.sh ZeroArgPremainAgent * @run main ZeroArgPremainAgentTest */ diff --git a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java index 1309e9c3949..64224d23306 100644 --- a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java +++ b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java @@ -31,7 +31,7 @@ * @author Mandy Chung * * @library /lib/testlibrary/ - * @build CollectionUsageThreshold MemoryUtil RunUtil + * @build jdk.testlibrary.* CollectionUsageThreshold MemoryUtil RunUtil * @run main/timeout=300 CollectionUsageThreshold */ diff --git a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java index 379b1293060..891e2fbd4cb 100644 --- a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java +++ b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java @@ -31,7 +31,7 @@ * @author Mandy Chung * * @library /lib/testlibrary/ - * @build LowMemoryTest MemoryUtil RunUtil + * @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil * @run main/timeout=600 LowMemoryTest */ diff --git a/jdk/test/java/net/Authenticator/B8034170.java b/jdk/test/java/net/Authenticator/B8034170.java new file mode 100644 index 00000000000..3767732c2e8 --- /dev/null +++ b/jdk/test/java/net/Authenticator/B8034170.java @@ -0,0 +1,192 @@ +/* + * 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. + */ + +import java.io.*; +import java.net.*; +import java.util.*; + +/** + * @test + * @bug 8034170 + * @summary Digest authentication interop issue + * @run main/othervm B8034170 unquoted + * @run main/othervm -Dhttp.auth.digest.quoteParameters=true B8034170 quoted + */ + +public class B8034170 { + + static boolean expectQuotes; + + static class BasicServer extends Thread { + + ServerSocket server; + + Socket s; + InputStream is; + OutputStream os; + + static final String realm = "wallyworld"; + + String reply1 = "HTTP/1.1 401 Unauthorized\r\n"+ + "WWW-Authenticate: Digest realm=\""+realm+"\", qop=\"auth\"" + + ", nonce=\"8989de95ea2402b64d73cecdb15da255\"" + + ", opaque=\"bbfb4c9ee92ddccc73521c3e6e841ba2\"\r\n\r\n"; + + String OKreply = "HTTP/1.1 200 OK\r\n"+ + "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + + "Server: Apache/1.3.14 (Unix)\r\n" + + "Connection: close\r\n" + + "Content-Type: text/plain; charset=iso-8859-1\r\n" + + "Content-Length: 10\r\n\r\n"; + + String ERRreply = "HTTP/1.1 500 Internal server error\r\n"+ + "Date: Mon, 15 Jan 2001 12:18:21 GMT\r\n" + + "Server: Apache/1.3.14 (Unix)\r\n" + + "Connection: close\r\n" + + "Content-Length: 0\r\n\r\n"; + + BasicServer (ServerSocket s) { + server = s; + } + + int readAll (Socket s, byte[] buf) throws IOException { + int pos = 0; + InputStream is = s.getInputStream (); + // wait two seconds for request, as client doesn't close + // the connection + s.setSoTimeout(2000); + try { + int n; + while ((n=is.read(buf, pos, buf.length-pos)) > 0) + pos +=n; + } catch (SocketTimeoutException x) { } + return pos; + } + + public void run () { + byte[] buf = new byte[5000]; + try { + System.out.println ("Server 1: accept"); + s = server.accept (); + System.out.println ("accepted"); + os = s.getOutputStream(); + os.write (reply1.getBytes()); + readAll (s, buf); + s.close (); + + System.out.println ("Server 2: accept"); + s = server.accept (); + System.out.println ("accepted"); + os = s.getOutputStream(); + int count = readAll (s, buf); + String reply = new String(buf, 0, count); + + boolean error; + + if (expectQuotes) { + error = false; + if (!reply.contains("qop=\"auth\"")) { + System.out.println ("Expecting quoted qop. Not found"); + error = true; + } + if (!reply.contains("algorithm=\"MD5\"")) { + System.out.println ("Expecting quoted algorithm. Not found"); + error = true; + } + } else { + error = false; + if (!reply.contains("qop=auth")) { + System.out.println ("Expecting unquoted qop. Not found"); + error = true; + } + if (!reply.contains("algorithm=MD5")) { + System.out.println ("Expecting unquoted algorithm. Not found"); + error = true; + } + } + if (error) { + os.write(ERRreply.getBytes()); + os.flush(); + s.close(); + } else { + os.write((OKreply+"HelloWorld").getBytes()); + os.flush(); + s.close(); + } + } + catch (Exception e) { + System.out.println (e); + } + finished (); + } + + public synchronized void finished () { + notifyAll(); + } + + } + + static class MyAuthenticator3 extends Authenticator { + PasswordAuthentication pw; + MyAuthenticator3 () { + super (); + pw = new PasswordAuthentication ("user", "passwordNotCheckedAnyway".toCharArray()); + } + + public PasswordAuthentication getPasswordAuthentication () + { + System.out.println ("Auth called"); + return pw; + } + } + + + static void read (InputStream is) throws IOException { + int c; + System.out.println ("reading"); + while ((c=is.read()) != -1) { + System.out.write (c); + } + System.out.println (""); + System.out.println ("finished reading"); + } + + public static void main (String args[]) throws Exception { + expectQuotes = args[0].equals("quoted"); + + MyAuthenticator3 auth = new MyAuthenticator3 (); + Authenticator.setDefault (auth); + ServerSocket ss = new ServerSocket (0); + int port = ss.getLocalPort (); + BasicServer server = new BasicServer (ss); + synchronized (server) { + server.start(); + System.out.println ("client 1"); + URL url = new URL ("http://localhost:"+port+"/d1/d2/d3/foo.html"); + URLConnection urlc = url.openConnection (); + InputStream is = urlc.getInputStream (); + read (is); + is.close (); + } + } +} diff --git a/jdk/test/java/net/URLPermission/nstest/lookup.sh b/jdk/test/java/net/URLPermission/nstest/lookup.sh index 1c7e3cfcb2f..33afed78ba6 100644 --- a/jdk/test/java/net/URLPermission/nstest/lookup.sh +++ b/jdk/test/java/net/URLPermission/nstest/lookup.sh @@ -26,7 +26,7 @@ # @library /lib/testlibrary # @compile -XDignore.symbol.file=true SimpleNameService.java # LookupTest.java SimpleNameServiceDescriptor.java -# @build jdk.testlibrary.Utils +# @build jdk.testlibrary.* # @run shell/timeout=50 lookup.sh # diff --git a/jdk/test/java/util/Properties/CompatibilityTest.java b/jdk/test/java/util/Properties/CompatibilityTest.java index efd16c9bd59..46d8a10c92c 100644 --- a/jdk/test/java/util/Properties/CompatibilityTest.java +++ b/jdk/test/java/util/Properties/CompatibilityTest.java @@ -25,8 +25,6 @@ * @test * @bug 8005280 8004371 * @summary Compatibility test - * @run main CompatibilityTest - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider CompatibilityTest */ import java.io.FileInputStream; diff --git a/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java b/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java index 1e439439a00..7bb187c228c 100644 --- a/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java +++ b/jdk/test/java/util/Properties/ConcurrentLoadAndStoreXML.java @@ -25,9 +25,6 @@ * @bug 8005281 * @summary Test that the Properties storeToXML and loadFromXML methods are * thread safe - * @run main ConcurrentLoadAndStoreXML - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider ConcurrentLoadAndStoreXML - */ import java.io.*; diff --git a/jdk/test/java/util/Properties/CustomProvider.java b/jdk/test/java/util/Properties/CustomProvider.java deleted file mode 100644 index fc8ed24b0b7..00000000000 --- a/jdk/test/java/util/Properties/CustomProvider.java +++ /dev/null @@ -1,70 +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. - */ -/* - * @test - * @bug 8000354 - * @summary Test - * @compile -XDignore.symbol.file CustomProvider.java MyXmlPropertiesProvider.java - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=MyXmlPropertiesProvider CustomProvider - */ - -import java.util.*; -import java.io.*; - -/** - * Sanity test to verify that the property sun.util.spi.XmlPropertiesProvider - * can be used to specify a custom provider for loading/storing properties - * in XML format. - */ -public class CustomProvider { - - public static void main(String[] args) throws IOException { - String provider = System.getProperty("sun.util.spi.XmlPropertiesProvider"); - assertTrue(provider != null, "sun.util.spi.XmlPropertiesProvider not set"); - - OutputStream out = new ByteArrayOutputStream(); - InputStream in = new ByteArrayInputStream(new byte[100]); - - Properties props; - - props = new Properties(); - props.loadFromXML(in); - - props = System.getProperties(); - props.storeToXML(out, "comment"); - props.storeToXML(out, "comment", "UTF-8"); - - // check that the provider's load and store methods have been invoked - - assertTrue(MyXmlPropertiesProvider.createCount() == 1, - "Provider should only be created once"); - assertTrue(MyXmlPropertiesProvider.loadCount() == 1, - "load method expected to be called once"); - assertTrue(MyXmlPropertiesProvider.storeCount() == 2, - "store method expected to be called twice"); - } - - static void assertTrue(boolean b, String msg) { - if (!b) throw new RuntimeException(msg); - } -} diff --git a/jdk/test/java/util/Properties/LoadAndStoreXML.java b/jdk/test/java/util/Properties/LoadAndStoreXML.java index 5388485e91b..5353c645b81 100644 --- a/jdk/test/java/util/Properties/LoadAndStoreXML.java +++ b/jdk/test/java/util/Properties/LoadAndStoreXML.java @@ -23,16 +23,28 @@ /* * @test - * @bug 8000354 8000685 8004371 + * @bug 8000354 8000685 8004371 8043119 * @summary Basic test of storeToXML and loadToXML - * @run main LoadAndStoreXML - * @run main/othervm -Dsun.util.spi.XmlPropertiesProvider=jdk.internal.util.xml.BasicXmlPropertiesProvider LoadAndStoreXML */ -import java.io.*; -import java.util.*; -import java.security.*; -import java.nio.file.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.CodeSource; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.Policy; +import java.security.ProtectionDomain; +import java.util.InvalidPropertiesFormatException; +import java.util.Properties; +import java.util.PropertyPermission; public class LoadAndStoreXML { @@ -65,6 +77,50 @@ public class LoadAndStoreXML { } } + /** + * A {@code ByteArrayInputStream} that allows testing if the + * {@code close} method has been invoked. + */ + static class TestInputStream extends ByteArrayInputStream { + private boolean closed; + + TestInputStream(byte[] buf) { + super(buf); + } + + boolean isOpen() { + return !closed; + } + + public void close() throws IOException { + try { + super.close(); + } finally { + closed = true; + } + } + } + + /** + * A {@code ByteArrayOutputStream} that allows testing if the + * {@code close} method has been invoked. + */ + static class TestOutputStream extends ByteArrayOutputStream { + private boolean closed; + + boolean isOpen() { + return !closed; + } + + public void close() throws IOException { + try { + super.close(); + } finally { + closed = true; + } + } + } + /** * Sanity test that properties saved with Properties#storeToXML can be * read with Properties#loadFromXML. @@ -79,12 +135,16 @@ public class LoadAndStoreXML { props.put("k4", "\u7532\u9aa8\u6587"); props.put("k5", "/lib/jaxp.properties"); - ByteArrayOutputStream out = new ByteArrayOutputStream(); + TestOutputStream out = new TestOutputStream(); props.storeToXML(out, null, encoding); + if (!out.isOpen()) + throw new RuntimeException("OutputStream closed by storeToXML"); Properties p = new Properties(); - ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); + TestInputStream in = new TestInputStream(out.toByteArray()); p.loadFromXML(in); + if (in.isOpen()) + throw new RuntimeException("InputStream not closed by loadFromXML"); if (!p.equals(props)) { System.err.println("stored: " + props); diff --git a/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java b/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java index fa96e0ad3c8..3d5cedea555 100644 --- a/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java +++ b/jdk/test/java/util/Properties/LoadAndStoreXMLWithDefaults.java @@ -35,58 +35,17 @@ import java.util.Properties; */ public class LoadAndStoreXMLWithDefaults { - public static enum StoreMethod { - // Note: this case will test the default provider when available, - // and the basic provider when it's not. - PROPERTIES { - @Override - public String writeToXML(Properties p) throws IOException { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - p.storeToXML(baos, "Test 8016344"); - return baos.toString(); - } - @Override - public Properties loadFromXML(String xml, Properties defaults) - throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); - Properties p = new Properties(defaults); - p.loadFromXML(bais); - return p; - } - }, - // Note: this case always test the basic provider, which is always available. - // so sometimes it's just a dup with the previous case... - BASICPROVIDER { - @Override - public String writeToXML(Properties p) throws IOException { - final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - jdk.internal.util.xml.BasicXmlPropertiesProvider provider = - new jdk.internal.util.xml.BasicXmlPropertiesProvider(); - provider.store(p, baos, "Test 8016344", "UTF-8"); - return baos.toString(); - } - @Override - public Properties loadFromXML(String xml, Properties defaults) - throws IOException { - final ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); - Properties p = new Properties(defaults); - jdk.internal.util.xml.BasicXmlPropertiesProvider provider = - new jdk.internal.util.xml.BasicXmlPropertiesProvider(); - provider.load(p, bais); - return p; - } - }; - public abstract String writeToXML(Properties p) throws IOException; - public abstract Properties loadFromXML(String xml, Properties defaults) - throws IOException; - public String displayName() { - switch(this) { - case PROPERTIES: return "Properties.storeToXML"; - case BASICPROVIDER: return "BasicXmlPropertiesProvider.store"; - default: - throw new UnsupportedOperationException(this.name()); - } - } + static String writeToXML(Properties props) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + props.storeToXML(baos, "Test 8016344"); + return baos.toString(); + } + + static Properties loadFromXML(String xml, Properties defaults) throws IOException { + ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes("UTF-8")); + Properties props = new Properties(defaults); + props.loadFromXML(bais); + return props; } static enum Objects { OBJ1, OBJ2, OBJ3 }; @@ -106,63 +65,59 @@ public class LoadAndStoreXMLWithDefaults { p3.setProperty("p1.and.p2.and.p3.prop", "prop9-p3"); p3.setProperty("p2.and.p3.prop", "prop10-p3"); - for (StoreMethod m : StoreMethod.values()) { - System.out.println("Testing with " + m.displayName()); - Properties P1 = m.loadFromXML(m.writeToXML(p1), null); - Properties P2 = m.loadFromXML(m.writeToXML(p2), P1); - Properties P3 = m.loadFromXML(m.writeToXML(p3), P2); + Properties P1 = loadFromXML(writeToXML(p1), null); + Properties P2 = loadFromXML(writeToXML(p2), P1); + Properties P3 = loadFromXML(writeToXML(p3), P2); - testResults(m, p1, P1, p2, P2, p3, P3); + testResults(p1, P1, p2, P2, p3, P3); - // Now check that properties whose keys or values are objects - // are skipped. + // Now check that properties whose keys or values are objects + // are skipped. - System.out.println("Testing with " + m.displayName() + " and Objects"); - P1.put("p1.object.prop", Objects.OBJ1); - P1.put(Objects.OBJ1, "p1.object.prop"); - P1.put("p2.object.prop", "p2.object.prop"); - P2.put("p2.object.prop", Objects.OBJ2); - P2.put(Objects.OBJ2, "p2.object.prop"); - P3.put("p3.object.prop", Objects.OBJ3); - P3.put(Objects.OBJ3, "p3.object.prop"); + P1.put("p1.object.prop", Objects.OBJ1); + P1.put(Objects.OBJ1, "p1.object.prop"); + P1.put("p2.object.prop", "p2.object.prop"); + P2.put("p2.object.prop", Objects.OBJ2); + P2.put(Objects.OBJ2, "p2.object.prop"); + P3.put("p3.object.prop", Objects.OBJ3); + P3.put(Objects.OBJ3, "p3.object.prop"); - Properties PP1 = m.loadFromXML(m.writeToXML(P1), null); - Properties PP2 = m.loadFromXML(m.writeToXML(P2), PP1); - Properties PP3 = m.loadFromXML(m.writeToXML(P3), PP2); + Properties PP1 = loadFromXML(writeToXML(P1), null); + Properties PP2 = loadFromXML(writeToXML(P2), PP1); + Properties PP3 = loadFromXML(writeToXML(P3), PP2); - p1.setProperty("p2.object.prop", "p2.object.prop"); - try { - testResults(m, p1, PP1, p2, PP2, p3, PP3); - } finally { - p1.remove("p2.object.prop"); - } + p1.setProperty("p2.object.prop", "p2.object.prop"); + try { + testResults(p1, PP1, p2, PP2, p3, PP3); + } finally { + p1.remove("p2.object.prop"); } } - public static void testResults(StoreMethod m, Properties... pps) { + public static void testResults(Properties... pps) { for (int i=0 ; i < pps.length ; i += 2) { if (!pps[i].equals(pps[i+1])) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded properties differ from original"); System.err.println("\toriginal: " + pps[i]); System.err.println("\treloaded: " + pps[i+1]); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded properties differ from original"); } if (!pps[i].keySet().equals(pps[i+1].keySet())) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded property names differ from original"); System.err.println("\toriginal: " + pps[i].keySet()); System.err.println("\treloaded: " + pps[i+1].keySet()); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded property names differ from original"); } if (!pps[i].stringPropertyNames().equals(pps[i+1].stringPropertyNames())) { - System.err.println(m.displayName() +": P" + (i/2+1) + System.err.println("P" + (i/2+1) + " Reloaded string property names differ from original"); System.err.println("\toriginal: " + pps[i].stringPropertyNames()); System.err.println("\treloaded: " + pps[i+1].stringPropertyNames()); - throw new RuntimeException(m.displayName() +": P" + (i/2+1) + throw new RuntimeException("P" + (i/2+1) + " Reloaded string property names differ from original"); } } diff --git a/jdk/test/javax/management/monitor/StartStopTest.java b/jdk/test/javax/management/monitor/StartStopTest.java index 80694c63e05..c1feb295956 100644 --- a/jdk/test/javax/management/monitor/StartStopTest.java +++ b/jdk/test/javax/management/monitor/StartStopTest.java @@ -28,7 +28,7 @@ * monitors are started and stopped in a loop. * @author Luis-Miguel Alventosa * @library /lib/testlibrary - * @run build jdk.testlibrary.Utils + * @build jdk.testlibrary.* * @run clean StartStopTest * @run build StartStopTest * @run main/othervm/timeout=300 StartStopTest 1 diff --git a/jdk/test/jdk/nio/zipfs/Basic.java b/jdk/test/jdk/nio/zipfs/Basic.java index b4b526ad489..e533b2f82d9 100644 --- a/jdk/test/jdk/nio/zipfs/Basic.java +++ b/jdk/test/jdk/nio/zipfs/Basic.java @@ -31,8 +31,11 @@ import java.io.IOException; /** * * @test - * @bug 8038500 + * @bug 8038500 8040059 * @summary Basic test for zip provider + * + * @run main Basic + * @run main/othervm/policy=test.policy Basic */ public class Basic { diff --git a/jdk/test/jdk/nio/zipfs/PathOps.java b/jdk/test/jdk/nio/zipfs/PathOps.java index 321de439c58..20e8c5d8fa5 100644 --- a/jdk/test/jdk/nio/zipfs/PathOps.java +++ b/jdk/test/jdk/nio/zipfs/PathOps.java @@ -29,8 +29,11 @@ import java.io.IOException; /** * * @test - * @bug 8038500 + * @bug 8038500 8040059 * @summary Tests path operations for zip provider. + * + * @run main PathOps + * @run main/othervm/policy=test.policy.readonly PathOps */ public class PathOps { diff --git a/jdk/test/jdk/nio/zipfs/ZFSTests.java b/jdk/test/jdk/nio/zipfs/ZFSTests.java index c5d6e8c9e9f..a774a271363 100644 --- a/jdk/test/jdk/nio/zipfs/ZFSTests.java +++ b/jdk/test/jdk/nio/zipfs/ZFSTests.java @@ -22,8 +22,11 @@ */ /* @test - @bug 7156873 - @summary ZipFileSystem regression tests + * @bug 7156873 8040059 + * @summary ZipFileSystem regression tests + * + * @run main ZFSTests + * @run main/othervm/policy=test.policy ZFSTests */ diff --git a/jdk/test/jdk/nio/zipfs/ZipFSTester.java b/jdk/test/jdk/nio/zipfs/ZipFSTester.java index 47e75e11ec6..95e68fa0e63 100644 --- a/jdk/test/jdk/nio/zipfs/ZipFSTester.java +++ b/jdk/test/jdk/nio/zipfs/ZipFSTester.java @@ -40,8 +40,10 @@ import static java.nio.file.StandardCopyOption.*; * * @test * @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596 - * 7157656 8002390 7012868 7012856 8015728 8038500 + * 7157656 8002390 7012868 7012856 8015728 8038500 8040059 * @summary Test Zip filesystem provider + * @run main ZipFSTester + * @run main/othervm/policy=test.policy ZipFSTester */ public class ZipFSTester { diff --git a/jdk/test/jdk/nio/zipfs/test.policy b/jdk/test/jdk/nio/zipfs/test.policy new file mode 100644 index 00000000000..81261720ad7 --- /dev/null +++ b/jdk/test/jdk/nio/zipfs/test.policy @@ -0,0 +1,16 @@ +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant codeBase "file:${java.home}/lib/ext/sunpkcs11.jar" { + permission java.lang.RuntimePermission "accessClassInPackage.sun.security.*"; +}; + +grant { + permission java.io.FilePermission "<>","read,write,delete"; + permission java.util.PropertyPermission "test.jdk","read"; + permission java.util.PropertyPermission "test.src","read"; + permission java.util.PropertyPermission "user.dir","read"; +}; diff --git a/jdk/test/jdk/nio/zipfs/test.policy.readonly b/jdk/test/jdk/nio/zipfs/test.policy.readonly new file mode 100644 index 00000000000..fbd2f14231b --- /dev/null +++ b/jdk/test/jdk/nio/zipfs/test.policy.readonly @@ -0,0 +1,12 @@ +grant codeBase "file:${java.home}/lib/ext/zipfs.jar" { + permission java.io.FilePermission "<>", "read,write"; + permission java.lang.RuntimePermission "fileSystemProvider"; + permission java.util.PropertyPermission "*", "read"; +}; + +grant { + permission java.io.FilePermission "<>","read"; + permission java.util.PropertyPermission "test.jdk","read"; + permission java.util.PropertyPermission "test.src","read"; + permission java.util.PropertyPermission "user.dir","read"; +}; diff --git a/jdk/test/lib/security/java.policy/Ext_AllPolicy.java b/jdk/test/lib/security/java.policy/Ext_AllPolicy.java index 3e6e969d33d..8a5755390c6 100644 --- a/jdk/test/lib/security/java.policy/Ext_AllPolicy.java +++ b/jdk/test/lib/security/java.policy/Ext_AllPolicy.java @@ -30,12 +30,24 @@ import java.io.*; import java.security.*; public class Ext_AllPolicy { - public static void main (String[] args) { - FilePermission mine = new FilePermission("/tmp/bar", "read"); - SecurityManager sm = System.getSecurityManager(); + public static void main (String[] args) { + boolean allPerms = args.length == 1 && args[0].equals("AllPermission"); + FilePermission mine = new FilePermission("/tmp/bar", "read"); + SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(mine); + if (sm != null) { + try { + sm.checkPermission(mine); + if (!allPerms) { + // Default has no privilege. + throw new RuntimeException(mine + " expected to deny access"); } + } catch (AccessControlException e) { + if (allPerms) { + // expected all permissions granted + throw e; + } + } } + } } diff --git a/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh b/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh index b3bd5d6cb0f..8b8701a987a 100644 --- a/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh +++ b/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh @@ -22,7 +22,7 @@ # # @test -# @bug 4215035 +# @bug 4215035 8040059 # @summary standard extensions path is hard-coded in default system policy file # # @build Ext_AllPolicy @@ -81,6 +81,9 @@ ${COMPILEJAVA}${FS}bin${FS}jar ${TESTTOOLVMOPTS} -cvf Ext_AllPolicy.jar Ext_AllP rm Ext_AllPolicy.class ${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} \ - -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy + -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy || exit 10 +${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} \ + -Djava.security.policy=${TESTSRC}${FS}test.policy \ + -Djava.security.manager -Djava.ext.dirs="${TESTCLASSES}" Ext_AllPolicy AllPermission exit $? diff --git a/jdk/test/lib/security/java.policy/test.policy b/jdk/test/lib/security/java.policy/test.policy new file mode 100644 index 00000000000..ee814957fd0 --- /dev/null +++ b/jdk/test/lib/security/java.policy/test.policy @@ -0,0 +1,3 @@ +grant codeBase "file:${{java.ext.dirs}}/*" { + permission java.security.AllPermission; +}; diff --git a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java index ca448159cd1..9745169b639 100644 --- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java +++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java @@ -41,7 +41,7 @@ import jdk.testlibrary.ProcessTools; * @test * @bug 6434402 8004926 * @library /lib/testlibrary - * @build jdk.testlibrary.ProcessTools + * @build jdk.testlibrary.* * @build TestManager TestApplication CustomLauncherTest * @run main/othervm CustomLauncherTest * @author Jaroslav Bachorik diff --git a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java index 8835cc3c3ff..c6d539e5465 100644 --- a/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java +++ b/jdk/test/sun/management/jmxremote/startstop/JMXStartStopTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 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 @@ -616,7 +616,7 @@ public class JMXStartStopTest { final boolean[] checks = new boolean[3]; jcmd( line -> { - if (line.equals("java.lang.RuntimeException: Invalid agent state")) { + if (line.contains("java.lang.RuntimeException: Invalid agent state")) { checks[0] = true; } }, @@ -627,7 +627,7 @@ public class JMXStartStopTest { jcmd( line -> { - if (line.equals("java.lang.RuntimeException: Invalid agent state")) { + if (line.contains("java.lang.RuntimeException: Invalid agent state")) { checks[1] = true; } }, diff --git a/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java b/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java index ae5c6596c1f..063746b175a 100644 --- a/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java +++ b/jdk/test/sun/reflect/AnonymousNewInstance/ManyNewInstanceAnonTest.java @@ -28,6 +28,7 @@ * @author Robert Field * @library /lib/testlibrary * @compile -XDignore.symbol.file ManyNewInstanceAnonTest.java + * @build jdk.testlibrary.* * @run main ClassFileInstaller ManyNewInstanceAnonTest * @run main/othervm -Xbootclasspath/a:. -Xverify:all ManyNewInstanceAnonTest * @run main/othervm -Xbootclasspath/a:. -Xverify:all -Dsun.reflection.noInflation=true ManyNewInstanceAnonTest diff --git a/jdk/test/sun/security/validator/ConstructorTest.java b/jdk/test/sun/security/validator/ConstructorTest.java new file mode 100644 index 00000000000..e076b618e9e --- /dev/null +++ b/jdk/test/sun/security/validator/ConstructorTest.java @@ -0,0 +1,467 @@ +/* + * 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. + */ + +/* + * @test + * @bug 6996377 + * @summary shrink duplicate code in the constructor of PKIXValidator + */ + +import java.io.ByteArrayInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.KeyStore; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.security.cert.TrustAnchor; +import java.security.cert.PKIXBuilderParameters; +import java.security.cert.X509CertSelector; +import javax.security.auth.x500.X500Principal; +import java.util.Date; +import java.util.List; +import java.util.Arrays; +import java.util.ArrayList; +import java.util.Set; +import java.util.HashSet; +import java.util.Enumeration; +import java.util.Collection; +import sun.security.validator.Validator; +import sun.security.validator.PKIXValidator; + +public class ConstructorTest { + + // COMMON-OPTS: All certs created with the following common options: + // -keystore -storepass -keypass -keyalg rsa + // -keysize 2048 -validity 720 -sigalg sha256withrsa + + // keytool -alias root -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC3jCCAcagAwIBAgIEInKZgjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRS\n" + + "b290MB4XDTE0MDUwODE4MjcwOFoXDTE2MDQyNzE4MjcwOFowDzENMAsGA1UEAxME\n" + + "Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIzgMkrCZD7PuoFb\n" + + "fmtAd2+Td6nA9sgBd8Z3NjQgP6nwyn79svaVV9XAVLTrLian72wV/1Kbq/6HUXQQ\n" + + "AqyUAvobDwXeIAmE4+D7qcZxiEJgVNr2Ddv1bbS8Y0/Ta72qzjFiEPMO3Y2GP52C\n" + + "ssKQpsdNttHfM9c73cKUspobc3p51k2lkynheshCSNOWxR/Rvsl/gcbEFg8vIEHV\n" + + "oJPwKSrABc4sWiiXQj0yLVW+DKVEFuWNqqitcikQLZFpgOYv8P1SjhJFkcA9s0oN\n" + + "sbvKO2VF141h161i0AFddTsGE85A3j42qEdwQ0cs9gyAoeU865TFvxCuhSqSgJ3a\n" + + "Mdgn7ssCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw\n" + + "HQYDVR0OBBYEFFQY2UJynMSoS7Tf/+DvNPp/ZxXfMA0GCSqGSIb3DQEBCwUAA4IB\n" + + "AQAeXRQnEhxNl8lrcGY1U1LbIdrNMlGnc0JbgwiVYwRlE3+u4GvDae1VueXyY6nw\n" + + "8m63H3Q/Do9/72aw2Q0FSwvDg+k5ssj+gXQ3Gyx8xsVPJEG0TizOSwnWiZtWu65w\n" + + "14p5TB8P8wdPEs6sfE9oheiKhDRjBZHIfqMd4DaBiM9N9qHpSwTJc02BB2KnGwga\n" + + "yiYNJbce7GFKn/exryj972n/Nl4xy1WdZrRwTBbV21/GINw+xdXn1+FD95EGqGlr\n" + + "Sb4+G7U7Ydo+xFpVQnrqxZe98pI5W2bG7VSKvIzcPxfL5/tjwtNaqhiD7wIBNHVx\n" + + "ZeJevm41O9qFQEdXNyVGpB+u\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias int -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String INTERMED = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC/jCCAeagAwIBAgIEDkzdijANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRS\n" + + "b290MB4XDTE0MDUwODE4MjcyNFoXDTE2MDQyNzE4MjcyNFowDjEMMAoGA1UEAxMD\n" + + "SW50MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwslILfgvXPxdRgu8\n" + + "4SnrZJsSzb/XvYwYGAKTSvsDaI1nXypBbwDGz87+YPpZSJcExcS8I8GBKqN6kXIh\n" + + "YvJ9yMGJX8wdwoMQpw2ZfJpzfw9Nqtlhv8/q5kPlaDghJ+nGNwy5lyYNOzDMVht0\n" + + "1XQG65C+l7m52lDJ478tGRZEFkx0aTh2QUBI59iNji6r2Buyeiijhg4YBrvIlYLK\n" + + "OAHxru4N/Y2Cq3ECUUvm7Lf8tM8yrINS8FLT+pmNcLj8AKkGW8cFFaiGPMyon0/m\n" + + "4iJB7ZaeG+BGm9TvBv93cphAsM2tY+S+P/dLfI01ltucibPkSglmquUSA0xW9ilv\n" + + "PEYWqQIDAQABo2MwYTAfBgNVHSMEGDAWgBRUGNlCcpzEqEu03//g7zT6f2cV3zAP\n" + + "BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU1jeG+pzz\n" + + "WnHa+0PfJNw9JTrZaoMwDQYJKoZIhvcNAQELBQADggEBABRshh0oJ8Dq87Tgcf3w\n" + + "ERVZ/uDWKj76UXWQ3uvKMhnNxKN/vs1rCfhovkptn39CXndOb8m6UkvmMjDtJsiO\n" + + "Oq/DiR6NngCy5yJ5hMuBsdQ2QVvdiqG4Sb+vOaQ2TNQNEHEWC7sB0ztImjxlqDtq\n" + + "yvof5pd8pHeZJNyDo5cHw1cpoUI9GLz6CK5i0wUlBvsYERIX5aRqxqdtKgBefHFN\n" + + "S2ChTRB16A5C1h+Lu79KnoeS33lZt1VeebIA7hvaHkqhGGpncutEYgT8QNFFpjM8\n" + + "yFCjZG+ZuUD/s5hd/xHnPdJzR+RWVKMjjVCTpnni3+NHXo2fh0G8YFhdHQ2F/YFI\n" + + "ig0=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias user -ext ku:c=digitalSignature + // -ext eku=clientAuth + private static final String USER = + "-----BEGIN CERTIFICATE-----\n" + + "MIIDAjCCAeqgAwIBAgIEKgsK2DANBgkqhkiG9w0BAQsFADAOMQwwCgYDVQQDEwNJ\n" + + "bnQwHhcNMTQwNTA4MTgyNzI3WhcNMTYwNDI3MTgyNzI3WjAPMQ0wCwYDVQQDEwRV\n" + + "c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBFLJZ1liQAEkEyJ\n" + + "9vAiViRXtDDV+lc62DR4DBj1/Vsw9djVOxmwDKM0+jj83F4Qn9vulr+xp2aZzx4Y\n" + + "GiJgbtoxPvZmwNv4MPCNX+fgl/+C0nFKOoSYfHb/tK0Jj6u8HOmQqkbSmGJd/yRL\n" + + "qavapRvhS94tFhiNK7wwLAK9AZ+r7cTEBtUSqfaS7mY7tUsERcZs6z3+rmsuxWw6\n" + + "/xnNTIVWjdUSbEnjZCdkfZ0cjFONotL6aKoa6YXzohzgA5c3SJZqscEaz4yPkMvl\n" + + "7bGy7cn6xjfbb5V3oNqo1dtF3Jm8zp0q8Zgvc47l+DAoGIHSpDhPGX+qSWOTwRla\n" + + "QT6NDwIDAQABo2cwZTAfBgNVHSMEGDAWgBTWN4b6nPNacdr7Q98k3D0lOtlqgzAT\n" + + "BgNVHSUEDDAKBggrBgEFBQcDAjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFE/p\n" + + "UEn8+capIj2+V+7GoxUhdVnWMA0GCSqGSIb3DQEBCwUAA4IBAQBkEyFJ/1CCMoU3\n" + + "C1sYoq4Wt36z3e4Z2rMjfpFXcagqOQaq+hq+/eG8gDE50tOp30nZF7BxSv0RKnxa\n" + + "KSkrKcupwgPJOZZWVR6ycV3xWm4QleLuDJh3NdK0o8vvIwLQP47fXURzEXTpGodl\n" + + "+hGx7jcghsOKftBDCaleywam4jcZ5YPfp5Ayev0pK/Euf0kZgZAhRM33uJVVfEns\n" + + "UotoGK7SL6hZMCrreVlXygof19p531Ps5xMqu0y2u2xztjVQJ+gPU5zcYbjByUl+\n" + + "pY+wDPb8XU1EoLl7J5UyayXlk0c3KG/5f+CrVi2HtRfCcKLBf8/MH6OFIpX9O77p\n" + + "Qq3r+W/l\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias red-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String RED_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC5jCCAc6gAwIBAgIEWK8vRTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDEwhS\n" + + "ZWQgUm9vdDAeFw0xNDA1MDgxODI3MTNaFw0xNjA0MjcxODI3MTNaMBMxETAPBgNV\n" + + "BAMTCFJlZCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjpMy\n" + + "Qh5yq4R3DrwsWaBZoCR+gda4a1PjGpjlQW/Au6R3hwUDAunkQIz/sX1CnLLJ7cks\n" + + "4m6ba2wjYE3NbVP9D3HozLAv2ErB75/F3evRu5UvzkGLkamyHJBY0xEyFyOaD4MC\n" + + "hhlo8dDEY++YL8Od+m4i56fYXQlTT94u20I+6hZxeIpJxFSHyouZg06jb+URibi0\n" + + "e7I3JApWghgcDfgEXZWlCmB8IswYPdd+XWRFDNc4rSWueRP+SeQOFx9x1jM6+skP\n" + + "DGLpuaChO7cqsUxYnsEx9zhdxQ+v4V3vOye/GigpRaO7WvgPB4g5sYhFlwZ/tp+A\n" + + "KQebXExXCGOOQUoFEwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB\n" + + "/wQEAwIBBjAdBgNVHQ4EFgQUYL8o0Ku7Irg33xzCgA4q1PFz6IQwDQYJKoZIhvcN\n" + + "AQELBQADggEBAGSVpI7Qmb0oupBCs+tXlJ4/+TX6eBGcHydaT/2hlgEEdT7S7y6O\n" + + "iMC8C8wlEKTLZ6MJSxjeFTIO62OkTjCsGtk+BHTaE81QL5rxjGFkvtuQrwck8gHg\n" + + "fAb7daF9ZVLz6B8+cX047xZHx9ZGM/ID+GJg/3fk17WA2BhW1Xkzskby5AWpBDol\n" + + "i6+zEod0uZhpHiWwVSfHlEA+rnkhW632oVaVNNDkeUhsCxrU0k7nlQx8bG5bmUso\n" + + "1MaPP1kRKvcy0UGx6q3s8pcrKw0X1S66n7HV+WbQebg83U0MVE1r/J0Cfi0jMS/x\n" + + "ZUVXs7rjCGFhwfiT/kybKD8adrGHSmLhKs0=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias orange-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String ORANGE_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEQPSszTANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtP\n" + + "cmFuZ2UgUm9vdDAeFw0xNDA1MDgxODI3MTRaFw0xNjA0MjcxODI3MTRaMBYxFDAS\n" + + "BgNVBAMTC09yYW5nZSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAknfh3lKWVQxl2w/eRSza6+0+zeTtMkQFCEFpGJsisDK5XOU1HcJMP4QUteWM\n" + + "tg1SGO9bjpiKqJ7JVRnzOC3q6erBj2LmwpWW7p12tg6ENOQfsy6tRZLlQWMFGBkT\n" + + "Tatsg9HwKpr6itvk2wERh18AcIqSjtN94kGTljP1qf9gMd31G5d/HyG6EwMZukJm\n" + + "4/EFpzh3fVwr/EN1WzrYlsBOA+3Tru/k0p8wP6Bomrx1vAEUqRWSLWxsa7we76jL\n" + + "H/kMkyWENyjd/A2c5CwscoG+KSx9cifYnSqrUAmpY88KKuZG2Y1+9ablUEwXW4Gh\n" + + "RYLCGIgxp6NrtFG/eUcDBgtEwQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUPvRE9j3GPGcc3dNGrVrQoWDb9RMwDQYJ\n" + + "KoZIhvcNAQELBQADggEBADjPTuHXMbXc2Kn+i+dnBiQCWcjzaox4KWV4MNO7vkvi\n" + + "ADBk5/vVM+HTzwL+gZNwE96/agcOzwHZ8/Dz4aA3zzmAmQB4bt+pUa0iyGvX6+F5\n" + + "IH1kd4kBnSBMc76fRcEJnebhrXFgTlps5VELMVcEOn3Q4nt+gVfXmPStTkFjM1/4\n" + + "fQggsScLpE2TVkk3oS52NIzG/vyBIt3W0gX20hlQobA2vziJDx8xy/+qe5igyp5F\n" + + "WScwSQE8qeuoDJYJRxpxZ7kq8NiHxfGPw5Hjn518zBz2VKJOsJYmckAMFIdS//kM\n" + + "NUysH6gFksW/PHy75QkbtD4OFtb2zp01ERuf5OoJavs=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias yellow-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String YELLOW_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEfLA7azANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtZ\n" + + "ZWxsb3cgUm9vdDAeFw0xNDA1MDgxODI3MTZaFw0xNjA0MjcxODI3MTZaMBYxFDAS\n" + + "BgNVBAMTC1llbGxvdyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAgLMOpzIR8LyALox2AvItM42VjFDp1EyHU0faJZCpwVbQPJ2f+8Gr7XuTv1uZ\n" + + "Ixe6JjcyGNHZG0NuFmMFbK2Y7cg3PdQBjcm+x68iSWzyEUuhytSKSLUt6i+xAg+9\n" + + "h9UGXlBNarVjWq63tPt8HK/YHxt9Ber0iriF3SEUsgMOzRrLw1mw35SmgidRp19y\n" + + "yNXlgQfylEAVtYD9IYhxTm/j9NL3rTgqXiKjvNAVjAUrD2I2nK5WQqO2hmQr9x/9\n" + + "EqgIK03dw0ps7/XL+gpd+zwGZqDr9pbFnko4badiE4AJqPlm6u/Tdc0dSkLu/oXq\n" + + "Ex4iqtM0TP5+oeDXGZv6EprzKQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUp0/g/PqT9jDVGKSsBh997Kg9KBIwDQYJ\n" + + "KoZIhvcNAQELBQADggEBAG4vr5UkWUEA9qNU6wBNg5yySS6KhNVyBDMReyX6qsz6\n" + + "yUIeGU/UC8LwdB+Tl3S+FZyUlsx+gwh1n0ei7eOV58cCeWmZ3sUWvLTwsY9iBNyt\n" + + "HkItOCDO+JEjgo7OhEBlzYkD4MkwAjaYnT4tU41BSnlTR4+jK77f/b1oMVzDv2tL\n" + + "+JAiem04TEoGO97uZ94l6gKwwGO35uejGEUPhFPLtxo+yR2QQqX0S8smG88pCQ82\n" + + "6XscdvRTjSfkuI3LiqNORS0fGZ3ykxDCkDLZZ1mSg1h2/3xOUEbFQ0phhMrnr2Rl\n" + + "mWNGYCam2jns4qmMnbzPIwQduvRkz1O1lusbLNFpcdY=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias green-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String GREEN_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC6jCCAdKgAwIBAgIENWwt8TANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwpH\n" + + "cmVlbiBSb290MB4XDTE0MDUwODE4MjcxOFoXDTE2MDQyNzE4MjcxOFowFTETMBEG\n" + + "A1UEAxMKR3JlZW4gUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\n" + + "AKHvh3FRJghpNtLqIk5UDSGkcA3rtEygRsFa51ucwNQ1x4SXOVnsNHZZW66RuKOn\n" + + "6wjS8+xctNnMIy1XNXa2nlAswQVe75xX0jfGMB4w0MlaqLK9HrU479WrWmrBjz/P\n" + + "vvHY8x1CIfTMjOtLO9yxbYQrXsEz6JKxAz6/+ErbkvUjBynezZdJNXgURVz5HmFx\n" + + "e/SUbSALX+Kx+/+hXggaQdwlrpoDl/Nqm6S1iR5xtdZB1CEauIwFDSWOG1TjR1Hp\n" + + "8OSGb0AhwwM5FzIxevwgKke6WHFKf5p4lcpiQZqmhgqyFbARUfUjYX3WzQTmrJ/q\n" + + "87OMIJasvmkNEYkNbrSmI9kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV\n" + + "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHG7s0KrfUsnl/3/UGYbCrdXTZtcMA0GCSqG\n" + + "SIb3DQEBCwUAA4IBAQBUe18kbDHeqsxM17ahr30hvjdxMkYLkLcGoSOlSI8sFBu6\n" + + "jG4JZvvFXw2ZqMQTLSALvsSZ9wkfS8tDCNEHRvCB6aqW4tjp9ddkfe+56WINzTv6\n" + + "Ibqwg2JGsOzWttpUA5OPLfODbMqOYzT101toF3sKteX0yyiF/SfMTXR5Jv0uo/dp\n" + + "sFeJtWFfhy/Q0jiEAz945BBoSHCIF7Fs4vcls7gNJxfap66W8lamjzFyMDsnlz+b\n" + + "sSLWZmvwM+R/RfL1Q3LPCcZWLiP9WSAO4hUoju1E9WeWHHjlPwJJ/iRECL9cnHRt\n" + + "Z7/kOlNLGxKvpEbY4xqH0zE07UWPCCBlemk/6jlO\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias blue-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String BLUE_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC6DCCAdCgAwIBAgIEX3XC9zANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDEwlC\n" + + "bHVlIFJvb3QwHhcNMTQwNTA4MTgyNzIwWhcNMTYwNDI3MTgyNzIwWjAUMRIwEAYD\n" + + "VQQDEwlCbHVlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCY\n" + + "pc4r8mfgGGeiYlvHSrEIlp6djHS489P7eqoQRqmS5U/I0lLGNu7QZsY240a9a84S\n" + + "2t6VpZID5juK8AF2v4psShsqgfj+RjVev8FJE/D5j8B4QZ+HmbLJIl80f+YOPaLG\n" + + "HX1eNktLx3S2gkIKHVdn7q3o4DdXBO+YdaBA56lL4l+dWFtto65+5Sjy4yfyvWJz\n" + + "MylXjP/wiC0T3C0NcQX3AIu2tjY2u9lrVbem2rIi0kPFIoYvstKiqXMc/sRf2CfO\n" + + "it5k629HsbvdACVRZFxU3Lz25oP4HGz1kq1cpiIS+W3gQQmCKu9XqzpNRThG0SEL\n" + + "jaH9E4pZDnZiRCr+Mxm1AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P\n" + + "AQH/BAQDAgEGMB0GA1UdDgQWBBS5ebHO4iamr3n0+KtxJYAitg9QcTANBgkqhkiG\n" + + "9w0BAQsFAAOCAQEAGjh/UzERw+skEK4zM1zfL1RsZnUlFu7mTbOBGgccewHWC+MM\n" + + "AQbLo0m4NTEbRoW6fFcAESgE61ZZBLkmhcjXBunNJq6O1hMDpppYA806eG6GcZmK\n" + + "rLOZljxx4D1YC17vMEVsMF9XgIj5dLWceJjotZzNxe+miwXLEkxaGIMe/n2VtCoR\n" + + "BSrGrAeCsFZ7G2NRWUxUEVJrhLnVZJDt6fHd43BCVnV191PyF5TuB08nijyCoJoS\n" + + "/WJkYHxx3vUUfDE5E4UE+iY80BHnAPxiNKwO3XsWjeqbJ8PS+5AvShdG5QdFBhKe\n" + + "/tJTZLs0UEubKdaWd5ZgsXP3913bJm/mBo+eJA==\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias indigo-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String INDIGO_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIESdUmczANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtJ\n" + + "bmRpZ28gUm9vdDAeFw0xNDA1MDgxODI3MjFaFw0xNjA0MjcxODI3MjFaMBYxFDAS\n" + + "BgNVBAMTC0luZGlnbyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEA2opDa3wDxQrX6GjffbDGtXyvKw0/vhZTeus4cxdZIYF3CWkGbeurDIhPUKRO\n" + + "Azact0SECJuMXVxkB5vQKBmHRByNh8ugFfzXWi7/rteXTNjLNKnzVr8plbMvzwM7\n" + + "zjIgm0mTRbwv6gZmUbgfmO9FCB8zlV4hYbYbFTJn7GlVPpqZkZNNMTyJkOPxMzXD\n" + + "yaToxyR0uY3cMv9pmks3GxU2XoGTFuqptbL9XFSpwrm5BRfWuJDP1t8moLHQZ5iu\n" + + "tkCz6MVYcrhTlV/UY0PSGcmUvAu83sNBfIGjme0RIiERy02gLJnSZ/M9r1ukCUJE\n" + + "Z6At+9TsNCYNPgW5vcjNLO63/wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU8eJ+kMmanqF+IcAQTjxSMv+VR7kwDQYJ\n" + + "KoZIhvcNAQELBQADggEBAGRB4C5qYXXJJnEGzJZf8S974SaeLmEvHlmaQPOuCxME\n" + + "tCeBoWQqD9qTDVy39izzjA4uE/fCMVCkyr1QL+588dtMI8jJfbzx+TxnlDWlJcMM\n" + + "5J8EJPNEy7eR6qqpFncvjmbXzf16XfzL9qSXwHYCvpo25nEEH801y2njJE2gGzZT\n" + + "raYRFuwzsZLiSV5TyO5MbRXiZLebDXfE/wXukor87pjGpx1/kevjH/g66OpaIBzu\n" + + "IfLePEOekTKXHF1zL89uYHwpUVCzfhO5hNQlSsTCuBkBifSTYm4ixoATi/C2kqze\n" + + "WHUK179u1+7v6xRONLQxe1JDftdlHHVg7DSeTY59euo=\n" + + "-----END CERTIFICATE-----\n"; + + // keytool -alias violet-ta-key -ext bc:critical=ca:true + // -ext ku:critical=keyCertSign,cRLSign + private static final String VIOLET_ROOT = + "-----BEGIN CERTIFICATE-----\n" + + "MIIC7DCCAdSgAwIBAgIEXwgmLDANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtW\n" + + "aW9sZXQgUm9vdDAeFw0xNDA1MDgxODI3MjNaFw0xNjA0MjcxODI3MjNaMBYxFDAS\n" + + "BgNVBAMTC1Zpb2xldCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n" + + "AQEAvElr11MoHUNfnx6nBy4NSXFFzA68g57ohTt+sspEn3wzuPErugMypReHLhtH\n" + + "CTrs45T0KU8P4Gi5QHnsBs8yC3QCHNPugo2A4zP+ciTqp+1gRNxQ9wzKSzCoseJg\n" + + "RMQflGFzuEe7gWwYfrsDfD1sJCubfBtBUFCSYf1ZSZbdEMrc3RPtC35Ge+3XRxFZ\n" + + "KdzH8l7gQTtgAmRQmK+i4jwzSHV/Iu2yiRdhjqIZUezf3pYFfJlmfAY5ruQBKkc+\n" + + "KRgdmKanpLbmAo/+3q6snt8V09CoQ+6Cz+P9P0yOxiiwr/6jg9WtHA3ujvtf3dGj\n" + + "EeB8SmzXHFZErQIn+QbrJ3/izwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G\n" + + "A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUlxlHI8JTrX86r4ezgDLICo6rApowDQYJ\n" + + "KoZIhvcNAQELBQADggEBALnfWZx6LC9vDMI8vBH/vbyk2ZQtiQFRt3kbwKtlrw65\n" + + "/bqeGXcQ1Lh9gDzp+uGYSfuDNvtJO6xmfny0W5j5WQVJxs+iWyoJfYxeG0kBZut+\n" + + "hbxJPlehBwhveuznZbeTN3RXeBi8MSxnBD/WC1e2rnfnrxoLfYZ1BSUP8LaIzC32\n" + + "vd6WCgnJRXputlGvnOoAT1WduWonhd7lCoqbtZksw7o0smuAn2mSnod8j948rzzt\n" + + "uDQVao/3tCyoX4NSom2hWooPltk5FTdF9cZKfbaU5TPV+U30RN7/UWY/dCvL1fMq\n" + + "1kvtJbkh+UMHvszHOxlgjk+3J76Wx0PFjNaIfbj2bmk=\n" + + "-----END CERTIFICATE-----\n"; + + public static final String[] rootArrayPEM = { RED_ROOT, ORANGE_ROOT, + YELLOW_ROOT, GREEN_ROOT, BLUE_ROOT, INDIGO_ROOT, VIOLET_ROOT, ROOT }; + + /** + * @param args {cacerts keystore, cert chain} + */ + public static void main(String[] args) throws Exception { + Set trustedCertSet = new HashSet<>(); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + for (String pemCert : rootArrayPEM) { + trustedCertSet.add(makeCertFromPEM(pemCert)); + } + + testCtorByCollection(trustedCertSet); + + testCtorByPKIXBuilderParams(trustedCertSet); + } + + public static X509Certificate makeCertFromPEM(String pemCert) + throws CertificateException { + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + ByteArrayInputStream is = new ByteArrayInputStream(pemCert.getBytes()); + + return ((X509Certificate)cf.generateCertificate(is)); + } + + public static void showValidatedChain(Validator v, X509Certificate[] chain, + Set otherCerts) throws Exception { + for (X509Certificate cert : v.validate(chain, otherCerts)) { + System.out.println("\tSubj: " + cert.getSubjectX500Principal() + + " Iss: " + cert.getIssuerX500Principal()); + } + } + + public static Set makeTrustAnchorSet( + Set certSet) throws Exception { + Set anchors = new HashSet<>(); + + for (Certificate cert : certSet) { + anchors.add(new TrustAnchor((X509Certificate)cert, null)); + } + + return anchors; + } + + public static void testCtorByCollection(Set certSet) + throws Exception { + Validator valOK; + Validator valNoGood; + X509Certificate[] chain = new X509Certificate[1]; + Set intermeds = new HashSet<>(); + + // Case 1: Make a PKIXValidator with valid arguments + // Expected result: Well-formed PKIXValidator + System.out.println("Constructor test 1: Valid inputs"); + valOK = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, certSet); + + // Convert our user cert from PEM format, then do the same for + // its intermediate signer and add that as a helper for path building + chain[0] = makeCertFromPEM(USER); + intermeds.add(makeCertFromPEM(INTERMED)); + PKIXBuilderParameters pbParams = ((PKIXValidator)valOK).getParameters(); + pbParams.setDate(new Date(1426399200000L)); // 03-15-2014 6:00:00 GMT + + // See if we can build a trusted path to a root to make sure + // everything still works as expected. + showValidatedChain(valOK, chain, intermeds); + + // Case 2: Make a PKIXValidator with null anchor list. + // Expected result: throw NullPointerException + System.out.println("Constructor test 2: null trustedCerts"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, (Collection)null); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught Exception (" + npe.toString() + + ") [PASS])"); + } + + // Case 3: Try putting a null reference into a populated TA List + // Expected result: throw NullPointerException + System.out.println("Constructor test 3: null in trustedCerts list"); + try { + certSet.add(null); + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, certSet); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException("Constructor did not throw RuntimeException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught Exception (" + npe.toString() + + ") [PASS])"); + } finally { + // Return the certSet list to its original state + certSet.remove(null); + } + + // Case 4: Provide an empty List as the X509Certificate collection + // Expected result: throw RuntimeException + System.out.println("Constructor test 4: empty trustedCerts list"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, new ArrayList()); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException("Constructor did not throw RuntimeException"); + } catch (RuntimeException re) { + System.out.println("\tCaught RuntimeException (" + re.toString() + + ") [PASS])"); + } + + // Case 5: Provide an invalid variant + // Expected result: successful construction. + // Note: subsequent calls to validate may throw CertificateException + // if the submitted chain has a length > 1. + System.out.println("Constructor test 5: Unsupported variant"); + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + "BogusVariant", certSet); + System.out.println("\tSuccessful construction [PASS]"); + + // Case 6: Provide a null variant + // Expected result: throw NullPointerException + System.out.println("Constructor test 6: null variant"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, null, + certSet); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught RuntimeException (" + npe.toString() + + ") [PASS])"); + } + } + + public static void testCtorByPKIXBuilderParams(Set certSet) + throws Exception { + Set taSet = makeTrustAnchorSet(certSet); + Validator valOK; + Validator valNoGood; + X509Certificate[] chain = new X509Certificate[1]; + Set intermeds = new HashSet<>(); + + // Case 7: Make a PKIXValidator with valid arguments + // Expected result: Well-formed PKIXValidator object + System.out.println("Constructor test 7: Valid inputs"); + + // Set up the PKIXBuilderParameters + X509CertSelector sel = new X509CertSelector(); + sel.setSubject("CN=User"); + PKIXBuilderParameters pbParams = new PKIXBuilderParameters(taSet, sel); + pbParams.setRevocationEnabled(false); + pbParams.setDate(new Date(1426399200000L)); // 03-15-2014 6:00:00 GMT + + valOK = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, pbParams); + + // Convert our user cert from PEM format, then do the same for + // its intermediate signer and add that as a helper for path building + chain[0] = makeCertFromPEM(USER); + intermeds.add(makeCertFromPEM(INTERMED)); + + showValidatedChain(valOK, chain, intermeds); + + // Case 8: Make a PKIXValidator but provide a null PKIXBuilderParameters + // Expected result: throw NullPointerException + System.out.println("Constructor test 8: null params"); + try { + valNoGood = Validator.getInstance(Validator.TYPE_PKIX, + Validator.VAR_GENERIC, (PKIXBuilderParameters)null); + // Throw something non Runtime-related to indicate we shouldn't + // have succeeded on construction. + throw new IOException( + "Constructor did not throw NullPointerException"); + } catch (NullPointerException npe) { + System.out.println("\tCaught RuntimeException (" + npe.toString() + + ") [PASS])"); + } + } +} diff --git a/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java b/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java index a5310862859..2292be403da 100644 --- a/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java +++ b/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java @@ -39,6 +39,7 @@ import jdk.testlibrary.Utils; * @test * @bug 7104647 * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main TestJcmdDefaults */ public class TestJcmdDefaults { diff --git a/jdk/test/sun/tools/jcmd/TestJcmdSanity.java b/jdk/test/sun/tools/jcmd/TestJcmdSanity.java index 52fa840fe43..d32fb18d2c1 100644 --- a/jdk/test/sun/tools/jcmd/TestJcmdSanity.java +++ b/jdk/test/sun/tools/jcmd/TestJcmdSanity.java @@ -40,6 +40,7 @@ import jdk.testlibrary.Utils; * @test * @bug 7104647 7154822 * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main TestJcmdSanity */ public class TestJcmdSanity { diff --git a/jdk/test/sun/tools/jmap/BasicJMapTest.java b/jdk/test/sun/tools/jmap/BasicJMapTest.java index 12be7d3e1bb..3630e9da288 100644 --- a/jdk/test/sun/tools/jmap/BasicJMapTest.java +++ b/jdk/test/sun/tools/jmap/BasicJMapTest.java @@ -34,6 +34,7 @@ import jdk.testlibrary.ProcessTools; * @bug 6321286 * @summary Unit test for jmap utility * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main BasicJMapTest */ public class BasicJMapTest { diff --git a/jdk/test/sun/tools/jstack/BasicJStackTest.java b/jdk/test/sun/tools/jstack/BasicJStackTest.java index 0794447f5d2..4b3c3656bcd 100644 --- a/jdk/test/sun/tools/jstack/BasicJStackTest.java +++ b/jdk/test/sun/tools/jstack/BasicJStackTest.java @@ -32,6 +32,7 @@ import jdk.testlibrary.ProcessTools; * @bug 6260070 * @summary Unit test for jstack utility * @library /lib/testlibrary + * @build jdk.testlibrary.* * @run main BasicJStackTest */ public class BasicJStackTest { diff --git a/jdk/test/sun/util/calendar/zi/tzdata/VERSION b/jdk/test/sun/util/calendar/zi/tzdata/VERSION index 1c96650f231..c735be51ca1 100644 --- a/jdk/test/sun/util/calendar/zi/tzdata/VERSION +++ b/jdk/test/sun/util/calendar/zi/tzdata/VERSION @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2014b +tzdata2014c diff --git a/jdk/test/sun/util/calendar/zi/tzdata/africa b/jdk/test/sun/util/calendar/zi/tzdata/africa index 3198e1cc209..6f1a1471e0c 100644 --- a/jdk/test/sun/util/calendar/zi/tzdata/africa +++ b/jdk/test/sun/util/calendar/zi/tzdata/africa @@ -358,11 +358,54 @@ Rule Egypt 2007 only - Sep Thu>=1 23:00s 0 - # http://www.worldtimezone.com/dst_news/dst_news_egypt02.html #
    +# From Ahmad El-Dardiry (2014-05-07): +# Egypt is to change back to Daylight system on May 15 +# http://english.ahram.org.eg/NewsContent/1/64/100735/Egypt/Politics-/Egypts-government-to-reapply-daylight-saving-time-.aspx + +# From Gunther Vermier (2015-05-13): +# our Egypt office confirms that the change will be at 15 May "midnight" (24:00) + +# From Paul Eggert (2014-05-13): +# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says +# the change is because of blackouts in Cairo, even though Ahram Online (cited +# above) says DST had no affect on electricity consumption. The AP story says +# DST will not be observed during Ramadan. There is no information about when +# DST will end. See: +# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833 +# +# For now, guess that later transitions will use 2010's rules, and that +# Egypt will agree with Morocco (see below) about the date Ramadan starts and +# ends, though (unlike Morocco) it will switch at 00:00 standard time. In +# Egypt the spring-forward transitions are removed for 2020-2022, when the +# guessed spring-forward date falls during the estimated Ramadan, and all +# transitions removed for 2023-2038, where the estimated Ramadan falls entirely +# outside the guessed daylight-saving time. Ramadan intrudes on the guessed +# DST starting in 2039, but that's beyond our somewhat-arbitrary cutoff. + Rule Egypt 2008 only - Aug lastThu 23:00s 0 - Rule Egypt 2009 only - Aug 20 23:00s 0 - Rule Egypt 2010 only - Aug 11 0:00 0 - Rule Egypt 2010 only - Sep 10 0:00 1:00 S Rule Egypt 2010 only - Sep lastThu 23:00s 0 - +Rule Egypt 2014 only - May 15 24:00 1:00 S +Rule Egypt 2014 only - Jun 29 0:00s 0 - +Rule Egypt 2014 only - Jul 29 0:00s 1:00 S +Rule Egypt 2014 max - Sep lastThu 23:00s 0 - +Rule Egypt 2015 2019 - Apr lastFri 0:00s 1:00 S +Rule Egypt 2015 only - Jun 18 0:00s 0 - +Rule Egypt 2015 only - Jul 18 0:00s 1:00 S +Rule Egypt 2016 only - Jun 7 0:00s 0 - +Rule Egypt 2016 only - Jul 7 0:00s 1:00 S +Rule Egypt 2017 only - May 27 0:00s 0 - +Rule Egypt 2017 only - Jun 26 0:00s 1:00 S +Rule Egypt 2018 only - May 16 0:00s 0 - +Rule Egypt 2018 only - Jun 15 0:00s 1:00 S +Rule Egypt 2019 only - May 6 0:00s 0 - +Rule Egypt 2019 only - Jun 5 0:00s 1:00 S +Rule Egypt 2020 only - May 24 0:00s 1:00 S +Rule Egypt 2021 only - May 13 0:00s 1:00 S +Rule Egypt 2022 only - May 3 0:00s 1:00 S +Rule Egypt 2023 max - Apr lastFri 0:00s 1:00 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Africa/Cairo 2:05:09 - LMT 1900 Oct diff --git a/jdk/test/sun/util/calendar/zi/tzdata/asia b/jdk/test/sun/util/calendar/zi/tzdata/asia index dc3c94ba9cc..595c8ed7245 100644 --- a/jdk/test/sun/util/calendar/zi/tzdata/asia +++ b/jdk/test/sun/util/calendar/zi/tzdata/asia @@ -1370,22 +1370,6 @@ Zone Asia/Tokyo 9:18:59 - LMT 1887 Dec 31 15:00u # "Jordan will switch to winter time on Friday, October 27". # -# From Phil Pizzey (2009-04-02): -# ...I think I may have spotted an error in the timezone data for -# Jordan. -# The current (2009d) asia file shows Jordan going to daylight -# saving -# time on the last Thursday in March. -# -# Rule Jordan 2000 max - Mar lastThu 0:00s 1:00 S -# -# However timeanddate.com, which I usually find reliable, shows Jordan -# going to daylight saving time on the last Friday in March since 2002. -# Please see -# -# http://www.timeanddate.com/worldclock/timezone.html?n=11 -# - # From Steffen Thorsen (2009-04-02): # This single one might be good enough, (2009-03-24, Arabic): # diff --git a/jdk/test/sun/util/calendar/zi/tzdata/europe b/jdk/test/sun/util/calendar/zi/tzdata/europe index 2b0c5613e60..226c393a0f2 100644 --- a/jdk/test/sun/util/calendar/zi/tzdata/europe +++ b/jdk/test/sun/util/calendar/zi/tzdata/europe @@ -2989,6 +2989,10 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880 # From Alexander Krivenyshev (2014-03-17): # time change at 2:00 (2am) on March 30, 2014 # http://vz.ru/news/2014/3/17/677464.html +# From Paul Eggert (2014-03-30): +# Simferopol and Sevastopol reportedly changed their central town clocks +# late the previous day, but this appears to have been ceremonial +# and the discrepancies are small enough to not worry about. 2:00 EU EE%sT 2014 Mar 30 2:00 4:00 - MSK diff --git a/langtools/.hgtags b/langtools/.hgtags index dfc7913eb60..7020c726d31 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -255,3 +255,4 @@ ea02d24b3f1dd1417132d6587dd38b056cca0be2 jdk9-b08 7736a820af6f15cef9a1499f122e40abc83b2fbd jdk9-b10 f04fccfbd880c819affc3ef33e0083aab9556409 jdk9-b11 72efbe612e494f98b9c3ede1b4a3d02304e1e9cc jdk9-b12 +2c8bb81b5d48161019218c7604fa88c67edc6105 jdk9-b13 diff --git a/langtools/make/netbeans/langtools/nbproject/project.properties b/langtools/make/netbeans/langtools/nbproject/project.properties index 31b5a412ac6..ea7ab7feb1b 100644 --- a/langtools/make/netbeans/langtools/nbproject/project.properties +++ b/langtools/make/netbeans/langtools/nbproject/project.properties @@ -1,3 +1,34 @@ +# +# Copyright (c) 2014, 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. +# +# - Redistributions 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 its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.expand-tabs=true auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.indent-shift-width=4 auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.spaces-per-tab=4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index c1da3347149..44d3275f502 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -878,8 +878,9 @@ public class Util { */ static abstract class DocComparator implements Comparator { /** - * compares two parameter arrays by first comparing the length of the arrays, and - * then each Type of the parameter in the array. + * compares two parameter arrays by comparing each Type of the parameter in the array, + * as possible, if the matched strings are identical, and have mismatched array lengths + * then compare the lengths. * @param params1 the first parameter array. * @param params2 the first parameter array. * @return a negative integer, zero, or a positive integer as the first @@ -889,17 +890,14 @@ public class Util { if (params1.length == 0 && params2.length == 0) { return 0; } - int result = Integer.compare(params1.length, params2.length); - if (result != 0) { - return result; - } - for (int i = 0; i < params1.length; i++) { - result = compareStrings(params1[i].typeName(), params2[i].typeName()); + // try to compare as many as possible + for (int i = 0; i < params1.length && i < params2.length; i++) { + int result = compareStrings(params1[i].typeName(), params2[i].typeName()); if (result != 0) { return result; } } - return 0; + return Integer.compare(params1.length, params2.length); } /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java index 14b238b2827..f2cff56cf65 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java @@ -118,7 +118,8 @@ public abstract class Attribute implements AnnotationValue { : types.erasure(type); return new Type.ClassType(types.syms.classType.getEnclosingType(), List.of(arg), - types.syms.classType.tsym); + types.syms.classType.tsym, + Type.noAnnotations); } public String toString() { return classType + ".class"; diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java index 03019926c08..3309405ac5f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -28,7 +28,6 @@ package com.sun.tools.javac.code; import java.util.Locale; import com.sun.tools.javac.api.Messages; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; @@ -150,14 +149,16 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi @Override public String visitCapturedType(CapturedType t, Locale locale) { if (seenCaptured.contains(t)) - return localize(locale, "compiler.misc.type.captureof.1", - capturedVarId(t, locale)); + return printAnnotations(t) + + localize(locale, "compiler.misc.type.captureof.1", + capturedVarId(t, locale)); else { try { seenCaptured = seenCaptured.prepend(t); - return localize(locale, "compiler.misc.type.captureof", - capturedVarId(t, locale), - visit(t.wildcard, locale)); + return printAnnotations(t) + + localize(locale, "compiler.misc.type.captureof", + capturedVarId(t, locale), + visit(t.wildcard, locale)); } finally { seenCaptured = seenCaptured.tail; @@ -167,15 +168,16 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi @Override public String visitForAll(ForAll t, Locale locale) { - return "<" + visitTypes(t.tvars, locale) + ">" + visit(t.qtype, locale); + return printAnnotations(t) + "<" + visitTypes(t.tvars, locale) + + ">" + visit(t.qtype, locale); } @Override public String visitUndetVar(UndetVar t, Locale locale) { if (t.inst != null) { - return visit(t.inst, locale); + return printAnnotations(t) + visit(t.inst, locale); } else { - return visit(t.qtype, locale) + "?"; + return printAnnotations(t) + visit(t.qtype, locale) + "?"; } } @@ -187,25 +189,34 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi return res.toString(); } - void printBaseElementType(Type t, StringBuilder sb, Locale locale) { + private String printAnnotations(Type t) { + return printAnnotations(t, false); + } + + private String printAnnotations(Type t, boolean prefix) { + StringBuilder sb = new StringBuilder(); + List annos = t.getAnnotationMirrors(); + if (!annos.isEmpty()) { + if (prefix) sb.append(' '); + sb.append(annos); + sb.append(' '); + } + return sb.toString(); + } + + private void printBaseElementType(Type t, StringBuilder sb, Locale locale) { Type arrel = t; while (arrel.hasTag(TypeTag.ARRAY)) { - arrel = arrel.unannotatedType(); arrel = ((ArrayType) arrel).elemtype; } sb.append(visit(arrel, locale)); } - void printBrackets(Type t, StringBuilder sb, Locale locale) { + private void printBrackets(Type t, StringBuilder sb, Locale locale) { Type arrel = t; while (arrel.hasTag(TypeTag.ARRAY)) { - if (arrel.isAnnotated()) { - sb.append(' '); - sb.append(arrel.getAnnotationMirrors()); - sb.append(' '); - } + sb.append(printAnnotations(arrel, true)); sb.append("[]"); - arrel = arrel.unannotatedType(); arrel = ((ArrayType) arrel).elemtype; } } @@ -216,8 +227,10 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi if (t.getEnclosingType().hasTag(CLASS) && t.tsym.owner.kind == Kinds.TYP) { buf.append(visit(t.getEnclosingType(), locale)); buf.append('.'); + buf.append(printAnnotations(t)); buf.append(className(t, false, locale)); } else { + buf.append(printAnnotations(t)); buf.append(className(t, true, locale)); } if (t.getTypeArguments().nonEmpty()) { @@ -230,7 +243,8 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi @Override public String visitMethodType(MethodType t, Locale locale) { - return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + visit(t.restype, locale); + return "(" + printMethodArgs(t.argtypes, false, locale) + ")" + + visit(t.restype, locale); } @Override @@ -243,6 +257,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi StringBuilder s = new StringBuilder(); s.append(t.kind); if (t.kind != UNBOUND) { + s.append(printAnnotations(t)); s.append(visit(t.type, locale)); } return s.toString(); @@ -258,28 +273,6 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi return visitType(t, locale); } - @Override - public String visitAnnotatedType(AnnotatedType t, Locale locale) { - if (t.getAnnotationMirrors().nonEmpty()) { - if (t.unannotatedType().hasTag(TypeTag.ARRAY)) { - StringBuilder res = new StringBuilder(); - printBaseElementType(t, res, locale); - printBrackets(t, res, locale); - return res.toString(); - } else if (t.unannotatedType().hasTag(TypeTag.CLASS) && - t.unannotatedType().getEnclosingType() != Type.noType) { - return visit(t.unannotatedType().getEnclosingType(), locale) + - ". " + - t.getAnnotationMirrors() + - " " + className((ClassType)t.unannotatedType(), false, locale); - } else { - return t.getAnnotationMirrors() + " " + visit(t.unannotatedType(), locale); - } - } else { - return visit(t.unannotatedType(), locale); - } - } - public String visitType(Type t, Locale locale) { String s = (t.tsym == null || t.tsym.name == null) ? localize(locale, "compiler.misc.type.none") @@ -345,8 +338,8 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi args = args.tail; buf.append(','); } - if (args.head.unannotatedType().hasTag(TypeTag.ARRAY)) { - buf.append(visit(((ArrayType) args.head.unannotatedType()).elemtype, locale)); + if (args.head.hasTag(TypeTag.ARRAY)) { + buf.append(visit(((ArrayType) args.head).elemtype, locale)); if (args.head.getAnnotationMirrors().nonEmpty()) { buf.append(' '); buf.append(args.head.getAnnotationMirrors()); diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java index 9a07e3eaea0..35a6ea9b84a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java @@ -234,7 +234,7 @@ public enum Source { public boolean allowGraphInference() { return compareTo(JDK1_8) >= 0; } - public boolean allowStructuralMostSpecific() { + public boolean allowFunctionalInterfaceMostSpecific() { return compareTo(JDK1_8) >= 0; } public static SourceVersion toSourceVersion(Source source) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java index f9980e52c6c..f76d7282c79 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java @@ -956,7 +956,7 @@ public abstract class Symbol extends AnnoConstruct implements Element { this( flags, name, - new ClassType(Type.noType, null, null), + new ClassType(Type.noType, null, null, Type.noAnnotations), owner); this.type.tsym = this; } @@ -992,7 +992,8 @@ public abstract class Symbol extends AnnoConstruct implements Element { public Type erasure(Types types) { if (erasure_field == null) erasure_field = new ClassType(types.erasure(type.getEnclosingType()), - List.nil(), this); + List.nil(), this, + type.getAnnotationMirrors()); return erasure_field; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java index ecaeb86ff32..dba1b9cd2da 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java @@ -80,6 +80,9 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { /** Constant type: special type to be used for marking stuck trees. */ public static final JCNoType stuckType = new JCNoType(); + public static final List noAnnotations = + List.nil(); + /** If this switch is turned on, the names of type variables * and anonymous classes are printed with hashcodes appended. */ @@ -89,6 +92,10 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { */ public TypeSymbol tsym; + /** The type annotations on this type. + */ + protected final List annos; + /** * Checks if the current type tag is equal to the given tag. * @return true if tag is equal to the current type tag. @@ -173,10 +180,15 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public R accept(Type.Visitor v, S s) { return v.visitType(this, s); } - /** Define a type given its tag and type symbol + /** Define a type given its tag, type symbol, and type annotations */ - public Type(TypeSymbol tsym) { + public Type(TypeSymbol tsym, List annos) { + if(annos == null) { + Assert.error("Attempting to create type " + tsym + " with null type annotations"); + } + this.tsym = tsym; + this.annos = annos; } /** An abstract class for mappings from types to types @@ -225,25 +237,15 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { return this; } - public Type annotatedType(List annos) { - return new AnnotatedType(annos, this); - } + public abstract Type annotatedType(List annos); public boolean isAnnotated() { - return false; - } - - /** - * If this is an annotated type, return the underlying type. - * Otherwise, return the type itself. - */ - public Type unannotatedType() { - return this; + return !annos.isEmpty(); } @Override public List getAnnotationMirrors() { - return List.nil(); + return annos; } @@ -272,16 +274,35 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { return ts; } + protected void appendAnnotationsString(StringBuilder sb, + boolean prefix) { + if (isAnnotated()) { + if (prefix) { + sb.append(" "); + } + sb.append(annos); + sb.append(" "); + } + } + + protected void appendAnnotationsString(StringBuilder sb) { + appendAnnotationsString(sb, false); + } + /** The Java source which this type represents. */ public String toString() { - String s = (tsym == null || tsym.name == null) - ? "" - : tsym.name.toString(); - if (moreInfo && hasTag(TYPEVAR)) { - s = s + hashCode(); + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + if (tsym == null || tsym.name == null) { + sb.append(""); + } else { + sb.append(tsym.name); } - return s; + if (moreInfo && hasTag(TYPEVAR)) { + sb.append(hashCode()); + } + return sb.toString(); } /** @@ -333,8 +354,8 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { args = args.tail; buf.append(','); } - if (args.head.unannotatedType().hasTag(ARRAY)) { - buf.append(((ArrayType)args.head.unannotatedType()).elemtype); + if (args.head.hasTag(ARRAY)) { + buf.append(((ArrayType)args.head).elemtype); if (args.head.getAnnotationMirrors().nonEmpty()) { buf.append(args.head.getAnnotationMirrors()); } @@ -486,11 +507,21 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { TypeTag tag; public JCPrimitiveType(TypeTag tag, TypeSymbol tsym) { - super(tsym); + this(tag, tsym, noAnnotations); + } + + public JCPrimitiveType(TypeTag tag, TypeSymbol tsym, + List annos) { + super(tsym, annos); this.tag = tag; Assert.check(tag.isPrimitive); } + @Override + public Type annotatedType(List annos) { + return new JCPrimitiveType(tag, tsym, annos); + } + @Override public boolean isNumeric() { return tag != BOOLEAN; @@ -517,7 +548,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { @Override public Type constType(Object constValue) { final Object value = constValue; - return new JCPrimitiveType(tag, tsym) { + return new JCPrimitiveType(tag, tsym, annos) { @Override public Object constValue() { return value; @@ -601,19 +632,37 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } public WildcardType(Type type, BoundKind kind, TypeSymbol tsym) { - super(tsym); - this.type = Assert.checkNonNull(type); - this.kind = kind; - } - public WildcardType(WildcardType t, TypeVar bound) { - this(t.type, t.kind, t.tsym, bound); + this(type, kind, tsym, null, noAnnotations); } - public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, TypeVar bound) { - this(type, kind, tsym); + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + List annos) { + this(type, kind, tsym, null, annos); + } + + public WildcardType(WildcardType t, TypeVar bound, + List annos) { + this(t.type, t.kind, t.tsym, bound, annos); + } + + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + TypeVar bound) { + this(type, kind, tsym, noAnnotations); + } + + public WildcardType(Type type, BoundKind kind, TypeSymbol tsym, + TypeVar bound, List annos) { + super(tsym, annos); + this.type = Assert.checkNonNull(type); + this.kind = kind; this.bound = bound; } + @Override + public WildcardType annotatedType(List annos) { + return new WildcardType(type, kind, tsym, bound, annos); + } + @Override public TypeTag getTag() { return WILDCARD; @@ -658,6 +707,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { boolean isPrintingBound = false; public String toString() { StringBuilder s = new StringBuilder(); + appendAnnotationsString(s); s.append(kind.toString()); if (kind != UNBOUND) s.append(type); @@ -679,7 +729,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { if (t == type) return this; else - return new WildcardType(t, kind, tsym, bound); + return new WildcardType(t, kind, tsym, bound, annos); } public Type getExtendsBound() { @@ -736,7 +786,12 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public List all_interfaces_field; public ClassType(Type outer, List typarams, TypeSymbol tsym) { - super(tsym); + this(outer, typarams, tsym, noAnnotations); + } + + public ClassType(Type outer, List typarams, TypeSymbol tsym, + List annos) { + super(tsym, annos); this.outer_field = outer; this.typarams_field = typarams; this.allparams_field = null; @@ -753,6 +808,15 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { */ } + @Override + public ClassType annotatedType(List annos) { + final ClassType out = new ClassType(outer_field, typarams_field, tsym, annos); + out.allparams_field = allparams_field; + out.supertype_field = supertype_field; + out.interfaces_field = interfaces_field; + return out; + } + @Override public TypeTag getTag() { return CLASS; @@ -765,7 +829,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public Type constType(Object constValue) { final Object value = constValue; - return new ClassType(getEnclosingType(), typarams_field, tsym) { + return new ClassType(getEnclosingType(), typarams_field, tsym, annos) { @Override public Object constValue() { return value; @@ -781,6 +845,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { */ public String toString() { StringBuilder buf = new StringBuilder(); + appendAnnotationsString(buf); if (getEnclosingType().hasTag(CLASS) && tsym.owner.kind == TYP) { buf.append(getEnclosingType().toString()); buf.append("."); @@ -806,7 +871,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { return s.toString(); } else if (sym.name.isEmpty()) { String s; - ClassType norm = (ClassType) tsym.type.unannotatedType(); + ClassType norm = (ClassType) tsym.type; if (norm == null) { s = Log.getLocalizedString("anonymous.class", (Object)null); } else if (norm.interfaces_field != null && norm.interfaces_field.nonEmpty()) { @@ -858,7 +923,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { return getEnclosingType().isErroneous() || isErroneous(getTypeArguments()) || - this != tsym.type.unannotatedType() && tsym.type.isErroneous(); + this != tsym.type && tsym.type.isErroneous(); } public boolean isParameterized() { @@ -897,7 +962,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { List typarams = getTypeArguments(); List typarams1 = map(typarams, f); if (outer1 == outer && typarams1 == typarams) return this; - else return new ClassType(outer1, typarams1, tsym); + else return new ClassType(outer1, typarams1, tsym, annos); } public boolean contains(Type elem) { @@ -924,7 +989,12 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public static class ErasedClassType extends ClassType { public ErasedClassType(Type outer, TypeSymbol tsym) { - super(outer, List.nil(), tsym); + this(outer, tsym, noAnnotations); + } + + public ErasedClassType(Type outer, TypeSymbol tsym, + List annos) { + super(outer, List.nil(), tsym, annos); } @Override @@ -938,7 +1008,9 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { final List alternatives_field; public UnionClassType(ClassType ct, List alternatives) { - super(ct.outer_field, ct.typarams_field, ct.tsym); + // Presently no way to refer to this type directly, so we + // cannot put annotations directly on it. + super(ct.outer_field, ct.typarams_field, ct.tsym, noAnnotations); allparams_field = ct.allparams_field; supertype_field = ct.supertype_field; interfaces_field = ct.interfaces_field; @@ -971,7 +1043,9 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public boolean allInterfaces; public IntersectionClassType(List bounds, ClassSymbol csym, boolean allInterfaces) { - super(Type.noType, List.nil(), csym); + // Presently no way to refer to this type directly, so we + // cannot put annotations directly on it. + super(Type.noType, List.nil(), csym, noAnnotations); this.allInterfaces = allInterfaces; Assert.check((csym.flags() & COMPOUND) != 0); supertype_field = bounds.head; @@ -1011,10 +1085,20 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public Type elemtype; public ArrayType(Type elemtype, TypeSymbol arrayClass) { - super(arrayClass); + this(elemtype, arrayClass, noAnnotations); + } + + public ArrayType(Type elemtype, TypeSymbol arrayClass, + List annos) { + super(arrayClass, annos); this.elemtype = elemtype; } + @Override + public ArrayType annotatedType(List annos) { + return new ArrayType(elemtype, tsym, annos); + } + @Override public TypeTag getTag() { return ARRAY; @@ -1025,7 +1109,11 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } public String toString() { - return elemtype + "[]"; + StringBuilder sb = new StringBuilder(); + sb.append(elemtype); + appendAnnotationsString(sb, true); + sb.append("[]"); + return sb.toString(); } public boolean equals(Object obj) { @@ -1068,7 +1156,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } public ArrayType makeVarargs() { - return new ArrayType(elemtype, tsym) { + return new ArrayType(elemtype, tsym, annos) { @Override public boolean isVarargs() { return true; @@ -1079,7 +1167,7 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public Type map(Mapping f) { Type elemtype1 = f.apply(elemtype); if (elemtype1 == elemtype) return this; - else return new ArrayType(elemtype1, tsym); + else return new ArrayType(elemtype1, tsym, annos); } public boolean contains(Type elem) { @@ -1117,12 +1205,19 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { Type restype, List thrown, TypeSymbol methodClass) { - super(methodClass); + // Presently no way to refer to a method type directly, so + // we cannot put type annotations on it. + super(methodClass, noAnnotations); this.argtypes = argtypes; this.restype = restype; this.thrown = thrown; } + @Override + public MethodType annotatedType(List annos) { + throw new AssertionError("Cannot annotate a method type"); + } + @Override public TypeTag getTag() { return METHOD; @@ -1138,7 +1233,13 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { * should be. */ public String toString() { - return "(" + argtypes + ")" + restype; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append('('); + sb.append(argtypes); + sb.append(')'); + sb.append(restype); + return sb.toString(); } public List getParameterTypes() { return argtypes; } @@ -1197,7 +1298,13 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public static class PackageType extends Type implements NoType { PackageType(TypeSymbol tsym) { - super(tsym); + // Package types cannot be annotated + super(tsym, noAnnotations); + } + + @Override + public PackageType annotatedType(List annos) { + throw new AssertionError("Cannot annotate a package type"); } @Override @@ -1245,17 +1352,28 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public Type lower; public TypeVar(Name name, Symbol owner, Type lower) { - super(null); + this(name, owner, lower, noAnnotations); + } + + public TypeVar(Name name, Symbol owner, Type lower, + List annos) { + super(null, annos); tsym = new TypeVariableSymbol(0, name, this, owner); this.lower = lower; } - public TypeVar(TypeSymbol tsym, Type bound, Type lower) { - super(tsym); + public TypeVar(TypeSymbol tsym, Type bound, Type lower, + List annos) { + super(tsym, annos); this.bound = bound; this.lower = lower; } + @Override + public TypeVar annotatedType(List annos) { + return new TypeVar(tsym, bound, lower, annos); + } + @Override public TypeTag getTag() { return TYPEVAR; @@ -1317,13 +1435,29 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { Symbol owner, Type upper, Type lower, - WildcardType wildcard) { - super(name, owner, lower); + WildcardType wildcard, + List annos) { + super(name, owner, lower, annos); this.lower = Assert.checkNonNull(lower); this.bound = upper; this.wildcard = wildcard; } + public CapturedType(TypeSymbol tsym, + Type bound, + Type upper, + Type lower, + WildcardType wildcard, + List annos) { + super(tsym, bound, lower, annos); + this.wildcard = wildcard; + } + + @Override + public CapturedType annotatedType(List annos) { + return new CapturedType(tsym, bound, bound, lower, wildcard, annos); + } + @Override public R accept(Type.Visitor v, S s) { return v.visitCapturedType(this, s); @@ -1336,18 +1470,22 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { @Override public String toString() { - return "capture#" - + (hashCode() & 0xFFFFFFFFL) % Printer.PRIME - + " of " - + wildcard; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append("capture#"); + sb.append((hashCode() & 0xFFFFFFFFL) % Printer.PRIME); + sb.append(" of "); + sb.append(wildcard); + return sb.toString(); } } public static abstract class DelegatedType extends Type { public Type qtype; public TypeTag tag; - public DelegatedType(TypeTag tag, Type qtype) { - super(qtype.tsym); + public DelegatedType(TypeTag tag, Type qtype, + List annos) { + super(qtype.tsym, annos); this.tag = tag; this.qtype = qtype; } @@ -1373,17 +1511,28 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public List tvars; public ForAll(List tvars, Type qtype) { - super(FORALL, (MethodType)qtype); + super(FORALL, (MethodType)qtype, noAnnotations); this.tvars = tvars; } + @Override + public ForAll annotatedType(List annos) { + throw new AssertionError("Cannot annotate forall type"); + } + @Override public R accept(Type.Visitor v, S s) { return v.visitForAll(this, s); } public String toString() { - return "<" + tvars + ">" + qtype; + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + sb.append('<'); + sb.append(tvars); + sb.append('>'); + sb.append(qtype); + return sb.toString(); } public List getTypeArguments() { return tvars; } @@ -1479,7 +1628,8 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } public UndetVar(TypeVar origin, Types types) { - super(UNDETVAR, origin); + // This is a synthesized internal type, so we cannot annotate it. + super(UNDETVAR, origin, noAnnotations); bounds = new EnumMap<>(InferenceBound.class); List declaredBounds = types.getBounds(origin); declaredCount = declaredBounds.length(); @@ -1489,7 +1639,15 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } public String toString() { - return (inst == null) ? qtype + "?" : inst.toString(); + StringBuilder sb = new StringBuilder(); + appendAnnotationsString(sb); + if (inst == null) { + sb.append(qtype); + sb.append('?'); + } else { + sb.append(inst); + } + return sb.toString(); } public String debugString() { @@ -1506,6 +1664,11 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { return result; } + @Override + public UndetVar annotatedType(List annos) { + throw new AssertionError("Cannot annotate an UndetVar type"); + } + @Override public boolean isPartial() { return true; @@ -1659,7 +1822,15 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { */ public static class JCNoType extends Type implements NoType { public JCNoType() { - super(null); + // Need to use List.nil(), because JCNoType constructor + // gets called in static initializers in Type, where + // noAnnotations is also defined. + super(null, List.nil()); + } + + @Override + public JCNoType annotatedType(List annos) { + throw new AssertionError("Cannot annotate JCNoType"); } @Override @@ -1686,7 +1857,13 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { public static class JCVoidType extends Type implements NoType { public JCVoidType() { - super(null); + // Void cannot be annotated + super(null, noAnnotations); + } + + @Override + public JCVoidType annotatedType(List annos) { + throw new AssertionError("Cannot annotate void type"); } @Override @@ -1715,7 +1892,13 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { static class BottomType extends Type implements NullType { public BottomType() { - super(null); + // Bottom is a synthesized internal type, so it cannot be annotated + super(null, noAnnotations); + } + + @Override + public BottomType annotatedType(List annos) { + throw new AssertionError("Cannot annotate bottom type"); } @Override @@ -1759,7 +1942,12 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { private Type originalType = null; public ErrorType(Type originalType, TypeSymbol tsym) { - super(noType, List.nil(), null); + this(originalType, tsym, noAnnotations); + } + + public ErrorType(Type originalType, TypeSymbol tsym, + List typeAnnotations) { + super(noType, List.nil(), null, typeAnnotations); this.tsym = tsym; this.originalType = (originalType == null ? noType : originalType); } @@ -1771,6 +1959,11 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { c.members_field = new Scope.ErrorScope(c); } + @Override + public ErrorType annotatedType(List annos) { + return new ErrorType(originalType, tsym, annos); + } + @Override public TypeTag getTag() { return ERROR; @@ -1827,182 +2020,17 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { } } - public static class AnnotatedType extends Type - implements - javax.lang.model.type.ArrayType, - javax.lang.model.type.DeclaredType, - javax.lang.model.type.PrimitiveType, - javax.lang.model.type.TypeVariable, - javax.lang.model.type.WildcardType { - /** The type annotations on this type. - */ - private List typeAnnotations; - - /** The underlying type that is annotated. - */ - private Type underlyingType; - - protected AnnotatedType(List typeAnnotations, - Type underlyingType) { - super(underlyingType.tsym); - this.typeAnnotations = typeAnnotations; - this.underlyingType = underlyingType; - Assert.check(typeAnnotations != null && typeAnnotations.nonEmpty(), - "Can't create AnnotatedType without annotations: " + underlyingType); - Assert.check(!underlyingType.isAnnotated(), - "Can't annotate already annotated type: " + underlyingType + - "; adding: " + typeAnnotations); - } - - @Override - public TypeTag getTag() { - return underlyingType.getTag(); - } - - @Override - public boolean isAnnotated() { - return true; - } - - @Override - public List getAnnotationMirrors() { - return typeAnnotations; - } - - - @Override - public TypeKind getKind() { - return underlyingType.getKind(); - } - - @Override - public Type unannotatedType() { - return underlyingType; - } - - @Override - public R accept(Type.Visitor v, S s) { - return v.visitAnnotatedType(this, s); - } - - @Override - public R accept(TypeVisitor v, P p) { - return underlyingType.accept(v, p); - } - - @Override - public Type map(Mapping f) { - underlyingType.map(f); - return this; - } - - @Override - public Type constType(Object constValue) { return underlyingType.constType(constValue); } - @Override - public Type getEnclosingType() { return underlyingType.getEnclosingType(); } - - @Override - public Type getReturnType() { return underlyingType.getReturnType(); } - @Override - public List getTypeArguments() { return underlyingType.getTypeArguments(); } - @Override - public List getParameterTypes() { return underlyingType.getParameterTypes(); } - @Override - public Type getReceiverType() { return underlyingType.getReceiverType(); } - @Override - public List getThrownTypes() { return underlyingType.getThrownTypes(); } - @Override - public Type getUpperBound() { return underlyingType.getUpperBound(); } - @Override - public Type getLowerBound() { return underlyingType.getLowerBound(); } - - @Override - public boolean isErroneous() { return underlyingType.isErroneous(); } - @Override - public boolean isCompound() { return underlyingType.isCompound(); } - @Override - public boolean isInterface() { return underlyingType.isInterface(); } - @Override - public List allparams() { return underlyingType.allparams(); } - @Override - public boolean isPrimitive() { return underlyingType.isPrimitive(); } - @Override - public boolean isPrimitiveOrVoid() { return underlyingType.isPrimitiveOrVoid(); } - @Override - public boolean isNumeric() { return underlyingType.isNumeric(); } - @Override - public boolean isReference() { return underlyingType.isReference(); } - @Override - public boolean isNullOrReference() { return underlyingType.isNullOrReference(); } - @Override - public boolean isPartial() { return underlyingType.isPartial(); } - @Override - public boolean isParameterized() { return underlyingType.isParameterized(); } - @Override - public boolean isRaw() { return underlyingType.isRaw(); } - @Override - public boolean isFinal() { return underlyingType.isFinal(); } - @Override - public boolean isSuperBound() { return underlyingType.isSuperBound(); } - @Override - public boolean isExtendsBound() { return underlyingType.isExtendsBound(); } - @Override - public boolean isUnbound() { return underlyingType.isUnbound(); } - - @Override - public String toString() { - // This method is only used for internal debugging output. - // See - // com.sun.tools.javac.code.Printer.visitAnnotatedType(AnnotatedType, Locale) - // for the user-visible logic. - if (typeAnnotations != null && - !typeAnnotations.isEmpty()) { - return "(" + typeAnnotations.toString() + " :: " + underlyingType.toString() + ")"; - } else { - return "({} :: " + underlyingType.toString() +")"; - } - } - - @Override - public boolean contains(Type t) { return underlyingType.contains(t); } - - @Override - public Type withTypeVar(Type t) { - // Don't create a new AnnotatedType, as 'this' will - // get its annotations set later. - underlyingType = underlyingType.withTypeVar(t); - return this; - } - - // TODO: attach annotations? - @Override - public TypeSymbol asElement() { return underlyingType.asElement(); } - - // TODO: attach annotations? - @Override - public MethodType asMethodType() { return underlyingType.asMethodType(); } - - @Override - public void complete() { underlyingType.complete(); } - - @Override - public TypeMirror getComponentType() { return ((ArrayType)underlyingType).getComponentType(); } - - // The result is an ArrayType, but only in the model sense, not the Type sense. - public Type makeVarargs() { - return ((ArrayType) underlyingType).makeVarargs().annotatedType(typeAnnotations); - } - - @Override - public TypeMirror getExtendsBound() { return ((WildcardType)underlyingType).getExtendsBound(); } - @Override - public TypeMirror getSuperBound() { return ((WildcardType)underlyingType).getSuperBound(); } - } - public static class UnknownType extends Type { public UnknownType() { - super(null); + // Unknown is a synthesized internal type, so it cannot be + // annotated. + super(null, noAnnotations); + } + + @Override + public UnknownType annotatedType(List annos) { + throw new AssertionError("Cannot annotate unknown type"); } @Override @@ -2046,7 +2074,6 @@ public abstract class Type extends AnnoConstruct implements TypeMirror { R visitForAll(ForAll t, S s); R visitUndetVar(UndetVar t, S s); R visitErrorType(ErrorType t, S s); - R visitAnnotatedType(AnnotatedType t, S s); R visitType(Type t, S s); } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java index 39b53f99cba..55412a2853a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java @@ -326,15 +326,21 @@ public class TypeAnnotationPosition { public int getCatchType() { Assert.check(hasCatchType(), - "exception_index does not contain a valid catch type"); - return (-this.exception_index) - 1 ; + "exception_index does not contain valid catch info"); + return ((-this.exception_index) - 1) & 0xff ; } - public void setCatchType(final int catchType) { + public int getStartPos() { + Assert.check(hasCatchType(), + "exception_index does not contain valid catch info"); + return ((-this.exception_index) - 1) >> 8 ; + } + + public void setCatchInfo(final int catchType, final int startPos) { Assert.check(this.exception_index < 0, "exception_index already contains a bytecode index"); Assert.check(catchType >= 0, "Expected a valid catch type"); - this.exception_index = -(catchType + 1); + this.exception_index = -((catchType | startPos << 8) + 1); } /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java index 88bbf4b7830..1fa63c1ae5e 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeAnnotations.java @@ -32,7 +32,6 @@ import javax.lang.model.type.TypeKind; import javax.tools.JavaFileObject; import com.sun.tools.javac.code.Attribute.TypeCompound; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.CapturedType; import com.sun.tools.javac.code.Type.ClassType; @@ -331,7 +330,6 @@ public class TypeAnnotations { // Note that we don't use the result, the call to // typeWithAnnotations side-effects the type annotation positions. // This is important for constructors of nested classes. - sym.appendUniqueTypeAttributes(typeAnnotations); return; } @@ -391,14 +389,15 @@ public class TypeAnnotations { private Type typeWithAnnotations(final JCTree typetree, final Type type, final List annotations, final List onlyTypeAnnotations) { - // System.out.printf("typeWithAnnotations(typetree: %s, type: %s, annotations: %s, onlyTypeAnnotations: %s)%n", + //System.err.printf("typeWithAnnotations(typetree: %s, type: %s, annotations: %s, onlyTypeAnnotations: %s)%n", // typetree, type, annotations, onlyTypeAnnotations); if (annotations.isEmpty()) { return type; } if (type.hasTag(TypeTag.ARRAY)) { - Type.ArrayType arType = (Type.ArrayType) type.unannotatedType(); - Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym); + Type.ArrayType arType = (Type.ArrayType) type; + Type.ArrayType tomodify = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); Type toreturn; if (type.isAnnotated()) { toreturn = tomodify.annotatedType(type.getAnnotationMirrors()); @@ -413,13 +412,15 @@ public class TypeAnnotations { while (arType.elemtype.hasTag(TypeTag.ARRAY)) { if (arType.elemtype.isAnnotated()) { Type aelemtype = arType.elemtype; - arType = (Type.ArrayType) aelemtype.unannotatedType(); + arType = (Type.ArrayType) aelemtype; ArrayType prevToMod = tomodify; - tomodify = new Type.ArrayType(null, arType.tsym); + tomodify = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); prevToMod.elemtype = tomodify.annotatedType(arType.elemtype.getAnnotationMirrors()); } else { arType = (Type.ArrayType) arType.elemtype; - tomodify.elemtype = new Type.ArrayType(null, arType.tsym); + tomodify.elemtype = new Type.ArrayType(null, arType.tsym, + Type.noAnnotations); tomodify = (Type.ArrayType) tomodify.elemtype; } arTree = arrayTypeTree(arTree.elemtype); @@ -569,6 +570,7 @@ public class TypeAnnotations { private Type typeWithAnnotations(final Type type, final Type stopAt, final List annotations) { + //System.err.println("typeWithAnnotations " + type + " " + annotations + " stopAt " + stopAt); Visitor> visitor = new Type.Visitor>() { @Override @@ -579,7 +581,8 @@ public class TypeAnnotations { return t.annotatedType(s); } else { ClassType ret = new ClassType(t.getEnclosingType().accept(this, s), - t.typarams_field, t.tsym); + t.typarams_field, t.tsym, + t.getAnnotationMirrors()); ret.all_interfaces_field = t.all_interfaces_field; ret.allparams_field = t.allparams_field; ret.interfaces_field = t.interfaces_field; @@ -589,11 +592,6 @@ public class TypeAnnotations { } } - @Override - public Type visitAnnotatedType(AnnotatedType t, List s) { - return t.unannotatedType().accept(this, s).annotatedType(t.getAnnotationMirrors()); - } - @Override public Type visitWildcardType(WildcardType t, List s) { return t.annotatedType(s); @@ -601,7 +599,8 @@ public class TypeAnnotations { @Override public Type visitArrayType(ArrayType t, List s) { - ArrayType ret = new ArrayType(t.elemtype.accept(this, s), t.tsym); + ArrayType ret = new ArrayType(t.elemtype.accept(this, s), t.tsym, + t.getAnnotationMirrors()); return ret; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index ab29deaeda1..2184d0c1490 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -131,7 +131,7 @@ public class Types { * @return the upper bound of the given type */ public Type upperBound(Type t) { - return upperBound.visit(t).unannotatedType(); + return upperBound.visit(t); } // where private final MapVisitor upperBound = new MapVisitor() { @@ -205,7 +205,7 @@ public class Types { WildcardType unb = new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - (TypeVar)parms.head.unannotatedType()); + (TypeVar)parms.head); if (!containsType(args.head, unb)) return false; parms = parms.tail; @@ -269,7 +269,9 @@ public class Types { List opens = openVars.toList(); ListBuffer qs = new ListBuffer<>(); for (List iter = opens; iter.nonEmpty(); iter = iter.tail) { - qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, (TypeVar) iter.head.unannotatedType())); + qs.append(new WildcardType(syms.objectType, BoundKind.UNBOUND, + syms.boundClass, (TypeVar) iter.head, + Type.noAnnotations)); } res = subst(res, opens, qs.toList()); } @@ -599,12 +601,12 @@ public class Types { //simply replace the wildcards with its bound for (Type t : formalInterface.getTypeArguments()) { if (actualTypeargs.head.hasTag(WILDCARD)) { - WildcardType wt = (WildcardType)actualTypeargs.head.unannotatedType(); + WildcardType wt = (WildcardType)actualTypeargs.head; Type bound; switch (wt.kind) { case EXTENDS: case UNBOUND: - CapturedType capVar = (CapturedType)capturedTypeargs.head.unannotatedType(); + CapturedType capVar = (CapturedType)capturedTypeargs.head; //use declared bound if it doesn't depend on formal type-args bound = capVar.bound.containsAny(capturedSite.getTypeArguments()) ? wt.type : capVar.bound; @@ -642,7 +644,8 @@ public class Types { csym.members_field = new Scope(csym); MethodSymbol instDescSym = new MethodSymbol(descSym.flags(), descSym.name, descType, csym); csym.members_field.enter(instDescSym); - Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym); + Type.ClassType ctype = new Type.ClassType(Type.noType, List.nil(), csym, + Type.noAnnotations); ctype.supertype_field = syms.objectType; ctype.interfaces_field = targets; csym.type = ctype; @@ -747,8 +750,6 @@ public class Types { //where private boolean isSubtypeUncheckedInternal(Type t, Type s, Warner warn) { if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) { - t = t.unannotatedType(); - s = s.unannotatedType(); if (((ArrayType)t).elemtype.isPrimitive()) { return isSameType(elemtype(t), elemtype(s)); } else { @@ -776,8 +777,6 @@ public class Types { if (!t.hasTag(ARRAY) || isReifiable(t)) { return; } - t = t.unannotatedType(); - s = s.unannotatedType(); ArrayType from = (ArrayType)t; boolean shouldWarn = false; switch (s.getTag()) { @@ -807,12 +806,6 @@ public class Types { return isSubtype(t, s, false); } public boolean isSubtype(Type t, Type s, boolean capture) { - if (t == s) - return true; - - t = t.unannotatedType(); - s = s.unannotatedType(); - if (t == s) return true; @@ -828,8 +821,9 @@ public class Types { } // Generally, if 's' is a type variable, recur on lower bound; but - // for alpha <: CAP, alpha should get upper bound CAP - if (!t.hasTag(UNDETVAR)) { + // for inference variables and intersections, we need to keep 's' + // (see JLS 4.10.2 for intersections and 18.2.3 for inference vars) + if (!t.hasTag(UNDETVAR) && !t.isCompound()) { // TODO: JDK-8039198, bounds checking sometimes passes in a wildcard as s Type lower = cvarLowerBound(wildLowerBound(s)); if (s != lower) @@ -899,12 +893,14 @@ public class Types { if (s.isSuperBound() && !s.isExtendsBound()) { s = new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, + s.getAnnotationMirrors()); changed = true; } else if (s != orig) { s = new WildcardType(upperBound(s), BoundKind.EXTENDS, - syms.boundClass); + syms.boundClass, + s.getAnnotationMirrors()); changed = true; } rewrite.append(s); @@ -918,14 +914,11 @@ public class Types { @Override public Boolean visitClassType(ClassType t, Type s) { Type sup = asSuper(t, s.tsym); - return sup != null - && sup.tsym == s.tsym - // You're not allowed to write - // Vector vec = new Vector(); - // But with wildcards you can write - // Vector vec = new Vector(); - // which means that subtype checking must be done - // here instead of same-type checking (via containsType). + if (sup == null) return false; + // If t is an intersection, sup might not be a class type + if (!sup.hasTag(CLASS)) return isSubtypeNoCapture(sup, s); + return sup.tsym == s.tsym + // Check type variable containment && (!s.isParameterized() || containsTypeRecursive(s, sup)) && isSubtypeNoCapture(sup.getEnclosingType(), s.getEnclosingType()); @@ -1107,7 +1100,7 @@ public class Types { if (s.hasTag(TYPEVAR)) { //type-substitution does not preserve type-var types //check that type var symbols and bounds are indeed the same - return sameTypeVars((TypeVar)t.unannotatedType(), (TypeVar)s.unannotatedType()); + return sameTypeVars((TypeVar)t, (TypeVar)s); } else { //special case for s == ? super X, where upper(s) = u @@ -1149,9 +1142,9 @@ public class Types { HashSet set = new HashSet<>(); for (Type x : interfaces(t)) - set.add(new UniqueType(x.unannotatedType(), Types.this)); + set.add(new UniqueType(x, Types.this)); for (Type x : interfaces(s)) { - if (!set.remove(new UniqueType(x.unannotatedType(), Types.this))) + if (!set.remove(new UniqueType(x, Types.this))) return false; } return (set.isEmpty()); @@ -1256,30 +1249,47 @@ public class Types { if (!s.hasTag(WILDCARD)) { return false; } else { - WildcardType t2 = (WildcardType)s.unannotatedType(); + WildcardType t2 = (WildcardType)s; return t.kind == t2.kind && isSameType(t.type, t2.type, true); } } }; - /** - * A version of LooseSameTypeVisitor that takes AnnotatedTypes - * into account. - */ - TypeRelation isSameAnnotatedType = new LooseSameTypeVisitor() { + // + + TypeRelation isSameAnnotatedType = new LooseSameTypeVisitor() { + private Boolean compareAnnotations(Type t1, Type t2) { + List annos1 = t1.getAnnotationMirrors(); + List annos2 = t2.getAnnotationMirrors(); + return annos1.containsAll(annos2) && annos2.containsAll(annos1); + } + @Override - public Boolean visitAnnotatedType(AnnotatedType t, Type s) { - if (!s.isAnnotated()) - return false; - if (!t.getAnnotationMirrors().containsAll(s.getAnnotationMirrors())) - return false; - if (!s.getAnnotationMirrors().containsAll(t.getAnnotationMirrors())) - return false; - return visit(t.unannotatedType(), s); + public Boolean visitType(Type t, Type s) { + return compareAnnotations(t, s) && super.visitType(t, s); + } + + @Override + public Boolean visitWildcardType(WildcardType t, Type s) { + return compareAnnotations(t, s) && super.visitWildcardType(t, s); + } + + @Override + public Boolean visitClassType(ClassType t, Type s) { + return compareAnnotations(t, s) && super.visitClassType(t, s); + } + + @Override + public Boolean visitArrayType(ArrayType t, Type s) { + return compareAnnotations(t, s) && super.visitArrayType(t, s); + } + + @Override + public Boolean visitForAll(ForAll t, Type s) { + return compareAnnotations(t, s) && super.visitForAll(t, s); } }; - // // public boolean containedBy(Type t, Type s) { @@ -1287,7 +1297,7 @@ public class Types { case UNDETVAR: if (s.hasTag(WILDCARD)) { UndetVar undetvar = (UndetVar)t; - WildcardType wt = (WildcardType)s.unannotatedType(); + WildcardType wt = (WildcardType)s; switch(wt.kind) { case UNBOUND: //similar to ? extends Object case EXTENDS: { @@ -1354,7 +1364,7 @@ public class Types { private Type U(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; if (w.isSuperBound()) return w.bound == null ? syms.objectType : w.bound.bound; else @@ -1365,7 +1375,7 @@ public class Types { private Type L(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; if (w.isExtendsBound()) return syms.botType; else @@ -1424,15 +1434,15 @@ public class Types { }; public boolean isCaptureOf(Type s, WildcardType t) { - if (!s.hasTag(TYPEVAR) || !((TypeVar)s.unannotatedType()).isCaptured()) + if (!s.hasTag(TYPEVAR) || !((TypeVar)s).isCaptured()) return false; - return isSameWildcard(t, ((CapturedType)s.unannotatedType()).wildcard); + return isSameWildcard(t, ((CapturedType)s).wildcard); } public boolean isSameWildcard(WildcardType t, Type s) { if (!s.hasTag(WILDCARD)) return false; - WildcardType w = (WildcardType)s.unannotatedType(); + WildcardType w = (WildcardType)s; return w.kind == t.kind && w.type == t.type; } @@ -1541,8 +1551,8 @@ public class Types { if (t.isCompound() || s.isCompound()) { return !t.isCompound() ? - visitIntersectionType((IntersectionClassType)s.unannotatedType(), t, true) : - visitIntersectionType((IntersectionClassType)t.unannotatedType(), s, false); + visitIntersectionType((IntersectionClassType)s, t, true) : + visitIntersectionType((IntersectionClassType)t, s, false); } if (s.hasTag(CLASS) || s.hasTag(ARRAY)) { @@ -1873,7 +1883,6 @@ public class Types { case WILDCARD: return elemtype(upperBound(t)); case ARRAY: - t = t.unannotatedType(); return ((ArrayType)t).elemtype; case FORALL: return elemtype(((ForAll)t).qtype); @@ -1920,7 +1929,7 @@ public class Types { if (t.hasTag(VOID) || t.hasTag(PACKAGE)) { Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString()); } - return new ArrayType(t, syms.arrayClass); + return new ArrayType(t, syms.arrayClass, Type.noAnnotations); } // @@ -1959,16 +1968,18 @@ public class Types { return t; Type st = supertype(t); - if (st.hasTag(CLASS) || st.hasTag(TYPEVAR) || st.hasTag(ERROR)) { + if (st.hasTag(CLASS) || st.hasTag(TYPEVAR)) { Type x = asSuper(st, sym); if (x != null) return x; } if ((sym.flags() & INTERFACE) != 0) { for (List l = interfaces(t); l.nonEmpty(); l = l.tail) { - Type x = asSuper(l.head, sym); - if (x != null) - return x; + if (!l.head.hasTag(ERROR)) { + Type x = asSuper(l.head, sym); + if (x != null) + return x; + } } } return null; @@ -2175,56 +2186,65 @@ public class Types { } private Type erasure(Type t, boolean recurse) { - if (t.isPrimitive()) + if (t.isPrimitive()) { return t; /* fast special case */ - else - return erasure.visit(t, recurse); + } else { + Type out = erasure.visit(t, recurse); + return out; + } } // where private SimpleVisitor erasure = new SimpleVisitor() { public Type visitType(Type t, Boolean recurse) { if (t.isPrimitive()) return t; /*fast special case*/ - else - return t.map(recurse ? erasureRecFun : erasureFun); + else { + final List annos = t.getAnnotationMirrors(); + Type erased = t.map(recurse ? erasureRecFun : erasureFun); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; + } } @Override public Type visitWildcardType(WildcardType t, Boolean recurse) { - return erasure(upperBound(t), recurse); + final List annos = t.getAnnotationMirrors(); + Type erased = erasure(upperBound(t), recurse); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; } @Override public Type visitClassType(ClassType t, Boolean recurse) { Type erased = t.tsym.erasure(Types.this); + List annos = t.getAnnotationMirrors(); if (recurse) { erased = new ErasedClassType(erased.getEnclosingType(),erased.tsym); } + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } return erased; } @Override public Type visitTypeVar(TypeVar t, Boolean recurse) { - return erasure(t.bound, recurse); + final List annos = t.getAnnotationMirrors(); + Type erased = erasure(t.bound, recurse); + if (!annos.isEmpty()) { + erased = erased.annotatedType(annos); + } + return erased; } @Override public Type visitErrorType(ErrorType t, Boolean recurse) { return t; } - - @Override - public Type visitAnnotatedType(AnnotatedType t, Boolean recurse) { - Type erased = erasure(t.unannotatedType(), recurse); - if (erased.isAnnotated()) { - // This can only happen when the underlying type is a - // type variable and the upper bound of it is annotated. - // The annotation on the type variable overrides the one - // on the bound. - erased = ((AnnotatedType)erased).unannotatedType(); - } - return erased.annotatedType(t.getAnnotationMirrors()); - } }; private Mapping erasureFun = new Mapping ("erasure") { @@ -2550,7 +2570,8 @@ public class Types { public Type visitClassType(ClassType t, Void ignored) { Type outer1 = classBound(t.getEnclosingType()); if (outer1 != t.getEnclosingType()) - return new ClassType(outer1, t.getTypeArguments(), t.tsym); + return new ClassType(outer1, t.getTypeArguments(), t.tsym, + t.getAnnotationMirrors()); else return t; } @@ -2965,7 +2986,8 @@ public class Types { if (typarams1 == typarams && outer1 == outer) return t; else - return new ClassType(outer1, typarams1, t.tsym); + return new ClassType(outer1, typarams1, t.tsym, + t.getAnnotationMirrors()); } else { Type st = subst(supertype(t)); List is = upperBounds(subst(interfaces(t))); @@ -2986,7 +3008,8 @@ public class Types { } else { if (t.isExtendsBound() && bound.isExtendsBound()) bound = upperBound(bound); - return new WildcardType(bound, t.kind, syms.boundClass, t.bound); + return new WildcardType(bound, t.kind, syms.boundClass, + t.bound, t.getAnnotationMirrors()); } } @@ -2996,7 +3019,7 @@ public class Types { if (elemtype == t.elemtype) return t; else - return new ArrayType(elemtype, t.tsym); + return new ArrayType(elemtype, t.tsym, t.getAnnotationMirrors()); } @Override @@ -3006,7 +3029,7 @@ public class Types { //if 'to' types contain variables that are free in 't' List freevars = newInstances(t.tvars); t = new ForAll(freevars, - Types.this.subst(t.qtype, t.tvars, freevars)); + Types.this.subst(t.qtype, t.tvars, freevars)); } List tvars1 = substBounds(t.tvars, from, to); Type qtype1 = subst(t.qtype); @@ -3015,7 +3038,8 @@ public class Types { } else if (tvars1 == t.tvars) { return new ForAll(tvars1, qtype1); } else { - return new ForAll(tvars1, Types.this.subst(qtype1, t.tvars, tvars1)); + return new ForAll(tvars1, + Types.this.subst(qtype1, t.tvars, tvars1)); } } @@ -3045,7 +3069,8 @@ public class Types { ListBuffer newTvars = new ListBuffer<>(); // create new type variables without bounds for (Type t : tvars) { - newTvars.append(new TypeVar(t.tsym, null, syms.botType)); + newTvars.append(new TypeVar(t.tsym, null, syms.botType, + t.getAnnotationMirrors())); } // the new bounds should use the new type variables in place // of the old @@ -3071,7 +3096,8 @@ public class Types { return t; else { // create new type variable without bounds - TypeVar tv = new TypeVar(t.tsym, null, syms.botType); + TypeVar tv = new TypeVar(t.tsym, null, syms.botType, + t.getAnnotationMirrors()); // the new bound should use the new type variable in place // of the old tv.bound = subst(bound1, List.of(t), List.of(tv)); @@ -3112,7 +3138,7 @@ public class Types { return tvars1; } private static final Mapping newInstanceFun = new Mapping("newInstanceFun") { - public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound()); } + public Type apply(Type t) { return new TypeVar(t.tsym, t.getUpperBound(), t.getLowerBound(), t.getAnnotationMirrors()); } }; // @@ -3185,7 +3211,6 @@ public class Types { * graph. Undefined for all but reference types. */ public int rank(Type t) { - t = t.unannotatedType(); switch(t.getTag()) { case CLASS: { ClassType cls = (ClassType)t; @@ -3267,7 +3292,7 @@ public class Types { for (Type t : tvars) { if (!first) s.append(", "); first = false; - appendTyparamString(((TypeVar)t.unannotatedType()), s); + appendTyparamString(((TypeVar)t), s); } s.append('>'); return s.toString(); @@ -3439,12 +3464,14 @@ public class Types { m = new WildcardType(lub(upperBound(act1.head), upperBound(act2.head)), BoundKind.EXTENDS, - syms.boundClass); + syms.boundClass, + Type.noAnnotations); mergeCache.remove(pair); } else { m = new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, + Type.noAnnotations); } merged.append(m.withTypeVar(typarams.head)); } @@ -3453,7 +3480,10 @@ public class Types { typarams = typarams.tail; } Assert.check(act1.isEmpty() && act2.isEmpty() && typarams.isEmpty()); - return new ClassType(class1.getEnclosingType(), merged.toList(), class1.tsym); + // There is no spec detailing how type annotations are to + // be inherited. So set it to noAnnotations for now + return new ClassType(class1.getEnclosingType(), merged.toList(), + class1.tsym, Type.noAnnotations); } /** @@ -3571,7 +3601,8 @@ public class Types { } } // lub(A[], B[]) is lub(A, B)[] - return new ArrayType(lub(elements), syms.arrayClass); + return new ArrayType(lub(elements), syms.arrayClass, + Type.noAnnotations); case CLASS_BOUND: // calculate lub(A, B) @@ -3932,7 +3963,6 @@ public class Types { t = subst(type1, t.tsym.type.getTypeArguments(), t.getTypeArguments()); } } - t = t.unannotatedType(); ClassType cls = (ClassType)t; if (cls.isRaw() || !cls.isParameterized()) return cls; @@ -3951,9 +3981,9 @@ public class Types { !currentS.isEmpty()) { if (currentS.head != currentT.head) { captured = true; - WildcardType Ti = (WildcardType)currentT.head.unannotatedType(); + WildcardType Ti = (WildcardType)currentT.head; Type Ui = currentA.head.getUpperBound(); - CapturedType Si = (CapturedType)currentS.head.unannotatedType(); + CapturedType Si = (CapturedType)currentS.head; if (Ui == null) Ui = syms.objectType; switch (Ti.kind) { @@ -3986,7 +4016,8 @@ public class Types { return erasure(t); // some "rare" type involved if (captured) - return new ClassType(cls.getEnclosingType(), S, cls.tsym); + return new ClassType(cls.getEnclosingType(), S, cls.tsym, + cls.getAnnotationMirrors()); else return t; } @@ -3995,7 +4026,6 @@ public class Types { ListBuffer result = new ListBuffer<>(); for (Type t : types) { if (t.hasTag(WILDCARD)) { - t = t.unannotatedType(); Type bound = ((WildcardType)t).getExtendsBound(); if (bound == null) bound = syms.objectType; @@ -4003,7 +4033,8 @@ public class Types { syms.noSymbol, bound, syms.botType, - (WildcardType)t)); + (WildcardType)t, + Type.noAnnotations)); } else { result.append(t); } @@ -4089,7 +4120,7 @@ public class Types { private boolean giveWarning(Type from, Type to) { List bounds = to.isCompound() ? - ((IntersectionClassType)to.unannotatedType()).getComponents() : List.of(to); + ((IntersectionClassType)to).getComponents() : List.of(to); for (Type b : bounds) { Type subFrom = asSub(from, b.tsym); if (b.isParameterized() && @@ -4354,7 +4385,7 @@ public class Types { Type B(Type t) { while (t.hasTag(WILDCARD)) { - WildcardType w = (WildcardType)t.unannotatedType(); + WildcardType w = (WildcardType)t; t = high ? w.getExtendsBound() : w.getSuperBound(); @@ -4380,12 +4411,14 @@ public class Types { return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal); + formal, + Type.noAnnotations); } else { return new WildcardType(bound, BoundKind.EXTENDS, syms.boundClass, - formal); + formal, + Type.noAnnotations); } } @@ -4402,12 +4435,14 @@ public class Types { return new WildcardType(syms.objectType, BoundKind.UNBOUND, syms.boundClass, - formal); + formal, + Type.noAnnotations); } else { return new WildcardType(bound, BoundKind.SUPER, syms.boundClass, - formal); + formal, + Type.noAnnotations); } } @@ -4429,7 +4464,7 @@ public class Types { public boolean equals(Object obj) { return (obj instanceof UniqueType) && - types.isSameAnnotatedType(type, ((UniqueType)obj).type); + types.isSameType(type, ((UniqueType)obj).type); } public String toString() { @@ -4464,8 +4499,6 @@ public class Types { public R visitForAll(ForAll t, S s) { return visitType(t, s); } public R visitUndetVar(UndetVar t, S s) { return visitType(t, s); } public R visitErrorType(ErrorType t, S s) { return visitType(t, s); } - // Pretend annotations don't exist - public R visitAnnotatedType(AnnotatedType t, S s) { return visit(t.unannotatedType(), s); } } /** @@ -4596,7 +4629,6 @@ public class Types { * Assemble signature of given type in string buffer. */ public void assembleSig(Type type) { - type = type.unannotatedType(); switch (type.getTag()) { case BYTE: append('B'); @@ -4693,7 +4725,6 @@ public class Types { } public void assembleClassSig(Type type) { - type = type.unannotatedType(); ClassType ct = (ClassType) type; ClassSymbol c = (ClassSymbol) ct.tsym; classReference(c); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index 1b2385dba85..335704eaef4 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -517,6 +517,10 @@ public class Attr extends JCTree.Visitor { return new ResultInfo(pkind, pt, newContext); } + protected ResultInfo dup(Type newPt, CheckContext newContext) { + return new ResultInfo(pkind, newPt, newContext); + } + @Override public String toString() { if (pt != null) { @@ -1865,8 +1869,10 @@ public class Attr extends JCTree.Visitor { return new ClassType(restype.getEnclosingType(), List.of(new WildcardType(types.erasure(qualifierType), BoundKind.EXTENDS, - syms.boundClass)), - restype.tsym); + syms.boundClass, + Type.noAnnotations)), + restype.tsym, + restype.getAnnotationMirrors()); } else { return restype; } @@ -2036,7 +2042,8 @@ public class Attr extends JCTree.Visitor { } else if (TreeInfo.isDiamond(tree)) { ClassType site = new ClassType(clazztype.getEnclosingType(), clazztype.tsym.type.getTypeArguments(), - clazztype.tsym); + clazztype.tsym, + clazztype.getAnnotationMirrors()); Env diamondEnv = localEnv.dup(tree); diamondEnv.info.selectSuper = cdef != null; @@ -2255,7 +2262,8 @@ public class Attr extends JCTree.Visitor { owntype = elemtype; for (List l = tree.dims; l.nonEmpty(); l = l.tail) { attribExpr(l.head, localEnv, syms.intType); - owntype = new ArrayType(owntype, syms.arrayClass); + owntype = new ArrayType(owntype, syms.arrayClass, + Type.noAnnotations); } } else { // we are seeing an untyped aggregate { ... } @@ -2272,7 +2280,8 @@ public class Attr extends JCTree.Visitor { } if (tree.elems != null) { attribExprs(tree.elems, localEnv, elemtype); - owntype = new ArrayType(elemtype, syms.arrayClass); + owntype = new ArrayType(elemtype, syms.arrayClass, + Type.noAnnotations); } if (!types.isReifiable(elemtype)) log.error(tree.pos(), "generic.array.creation"); @@ -2763,7 +2772,7 @@ public class Attr extends JCTree.Visitor { targetError = false; } - JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, + JCDiagnostic detailsDiag = ((Resolve.ResolveError)refSym.baseSymbol()).getDiagnostic(JCDiagnostic.DiagnosticType.FRAGMENT, that, exprType.tsym, exprType, that.name, argtypes, typeargtypes); JCDiagnostic.DiagnosticType diagKind = targetError ? @@ -2838,7 +2847,8 @@ public class Attr extends JCTree.Visitor { ResultInfo checkInfo = resultInfo.dup(newMethodTemplate( desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), - that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes)); + that.kind.isUnbound() ? argtypes.tail : argtypes, typeargtypes), + new FunctionalReturnContext(resultInfo.checkContext)); Type refType = checkId(that, lookupHelper.site, refSym, localEnv, checkInfo); @@ -3244,7 +3254,7 @@ public class Attr extends JCTree.Visitor { if (skind == TYP) { Type elt = site; while (elt.hasTag(ARRAY)) - elt = ((ArrayType)elt.unannotatedType()).elemtype; + elt = ((ArrayType)elt).elemtype; if (elt.hasTag(TYPEVAR)) { log.error(tree.pos(), "type.var.cant.be.deref"); result = types.createErrorType(tree.type); @@ -3557,7 +3567,8 @@ public class Attr extends JCTree.Visitor { normOuter = types.erasure(ownOuter); if (normOuter != ownOuter) owntype = new ClassType( - normOuter, List.nil(), owntype.tsym); + normOuter, List.nil(), owntype.tsym, + owntype.getAnnotationMirrors()); } } break; @@ -3861,7 +3872,7 @@ public class Attr extends JCTree.Visitor { public void visitTypeArray(JCArrayTypeTree tree) { Type etype = attribType(tree.elemtype, env); - Type type = new ArrayType(etype, syms.arrayClass); + Type type = new ArrayType(etype, syms.arrayClass, Type.noAnnotations); result = check(tree, type, TYP, resultInfo); } @@ -3909,7 +3920,8 @@ public class Attr extends JCTree.Visitor { clazzOuter = site; } } - owntype = new ClassType(clazzOuter, actuals, clazztype.tsym); + owntype = new ClassType(clazzOuter, actuals, clazztype.tsym, + clazztype.getAnnotationMirrors()); } else { if (formals.length() != 0) { log.error(tree.pos(), "wrong.number.type.args", @@ -4060,7 +4072,8 @@ public class Attr extends JCTree.Visitor { : attribType(tree.inner, env); result = check(tree, new WildcardType(chk.checkRefType(tree.pos(), type), tree.kind.kind, - syms.boundClass), + syms.boundClass, + Type.noAnnotations), TYP, resultInfo); } @@ -4088,7 +4101,7 @@ public class Attr extends JCTree.Visitor { public void run() { List compounds = fromAnnotations(annotations); Assert.check(annotations.size() == compounds.size()); - tree.type = tree.type.unannotatedType().annotatedType(compounds); + tree.type = tree.type.annotatedType(compounds); } }); } @@ -4470,6 +4483,7 @@ public class Attr extends JCTree.Visitor { } } public void visitVarDef(final JCVariableDecl tree) { + //System.err.println("validateTypeAnnotations.visitVarDef " + tree); if (tree.sym != null && tree.sym.type != null) validateAnnotatedType(tree.vartype, tree.sym.type); scan(tree.mods); @@ -4512,6 +4526,7 @@ public class Attr extends JCTree.Visitor { super.visitNewArray(tree); } public void visitClassDef(JCClassDecl tree) { + //System.err.println("validateTypeAnnotations.visitClassDef " + tree); if (sigOnly) { scan(tree.mods); scan(tree.typarams); @@ -4540,7 +4555,7 @@ public class Attr extends JCTree.Visitor { * can occur. */ private void validateAnnotatedType(final JCTree errtree, final Type type) { - // System.out.println("Attr.validateAnnotatedType: " + errtree + " type: " + type); + //System.err.println("Attr.validateAnnotatedType: " + errtree + " type: " + type); if (type.isPrimitiveOrVoid()) { return; @@ -4578,8 +4593,7 @@ public class Attr extends JCTree.Visitor { } } else if (enclTr.hasTag(ANNOTATED_TYPE)) { JCAnnotatedType at = (JCTree.JCAnnotatedType) enclTr; - if (enclTy == null || - enclTy.hasTag(NONE)) { + if (enclTy == null || enclTy.hasTag(NONE)) { if (at.getAnnotations().size() == 1) { log.error(at.underlyingType.pos(), "cant.type.annotate.scoping.1", at.getAnnotations().head.attribute); } else { @@ -4598,16 +4612,16 @@ public class Attr extends JCTree.Visitor { } else if (enclTr.hasTag(JCTree.Tag.WILDCARD)) { JCWildcard wc = (JCWildcard) enclTr; if (wc.getKind() == JCTree.Kind.EXTENDS_WILDCARD) { - validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy.unannotatedType()).getExtendsBound()); + validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy).getExtendsBound()); } else if (wc.getKind() == JCTree.Kind.SUPER_WILDCARD) { - validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy.unannotatedType()).getSuperBound()); + validateAnnotatedType(wc.getBound(), ((WildcardType)enclTy).getSuperBound()); } else { // Nothing to do for UNBOUND } repeat = false; } else if (enclTr.hasTag(TYPEARRAY)) { JCArrayTypeTree art = (JCArrayTypeTree) enclTr; - validateAnnotatedType(art.getType(), ((ArrayType)enclTy.unannotatedType()).getComponentType()); + validateAnnotatedType(art.getType(), ((ArrayType)enclTy).getComponentType()); repeat = false; } else if (enclTr.hasTag(TYPEUNION)) { JCTypeUnion ut = (JCTypeUnion) enclTr; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java index 97cee013ca4..1b412e39405 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -2234,11 +2234,11 @@ public class Check { if (t.hasTag(TYPEVAR) && (t.tsym.flags() & UNATTRIBUTED) != 0) return; if (seen.contains(t)) { - tv = (TypeVar)t.unannotatedType(); + tv = (TypeVar)t; tv.bound = types.createErrorType(t); log.error(pos, "cyclic.inheritance", t); } else if (t.hasTag(TYPEVAR)) { - tv = (TypeVar)t.unannotatedType(); + tv = (TypeVar)t; seen = seen.prepend(tv); for (Type b : types.getBounds(tv)) checkNonCyclic1(pos, b, seen); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java index 5c3533eada9..6265199a8d7 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java @@ -134,12 +134,17 @@ public class DeferredAttr extends JCTree.Visitor { SpeculativeCache speculativeCache; DeferredType(JCExpression tree, Env env) { - super(null); + super(null, noAnnotations); this.tree = tree; this.env = attr.copyEnv(env); this.speculativeCache = new SpeculativeCache(); } + @Override + public DeferredType annotatedType(List typeAnnotations) { + throw new AssertionError("Cannot annotate a deferred type"); + } + @Override public TypeTag getTag() { return DEFERRED; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java index e451e26c147..df41f3763a8 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java @@ -373,7 +373,7 @@ public class Infer { List upperBounds = uv.getBounds(InferenceBound.UPPER); if (Type.containsAny(upperBounds, vars)) { TypeSymbol fresh_tvar = new TypeVariableSymbol(Flags.SYNTHETIC, uv.qtype.tsym.name, null, uv.qtype.tsym.owner); - fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null); + fresh_tvar.type = new TypeVar(fresh_tvar, types.makeCompoundType(uv.getBounds(InferenceBound.UPPER)), null, Type.noAnnotations); todo.append(uv); uv.inst = fresh_tvar.type; } else if (upperBounds.nonEmpty()) { @@ -1505,7 +1505,9 @@ public class Infer { LOWER.solve(uv, inferenceContext) : infer.syms.botType; CapturedType prevCaptured = (CapturedType)uv.qtype; - return new CapturedType(prevCaptured.tsym.name, prevCaptured.tsym.owner, upper, lower, prevCaptured.wildcard); + return new CapturedType(prevCaptured.tsym.name, prevCaptured.tsym.owner, + upper, lower, prevCaptured.wildcard, + Type.noAnnotations); } }; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index 269fd1938ef..bf3e3c122d4 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -28,7 +28,6 @@ package com.sun.tools.javac.comp; import java.util.*; import com.sun.tools.javac.code.*; -import com.sun.tools.javac.code.Type.AnnotatedType; import com.sun.tools.javac.jvm.*; import com.sun.tools.javac.main.Option.PkgInfo; import com.sun.tools.javac.tree.*; @@ -452,7 +451,8 @@ public class Lower extends TreeTranslator { ClassSymbol outerCacheClass = outerCacheClass(); this.mapVar = new VarSymbol(STATIC | SYNTHETIC | FINAL, varName, - new ArrayType(syms.intType, syms.arrayClass), + new ArrayType(syms.intType, syms.arrayClass, + Type.noAnnotations), outerCacheClass); enterSynthetic(pos, mapVar, outerCacheClass.members()); } @@ -493,7 +493,8 @@ public class Lower extends TreeTranslator { syms.lengthVar); JCExpression mapVarInit = make .NewArray(make.Type(syms.intType), List.of(size), null) - .setType(new ArrayType(syms.intType, syms.arrayClass)); + .setType(new ArrayType(syms.intType, syms.arrayClass, + Type.noAnnotations)); // try { $SwitchMap$Color[red.ordinal()] = 1; } catch (java.lang.NoSuchFieldError ex) {} ListBuffer stmts = new ListBuffer<>(); @@ -1979,7 +1980,7 @@ public class Lower extends TreeTranslator { List.of(make.Literal(INT, 0).setType(syms.intType)), null); newcache.type = new ArrayType(types.erasure(outerCacheClass.type), - syms.arrayClass); + syms.arrayClass, Type.noAnnotations); // forNameSym := java.lang.Class.forName( // String s,boolean init,ClassLoader loader) @@ -2568,7 +2569,8 @@ public class Lower extends TreeTranslator { Name valuesName = names.fromString(target.syntheticNameChar() + "VALUES"); while (tree.sym.members().lookup(valuesName).scope != null) // avoid name clash valuesName = names.fromString(valuesName + "" + target.syntheticNameChar()); - Type arrayType = new ArrayType(types.erasure(tree.type), syms.arrayClass); + Type arrayType = new ArrayType(types.erasure(tree.type), + syms.arrayClass, Type.noAnnotations); VarSymbol valuesVar = new VarSymbol(PRIVATE|FINAL|STATIC|SYNTHETIC, valuesName, arrayType, @@ -2841,7 +2843,7 @@ public class Lower extends TreeTranslator { tree.underlyingType = translate(tree.underlyingType); // but maintain type annotations in the type. if (tree.type.isAnnotated()) { - tree.type = tree.underlyingType.type.unannotatedType().annotatedType(tree.type.getAnnotationMirrors()); + tree.type = tree.underlyingType.type.annotatedType(tree.type.getAnnotationMirrors()); } else if (tree.underlyingType.type.isAnnotated()) { tree.type = tree.underlyingType.type; } @@ -3145,7 +3147,8 @@ public class Lower extends TreeTranslator { JCNewArray boxedArgs = make.NewArray(make.Type(varargsElement), List.nil(), elems.toList()); - boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass); + boxedArgs.type = new ArrayType(varargsElement, syms.arrayClass, + Type.noAnnotations); result.append(boxedArgs); } else { if (args.length() != 1) throw new AssertionError(args); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java index ffecda19573..ab6e894b739 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java @@ -457,7 +457,8 @@ public class MemberEnter extends JCTree.Visitor implements Completer { * to the symbol table. */ private void addEnumMembers(JCClassDecl tree, Env env) { - JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass)); + JCExpression valuesType = make.Type(new ArrayType(tree.sym.type, syms.arrayClass, + Type.noAnnotations)); // public static T[] values() { return ???; } JCMethodDecl values = make. @@ -677,7 +678,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { //because varargs is represented in the tree as a //modifier on the parameter declaration, and not as a //distinct type of array node. - ArrayType atype = (ArrayType)tree.vartype.type.unannotatedType(); + ArrayType atype = (ArrayType)tree.vartype.type; tree.vartype.type = atype.makeVarargs(); } Scope enclScope = enter.enterScope(env); @@ -1255,11 +1256,13 @@ public class MemberEnter extends JCTree.Visitor implements Completer { ClassType ct = (ClassType) sym.type; Assert.check(ct.typarams_field.isEmpty()); if (n == 1) { - TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType); + TypeVar v = new TypeVar(names.fromString("T"), sym, syms.botType, + Type.noAnnotations); ct.typarams_field = ct.typarams_field.prepend(v); } else { for (int i = n; i > 0; i--) { - TypeVar v = new TypeVar(names.fromString("T" + i), sym, syms.botType); + TypeVar v = new TypeVar(names.fromString("T" + i), sym, + syms.botType, Type.noAnnotations); ct.typarams_field = ct.typarams_field.prepend(v); } } @@ -1310,8 +1313,8 @@ public class MemberEnter extends JCTree.Visitor implements Completer { } Type mType = new MethodType(argtypes, null, thrown, c); Type initType = typarams.nonEmpty() ? - new ForAll(typarams, mType) : - mType; + new ForAll(typarams, mType) : + mType; MethodSymbol init = new MethodSymbol(flags, names.init, initType, c); init.params = createDefaultConstructorParams(make, baseInit, init, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java index a883db73b94..dc79bfd780a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -94,7 +94,7 @@ public class Resolve { public final boolean boxingEnabled; public final boolean varargsEnabled; public final boolean allowMethodHandles; - public final boolean allowStructuralMostSpecific; + public final boolean allowFunctionalInterfaceMostSpecific; private final boolean debugResolve; private final boolean compactMethodDiags; final EnumSet verboseResolutionMode; @@ -135,7 +135,7 @@ public class Resolve { verboseResolutionMode = VerboseResolutionMode.getVerboseResolutionMode(options); Target target = Target.instance(context); allowMethodHandles = target.hasMethodHandles(); - allowStructuralMostSpecific = source.allowStructuralMostSpecific(); + allowFunctionalInterfaceMostSpecific = source.allowFunctionalInterfaceMostSpecific(); polymorphicSignatureScope = new Scope(syms.noSymbol); inapplicableMethodException = new InapplicableMethodException(diags); @@ -1084,50 +1084,47 @@ public class Resolve { } public boolean compatible(Type found, Type req, Warner warn) { - if (!allowStructuralMostSpecific || actual == null) { - return super.compatible(found, req, warn); - } else { - switch (actual.getTag()) { - case DEFERRED: - DeferredType dt = (DeferredType) actual; - DeferredType.SpeculativeCache.Entry e = dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); - return (e == null || e.speculativeTree == deferredAttr.stuckTree) - ? super.compatible(found, req, warn) : - mostSpecific(found, req, e.speculativeTree, warn); - default: - return standaloneMostSpecific(found, req, actual, warn); + if (allowFunctionalInterfaceMostSpecific && + unrelatedFunctionalInterfaces(found, req) && + (actual != null && actual.getTag() == DEFERRED)) { + DeferredType dt = (DeferredType) actual; + DeferredType.SpeculativeCache.Entry e = + dt.speculativeCache.get(deferredAttrContext.msym, deferredAttrContext.phase); + if (e != null && e.speculativeTree != deferredAttr.stuckTree) { + return functionalInterfaceMostSpecific(found, req, e.speculativeTree, warn); } } + return super.compatible(found, req, warn); } - private boolean mostSpecific(Type t, Type s, JCTree tree, Warner warn) { - MostSpecificChecker msc = new MostSpecificChecker(t, s, warn); + /** Whether {@code t} and {@code s} are unrelated functional interface types. */ + private boolean unrelatedFunctionalInterfaces(Type t, Type s) { + return types.isFunctionalInterface(t.tsym) && + types.isFunctionalInterface(s.tsym) && + types.asSuper(t, s.tsym) == null && + types.asSuper(s, t.tsym) == null; + } + + /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ + private boolean functionalInterfaceMostSpecific(Type t, Type s, JCTree tree, Warner warn) { + FunctionalInterfaceMostSpecificChecker msc = new FunctionalInterfaceMostSpecificChecker(t, s, warn); msc.scan(tree); return msc.result; } - boolean polyMostSpecific(Type t1, Type t2, Warner warn) { - return (!t1.isPrimitive() && t2.isPrimitive()) - ? true : super.compatible(t1, t2, warn); - } - - boolean standaloneMostSpecific(Type t1, Type t2, Type exprType, Warner warn) { - return (exprType.isPrimitive() == t1.isPrimitive() - && exprType.isPrimitive() != t2.isPrimitive()) - ? true : super.compatible(t1, t2, warn); - } - /** - * Structural checker for most specific. + * Tests whether one functional interface type can be considered more specific + * than another unrelated functional interface type for the scanned expression. */ - class MostSpecificChecker extends DeferredAttr.PolyScanner { + class FunctionalInterfaceMostSpecificChecker extends DeferredAttr.PolyScanner { final Type t; final Type s; final Warner warn; boolean result; - MostSpecificChecker(Type t, Type s, Warner warn) { + /** Parameters {@code t} and {@code s} are unrelated functional interface types. */ + FunctionalInterfaceMostSpecificChecker(Type t, Type s, Warner warn) { this.t = t; this.s = s; this.warn = warn; @@ -1136,102 +1133,96 @@ public class Resolve { @Override void skip(JCTree tree) { - result &= standaloneMostSpecific(t, s, tree.type, warn); + result &= false; } @Override public void visitConditional(JCConditional tree) { - if (tree.polyKind == PolyKind.STANDALONE) { - result &= standaloneMostSpecific(t, s, tree.type, warn); - } else { - super.visitConditional(tree); - } - } - - @Override - public void visitApply(JCMethodInvocation tree) { - result &= (tree.polyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(t, s, tree.type, warn) - : polyMostSpecific(t, s, warn); - } - - @Override - public void visitNewClass(JCNewClass tree) { - result &= (tree.polyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(t, s, tree.type, warn) - : polyMostSpecific(t, s, warn); + scan(tree.truepart); + scan(tree.falsepart); } @Override public void visitReference(JCMemberReference tree) { - if (types.isFunctionalInterface(t.tsym) && - types.isFunctionalInterface(s.tsym)) { - Type desc_t = types.findDescriptorType(t); - Type desc_s = types.findDescriptorType(s); - if (types.isSameTypes(desc_t.getParameterTypes(), - inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { - if (types.asSuper(t, s.tsym) != null || - types.asSuper(s, t.tsym) != null) { - result &= MostSpecificCheckContext.super.compatible(t, s, warn); - } else if (!desc_s.getReturnType().hasTag(VOID)) { - //perform structural comparison - Type ret_t = desc_t.getReturnType(); - Type ret_s = desc_s.getReturnType(); - result &= ((tree.refPolyKind == PolyKind.STANDALONE) - ? standaloneMostSpecific(ret_t, ret_s, tree.sym.type.getReturnType(), warn) - : polyMostSpecific(ret_t, ret_s, warn)); - } else { - return; - } - } - } else { + Type desc_t = types.findDescriptorType(t); + Type desc_s = types.findDescriptorType(s); + // use inference variables here for more-specific inference (18.5.4) + if (!types.isSameTypes(desc_t.getParameterTypes(), + inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { result &= false; + } else { + // compare return types + Type ret_t = desc_t.getReturnType(); + Type ret_s = desc_s.getReturnType(); + if (ret_s.hasTag(VOID)) { + result &= true; + } else if (ret_t.hasTag(VOID)) { + result &= false; + } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { + boolean retValIsPrimitive = + tree.refPolyKind == PolyKind.STANDALONE && + tree.sym.type.getReturnType().isPrimitive(); + result &= (retValIsPrimitive == ret_t.isPrimitive()) && + (retValIsPrimitive != ret_s.isPrimitive()); + } else { + result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); + } } } @Override public void visitLambda(JCLambda tree) { - if (types.isFunctionalInterface(t.tsym) && - types.isFunctionalInterface(s.tsym)) { - Type desc_t = types.findDescriptorType(t); - Type desc_s = types.findDescriptorType(s); - if (types.isSameTypes(desc_t.getParameterTypes(), - inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { - if (types.asSuper(t, s.tsym) != null || - types.asSuper(s, t.tsym) != null) { - result &= MostSpecificCheckContext.super.compatible(t, s, warn); - } else if (!desc_s.getReturnType().hasTag(VOID)) { - //perform structural comparison - Type ret_t = desc_t.getReturnType(); - Type ret_s = desc_s.getReturnType(); - scanLambdaBody(tree, ret_t, ret_s); - } else { - return; - } - } - } else { + Type desc_t = types.findDescriptorType(t); + Type desc_s = types.findDescriptorType(s); + // use inference variables here for more-specific inference (18.5.4) + if (!types.isSameTypes(desc_t.getParameterTypes(), + inferenceContext().asUndetVars(desc_s.getParameterTypes()))) { result &= false; + } else { + // compare return types + Type ret_t = desc_t.getReturnType(); + Type ret_s = desc_s.getReturnType(); + if (ret_s.hasTag(VOID)) { + result &= true; + } else if (ret_t.hasTag(VOID)) { + result &= false; + } else if (unrelatedFunctionalInterfaces(ret_t, ret_s)) { + for (JCExpression expr : lambdaResults(tree)) { + result &= functionalInterfaceMostSpecific(ret_t, ret_s, expr, warn); + } + } else if (ret_t.isPrimitive() != ret_s.isPrimitive()) { + for (JCExpression expr : lambdaResults(tree)) { + boolean retValIsPrimitive = expr.isStandalone() && expr.type.isPrimitive(); + result &= (retValIsPrimitive == ret_t.isPrimitive()) && + (retValIsPrimitive != ret_s.isPrimitive()); + } + } else { + result &= MostSpecificCheckContext.super.compatible(ret_t, ret_s, warn); + } } } //where - void scanLambdaBody(JCLambda lambda, final Type t, final Type s) { + private List lambdaResults(JCLambda lambda) { if (lambda.getBodyKind() == JCTree.JCLambda.BodyKind.EXPRESSION) { - result &= MostSpecificCheckContext.this.mostSpecific(t, s, lambda.body, warn); + return List.of((JCExpression) lambda.body); } else { + final ListBuffer buffer = new ListBuffer<>(); DeferredAttr.LambdaReturnScanner lambdaScanner = new DeferredAttr.LambdaReturnScanner() { @Override public void visitReturn(JCReturn tree) { if (tree.expr != null) { - result &= MostSpecificCheckContext.this.mostSpecific(t, s, tree.expr, warn); + buffer.append(tree.expr); } } }; lambdaScanner.scan(lambda.body); + return buffer.toList(); } } } + } public MethodCheck mostSpecificCheck(List actuals, boolean strict) { @@ -1435,7 +1426,7 @@ public class Resolve { return bestSoFar; } else if (useVarargs && (sym.flags() & VARARGS) == 0) { return bestSoFar.kind >= ERRONEOUS ? - new BadVarargsMethod((ResolveError)bestSoFar) : + new BadVarargsMethod((ResolveError)bestSoFar.baseSymbol()) : bestSoFar; } Assert.check(sym.kind < AMBIGUOUS); @@ -1527,14 +1518,22 @@ public class Resolve { if (m2SignatureMoreSpecific) return m2; return ambiguityError(m1, m2); case AMBIGUOUS: - //check if m1 is more specific than all ambiguous methods in m2 + //compare m1 to ambiguous methods in m2 AmbiguityError e = (AmbiguityError)m2.baseSymbol(); + boolean m1MoreSpecificThanAnyAmbiguous = true; + boolean allAmbiguousMoreSpecificThanM1 = true; for (Symbol s : e.ambiguousSyms) { - if (mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs) != m1) { - return e.addAmbiguousSymbol(m1); - } + Symbol moreSpecific = mostSpecific(argtypes, m1, s, env, site, allowBoxing, useVarargs); + m1MoreSpecificThanAnyAmbiguous &= moreSpecific == m1; + allAmbiguousMoreSpecificThanM1 &= moreSpecific == s; } - return m1; + if (m1MoreSpecificThanAnyAmbiguous) + return m1; + //if m1 is more specific than some ambiguous methods, but other ambiguous methods are + //more specific than m1, add it as a new ambiguous method: + if (!allAmbiguousMoreSpecificThanM1) + e.addAmbiguousSymbol(m1); + return e; default: throw new AssertionError(); } @@ -2195,7 +2194,7 @@ public class Resolve { List typeargtypes, LogResolveHelper logResolveHelper) { if (sym.kind >= AMBIGUOUS) { - ResolveError errSym = (ResolveError)sym; + ResolveError errSym = (ResolveError)sym.baseSymbol(); sym = errSym.access(name, qualified ? site.tsym : syms.noSymbol); argtypes = logResolveHelper.getArgumentTypes(errSym, sym, name, argtypes); if (logResolveHelper.resolveDiagnosticNeeded(site, argtypes, typeargtypes)) { @@ -2584,7 +2583,7 @@ public class Resolve { sym = super.access(env, pos, location, sym); } else { final JCDiagnostic details = sym.kind == WRONG_MTH ? - ((InapplicableSymbolError)sym).errCandidate().snd : + ((InapplicableSymbolError)sym.baseSymbol()).errCandidate().snd : null; sym = new InapplicableSymbolError(sym.kind, "diamondError", currentResolutionContext) { @Override @@ -2631,7 +2630,7 @@ public class Resolve { ((ForAll)sym.type).tvars : List.nil(); Type constrType = new ForAll(site.tsym.type.getTypeArguments().appendList(oldParams), - types.createMethodTypeWithReturn(sym.type.asMethodType(), site)); + types.createMethodTypeWithReturn(sym.type.asMethodType(), site)); MethodSymbol newConstr = new MethodSymbol(sym.flags(), names.init, constrType, site.tsym) { @Override public Symbol baseSymbol() { @@ -2992,12 +2991,12 @@ public class Resolve { return true; case WRONG_MTH: InapplicableSymbolError errSym = - (InapplicableSymbolError)s; + (InapplicableSymbolError)s.baseSymbol(); return new Template(MethodCheckDiag.ARITY_MISMATCH.regex()) .matches(errSym.errCandidate().snd); case WRONG_MTHS: InapplicableSymbolsError errSyms = - (InapplicableSymbolsError)s; + (InapplicableSymbolsError)s.baseSymbol(); return errSyms.filterCandidates(errSyms.mapCandidates()).isEmpty(); case WRONG_STATICNESS: return false; @@ -3272,7 +3271,7 @@ public class Resolve { List typeargtypes, MethodResolutionPhase maxPhase) { super(referenceTree, names.init, site, argtypes, typeargtypes, maxPhase); if (site.isRaw()) { - this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym); + this.site = new ClassType(site.getEnclosingType(), site.tsym.type.getTypeArguments(), site.tsym, site.getAnnotationMirrors()); needsInference = true; } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java index f48d57acd84..ed560d52355 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -624,18 +624,18 @@ public class ClassReader { case '+': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.EXTENDS, - syms.boundClass); + return new WildcardType(t, BoundKind.EXTENDS, syms.boundClass, + Type.noAnnotations); } case '*': sigp++; return new WildcardType(syms.objectType, BoundKind.UNBOUND, - syms.boundClass); + syms.boundClass, Type.noAnnotations); case '-': { sigp++; Type t = sigToType(); - return new WildcardType(t, BoundKind.SUPER, - syms.boundClass); + return new WildcardType(t, BoundKind.SUPER, syms.boundClass, + Type.noAnnotations); } case 'B': sigp++; @@ -680,7 +680,8 @@ public class ClassReader { return syms.booleanType; case '[': sigp++; - return new ArrayType(sigToType(), syms.arrayClass); + return new ArrayType(sigToType(), syms.arrayClass, + Type.noAnnotations); case '(': sigp++; List argtypes = sigToTypes(')'); @@ -735,7 +736,8 @@ public class ClassReader { try { return (outer == Type.noType) ? t.erasure(types) : - new ClassType(outer, List.nil(), t); + new ClassType(outer, List.nil(), t, + Type.noAnnotations); } finally { sbp = startSbp; } @@ -745,7 +747,8 @@ public class ClassReader { ClassSymbol t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, sigToTypes('>'), t) { + outer = new ClassType(outer, sigToTypes('>'), t, + Type.noAnnotations) { boolean completed = false; @Override public Type getEnclosingType() { @@ -808,7 +811,8 @@ public class ClassReader { t = syms.enterClass(names.fromUtf(signatureBuffer, startSbp, sbp - startSbp)); - outer = new ClassType(outer, List.nil(), t); + outer = new ClassType(outer, List.nil(), t, + Type.noAnnotations); } signatureBuffer[sbp++] = (byte)'$'; continue; @@ -871,7 +875,8 @@ public class ClassReader { Name name = names.fromUtf(signature, start, sigp - start); TypeVar tvar; if (sigEnterPhase) { - tvar = new TypeVar(name, currentOwner, syms.botType); + tvar = new TypeVar(name, currentOwner, syms.botType, + Type.noAnnotations); typevars.enter(tvar.tsym); } else { tvar = (TypeVar)findTypeVar(name); @@ -910,7 +915,8 @@ public class ClassReader { // we don't know for sure if this owner is correct. It could // be a method and there is no way to tell before reading the // enclosing method attribute. - TypeVar t = new TypeVar(name, currentOwner, syms.botType); + TypeVar t = new TypeVar(name, currentOwner, syms.botType, + Type.noAnnotations); missingTypeVariables = missingTypeVariables.prepend(t); // System.err.println("Missing type var " + name); return t; @@ -1534,35 +1540,41 @@ public class ClassReader { // local variable case LOCAL_VARIABLE: { final int table_length = nextChar(); - final TypeAnnotationPosition position = - TypeAnnotationPosition.localVariable(readTypePath()); - - position.lvarOffset = new int[table_length]; - position.lvarLength = new int[table_length]; - position.lvarIndex = new int[table_length]; + final int[] newLvarOffset = new int[table_length]; + final int[] newLvarLength = new int[table_length]; + final int[] newLvarIndex = new int[table_length]; for (int i = 0; i < table_length; ++i) { - position.lvarOffset[i] = nextChar(); - position.lvarLength[i] = nextChar(); - position.lvarIndex[i] = nextChar(); + newLvarOffset[i] = nextChar(); + newLvarLength[i] = nextChar(); + newLvarIndex[i] = nextChar(); } + + final TypeAnnotationPosition position = + TypeAnnotationPosition.localVariable(readTypePath()); + position.lvarOffset = newLvarOffset; + position.lvarLength = newLvarLength; + position.lvarIndex = newLvarIndex; return position; } // resource variable case RESOURCE_VARIABLE: { final int table_length = nextChar(); - final TypeAnnotationPosition position = - TypeAnnotationPosition.resourceVariable(readTypePath()); - - position.lvarOffset = new int[table_length]; - position.lvarLength = new int[table_length]; - position.lvarIndex = new int[table_length]; + final int[] newLvarOffset = new int[table_length]; + final int[] newLvarLength = new int[table_length]; + final int[] newLvarIndex = new int[table_length]; for (int i = 0; i < table_length; ++i) { - position.lvarOffset[i] = nextChar(); - position.lvarLength[i] = nextChar(); - position.lvarIndex[i] = nextChar(); + newLvarOffset[i] = nextChar(); + newLvarLength[i] = nextChar(); + newLvarIndex[i] = nextChar(); } + + final TypeAnnotationPosition position = + TypeAnnotationPosition.resourceVariable(readTypePath()); + position.lvarOffset = newLvarOffset; + position.lvarLength = newLvarLength; + position.lvarIndex = newLvarIndex; return position; } // exception parameter diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index 9df21523c10..5580d06831f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -286,7 +286,6 @@ public class ClassWriter extends ClassFile { */ @Override public void assembleSig(Type type) { - type = type.unannotatedType(); switch (type.getTag()) { case UNINITIALIZED_THIS: case UNINITIALIZED_OBJECT: @@ -354,7 +353,7 @@ public class ClassWriter extends ClassFile { } else if (t.hasTag(ARRAY)) { return typeSig(types.erasure(t)); } else { - throw new AssertionError("xClassName"); + throw new AssertionError("xClassName expects class or array type, got " + t); } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java index 081146cc2c5..8f28fa0550e 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java @@ -928,7 +928,7 @@ public class Code { if (o instanceof Pool.MethodHandle) return syms.methodHandleType; if (o instanceof UniqueType) return typeForPool(((UniqueType)o).type); if (o instanceof Type) { - Type ty = ((Type)o).unannotatedType(); + Type ty = (Type) o; if (ty instanceof Type.ArrayType) return syms.classType; if (ty instanceof Type.MethodType) return syms.methodTypeType; @@ -1579,8 +1579,8 @@ public class Code { /** Add a catch clause to code. */ - public void addCatch( - char startPc, char endPc, char handlerPc, char catchType) { + public void addCatch(char startPc, char endPc, + char handlerPc, char catchType) { catchInfo.append(new char[]{startPc, endPc, handlerPc, catchType}); } @@ -2149,7 +2149,7 @@ public class Code { for (Attribute.TypeCompound ta : lv.sym.getRawTypeAttributes()) { TypeAnnotationPosition p = ta.position; if (p.hasCatchType()) { - final int idx = findExceptionIndex(p.getCatchType()); + final int idx = findExceptionIndex(p); if (idx == -1) Assert.error("Could not find exception index for type annotation " + ta + " on exception parameter"); @@ -2159,14 +2159,17 @@ public class Code { } } - private int findExceptionIndex(int catchType) { + private int findExceptionIndex(TypeAnnotationPosition p) { + final int catchType = p.getCatchType(); + final int startPos = p.getStartPos(); + final int len = catchInfo.length(); List iter = catchInfo.toList(); - int len = catchInfo.length(); for (int i = 0; i < len; ++i) { char[] catchEntry = iter.head; iter = iter.tail; - char ct = catchEntry[3]; - if (catchType == ct) { + int ct = catchEntry[3]; + int sp = catchEntry[0]; + if (catchType == ct && sp == startPos) { return i; } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java index 45d5bda770f..943fbb58d62 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java @@ -317,10 +317,6 @@ public class Gen extends JCTree.Visitor { int makeRef(DiagnosticPosition pos, Type type) { checkDimension(pos, type); if (type.isAnnotated()) { - // Treat annotated types separately - we don't want - // to collapse all of them - at least for annotated - // exceptions. - // TODO: review this. return pool.put((Object)type); } else { return pool.put(type.hasTag(CLASS) ? (Object)type.tsym : (Object)type); @@ -1647,7 +1643,7 @@ public class Gen extends JCTree.Visitor { if (subCatch.type.isAnnotated()) { for (Attribute.TypeCompound tc : subCatch.type.getAnnotationMirrors()) { - tc.position.setCatchType(catchType); + tc.position.setCatchInfo(catchType, startpc); } } } @@ -1664,7 +1660,7 @@ public class Gen extends JCTree.Visitor { if (subCatch.type.isAnnotated()) { for (Attribute.TypeCompound tc : subCatch.type.getAnnotationMirrors()) { - tc.position.setCatchType(catchType); + tc.position.setCatchInfo(catchType, startpc); } } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java index b12adc0ab6c..f91c5c3189b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/JNIWriter.java @@ -673,11 +673,6 @@ public class JNIWriter { return defaultAction(t, p); } - @Override - public R visitAnnotatedType(Type.AnnotatedType t, P p) { - return defaultAction(t, p); - } - @Override public R visitType(Type t, P p) { return defaultAction(t, p); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java index e058a08f36a..cef21cf52e1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Pool.java @@ -102,10 +102,11 @@ public class Pool { */ public int put(Object value) { value = makePoolValue(value); -// assert !(value instanceof Type.TypeVar); + Assert.check(!(value instanceof Type.TypeVar)); + Assert.check(!(value instanceof Types.UniqueType && + ((UniqueType) value).type instanceof Type.TypeVar)); Integer index = indices.get(value); if (index == null) { -// System.err.println("put " + value + " " + value.getClass());//DEBUG index = pp; indices.put(value, index); pool = ArrayUtils.ensureCapacity(pool, pp); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java index 73614a0c022..955a7da4d23 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java @@ -26,6 +26,7 @@ package com.sun.tools.javac.jvm; import com.sun.tools.javac.code.*; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_OBJECT; import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_THIS; @@ -41,19 +42,27 @@ import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_THIS; class UninitializedType extends Type.DelegatedType { public static UninitializedType uninitializedThis(Type qtype) { - return new UninitializedType(UNINITIALIZED_THIS, qtype, -1); + return new UninitializedType(UNINITIALIZED_THIS, qtype, -1, + qtype.getAnnotationMirrors()); } public static UninitializedType uninitializedObject(Type qtype, int offset) { - return new UninitializedType(UNINITIALIZED_OBJECT, qtype, offset); + return new UninitializedType(UNINITIALIZED_OBJECT, qtype, offset, + qtype.getAnnotationMirrors()); } public final int offset; // PC where allocation took place - private UninitializedType(TypeTag tag, Type qtype, int offset) { - super(tag, qtype); + private UninitializedType(TypeTag tag, Type qtype, int offset, + List typeAnnotations) { + super(tag, qtype, typeAnnotations); this.offset = offset; } + @Override + public UninitializedType annotatedType(List typeAnnotations) { + return new UninitializedType(tag, qtype, offset, typeAnnotations); + } + Type initializedType() { return qtype; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index 90883092e3a..6c7ccc11ffa 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -35,9 +35,6 @@ import java.util.MissingResourceException; import java.util.Queue; import java.util.ResourceBundle; import java.util.Set; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.annotation.processing.Processor; import javax.lang.model.SourceVersion; @@ -1292,11 +1289,16 @@ public class JavaCompiler { * Perform dataflow checks on an attributed parse tree. */ protected void flow(Env env, Queue> results) { + if (compileStates.isDone(env, CompileState.FLOW)) { + results.add(env); + return; + } + try { if (shouldStop(CompileState.FLOW)) return; - if (relax || compileStates.isDone(env, CompileState.FLOW)) { + if (relax) { results.add(env); return; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java b/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java index 5b780ede81d..f968a903de4 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacTypes.java @@ -168,7 +168,8 @@ public class JavacTypes implements javax.lang.model.util.Types { case PACKAGE: throw new IllegalArgumentException(componentType.toString()); } - return new Type.ArrayType((Type) componentType, syms.arrayClass); + return new Type.ArrayType((Type) componentType, syms.arrayClass, + Type.noAnnotations); } public WildcardType getWildcardType(TypeMirror extendsBound, @@ -193,7 +194,8 @@ public class JavacTypes implements javax.lang.model.util.Types { case DECLARED: case ERROR: case TYPEVAR: - return new Type.WildcardType(bound, bkind, syms.boundClass); + return new Type.WildcardType(bound, bkind, syms.boundClass, + Type.noAnnotations); default: throw new IllegalArgumentException(bound.toString()); } @@ -243,7 +245,8 @@ public class JavacTypes implements javax.lang.model.util.Types { } // TODO: Would like a way to check that type args match formals. - return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym); + return (DeclaredType) new Type.ClassType(outer, targs.toList(), sym, + Type.noAnnotations); } /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java index a0b3fe64a21..5ffe456db60 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java @@ -1089,7 +1089,8 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea for (ClassSymbol cs : symtab.classes.values()) { if (cs.classfile != null || cs.kind == Kinds.ERR) { cs.reset(); - cs.type = new ClassType(cs.type.getEnclosingType(), null, cs); + cs.type = new ClassType(cs.type.getEnclosingType(), + null, cs, Type.noAnnotations); if (cs.completer == null) { cs.completer = initialCompleter; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java index 441264bccef..f68a2f061f1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -643,6 +643,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { super.setPos(pos); return this; } + + public boolean isPoly() { return false; } + public boolean isStandalone() { return true; } } /** @@ -663,6 +666,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** is this poly expression a 'true' poly expression? */ public PolyKind polyKind; + + @Override public boolean isPoly() { return polyKind == PolyKind.POLY; } + @Override public boolean isStandalone() { return polyKind == PolyKind.STANDALONE; } } /** diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java index eb49e10f79a..3ee1c0a99c1 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotatedTypeImpl.java @@ -65,7 +65,7 @@ public class AnnotatedTypeImpl @Override public com.sun.javadoc.Type underlyingType() { - return TypeMaker.getType(env, type.unannotatedType(), true, false); + return TypeMaker.getType(env, type, true, false); } @Override diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index de4d54a651d..6a74142437b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -140,9 +140,6 @@ public class TypeMaker { */ static String getTypeString(DocEnv env, Type t, boolean full) { // TODO: should annotations be included here? - if (t.isAnnotated()) { - t = t.unannotatedType(); - } switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); diff --git a/langtools/test/Makefile b/langtools/test/Makefile index ab8b2457927..11fb171ed79 100644 --- a/langtools/test/Makefile +++ b/langtools/test/Makefile @@ -186,6 +186,12 @@ ifdef JTREG_TIMEOUT_FACTOR JTREG_OPTIONS += -timeoutFactor:$(JTREG_TIMEOUT_FACTOR) endif +# Default verbosity setting for jtreg +JTREG_VERBOSE = fail,error,nopass + +# Default verbosity setting for jck +JCK_VERBOSE = non-pass + # Assertions: some tests show failures when assertions are enabled. # Since javac is typically loaded via the bootclassloader (either via TESTJAVA # or TESTBOOTCLASSPATH), you may need -esa to enable assertions in javac. @@ -256,6 +262,8 @@ jdeps: JTREG_TESTDIRS = tools/jdeps # Version of java used to run jtreg. Should normally be the same as TESTJAVA # TESTJAVA # Version of java to be tested. +# JTREG_VERBOSE +# Verbosity setting for jtreg # JTREG_OPTIONS # Additional options for jtreg # JTREG_TESTDIRS @@ -273,7 +281,7 @@ jtreg-tests: check-jtreg FRC JT_JAVA=$(JT_JAVA) $(JTREG) \ -J-Xmx512m \ -vmoption:-Xmx768m \ - -a -ignore:quiet -v:fail,error,nopass \ + -a -ignore:quiet $(if $(JTREG_VERBOSE),-v:$(JTREG_VERBOSE)) \ -r:$(JTREG_OUTPUT_DIR)/JTreport \ -w:$(JTREG_OUTPUT_DIR)/JTwork \ -jdk:$(TESTJAVA) \ @@ -312,6 +320,8 @@ check-jtreg: $(PRODUCT_HOME) $(JTREG) # Default is JDK 7 # TESTJAVA # Version of java to be tested. +# JCK_VERBOSE +# Verbosity setting for jtjck # JCK_COMPILER_OPTIONS # Additional options for JCK-compiler # JCK_COMPILER_TESTDIRS @@ -325,9 +335,9 @@ jck-compiler-tests: check-jck FRC @rm -f -r $(JCK_COMPILER_OUTPUT_DIR)/work $(JCK_COMPILER_OUTPUT_DIR)/report \ $(JCK_COMPILER_OUTPUT_DIR)/diff.html $(JCK_COMPILER_OUTPUT_DIR)/status.txt @mkdir -p $(JCK_COMPILER_OUTPUT_DIR) - $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ + $(JT_JAVA)/bin/java -Xmx512m \ -jar $(JCK_HOME)/JCK-compiler-8/lib/jtjck.jar \ - -v:non-pass \ + $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ -r:$(JCK_COMPILER_OUTPUT_DIR)/report \ -w:$(JCK_COMPILER_OUTPUT_DIR)/work \ -jdk:$(TESTJAVA) \ @@ -361,6 +371,8 @@ jck-compiler-summary: FRC # Version of java used to run JCK. Should normally be the same as TESTJAVA # TESTJAVA # Version of java to be tested. +# JCK_VERBOSE +# Verbosity setting for jtjck # JCK_RUNTIME_OPTIONS # Additional options for JCK-runtime # JCK_RUNTIME_TESTDIRS @@ -374,9 +386,9 @@ jck-runtime-tests: check-jck FRC @rm -f -r $(JCK_RUNTIME_OUTPUT_DIR)/work $(JCK_RUNTIME_OUTPUT_DIR)/report \ $(JCK_RUNTIME_OUTPUT_DIR)/diff.html $(JCK_RUNTIME_OUTPUT_DIR)/status.txt @mkdir -p $(JCK_RUNTIME_OUTPUT_DIR) - $(JT_JAVA)/bin/java -XX:MaxPermSize=256m -Xmx512m \ + $(JT_JAVA)/bin/java -Xmx512m \ -jar $(JCK_HOME)/JCK-runtime-8/lib/jtjck.jar \ - -v:non-pass \ + $(if $(JCK_VERBOSE),-v:$(JCK_VERBOSE)) \ -r:$(JCK_RUNTIME_OUTPUT_DIR)/report \ -w:$(JCK_RUNTIME_OUTPUT_DIR)/work \ -jdk:$(TESTJAVA) \ diff --git a/langtools/test/com/sun/javadoc/5093723/T5093723.java b/langtools/test/com/sun/javadoc/5093723/T5093723.java index 8bea133cc07..6ffa7d16945 100644 --- a/langtools/test/com/sun/javadoc/5093723/T5093723.java +++ b/langtools/test/com/sun/javadoc/5093723/T5093723.java @@ -25,23 +25,24 @@ * @test * @bug 5093723 * @summary REGRESSION: ClassCastException in SingleIndexWriter - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build T5093723 * @run main T5093723 */ public class T5093723 extends JavadocTester { - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR + ".out", "-Xdoclint:none", - SRC_DIR + "/DocumentedClass.java", - SRC_DIR + "/UndocumentedClass.java" - }; - - public static void main(String... args) { + public static void main(String... args) throws Exception { T5093723 tester = new T5093723(); - if (tester.runJavadoc(ARGS) != 0) - throw new AssertionError("non-zero return code from javadoc"); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-Xdoclint:none", + testSrc("DocumentedClass.java"), + testSrc("UndocumentedClass.java")); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java b/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java index 699be36583a..359ea876531 100644 --- a/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java +++ b/langtools/test/com/sun/javadoc/AccessAsciiArt/AccessAsciiArt.java @@ -26,142 +26,31 @@ * @bug 4706779 4956908 * @summary Add text equivalent of class tree ASCII art for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessAsciiArt */ +public class AccessAsciiArt extends JavadocTester { -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessAsciiArt { - - private static final String BUGID = "4706779-4956908"; - private static final String BUGNAME = "AccessAsciiArt"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p1.subpkg"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + AccessAsciiArt tester = new AccessAsciiArt(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p1.subpkg"); + checkExit(Exit.OK); - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test the top line of the class tree - { -"
  • p1.C
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - // Test the second line of the class tree - { -"
  • p1.SC
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - // Test the third line of the class tree - { -"
  • p1.subpkg.SSC
  • ", - TMPDEST_DIR1 + "p1/subpkg/SSC.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.indexOf(stringToFind); + checkOutput("p1/subpkg/SSC.html", true, + // Test the top line of the class tree + "
  • p1.C
  • ", + // Test the second line of the class tree + "
  • p1.SC
  • ", + // Test the third line of the class tree + "
  • p1.subpkg.SSC
  • "); } } diff --git a/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java b/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java index c871b99c382..9505e97c5fa 100644 --- a/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java +++ b/langtools/test/com/sun/javadoc/AccessFrameTitle/AccessFrameTitle.java @@ -26,141 +26,32 @@ * @bug 4636655 * @summary Add title attribute to tags for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessFrameTitle */ +public class AccessFrameTitle extends JavadocTester { -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessFrameTitle { - - private static final String BUGID = "4636655"; - private static final String BUGNAME = "AccessFrameTitle"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + AccessFrameTitle tester = new AccessFrameTitle(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Testing only for the presence of the title attributes. - // To make this test more robust, only - // the initial part of each title string is tested for, - // in case the ending part of the string later changes - - { "title=\"All classes and interfaces (except non-static nested types)\"", - TMPDEST_DIR1 + "index.html" }, - - { "title=\"All Packages\"", - TMPDEST_DIR1 + "index.html" }, - - { "title=\"Package, class and interface descriptions\"", - TMPDEST_DIR1 + "index.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.indexOf(stringToFind); + // Testing only for the presence of the title attributes. + // To make this test more robust, only + // the initial part of each title string is tested for, + // in case the ending part of the string later changes + checkOutput("index.html", true, + "title=\"All classes and interfaces (except non-static nested types)\"", + "title=\"All Packages\"", + "title=\"Package, class and interface descriptions\""); } } diff --git a/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java b/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java index 0d18145632b..323ba26f0c9 100644 --- a/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java +++ b/langtools/test/com/sun/javadoc/AccessH1/AccessH1.java @@ -26,141 +26,35 @@ * @bug 4636667 7052425 8016549 * @summary Use , and

    in proper sequence for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessH1 */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; +public class AccessH1 extends JavadocTester { - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessH1 { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4636667-7052425"; - private static final String BUGNAME = "AccessH1"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-doctitle", "Document Title", - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + AccessH1 tester = new AccessH1(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + @Test + void test() { + javadoc("-d", "out", + "-doctitle", "Document Title", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { // Test the style sheet - { - "h1 {\n" + - " font-size:20px;\n" + - "}", - TMPDEST_DIR1 + "stylesheet.css" - }, + checkOutput("stylesheet.css", true, + "h1 {\n" + + " font-size:20px;\n" + + "}"); + // Test the doc title in the overview page - { - "

    Document Title

    ", - TMPDEST_DIR1 + "overview-summary.html" - } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); + checkOutput("overview-summary.html", true, + "

    Document Title

    "); } } diff --git a/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java b/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java index 38d6f136297..2299193ec76 100644 --- a/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java +++ b/langtools/test/com/sun/javadoc/AccessSkipNav/AccessSkipNav.java @@ -26,150 +26,40 @@ * @bug 4638136 7198273 8025633 * @summary Add ability to skip over nav bar for accessibility * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AccessSkipNav */ +public class AccessSkipNav extends JavadocTester { -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class AccessSkipNav { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4638136 - 7198273"; - private static final String BUGNAME = "AccessSkipNav"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + AccessSkipNav tester = new AccessSkipNav(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { + // Testing only for the presence of the and + checkOutput("p1/C1.html", true, + // Top navbar + "Skip navigation links", + // Top navbar + "\n" + + "\n" + + "", + // Bottom navbar + "Skip navigation links", + // Bottom navbar + "\n" + + "\n" + + ""); - // Testing only for the presence of the and - // Top navbar - { "Skip navigation links", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Top navbar - { "\n" + - "\n" + - "", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Bottom navbar - { "Skip navigation links", - TMPDEST_DIR1 + "p1/C1.html" }, - - // Bottom navbar - { "\n" + - "\n" + - "", - TMPDEST_DIR1 + "p1/C1.html" } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); } } diff --git a/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java b/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java index 0aa3aca9852..7bdd0a7eefd 100644 --- a/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java +++ b/langtools/test/com/sun/javadoc/AccessSummary/AccessSummary.java @@ -26,45 +26,35 @@ * @bug 4637604 4775148 * @summary Test the tables for summary attribute * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build AccessSummary * @run main AccessSummary */ public class AccessSummary extends JavadocTester { - - /** - * Assign value for [ fileToSearch, stringToFind ] - */ - private static final String[][] TESTARRAY1 = { - - // Test that the summary attribute appears - { "overview-summary.html", - "summary=\"Packages table, listing packages, and an explanation\"" }, - - // Test that the summary attribute appears - { "p1/C1.html", - "summary=\"Constructor Summary table, listing constructors, and an explanation\"" }, - - // Test that the summary attribute appears - { "constant-values.html", - "summary=\"Constant Field Values table, listing constant fields, and values\"" } - }; - - // First test with -header only - private static final String[] JAVADOC_ARGS = new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "p1", "p2"}; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { - JavadocTester tester = new AccessSummary(); - tester.run(JAVADOC_ARGS, TESTARRAY1, new String[][] {}); - tester.printSummary(); // Necessary for string search + public static void main(String... args) throws Exception { + AccessSummary tester = new AccessSummary(); + tester.runTests(); + } + + @Test + void testAccessSummary() { + javadoc("-d", "out", "-sourcepath", testSrc, "p1", "p2"); + checkExit(Exit.OK); + checkOutput("overview-summary.html", true, + "summary=\"Packages table, listing packages, and an explanation\""); + + // Test that the summary attribute appears + checkOutput("p1/C1.html", true, + "summary=\"Constructor Summary table, listing constructors, and an explanation\""); + + // Test that the summary attribute appears + checkOutput("constant-values.html", true, + "summary=\"Constant Field Values table, listing constant fields, and values\""); } } diff --git a/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java b/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java index 4b108276f80..69e82f96ced 100644 --- a/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java +++ b/langtools/test/com/sun/javadoc/AuthorDD/AuthorDD.java @@ -26,143 +26,37 @@ * @bug 4651598 8026567 * @summary Javadoc wrongly inserts tags when using multiple @author tags * @author dkramer + * @library ../lib + * @build JavadocTester * @run main AuthorDD */ - -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - /** * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. */ -public class AuthorDD -{ +public class AuthorDD extends JavadocTester { - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4651598"; - private static final String BUGNAME = "AuthorDD"; - - // Subtest number. Needed because runResultsOnHTML is run twice, and subtestNum - // should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); + public static void main(String... args) throws Exception { + AuthorDD tester = new AuthorDD(); + tester.runTests(); + } + @Test + void test() { // Test for all cases except the split index page - runJavadoc(new String[] {"-d", BUGID, - "-author", - "-version", - "-sourcepath", srcdir, - "p1"}); - runTestsOnHTML(testArray); + javadoc("-d", "out", + "-author", + "-version", + "-sourcepath", testSrc, + "p1"); + checkExit(Exit.OK); - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(AuthorDD.class.getClassLoader(), - javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } - - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - - // Test single @since tag: - - { "
    Since:
    \n" + - "
    JDK 1.0
    ", - BUGID + "/p1/C1.html" }, - - // Test multiple @author tags: - - { "
    Author:
    \n" + - "
    Doug Kramer, Jamie, Neal
    ", - BUGID + "/p1/C1.html" }, - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); + checkOutput("p1/C1.html", true, + // Test single @since tag: + "
    Since:
    \n" + + "
    JDK 1.0
    ", + // Test multiple @author tags: + "
    Author:
    \n" + + "
    Doug Kramer, Jamie, Neal
    "); } } diff --git a/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java b/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java index 67c0b19968b..314a8d21dbf 100644 --- a/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java +++ b/langtools/test/com/sun/javadoc/DocRootSlash/DocRootSlash.java @@ -26,13 +26,11 @@ * @bug 4524350 4662945 4633447 * @summary stddoclet: {@docRoot} inserts an extra trailing "/" * @author dkramer + * @library ../lib + * @build JavadocTester * @run main DocRootSlash */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; -import java.nio.*; import java.util.regex.*; /** @@ -40,149 +38,55 @@ import java.util.regex.*; * It reads each file, complete with newlines, into a string to easily * find strings that contain newlines. */ -public class DocRootSlash -{ - private static final String BUGID = "4524350, 4662945, or 4633447"; - private static final String BUGNAME = "DocRootSlash"; - private static final String TMPDIR_STRING1 = "./docs1/"; +public class DocRootSlash extends JavadocTester { - // Test number. Needed because runResultsOnHTMLFile is run twice, and subtestNum - // should increment across test runs. - public static int subtestNum = 0; - public static int numOfSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { + public static void main(String... args) throws Exception { + DocRootSlash tester = new DocRootSlash(); + tester.runTests(); + } + @Test + void test() { // Directory that contains source files that javadoc runs on String srcdir = System.getProperty("test.src", "."); - runJavadoc(new String[] {"-d", TMPDIR_STRING1, - "-Xdoclint:none", - "-overview", (srcdir + "/overview.html"), - "-header", "{@docroot} {@docRoot}", - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTMLFiles(filenameArray); + javadoc("-d", "out", + "-Xdoclint:none", + "-overview", (srcdir + "/overview.html"), + "-header", "{@docroot} {@docRoot}", + "-sourcepath", srcdir, + "p1", "p2"); - printSummary(); - } - - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } - - /** The array of filenames to test */ - private static final String[] filenameArray = { - TMPDIR_STRING1 + "p1/C1.html" , - TMPDIR_STRING1 + "p1/package-summary.html", - TMPDIR_STRING1 + "overview-summary.html" - }; - - public static void runTestsOnHTMLFiles(String[] filenameArray) { - String fileString; - - // Bugs 4524350 4662945 - for (int i = 0; i < filenameArray.length; i++ ) { - - // Read contents of file (whose filename is in filenames) into a string - fileString = readFileToString(filenameArray[i]); - - System.out.println("\nSub-tests for file: " + filenameArray[i] - + " --------------"); - - // Loop over all tests in a single file - for ( int j = 0; j < 11; j++ ) { - subtestNum += 1; - - // Compare actual to expected string for a single subtest - compareActualToExpected(fileString); - } - } + checkFiles( + "p1/C1.html" , + "p1/package-summary.html", + "overview-summary.html"); // Bug 4633447: Special test for overview-frame.html // Find two strings in file "overview-frame.html" - String filename = TMPDIR_STRING1 + "overview-frame.html"; - fileString = readFileToString(filename); - - // Find first string in overview-frame.html - subtestNum += 1; - String stringToFind = ""; - String result; - if ( fileString.indexOf(stringToFind) == -1 ) { - result = "FAILED"; - } else { - result = "succeeded"; - numOfSubtestsPassed += 1; - } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "when searching for:\n" - + stringToFind + "\n" - + "in file " + filename); - - // Find second string in overview-frame.html - subtestNum += 1; - stringToFind = ""; - if ( fileString.indexOf(stringToFind) == -1 ) { - result = "FAILED"; - } else { - result = "succeeded"; - numOfSubtestsPassed += 1; - } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "when searching for:\n" - + stringToFind + "\n" - + "in file " + filename); + checkOutput("overview-frame.html", true, + "", + ""); } - public static void printSummary() { - System.out.println(""); - if ( numOfSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numOfSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numOfSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } + void checkFiles(String... filenameArray) { + int count = 0; - // Read the contents of the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); + for (String f : filenameArray) { + // Read contents of file into a string + String fileString = readFile(f); + System.out.println("\nSub-tests for file: " + f + " --------------"); + // Loop over all tests in a single file + for ( int j = 0; j < 11; j++ ) { + + // Compare actual to expected string for a single subtest + compareActualToExpected(++count, fileString); } - - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; } } /** - * Regular expression pattern matching code adapted from Eric's - * /java/pubs/dev/linkfix/src/LinkFix.java + * Regular expression pattern matching code * * Prefix Pattern: * flag (?i) (case insensitive, so "a href" == "A HREF" and all combinations) @@ -197,34 +101,33 @@ public class DocRootSlash * group4 (.*?) (label - zero or more characters) * group5 () (end tag) */ - static String prefix = "(?i)()"; // doublequotes (end group1, group2, group3) - static String ref2 = ")(\\S+?)([^<>]*>)"; // no quotes (end group1, group2, group3) - static String label = "(.*?)"; // text label (group4) - static String end = "()"; // (group5) + private static final String prefix = "(?i)()"; // doublequotes (end group1, group2, group3) + private static final String ref2 = ")(\\S+?)([^<>]*>)"; // no quotes (end group1, group2, group3) + private static final String label = "(.*?)"; // text label (group4) + private static final String end = "()"; // (group5) /** * Compares the actual string to the expected string in the specified string - * str String to search through + * @param str String to search through */ - static void compareActualToExpected(String str) { - // Pattern must be compiled each run because subtestNum is incremented + void compareActualToExpected(int count, String str) { + checking("comparison for " + str); + + // Pattern must be compiled each run because numTestsRun is incremented Pattern actualLinkPattern1 = - Pattern.compile("Sub-test " + subtestNum + " Actual: " + prefix + ref1, Pattern.DOTALL); + Pattern.compile("Sub-test " + count + " Actual: " + prefix + ref1, Pattern.DOTALL); Pattern expectLinkPattern1 = - Pattern.compile("Sub-test " + subtestNum + " Expect: " + prefix + ref1, Pattern.DOTALL); + Pattern.compile("Sub-test " + count + " Expect: " + prefix + ref1, Pattern.DOTALL); // Pattern linkPattern2 = Pattern.compile(prefix + ref2 + label + end, Pattern.DOTALL); - CharBuffer charBuffer = CharBuffer.wrap(str); - Matcher actualLinkMatcher1 = actualLinkPattern1.matcher(charBuffer); - Matcher expectLinkMatcher1 = expectLinkPattern1.matcher(charBuffer); - String result; - if ( expectLinkMatcher1.find() && actualLinkMatcher1.find() ) { + Matcher actualLinkMatcher1 = actualLinkPattern1.matcher(str); + Matcher expectLinkMatcher1 = expectLinkPattern1.matcher(str); + if (expectLinkMatcher1.find() && actualLinkMatcher1.find()) { String expectRef = expectLinkMatcher1.group(2); String actualRef = actualLinkMatcher1.group(2); - if ( actualRef.equals(expectRef) ) { - result = "succeeded"; - numOfSubtestsPassed += 1; + if (actualRef.equals(expectRef)) { + passed(expectRef); // System.out.println("pattern: " + actualLinkPattern1.pattern()); // System.out.println("actualRef: " + actualRef); // System.out.println("group0: " + actualLinkMatcher1.group()); @@ -233,15 +136,13 @@ public class DocRootSlash // System.out.println("group3: " + actualLinkMatcher1.group(3)); // System.exit(0); } else { - result = "FAILED"; + failed("\n" + + "Actual: \"" + actualRef + "\"\n" + + "Expect: \"" + expectRef + "\""); } - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") " + result + "\n" - + "Actual: \"" + actualRef + "\"" + "\n" - + "Expect: \"" + expectRef + "\""); } else { - System.out.println("Didn't find that fits the pattern: " - + expectLinkPattern1.pattern() ); + failed("Didn't find that fits the pattern: " + + expectLinkPattern1.pattern()); } } } diff --git a/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java b/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java index 04d77e35bfa..65632e5cbd2 100644 --- a/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java +++ b/langtools/test/com/sun/javadoc/InheritDocForUserTags/DocTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 @@ -26,11 +26,11 @@ * @bug 8008768 * @summary Using {@inheritDoc} in simple tag defined via -tag fails * @author Mike Duigou + * @library ../lib + * @build JavadocTester * @run main DocTest */ -import java.io.*; - /** * DocTest documentation. * @@ -38,41 +38,27 @@ import java.io.*; * @implSpec DocTest implementation spec. * @implNote DocTest implementation note. */ -public class DocTest { +public class DocTest extends JavadocTester { public static void main(String... args) throws Exception { - String[] javadoc_args = { - "-verbose", - "-d", "DocTest", - "-tag", "apiNote:optcm:API Note", - "-tag", "implSpec:optcm:Implementation Requirements:", - "-tag", "implNote:optcm:Implementation Note:", - "-package", - new File(System.getProperty("test.src"), "DocTest.java").getPath() - }; + DocTest tester = new DocTest(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-verbose", + "-d", "DocTest", + "-tag", "apiNote:optcm:API Note", + "-tag", "implSpec:optcm:Implementation Requirements:", + "-tag", "implNote:optcm:Implementation Note:", + "-package", + testSrc("DocTest.java") + ); + checkExit(Exit.OK); // javadoc does not report an exit code for an internal exception (!) // so monitor stderr for stack dumps. - PrintStream prevErr = System.err; - ByteArrayOutputStream err_baos = new ByteArrayOutputStream(); - PrintStream err_ps = new PrintStream(err_baos); - System.setErr(err_ps); - - int rc; - try { - rc = com.sun.tools.javadoc.Main.execute(javadoc_args); - } finally { - err_ps.close(); - System.setErr(prevErr); - } - - String err = err_baos.toString(); - System.err.println(err); - - if (rc != 0) - throw new Exception("javadoc exited with rc=" + rc); - - if (err.contains("at com.sun.")) - throw new Exception("javadoc output contains stack trace"); + checkOutput(Output.STDERR, false, "at com.sun"); } /** diff --git a/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java b/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java index 161427d7f0f..854663d1d7f 100644 --- a/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java +++ b/langtools/test/com/sun/javadoc/JavascriptWinTitle/JavascriptWinTitle.java @@ -27,172 +27,49 @@ * @summary Javascript IE load error when linked by -linkoffline * Window title shouldn't change when loading left frames (javascript) * @author dkramer + * @library ../lib + * @build JavadocTester * @run main JavascriptWinTitle */ +public class JavascriptWinTitle extends JavadocTester { -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class JavascriptWinTitle { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4645058"; - private static final String BUGNAME = "JavascriptWinTitle"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "-doctitle", "Document Title", - "-windowtitle", "Window Title", - "-overview", (srcdir + "/overview.html"), - "-linkoffline", - "http://java.sun.com/j2se/1.4/docs/api", srcdir, - "-sourcepath", srcdir, - "p1", "p2"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + JavascriptWinTitle tester = new JavascriptWinTitle(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } + @Test + void test() { + javadoc("-d", "out", + "-doctitle", "Document Title", + "-windowtitle", "Window Title", + "-overview", testSrc("overview.html"), + "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api", testSrc, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + checkOutput("overview-summary.html", true, + "", - TMPDEST_DIR1 + "/p1/C.html" - } - - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) - + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" - + "when searching for:\n" - + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } - } - - public static void printSummary() { - if ( numSubtestsPassed == subtestNum ) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) - + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int)file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int)file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); + // Test that win title javascript is followed by NOSCRIPT code. + checkOutput("p1/C.html", true, + ""); } } diff --git a/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java b/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java index 49456b5bfa0..2a14fbd0315 100644 --- a/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java +++ b/langtools/test/com/sun/javadoc/MetaTag/MetaTag.java @@ -21,114 +21,94 @@ * questions. */ -import java.text.SimpleDateFormat; -import java.util.Date; - /* * @test * @bug 4034096 4764726 6235799 * @summary Add support for HTML keywords via META tag for * class and member names to improve API search * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build MetaTag * @run main MetaTag */ +import java.text.SimpleDateFormat; +import java.util.Date; + public class MetaTag extends JavadocTester { - //Test information. - private static final SimpleDateFormat m_dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "-keywords", - "-doctitle", "Sample Packages", - "p1", "p2" - }; - - private static final String[] ARGS_NO_TIMESTAMP_NO_KEYWORDS = new String[] { - "-d", OUTPUT_DIR + "-2", - "-sourcepath", SRC_DIR, - "-notimestamp", - "-doctitle", "Sample Packages", - "p1", "p2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/package-summary.html", - "" }, - - { "overview-summary.html", - "" }, - - //NOTE: Hopefully, this regression test is not run at midnight. If the output - //was generated yesterday and this test is run today, the test will fail. - { "overview-summary.html", - ""}, - }; - - private static final String[][] NEGATED_TEST2 = { - //No keywords when -keywords is not used. - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/C1.html", - "" }, - - { "p1/package-summary.html", - "" }, - - { "overview-summary.html", - "" }, - - //The date metatag should not show up when -notimestamp is used. - - //NOTE: Hopefully, this regression test is not run at midnight. If the output - //was generated yesterday and this test is run today, the test will fail. - { "overview-summary.html", - ""}, - }; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { MetaTag tester = new MetaTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.run(ARGS_NO_TIMESTAMP_NO_KEYWORDS, NO_TEST, NEGATED_TEST2); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testStandard() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-keywords", + "-doctitle", "Sample Packages", + "p1", "p2"); + + checkExit(Exit.OK); + + checkOutput("p1/C1.html", true, + "", + "", + "", + "", + ""); + + checkOutput("p1/package-summary.html", true, + ""); + + checkOutput("overview-summary.html", true, + ""); + + // NOTE: Hopefully, this regression test is not run at midnight. If the output + // was generated yesterday and this test is run today, the test will fail. + checkOutput("overview-summary.html", true, + ""); + } + + @Test + void testNoTimestamp() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-notimestamp", + "-doctitle", "Sample Packages", + "p1", "p2"); + checkExit(Exit.OK); + + // No keywords when -keywords is not used. + checkOutput("p1/C1.html", false, + "", + "", + "", + "", + ""); + + checkOutput("p1/package-summary.html", false, + ""); + + checkOutput("overview-summary.html", false, + ""); + + // The date metatag should not show up when -notimestamp is used. + // NOTE: Hopefully, this regression test is not run at midnight. If the output + // was generated yesterday and this test is run today, the test will fail. + checkOutput("overview-summary.html", false, + ""); + } + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + String date() { + return dateFormat.format(new Date()); } } diff --git a/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java b/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java index aa7ba2dbb9e..ff2a98e9151 100644 --- a/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java +++ b/langtools/test/com/sun/javadoc/PackagesHeader/PackagesHeader.java @@ -28,83 +28,62 @@ * is present for three sets of options: (1) -header, * (2) -packagesheader, and (3) -header -packagesheader * @author dkramer - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build PackagesHeader * @run main PackagesHeader */ public class PackagesHeader extends JavadocTester { - //Test information. - private static final String OUTPUT_DIR1 = OUTPUT_DIR + "-1/"; - private static final String OUTPUT_DIR2 = OUTPUT_DIR + "-2/"; - private static final String OUTPUT_DIR3 = OUTPUT_DIR + "-3/"; + public static void main(String... args) throws Exception { + JavadocTester tester = new PackagesHeader(); + tester.runTests(); + } - /** - * Assign value for [ fileToSearch, stringToFind ] - */ - private static final String[][] TESTARRAY1 = { + @Test + void testHeader() { + // First test with -header only + javadoc("-d", "out-header", + "-header", "Main Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the -header shows up in the packages frame - { "overview-frame.html", - "Main Frame Header" } - }; + checkOutput("overview-frame.html", true, + "Main Frame Header"); + } - private static final String[][] TESTARRAY2 = { + @Test + void testPackagesHeader() { + // Second test with -packagesheader only + javadoc("-d", "out-packages-header", + "-packagesheader", "Packages Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the -packagesheader string shows // up in the packages frame + checkOutput("overview-frame.html", true, + "Packages Frame Header"); + } - { "overview-frame.html", - "Packages Frame Header" } - }; - - private static final String[][] TESTARRAY3 = { + @Test + void testBothHeaders() { + // Third test with both -packagesheader and -header + javadoc("-d", "out-both", + "-packagesheader", "Packages Frame Header", + "-header", "Main Frame Header", + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); // Test that the both headers show up and are different + checkOutput("overview-frame.html", true, + "Packages Frame Header"); - { "overview-frame.html", - "Packages Frame Header" }, - - { "overview-summary.html", - "Main Frame Header" } - }; - - // First test with -header only - private static final String[] JAVADOC_ARGS1 = new String[] { - "-d", OUTPUT_DIR1, - "-header", "Main Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; - - // Second test with -packagesheader only - private static final String[] JAVADOC_ARGS2 = new String[] { - "-d", OUTPUT_DIR2, - "-packagesheader", "Packages Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; - - // Third test with both -packagesheader and -header - private static final String[] JAVADOC_ARGS3 = new String[] { - "-d", OUTPUT_DIR3, - "-packagesheader", "Packages Frame Header", - "-header", "Main Frame Header", - "-sourcepath", SRC_DIR, - "p1", "p2"}; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - JavadocTester tester = new PackagesHeader(); - - tester.run(JAVADOC_ARGS1, TESTARRAY1, NO_TEST); - tester.run(JAVADOC_ARGS2, TESTARRAY2, NO_TEST); - tester.run(JAVADOC_ARGS3, TESTARRAY3, NO_TEST); - - tester.printSummary(); + checkOutput("overview-summary.html", true, + "Main Frame Header"); } } diff --git a/langtools/test/com/sun/javadoc/T6735320/T6735320.java b/langtools/test/com/sun/javadoc/T6735320/T6735320.java index 531e4a64bba..2f913274893 100644 --- a/langtools/test/com/sun/javadoc/T6735320/T6735320.java +++ b/langtools/test/com/sun/javadoc/T6735320/T6735320.java @@ -25,24 +25,24 @@ * @test * @bug 6735320 * @summary javadoc throws exception if serialField value is missing - * @library ../lib/ - * @build JavadocTester T6735320 + * @library ../lib + * @build JavadocTester * @run main T6735320 */ + public class T6735320 extends JavadocTester { - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR + ".out", - SRC_DIR + "/SerialFieldTest.java" - }; - - public static void main(String... args) { + public static void main(String... args) throws Exception { T6735320 tester = new T6735320(); - if (tester.runJavadoc(ARGS) == 0) { - throw new AssertionError("zero return code from javadoc"); - } - if (tester.getErrorOutput().contains("StringIndexOutOfBoundsException")) { - throw new AssertionError("javadoc threw StringIndexOutOfBoundsException"); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + testSrc("SerialFieldTest.java")); + checkExit(Exit.FAILED); + checkOutput(Output.STDERR, false, + "StringIndexOutOfBoundsException"); } } diff --git a/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java b/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java index 3c9a5a64a39..43da7cdae81 100644 --- a/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java +++ b/langtools/test/com/sun/javadoc/ValidHtml/ValidHtml.java @@ -30,174 +30,52 @@ * not allowed outside <FRAMESET> element * HTML table tags inserted in wrong place in pakcage use page * @author dkramer + * @library ../lib + * @build JavadocTester * @run main ValidHtml */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; +public class ValidHtml extends JavadocTester { -/** - * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. - */ -public class ValidHtml { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "4275630"; - private static final String BUGNAME = "ValidHtml"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); + public static void main(String... args) throws Exception { + ValidHtml tester = new ValidHtml(); + tester.runTests(); + } + @Test + void test() { // Test for all cases except the split index page - runJavadoc(new String[]{"-d", TMPDEST_DIR1, + javadoc("-d", "out", "-doctitle", "Document Title", "-windowtitle", "Window Title", "-use", - "-overview", (srcdir + "/overview.html"), - "-sourcepath", srcdir, - "p1", "p2" - }); - runTestsOnHTML(testArray); + "-overview", testSrc("overview.html"), + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); - printSummary(); - } + // Test the proper DOCTYPE element are present: + checkOutput("index.html", true, FRAMESET); + checkOutput("overview-summary.html", true, LOOSE); + checkOutput("p1/package-summary.html", true, LOOSE); + checkOutput("p1/C.html", true, LOOSE); + checkOutput("overview-frame.html", true, LOOSE); + checkOutput("allclasses-frame.html", true, LOOSE); + checkOutput("p1/package-frame.html", true, LOOSE); - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } - } - - /** - * Assign value for [ stringToFind, filename ] - * NOTE: The standard doclet uses the same separator "\n" for all OS's - */ - private static final String[][] testArray = { - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">", - TMPDEST_DIR1 + "index.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "overview-summary.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "p1/package-summary.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "p1/C.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "overview-frame.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "allclasses-frame.html" - }, - // Test the proper DOCTYPE element is present: - { - "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">", - TMPDEST_DIR1 + "p1/package-frame.html" - }, // Test that <NOFRAMES> is inside <FRAMESET> element: - { - "\n" + - "", - TMPDEST_DIR1 + "index.html" - }, + checkOutput("index.html", true, + "\n" + + ""); + // Test the table elements are in the correct order: - { - "\n" + - "", - TMPDEST_DIR1 + "/p1/package-use.html" - } - }; - - public static void runTestsOnHTML(String[][] testArray) { - - for (int i = 0; i < testArray.length; i++) { - - subtestNum += 1; - - // Read contents of file into a string - String fileString = readFileToString(testArray[i][1]); - - // Get string to find - String stringToFind = testArray[i][0]; - - // Find string in file's contents - if (findString(fileString, stringToFind) == -1) { - System.out.println("\nSub-test " + (subtestNum) + " for bug " + BUGID + " (" + BUGNAME + ") FAILED\n" + "when searching for:\n" + stringToFind); - } else { - numSubtestsPassed += 1; - System.out.println("\nSub-test " + (subtestNum) + " passed:\n" + stringToFind); - } - } + checkOutput("p1/package-use.html", true, + "\n" + + ""); } - public static void printSummary() { - if (numSubtestsPassed == subtestNum) { - System.out.println("\nAll " + numSubtestsPassed + " subtests passed"); - } else { - throw new Error("\n" + (subtestNum - numSubtestsPassed) + " of " + (subtestNum) + " subtests failed for bug " + BUGID + " (" + BUGNAME + ")\n"); - } - } - - // Read the file into a String - public static String readFileToString(String filename) { - try { - File file = new File(filename); - if (!file.exists()) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - - // Create an array of characters the size of the file - char[] allChars = new char[(int) file.length()]; - - // Read the characters into the allChars array - in.read(allChars, 0, (int) file.length()); - in.close(); - - // Convert to a string - String allCharsString = new String(allChars); - - return allCharsString; - - } catch (FileNotFoundException e) { - System.err.println(e); - return ""; - } catch (IOException e) { - System.err.println(e); - return ""; - } - } - - public static int findString(String fileString, String stringToFind) { - return fileString.replace(NL, "\n").indexOf(stringToFind); - } + private static final String FRAMESET = + ""; + private static final String LOOSE = + ""; } diff --git a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java index 44aca3ae30a..7089e50517d 100644 --- a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java +++ b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java @@ -26,131 +26,31 @@ * @bug 4720849 * @summary com.sun.tools.doclets.standard.Standard contains hard-coded version number * @author dkramer + * @library ../lib + * @build JavadocTester * @run main VersionNumber */ -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - - /** * Runs javadoc and runs regression tests on the resulting HTML. - * It reads each file, complete with newlines, into a string to easily - * find strings that contain newlines. */ -public class VersionNumber { +public class VersionNumber extends JavadocTester { - private static final String BUGID = "4720849"; - private static final String BUGNAME = "VersionNumber"; - private static final String TMPDEST_DIR1 = "./docs1/"; - private static final String TMPDEST_DIR2 = "./docs2/"; - - // Subtest number. Needed because runResultsOnHTML is run twice, - // and subtestNum should increment across subtest runs. - public static int subtestNum = 0; - public static int numSubtestsPassed = 0; - - // Entry point - public static void main(String[] args) { - - // Directory that contains source files that javadoc runs on - String srcdir = System.getProperty("test.src", "."); - - // Test for all cases except the split index page - runJavadoc(new String[] {"-d", TMPDEST_DIR1, - "p1"}); - runTestsOnHTML(testArray); - - printSummary(); + public static void main(String... args) throws Exception { + VersionNumber tester = new VersionNumber(); + tester.runTests(); } - /** Run javadoc */ - public static void runJavadoc(String[] javadocArgs) { - if (com.sun.tools.javadoc.Main.execute(javadocArgs) != 0) { - throw new Error("Javadoc failed to execute"); - } + @Test + void test() { + javadoc("-d", "out", + "p1"); + checkExit(Exit.OK); + + // Test the proper DOCTYPE element is present: + checkOutput("p1/C.html", true, + ""}, - { "pkg/AnnotationTypeField.html", - "

    Field Summary

    "}, - { "pkg/AnnotationTypeField.html", - "
    DEFAULT_NAME" + - " "}, - { "pkg/AnnotationTypeField.html", - ""}, - { "pkg/AnnotationTypeField.html", - "

    DEFAULT_NAME

    \n" + - "
    public static final java." +
    -            "lang.String DEFAULT_NAME
    "}, - { "pkg/AnnotationType.html", - "
  • Summary: 
  • \n" + - "
  • Field | 
  • "}, - { "pkg/AnnotationType.html", - "
  • Detail: 
  • \n" + - "
  • Field | 
  • "}, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/AnnotationType.html", - "
    \n\n" + - "

    \n\n" + - "

    " + - "" + "


    "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestAnnotationTypes tester = new TestAnnotationTypes(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/AnnotationTypeField.html", true, + "
  • Summary: 
  • \n" + + "
  • Field | 
  • ", + "
  • Detail: 
  • \n" + + "
  • Field | 
  • ", + "", + "

    Field Summary

    ", + "DEFAULT_NAME" + + " ", + "", + "

    DEFAULT_NAME

    \n" + + "
    public static final java."
    +                + "lang.String DEFAULT_NAME
    "); + + checkOutput("pkg/AnnotationType.html", true, + "
  • Summary: 
  • \n" + + "
  • Field | 
  • ", + "
  • Detail: 
  • \n" + + "
  • Field | 
  • "); + + checkOutput("pkg/AnnotationType.html", false, + "
    \n\n" + + "

    \n\n" + + "

    " + + "" + "


    "); } } diff --git a/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java b/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java index f7973439012..3236ce4be79 100644 --- a/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java +++ b/langtools/test/com/sun/javadoc/testBackSlashInLink/TestBackSlashInLink.java @@ -27,28 +27,27 @@ * @summary Test to make sure that the link to source documentation * has a forward slash. It would be wrong to use a back slash. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBackSlashInLink * @run main TestBackSlashInLink */ public class TestBackSlashInLink extends JavadocTester { - private static final String[][] TEST = { - { "C.html", "src-html/C.html#line.7"}}; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linksource", SRC_DIR + "/C.java"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBackSlashInLink tester = new TestBackSlashInLink(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linksource", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "src-html/C.html#line.7"); } } diff --git a/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java b/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java index 32bca3224a2..f3a51e1072c 100644 --- a/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java +++ b/langtools/test/com/sun/javadoc/testBadPackageFileInJar/TestBadPackageFileInJar.java @@ -27,33 +27,27 @@ * @summary Test to make sure that Javadoc emits a useful warning * when a bad package.html file is in the JAR. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadPackageFileInJar * @run main TestBadPackageFileInJar */ public class TestBadPackageFileInJar extends JavadocTester { - private static final String[][] TEST = - new String[][] { - {ERROR_OUTPUT, - "badPackageFileInJar.jar" + FS + "pkg/package.html: error - Body tag missing from HTML"} - }; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-classpath", - SRC_DIR + "/badPackageFileInJar.jar", "pkg"}; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBadPackageFileInJar tester = new TestBadPackageFileInJar(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-classpath", testSrc("badPackageFileInJar.jar"), + "pkg"); + checkExit(Exit.FAILED); + + checkOutput(Output.ERROR, true, + "badPackageFileInJar.jar" + FS + "pkg/package.html: error - Body tag missing from HTML"); } } diff --git a/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java b/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java index cf60a9f6edb..6ee63656c4c 100644 --- a/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java +++ b/langtools/test/com/sun/javadoc/testBadSourceFile/TestBadSourceFile.java @@ -27,27 +27,28 @@ * @summary Make sure exception is not thrown if there is a bad source * file in the same directory as the file being documented. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadSourceFile * @run main TestBadSourceFile */ public class TestBadSourceFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/C2.java" - }; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBadSourceFile tester = new TestBadSourceFile(); - int exitCode = tester.run(ARGS, NO_TEST, NO_TEST); - tester.checkExitCode(0, exitCode); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("C2.java")); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java b/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java index d25e8e06b30..b6a71de3a1b 100644 --- a/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java +++ b/langtools/test/com/sun/javadoc/testBaseClass/TestBaseClass.java @@ -26,29 +26,25 @@ * @bug 4197513 * @summary Javadoc does not process base class. * @author jamieh - * @library ../lib/ + * @library ../lib * @build BaseClass * @build JavadocTester - * @build TestBaseClass * @run main TestBaseClass */ public class TestBaseClass extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-sourcepath", SRC_DIR, - "-docletpath", SRC_DIR, "-doclet", "BaseClass", - SRC_DIR + "/Bar.java", "baz"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBaseClass tester = new TestBaseClass(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc failed to execute."); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-sourcepath", testSrc, + "-docletpath", testSrc, + "-doclet", "BaseClass", + testSrc("Bar.java"), "baz"); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java b/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java index f0dd06e3feb..161ac5d0dc6 100644 --- a/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java +++ b/langtools/test/com/sun/javadoc/testBreakIterator/TestBreakIterator.java @@ -29,29 +29,27 @@ * Correct Answer: "The class is empty (i.e. it has no members)." * Wrong Answer: "The class is empty (i.e." * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBreakIterator * @run main TestBreakIterator */ public class TestBreakIterator extends JavadocTester { - private static final String[][] TEST = { - { "pkg/BreakIteratorTest.html", - "The class is empty (i.e. it has no members)."}}; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-breakiterator", "pkg"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBreakIterator tester = new TestBreakIterator(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-breakiterator", + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/BreakIteratorTest.html", true, + "The class is empty (i.e. it has no members)."); } } diff --git a/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java b/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java index 5bac9a6f553..5c712a41023 100644 --- a/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java +++ b/langtools/test/com/sun/javadoc/testCRLineSeparator/TestCRLineSeparator.java @@ -26,9 +26,8 @@ * @bug 4979486 * @summary Make sure tool parses CR line separators properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestCRLineSeparator * @run main TestCRLineSeparator */ @@ -37,32 +36,27 @@ import java.util.*; public class TestCRLineSeparator extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", ".", "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/MyClass.html", "Line 1\n" + - " Line 2"} - }; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - initFiles(new File(SRC_DIR), new File("."), "pkg"); + public static void main(String... args) throws Exception { TestCRLineSeparator tester = new TestCRLineSeparator(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() throws IOException { + initFiles(new File(testSrc), new File("src"), "pkg"); + javadoc("-d", "out", + "-sourcepath", "src", + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/MyClass.html", true, + "Line 1\n" + + " Line 2"); } // recursively copy files from fromDir to toDir, replacing newlines // with \r - static void initFiles(File fromDir, File toDir, String f) throws IOException { + void initFiles(File fromDir, File toDir, String f) throws IOException { File from_f = new File(fromDir, f); File to_f = new File(toDir, f); if (from_f.isDirectory()) { @@ -71,23 +65,17 @@ public class TestCRLineSeparator extends JavadocTester { initFiles(from_f, to_f, child); } } else { - List lines = new ArrayList(); - BufferedReader in = new BufferedReader(new FileReader(from_f)); - try { + List lines = new ArrayList<>(); + try (BufferedReader in = new BufferedReader(new FileReader(from_f))) { String line; while ((line = in.readLine()) != null) lines.add(line); - } finally { - in.close(); } - BufferedWriter out = new BufferedWriter(new FileWriter(to_f)); - try { + try (BufferedWriter out = new BufferedWriter(new FileWriter(to_f))) { for (String line: lines) { out.write(line); out.write("\r"); } - } finally { - out.close(); } } } diff --git a/langtools/test/com/sun/javadoc/testCharset/TestCharset.java b/langtools/test/com/sun/javadoc/testCharset/TestCharset.java index d851a659c98..eede6110636 100644 --- a/langtools/test/com/sun/javadoc/testCharset/TestCharset.java +++ b/langtools/test/com/sun/javadoc/testCharset/TestCharset.java @@ -27,39 +27,34 @@ * @summary Run a test on -charset to make sure the charset gets generated as a * part of the meta tag. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestCharset + * @library ../lib + * @build JavadocTester * @run main TestCharset */ public class TestCharset extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-charset", "UTF-8", "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[][] TEST = { - { "index.html", - ""}, - { "pkg/Foo.html", - ""} - }; - - private static final String[][] NEGATED_TEST = { - { "index.html", - ""}, - { "pkg/Foo.html", - ""} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestCharset tester = new TestCharset(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-charset", "UTF-8", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("index.html", true, + ""); + checkOutput("pkg/Foo.html", true, + ""); + + checkOutput("index.html", false, + ""); + checkOutput("pkg/Foo.html", false, + ""); } } diff --git a/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java b/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java index 6617c6e61ec..9f1d54d4527 100644 --- a/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java +++ b/langtools/test/com/sun/javadoc/testClassCrossReferences/TestClassCrossReferences.java @@ -26,7 +26,7 @@ * @bug 4652655 4857717 8025633 8026567 * @summary This test verifies that class cross references work properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestClassCrossReferences * @run main TestClassCrossReferences @@ -34,37 +34,34 @@ public class TestClassCrossReferences extends JavadocTester { - private static final String[][] TEST = { - { "C.html", - "Link to math package"}, - { "C.html", - "Link to AttributeContext innerclass"}, - { "C.html", - "Link to external class BigDecimal"}, - { "C.html", - "Link to external member gcd"}, - { "C.html", - "
    \n" + - "
    Overrides:
    \n" + - "
    toString in class java.lang.Object
    \n" + - "
    "} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", - SRC_DIR, SRC_DIR + "/C.java"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestClassCrossReferences tester = new TestClassCrossReferences(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); } + + @Test + void test() { + final String uri = "http://java.sun.com/j2se/1.4/docs/api/"; + + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "" + + "Link to math package", + "Link to AttributeContext innerclass", + "Link to external class BigDecimal", + "Link to external member gcd", + "
    \n" + + "
    Overrides:
    \n" + + "
    toString in class java.lang.Object
    \n" + + "
    "); + } + } diff --git a/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java b/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java index 9215c4e54fc..22070488d77 100644 --- a/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java +++ b/langtools/test/com/sun/javadoc/testClassTree/TestClassTree.java @@ -29,64 +29,52 @@ * Make sure class tree includes heirarchy for enums and annotation * types. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestClassTree * @run main TestClassTree */ public class TestClassTree extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/package-tree.html", - "
      \n" + - "
    • pkg.ParentClass"}, - - { "pkg/package-tree.html", - "

      Annotation Type Hierarchy

      \n" + - "
        \n" + - "
      • pkg.AnnotationType " + - "(implements java.lang.annotation.Annotation)
      • \n" + - "
      "}, - - { "pkg/package-tree.html", - "

      Enum Hierarchy

      \n" + - "
        \n" + - "
      • java.lang.Object\n" + - "
          \n" + - "
        • java.lang.Enum<E> (implements java.lang." + - "Comparable<T>, java.io.Serializable)\n" + - "
            \n" + - "
          • pkg.Coin
          • \n" + - "
          \n" + - "
        • \n" + - "
        \n" + - "
      • \n" + - "
      " - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/package-tree.html", - "
    • class pkg.ParentClass
    • "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestClassTree tester = new TestClassTree(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/package-tree.html", true, + "
        \n" + + "
      • pkg.ParentClass", + "

        Annotation Type Hierarchy

        \n" + + "
          \n" + + "
        • pkg.AnnotationType " + + "(implements java.lang.annotation.Annotation)
        • \n" + + "
        ", + "

        Enum Hierarchy

        \n" + + "
          \n" + + "
        • java.lang.Object\n" + + "
            \n" + + "
          • java.lang.Enum<E> (implements java.lang." + + "Comparable<T>, java.io.Serializable)\n" + + "
              \n" + + "
            • pkg.Coin
            • \n" + + "
            \n" + + "
          • \n" + + "
          \n" + + "
        • \n" + + "
        "); + + checkOutput("pkg/package-tree.html", false, + "
      • class pkg.ParentClass
      • "); } } diff --git a/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java b/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java index 7daae9edef8..e21ca6b5653 100644 --- a/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java +++ b/langtools/test/com/sun/javadoc/testCmndLineClass/TestCmndLineClass.java @@ -28,47 +28,44 @@ * when specifying packages on the command line and specifying individual * classes. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestCmndLineClass * @run main TestCmndLineClass */ public class TestCmndLineClass extends JavadocTester { - private static final String OUTPUT_DIR1 = "4506980-tmp1"; - private static final String OUTPUT_DIR2 = "4506980-tmp2"; - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR1, "-sourcepath", SRC_DIR, - "-notimestamp", SRC_DIR + "/C5.java", "pkg1", "pkg2" - }; - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR2, "-sourcepath", SRC_DIR, - "-notimestamp", SRC_DIR + "/C5.java", - SRC_DIR + "/pkg1/C1.java", - SRC_DIR + "/pkg1/C2.java", - SRC_DIR + "/pkg2/C3.java", - SRC_DIR + "/pkg2/C4.java" - }; - private static final String[] FILES_TO_DIFF = { - "C5.html", - "pkg1/C1.html", - "pkg1/C2.html", - "pkg2/C3.html", - "pkg2/C4.html" - }; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestCmndLineClass tester = new TestCmndLineClass(); - tester.run(ARGS1, NO_TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, NO_TEST); - tester.runDiffs(OUTPUT_DIR1, OUTPUT_DIR2, FILES_TO_DIFF); + tester.runTests(); + } + + @Test + void test() { + String outdir1 = "out-1"; + String outdir2 = "out-2"; + + javadoc("-d", outdir1, + "-sourcepath", testSrc, + "-notimestamp", + testSrc("C5.java"), "pkg1", "pkg2"); + checkExit(Exit.OK); + + javadoc("-d", outdir2, + "-sourcepath", testSrc, + "-notimestamp", + testSrc("C5.java"), + testSrc("pkg1/C1.java"), + testSrc("pkg1/C2.java"), + testSrc("pkg2/C3.java"), + testSrc("pkg2/C4.java")); + checkExit(Exit.OK); + + diff(outdir1, outdir2, + "C5.html", + "pkg1/C1.html", + "pkg1/C2.html", + "pkg2/C3.html", + "pkg2/C4.html"); } } diff --git a/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java b/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java index 0c708048ca7..83434c0b64e 100644 --- a/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java +++ b/langtools/test/com/sun/javadoc/testCompletionFailure/TestCompletionFailure.java @@ -26,32 +26,28 @@ * @bug 8027977 * @summary Test to verify javadoc executes without CompletionFailure exception. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestCompletionFailure + * @library ../lib + * @build JavadocTester * @run main TestCompletionFailure */ public class TestCompletionFailure extends JavadocTester { - //Input for string search tests. - private static final String[][] NEGATED_TEST = { - {ERROR_OUTPUT, "TestCompletionFailure: error - " + - "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for " + - "sun.util.locale.provider.LocaleProviderAdapter not found" - } - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { + public static void main(String... args) throws Exception { TestCompletionFailure tester = new TestCompletionFailure(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput(Output.STDERR, false, + "TestCompletionFailure: error - " + + "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for " + + "sun.util.locale.provider.LocaleProviderAdapter not found"); } } diff --git a/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java b/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java index b85bf6dc3d8..b0e9bd1643b 100644 --- a/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java +++ b/langtools/test/com/sun/javadoc/testConstantValuesPage/TestConstantValuesPage.java @@ -27,28 +27,26 @@ * @summary Test to make sure that constant values page does not get * generated when doclet has nothing to document. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestConstantValuesPage * @run main TestConstantValuesPage */ public class TestConstantValuesPage extends JavadocTester { - private static final String[][] NEGATED_TEST = { - {NOTICE_OUTPUT, "constant-values.html..."} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "foo"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestConstantValuesPage tester = new TestConstantValuesPage(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "foo"); + checkExit(Exit.FAILED); + + checkOutput(Output.NOTICE, false, + "constant-values.html..."); } } diff --git a/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java b/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java index 40ab6a2ebbe..50efb7d8513 100644 --- a/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java +++ b/langtools/test/com/sun/javadoc/testConstructorIndent/TestConstructorIndent.java @@ -27,37 +27,31 @@ * @summary The constructor comments should be surrounded by *
        . Check for this in the output. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestConstructorIndent * @run main TestConstructorIndent */ public class TestConstructorIndent extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "C.html", "
        " + - "This is just a simple constructor.
        \n" + - "
        \n" + - "
        Parameters:
        \n" + - "
        i - a param.
        \n" + - "
        " - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestConstructorIndent tester = new TestConstructorIndent(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "
        " + + "This is just a simple constructor.
        \n" + + "
        \n" + + "
        Parameters:
        \n" + + "
        i - a param.
        \n" + + "
        "); } } diff --git a/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java b/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java index 6d1585ef66b..c98501eda98 100644 --- a/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java +++ b/langtools/test/com/sun/javadoc/testConstructors/TestConstructors.java @@ -26,106 +26,66 @@ * @bug 8025524 8031625 * @summary Test for constructor name which should be a non-qualified name. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestConstructors + * @library ../lib + * @build JavadocTester * @run main TestConstructors */ public class TestConstructors extends JavadocTester { - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/Outer.html", - "
        See Also:
        \n" + - "
        Inner(), \n" + - "Inner(int), \n" + - "NestedInner(), \n" + - "NestedInner(int), \n" + - "Outer(), \n" + - "Outer(int)" - }, - { "pkg1/Outer.html", - "Link: Inner(), " + - "Outer(int), " + - "" + - "NestedInner(int)" - }, - { "pkg1/Outer.html", - "Outer()" - }, - { "pkg1/Outer.html", - "" - }, - { "pkg1/Outer.html", - "Outer(int i)" - }, - { "pkg1/Outer.html", - "" - }, - { "pkg1/Outer.Inner.html", - "Inner()" - }, - { "pkg1/Outer.Inner.html", - "" - }, - { "pkg1/Outer.Inner.html", - "Inner(int i)" - }, - { "pkg1/Outer.Inner.html", - "" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "NestedInner()" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "NestedInner(int i)" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "" - } - }; - - private static final String[][] NEGATED_TEST = { - { "pkg1/Outer.Inner.html", - "Outer.Inner--" - }, - { "pkg1/Outer.Inner.html", - "Outer.Inner-int-" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "Outer.Inner.NestedInner--" - }, - { "pkg1/Outer.Inner.NestedInner.html", - "Outer.Inner.NestedInner-int-" - }, - { "pkg1/Outer.html", - "Outer.Inner()" - }, - { "pkg1/Outer.html", - "Outer.Inner(int)" - }, - { "pkg1/Outer.html", - "Outer.Inner.NestedInner()" - }, - { "pkg1/Outer.html", - "Outer.Inner.NestedInner(int)" - } - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { + public static void main(String... args) throws Exception { TestConstructors tester = new TestConstructors(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/Outer.html", true, + "
        See Also:
        \n" + + "
        Inner(), \n" + + "Inner(int), \n" + + "NestedInner(), \n" + + "NestedInner(int), \n" + + "Outer(), \n" + + "Outer(int)", + "Link: Inner(), " + + "Outer(int), " + + "" + + "NestedInner(int)", + "Outer()", + "", + "Outer(int i)", + ""); + + checkOutput("pkg1/Outer.Inner.html", true, + "Inner()", + "", + "Inner(int i)", + ""); + + checkOutput("pkg1/Outer.Inner.NestedInner.html", true, + "NestedInner()", + "", + "NestedInner(int i)", + ""); + + checkOutput("pkg1/Outer.Inner.html", false, + "Outer.Inner--", + "Outer.Inner-int-"); + + checkOutput("pkg1/Outer.Inner.NestedInner.html", false, + "Outer.Inner.NestedInner--", + "Outer.Inner.NestedInner-int-"); + + checkOutput("pkg1/Outer.html", false, + "Outer.Inner()", + "Outer.Inner(int)", + "Outer.Inner.NestedInner()", + "Outer.Inner.NestedInner(int)"); } } diff --git a/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java b/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java index b7fc0f2231c..0e69c20259b 100644 --- a/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java +++ b/langtools/test/com/sun/javadoc/testCustomTag/TestCustomTag.java @@ -26,69 +26,67 @@ * @bug 8006248 * @summary Test custom tag. Verify that an unknown tag generates appropriate warnings. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester taglets.CustomTag TestCustomTag + * @library ../lib + * @build JavadocTester taglets.CustomTag * @run main TestCustomTag */ public class TestCustomTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-tagletpath", SRC_DIR, - "-taglet", "taglets.CustomTag", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; - - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-tagletpath", - SRC_DIR, "-taglet", "taglets.CustomTag", - "-sourcepath", SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; - private static final String[] ARGS2 = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; - - private static final String[] ARGS3 = new String[] { - "-d", OUTPUT_DIR + "-3", "-sourcepath", - SRC_DIR, SRC_DIR + "/TagTestClass.java" - }; - - //Input for string search tests. - private static final String[][] TEST = new String[][] { - {WARNING_OUTPUT, "warning - @unknownTag is an unknown tag." - } - }; - - private static final String[][] TEST1 = new String[][] { - {ERROR_OUTPUT, "error: unknown tag: unknownTag" - } - }; - private static final String[][] TEST2 = new String[][] { - {WARNING_OUTPUT, "warning - @customTag is an unknown tag." - }, - {WARNING_OUTPUT, "warning - @unknownTag is an unknown tag." - } - }; - - private static final String[][] TEST3 = new String[][] { - {ERROR_OUTPUT, "error: unknown tag: customTag" - }, - {ERROR_OUTPUT, "error: unknown tag: unknownTag" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestCustomTag tester = new TestCustomTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.run(ARGS3, TEST3, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-Xdoclint:none", + "-d", "out-1", + "-tagletpath", testSrc, // TODO: probably useless + "-taglet", "taglets.CustomTag", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @unknownTag is an unknown tag."); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-tagletpath", testSrc, // TODO: probably useless + "-taglet", "taglets.CustomTag", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.FAILED); + + checkOutput(Output.ERROR, true, + "error: unknown tag: unknownTag"); + } + + @Test + void test3() { + javadoc("-Xdoclint:none", + "-d", "out-3", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @customTag is an unknown tag.", + "warning - @unknownTag is an unknown tag."); + } + + @Test + void test4() { + javadoc("-d", "out-4", + "-sourcepath", testSrc, + testSrc("TagTestClass.java")); + checkExit(Exit.FAILED); + + checkOutput(Output.ERROR, true, + "error: unknown tag: customTag", + "error: unknown tag: unknownTag"); } } diff --git a/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java b/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java index c31f7d215d8..fb1a1ab49f1 100644 --- a/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java +++ b/langtools/test/com/sun/javadoc/testDeprecatedDocs/TestDeprecatedDocs.java @@ -26,76 +26,65 @@ * @bug 4927552 8026567 * @summary * @author jamieh - * @library ../lib/ - * @build JavadocTester TestDeprecatedDocs + * @library ../lib + * @build JavadocTester * @run main TestDeprecatedDocs */ public class TestDeprecatedDocs extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String TARGET_FILE = - "deprecated-list.html"; - - private static final String TARGET_FILE2 = - "pkg/DeprecatedClassByAnnotation.html"; - - //Input for string search tests. - private static final String[][] TEST = { - {TARGET_FILE, "annotation_test1 passes"}, - {TARGET_FILE, "annotation_test2 passes"}, - {TARGET_FILE, "annotation_test3 passes"}, - {TARGET_FILE, "class_test1 passes"}, - {TARGET_FILE, "class_test2 passes"}, - {TARGET_FILE, "class_test3 passes"}, - {TARGET_FILE, "class_test4 passes"}, - {TARGET_FILE, "enum_test1 passes"}, - {TARGET_FILE, "enum_test2 passes"}, - {TARGET_FILE, "error_test1 passes"}, - {TARGET_FILE, "error_test2 passes"}, - {TARGET_FILE, "error_test3 passes"}, - {TARGET_FILE, "error_test4 passes"}, - {TARGET_FILE, "exception_test1 passes"}, - {TARGET_FILE, "exception_test2 passes"}, - {TARGET_FILE, "exception_test3 passes"}, - {TARGET_FILE, "exception_test4 passes"}, - {TARGET_FILE, "interface_test1 passes"}, - {TARGET_FILE, "interface_test2 passes"}, - {TARGET_FILE, "interface_test3 passes"}, - {TARGET_FILE, "interface_test4 passes"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation()"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.method()"}, - {TARGET_FILE, "pkg.DeprecatedClassByAnnotation.field"}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public class DeprecatedClassByAnnotation\n" +
        -                 "extends java.lang.Object
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public int field
        \n" + - "
        Deprecated. 
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public DeprecatedClassByAnnotation()
        \n" + - "
        Deprecated. 
        "}, - - {TARGET_FILE2, "
        @Deprecated\n" +
        -                 "public void method()
        \n" + - "
        Deprecated. 
        "}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDeprecatedDocs tester = new TestDeprecatedDocs(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("deprecated-list.html", true, + "annotation_test1 passes", + "annotation_test2 passes", + "annotation_test3 passes", + "class_test1 passes", + "class_test2 passes", + "class_test3 passes", + "class_test4 passes", + "enum_test1 passes", + "enum_test2 passes", + "error_test1 passes", + "error_test2 passes", + "error_test3 passes", + "error_test4 passes", + "exception_test1 passes", + "exception_test2 passes", + "exception_test3 passes", + "exception_test4 passes", + "interface_test1 passes", + "interface_test2 passes", + "interface_test3 passes", + "interface_test4 passes", + "pkg.DeprecatedClassByAnnotation", + "pkg.DeprecatedClassByAnnotation()", + "pkg.DeprecatedClassByAnnotation.method()", + "pkg.DeprecatedClassByAnnotation.field" + ); + + checkOutput("pkg/DeprecatedClassByAnnotation.html", true, + "
        @Deprecated\n"
        +                + "public class DeprecatedClassByAnnotation\n"
        +                + "extends java.lang.Object
        ", + "
        @Deprecated\n"
        +                + "public int field
        \n" + + "
        Deprecated. 
        ", + "
        @Deprecated\n"
        +                + "public DeprecatedClassByAnnotation()
        \n" + + "
        Deprecated. 
        ", + "
        @Deprecated\n"
        +                + "public void method()
        \n" + + "
        Deprecated. 
        "); } } diff --git a/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java b/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java index 273285b0abc..2a9eea8b8dc 100644 --- a/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java +++ b/langtools/test/com/sun/javadoc/testDocEncoding/TestDocEncoding.java @@ -31,36 +31,30 @@ * @summary Run tests on -docencoding to see if the value is used for stylesheet as well. * @author jayashree viswanathan - * @library ../lib/ - * @build JavadocTester TestDocEncoding + * @library ../lib + * @build JavadocTester * @run main TestDocEncoding */ public class TestDocEncoding extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - "-docencoding", "Cp930", - "-sourcepath", SRC_DIR, - "-notimestamp", - "pkg" - }; - - private static final String[][] NEGATED_TEST = { - { "stylesheet.css", - "body {\n" + - " background-color:#ffffff;"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocEncoding tester = new TestDocEncoding(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-docencoding", "Cp930", + "-sourcepath", testSrc, + "-notimestamp", + "pkg"); + checkExit(Exit.OK); + + checkOutput("stylesheet.css", false, + "body {\n" + + " background-color:#ffffff;"); } } diff --git a/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java b/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java index d6da8134420..6347ad2c619 100644 --- a/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java +++ b/langtools/test/com/sun/javadoc/testDocErrorReporter/TestDocErrorReporter.java @@ -27,31 +27,30 @@ * @summary Make sure that option validation errors and sent to the * DocErrorReporter. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocErrorReporter * @run main TestDocErrorReporter */ public class TestDocErrorReporter extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-encoding", "xyz", - SRC_DIR + "/TestDocErrorReporter.java" - }; - - //Input for Javadoc return code test. - private static final int EXPECTED_EXIT_CODE = 1; - /** * The entry point of the test. - * @param args the array of command line arguments. + * @param args the array of command line arguments + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocErrorReporter tester = new TestDocErrorReporter(); - int actualExitCode = tester.run(ARGS, NO_TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-encoding", "xyz", + testSrc("TestDocErrorReporter.java")); + + checkExit(Exit.FAILED); } } diff --git a/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java b/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java index c939e49dc46..cdf81c7b149 100644 --- a/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java +++ b/langtools/test/com/sun/javadoc/testDocFileDir/TestDocFileDir.java @@ -21,8 +21,6 @@ * questions. */ -import java.io.File; - /* * @test * @bug 4258405 4973606 8024096 @@ -31,68 +29,59 @@ import java.io.File; * directory. * Also test that -docfilessubdirs and -excludedocfilessubdir both work. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocFileDir * @run main TestDocFileDir */ public class TestDocFileDir extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg/doc-files/testfile.txt", - "This doc file did not get trashed."} - }; - - private static final String[] FILE_TEST2 = { - "pkg/doc-files/subdir-used1/testfile.txt", - "pkg/doc-files/subdir-used2/testfile.txt" - }; - private static final String[] FILE_NEGATED_TEST2 = { - "pkg/doc-files/subdir-excluded1/testfile.txt", - "pkg/doc-files/subdir-excluded2/testfile.txt" - }; - - private static final String[][] TEST0 = { - {"pkg/doc-files/testfile.txt", - "This doc file did not get trashed."} - }; - - //Output dir = Input Dir - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", - "-sourcepath", - "blah" + File.pathSeparator + OUTPUT_DIR + "-1" + - File.pathSeparator + "blah", "pkg"}; - - //Exercising -docfilessubdirs and -excludedocfilessubdir - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", - "-sourcepath", SRC_DIR, - "-docfilessubdirs", - "-excludedocfilessubdir", "subdir-excluded1:subdir-excluded2", - "pkg"}; - - //Output dir = "", Input dir = "" - private static final String[] ARGS0 = - new String[] {"pkg/C.java"}; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocFileDir tester = new TestDocFileDir(); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); - copyDir(SRC_DIR + "/pkg", "."); - tester.run(ARGS0, TEST0, NO_TEST); - copyDir(SRC_DIR + "/pkg", OUTPUT_DIR + "-1"); - tester.run(ARGS1, TEST1, NO_TEST); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NONE); - tester.run(ARGS2, NO_TEST, NO_TEST, FILE_TEST2, FILE_NEGATED_TEST2); - tester.printSummary(); + tester.runTests(); + } + + // Output dir = "", Input dir = "" + @Test + void test1() { + copyDir(testSrc("pkg"), "."); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("pkg/C.java"); + checkExit(Exit.OK); + checkOutput("pkg/doc-files/testfile.txt", true, + "This doc file did not get trashed."); + } + + // Output dir = Input Dir + @Test + void test2() { + String outdir = "out2"; + copyDir(testSrc("pkg"), outdir); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("-d", outdir, + "-sourcepath", "blah" + PS + outdir + PS + "blah", + "pkg"); + checkExit(Exit.OK); + checkOutput("pkg/doc-files/testfile.txt", true, + "This doc file did not get trashed."); + } + + // Exercising -docfilessubdirs and -excludedocfilessubdir + @Test + void test3() { + String outdir = "out3"; + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outdir, + "-sourcepath", testSrc, + "-docfilessubdirs", + "-excludedocfilessubdir", "subdir-excluded1:subdir-excluded2", + "pkg"); + checkExit(Exit.OK); + checkFiles(true, + "pkg/doc-files/subdir-used1/testfile.txt", + "pkg/doc-files/subdir-used2/testfile.txt"); + checkFiles(false, + "pkg/doc-files/subdir-excluded1/testfile.txt", + "pkg/doc-files/subdir-excluded2/testfile.txt"); } } diff --git a/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java b/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java index 7c17f1ae9d3..5d09ef9804e 100644 --- a/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java +++ b/langtools/test/com/sun/javadoc/testDocFiles/TestDocFiles.java @@ -25,28 +25,26 @@ * @test * @bug 8008949 * @summary verify that doc-files get copied - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocFiles * @run main TestDocFiles */ public class TestDocFiles extends JavadocTester { - private static final String[][] TEST = { - { "pkg/doc-files/test.txt", "test file"}}; - - private static final String[] ARGS = - new String[] { - "-d", "tmp", "-sourcepath", SRC_DIR, "pkg"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocFiles tester = new TestDocFiles(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/doc-files/test.txt", true, + "test file"); } } diff --git a/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java b/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java index 1b533334fc9..2adbe83343b 100644 --- a/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java +++ b/langtools/test/com/sun/javadoc/testDocRootInlineTag/TestDocRootInlineTag.java @@ -28,42 +28,38 @@ * If docRoot performs as documented, the test passes. * Make sure that the docRoot tag works with the -bottom option. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDocRootInlineTag * @run main TestDocRootInlineTag */ public class TestDocRootInlineTag extends JavadocTester { - private static final String[][] TEST = { - { "TestDocRootTag.html", - "File"}, - { "TestDocRootTag.html", - "glossary"}, - { "TestDocRootTag.html", - "Second File Link"}, - { "TestDocRootTag.html", "The value of @docRoot is \"./\""}, - { "index-all.html", "My package page is " + - "here"} - }; - private static final String[] ARGS = - new String[] { - "-bottom", "The value of @docRoot is \"{@docRoot}\"", - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", - SRC_DIR, SRC_DIR + "/TestDocRootTag.java", "pkg" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocRootInlineTag tester = new TestDocRootInlineTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + String uri = "http://www.java.sun.com/j2se/1.4/docs/api"; + + javadoc("-bottom", "The value of @docRoot is \"{@docRoot}\"", + "-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + testSrc("TestDocRootTag.java"), "pkg"); + checkExit(Exit.OK); + + checkOutput("TestDocRootTag.html", true, + "File", + "glossary", + "Second File Link", + "The value of @docRoot is \"./\""); + + checkOutput("index-all.html", true, + "My package page is here"); } } diff --git a/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java b/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java index 972254630ff..377cdce7dbf 100644 --- a/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java +++ b/langtools/test/com/sun/javadoc/testDocRootLink/TestDocRootLink.java @@ -26,109 +26,78 @@ * @bug 6553182 8025416 8029504 * @summary This test verifies the -Xdocrootparent option. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestDocRootLink + * @library ../lib + * @build JavadocTester * @run main TestDocRootLink */ public class TestDocRootLink extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - "Refer Here" - }, - { "pkg1/C1.html", - "This Here should not be replaced\n" + - " with an absolute link." - }, - { "pkg1/C1.html", - "Testing Link 1 and\n" + - " Link 2." - }, - { "pkg1/package-summary.html", - "\n" + - " Test document 1" - }, - { "pkg1/package-summary.html", - "\n" + - " Another Test document 1" - }, - { "pkg1/package-summary.html", - "\n" + - " Another Test document 2." - } - }; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", - "" - }, - { "pkg1/C1.html", - "" - }, - { "pkg1/package-summary.html", - "" - }, - { "pkg1/package-summary.html", - "" - } - }; - private static final String[][] TEST2 = { - { "pkg2/C2.html", - "Refer Here" - }, - { "pkg2/C2.html", - "This Here should not be replaced\n" + - " with an absolute link." - }, - { "pkg2/C2.html", - "Testing Link 1 and\n" + - " Link 2." - }, - { "pkg2/package-summary.html", - "\n" + - " Test document 1" - }, - { "pkg2/package-summary.html", - "\n" + - " Another Test document 1" - }, - { "pkg2/package-summary.html", - "\n" + - " Another Test document 2." - } - }; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - } - }; - private static final String[] ARGS1 = - new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2" - }; - private static final String[] ARGS2 = - new String[]{ - "-d", OUTPUT_DIR + "-1", "-Xdocrootparent", - "http://download.oracle.com/javase/7/docs", "-sourcepath", - SRC_DIR, "pkg1", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestDocRootLink tester = new TestDocRootLink(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + "Refer Here", + "This Here should not be replaced\n" + + " with an absolute link.", + "Testing Link 1 and\n" + + " Link 2."); + + checkOutput("pkg1/package-summary.html", true, + "\n" + + " Test document 1", + "\n" + + " Another Test document 1", + "\n" + + " Another Test document 2."); + + // TODO: should this check *any* reference to http://download.oracle.com/ + checkOutput("pkg1/C1.html", false, + "", + ""); + + checkOutput("pkg1/package-summary.html", false, + "", + ""); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-Xdocrootparent", "http://download.oracle.com/javase/7/docs", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg2/C2.html", true, + "Refer Here", + "This Here should not be replaced\n" + + " with an absolute link.", + "Testing Link 1 and\n" + + " Link 2."); + + checkOutput("pkg2/package-summary.html", true, + "\n" + + " Test document 1", + "\n" + + " Another Test document 1", + "\n" + + " Another Test document 2."); + + checkOutput("pkg2/C2.html", false, + "", + ""); + + checkOutput("pkg2/package-summary.html", false, + "", + ""); } } diff --git a/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java b/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java index 94981f92c45..2d7e355e7bf 100644 --- a/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java +++ b/langtools/test/com/sun/javadoc/testDupParamWarn/TestDupParamWarn.java @@ -27,28 +27,26 @@ * @summary Test to ensure that the doclet does not print out bad * warning messages about duplicate param tags. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestDupParamWarn * @run main TestDupParamWarn */ public class TestDupParamWarn extends JavadocTester { - private static final String[] ARGS = - new String[] {"-d", OUTPUT_DIR, "-sourcepath", - SRC_DIR + "/", "pkg"}; - private static final String[][] NEGATED_TEST = - new String[][] {{WARNING_OUTPUT, - "Parameter \"a\" is documented more than once."}}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { JavadocTester tester = new TestDupParamWarn(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, false, + "Parameter \"a\" is documented more than once."); } } diff --git a/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java b/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java index 96b019202aa..48593211815 100644 --- a/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java +++ b/langtools/test/com/sun/javadoc/testEmptyClass/TestEmptyClass.java @@ -27,39 +27,32 @@ * @summary Test to make sure that Javadoc behaves properly when * run on a completely empty class (no comments or members). * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEmptyClass * @run main TestEmptyClass */ public class TestEmptyClass extends JavadocTester { - private static final String[][] NEGATED_TEST = { + public static void main(String... args) throws Exception { + TestEmptyClass tester = new TestEmptyClass(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-classpath", testSrc("src"), + "-d", "out", + "-sourcepath", testSrc("src"), + testSrc("src/Empty.java")); + checkExit(Exit.OK); //The overview tree should not link to classes that were not documented - { "overview-tree.html", ""}, + checkOutput("overview-tree.html", false, + ""); //The index page should not link to classes that were not documented - { "index-all.html", ""}, - }; - private static final String[] ARGS = - new String[] { - "-classpath", SRC_DIR + "/src", - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR + "/src", - SRC_DIR + "/src/Empty.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestEmptyClass tester = new TestEmptyClass(); - int exitCode = tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); - if (exitCode != 0) { - throw new Error("Error found while executing Javadoc"); - } + checkOutput("index-all.html", false, + ""); } } diff --git a/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java b/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java index 86affecf6c6..9e7d9681796 100644 --- a/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java +++ b/langtools/test/com/sun/javadoc/testEnclosingClass/TestEnclosingClass.java @@ -26,31 +26,26 @@ * @bug 5008230 * @summary Check the outer class when documenting enclosing class/interface. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEnclosingClass * @run main TestEnclosingClass */ public class TestEnclosingClass extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/MyClass.MyInterface.html", "Enclosing class:"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestEnclosingClass tester = new TestEnclosingClass(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/MyClass.MyInterface.html", true, + "Enclosing class:"); } } diff --git a/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java b/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java index 5627f4718a4..83ab93b0e08 100644 --- a/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java +++ b/langtools/test/com/sun/javadoc/testEncoding/TestEncoding.java @@ -27,32 +27,28 @@ * @summary This test determines if the value of the -encoding option is * properly passed from Javadoc to the source file parser. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestEncoding * @run main TestEncoding */ public class TestEncoding extends JavadocTester { - - //If ??? is found in the output, the source file was not read with the correct encoding setting. - private static final String[][] NEGATED_TEST = { - { "EncodeTest.html", "??"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-encoding", "iso-8859-1", SRC_DIR + "/EncodeTest.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestEncoding tester = new TestEncoding(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-encoding", "iso-8859-1", + testSrc("EncodeTest.java")); + checkExit(Exit.OK); + + // If ??? is found in the output, the source file was not read with the correct encoding setting. + checkOutput("EncodeTest.html", false, + "??"); } } diff --git a/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java b/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java index 71e318c509a..0f2864891ad 100644 --- a/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java +++ b/langtools/test/com/sun/javadoc/testExternalOverridenMethod/TestExternalOverridenMethod.java @@ -28,41 +28,38 @@ * are documented properly. The method should still include "implements" or * "overrides" documentation even though the method is external. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester TestExternalOverridenMethod * @run main TestExternalOverridenMethod */ public class TestExternalOverridenMethod extends JavadocTester { - private static final String[][] TEST = { - { "pkg/XReader.html", - "
        Overrides:
        \n" + - "
        read in class " + - "FilterReader
        "}, - { "pkg/XReader.html", - "
        Specified by:
        \n" + - "
        readInt in interface " + - "DataInput
        "}}; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4.1/docs/api", SRC_DIR, - "pkg" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestExternalOverridenMethod tester = new TestExternalOverridenMethod(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + String uri = "http://java.sun.com/j2se/1.4.1/docs/api"; + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/XReader.html", true, + "
        Overrides:
        \n" + + "
        read in class " + + "FilterReader
        ", + "
        Specified by:
        \n" + + "
        readInt in interface " + + "DataInput
        " + ); } } diff --git a/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java b/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java index 8d7b090df39..bde5bbe4ba6 100644 --- a/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java +++ b/langtools/test/com/sun/javadoc/testGeneratedBy/TestGeneratedBy.java @@ -25,14 +25,41 @@ * @test * @bug 8000418 8024288 * @summary Verify that files use a common Generated By string - * @library ../lib/ - * @build JavadocTester TestGeneratedBy + * @library ../lib + * @build JavadocTester * @run main TestGeneratedBy */ public class TestGeneratedBy extends JavadocTester { - private static final String[] FILES = { + public static void main(String... args) throws Exception { + TestGeneratedBy tester = new TestGeneratedBy(); + tester.runTests(); + } + + @Test + void testTimestamp() { + javadoc("-d", "out-timestamp", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkTimestamps(true); + } + + @Test + void testNoTimestamp() { + javadoc("-d", "out-notimestamp", + "-notimestamp", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkTimestamps(false); + } + + void checkTimestamps(boolean timestamp) { + checkTimestamps(timestamp, "pkg/MyClass.html", "pkg/package-summary.html", "pkg/package-frame.html", @@ -45,63 +72,25 @@ public class TestGeneratedBy extends JavadocTester { "serialized-form.html", "help-doc.html", "index-all.html", - "index.html" - }; + "index.html"); - private static final String[] STD_ARGS = - new String[] { - "-d", OUTPUT_DIR, - "-sourcepath", SRC_DIR, - "pkg" - }; - - private static final String[] NO_TIMESTAMP_ARGS = - new String[] { - "-notimestamp", - "-d", OUTPUT_DIR + "-1", - "-sourcepath", SRC_DIR, - "pkg" - }; - - - private static String[][] getTests(boolean timestamp) { - String version = System.getProperty("java.version"); - String[][] tests = new String[FILES.length][]; - for (int i = 0; i < FILES.length; i++) { - String genBy = "Generated by javadoc"; - if (timestamp) genBy += " (" + version + ") on "; - tests[i] = new String[] { - FILES[i], genBy - }; - } - return tests; } - private static String[][] getNegatedTests(boolean timestamp) { - String[][] tests = new String[FILES.length][]; - for (int i = 0; i < FILES.length; i++) { - tests[i] = new String[] { - FILES[i], + void checkTimestamps(boolean timestamp, String... files) { + String version = System.getProperty("java.version"); + String genBy = "Generated by javadoc"; + if (timestamp) genBy += " (" + version + ") on "; + + for (String file: files) { + // genBy is the current standard "Generated by" text + checkOutput(file, true, genBy); + + // These are older versions of the "Generated by" text + checkOutput(file, false, (timestamp ? "Generated by javadoc (version" : "Generated by javadoc ("), - "Generated by javadoc on" - }; - } - return tests; - } - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestGeneratedBy tester = new TestGeneratedBy(); - int ec1 = tester.run(STD_ARGS, getTests(true), getNegatedTests(true)); - int ec2 = tester.run(NO_TIMESTAMP_ARGS, getTests(false), getNegatedTests(false)); - tester.printSummary(); - if (ec1 != 0 || ec2 != 0) { - throw new Error("Error found while executing Javadoc"); + "Generated by javadoc on"); } } } diff --git a/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java b/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java index b1cdc9b8334..6e2234ad984 100644 --- a/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java +++ b/langtools/test/com/sun/javadoc/testGroupOption/TestGroupOption.java @@ -27,49 +27,46 @@ * @summary Test to make sure the -group option does not cause a bad warning * to be printed. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestGroupOption * @run main TestGroupOption */ public class TestGroupOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-group", "Package One", "pkg1", - "-group", "Package Two", "pkg2", - "-group", "Package Three", "pkg3", - "pkg1", "pkg2", "pkg3" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - "-group", "Package One", "pkg1", - "-group", "Package One", "pkg2", - "-group", "Package One", "pkg3", - "pkg1", "pkg2", "pkg3" - }; - - //Input for string search tests. - private static final String[][] NEGATED_TEST1 = {{WARNING_OUTPUT, "-group"}}; - - private static final String[][] TEST2 = {{WARNING_OUTPUT, "-group"}}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - //Make sure the warning is not printed when -group is used correctly. + public static void main(String... args) throws Exception { TestGroupOption tester = new TestGroupOption(); - tester.run(ARGS1, NO_TEST, NEGATED_TEST1); - tester.printSummary(); + tester.runTests(); + } + @Test + void test1() { + //Make sure the warning is not printed when -group is used correctly. + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-group", "Package One", "pkg1", + "-group", "Package Two", "pkg2", + "-group", "Package Three", "pkg3", + "pkg1", "pkg2", "pkg3"); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, false, + "-group"); + } + + @Test + void test2() { //Make sure the warning is printed when -group is not used correctly. - tester = new TestGroupOption(); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-group", "Package One", "pkg1", + "-group", "Package One", "pkg2", + "-group", "Package One", "pkg3", + "pkg1", "pkg2", "pkg3"); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "-group"); + } } diff --git a/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java b/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java index f3789cf5feb..a98f151edb3 100644 --- a/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java +++ b/langtools/test/com/sun/javadoc/testHeadings/TestHeadings.java @@ -26,7 +26,7 @@ * @bug 4905786 6259611 * @summary Make sure that headings use the TH tag instead of the TD tag. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestHeadings * @run main TestHeadings @@ -34,87 +34,82 @@ public class TestHeadings extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "-header", "Test Files", - "pkg1", "pkg2" - }; - - //Input for string search tests. private static final String[][] TEST = { - //Package summary - { "pkg1/package-summary.html", - "" + - "Class\n" + - "Description" + + { + }, + { "serialized-form.html" + }, + { "serialized-form.html" }, - // Class documentation - { "pkg1/C1.html", - "Modifier and Type\n" + - "Field and Description" + { }, - { "pkg1/C1.html", - "

        Methods inherited from class java.lang.Object

        " + { "overview-frame.html" }, - - // Class use documentation - { "pkg1/class-use/C1.html", - "Package\n" + - "Description" - }, - { "pkg1/class-use/C1.html", - "Modifier and Type\n" + - "Field and Description" - }, - - // Deprecated - { "deprecated-list.html", - "Method and Description" - }, - - // Constant values - { "constant-values.html", - "" + - "Modifier and Type\n" + - "Constant Field\n" + - "Value" - }, - - // Serialized Form - { "serialized-form.html", - "

        Package pkg1

        " - }, - { "serialized-form.html", - "

        Class " + - "pkg1.C1 extends java.lang.Object implements Serializable

        " - }, - { "serialized-form.html", - "

        Serialized Fields

        " - }, - - // Overview Frame - { "overview-frame.html", - "

        Test Files

        " - }, - { "overview-frame.html", - "Overview List" - }, - - // Overview Summary - { "overview-summary.html", - "Overview" + { } }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHeadings tester = new TestHeadings(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "-header", "Test Files", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + //Package summary + checkOutput("pkg1/package-summary.html", true, + "" + + "Class\n" + + "Description"); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "Modifier and Type\n" + + "Field and Description", + "

        Methods inherited from class java.lang.Object

        "); + + // Class use documentation + checkOutput("pkg1/class-use/C1.html", true, + "Package\n" + + "Description", + "Modifier and Type\n" + + "Field and Description"); + + // Deprecated + checkOutput("deprecated-list.html", true, + "Method and Description"); + + // Constant values + checkOutput("constant-values.html", true, + "" + + "Modifier and Type\n" + + "Constant Field\n" + + "Value"); + + // Serialized Form + checkOutput("serialized-form.html", true, + "

        Package pkg1

        ", + "

        Class " + + "pkg1.C1 extends java.lang.Object implements Serializable

        ", + "

        Serialized Fields

        "); + + // Overview Frame + checkOutput("overview-frame.html", true, + "

        Test Files

        ", + "Overview List"); + + // Overview Summary + checkOutput("overview-summary.html", true, + "Overview"); } } diff --git a/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java b/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java index ca628432e33..eaf14913b77 100644 --- a/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java +++ b/langtools/test/com/sun/javadoc/testHelpFile/TestHelpFile.java @@ -26,32 +26,26 @@ * @bug 7132631 * @summary Make sure that the help file is generated correctly. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHelpFile + * @library ../lib + * @build JavadocTester * @run main TestHelpFile */ public class TestHelpFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestHelpFile.java" - }; - - private static final String[][] TEST = { - { "help-doc.html", - "Constant Field Values" - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHelpFile tester = new TestHelpFile(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("TestHelpFile.java")); + checkExit(Exit.OK); + + checkOutput("help-doc.html", true, + "Constant Field Values"); } } diff --git a/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java b/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java index 44d6d322a07..9c571d63a8e 100644 --- a/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java +++ b/langtools/test/com/sun/javadoc/testHelpOption/TestHelpOption.java @@ -27,81 +27,79 @@ * @summary Make sure that the -help option works properly. Make sure * the help link appears in the documentation. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester TestHelpOption * @run main TestHelpOption */ public class TestHelpOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-help", - SRC_DIR + "/TestHelpOption.java" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestHelpOption.java" - }; - - private static final String[][] TEST = { - {STANDARD_OUTPUT, "-d "}, - {STANDARD_OUTPUT, "-use "}, - {STANDARD_OUTPUT, "-version "}, - {STANDARD_OUTPUT, "-author "}, - {STANDARD_OUTPUT, "-docfilessubdirs "}, - {STANDARD_OUTPUT, "-splitindex "}, - {STANDARD_OUTPUT, "-windowtitle "}, - {STANDARD_OUTPUT, "-doctitle "}, - {STANDARD_OUTPUT, "-header "}, - {STANDARD_OUTPUT, "-footer "}, - {STANDARD_OUTPUT, "-bottom "}, - {STANDARD_OUTPUT, "-link "}, - {STANDARD_OUTPUT, "-linkoffline "}, - {STANDARD_OUTPUT, "-excludedocfilessubdir "}, - {STANDARD_OUTPUT, "-group "}, - {STANDARD_OUTPUT, "-nocomment "}, - {STANDARD_OUTPUT, "-nodeprecated "}, - {STANDARD_OUTPUT, "-noqualifier "}, - {STANDARD_OUTPUT, "-nosince "}, - {STANDARD_OUTPUT, "-notimestamp "}, - {STANDARD_OUTPUT, "-nodeprecatedlist "}, - {STANDARD_OUTPUT, "-notree "}, - {STANDARD_OUTPUT, "-noindex "}, - {STANDARD_OUTPUT, "-nohelp "}, - {STANDARD_OUTPUT, "-nonavbar "}, - {STANDARD_OUTPUT, "-serialwarn "}, - {STANDARD_OUTPUT, "-tag "}, - {STANDARD_OUTPUT, "-taglet "}, - {STANDARD_OUTPUT, "-tagletpath "}, - {STANDARD_OUTPUT, "-charset "}, - {STANDARD_OUTPUT, "-helpfile "}, - {STANDARD_OUTPUT, "-linksource "}, - {STANDARD_OUTPUT, "-sourcetab "}, - {STANDARD_OUTPUT, "-keywords "}, - {STANDARD_OUTPUT, "-stylesheetfile "}, - {STANDARD_OUTPUT, "-docencoding "}, - }; - - private static final String[][] TEST2 = { - { "TestHelpOption.html", - "
      • Help
      • " - }, - }; - - //The help option should not crash the doclet. - private static final int EXPECTED_EXIT_CODE = 0; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHelpOption tester = new TestHelpOption(); - int actualExitCode = tester.run(ARGS, TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testWithOption() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-help", + testSrc("TestHelpOption.java")); + checkExit(Exit.OK); + + checkOutput(true); + } + + @Test + void testWithoutOption() { + javadoc("-d", "out2", + "-sourcepath", testSrc, + testSrc("TestHelpOption.java")); + checkExit(Exit.OK); + + checkOutput(false); + } + + private void checkOutput(boolean withOption) { + checkOutput(Output.STDOUT, withOption, + "-d ", + "-use ", + "-version ", + "-author ", + "-docfilessubdirs ", + "-splitindex ", + "-windowtitle ", + "-doctitle ", + "-header ", + "-footer ", + "-bottom ", + "-link ", + "-linkoffline ", + "-excludedocfilessubdir ", + "-group ", + "-nocomment ", + "-nodeprecated ", + "-noqualifier ", + "-nosince ", + "-notimestamp ", + "-nodeprecatedlist ", + "-notree ", + "-noindex ", + "-nohelp ", + "-nonavbar ", + "-serialwarn ", + "-tag ", + "-taglet ", + "-tagletpath ", + "-charset ", + "-helpfile ", + "-linksource ", + "-sourcetab ", + "-keywords ", + "-stylesheetfile ", + "-docencoding "); + + checkOutput("TestHelpOption.html", !withOption, + "
      • Help
      • "); } } diff --git a/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java b/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java index 8d59523c6ee..6cbe9c846b1 100644 --- a/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java +++ b/langtools/test/com/sun/javadoc/testHiddenMembers/TestHiddenMembers.java @@ -27,34 +27,37 @@ * @summary Test to make sure that hidden overriden members are not * documented as inherited. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHiddenMembers * @run main TestHiddenMembers */ public class TestHiddenMembers extends JavadocTester { - - //We should not inherit any members from BaseClass because they are all overriden and hidden - //(declared as private). private static final String[][] NEGATED_TEST = { - { "pkg/SubClass.html", - "inherited from class pkg.BaseClass"} + { } }; private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "pkg" + }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHiddenMembers tester = new TestHiddenMembers(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + // We should not inherit any members from BaseClass because they are all overriden and hidden + // (declared as private). + // TODO: check normal case of generated tags: upper case of lower case + checkOutput("pkg/SubClass.html", false, + "inherited from class pkg.BaseClass"); } } diff --git a/langtools/test/com/sun/javadoc/testHref/TestHref.java b/langtools/test/com/sun/javadoc/testHref/TestHref.java index 09ad34e0233..f5311674695 100644 --- a/langtools/test/com/sun/javadoc/testHref/TestHref.java +++ b/langtools/test/com/sun/javadoc/testHref/TestHref.java @@ -26,73 +26,57 @@ * @bug 4663254 8016328 8025633 8026567 * @summary Verify that spaces do not appear in hrefs and anchors. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestHref + * @library ../lib + * @build JavadocTester * @run main TestHref */ public class TestHref extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-linkoffline", - "http://java.sun.com/j2se/1.4/docs/api/", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - //External link. - { "pkg/C1.html", - "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait-long-int-\"" - }, - //Member summary table link. - { "pkg/C1.html", - "href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\"" - }, - //Anchor test. - { "pkg/C1.html", - "\n" + - "\n" + - "" - }, - //Backward compatibility anchor test. - { "pkg/C1.html", - "\n" + - "\n" + - "" - }, - //{@link} test. - { "pkg/C2.html", - "Link: " - }, - //@see test. - { "pkg/C2.html", - "See Also:\n" + - "
        " - }, - - //Header does not link to the page itself. - { "pkg/C4.html", - "Class C4<E extends C4<E>>" - }, - - //Signature does not link to the page itself. - { "pkg/C4.html", - "public abstract class C4<E extends C4<E>>" - }, - }; - private static final String[][] NEGATED_TEST = - { - {WARNING_OUTPUT, " tag is malformed"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHref tester = new TestHref(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/C1.html", true, + //External link. + "href=\"http://java.sun.com/j2se/1.4/docs/api/java/lang/Object.html?is-external=true#wait-long-int-\"", + //Member summary table link. + "href=\"../pkg/C1.html#method-int-int-java.util.ArrayList-\"", + //Anchor test. + "\n" + + "\n" + + "", + //Backward compatibility anchor test."pkg/C1.html", + "\n" + + "\n" + + ""); + + checkOutput("pkg/C2.html", true, + //{@link} test. + "Link: ", + //@see test. + "See Also:\n" + + "
        " + ); + + checkOutput("pkg/C4.html", true, + //Header does not link to the page itself. + "Class C4<E extends C4<E>>", + //Signature does not link to the page itself. + "public abstract class C4<E extends C4<E>>" + ); + + checkOutput(Output.WARNING, false, + " tag is malformed"); } } diff --git a/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java b/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java index b37f0829127..427e471b933 100644 --- a/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java +++ b/langtools/test/com/sun/javadoc/testHrefInDocComment/TestHrefInDocComment.java @@ -27,26 +27,22 @@ * @summary Determine if Hrefs are processed properly when they * appear in doc comments. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHrefInDocComment * @run main TestHrefInDocComment */ public class TestHrefInDocComment extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHrefInDocComment tester = new TestHrefInDocComment(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc failed to execute properly with given source."); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java b/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java index d23f599c02f..3b8379a89fe 100644 --- a/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java +++ b/langtools/test/com/sun/javadoc/testHtmlComments/TestHtmlComments.java @@ -27,32 +27,26 @@ * @summary The field detail comment should not show up in the output if there * are no fields to document. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlComments * @run main TestHtmlComments */ public class TestHtmlComments extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; - - //Input for string search tests. - private static final String[][] NEGATED_TEST = { - { "C.html", - ""} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHtmlComments tester = new TestHtmlComments(); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void run() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", false, + ""); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java index 7b3e4f685ca..3ed9594cff4 100644 --- a/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java +++ b/langtools/test/com/sun/javadoc/testHtmlDefinitionListTag/TestHtmlDefinitionListTag.java @@ -28,159 +28,250 @@ * @bug 6786690 6820360 8025633 8026567 * @summary This test verifies the nesting of definition list tags. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHtmlDefinitionListTag + * @library ../lib + * @build JavadocTester * @run main TestHtmlDefinitionListTag */ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class TestHtmlDefinitionListTag extends JavadocTester { - // Test common to all runs of javadoc. The class signature should print - // properly enclosed definition list tags and the Annotation Type - // Optional Element should print properly nested definition list tags - // for default value. - private static final String[][] TEST_ALL = { - { "pkg1/C1.html", + public static void main(String... args) throws Exception { + TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag(); + tester.runTests(); + } + + @Test + void test_Comment_Deprecated() { +// tester.run(ARGS1, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); +// tester.runTestsOnHTML(TEST_CMNT_DEPR, NO_TEST); + javadoc("-Xdoclint:none", + "-d", "out-1", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(true); + checkCommentDeprecated(true); + } + + @Test + void test_NoComment_Deprecated() { +// tester.run(ARGS2, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); +// tester.runTestsOnHTML(NO_TEST, TEST_CMNT_DEPR); + javadoc("-Xdoclint:none", + "-d", "out-2", + "-nocomment", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(true); + checkCommentDeprecated(false); // ?? + } + + @Test + void test_Comment_NoDeprecated() { +// tester.run(ARGS3, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(TEST_NODEPR, TEST_NOCMNT_NODEPR); + javadoc("-Xdoclint:none", + "-d", "out-3", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(false); + checkNoDeprecated(); + checkNoCommentNoDeprecated(false); + } + + @Test + void testNoCommentNoDeprecated() { +// tester.run(ARGS4, TEST_ALL, NEGATED_TEST_NO_C5); +// tester.runTestsOnHTML(TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR); + javadoc("-Xdoclint:none", + "-d", "out-4", + "-nocomment", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + checkCommon(false); + checkNoCommentNoDeprecated(true); + checkCommentDeprecated(false); + } + + void checkCommon(boolean checkC5) { + // Test common to all runs of javadoc. The class signature should print + // properly enclosed definition list tags and the Annotation Type + // Optional Element should print properly nested definition list tags + // for default value. + checkOutput("pkg1/C1.html", true, "
        public class C1\n" +
                         "extends java.lang.Object\n" +
        -                "implements java.io.Serializable
        "}, - { "pkg1/C4.html", + "implements java.io.Serializable"); + checkOutput("pkg1/C4.html", true, "
        \n" + "
        Default:
        \n" + "
        true
        \n" + - "
        "}}; + ""); - // Test for normal run of javadoc in which various ClassDocs and - // serialized form should have properly nested definition list tags - // enclosing comments, tags and deprecated information. - private static final String[][] TEST_CMNT_DEPR = { - { "pkg1/package-summary.html", - "
        \n" + - "
        Since:
        \n" + - "
        JDK1.0
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Since:
        \n" + - "
        JDK1.0
        \n" + - "
        See Also:
        \n" + - "
        " + - "C2, \n" + - "" + - "Serialized Form
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:
        \n" + - "
        title - the title
        \n" + - "
        test - boolean value" + - "
        \n" + - "
        Throws:
        \n" + - "
        java.lang.IllegalArgumentException - if the " + - "owner's\n" + - " GraphicsConfiguration is not from a screen " + - "device
        \n" + - "
        HeadlessException
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:
        \n" + - "
        undecorated" + - " - true if no decorations are\n" + - " to be enabled;\n" + - " false " + - "if decorations are to be enabled.
        \n" + - "
        Since:" + - "
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "readObject()" + - "
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Throws:
        \n" + - "
        java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "pkg1/C2.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        set - boolean
        \n" + - "
        " + - "Since:
        \n" + - "
        1.4
        \n" + - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        This field indicates whether the C1 is " + - "undecorated.
        \n" + - " \n" + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        Reads the object stream.
        \n" + - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "IOException
        \n" + - "
        java.io.IOException
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
        The name for this class.
        "}}; + // Test for valid HTML generation which should not comprise of empty + // definition list tags. + List files= new ArrayList<>(Arrays.asList( + "pkg1/package-summary.html", + "pkg1/C1.html", + "pkg1/C1.ModalExclusionType.html", + "pkg1/C2.html", + "pkg1/C2.ModalType.html", + "pkg1/C3.html", + "pkg1/C4.html", + "overview-tree.html", + "serialized-form.html" + )); - // Test with -nodeprecated option. The ClassDocs should have properly nested - // definition list tags enclosing comments and tags. The ClassDocs should not - // display definition list for deprecated information. The serialized form - // should display properly nested definition list tags for comments, tags - // and deprecated information. - private static final String[][] TEST_NODEPR = { - { "pkg1/package-summary.html", + if (checkC5) + files.add("pkg1/C5.html"); + + for (String f: files) { + checkOutput(f, false, + "
        ", + "
        \n
        "); + } + } + + void checkCommentDeprecated(boolean expectFound) { + // Test for normal run of javadoc in which various ClassDocs and + // serialized form should have properly nested definition list tags + // enclosing comments, tags and deprecated information. + checkOutput("pkg1/package-summary.html", expectFound, "
        \n" + "
        Since:
        \n" + "
        JDK1.0
        \n" + - "
        "}, - { "pkg1/C1.html", + ""); + + checkOutput("pkg1/C1.html", expectFound, + "
        \n" + + "
        Since:
        \n" + + "
        JDK1.0
        \n" + + "
        See Also:
        \n" + + "
        " + + "C2, \n" + + "" + + "Serialized Form
        \n" + + "
        ", + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        ", + "
        \n" + + "
        Parameters:
        \n" + + "
        title - the title
        \n" + + "
        test - boolean value" + + "
        \n" + + "
        Throws:
        \n" + + "
        java.lang.IllegalArgumentException - if the " + + "owner's\n" + + " GraphicsConfiguration is not from a screen " + + "device
        \n" + + "
        HeadlessException
        \n" + + "
        ", + "
        \n" + + "
        Parameters:
        \n" + + "
        undecorated" + + " - true if no decorations are\n" + + " to be enabled;\n" + + " false " + + "if decorations are to be enabled.
        \n" + + "
        Since:" + + "
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "readObject()" + + "
        \n" + + "
        ", + "
        \n" + + "
        Throws:
        \n" + + "
        java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        "); + + checkOutput("pkg1/C2.html", expectFound, + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        set - boolean
        \n" + + "
        " + + "Since:
        \n" + + "
        1.4
        \n" + + "
        "); + + checkOutput("serialized-form.html", expectFound, + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        This field indicates whether the C1 is " + + "undecorated.
        \n" + + " \n" + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        Reads the object stream.
        \n" + + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "IOException
        \n" + + "
        java.io.IOException
        \n" + + "
        ", + "Deprecated." + + " \n" + + "
        The name for this class.
        "); + } + + void checkNoDeprecated() { + // Test with -nodeprecated option. The ClassDocs should have properly nested + // definition list tags enclosing comments and tags. The ClassDocs should not + // display definition list for deprecated information. The serialized form + // should display properly nested definition list tags for comments, tags + // and deprecated information. + checkOutput("pkg1/package-summary.html", true, + "
        \n" + + "
        Since:
        \n" + + "
        JDK1.0
        \n" + + "
        "); + + checkOutput("pkg1/C1.html", true, "
        \n" + "
        Since:" + "
        \n" + @@ -191,216 +282,124 @@ public class TestHtmlDefinitionListTag extends JavadocTester { "C2, \n" + "" + "Serialized Form
        \n" + - ""}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        title - the title
        \n" + - "
        " + - "test - boolean value
        \n" + - "
        Throws:" + - "
        \n" + - "
        java.lang.IllegalArgumentException" + - " - if the owner's\n" + - " GraphicsConfiguration" + - " is not from a screen device
        \n" + - "
        " + - "HeadlessException
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Parameters:" + - "
        \n" + - "
        undecorated - true" + - " if no decorations are\n" + - " to be enabled;\n" + - " false if decorations are to be enabled." + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:
        \n" + - "
        " + - "readObject()
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        java.io.IOException
        \n" + - "
        " + - "See Also:
        \n" + - "
        " + - "setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "java.io.IOException
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        This field indicates whether the C1 is " + - "undecorated.
        \n" + - " \n" + - "
        \n" + - "
        Since:
        \n" + - "
        1.4
        \n" + - "
        See Also:" + - "
        \n" + - "
        " + - "C1.setUndecorated(boolean)
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - "
        Reads the object stream.
        \n" + - "
        \n" + - "
        Throws:" + - "
        \n" + - "
        " + - "IOException
        \n" + - "
        java.io.IOException
        \n" + - "
        "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
        " + - "The name for this class.
        "}}; + ""); - // Test with -nocomment and -nodeprecated options. The ClassDocs whould - // not display definition lists for any member details. - private static final String[][] TEST_NOCMNT_NODEPR = { - { "pkg1/C1.html", + checkOutput("pkg1/C1.html", true, + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        title - the title
        \n" + + "
        " + + "test - boolean value
        \n" + + "
        Throws:" + + "
        \n" + + "
        java.lang.IllegalArgumentException" + + " - if the owner's\n" + + " GraphicsConfiguration" + + " is not from a screen device
        \n" + + "
        " + + "HeadlessException
        \n" + + "
        ", + "
        \n" + + "
        Parameters:" + + "
        \n" + + "
        undecorated - true" + + " if no decorations are\n" + + " to be enabled;\n" + + " false if decorations are to be enabled." + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:
        \n" + + "
        " + + "readObject()
        \n" + + "
        ", + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        java.io.IOException
        \n" + + "
        " + + "See Also:
        \n" + + "
        " + + "setUndecorated(boolean)
        \n" + + "
        "); + + checkOutput("serialized-form.html", true, + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "java.io.IOException
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        This field indicates whether the C1 is " + + "undecorated.
        \n" + + " \n" + + "
        \n" + + "
        Since:
        \n" + + "
        1.4
        \n" + + "
        See Also:" + + "
        \n" + + "
        " + + "C1.setUndecorated(boolean)
        \n" + + "
        ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
        Reads the object stream.
        \n" + + "
        \n" + + "
        Throws:" + + "
        \n" + + "
        " + + "IOException
        \n" + + "
        java.io.IOException
        \n" + + "
        ", + "Deprecated." + + " \n" + + "
        " + + "The name for this class.
        "); + } + + void checkNoCommentNoDeprecated(boolean expectFound) { + // Test with -nocomment and -nodeprecated options. The ClassDocs whould + // not display definition lists for any member details. + checkOutput("pkg1/C1.html", expectFound, "
        public void readObject()\n" +
                         "                throws java.io.IOException
        \n" + - ""}, - { "pkg1/C2.html", "
        public C2()
        \n" + - ""}, - { "pkg1/C1.ModalExclusionType.html", "
        public " +
        +                "");
        +
        +        checkOutput("pkg1/C2.html", expectFound,
        +                "
        public C2()
        \n" + + ""); + + checkOutput("pkg1/C1.ModalExclusionType.html", expectFound, + "
        public " +
                         "static final C1.ModalExclusionType " +
                         "APPLICATION_EXCLUDE
        \n" + - ""}, - { "serialized-form.html", "
        boolean " +
        +                "");
        +
        +        checkOutput("serialized-form.html", expectFound,
        +                "
        boolean " +
                         "undecorated
        \n" + "
        " + "Deprecated. As of JDK version 1.5, replaced by\n" + " " + "setUndecorated(boolean).
        \n" + - ""}, - { "serialized-form.html", "" + + "", + "" + "Deprecated. As of JDK version" + " 1.5, replaced by\n" + " " + "setUndecorated(boolean).\n" + - ""}}; - - // Test for valid HTML generation which should not comprise of empty - // definition list tags. - private static final String[][] NEGATED_TEST_NO_C5 = { - { "pkg1/package-summary.html", - "
        "}, - { "pkg1/package-summary.html", - "
        \n" + - "
        "}, - { "pkg1/C1.html", - "
        "}, - { "pkg1/C1.html", - "
        \n" + - "
        "}, - { "pkg1/C1.ModalExclusionType.html", - "
        "}, - { "pkg1/C1.ModalExclusionType.html", - "
        \n" + - "
        "}, - { "pkg1/C2.html", - "
        "}, - { "pkg1/C2.html", - "
        \n" + - "
        "}, - { "pkg1/C2.ModalType.html", - "
        "}, - { "pkg1/C2.ModalType.html", - "
        \n" + - "
        "}, - { "pkg1/C3.html", - "
        "}, - { "pkg1/C3.html", - "
        \n" + - "
        "}, - { "pkg1/C4.html", - "
        "}, - { "pkg1/C4.html", - "
        \n" + - "
        "}, - { "overview-tree.html", - "
        "}, - { "overview-tree.html", - "
        \n" + - "
        "}, - { "serialized-form.html", - "
        "}, - { "serialized-form.html", - "
        \n" + - "
        "}}; - private static final String[][] NEGATED_TEST_C5 = { - { "pkg1/C5.html", - "
        "}, - { "pkg1/C5.html", - "
        \n" + - "
        "}}; - - private static final String[] ARGS1 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS2 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-nocomment", "-sourcepath", - SRC_DIR, "pkg1"}; - - private static final String[] ARGS3 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-3", "-nodeprecated", "-sourcepath", - SRC_DIR, "pkg1"}; - - private static final String[] ARGS4 = - new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-4", "-nocomment", "-nodeprecated", - "-sourcepath", SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestHtmlDefinitionListTag tester = new TestHtmlDefinitionListTag(); - tester.run(ARGS1, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); - tester.runTestsOnHTML(TEST_CMNT_DEPR, NO_TEST); - - tester.run(ARGS2, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(NO_TEST, NEGATED_TEST_C5); - tester.runTestsOnHTML(NO_TEST, TEST_CMNT_DEPR); - - tester.run(ARGS3, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(TEST_NODEPR, TEST_NOCMNT_NODEPR); - - tester.run(ARGS4, TEST_ALL, NEGATED_TEST_NO_C5); - tester.runTestsOnHTML(TEST_NOCMNT_NODEPR, TEST_CMNT_DEPR); - - tester.printSummary(); + ""); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java b/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java index b2b2d5679c4..32da20dfded 100644 --- a/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java +++ b/langtools/test/com/sun/javadoc/testHtmlDocument/TestHtmlDocument.java @@ -27,33 +27,38 @@ * @test * @bug 6851834 * @summary This test verifies the HTML document generation for javadoc output. + * @library ../lib + * @build JavadocTester * @author Bhavesh Patel - * @build TestHtmlDocument * @run main TestHtmlDocument */ -import java.io.*; import com.sun.tools.doclets.formats.html.markup.*; /** * The class reads each file, complete with newlines, into a string to easily * compare the existing markup with the generated markup. */ -public class TestHtmlDocument { - - protected static final String NL = System.getProperty("line.separator"); - - private static final String BUGID = "6851834"; - private static final String BUGNAME = "TestHtmlDocument"; - private static String srcdir = System.getProperty("test.src", "."); +public class TestHtmlDocument extends JavadocTester { // Entry point - public static void main(String[] args) throws IOException { + public static void main(String... args) throws Exception { + TestHtmlDocument tester = new TestHtmlDocument(); + tester.runTests(); + } + + @Test + void test() { + checking("markup"); // Check whether the generated markup is same as the existing markup. - if (generateHtmlTree().equals(readFileToString(srcdir + "/testMarkup.html"))) { - System.out.println("\nTest passed for bug " + BUGID + " (" + BUGNAME + ")\n"); + String expected = readFile(testSrc, "testMarkup.html").replace("\n", NL); + String actual = generateHtmlTree(); + if (actual.equals(expected)) { + passed(""); } else { - throw new Error("\nTest failed for bug " + BUGID + " (" + BUGNAME + ")\n"); + failed("expected content in " + testSrc("testMarkup.html") + "\n" + + "Actual output:\n" + + actual); } } @@ -136,25 +141,4 @@ public class TestHtmlDocument { HtmlDocument htmlDoc = new HtmlDocument(htmlDocType, html); return htmlDoc.toString(); } - - // Read the file into a String - public static String readFileToString(String filename) throws IOException { - File file = new File(filename); - if ( !file.exists() ) { - System.out.println("\nFILE DOES NOT EXIST: " + filename); - } - BufferedReader in = new BufferedReader(new FileReader(file)); - StringBuilder fileString = new StringBuilder(); - // Create an array of characters the size of the file - try { - String line; - while ((line = in.readLine()) != null) { - fileString.append(line); - fileString.append(NL); - } - } finally { - in.close(); - } - return fileString.toString(); - } } diff --git a/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java b/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java index a29bf387fc3..cba3d5961bc 100644 --- a/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java +++ b/langtools/test/com/sun/javadoc/testHtmlStrongTag/TestHtmlStrongTag.java @@ -26,44 +26,49 @@ /* * @test * @bug 6786028 8026567 - * @summary This test verifys the use of HTML tag instead of by Javadoc std doclet. + * @summary This test verifies the use of HTML tag instead of by Javadoc std doclet. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlStrongTag * @run main TestHtmlStrongTag */ public class TestHtmlStrongTag extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - "See Also:"}}; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", "Method Summary"}, - { "pkg1/C1.html", ""}, - { "pkg1/package-summary.html", - "Class Summary"}}; - private static final String[][] TEST2 = { - { "pkg2/C2.html", "Comments:"}}; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", "Method Summary"}}; - - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "pkg2"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHtmlStrongTag tester = new TestHtmlStrongTag(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + "See Also:"); + + checkOutput("pkg1/C1.html", false, + "Method Summary", + ""); + + checkOutput("pkg1/package-summary.html", false, + "Class Summary"); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg2/C2.html", true, + "Comments:"); + + checkOutput("pkg2/C2.html", false, + "Method Summary"); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java b/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java index b211b7c71e8..9f719a9d278 100644 --- a/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java +++ b/langtools/test/com/sun/javadoc/testHtmlTableStyles/TestHtmlTableStyles.java @@ -26,69 +26,59 @@ * @bug 8008164 * @summary Test styles on HTML tables generated by javadoc. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestHtmlTableStyles + * @library ../lib + * @build JavadocTester * @run main TestHtmlTableStyles */ public class TestHtmlTableStyles extends JavadocTester { - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/TestTable.html", - "" - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/TestTable.html", - "
        " - }, - { "pkg1/package-summary.html", - "
        " - }, - { "pkg1/class-use/TestTable.html", - "
        " - }, - { "overview-summary.html", - "
        " - }, - { "deprecated-list.html", + public static void main(String... args) throws Exception { + TestHtmlTableStyles tester = new TestHtmlTableStyles(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/TestTable.html", true, + "
        ", + "
        ", + "
        ", + "
        "); + + checkOutput("pkg1/package-summary.html", true, + "
        "); + + checkOutput("pkg1/class-use/TestTable.html", true, + "
        "); + + checkOutput("overview-summary.html", true, + "
        "); + + checkOutput("deprecated-list.html", true, "
        " - }, - { "constant-values.html", + "deprecated methods, and an explanation\">"); + + checkOutput("constant-values.html", true, "
        " - }, - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - TestHtmlTableStyles tester = new TestHtmlTableStyles(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "constant fields, and values\">"); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java b/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java index 16c55b00f60..13c9214e4d4 100644 --- a/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java +++ b/langtools/test/com/sun/javadoc/testHtmlTableTags/TestHtmlTableTags.java @@ -26,9 +26,8 @@ * @bug 6786688 8008164 * @summary HTML tables should have table summary, caption and table headers. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlTableTags * @run main TestHtmlTableTags */ @@ -36,400 +35,350 @@ public class TestHtmlTableTags extends JavadocTester { //Javadoc arguments. private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" + }; - //Input for string tests for HTML table tags. - private static final String[][] TABLE_TAGS_TEST = { - /* - * Test for validating summary for HTML tables - */ - //Package summary - { "pkg1/package-summary.html", - "
        " - }, - { "pkg1/package-summary.html", - "
        " - }, - { "pkg2/package-summary.html", - "
        " - }, - { "pkg2/package-summary.html", - "
        " - }, - // Class documentation - { "pkg1/C1.html", - "
        " - }, - { "pkg1/C1.html", - "
        " - }, - { "pkg2/C2.html", - "
        " - }, - { "pkg2/C2.html", - "
        " - }, - { "pkg2/C2.ModalExclusionType.html", - "
        " - }, - { "pkg2/C3.html", - "
        " - }, - { "pkg2/C4.html", - "
        " - }, - // Class use documentation - { "pkg1/class-use/I1.html", - "
        " - }, - { "pkg1/class-use/C1.html", - "
        " - }, - { "pkg1/class-use/C1.html", - "
        " - }, - { "pkg2/class-use/C2.html", - "
        " - }, - { "pkg2/class-use/C2.html", - "
        " - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "
        " - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "
        " - }, - // Package use documentation - { "pkg1/package-use.html", - "
        " - }, - { "pkg1/package-use.html", - "
        " - }, - { "pkg2/package-use.html", - "
        " - }, - { "pkg2/package-use.html", - "
        " - }, - // Deprecated - { "deprecated-list.html", - "
        " - }, - { "deprecated-list.html", - "
        " - }, - // Constant values - { "constant-values.html", - "
        " - }, - // Overview Summary - { "overview-summary.html", - "
        " - }, - - /* - * Test for validating caption for HTML tables - */ - - //Package summary - { "pkg1/package-summary.html", - "" - }, - { "pkg1/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - { "pkg2/package-summary.html", - "" - }, - // Class documentation - { "pkg1/C1.html", - "" - }, - { "pkg1/C1.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.ModalExclusionType.html", - "" - }, - { "pkg2/C3.html", - "" - }, - { "pkg2/C4.html", - "" - }, - // Class use documentation - { "pkg1/class-use/I1.html", - "" - }, - { "pkg1/class-use/C1.html", - "" - }, - { "pkg1/class-use/C1.html", - "" - }, - { "pkg2/class-use/C2.html", - "" - }, - { "pkg2/class-use/C2.html", - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "" - }, - // Package use documentation - { "pkg1/package-use.html", - "" - }, - { "pkg1/package-use.html", - "" - }, - { "pkg2/package-use.html", - "" - }, - { "pkg2/package-use.html", - "" - }, - // Deprecated - { "deprecated-list.html", - "" - }, - { "deprecated-list.html", - "" - }, - // Constant values - { "constant-values.html", - "" - }, - // Overview Summary - { "overview-summary.html", - "" - }, - - /* - * Test for validating headers for HTML tables - */ - - //Package summary - { "pkg1/package-summary.html", - "\n" + - "" - }, - { "pkg1/package-summary.html", - "\n" + - "" - }, - { "pkg2/package-summary.html", - "\n" + - "" - }, - { "pkg2/package-summary.html", - "\n" + - "" - }, - // Class documentation - { "pkg1/C1.html", - "\n" + - "" - }, - { "pkg1/C1.html", - "\n" + - "" - }, - { "pkg2/C2.html", - "\n" + - "" - }, - { "pkg2/C2.html", - "" - }, - { "pkg2/C2.ModalExclusionType.html", - "" - }, - { "pkg2/C3.html", - "\n" + - "" - }, - { "pkg2/C4.html", - "\n" + - "" - }, - // Class use documentation - { "pkg1/class-use/I1.html", - "\n" + - "" - }, - { "pkg1/class-use/C1.html", - "\n" + - "" - }, - { "pkg1/class-use/C1.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "\n" + - "" - }, - { "pkg2/class-use/C2.ModalExclusionType.html", - "\n" + - "" - }, - // Package use documentation - { "pkg1/package-use.html", - "\n" + - "" - }, - { "pkg1/package-use.html", - "" - }, - { "pkg2/package-use.html", - "\n" + - "" - }, - { "pkg2/package-use.html", - "" - }, - // Deprecated - { "deprecated-list.html", - "" - }, - { "deprecated-list.html", - "" - }, - // Constant values - { "constant-values.html", - "\n" + - "Constant Field\n" + - "" - }, - // Overview Summary - { "overview-summary.html", - "\n" + - "" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHtmlTableTags tester = new TestHtmlTableTags(); - tester.run(ARGS, TABLE_TAGS_TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkHtmlTableSummaries(); + checkHtmlTableCaptions(); + checkHtmlTableHeaders(); + } + + /* + * Tests for validating summary for HTML tables + */ + void checkHtmlTableSummaries() { + //Package summary + checkOutput("pkg1/package-summary.html", true, + "
        Class Summary" + - " Interface Summary" + - " Enum Summary" + - " Annotation Types Summary" + - " Fields All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "Nested Classes Constructors Enum Constants Required Elements " + - "Optional Elements " + - "Packages that use I1" + - " Fields in " + - "pkg2 declared as C1 " + - "Methods in " + - "pkg2 that return C1" + - " Fields in " + - "pkg1 declared as C2" + - " Methods in " + - "pkg1 that return C2" + - " Methods in " + - "pkg2 that return C2.ModalExclusionType" + - " Packages that use " + - "pkg1 Classes in " + - "pkg1 used by pkg1" + - " Packages that use " + - "pkg2 Classes in " + - "pkg2 used by pkg1" + - " Deprecated Fields" + - " Deprecated Methods" + - " pkg1." + - "C1 Packages 
        " + - "ClassDescription" + - "InterfaceDescription" + - "EnumDescription" + - "Annotation TypeDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeClass and DescriptionConstructor and DescriptionEnum Constant and DescriptionModifier and TypeRequired Element and DescriptionModifier and TypeOptional Element and DescriptionPackageDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionPackageDescriptionModifier and TypeMethod and DescriptionPackageDescriptionClass and DescriptionPackageDescriptionClass and DescriptionField and DescriptionMethod and Description" + - "Modifier and TypeValue" + - "PackageDescription
        ", + "
        "); + + checkOutput("pkg2/package-summary.html", true, + "
        ", + "
        "); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/C2.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/C2.ModalExclusionType.html", true, + "
        "); + + checkOutput("pkg2/C3.html", true, + "
        "); + + checkOutput("pkg2/C4.html", true, + "
        "); + + // Class use documentation + checkOutput("pkg1/class-use/I1.html", true, + "
        "); + + checkOutput("pkg1/class-use/C1.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/class-use/C2.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "
        "); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "
        "); + + // Package use documentation + checkOutput("pkg1/package-use.html", true, + "
        ", + "
        "); + + checkOutput("pkg2/package-use.html", true, + "
        ", + "
        "); + + // Deprecated + checkOutput("deprecated-list.html", true, + "
        ", + "
        "); + + // Constant values + checkOutput("constant-values.html", true, + "
        "); + + // Overview Summary + checkOutput("overview-summary.html", true, + "
        "); + } + + /* + * Tests for validating caption for HTML tables + */ + void checkHtmlTableCaptions() { + //Package summary + checkOutput("pkg1/package-summary.html", true, + "", + ""); + + checkOutput("pkg2/package-summary.html", true, + "", + ""); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "", + ""); + + checkOutput("pkg2/C2.html", true, + "", + ""); + + checkOutput("pkg2/C2.ModalExclusionType.html", true, + ""); + + checkOutput("pkg2/C3.html", true, + ""); + + checkOutput("pkg2/C4.html", true, + ""); + + // Class use documentation + checkOutput("pkg1/class-use/I1.html", true, + ""); + + checkOutput("pkg1/class-use/C1.html", true, + "", + ""); + + checkOutput("pkg2/class-use/C2.html", true, + "", + ""); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + ""); + + // Package use documentation + checkOutput("pkg1/package-use.html", true, + "", + ""); + + checkOutput("pkg2/package-use.html", true, + "", + ""); + + // Deprecated + checkOutput("deprecated-list.html", true, + "", + ""); + + // Constant values + checkOutput("constant-values.html", true, + ""); + + // Overview Summary + checkOutput("overview-summary.html", true, + ""); + } + + /* + * Test for validating headers for HTML tables + */ + void checkHtmlTableHeaders() { + //Package summary + checkOutput("pkg1/package-summary.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/package-summary.html", true, + "\n" + + "", + "\n" + + ""); + + // Class documentation + checkOutput("pkg1/C1.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/C2.html", true, + "\n" + + "", + ""); + + checkOutput("pkg2/C2.ModalExclusionType.html", true, + ""); + + checkOutput("pkg2/C3.html", true, + "\n" + + ""); + + checkOutput("pkg2/C4.html", true, + "\n" + + ""); + + // Class use documentation + checkOutput("pkg1/class-use/I1.html", true, + "\n" + + ""); + + checkOutput("pkg1/class-use/C1.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/class-use/C2.html", true, + "\n" + + "", + "\n" + + ""); + + checkOutput("pkg2/class-use/C2.ModalExclusionType.html", true, + "\n" + + "", + "\n" + + ""); + + // Package use documentation + checkOutput("pkg1/package-use.html", true, + "\n" + + "", + ""); + + checkOutput("pkg2/package-use.html", true, + "\n" + + "", + ""); + + // Deprecated + checkOutput("deprecated-list.html", true, + "", + ""); + + // Constant values + checkOutput("constant-values.html", true, + "\n" + + "Constant Field\n" + + ""); + + // Overview Summary + checkOutput("overview-summary.html", true, + "\n" + + ""); } } diff --git a/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java index 8990b2fc6ac..4416eabfb78 100644 --- a/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java +++ b/langtools/test/com/sun/javadoc/testHtmlTag/TestHtmlTag.java @@ -28,9 +28,8 @@ * @bug 6786682 * @summary This test verifies the use of lang attribute by . * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestHtmlTag * @run main TestHtmlTag */ @@ -38,43 +37,65 @@ import java.util.Locale; public class TestHtmlTag extends JavadocTester { - private static final String[][] TEST1 = { - { "pkg1/C1.html", - ""}, - { "pkg1/package-summary.html", - ""}}; - private static final String[][] NEGATED_TEST1 = { - { "pkg1/C1.html", ""}}; - private static final String[][] TEST2 = { - { "pkg2/C2.html", ""}, - { "pkg2/package-summary.html", ""}}; - private static final String[][] NEGATED_TEST2 = { - { "pkg2/C2.html", ""}}; - private static final String[][] TEST3 = { - { "pkg1/C1.html", ""}, - { "pkg1/package-summary.html", ""}}; - private static final String[][] NEGATED_TEST3 = { - { "pkg1/C1.html", ""}}; - - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - private static final String[] ARGS2 = - new String[] { - "-locale", "ja", "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "pkg2"}; - private static final String[] ARGS3 = - new String[] { - "-locale", "en_US", "-d", OUTPUT_DIR + "-3", "-sourcepath", SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestHtmlTag tester = new TestHtmlTag(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NEGATED_TEST2); - tester.run(ARGS3, TEST3, NEGATED_TEST3); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test_default() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + String defaultLanguage = Locale.getDefault().getLanguage(); + + checkOutput("pkg1/C1.html", true, + ""); + + checkOutput("pkg1/package-summary.html", true, + ""); + + checkOutput("pkg1/C1.html", false, + ""); + } + + @Test + void test_ja() { + // TODO: why does this test need/use pkg2; why can't it use pkg1 + // like the other two tests, so that we can share the check methods? + javadoc("-locale", "ja", + "-d", "out-ja", + "-sourcepath", testSrc, + "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg2/C2.html", true, + ""); + + checkOutput("pkg2/package-summary.html", true, + ""); + + checkOutput("pkg2/C2.html", false, + ""); + } + + @Test + void test_en_US() { + javadoc("-locale", "en_US", + "-d", "out-en_US", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/C1.html", true, + ""); + + checkOutput("pkg1/package-summary.html", true, + ""); + + checkOutput("pkg1/C1.html", false, + ""); } } diff --git a/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java b/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java index 6b15c49922e..52c512865c4 100644 --- a/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java +++ b/langtools/test/com/sun/javadoc/testIndentation/TestIndentation.java @@ -25,37 +25,30 @@ * @test * @bug 8011288 * @summary Erratic/inconsistent indentation of signatures - * @library ../lib/ + * @library ../lib * @build JavadocTester * @run main TestIndentation */ public class TestIndentation extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "p" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "p/Indent.html", - "
        public <T> void m(T t1," },
        -        { "p/Indent.html",
        -          "\n" +
        -          "                  T t2)" },
        -        { "p/Indent.html",
        -          "\n" +
        -          "           throws java.lang.Exception" }
        -    };
        -
        -    /**
        -     * The entry point of the test.
        -     * @param args the array of command line arguments.
        -     */
        -    public static void main(String[] args) {
        +    public static void main(String... args) throws Exception {
                 TestIndentation tester = new TestIndentation();
        -        tester.run(ARGS, TEST, NO_TEST);
        -        tester.printSummary();
        +        tester.runTests();
        +    }
        +
        +    @Test
        +    void test() {
        +        javadoc("-d", "out",
        +                "-sourcepath", testSrc,
        +                "p");
        +        checkExit(Exit.OK);
        +
        +        checkOutput("p/Indent.html", true,
        +                "
        public <T> void m(T t1,",
        +                "\n"
        +                + "                  T t2)",
        +                "\n"
        +                + "           throws java.lang.Exception");
             }
         }
        diff --git a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java
        index f4964602949..cf3dd12f853 100644
        --- a/langtools/test/com/sun/javadoc/testIndex/TestIndex.java
        +++ b/langtools/test/com/sun/javadoc/testIndex/TestIndex.java
        @@ -28,64 +28,53 @@
          *           Also test that index-all.html has the appropriate output.
          *           Test for unnamed package in index.
          * @author   jamieh
        - * @library  ../lib/
        + * @library  ../lib
          * @build    JavadocTester
        - * @build    TestIndex
          * @run main TestIndex
          */
         
         public class TestIndex extends JavadocTester {
         
        -    //Javadoc arguments.
        -    private static final String[] ARGS = new String[] {
        -        "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + "/NoPackage.java"
        -    };
        +    public static void main(String... args) throws Exception {
        +        TestIndex tester = new TestIndex();
        +        tester.runTests();
        +    }
        +
        +    @Test
        +    void test() {
        +        javadoc("-d", "out",
        +                "-sourcepath", testSrc,
        +                "pkg", testSrc("NoPackage.java"));
        +        checkExit(Exit.OK);
         
        -    //Input for string search tests.
        -    private static final String[][] TEST = {
                 //Make sure the horizontal scroll bar does not appear in class frame.
        -        { "index.html",
        -            ""},
        +        checkOutput("index.html", true,
        +                "");
         
                 //Test index-all.html
        -        { "index-all.html",
        -            "C" +
        -            " - Class in pkg"},
        -        { "index-all.html",
        -            "" +
        -            "Interface - Interface in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "" +
        -            "AnnotationType - Annotation Type in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "" +
        -            "Coin - Enum in " +
        -            "pkg"},
        -        { "index-all.html",
        -            "Class in <Unnamed>"},
        -        { "index-all.html",
        -            "
        \n" + - "
        " + - "Java - Static variable in class pkg.C
        \n" + - "
         
        \n" + - "
        JDK " + - "- Static variable in class pkg." + - "C
        \n" + - "
         
        \n" + - "
        "}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestIndex tester = new TestIndex(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("index-all.html", true, + "C" + + " - Class in pkg", + "" + + "Interface - Interface in " + + "pkg", + "" + + "AnnotationType - Annotation Type in " + + "pkg", + "" + + "Coin - Enum in " + + "pkg", + "Class in <Unnamed>", + "
        \n" + + "
        " + + "Java - Static variable in class pkg.C
        \n" + + "
         
        \n" + + "
        JDK " + + "- Static variable in class pkg." + + "C
        \n" + + "
         
        \n" + + "
        "); } } diff --git a/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java b/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java index 034f93998f6..6ce373f8ac1 100644 --- a/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java +++ b/langtools/test/com/sun/javadoc/testInlineLinkLabel/TestInlineLinkLabel.java @@ -26,34 +26,29 @@ * @bug 4524136 * @summary Test to make sure label is used for inline links. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestInlineLinkLabel * @run main TestInlineLinkLabel */ public class TestInlineLinkLabel extends JavadocTester { - private static final String[][] TEST = { - //Search for the label to the package link. - { "pkg/C1.html" , - "Here is a link to a package"}, - - //Search for the label to the class link - { "pkg/C1.html" , - "Here is a link to a class"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestInlineLinkLabel tester = new TestInlineLinkLabel(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/C1.html", true, + //Search for the label to the package link. + "Here is a link to a package", + //Search for the label to the class link + "Here is a link to a class"); } } diff --git a/langtools/test/com/sun/javadoc/testInterface/TestInterface.java b/langtools/test/com/sun/javadoc/testInterface/TestInterface.java index b02cfe00841..be11baac55f 100644 --- a/langtools/test/com/sun/javadoc/testInterface/TestInterface.java +++ b/langtools/test/com/sun/javadoc/testInterface/TestInterface.java @@ -29,101 +29,82 @@ * If A implements I and B extends A, B should be in the list of * implementing classes in the documentation for I. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestInterface * @run main TestInterface */ public class TestInterface extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Interface.html", - "
        int method()
        "}, - { "pkg/Interface.html", - "
        static final int field
        "}, - - - // Make sure known implementing class list is correct and omits type parameters. - { "pkg/Interface.html", - "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        Child" + - ", Parent" + - "
        \n" + - "
        "}, - - // Make sure "All Implemented Interfaces": has substituted type parameters - { "pkg/Child.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "Interface<T>
        \n" + - "
        " - }, - //Make sure Class Tree has substituted type parameters. - { "pkg/Child.html", - "
          \n" + - "
        • java.lang.Object
        • \n" + - "
        • \n" + - "
            \n" + - "
          • " + - "pkg.Parent<T>
          • \n" + - "
          • \n" + - "
              \n" + - "
            • pkg.Child<T>
            • \n" + - "
            \n" + - "
          • \n" + - "
          \n" + - "
        • \n" + - "
        " - }, - //Make sure "Direct Know Subclasses" omits type parameters - { "pkg/Parent.html", - "
        \n" + - "
        Direct Known Subclasses:
        \n" + - "
        Child" + - "
        \n" + - "
        " - }, - //Make sure "Specified By" has substituted type parameters. - { "pkg/Child.html", - "
        Specified by:
        \n" + - "
        method" + - " in interface " + - "" + - "Interface<" + - "T>
        " - }, - //Make sure "Overrides" has substituted type parameters. - { "pkg/Child.html", - "
        Overrides:
        \n" + - "
        method" + - " in class Parent<T>
        " - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg/Interface.html", - "public int method()"}, - { "pkg/Interface.html", - "public static final int field"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestInterface tester = new TestInterface(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/Interface.html", true, + "
        int method()
        ", + "
        static final int field
        ", + // Make sure known implementing class list is correct and omits type parameters. + "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        Child" + + ", Parent" + + "
        \n" + + "
        "); + + checkOutput("pkg/Child.html", true, + // Make sure "All Implemented Interfaces": has substituted type parameters + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "Interface<T>
        \n" + + "
        ", + //Make sure Class Tree has substituted type parameters. + "
          \n" + + "
        • java.lang.Object
        • \n" + + "
        • \n" + + "
            \n" + + "
          • " + + "pkg.Parent<T>
          • \n" + + "
          • \n" + + "
              \n" + + "
            • pkg.Child<T>
            • \n" + + "
            \n" + + "
          • \n" + + "
          \n" + + "
        • \n" + + "
        ", + //Make sure "Specified By" has substituted type parameters. + "
        Specified by:
        \n" + + "
        method" + + " in interface " + + "" + + "Interface<" + + "T>
        ", + //Make sure "Overrides" has substituted type parameters. + "
        Overrides:
        \n" + + "
        method" + + " in class Parent<T>
        "); + + checkOutput("pkg/Parent.html", true, + //Make sure "Direct Know Subclasses" omits type parameters + "
        \n" + + "
        Direct Known Subclasses:
        \n" + + "
        Child" + + "
        \n" + + "
        "); + + checkOutput("pkg/Interface.html", false, + "public int method()", + "public static final int field"); } } diff --git a/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java b/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java index a104b17e442..a6ced9b247d 100644 --- a/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java +++ b/langtools/test/com/sun/javadoc/testJavaFX/TestJavaFX.java @@ -26,73 +26,57 @@ * @bug 7112427 8012295 8025633 8026567 * @summary Test of the JavaFX doclet features. * @author jvalenta - * @library ../lib/ - * @build JavadocTester TestJavaFX + * @library ../lib + * @build JavadocTester * @run main TestJavaFX */ public class TestJavaFX extends JavadocTester { - private static final String[][] TEST = - new String[][] { - { "C.html", - "
        See Also:
        \n" + - "
        getRate(), \n" + - "setRate(double)
        "}, - { "C.html", - "
        public final void setRate(double value)
        \n" + - "
        Sets the value of the property rate.
        \n" + - "
        \n" + - "
        Property description:
        " }, - { "C.html", - "
        public final double getRate()
        \n" + - "
        Gets the value of the property rate.
        \n" + - "
        \n" + - "
        Property description:
        " }, - { "C.html", - "
        " }, - { "C.html", - "

        isPaused

        \n" + - "
        public final double isPaused()
        \n" + - "
        Gets the value of the property paused.
        " }, - { "D.html", - "

        Properties inherited from class C

        \n" + - "paused, rate" }, - }; - private static final String[][] NO_TEST = - new String[][] { - { "C.html", - "A()"}, - }; - - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-javafx", - SRC_DIR + "/C.java", SRC_DIR + "/D.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestJavaFX tester = new TestJavaFX(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-javafx", + testSrc("C.java"), testSrc("D.java")); + checkExit(Exit.FAILED); // should be EXIT_OK -- need to fix C.java + + checkOutput("C.html", true, + "
        See Also:
        \n" + + "
        getRate(), \n" + + "setRate(double)
        ", + "
        public final void setRate(double value)
        \n" + + "
        Sets the value of the property rate.
        \n" + + "
        \n" + + "
        Property description:
        ", + "
        public final double getRate()
        \n" + + "
        Gets the value of the property rate.
        \n" + + "
        \n" + + "
        Property description:
        ", + "
        ", + "

        isPaused

        \n" + + "
        public final double isPaused()
        \n" + + "
        Gets the value of the property paused.
        "); + + checkOutput("C.html", false, + "A()"); + + checkOutput("D.html", true, + "

        Properties inherited from class C

        \n" + + "paused, rate"); + } + } diff --git a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java index 2b9ef7e10f0..504dcb26bfc 100644 --- a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java +++ b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java @@ -26,98 +26,93 @@ * @bug 4665566 4855876 7025314 8012375 8015997 8016328 8024756 * @summary Verify that the output has the right javascript. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestJavascript * @run main TestJavascript */ public class TestJavascript extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + - "/TestJavascript.java" - }; + public static void main(String... args) throws Exception { + TestJavascript tester = new TestJavascript(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "Frames"}, - { "TestJavascript.html", - "Frames"}, - { "index.html", - ""}, + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", testSrc("TestJavascript.java")); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "Frames"); + + checkOutput("TestJavascript.html", true, + "Frames"); + + checkOutput("index.html", true, + ""); //Make sure title javascript only runs if is-external is not true - { "pkg/C.html", - " try {\n" + - " if (location.href.indexOf('is-external=true') == -1) {\n" + - " parent.document.title=\"C\";\n" + - " }\n" + - " }\n" + - " catch(err) {\n" + - " }"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestJavascript tester = new TestJavascript(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + checkOutput("pkg/C.html", true, + " try {\n" + + " if (location.href.indexOf('is-external=true') == -1) {\n" + + " parent.document.title=\"C\";\n" + + " }\n" + + " }\n" + + " catch(err) {\n" + + " }"); } } diff --git a/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java b/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java index dc6768cdfb7..84a4eeaa44e 100644 --- a/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java +++ b/langtools/test/com/sun/javadoc/testLambdaFeature/TestLambdaFeature.java @@ -40,79 +40,74 @@ public class TestLambdaFeature extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "pkg1" - }; - - private static final String[] ARGS_1 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-source", "1.7", "pkg1" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        default void defaultMethod()
        "}, - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "}, - { "pkg1/FuncInf.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "} - }; - private static final String[][] NEGATED_TEST = { - { "pkg/A.html", - ""}, - { "pkg/A.html", - "
        default default void defaultMethod()
        "}, - { "pkg/B.html", - ""}, - { "pkg1/NotAFuncInf.html", - "
        \n" + - "
        Functional Interface:
        \n" + - "
        This is a functional interface and can therefore be used as " + - "the assignment target for a lambda expression or method " + - "reference.
        \n" + - "
        "}, - { "pkg/B.html", - "
        \n" + - "
        Functional Interface:
        "} - }; - private static final String[][] NEGATED_TEST_1 = { - { "pkg1/FuncInf.html", - "
        \n" + - "
        Functional Interface:
        "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestLambdaFeature tester = new TestLambdaFeature(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS_1, NO_TEST, NEGATED_TEST_1); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg", "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg/A.html", true, + "
        ", + "
        default void defaultMethod()
        ", + "", + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); + + checkOutput("pkg1/FuncInf.html", true, + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); + + checkOutput("pkg/A.html", false, + "", + "
        default default void defaultMethod()
        "); + + checkOutput("pkg/B.html", false, + "", + "
        \n" + + "
        Functional Interface:
        "); + + checkOutput("pkg1/NotAFuncInf.html", false, + "
        \n" + + "
        Functional Interface:
        \n" + + "
        This is a functional interface and can therefore be used as " + + "the assignment target for a lambda expression or method " + + "reference.
        \n" + + "
        "); + } + + @Test + void testSource7() { + javadoc("-d", "out-7", + "-sourcepath", testSrc, + "-source", "1.7", + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/FuncInf.html", false, + "
        \n" + + "
        Functional Interface:
        "); } } diff --git a/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java b/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java index 46e2ea98f1d..6985f1b644c 100644 --- a/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java +++ b/langtools/test/com/sun/javadoc/testLeadingSpaces/LeadingSpaces.java @@ -29,37 +29,35 @@ * begin their comment without a leading star without leading * spaces stripped * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build LeadingSpaces * @run main LeadingSpaces */ public class LeadingSpaces extends JavadocTester { - - private static final String[][] TEST = { - { "LeadingSpaces.html", -" 1\n" + -" 2\n" + -" 3\n" + -" 4\n" + -" 5\n" + -" 6\n" + -" 7"} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/LeadingSpaces.java"}; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { LeadingSpaces tester = new LeadingSpaces(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testLeadingSpaces() { + javadoc("-d", "out", "-sourcepath", testSrc, + testSrc("LeadingSpaces.java")); + checkExit(Exit.OK); + checkOutput("LeadingSpaces.html", true, + " 1\n" + + " 2\n" + + " 3\n" + + " 4\n" + + " 5\n" + + " 6\n" + + " 7"); } /** diff --git a/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java b/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java index 16d8cbdc2e7..8cae5034bab 100644 --- a/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java +++ b/langtools/test/com/sun/javadoc/testLegacyTaglet/TestLegacyTaglet.java @@ -27,38 +27,35 @@ * @summary Test to ensure that the refactored version of the standard * doclet still works with Taglets that implement the 1.4.0 interface. * @author jamieh - * @library ../lib/ - * @compile ../lib/JavadocTester.java TestLegacyTaglet.java ToDoTaglet.java UnderlineTaglet.java Check.java + * @library ../lib + * @build JavadocTester ToDoTaglet UnderlineTaglet Check * @run main TestLegacyTaglet */ public class TestLegacyTaglet extends JavadocTester { - private static final String[] ARGS = - new String[] {"-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tagletpath", SRC_DIR, "-taglet", "ToDoTaglet", "-taglet", "Check", - "-taglet", "UnderlineTaglet", SRC_DIR + "/C.java"}; - - private static final String[][] TEST = new String[][] { - { "C.html", "This is an underline"}, - { "C.html", - "
        To Do:
        Class Summary" + + " Interface Summary" + + " Enum Summary" + + " Annotation Types Summary" + + " Fields All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "Nested Classes Constructors Enum Constants Required Elements " + + "Optional Elements " + + "Packages that use I1" + + " Fields in " + + "pkg2 declared as C1 " + + "Methods in " + + "pkg2 that return C1" + + " Fields in " + + "pkg1 declared as C2" + + " Methods in " + + "pkg1 that return C2" + + " Methods in " + + "pkg2 that return C2.ModalExclusionType" + + " Packages that use " + + "pkg1 Classes in " + + "pkg1 used by pkg1" + + " Packages that use " + + "pkg2 Classes in " + + "pkg2 used by pkg1" + + " Deprecated Fields" + + " Deprecated Methods" + + " pkg1." + + "C1 Packages 
        " + + "ClassDescription" + + "InterfaceDescription" + + "EnumDescription" + + "Annotation TypeDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeClass and DescriptionConstructor and DescriptionEnum Constant and DescriptionModifier and TypeRequired Element and DescriptionModifier and TypeOptional Element and DescriptionPackageDescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionModifier and TypeField and DescriptionModifier and TypeMethod and DescriptionPackageDescriptionModifier and TypeMethod and DescriptionPackageDescriptionClass and DescriptionPackageDescriptionClass and DescriptionField and DescriptionMethod and Description" + + "Modifier and TypeValue" + + "PackageDescriptionrate\n" + - "
        Defines the direction/speed at which the Timeline is expected to"}, - - { "C.html", - "Default value:"}, - { "C.html", - "Since:\n" + - "
        JavaFX 8.0
        " }, - { "C.html", - "

        Sets the value of the property Property"}, - { "C.html", - "

        Gets the value of the property Property"}, - { "C.html", - "Property description:"}, - { "C.html", - "

        setTestMethodProperty() rate\n" + + "
        Defines the direction/speed at which the Timeline is expected to", + "Default value:", + "Since:\n" + + "
        JavaFX 8.0
        ", + "

        Sets the value of the property Property", + "

        Gets the value of the property Property", + "Property description:", + "

        setTestMethodProperty() default void
        " + - "All Methods " + - "" + - "Instance Methods" + - " " + - "Abstract Methods " + - "" + - "Default Methods" + - " 
        default default voiddefault voiddefault void
        " + + "All Methods " + + "" + + "Instance Methods" + + " " + + "Abstract Methods " + + "" + + "Default Methods" + + " 
        default default voiddefault void
        " + - "
        Finish this class.
        "}, - { "C.html", - "
        To Do:
        " + - "
        Tag in Method.
        "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestLegacyTaglet tester = new TestLegacyTaglet(); - tester.run(ARGS, TEST, NO_TEST); - if (tester.getErrorOutput().contains("NullPointerException")) { - throw new AssertionError("javadoc threw NullPointerException"); - } - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tagletpath", testSrc, + "-taglet", "ToDoTaglet", + "-taglet", "Check", + "-taglet", "UnderlineTaglet", + testSrc("C.java")); + checkExit(Exit.OK); + checkOutput("C.html", true, + "This is an underline", + "
        To Do:
        " + + "
        Finish this class.
        ", + "
        To Do:
        " + + "
        Tag in Method.
        "); + checkOutput(Output.STDERR, false, + "NullPointerException"); } } diff --git a/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java b/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java index 5bb1e641d52..c1a89319d44 100644 --- a/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestBadLinkOption.java @@ -26,34 +26,32 @@ * @bug 4625883 * @summary Make sure that bad -link arguments trigger warnings. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestBadLinkOption * @run main TestBadLinkOption */ public class TestBadLinkOption extends JavadocTester { - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-link", OUTPUT_DIR, "pkg" - }; - - private static final String[][] TEST = { - {WARNING_OUTPUT, "Error reading file:"} - }; - - private static final String[][] NEG_TEST = { - {ERROR_OUTPUT, "Error reading file:"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestBadLinkOption tester = new TestBadLinkOption(); - tester.run(ARGS, TEST, NEG_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + String out = "out"; + javadoc("-d", out, + "-sourcepath", testSrc, + "-link", out, + "pkg"); + checkExit(Exit.OK); + + // TODO: the file it is trying to read, out/out/package-list, warrants investigation + checkOutput(Output.WARNING, true, + "Error reading file:"); + + checkOutput(Output.ERROR, false, + "Error reading file:"); } } diff --git a/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java b/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java index b1ea09635c2..9e250c53edf 100644 --- a/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestLinkOption.java @@ -27,105 +27,111 @@ * @summary Test to make sure that -link and -linkoffline link to * right files, and URLs with and without trailing slash are accepted. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestLinkOption + * @library ../lib + * @build JavadocTester * @run main TestLinkOption */ import java.io.File; public class TestLinkOption extends JavadocTester { + /** + * The entry point of the test. + * @param args the array of command line arguments. + */ + public static void main(String... args) throws Exception { + TestLinkOption tester = new TestLinkOption(); + tester.runTests(); + } - //Generate the documentation using -linkoffline and a URL as the first parameter. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api/", - SRC_DIR, "-package", "pkg", "java.lang" - }; + // The following test runs javadoc multiple times; it is important that the + // first one is run first, since the subsequent runs refer to the output + // it generates. Therefore we run everything serially in a single @Test + // method and not in independent @Test methods. + @Test + void test() { + // Generate the documentation using -linkoffline and a URL as the first parameter. + String out1 = "out1"; + String url = "http://java.sun.com/j2se/1.4/docs/api/"; + javadoc("-d", out1, + "-sourcepath", testSrc, + "-linkoffline", url, testSrc, + "-package", + "pkg", "java.lang"); + checkExit(Exit.OK); - private static final String[][] TEST1 = { - { "pkg/C.html", - "Link to String Class" - }, - //Make sure the parameters are indented properly when the -link option is used. - { "pkg/C.html", - "(int p1,\n" + - " int p2,\n" + - " int p3)" - }, - { "pkg/C.html", - "(int p1,\n" + - " int p2,\n" + - " " + - "Object p3)" - }, - { "java/lang/StringBuilderChild.html", - "
        public abstract class StringBuilderChild\n" +
        -                "extends Object
        " - }, + checkOutput("pkg/C.html", true, + "Link to String Class", + //Make sure the parameters are indented properly when the -link option is used. + "(int p1,\n" + + " int p2,\n" + + " int p3)", + "(int p1,\n" + + " int p2,\n" + + " " + + "Object p3)"); - }; - private static final String[][] NEGATED_TEST1 = NO_TEST; + checkOutput("java/lang/StringBuilderChild.html", true, + "
        public abstract class StringBuilderChild\n"
        +                + "extends Object
        " + ); - //Generate the documentation using -linkoffline and a relative path as the first parameter. - //We will try linking to the docs generated in test 1 with a relative path. - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, - "-linkoffline", "../" + OUTPUT_DIR + "-1", - OUTPUT_DIR + "-1", "-package", "pkg2" - }; - - private static final String[][] TEST2 = { - { "pkg2/C2.html", - "This is a link to Class C." - } - }; + ); + + String out3 = "out3"; + javadoc(createArguments(out3, out1, true)); // with trailing slash + checkExit(Exit.OK); + + String out4 = "out4"; + javadoc(createArguments(out4, out1, false)); // without trailing slash + checkExit(Exit.OK); + // Note: the following test is very weak, and will fail if ever the test + // of the message is changed. We should have a separate test to verify + // this is the text that is given when there is a problem with a URL + checkOutput(Output.WARNING, false, + "warning - Error fetching URL"); + } + /* * Create the documentation using the -link option, vary the behavior with * both trailing and no trailing slash. We are only interested in ensuring * that the command executes with no errors or related warnings. */ - static String[] createArguments(boolean withTrailingSlash) { - String packagePath = new File(OUTPUT_DIR + "-1").getAbsolutePath(); - String outputDirName = OUTPUT_DIR; + static String[] createArguments(String outDir, String packageDir, boolean withTrailingSlash) { + String packagePath = new File(packageDir).getAbsolutePath(); if (withTrailingSlash) { // add the trailing slash, if it is not present! if (!packagePath.endsWith(FS)) { packagePath = packagePath + FS; } - outputDirName = outputDirName + "-3"; } else { // remove the trailing slash, if it is present! if (packagePath.endsWith(FS)) { packagePath = packagePath.substring(0, packagePath.length() - 1); } - outputDirName = outputDirName + "-4"; } String args[] = { - "-d", outputDirName, "-sourcepath", SRC_DIR, - "-link", "file:///" + packagePath, "-package", "pkg2" + "-d", outDir, + "-sourcepath", testSrc, + "-link", "file:///" + packagePath, + "-package", + "pkg2" }; System.out.println("packagePath: " + packagePath); return args; } - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestLinkOption tester = new TestLinkOption(); - tester.run(ARGS1, TEST1, NEGATED_TEST1); - tester.run(ARGS2, TEST2, NO_TEST); - tester.runJavadoc(createArguments(true)); // with trailing slash - tester.runJavadoc(createArguments(false)); // without trailing slash - tester.printSummary(); - if (tester.getWarningOutput().contains("warning - Error fetching URL")) { - throw new Error("URL rejected ?"); - } - tester.printSummary(); - } } diff --git a/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java b/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java index 628d0fd8a2e..54f95acd46b 100644 --- a/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java +++ b/langtools/test/com/sun/javadoc/testLinkOption/TestNewLineInLink.java @@ -27,32 +27,27 @@ * @summary Make sure that a new line may act as a separator between * link and label. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNewLineInLink * @run main TestNewLineInLink */ public class TestNewLineInLink extends JavadocTester { - private static final String[][] NEGATED_TEST = - new String[][] { - {ERROR_OUTPUT, - "illegal character"} - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", - SRC_DIR, "testNewLineInLink"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNewLineInLink tester = new TestNewLineInLink(); - tester.run(ARGS, new String[][] {}, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", "http://www.java.sun.com/j2se/1.4/docs/api", testSrc, + "testNewLineInLink"); + checkExit(Exit.OK); + + checkOutput(Output.ERROR, false, + "illegal character"); } } diff --git a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java index 98591716a74..242d0385bb6 100644 --- a/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java +++ b/langtools/test/com/sun/javadoc/testLinkTaglet/TestLinkTaglet.java @@ -27,53 +27,46 @@ * @summary Make sure that you can link from one member to another using * non-qualified name, furthermore, ensure the right one is linked. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestLinkTaglet * @run main TestLinkTaglet */ public class TestLinkTaglet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", SRC_DIR + - "/checkPkg/B.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "Qualified Link: C.InnerC.
        \n" + - " Unqualified Link1: C.InnerC.
        \n" + - " Unqualified Link2: C.InnerC.
        \n" + - " Qualified Link: method(pkg.C.InnerC, pkg.C.InnerC2).
        \n" + - " Unqualified Link: method(C.InnerC, C.InnerC2).
        \n" + - " Unqualified Link: method(InnerC, InnerC2).
        " - }, - { "pkg/C.InnerC.html", - "Link to member in outer class: C.MEMBER
        \n" + - " Link to member in inner class: C.InnerC2.MEMBER2
        \n" + - " Link to another inner class: C.InnerC2" - }, - { "pkg/C.InnerC2.html", - "
        \n" + - "
        Enclosing class:
        \n" + - "
        C
        \n" + - "
        " - }, - }; - private static final String[][] NEGATED_TEST = { - {WARNING_OUTPUT, "Tag @see: reference not found: A"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestLinkTaglet tester = new TestLinkTaglet(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "pkg", testSrc("checkPkg/B.java")); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "Qualified Link: C.InnerC.
        \n" + + " Unqualified Link1: C.InnerC.
        \n" + + " Unqualified Link2: C.InnerC.
        \n" + + " Qualified Link: method(pkg.C.InnerC, pkg.C.InnerC2).
        \n" + + " Unqualified Link: method(C.InnerC, C.InnerC2).
        \n" + + " Unqualified Link: method(InnerC, InnerC2).
        "); + + checkOutput("pkg/C.InnerC.html", true, + "Link to member in outer class: C.MEMBER
        \n" + + " Link to member in inner class: C.InnerC2.MEMBER2
        \n" + + " Link to another inner class: C.InnerC2"); + + checkOutput("pkg/C.InnerC2.html", true, + "
        \n" + + "
        Enclosing class:
        \n" + + "
        C
        \n" + + "
        "); + + checkOutput(Output.WARNING, false, + "Tag @see: reference not found: A"); } } diff --git a/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java b/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java index 6e233a24067..e56af5233e1 100644 --- a/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java +++ b/langtools/test/com/sun/javadoc/testLinkToSerialForm/TestLinkToSerialForm.java @@ -27,29 +27,28 @@ * @summary Test to make sure that there is a link with a proper anchor * from a serializable class to serialized-form.html. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestLinkToSerialForm * @run main TestLinkToSerialForm */ public class TestLinkToSerialForm extends JavadocTester { - private static final String[][] TEST = { - { "serialized-form.html", ""}, - { "pkg/C.html", ""} - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestLinkToSerialForm tester = new TestLinkToSerialForm(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("serialized-form.html", true, + ""); + checkOutput("pkg/C.html", true, + ""); } } diff --git a/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java b/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java index 4be736641a1..000c6594a4a 100644 --- a/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java +++ b/langtools/test/com/sun/javadoc/testLiteralCodeInPre/TestLiteralCodeInPre.java @@ -25,73 +25,61 @@ * @test * @bug 8002387 8014636 * @summary Improve rendered HTML formatting for {@code} - * @library ../lib/ - * @build JavadocTester TestLiteralCodeInPre + * @library ../lib + * @build JavadocTester * @run main TestLiteralCodeInPre */ public class TestLiteralCodeInPre extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-Xdoclint:none", "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Test.html", - "no_pre()
        \n" + - "
        abcdefghi
        " }, - { "pkg/Test.html", - "no_pre_extra_whitespace()
        \n" + - "
        abcdef ghi
        " }, - { "pkg/Test.html", - "in_pre()\n" + - "
         abc  def  ghi
        " }, - { "pkg/Test.html", - "pre_after_text()\n" + - "
        xyz
         abc  def  ghi
        " }, - { "pkg/Test.html", - "after_pre()\n" + - "
        xyz
         pqr 
        abcdef ghi
        " }, - { "pkg/Test.html", - "back_in_pre()\n" + - "
        xyz
         pqr 
        mno
         abc  def  ghi
        " }, - { "pkg/Test.html", - "typical_usage_code()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 }\n" +
        -            " 
        \n" + - " and so it goes.
        " }, - { "pkg/Test.html", - "typical_usage_literal()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 }\n" +
        -            " 
        \n" + - " and so it goes.
        " }, - { "pkg/Test.html", - "recommended_usage_literal()\n" + - "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + - " Example:
        \n" +
        -            "   line 1 <T> void m(T t) {\n" +
        -            "   line 2     // do something with T\n" +
        -            "   line 3 } 
        \n" + - " and so it goes.
        " } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestLiteralCodeInPre tester = new TestLiteralCodeInPre(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-Xdoclint:none", + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/Test.html", true, + "no_pre()\n" + + "
        abcdefghi
        ", + "no_pre_extra_whitespace()\n" + + "
        abcdef ghi
        ", + "in_pre()\n" + + "
         abc  def  ghi
        ", + "pre_after_text()\n" + + "
        xyz
         abc  def  ghi
        ", + "after_pre()\n" + + "
        xyz
         pqr 
        abcdef ghi
        ", + "back_in_pre()\n" + + "
        xyz
         pqr 
        mno
         abc  def  ghi
        ", + "typical_usage_code()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 }\n"
        +                + " 
        \n" + + " and so it goes.
        ", + "typical_usage_literal()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 }\n"
        +                + " 
        \n" + + " and so it goes.
        ", + "recommended_usage_literal()\n" + + "
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" + + " Example:
        \n"
        +                + "   line 1 <T> void m(T t) {\n"
        +                + "   line 2     // do something with T\n"
        +                + "   line 3 } 
        \n" + + " and so it goes.
        "); } } diff --git a/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java b/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java index f3afc14512f..c174d4aa9de 100644 --- a/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java +++ b/langtools/test/com/sun/javadoc/testMemberInheritence/TestMemberInheritence.java @@ -27,83 +27,63 @@ * @summary Test to make sure that members are inherited properly in the Javadoc. * Verify that inheritence labels are correct. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMemberInheritence * @run main TestMemberInheritence */ public class TestMemberInheritence extends JavadocTester { - private static final String[][] TEST = { - //Public field should be inherited - { "pkg/SubClass.html", - "
        "}, - - //Public method should be inherited - { "pkg/SubClass.html", - ""}, - - //Public inner class should be inherited. - { "pkg/SubClass.html", - ""}, - - //Protected field should be inherited - { "pkg/SubClass.html", - ""}, - - //Protected method should be inherited - { "pkg/SubClass.html", - ""}, - - //Protected inner class should be inherited. - { "pkg/SubClass.html", - ""}, - - // New labels as of 1.5.0 - { "pkg/SubClass.html", - "Nested classes/interfaces inherited from class pkg." + - "BaseClass"}, - { "pkg/SubClass.html", - "Nested classes/interfaces inherited from interface pkg." + - "BaseInterface"}, - - // Test overriding/implementing methods with generic parameters. - { "pkg/BaseClass.html", - "
        \n" + - "
        Specified by:
        \n" + - "
        " + - "getAnnotation in interface " + - "" + - "BaseInterface
        \n" + - "
        "}, - - // Test diamond inheritence member summary (6256068) - { "diamond/Z.html", - "aMethod"}, - - // Test that doc is inherited from closed parent (6270645) - { "inheritDist/C.html", - "
        m1-B
        "}, - - }; - - private static final String[][] NEGATED_TEST = { - { "pkg/SubClass.html", - "staticMethod"}, - }; - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "diamond", - "inheritDist"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestMemberInheritence tester = new TestMemberInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", "diamond", "inheritDist"); + checkExit(Exit.OK); + + checkOutput("pkg/SubClass.html", true, + // Public field should be inherited + "", + // Public method should be inherited + "", + // Public inner class should be inherited. + "", + // Protected field should be inherited + "", + // Protected method should be inherited + "", + // Protected inner class should be inherited. + "", + // New labels as of 1.5.0 + "Nested classes/interfaces inherited from class pkg." + + "BaseClass", + "Nested classes/interfaces inherited from interface pkg." + + "BaseInterface"); + + checkOutput("pkg/BaseClass.html", true, + // Test overriding/implementing methods with generic parameters. + "
        \n" + + "
        Specified by:
        \n" + + "
        " + + "getAnnotation in interface " + + "" + + "BaseInterface
        \n" + + "
        "); + + checkOutput("diamond/Z.html", true, + // Test diamond inheritence member summary (6256068) + "aMethod"); + + checkOutput("inheritDist/C.html", true, + // Test that doc is inherited from closed parent (6270645) + "
        m1-B
        "); + + checkOutput("pkg/SubClass.html", false, + "staticMethod"); } } diff --git a/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java b/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java index 67b26289a01..86674721970 100644 --- a/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java +++ b/langtools/test/com/sun/javadoc/testMemberSummary/TestMemberSummary.java @@ -28,50 +28,40 @@ * type than the method in the child class. Make sure the * documentation is inherited but the return type isn't. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMemberSummary * @run main TestMemberSummary */ public class TestMemberSummary extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg","pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - // Check return type in member summary. - { "pkg/PublicChild.html", - "PublicChild\n" + - "" + - "returnTypeTest()" - }, - // Check return type in member detail. - { "pkg/PublicChild.html", - "
        public " +
        -            "PublicChild returnTypeTest()
        " - }, - - // Legacy anchor dimensions (6290760) - { "pkg2/A.html", - "\n" + - "\n" + - "\n" + - "\n" + - "" - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestMemberSummary tester = new TestMemberSummary(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg","pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg/PublicChild.html", true, + // Check return type in member summary. + "PublicChild\n" + + "" + + "returnTypeTest()", + // Check return type in member detail. + "
        public "
        +                + "PublicChild returnTypeTest()
        "); + + // Legacy anchor dimensions (6290760) + checkOutput("pkg2/A.html", true, + "\n" + + "\n" + + "\n" + + "\n" + + ""); } } diff --git a/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java b/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java index fd287356079..293a37b93ed 100644 --- a/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java +++ b/langtools/test/com/sun/javadoc/testMethodTypes/TestMethodTypes.java @@ -26,97 +26,74 @@ * @bug 8002304 8024096 * @summary Test for various method types in the method summary table * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestMethodTypes + * @library ../lib + * @build JavadocTester * @run main TestMethodTypes */ public class TestMethodTypes extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1" - }; - - private static final String[][] TEST = { - { "pkg1/A.html", - "var methods = {" - }, - - { "pkg1/A.html", - "All " + - "Methods " + - "" + - "Static Methods " + - "" + - "Instance Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "" - }, - - { "pkg1/A.html", - "" - }, - - { "pkg1/B.html", - "All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Abstract Methods " + - "" - }, - - { "pkg1/D.html", - "var methods = {" - }, - - { "pkg1/D.html", - "All " + - "Methods " + - "" + - "Instance Methods " + - "" + - "Abstract Methods " + - "" + - "Concrete Methods " + - "" + - "Deprecated Methods " + - "" - }, - - { "pkg1/D.html", - "" - }, - }; - private static final String[][] NEGATED_TEST = { - { "pkg1/A.html", - "Methods " + - "" - }, - - { "pkg1/B.html", - "Methods " + - "" - }, - - { "pkg1/D.html", - "Methods " + - "" - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestMethodTypes tester = new TestMethodTypes(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/A.html", true, + "var methods = {", + "All " + + "Methods " + + "" + + "Static Methods " + + "" + + "Instance Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "", + ""); + + checkOutput("pkg1/B.html", true, + "All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Abstract Methods " + + ""); + + checkOutput("pkg1/D.html", true, + "var methods = {", + "All " + + "Methods " + + "" + + "Instance Methods " + + "" + + "Abstract Methods " + + "" + + "Concrete Methods " + + "" + + "Deprecated Methods " + + "", + ""); + + checkOutput("pkg1/A.html", false, + "Methods " + + ""); + + checkOutput("pkg1/B.html", false, + "Methods " + + ""); + + checkOutput("pkg1/D.html", false, + "Methods " + + ""); } } diff --git a/langtools/test/com/sun/javadoc/testModifier/TestModifier.java b/langtools/test/com/sun/javadoc/testModifier/TestModifier.java index 2636f1825c8..0454fc205f2 100644 --- a/langtools/test/com/sun/javadoc/testModifier/TestModifier.java +++ b/langtools/test/com/sun/javadoc/testModifier/TestModifier.java @@ -26,29 +26,25 @@ * @bug 4210388 * @summary Javadoc declares interfaces to be "abstract". * @author jamieh - * @library ../lib/ + * @library ../lib * @build ModifierAbstract * @build JavadocTester - * @build TestModifier * @run main TestModifier */ public class TestModifier extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-sourcepath", SRC_DIR, - "-docletpath", SRC_DIR, "-doclet", "ModifierAbstract", - SRC_DIR + "/Interface.java", SRC_DIR + "/Test.java"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestModifier tester = new TestModifier(); - if (tester.run(ARGS, NO_TEST, NO_TEST) != 0) { - throw new Error("Javadoc error occured during execution."); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-sourcepath", testSrc, + "-docletpath", testSrc, + "-doclet", "ModifierAbstract", + testSrc("Interface.java"), testSrc("Test.java")); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java b/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java index ae43a56c871..19b1db60405 100644 --- a/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java +++ b/langtools/test/com/sun/javadoc/testNavigation/TestNavigation.java @@ -27,49 +27,44 @@ * @summary Make sure the Next/Prev Class links iterate through all types. * Make sure the navagation is 2 columns, not 3. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestNavigation + * @library ../lib + * @build JavadocTester * @run main TestNavigation */ public class TestNavigation extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/A.html", "
      • Prev Class
      • "}, - { "pkg/A.html", - "Next Class"}, - { "pkg/C.html", - "Prev Class"}, - { "pkg/C.html", - "Next Class"}, - { "pkg/E.html", - "Prev Class"}, - { "pkg/E.html", - "Next Class"}, - { "pkg/I.html", - "Prev Class"}, - { "pkg/I.html", "
      • Next Class
      • "}, - // Test for 4664607 - { "pkg/I.html", - "\n" + - "\n" + - "\n" + - ""} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNavigation tester = new TestNavigation(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/A.html", true, + "
      • Prev Class
      • ", + "Next Class"); + + checkOutput("pkg/C.html", true, + "Prev Class", + "Next Class"); + + checkOutput("pkg/E.html", true, + "Prev Class", + "Next Class"); + + checkOutput("pkg/I.html", true, + "Prev Class", + "
      • Next Class
      • ", + // Test for 4664607 + "\n" + + "\n" + + "\n" + + ""); } } diff --git a/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java b/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java index 9a4e41eeb89..57bd6410c89 100644 --- a/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java +++ b/langtools/test/com/sun/javadoc/testNestedGenerics/TestNestedGenerics.java @@ -26,35 +26,28 @@ * @bug 6758050 8025633 * @summary Test HTML output for nested generic types. * @author bpatel - * @library ../lib/ - * @build JavadocTester TestNestedGenerics + * @library ../lib + * @build JavadocTester * @run main TestNestedGenerics */ public class TestNestedGenerics extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "pkg" - }; + public static void main(String... args) throws Exception { + TestNestedGenerics tester = new TestNestedGenerics(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/NestedGenerics.html", + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/NestedGenerics.html", true, "" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNestedGenerics tester = new TestNestedGenerics(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "(java.util.Map<A, java.util.Map<A, A>>)"); } } diff --git a/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java b/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java index e04b5c5332b..f41ff173bd3 100644 --- a/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java +++ b/langtools/test/com/sun/javadoc/testNestedInlineTag/TestNestedInlineTag.java @@ -25,12 +25,11 @@ * @test * @summary Test for nested inline tags. * * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build testtaglets.UnderlineTaglet * @build testtaglets.BoldTaglet * @build testtaglets.GreenTaglet - * @build TestNestedInlineTag * @run main TestNestedInlineTag */ @@ -38,7 +37,6 @@ * This should be green, underlined and bold (Class): {@underline {@bold {@green My test}}} . */ public class TestNestedInlineTag extends JavadocTester { - /** * This should be green, underlined and bold (Field): {@underline {@bold {@green My test}}} . */ @@ -54,44 +52,35 @@ public class TestNestedInlineTag extends JavadocTester { */ public void method(){} - private static final String[][] TEST = { - //Test nested inline tag in class description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Class): My test" - }, - - //Test nested inline tag in field description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Field): My test" - }, - - //Test nested inline tag in constructor description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Constructor): My test" - }, - - //Test nested inline tag in method description. - { "TestNestedInlineTag.html", - "This should be green, underlined and bold (Method): My test" - } - }; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-taglet", "testtaglets.UnderlineTaglet", - "-taglet", "testtaglets.BoldTaglet", - "-taglet", "testtaglets.GreenTaglet", - SRC_DIR + "/TestNestedInlineTag.java" - }; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNestedInlineTag tester = new TestNestedInlineTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-taglet", "testtaglets.UnderlineTaglet", + "-taglet", "testtaglets.BoldTaglet", + "-taglet", "testtaglets.GreenTaglet", + testSrc("TestNestedInlineTag.java")); + checkExit(Exit.OK); + + checkOutput("TestNestedInlineTag.html", true, + //Test nested inline tag in class description. + "This should be green, underlined and bold (Class): My test", + //Test nested inline tag in field description. + "This should be green, underlined and bold (Field): My test", + //Test nested inline tag in constructor description. + "This should be green, underlined and bold (Constructor): My test", + //Test nested inline tag in method description. + "This should be green, underlined and bold (Method): My test" + ); } } diff --git a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java index 5f8ae96a16e..44e50e702e1 100644 --- a/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java +++ b/langtools/test/com/sun/javadoc/testNewLanguageFeatures/TestNewLanguageFeatures.java @@ -28,738 +28,612 @@ * language features. Check the output to ensure that the new * language features are properly documented. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestNewLanguageFeatures + * @library ../lib + * @build JavadocTester * @run main TestNewLanguageFeatures */ public class TestNewLanguageFeatures extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-use", "-sourcepath", SRC_DIR, - "pkg", "pkg1", "pkg2" - }; + public static void main(String... args) throws Exception { + TestNewLanguageFeatures tester = new TestNewLanguageFeatures(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = - { - //================================= - // ENUM TESTING - //================================= - //Make sure enum header is correct. - { "pkg/Coin.html", "Enum Coin"}, - //Make sure enum signature is correct. - { "pkg/Coin.html", "
        public enum " +
        -                     "Coin\n" +
        -                     "extends java.lang.Enum<Coin>
        " - }, - //Check for enum constant section - { "pkg/Coin.html", "Enum Constants" + - " "}, - //Detail for enum constant - { "pkg/Coin.html", - "Dime"}, - //Automatically insert documentation for values() and valueOf(). - { "pkg/Coin.html", - "Returns an array containing the constants of this enum type,"}, - { "pkg/Coin.html", - "Returns the enum constant of this type with the specified name"}, - { "pkg/Coin.html", "for (Coin c : Coin.values())"}, - { "pkg/Coin.html", - "Overloaded valueOf() method has correct documentation."}, - { "pkg/Coin.html", - "Overloaded values method has correct documentation."}, + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-use", "-sourcepath", + testSrc, + "pkg", "pkg1", "pkg2"); + checkExit(Exit.OK); - //================================= - // TYPE PARAMETER TESTING - //================================= - //Make sure the header is correct. - { "pkg/TypeParameters.html", - "Class TypeParameters<E>"}, - //Check class type parameters section. - { "pkg/TypeParameters.html", - "
        Type Parameters:
        \n" + - "
        E - " + - "the type parameter for this class."}, - //Type parameters in @see/@link - { "pkg/TypeParameters.html", - "
        \n" + - "
        See Also:
        \n" + - "
        " + - "" + - "TypeParameters
        \n" + - "
        "}, - //Method that uses class type parameter. - { "pkg/TypeParameters.html", - "(E param)"}, - //Method type parameter section. - { "pkg/TypeParameters.html", - "Type Parameters:\n" + - "
        T - This is the first " + - "type parameter.
        \n" + - "
        V - This is the second type " + - "parameter."}, - //Signature of method with type parameters - { "pkg/TypeParameters.html", - "public <T extends java.util.List,V> " + - "java.lang.String[] methodThatHasTypeParameters"}, - //Wildcard testing. - { "pkg/Wildcards.html", - "" + - "TypeParameters<? super java.lang.String> a"}, - { "pkg/Wildcards.html", - "" + - "TypeParameters<? extends java.lang.StringBuffer> b"}, - { "pkg/Wildcards.html", - "" + - "TypeParameters c"}, - //Bad type parameter warnings. - {WARNING_OUTPUT, "warning - @param argument " + - "\"\" is not a type parameter name."}, - {WARNING_OUTPUT, "warning - @param argument " + - "\"\" is not a type parameter name."}, + checkEnums(); + checkTypeParameters(); + checkVarArgs(); + checkAnnotationTypeUsage(); + } - //Signature of subclass that has type parameters. - { "pkg/TypeParameterSubClass.html", - "
        public class TypeParameterSubClass<T extends " +
        -                "java.lang.String>\n" +
        -                "extends " +
        -                "" +
        -                "TypeParameterSuperClass<T>
        "}, + //================================= + // ENUM TESTING + //================================= + void checkEnums() { + checkOutput("pkg/Coin.html", true, + // Make sure enum header is correct. + "Enum Coin", + // Make sure enum signature is correct. + "
        public enum "
        +                + "Coin\n"
        +                + "extends java.lang.Enum<Coin>
        ", + // Check for enum constant section + "Enum Constants" + + " ", + // Detail for enum constant + "Dime", + // Automatically insert documentation for values() and valueOf(). + "Returns an array containing the constants of this enum type,", + "Returns the enum constant of this type with the specified name", + "for (Coin c : Coin.values())", + "Overloaded valueOf() method has correct documentation.", + "Overloaded values method has correct documentation."); - //Interface generic parameter substitution - //Signature of subclass that has type parameters. - { "pkg/TypeParameters.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "SubInterface<E>, SuperInterface<E>
        \n" + - "
        "}, - { "pkg/SuperInterface.html", - "
        \n" + - "
        All Known Subinterfaces:
        \n" + - "
        " + - "SubInterface<V>
        \n" + - "
        "}, - { "pkg/SubInterface.html", - "
        \n" + - "
        All Superinterfaces:
        \n" + - "
        " + - "SuperInterface<V>
        \n" + - "
        "}, + // NO constructor section + checkOutput("pkg/Coin.html", false, + "

        Constructor Summary

        "); + } - //================================= - // VAR ARG TESTING - //================================= - { "pkg/VarArgs.html", "(int... i)"}, - { "pkg/VarArgs.html", "(int[][]... i)"}, - { "pkg/VarArgs.html", "-int:A...-"}, - { "pkg/VarArgs.html", - "" + - "TypeParameters... t"}, + //================================= + // TYPE PARAMETER TESTING + //================================= - //================================= - // ANNOTATION TYPE TESTING - //================================= - //Make sure the summary links are correct. - { "pkg/AnnotationType.html", - "
      • Summary: 
      • \n" + - "
      • Field | 
      • \n" + - "
      • " + - "Required | 
      • \n" + - "
      • " + - "Optional
      • "}, - //Make sure the detail links are correct. - { "pkg/AnnotationType.html", - "
      • Detail: 
      • \n" + - "
      • Field | 
      • \n" + - "
      • Element
      • "}, - //Make sure the heading is correct. - { "pkg/AnnotationType.html", - "Annotation Type AnnotationType"}, - //Make sure the signature is correct. - { "pkg/AnnotationType.html", - "public @interface AnnotationType"}, - //Make sure member summary headings are correct. - { "pkg/AnnotationType.html", - "

        Required Element Summary

        "}, - { "pkg/AnnotationType.html", - "

        Optional Element Summary

        "}, - //Make sure element detail heading is correct - { "pkg/AnnotationType.html", - "Element Detail"}, - //Make sure default annotation type value is printed when necessary. - { "pkg/AnnotationType.html", - "
        \n" + - "
        Default:
        \n" + - "
        \"unknown\"
        \n" + - "
        "}, + void checkTypeParameters() { + checkOutput("pkg/TypeParameters.html", true, + // Make sure the header is correct. + "Class TypeParameters<E>", + // Check class type parameters section. + "
        Type Parameters:
        \n" + + "
        E - " + + "the type parameter for this class.", + // Type parameters in @see/@link + "
        \n" + + "
        See Also:
        \n" + + "
        " + + "" + + "TypeParameters
        \n" + + "
        ", + // Method that uses class type parameter. + "(E param)", + // Method type parameter section. + "Type Parameters:\n" + + "
        T - This is the first " + + "type parameter.
        \n" + + "
        V - This is the second type " + + "parameter.", + // Signature of method with type parameters + "public <T extends java.util.List,V> " + + "java.lang.String[] methodThatHasTypeParameters"); - //================================= - // ANNOTATION TYPE USAGE TESTING - //================================= + checkOutput("pkg/Wildcards.html", true, + // Wildcard testing. + "" + + "TypeParameters<? super java.lang.String> a", + "" + + "TypeParameters<? extends java.lang.StringBuffer> b", + "" + + "TypeParameters c"); - //PACKAGE - { "pkg/package-summary.html", - "@AnnotationType(optional=\"Package Annotation\",\n" + - " required=1994)"}, + checkOutput(Output.WARNING, true, + // Bad type parameter warnings. + "warning - @param argument " + + "\"\" is not a type parameter name.", + "warning - @param argument " + + "\"\" is not a type parameter name."); - //CLASS - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Class Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public class " +
        -                "AnnotationTypeUsage\n" +
        -                "extends java.lang.Object
        "}, + // Signature of subclass that has type parameters. + checkOutput("pkg/TypeParameterSubClass.html", true, + "
        public class TypeParameterSubClass<T extends "
        +                + "java.lang.String>\n"
        +                + "extends "
        +                + ""
        +                + "TypeParameterSuperClass<T>
        "); - //FIELD - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Field Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public int field
        "}, + // Interface generic parameter substitution + // Signature of subclass that has type parameters. + checkOutput("pkg/TypeParameters.html", true, + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "SubInterface<E>, SuperInterface<E>
        \n" + + "
        "); - //CONSTRUCTOR - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Constructor Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public AnnotationTypeUsage()
        "}, + checkOutput("pkg/SuperInterface.html", true, + "
        \n" + + "
        All Known Subinterfaces:
        \n" + + "
        " + + "SubInterface<V>
        \n" + + "
        "); + checkOutput("pkg/SubInterface.html", true, + "
        \n" + + "
        All Superinterfaces:
        \n" + + "
        " + + "SuperInterface<V>
        \n" + + "
        "); - //METHOD - { "pkg/AnnotationTypeUsage.html", - "
        @AnnotationType(" +
        -                "optional" +
        -                "=\"Method Annotation\",\n" +
        -                "                " +
        -                "required=1994)\n" +
        -                "public void method()
        "}, + //============================================================== + // Handle multiple bounds. + //============================================================== + checkOutput("pkg/MultiTypeParameters.html", true, + "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"); - //METHOD PARAMS - { "pkg/AnnotationTypeUsage.html", - "
        public void methodWithParams(" +
        -                "" +
        -                "@AnnotationType(" +
        -                "optional=\"Parameter Annotation\",required=1994)\n" +
        -                "                             int documented,\n" +
        -                "                             int undocmented)
        "}, + //============================================================== + // Test Class-Use Documentation for Type Parameters. + //============================================================== + // ClassUseTest1: + checkOutput("pkg2/class-use/Foo.html", true, + "Classes in pkg2 with type parameters of " + + "type " + + "Foo ", + "ClassUseTest1<T extends " + + "Foo" + + " & " + + "Foo2> ", + "Methods in pkg2 with type parameters of " + + "type Foo ", + "ClassUseTest1." + + "method" + + "(T t) ", + "Fields in pkg2 with type parameters of " + + "type " + + "Foo ", + "td class=\"colFirst\">ParamTest" + + "<Foo>" + ); - //CONSTRUCTOR PARAMS - { "pkg/AnnotationTypeUsage.html", - "
        public AnnotationTypeUsage(" +
        -                "@AnnotationType(" +
        -                "optional=\"Constructor Param Annotation\",required=1994)\n" +
        -                "                           int documented,\n" +
        -                "                           int undocmented)
        "}, + checkOutput("pkg2/class-use/ParamTest.html", true, + "Fields in pkg2 declared as ParamTest" + + " ", + "ParamTest<Foo>" + ); - //================================= - // ANNOTATION TYPE USAGE TESTING (All Different Types). - //================================= + checkOutput("pkg2/class-use/Foo2.html", true, + "Classes in pkg2 with type parameters of " + + "type Foo2 " + + "", + "ClassUseTest1<T extends " + + "Foo" + + " & " + + "Foo2> ", + "Methods in pkg2 with type parameters of " + + "type Foo2 " + + "", + "" + + "ClassUseTest1.method" + + "(T t) " + ); - //Integer - { "pkg1/B.html", - "d=3.14,"}, + // ClassUseTest2: > + checkOutput("pkg2/class-use/ParamTest.html", true, + "Classes in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "ClassUseTest2<T extends " + + "" + + "ParamTest<" + + "Foo3>> ", + "Methods in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "ClassUseTest2." + + "method" + + "(T t) ", + "Fields in pkg2 declared as ParamTest" + + " ", + "ParamTest" + + "<" + + "Foo>", + "Methods in pkg2 with type parameters of " + + "type ParamTest" + + " ", + "<T extends ParamTest" + + "<Foo3>>
        ParamTest" + + "<Foo3>
        " + ); - //Double - { "pkg1/B.html", - "d=3.14,"}, + checkOutput("pkg2/class-use/Foo3.html", true, + "Classes in pkg2 with type parameters of " + + "type " + + "Foo3 ", + "ClassUseTest2<T extends " + + "" + + "ParamTest<" + + "Foo3>> ", + "Methods in pkg2 with type parameters of " + + "type Foo3 " + + "", + "ClassUseTest2." + + "method" + + "(T t) ", + "Methods in pkg2 that return types with " + + "arguments of type Foo3" + + " ", + "<T extends ParamTest<" + + "Foo3" + + ">>
        ParamTest<Foo3>
        " + ); - //Boolean - { "pkg1/B.html", - "b=true,"}, + // ClassUseTest3: >> + checkOutput("pkg2/class-use/ParamTest2.html", true, + "Classes in pkg2 with type parameters of " + + "type ParamTest2" + + " ", + "ClassUseTest3<T extends " + + "" + + "ParamTest2<java.util.List<? extends " + + "" + + "Foo4>>> ", + "Methods in pkg2 with type parameters of " + + "type ParamTest2" + + " ", + "ClassUseTest3" + + ".method(T t) ", + "<T extends " + + "ParamTest2<java.util.List<? extends Foo4>" + + ">>
        ParamTest2<java.util.List" + + "<? extends Foo4>>
        " + ); - //String - { "pkg1/B.html", - "s=\"sigh\","}, + checkOutput("pkg2/class-use/Foo4.html", true, + "Classes in pkg2 with type parameters of " + + "type Foo4 " + + "", + "ClassUseTest3<T extends " + + "" + + "ParamTest2<java.util.List<? extends " + + "" + + "Foo4>>> ", + "Methods in pkg2 with type parameters of " + + "type Foo4 ", + "ClassUseTest3." + + "method(T t)" + + " ", + "Methods in pkg2 that return types with " + + "arguments of type Foo4 ", + "<T extends " + + "ParamTest2<java.util.List<? extends Foo4>" + + ">>
        ParamTest2<java.util.List" + + "<? extends Foo4>>
        " + ); - //Class - { "pkg1/B.html", - "c=Foo.class,"}, + // Type parameters in constructor and method args + checkOutput("pkg2/class-use/Foo4.html", true, + "Method parameters in pkg2 with type arguments of " + + "type Foo4 " + + "\n" + + "\n" + + "Modifier and Type\n" + + "Method and Description\n" + + "\n" + + "\n" + + "\n" + + "void\n" + + "ClassUseTest3." + + "method(java." + + "util.Set<Foo4> p) \n" + + "\n" + + "", + "Constructor parameters in pkg2 with type arguments " + + "of type Foo4 " + + "" + ); - //Bounded Class - { "pkg1/B.html", - "w=TypeParameterSubClass.class,"}, - - //Enum - { "pkg1/B.html", - "e=Penny,"}, - - //Annotation Type - { "pkg1/B.html", - "a=@AnnotationType(optional=\"foo\",required=1994),"}, - - //String Array - { "pkg1/B.html", - "sa={\"up\",\"down\"},"}, - - //Primitive - { "pkg1/B.html", - "primitiveClassTest=boolean.class,"}, - - //XXX: Add array test case after this if fixed: - //5020899: Incorrect internal representation of class-valued annotation elements - - //Make sure that annotations are surrounded by
         and 
        - { "pkg1/B.html", - "
        @A"},
        -            { "pkg1/B.html",
        -                "public interface B
        "}, - - - //============================================================== - // Handle multiple bounds. - //============================================================== - { "pkg/MultiTypeParameters.html", - "public <T extends java.lang.Number & java.lang.Runnable> T foo(T t)"}, - - //============================================================== - // Test Class-Use Documenation for Type Parameters. - //============================================================== - - //ClassUseTest1: - { "pkg2/class-use/Foo.html", - "Classes in pkg2 with type parameters of " + - "type " + - "Foo " - }, - { "pkg2/class-use/Foo.html", - "ClassUseTest1<T extends " + - "Foo" + - " & " + - "Foo2> " - }, - { "pkg2/class-use/Foo.html", - "Methods in pkg2 with type parameters of " + - "type Foo " - }, - { "pkg2/class-use/Foo.html", - "ClassUseTest1." + - "method" + - "(T t) " - }, - { "pkg2/class-use/Foo.html", - "Fields in pkg2 with type parameters of " + - "type " + - "Foo " - }, - { "pkg2/class-use/Foo.html", - "td class=\"colFirst\">ParamTest" + - "<Foo>" - }, - - { "pkg2/class-use/ParamTest.html", - "Fields in pkg2 declared as ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ParamTest<Foo>" - }, - - { "pkg2/class-use/Foo2.html", - "Classes in pkg2 with type parameters of " + - "type Foo2 " + - "" - }, - { "pkg2/class-use/Foo2.html", - "ClassUseTest1<T extends " + - "Foo" + - " & " + - "Foo2> " - }, - { "pkg2/class-use/Foo2.html", - "Methods in pkg2 with type parameters of " + - "type Foo2 " + - "" - }, - { "pkg2/class-use/Foo2.html", - "" + - "ClassUseTest1.method" + - "(T t) " - }, - - //ClassUseTest2: > - { "pkg2/class-use/ParamTest.html", - "Classes in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ClassUseTest2<T extends " + - "" + - "ParamTest<" + - "Foo3>> " - }, - { "pkg2/class-use/ParamTest.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ClassUseTest2." + - "method" + - "(T t) " - }, - { "pkg2/class-use/ParamTest.html", - "Fields in pkg2 declared as ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "ParamTest" + - "<" + - "Foo>" - }, - { "pkg2/class-use/ParamTest.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest" + - " " - }, - { "pkg2/class-use/ParamTest.html", - "<T extends ParamTest" + - "<Foo3>>
        ParamTest" + - "<Foo3>
        " - }, - - { "pkg2/class-use/Foo3.html", - "Classes in pkg2 with type parameters of " + - "type " + - "Foo3 " - }, - { "pkg2/class-use/Foo3.html", - "ClassUseTest2<T extends " + - "" + - "ParamTest<" + - "Foo3>> " - }, - { "pkg2/class-use/Foo3.html", - "Methods in pkg2 with type parameters of " + - "type Foo3 " + - "" - }, - { "pkg2/class-use/Foo3.html", - "ClassUseTest2." + - "method" + - "(T t) " - }, - { "pkg2/class-use/Foo3.html", - "Methods in pkg2 that return types with " + - "arguments of type Foo3" + - " " - }, - { "pkg2/class-use/Foo3.html", - "<T extends ParamTest<" + - "Foo3" + - ">>
        ParamTest<Foo3>
        " - }, - - //ClassUseTest3: >> - { "pkg2/class-use/ParamTest2.html", - "Classes in pkg2 with type parameters of " + - "type ParamTest2" + - " " - }, - { "pkg2/class-use/ParamTest2.html", - "ClassUseTest3<T extends " + - "" + - "ParamTest2<java.util.List<? extends " + - "" + - "Foo4>>> " - }, - { "pkg2/class-use/ParamTest2.html", - "Methods in pkg2 with type parameters of " + - "type ParamTest2" + - " " - }, - { "pkg2/class-use/ParamTest2.html", - "ClassUseTest3" + - ".method(T t) " - }, - { "pkg2/class-use/ParamTest2.html", - "<T extends " + - "ParamTest2<java.util.List<? extends Foo4>" + - ">>
        ParamTest2<java.util.List" + - "<? extends Foo4>>
        " - }, - - { "pkg2/class-use/Foo4.html", - "Classes in pkg2 with type parameters of " + - "type Foo4 " + - "" - }, - { "pkg2/class-use/Foo4.html", - "ClassUseTest3<T extends " + - "" + - "ParamTest2<java.util.List<? extends " + - "" + - "Foo4>>> " - }, - { "pkg2/class-use/Foo4.html", - "Methods in pkg2 with type parameters of " + - "type Foo4 " - }, - { "pkg2/class-use/Foo4.html", - "ClassUseTest3." + - "method(T t)" + - " " - }, - { "pkg2/class-use/Foo4.html", - "Methods in pkg2 that return types with " + - "arguments of type Foo4 " - }, - { "pkg2/class-use/Foo4.html", - "<T extends " + - "ParamTest2<java.util.List<? extends Foo4>" + - ">>
        ParamTest2<java.util.List" + - "<? extends Foo4>>
        " - }, - - //Type parameters in constructor and method args - { "pkg2/class-use/Foo4.html", - "Method parameters in pkg2 with type arguments of " + - "type Foo4 " + - "\n" + - "\n" + - "Modifier and Type\n" + - "Method and Description\n" + - "\n" + - "\n" + - "\n" + - "void\n" + - "ClassUseTest3." + - "method(java." + - "util.Set<Foo4> p) \n" + - "\n" + - "" - }, - { "pkg2/class-use/Foo4.html", - "Constructor parameters in pkg2 with type arguments " + - "of type Foo4 " + - "" - }, - - //================================= - // Annotatation Type Usage - //================================= - { "pkg/class-use/AnnotationType.html", - "Packages with annotations of type " + - "AnnotationType " + - "" - }, - - { "pkg/class-use/AnnotationType.html", - "Classes in pkg with annotations of type " + - "AnnotationType " - }, - - { "pkg/class-use/AnnotationType.html", - "Fields in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Methods in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Method parameters in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Constructors in pkg with annotations of type " + - "AnnotationType" + - " " - }, - - { "pkg/class-use/AnnotationType.html", - "Constructor parameters in pkg with annotations of " + - "type AnnotationType " - }, - - //================================= - // TYPE PARAMETER IN INDEX - //================================= - { "index-all.html", - "" + - "method(Vector<Object>)" - }, - //================================= - // TYPE PARAMETER IN INDEX - //================================= - { "index-all.html", - "" + - "method(Vector<Object>)" - }, - }; - private static final String[][] NEGATED_TEST = { //================================= - // ENUM TESTING + // TYPE PARAMETER IN INDEX //================================= - //NO constructor section - { "pkg/Coin.html", "

        Constructor Summary

        "}, + checkOutput("index-all.html", true, + "" + + "method(Vector<Object>)" + ); + + // TODO: duplicate of previous case; left in delibarately for now to simplify comparison testing //================================= - // TYPE PARAMETER TESTING + // TYPE PARAMETER IN INDEX //================================= - //No type parameters in class frame. - { "allclasses-frame.html", - "" + - "TypeParameters<E>" - }, + checkOutput("index-all.html", true, + "" + + "method(Vector<Object>)" + ); + + // No type parameters in class frame. + checkOutput("allclasses-frame.html", false, + "" + + "TypeParameters<E>" + ); + + } + + //================================= + // VAR ARG TESTING + //================================= + void checkVarArgs() { + checkOutput("pkg/VarArgs.html", true, + "(int... i)", + "(int[][]... i)", + "-int:A...-", + "" + + "TypeParameters... t"); + } + + //================================= + // ANNOTATION TYPE TESTING + //================================= + void checkAnnotationTypes() { + checkOutput("pkg/AnnotationType.html", true, + // Make sure the summary links are correct. + "
      • Summary: 
      • \n" + + "
      • Field | 
      • \n" + + "
      • " + + "Required | 
      • \n" + + "
      • " + + "Optional
      • ", + // Make sure the detail links are correct. + "
      • Detail: 
      • \n" + + "
      • Field | 
      • \n" + + "
      • Element
      • ", + // Make sure the heading is correct. + "Annotation Type AnnotationType", + // Make sure the signature is correct. + "public @interface AnnotationType", + // Make sure member summary headings are correct. + "

        Required Element Summary

        ", + "

        Optional Element Summary

        ", + // Make sure element detail heading is correct + "Element Detail", + // Make sure default annotation type value is printed when necessary. + "
        \n" + + "
        Default:
        \n" + + "
        \"unknown\"
        \n" + + "
        "); + } + + //================================= + // ANNOTATION TYPE USAGE TESTING + //================================= + void checkAnnotationTypeUsage() { + checkOutput("pkg/package-summary.html", true, + // PACKAGE + "@AnnotationType(optional=\"Package Annotation\",\n" + + " required=1994)"); + + checkOutput("pkg/AnnotationTypeUsage.html", true, + // CLASS + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Class Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public class "
        +                + "AnnotationTypeUsage\n"
        +                + "extends java.lang.Object
        ", + // FIELD + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Field Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public int field
        ", + // CONSTRUCTOR + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Constructor Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public AnnotationTypeUsage()
        ", + // METHOD + "
        @AnnotationType("
        +                + "optional"
        +                + "=\"Method Annotation\",\n"
        +                + "                "
        +                + "required=1994)\n"
        +                + "public void method()
        ", + // METHOD PARAMS + "
        public void methodWithParams("
        +                + ""
        +                + "@AnnotationType("
        +                + "optional=\"Parameter Annotation\",required=1994)\n"
        +                + "                             int documented,\n"
        +                + "                             int undocmented)
        ", + // CONSTRUCTOR PARAMS + "
        public AnnotationTypeUsage("
        +                + "@AnnotationType("
        +                + "optional=\"Constructor Param Annotation\",required=1994)\n"
        +                + "                           int documented,\n"
        +                + "                           int undocmented)
        "); + + //================================= + // Annotatation Type Usage + //================================= + checkOutput("pkg/class-use/AnnotationType.html", true, + "Packages with annotations of type " + + "AnnotationType " + + "", + "Classes in pkg with annotations of type " + + "AnnotationType ", + "Fields in pkg with annotations of type " + + "AnnotationType" + + " ", + "Methods in pkg with annotations of type " + + "AnnotationType" + + " ", + "Method parameters in pkg with annotations of type " + + "AnnotationType" + + " ", + "Constructors in pkg with annotations of type " + + "AnnotationType" + + " ", + "Constructor parameters in pkg with annotations of " + + "type AnnotationType " + ); //============================================================== // ANNOTATION TYPE USAGE TESTING (When @Documented is omitted) //=============================================================== - - //CLASS - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Class Annotation\",\n" + - " required=1994)\n" + - "public class AnnotationTypeUsage
        extends java.lang.Object
        "}, - - //FIELD - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Field Annotation\",\n" + - " required=1994)\n" + - "public int field"}, - - //CONSTRUCTOR - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Constructor Annotation\",\n" + - " required=1994)\n" + - "public AnnotationTypeUsage()"}, - - //METHOD - { "pkg/AnnotationTypeUsage.html", - "@AnnotationTypeUndocumented(optional=\"Method Annotation\",\n" + - " required=1994)\n" + - "public void method()"}, + checkOutput("pkg/AnnotationTypeUsage.html", false, + // CLASS + "@AnnotationTypeUndocumented(optional=\"Class Annotation\",\n" + + " required=1994)\n" + + "public class AnnotationTypeUsage
        extends java.lang.Object
        ", + // FIELD + "@AnnotationTypeUndocumented(optional=\"Field Annotation\",\n" + + " required=1994)\n" + + "public int field", + // CONSTRUCTOR + "@AnnotationTypeUndocumented(optional=\"Constructor Annotation\",\n" + + " required=1994)\n" + + "public AnnotationTypeUsage()", + // METHOD + "@AnnotationTypeUndocumented(optional=\"Method Annotation\",\n" + + " required=1994)\n" + + "public void method()"); //================================= // Make sure annotation types do not // trigger this warning. //================================= - {WARNING_OUTPUT, - "Internal error: package sets don't match: [] with: null" - }, - }; + checkOutput(Output.WARNING, false, + "Internal error: package sets don't match: [] with: null"); + + //================================= + // ANNOTATION TYPE USAGE TESTING (All Different Types). + //================================= + checkOutput("pkg1/B.html", true, + // Integer + "d=3.14,", + // Double + "d=3.14,", + // Boolean + "b=true,", + // String + "s=\"sigh\",", + // Class + "c=Foo.class,", + // Bounded Class + "w=TypeParameterSubClass.class,", + // Enum + "e=Penny,", + // Annotation Type + "a=@AnnotationType(optional=\"foo\",required=1994),", + // String Array + "sa={\"up\",\"down\"},", + // Primitive + "primitiveClassTest=boolean.class,"); + + // XXX: Add array test case after this if fixed: + //5020899: Incorrect internal representation of class-valued annotation elements + // Make sure that annotations are surrounded by
         and 
        + checkOutput("pkg1/B.html", true, + "
        @A",
        +                "public interface B
        "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestNewLanguageFeatures tester = new TestNewLanguageFeatures(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); } + } diff --git a/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java b/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java index aaefc7f9383..5e0ff72730e 100644 --- a/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java +++ b/langtools/test/com/sun/javadoc/testNoPackagesFile/TestNoPackagesFile.java @@ -27,31 +27,26 @@ * @summary Verify that packages.html is no longer generated since it is no * longer used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNoPackagesFile * @run main TestNoPackagesFile */ public class TestNoPackagesFile extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNoPackagesFile tester = new TestNoPackagesFile(); - tester.run(ARGS, NO_TEST, NO_TEST); - if ((new java.io.File(OUTPUT_DIR + "/packages.html")).exists()) { - throw new Error("Test Fails: packages file should not be " + "generated anymore."); - } else { - System.out.println("Test passes: packages.html not found."); - } + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + // packages.html file should not be generated anymore. + checkFiles(false, "packages.html"); } } diff --git a/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java b/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java index af25ad1823c..ef809e96074 100644 --- a/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java +++ b/langtools/test/com/sun/javadoc/testNonFrameWarning/TestNonFrameWarning.java @@ -26,31 +26,28 @@ * @bug 7001086 * @summary Test Non-frame warning. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestNonFrameWarning + * @library ../lib + * @build JavadocTester * @run main TestNonFrameWarning */ public class TestNonFrameWarning extends JavadocTester { - private static final String[][] TEST = { - { "index.html", - "

        This document is designed to be viewed using the frames feature. " + - "If you see this message, you are using a non-frame-capable web client. " + - "Link to Non-frame version.

        " - } - }; - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNonFrameWarning tester = new TestNonFrameWarning(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("index.html", true, + "

        This document is designed to be viewed using the frames feature. " + + "If you see this message, you are using a non-frame-capable web client. " + + "Link to Non-frame version.

        "); } } diff --git a/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java b/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java index ab0b9a0987d..7f895d12624 100644 --- a/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java +++ b/langtools/test/com/sun/javadoc/testNotifications/TestNotifications.java @@ -28,50 +28,43 @@ * be created. * Make sure classname is not include in javadoc usage message. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestNotifications * @run main TestNotifications */ public class TestNotifications extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[] ARGS2 = new String[] { - "-help" - }; - - //Input for string search tests. - private static final String[][] TEST = { - {NOTICE_OUTPUT, "Creating destination directory: \"" + OUTPUT_DIR} - }; - private static final String[][] NEGATED_TEST = { - {NOTICE_OUTPUT, "Creating destination directory: \"" + OUTPUT_DIR} - }; - - private static final String[][] NEGATED_TEST2 = { - {NOTICE_OUTPUT, "[classnames]"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestNotifications tester = new TestNotifications(); + tester.runTests(); + } + + @Test + void test1() { + String outDir = "out"; + // Notify that the destination directory must be created. - tester.run(ARGS, TEST, NO_TEST); + javadoc("-d", outDir, "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); + checkOutput(Output.NOTICE, true, + "Creating destination directory: \"" + outDir); + // No need to notify that the destination must be created because // it already exists. - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NONE); - tester.run(ARGS, NO_TEST, NEGATED_TEST); - tester.setCheckOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + setOutputDirectoryCheck(DirectoryCheck.NONE); + javadoc("-d", outDir, "-sourcepath", testSrc, "pkg"); + checkExit(Exit.OK); + checkOutput(Output.NOTICE, false, + "Creating destination directory: \"" + outDir); + } + + @Test + void test() { //Make sure classname is not include in javadoc usage message. - tester.run(ARGS2, NO_TEST, NEGATED_TEST2); - tester.printSummary(); + setOutputDirectoryCheck(DirectoryCheck.NO_HTML_FILES); + javadoc("-help"); + checkOutput(Output.NOTICE, false, + "[classnames]"); } } diff --git a/langtools/test/com/sun/javadoc/testOptions/TestOptions.java b/langtools/test/com/sun/javadoc/testOptions/TestOptions.java index 3a8ecbc58d6..80c83efbdb0 100644 --- a/langtools/test/com/sun/javadoc/testOptions/TestOptions.java +++ b/langtools/test/com/sun/javadoc/testOptions/TestOptions.java @@ -26,34 +26,30 @@ * @bug 4749567 * @summary Test the output for -header and -footer options. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestOptions + * @library ../lib + * @build JavadocTester * @run main TestOptions */ public class TestOptions extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-header", "Test header", "-footer", "Test footer", - "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[][] TEST = { - { "pkg/package-summary.html", - "
        Test header
        "}, - { "pkg/package-summary.html", - "
        Test footer
        "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestOptions tester = new TestOptions(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-header", "Test header", + "-footer", "Test footer", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/package-summary.html", true, + "
        Test header
        ", + "
        Test footer
        "); } } diff --git a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java index a10d96f613c..29286329ac2 100644 --- a/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java +++ b/langtools/test/com/sun/javadoc/testOrdering/TestOrdering.java @@ -23,113 +23,115 @@ /* * @test - * @bug 8039410 + * @bug 8039410 8042601 * @summary test to determine if members are ordered correctly * @author ksrini * @library ../lib/ * @build JavadocTester - * @build TestOrdering * @run main TestOrdering */ -import java.util.regex.Matcher; -import java.util.regex.Pattern; - public class TestOrdering extends JavadocTester { - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ + public static void main(String[] args) throws Exception { TestOrdering tester = new TestOrdering(); - // test unnamed packages - String[] ARGS = { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", - SRC_DIR + "/C.java", SRC_DIR + "/UsedInC.java" - }; - tester.runJavadoc(ARGS); - checkExecutableMemberOrdering(tester.readFileToString("class-use/UsedInC.html")); - - // next test using packages - String[] ARGS1 = { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "-use", - "pkg1" - }; - tester.runJavadoc(ARGS1); - checkClassUseOrdering(tester.readFileToString("pkg1/class-use/UsedClass.html")); - checkIndexPathOrdering(tester.readFileToString("index-all.html")); + tester.runTests(); } - static void checkExecutableMemberOrdering(String usePage) { + @Test + void testUnnamedPackages() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + testSrc("C.java"), testSrc("UsedInC.java")); + checkExit(Exit.OK); + checkExecutableMemberOrdering("class-use/UsedInC.html"); + } + + @Test + void testNamedPackages() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-use", + "pkg1"); + checkExit(Exit.OK); + checkClassUseOrdering("pkg1/class-use/UsedClass.html"); + checkIndexPathOrdering("index-all.html"); + } + + void checkExecutableMemberOrdering(String usePage) { + String contents = readFile(usePage); // check constructors - int idx1 = usePage.indexOf("C.html#C-UsedInC"); - int idx2 = usePage.indexOf("C.html#C-UsedInC-int"); - int idx3 = usePage.indexOf("C.html#C-UsedInC-java.lang.String"); + checking("constructors"); + int idx1 = contents.indexOf("C.html#C-UsedInC"); + int idx2 = contents.indexOf("C.html#C-UsedInC-int"); + int idx3 = contents.indexOf("C.html#C-UsedInC-java.lang.String"); if (idx1 == -1 || idx2 == -1 || idx3 == -1) { - throw new Error("ctor strings not found"); - } - if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { - throw new Error("ctor strings are out of order"); - } + failed("ctor strings not found"); + } else if (idx1 > idx2 || idx2 > idx3 || idx1 > idx3) { + failed("ctor strings are out of order"); + } else + passed("ctor strings are in order"); // check methods - idx1 = usePage.indexOf("C.html#ymethod-int"); - idx2 = usePage.indexOf("C.html#ymethod-java.lang.String"); + checking("methods"); + idx1 = contents.indexOf("C.html#ymethod-int"); + idx2 = contents.indexOf("C.html#ymethod-java.lang.String"); if (idx1 == -1 || idx2 == -1) { - throw new Error("#ymethod strings not found"); - } - if (idx1 > idx2) { - throw new Error("#ymethod strings are out of order"); - } - System.out.println("Executable Member Ordering: OK"); + failed("#ymethod strings not found"); + } else if (idx1 > idx2) { + failed("#ymethod strings are out of order"); + } else + passed("Executable Member Ordering: OK"); } - static void checkClassUseOrdering(String usePage) { + void checkClassUseOrdering(String usePage) { checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zfield"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#fieldInC#ITERATION#"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#zmethod-pkg1.UsedClass"); checkClassUseOrdering(usePage, "pkg1/C#ITERATION#.html#methodInC#ITERATION#"); } - static void checkClassUseOrdering(String usePage, String searchString) { + void checkClassUseOrdering(String usePage, String searchString) { + String contents = readFile(usePage); int lastidx = 0; System.out.println("testing for " + searchString); for (int i = 1; i < 5; i++) { String s = searchString.replaceAll("#ITERATION#", Integer.toString(i)); - System.out.println(s); - int idx = usePage.indexOf(s); + checking(s); + int idx = contents.indexOf(s); if (idx < lastidx) { - throw new Error(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + failed(s + ", member ordering error, last:" + lastidx + ", got:" + idx); + } else { + passed("\tlast: " + lastidx + " got:" + idx); } - System.out.println("\tlast: " + lastidx + " got:" + idx); lastidx = idx; } } - static void checkIndexPathOrdering(String indexPage) { - String[] OrderedExpectedStrings = { - "pkg1/UsedClass.html#add-java.lang.Double", - "pkg1/ZZTop.html#add-double", - "pkg1/ZZTop.html#add-java.lang.Double", - "pkg1/UsedClass.html#add-float", - "pkg1/ZZTop.html#add-float", - "pkg1/UsedClass.html#add-int", - "pkg1/ZZTop.html#add-int", - "pkg1/UsedClass.html#add-java.lang.Integer", - "pkg1/ZZTop.html#add-java.lang.Integer", - "pkg1/UsedClass.html#add-double-double", - "pkg1/UsedClass.html#add-double-java.lang.Double", - "pkg1/ZZTop.html#add-double-double", - "pkg1/ZZTop.html#add-double-java.lang.Double" - }; - int lastidx = 0; - for (String x : OrderedExpectedStrings) { - int idx = indexPage.indexOf(x); - if (idx < lastidx) { - throw new Error(x + ", index is out of order, last:" + lastidx + ", got:" + idx); - } - System.out.println(x + ": OK"); - lastidx = idx; - } + void checkIndexPathOrdering(String indexPage) { + checkOrder(indexPage, + "pkg1/UsedClass.html#add--", + "pkg1/ZZTop.html#add--", + "pkg1/UsedClass.html#add-double-", + "pkg1/UsedClass.html#add-java.lang.Double-", + "pkg1/ZZTop.html#add-double-", + "pkg1/ZZTop.html#add-java.lang.Double-", + "pkg1/UsedClass.html#add-double-byte-", + "pkg1/ZZTop.html#add-double-byte-", + "pkg1/UsedClass.html#add-double-double-", + "pkg1/UsedClass.html#add-double-java.lang.Double-", + "pkg1/ZZTop.html#add-double-double-", + "pkg1/ZZTop.html#add-double-java.lang.Double-", + "pkg1/UsedClass.html#add-float-", + "pkg1/ZZTop.html#add-float-", + "pkg1/UsedClass.html#add-float-int-", + "pkg1/ZZTop.html#add-float-int-", + "pkg1/UsedClass.html#add-int-", + "pkg1/ZZTop.html#add-int-", + "pkg1/UsedClass.html#add-int-float-", + "pkg1/ZZTop.html#add-int-float-", + "pkg1/UsedClass.html#add-java.lang.Integer-", + "pkg1/ZZTop.html#add-java.lang.Integer-"); } } diff --git a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java index d8311d60979..020dd7bb031 100644 --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java +++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/UsedClass.java @@ -26,36 +26,41 @@ package pkg1; * For index and class-use testing */ public class UsedClass { - // This is the exact order we expect to see /** - * @param i param + * just an empty param method. */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} + public void add(){} /** * @param d param */ public void add(double d){} + /** + * @param i param + * @param f param + */ + public void add(int i, float f){} + + /** + * @param f param + * @param i param + */ + public void add(float f, int i){} + + /** + * @param d param + * @param b param + */ + public void add(double d, byte b){} + /** * @param d param * @return Double */ public Double add(Double d) {return (double) 22/7;} - /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} - /** * @param d1 param * @param d2 param @@ -69,4 +74,21 @@ public class UsedClass { * @return double */ public double add(double d1, Double d2) {return d1 + d2;} + + /** + * @param f param + * @return Float + */ + public Float add(float f) {return (float) 22/7;} + + /** + * @param i param + */ + public void add(int i){} + + /** + * @param i param + * @return double + */ + public int add(Integer i) {return 0;} } diff --git a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java b/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java index 4b39384b2de..6ad1cb4aa84 100644 --- a/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java +++ b/langtools/test/com/sun/javadoc/testOrdering/pkg1/ZZTop.java @@ -26,35 +26,41 @@ package pkg1; * For index testing only */ public class ZZTop { - // This is the exact order we expect to see /** - * @param i param + * just an empty param method. */ - public void add(int i){} - - /** - * @param i param - * @return double - */ - public int add(Integer i) {return 0;} + public void add(){} /** * @param d param */ public void add(double d){} + /** + * @param i param + * @param f param + */ + public void add(int i, float f){} + + /** + * @param f param + * @param i param + */ + public void add(float f, int i){} + + /** + * @param d param + * @param b param + */ + public void add(double d, byte b){} + /** * @param d param * @return Double */ public Double add(Double d) {return (double) 22/7;} - /** - * @param f param - * @return Float - */ - public Float add(float f) {return (float) 22/7;} /** * @param d1 param * @param d2 param @@ -68,4 +74,21 @@ public class ZZTop { * @return double */ public double add(double d1, Double d2) {return d1 + d2;} + + /** + * @param f param + * @return Float + */ + public Float add(float f) {return (float) 22/7;} + + /** + * @param i param + */ + public void add(int i){} + + /** + * @param i param + * @return double + */ + public int add(Integer i) {return 0;} } diff --git a/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java b/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java index c38c09c51d7..3bd70294602 100644 --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestMultiInheritence.java @@ -27,59 +27,54 @@ * @summary Make sure that all inherited methods from multiple extended * interfaces are documented * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestMultiInheritence * @run main TestMultiInheritence */ +// TODO: should be TestMultiInheritance public class TestMultiInheritence extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg3" - }; - - //Method foo() is inherited from BOTH I2 and I3 - private static final String[][] TEST = { - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I2"}, - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I3"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I2"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I3"}, - }; - - //Method foo() is NOT inherited from I4 because it is overriden by - //I3. - private static final String[][] NEGATED_TEST = { - { "pkg3/I1.html", - "Methods inherited from interface pkg3." + - "" + - "I4"}, - { "pkg3/I0.html", - "Methods inherited from interface pkg3." + - "" + - "I4"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestMultiInheritence tester = new TestMultiInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg3"); + checkExit(Exit.OK); + + // Method foo() is inherited from BOTH I2 and I3 + + checkOutput("pkg3/I1.html", true, + "Methods inherited from interface pkg3." + + "" + + "I2", + "Methods inherited from interface pkg3." + + "" + + "I3"); + + checkOutput("pkg3/I0.html", true, + "Methods inherited from interface pkg3." + + "" + + "I2", + "Methods inherited from interface pkg3." + + "" + + "I3"); + + // Method foo() is NOT inherited from I4 because it is overriden by I3. + + checkOutput("pkg3/I1.html", false, + "Methods inherited from interface pkg3." + + "" + + "I4"); + + checkOutput("pkg3/I0.html", false, + "Methods inherited from interface pkg3." + + "" + + "I4"); } } diff --git a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java index cd24cfa991d..4a582a5bb79 100644 --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenMethodDocCopy.java @@ -27,35 +27,32 @@ * @summary Inherited comment should link directly to member, not just * class * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenMethodDocCopy * @run main TestOverridenMethodDocCopy */ public class TestOverridenMethodDocCopy extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/SubClass.html", - "Description copied from class: " + - "" + - "BaseClass" - } - }; - /** * The entry point of the test. * @param args the array of command line arguments. */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestOverridenMethodDocCopy tester = new TestOverridenMethodDocCopy(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg1/SubClass.html", true, + "Description copied from class: " + + "" + + "BaseClass"); } } diff --git a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java index 71869cb1434..cc76c074c4a 100644 --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethods.java @@ -27,61 +27,50 @@ * @summary Determine if overriden methods are properly documented when * -protected (default) visibility flag is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenPrivateMethods * @run main TestOverridenPrivateMethods */ public class TestOverridenPrivateMethods extends JavadocTester { - private static final String[][] TEST = { - //The public method should be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + - "
        " + - "publicMethod in class " + - "BaseClass
        "}, - - //The public method in different package should be overriden - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        " + - "publicMethod in class " + - "BaseClass
        "}, - - //The package private method should be overriden since the base and sub class are in the same - //package. - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        " + - "packagePrivateMethod in class " + - "BaseClass
        "} - }; - - private static final String[][] NEGATED_TEST = { - - //The private method in should not be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, - - //The private method in different package should not be overriden - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, - - //The package private method should not be overriden since the base and sub class are in - //different packages. - { "pkg2/SubClass.html", - "
        Overrides:
        \n" + - "
        "}, - }; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-package", "pkg1", "pkg2"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestOverridenPrivateMethodsWithPackageFlag tester = new TestOverridenPrivateMethodsWithPackageFlag(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-package", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + // The public method should be overridden + checkOutput("pkg1/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "publicMethod in class " + + "BaseClass
        "); + + // The public method in different package should be overridden + checkOutput("pkg2/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "publicMethod in class " + + "BaseClass
        "); + + // The package private method should be overridden since the base and sub class are in the same + // package. + checkOutput("pkg1/SubClass.html", true, + "
        Overrides:
        \n" + + "
        " + + "packagePrivateMethod in class " + + "BaseClass
        "); + + // The private method in should not be overridden + checkOutput("pkg1/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); + + // The private method in different package should not be overridden + checkOutput("pkg2/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); + + // The package private method should not be overridden since the base and sub class are in + // different packages. + checkOutput("pkg2/SubClass.html", false, + "
        Overrides:
        \n" + + "
        "); } } diff --git a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java index 13739ce6b83..9fb8423e0b2 100644 --- a/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java +++ b/langtools/test/com/sun/javadoc/testOverridenMethods/TestOverridenPrivateMethodsWithPrivateFlag.java @@ -24,67 +24,59 @@ /* * @test * @bug 4634891 8026567 - * @summary Determine if overriden methods are properly documented when + * @summary Determine if overridden methods are properly documented when * -protected (default) visibility flag is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestOverridenPrivateMethodsWithPrivateFlag * @run main TestOverridenPrivateMethodsWithPrivateFlag */ public class TestOverridenPrivateMethodsWithPrivateFlag extends JavadocTester { - private static final String[][] TEST = { - //The public method should be overriden - { "pkg1/SubClass.html", - "
        Overrides:
        \n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + - "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Overrides:\n" + + "
        Deprecated.\n" + "
        This package is Deprecated." + "
        " - }, - { "deprecated-list.html", - "
      • Deprecated Packages
      • " - } - }; - private static final String[][] NEGATED_TEST2 = { - { "overview-summary.html", "pkg1"}, - { "allclasses-frame.html", "FooDepr"} - }; + ); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestPackageDeprecation tester = new TestPackageDeprecation(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, NO_TEST, NEGATED_TEST2); - if ((new java.io.File(OUTPUT_DIR + "-2/pkg1/" + - "package-summary.html")).exists()) { - throw new Error("Test Fails: packages summary should not be" + - "generated for deprecated package."); - } else { - System.out.println("Test passes: package-summary.html not found."); - } - if ((new java.io.File(OUTPUT_DIR + "-2/FooDepr.html")).exists()) { - throw new Error("Test Fails: FooDepr should not be" + - "generated as it is deprecated."); - } else { - System.out.println("Test passes: FooDepr.html not found."); - } - tester.printSummary(); + checkOutput("deprecated-list.html", true, + "
      • Deprecated Packages
      • " + ); + } + + @Test + void testNoDeprecated() { + javadoc("-d", "out-nodepr", + "-sourcepath", testSrc, + "-use", + "-nodeprecated", + "pkg", "pkg1", testSrc("C2.java"), testSrc("FooDepr.java")); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", false, + "pkg1"); + checkOutput("allclasses-frame.html", false, + "FooDepr"); + + checkFiles(false, + "pkg1/package-summary.html", + "FooDepr.html"); } } diff --git a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java index dae5022afa9..7941694631d 100644 --- a/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java +++ b/langtools/test/com/sun/javadoc/testPackagePage/TestPackagePage.java @@ -28,69 +28,58 @@ * passed to Javadoc. Also test that the proper package links are generated * when single or multiple packages are documented. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestPackagePage * @run main TestPackagePage */ public class TestPackagePage extends JavadocTester { - private static final String[][] TEST1 = { - { "com/pkg/package-summary.html", - "This is a package page." - }, - //With just one package, all general pages link to the single package page. - { "com/pkg/C.html", - "Package" - }, - { "com/pkg/package-tree.html", - "
      • Package
      • " - }, - { "deprecated-list.html", - "
      • Package
      • " - }, - { "index-all.html", - "
      • Package
      • " - }, - { "help-doc.html", - "
      • Package
      • " - }, - }; - - private static final String[][] TEST2 = { - //With multiple packages, there is no package link in general pages. - { "deprecated-list.html", - "
      • Package
      • " - }, - { "index-all.html", - "
      • Package
      • " - }, - { "help-doc.html", - "
      • Package
      • " - }, - }; - - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - SRC_DIR + "/com/pkg/C.java" - }; - - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, - "com.pkg", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestPackagePage tester = new TestPackagePage(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testSinglePackage() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + testSrc("com/pkg/C.java")); + checkExit(Exit.OK); + + checkOutput("com/pkg/package-summary.html", true, + "This is a package page."); + + // With just one package, all general pages link to the single package page. + checkOutput("com/pkg/C.html", true, + "Package"); + checkOutput("com/pkg/package-tree.html", true, + "
      • Package
      • "); + checkOutput("deprecated-list.html", true, + "
      • Package
      • "); + checkOutput("index-all.html", true, + "
      • Package
      • "); + checkOutput("help-doc.html", true, + "
      • Package
      • "); + } + + private static final String[][] TEST1 = { + }; + + + @Test + void testMultiplePackages() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "com.pkg", "pkg2"); + checkExit(Exit.OK); + + //With multiple packages, there is no package link in general pages. + checkOutput("deprecated-list.html", true, + "
      • Package
      • "); + checkOutput("index-all.html", true, + "
      • Package
      • "); + checkOutput("help-doc.html", true, + "
      • Package
      • "); } } diff --git a/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java b/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java index 91b9ef5e6ef..252d3ddbcda 100644 --- a/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java +++ b/langtools/test/com/sun/javadoc/testParamTaglet/TestParamTaglet.java @@ -28,50 +28,38 @@ * match up with a real parameters. * Make sure inheritDoc cannot be used in an invalid param tag. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestParamTaglet * @run main TestParamTaglet */ public class TestParamTaglet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - //Regular param tags. - { "pkg/C.html", - "Parameters:\n" + - "
        param1 - testing 1 2 3.
        \n" + - "
        param2 - testing 1 2 3." - }, - //Param tags that don't match with any real parameters. - { "pkg/C.html", - "Parameters:\n" + - "
        p1 - testing 1 2 3.
        \n" + - "
        p2 - testing 1 2 3." - }, - //{@inherit} doc misuse does not cause doclet to throw exception. - // Param is printed with nothing inherited. - //XXX: in the future when Configuration is available during doc inheritence, - //print a warning for this mistake. - { "pkg/C.html", - "inheritBug -" - }, - - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestParamTaglet tester = new TestParamTaglet(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); + + checkOutput("pkg/C.html", true, + //Regular param tags. + "Parameters:\n" + + "
        param1 - testing 1 2 3.
        \n" + + "
        param2 - testing 1 2 3.", + //Param tags that don't match with any real parameters. + "Parameters:\n" + + "
        p1 - testing 1 2 3.
        \n" + + "
        p2 - testing 1 2 3.", + //{@inherit} doc misuse does not cause doclet to throw exception. + // Param is printed with nothing inherited. + //XXX: in the future when Configuration is available during doc inheritence, + //print a warning for this mistake. + "inheritBug -"); } } diff --git a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java index 3f50448c641..1b051b6f3df 100644 --- a/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java +++ b/langtools/test/com/sun/javadoc/testPrivateClasses/TestPrivateClasses.java @@ -37,237 +37,185 @@ * Make sure when no modifier appear in the class signature, the * signature is displayed correctly without extra space at the beginning. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestPrivateClasses + * @library ../lib + * @build JavadocTester * @run main TestPrivateClasses */ public class TestPrivateClasses extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg", "pkg2" - }; - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-private", - "pkg", "pkg2" - }; - - // Test output when -private flag is not used. - private static final String[][] TEST1 = { - // Field inheritence from non-public superclass. - { "pkg/PublicChild.html", - "" + - "fieldInheritedFromParent" - }, - - // Method inheritence from non-public superclass. - { "pkg/PublicChild.html", - "" + - "methodInheritedFromParent" - }, - - // Field inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "" + - "fieldInheritedFromInterface" - }, - - // Method inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "" + - "methodInterface" - }, - - // private class does not show up in tree - { "pkg/PublicChild.html", - "
          \n" + - "
        • java.lang.Object
        • \n" + - "
        • \n" + - "
            \n" + - "
          • pkg.PublicChild
          • \n" + - "
          \n" + - "
        • \n" + - "
        " - }, - - // Method is documented as though it is declared in the inheriting method. - { "pkg/PublicChild.html", - "
        public void methodInheritedFromParent(int p1)"
        -        },
        -
        -        //Make sure implemented interfaces from private superclass are inherited
        -        { "pkg/PublicInterface.html",
        -            "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        " + - "PublicChild
        \n" + - "
        "}, - - { "pkg/PublicChild.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "PublicInterface
        \n" + - "
        "}, - - //Generic interface method test. - { "pkg2/C.html", - "This comment should get copied to the implementing class"}, - }; - private static final String[][] NEGATED_TEST1 = { - // Should not document that a method overrides method from private class. - { "pkg/PublicChild.html", - "Overrides:"}, - // Should not document that a method specified by private interface. - { "pkg/PublicChild.html", - "Specified by:"}, - { "pkg/PublicInterface.html", - "Specified by:"}, - // Should not mention that any documentation was copied. - { "pkg/PublicChild.html", - "Description copied from"}, - { "pkg/PublicInterface.html", - "Description copied from"}, - // Don't extend private classes or interfaces - { "pkg/PublicChild.html", - "PrivateParent"}, - { "pkg/PublicInterface.html", - "PrivateInterface"}, - { "pkg/PublicChild.html", - "PrivateInterface"}, - { "pkg/PublicInterface.html", - "All Superinterfaces"}, - // Make inherited constant are documented correctly. - { "constant-values.html", - "PrivateInterface"}, - - //Do not inherit private interface method with generic parameters. - //This method has been implemented. - { "pkg2/C.html", - "hello"}, - }; - - // Test output when -private flag is used. - private static final String[][] TEST2 = { - // Field inheritence from non-public superclass. - { "pkg/PublicChild.html", - "Fields inherited from class pkg." + - "" + - "PrivateParent" - }, - { "pkg/PublicChild.html", - "" + - "fieldInheritedFromParent" - }, - // Field inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "Fields inherited from interface pkg." + - "" + - "PrivateInterface" - }, - { "pkg/PublicInterface.html", - "" + - "fieldInheritedFromInterface" - }, - // Method inheritence from non-public superclass. - { "pkg/PublicChild.html", - "Methods inherited from class pkg." + - "" + - "PrivateParent" - }, - { "pkg/PublicChild.html", - "" + - "methodInheritedFromParent" - }, - // Should document that a method overrides method from private class. - { "pkg/PublicChild.html", - "
        Overrides:
        \n" + - "
        " + - "methodOverridenFromParent in class " + - "" + - "PrivateParent
        "}, - // Should document that a method is specified by private interface. - { "pkg/PublicChild.html", - "
        Specified by:
        \n" + - "
        " + - "methodInterface in interface " + - "" + - "PrivateInterface
        "}, - // Method inheritence from non-public superinterface. - { "pkg/PublicInterface.html", - "Methods inherited from interface pkg." + - "" + - "PrivateInterface" - }, - { "pkg/PrivateInterface.html", - "" + - "methodInterface" - }, - // Should mention that any documentation was copied. - { "pkg/PublicChild.html", - "Description copied from"}, - // Extend documented private classes or interfaces - { "pkg/PublicChild.html", - "extends"}, - { "pkg/PublicInterface.html", - "extends"}, - { "pkg/PublicInterface.html", - "All Superinterfaces"}, - - //Make sure implemented interfaces from private superclass are inherited - { "pkg/PublicInterface.html", - "
        \n" + - "
        All Known Implementing Classes:
        \n" + - "
        " + - "PrivateParent, " + - "PublicChild" + - "
        \n" + - "
        "}, - - { "pkg/PublicChild.html", - "
        \n" + - "
        All Implemented Interfaces:
        \n" + - "
        " + - "PrivateInterface, " + - "" + - "PublicInterface
        \n" + - "
        "}, - - //Since private flag is used, we can document that private interface method - //with generic parameters has been implemented. - { "pkg2/C.html", - "Description copied from interface: " + - "I"}, - - { "pkg2/C.html", - "
        Specified by:
        \n" + - "
        hello" + - " in interface " + - "I" + - "<java.lang.String>
        "}, - - //Make sure when no modifier appear in the class signature, the - //signature is displayed correctly without extra space at the beginning. - { "pkg/PrivateParent.html", - "
        class PrivateParent"},
        -
        -      { "pkg/PublicChild.html",
        -            "
        public class PublicChild"},
        -    };
        -    private static final String[][] NEGATED_TEST2 = {
        -        { "pkg/PrivateParent.html",
        -            "
         class PrivateParent"},
        -    };
        -
        -    /**
        -     * The entry point of the test.
        -     * @param args the array of command line arguments.
        -     */
        -    public static void main(String[] args) {
        +    public static void main(String... args) throws Exception {
                 TestPrivateClasses tester = new TestPrivateClasses();
        -        tester.run(ARGS1, TEST1, NEGATED_TEST1);
        -        tester.run(ARGS2, TEST2, NEGATED_TEST2);
        -        tester.printSummary();
        +        tester.runTests();
        +    }
        +
        +    @Test
        +    void testDefault() {
        +        javadoc("-d", "out-default",
        +                "-sourcepath", testSrc,
        +                "pkg", "pkg2");
        +        checkExit(Exit.OK);
        +
        +        checkOutput("pkg/PublicChild.html", true,
        +                // Field inheritence from non-public superclass.
        +                ""
        +                + "fieldInheritedFromParent",
        +                // Method inheritance from non-public superclass.
        +                ""
        +                + "methodInheritedFromParent",
        +                // private class does not show up in tree
        +                "
          \n" + + "
        • java.lang.Object
        • \n" + + "
        • \n" + + "
            \n" + + "
          • pkg.PublicChild
          • \n" + + "
          \n" + + "
        • \n" + + "
        ", + // Method is documented as though it is declared in the inheriting method. + "
        public void methodInheritedFromParent(int p1)",
        +                "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "PublicInterface
        \n" + + "
        "); + + checkOutput("pkg/PublicChild.html", false, + // Should not document that a method overrides method from private class. + "Overrides:", + // Should not document that a method specified by private interface. + "Specified by:", + // Should not mention that any documentation was copied. + "Description copied from", + // Don't extend private classes or interfaces + "PrivateParent", + "PrivateInterface"); + + checkOutput("pkg/PublicInterface.html", true, + // Field inheritance from non-public superinterface. + "" + + "fieldInheritedFromInterface", + // Method inheritance from non-public superinterface. + "" + + "methodInterface", + //Make sure implemented interfaces from private superclass are inherited + "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        " + + "PublicChild
        \n" + + "
        "); + + checkOutput("pkg/PublicInterface.html", false, + "Specified by:", + "Description copied from", + "PrivateInterface", + "All Superinterfaces"); + + checkOutput("pkg2/C.html", true, + //Generic interface method test. + "This comment should get copied to the implementing class"); + + checkOutput("pkg2/C.html", false, + //Do not inherit private interface method with generic parameters. + //This method has been implemented. + "hello"); + + checkOutput("constant-values.html", false, + // Make inherited constant are documented correctly. + "PrivateInterface"); + } + + @Test + void testPrivate() { + javadoc("-d", "out-private", + "-sourcepath", testSrc, + "-private", + "pkg", "pkg2"); + checkExit(Exit.OK); + + checkOutput("pkg/PublicChild.html", true, + // Field inheritence from non-public superclass. + "Fields inherited from class pkg." + + "" + + "PrivateParent", + "" + + "fieldInheritedFromParent", + // Method inheritence from non-public superclass. + "Methods inherited from class pkg." + + "" + + "PrivateParent", + "" + + "methodInheritedFromParent", + // Should document that a method overrides method from private class. + "
        Overrides:
        \n" + + "
        " + + "methodOverridenFromParent in class " + + "" + + "PrivateParent
        ", + // Should document that a method is specified by private interface. + "
        Specified by:
        \n" + + "
        " + + "methodInterface in interface " + + "" + + "PrivateInterface
        ", + // Should mention that any documentation was copied. + "Description copied from", + // Extend documented private classes or interfaces + "extends", + "
        \n" + + "
        All Implemented Interfaces:
        \n" + + "
        " + + "PrivateInterface, " + + "" + + "PublicInterface
        \n" + + "
        ", + "
        public class PublicChild");
        +
        +        checkOutput("pkg/PublicInterface.html", true,
        +                // Field inheritence from non-public superinterface.
        +                "Fields inherited from interface pkg."
        +                + ""
        +                + "PrivateInterface",
        +                ""
        +                + "fieldInheritedFromInterface",
        +                // Method inheritance from non-public superinterface.
        +                "Methods inherited from interface pkg."
        +                + ""
        +                + "PrivateInterface",
        +                // Extend documented private classes or interfaces
        +                "extends",
        +                "All Superinterfaces",
        +                //Make sure implemented interfaces from private superclass are inherited
        +                "
        \n" + + "
        All Known Implementing Classes:
        \n" + + "
        " + + "PrivateParent, " + + "PublicChild" + + "
        \n" + + "
        "); + + checkOutput("pkg/PrivateInterface.html", true, + "" + + "methodInterface" + ); + + checkOutput("pkg2/C.html", true, + //Since private flag is used, we can document that private interface method + //with generic parameters has been implemented. + "Description copied from interface: " + + "I", + "
        Specified by:
        \n" + + "
        hello" + + " in interface " + + "I" + + "<java.lang.String>
        "); + + checkOutput("pkg/PrivateParent.html", true, + //Make sure when no modifier appear in the class signature, the + //signature is displayed correctly without extra space at the beginning. + "
        class PrivateParent");
        +
        +        checkOutput("pkg/PrivateParent.html", false,
        +                "
         class PrivateParent");
             }
         }
        diff --git a/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java b/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java
        index ff24deb6774..741f711f88c 100644
        --- a/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java
        +++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfiles.java
        @@ -26,194 +26,174 @@
          * @bug      8006124 8009684 8016921 8023700 8024096 8008164 8026567 8026770
          * @summary  Test javadoc support for profiles.
          * @author   Bhavesh Patel, Evgeniya Stepanova
        - * @library  ../lib/
        - * @build    JavadocTester TestProfiles
        + * @library ../lib
        + * @build    JavadocTester
          * @run main TestProfiles
          */
         public class TestProfiles extends JavadocTester {
         
        -    //Test information.
        -    private static final String PROFILE_OUTPUT_DIR = OUTPUT_DIR + "-1";
        -    private static final String PACKAGE_OUTPUT_DIR = OUTPUT_DIR + "-2";
        -    //Javadoc arguments.
        -    private static final String[] ARGS1 = new String[]{
        -        "-d", PROFILE_OUTPUT_DIR, "-sourcepath", SRC_DIR, "-Xprofilespath",
        -         SRC_DIR + "/profile-rtjar-includes.txt", "pkg1", "pkg2",
        -         "pkg3", "pkg4", "pkg5", "pkgDeprecated"
        -    };
        -    private static final String[] ARGS2 = new String[]{
        -        "-d", PACKAGE_OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1", "pkg2",
        -        "pkg3", "pkg4", "pkg5"
        -    };
        -    //Input for string tests for profiles.
        -    private static final String[][] PROFILES_TEST = {
        +    public static void main(String... args) throws Exception {
        +        TestProfiles tester = new TestProfiles();
        +        tester.runTests();
        +    }
        +
        +    @Test
        +    void testProfiles() {
        +        javadoc("-d", "out-profiles",
        +                "-sourcepath", testSrc,
        +                "-Xprofilespath", testSrc("profile-rtjar-includes.txt"),
        +                "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated");
        +        checkExit(Exit.OK);
        +
                 // Tests for profile-overview-frame.html listing all profiles.
        -        { "profile-overview-frame.html",
        -            "All Packages"
        -        },
        -        { "profile-overview-frame.html",
        -            "
      • " - + "compact1
      • " - }, + checkOutput("profile-overview-frame.html", true, + "All Packages", + "
      • " + + "compact1
      • "); + // Tests for profileName-frame.html listing all packages in a profile. - { "compact2-frame.html", - "" - + "All PackagesAll Profiles" - }, - { "compact2-frame.html", - "
      • pkg4
      • " - }, + checkOutput("compact2-frame.html", true, + "" + + "All PackagesAll Profiles", + "
      • pkg4
      • "); + // Test for profileName-package-frame.html listing all types in a // package of a profile. - { "pkg2/compact2-package-frame.html", - "" - + "compact2 - pkg2" - }, + checkOutput("pkg2/compact2-package-frame.html", true, + "" + + "compact2 - pkg2"); + // Tests for profileName-summary.html listing the summary for a profile. - { "compact2-summary.html", - "
      • Prev Profile
      • \n" - + "
      • Next Profile
      • " - }, - { "compact2-summary.html", - "

        Profile compact2

        " - }, - { "compact2-summary.html", - "

        pkg2

        " - }, - { "compact2-summary.html", - "
          \n" + - "
        • \n" - + "

          " - + "pkg2

          \n" + - "" - }, - { "compact2-summary.html", - "
          " - }, + checkOutput("compact2-summary.html", true, + "
        • Prev Profile
        • \n" + + "
        • Next Profile
        • ", + "

          Profile compact2

          ", + "

          pkg2

          ", + "
          ", + "
          "); + + // Tests for profileName-package-summary.html listing the summary for a // package in a profile. - { "pkg5/compact3-package-summary.html", - "
        • Prev Package" - + "
        • " - }, - { "pkg5/compact3-package-summary.html", - "
          compact3
          " - }, - { "pkg5/compact3-package-summary.html", - "
            \n" + - "
          • \n" - + "
          " - }, - //Test for "overview-frame.html" showing the "All Profiles" link. - { "overview-frame.html", - "All Profiles" - }, - //Test for "className.html" showing the profile information for the type. - { "pkg2/Class1Pkg2.html", - "
          compact1, compact2, compact3
          " - }, - { "index.html", - "" - }, - //Test for "overview-summary.html" showing the profile list. - { "overview-summary.html", - "" - }, - //Test deprecated class in profiles - { "compact1-summary.html", - "\n" - + "
          Class1Pkg2Deprecated" - }, - { "deprecated-list.html", - "pkg2.Class1Pkg2\n" - +"
          Class1Pkg2. This class is deprecated
          " - }, + checkOutput("pkg5/compact3-package-summary.html", true, + "
        • Prev Package" + + "
        • ", + "
          compact3
          ", + "
            \n" + + "
          • \n" + + ""); + + // Test for "overview-frame.html" showing the "All Profiles" link. + checkOutput("overview-frame.html", true, + "All Profiles"); + + // Test for "className.html" showing the profile information for the type. + checkOutput("pkg2/Class1Pkg2.html", true, + "
            compact1, compact2, compact3
            "); + + checkOutput("index.html", true, + ""); + + // Test for "overview-summary.html" showing the profile list. + checkOutput("overview-summary.html", true, + ""); + + // Test deprecated class in profiles + checkOutput("compact1-summary.html", true, + "\n" + + "
            Class1Pkg2Deprecated"); + + checkOutput("deprecated-list.html", true, + "pkg2.Class1Pkg2\n" + + "
            Class1Pkg2. This class is deprecated
            "); + //Test deprecated package in profile - { "deprecated-list.html", - "
            pkgDeprecated\n" - +"
            This package is Deprecated." - + " Use pkg1.
            " - }, - { "pkgDeprecated/package-summary.html", - "
            Deprecated.\n" - + "
            This package is Deprecated." - + " Use pkg1.
            " - }, - // need to add teststring when JDK-8015496 will be fixed - //Test exception in profiles - { "compact1-summary.html", - "\n" - + "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" - + "" - }, + checkOutput("deprecated-list.html", true, + "
            Exception Summary" - + " 
            Exception" - + "Description
            ClassExceptionpkgDeprecated\n" + + "
            This package is Deprecated." + + " Use pkg1.
            "); + + checkOutput("pkgDeprecated/package-summary.html", true, + "
            Deprecated.\n" + + "
            This package is Deprecated." + + " Use pkg1.
            "); + + // TODO: need to add teststring when JDK-8015496 will be fixed + // Test exception in profiles + checkOutput("compact1-summary.html", true, + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""); + //Test errors in profiles - { "compact1-summary.html", - "
            Exception Summary" + + " 
            Exception" + + "Description
            ClassException
            \n" - + "\n" + - "\n" + - "\n" + - "\n" + - "\n" + - "\n" - + "\n" + - "" - } - }; - private static final String[][] PROFILES_NEGATED_TEST = { - { "pkg3/Class2Pkg3.html", - "
            compact1" - }, - { "pkg3/Interface1Pkg3.html", - "
            compact1" - }, - { "pkg4/compact2-package-frame.html", + checkOutput("compact1-summary.html", true, + "
            Error Summary " - + "
            ErrorDescription
            " - + "ClassError
            \n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + ""); + + // negative tests + checkOutput("pkg3/Class2Pkg3.html", false, + "
            compact1"); + + checkOutput("pkg3/Interface1Pkg3.html", false, + "
            compact1"); + + checkOutput("pkg4/compact2-package-frame.html", false, "
          • Anno1Pkg4
          • " - }, - { "compact1-summary.html","
          • Use
          • " - }, - { "compact2-summary.html", + + "target=\"classFrame\">Anno1Pkg4"); + + checkOutput("compact1-summary.html", false, + "
          • Use
          • "); + + checkOutput("compact2-summary.html", false, "
            Error Summary " + + "
            ErrorDescription
            " + + "ClassError
            " - }, - { "pkg5/compact3-package-summary.html", + + "listing classes, and an explanation\">"); + + checkOutput("pkg5/compact3-package-summary.html", false, "
              \n" + "
            • \n" + "
            • \n" + "
            " - } - }; - private static final String[][] PACKAGES_TEST = { - { "overview-frame.html", - "

            Packages

            " - }, - { "pkg4/package-frame.html", - "

            pkg4

            " - }, - { "pkg4/package-summary.html", - "
            \n" + - "

            Package pkg4

            \n" + - "
            " - } - }; - private static final String[][] PACKAGES_NEGATED_TEST = { - { "overview-frame.html", - "All Profiles" - }, - { "pkg2/Class1Pkg2.html", - "
            compact1, compact2, compact3
            " - }, - { "overview-summary.html", - "" - } - }; - private static final String[] PACKAGES_NEGATED_FILE_TEST = { - "profile-overview-frame.html", - "compact2-frame.html", - "pkg2/compact2-package-frame.html", - "compact2-summary.html", - "pkg5/compact3-package-summary.html" - }; + + "interfaces, and an explanation\">"); + } - /** - * The entry point of the test. - * - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestProfiles tester = new TestProfiles(); - tester.run(ARGS1, PROFILES_TEST, PROFILES_NEGATED_TEST); - tester.run(ARGS2, PACKAGES_TEST, PACKAGES_NEGATED_TEST, NO_FILE_TEST, PACKAGES_NEGATED_FILE_TEST); - tester.printSummary(); + @Test + void testPackages() { + javadoc("-d", "out-packages", + "-sourcepath", testSrc, + "pkg1", "pkg2", "pkg3", "pkg4", "pkg5"); + checkExit(Exit.OK); + + checkOutput("overview-frame.html", true, + "

            Packages

            "); + + checkOutput("pkg4/package-frame.html", true, + "

            pkg4

            "); + + checkOutput("pkg4/package-summary.html", true, + "
            \n" + + "

            Package pkg4

            \n" + + "
            "); + + checkOutput("overview-frame.html", false, + "All Profiles"); + + checkOutput("pkg2/Class1Pkg2.html", false, + "
            compact1, compact2, compact3
            "); + + checkOutput("overview-summary.html", false, + ""); + + checkFiles(false, + "profile-overview-frame.html", + "compact2-frame.html", + "pkg2/compact2-package-frame.html", + "compact2-summary.html", + "pkg5/compact3-package-summary.html"); } } diff --git a/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java b/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java index 965b8e149c4..d4c2fd80b41 100644 --- a/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java +++ b/langtools/test/com/sun/javadoc/testProfiles/TestProfilesConfiguration.java @@ -26,97 +26,98 @@ * @bug 8006124 8009684 8015663 8015496 8026567 * @summary Test javadoc options support for profiles. * @author Evgeniya Stepanova - * @library ../lib/ - * @build JavadocTester TestProfilesConfiguration + * @library ../lib + * @build JavadocTester * @run main TestProfilesConfiguration */ public class TestProfilesConfiguration extends JavadocTester { - //Test information. - private static final String PROFILE_CONFIGURATION_OUTPUT_DIR = OUTPUT_DIR + "-3"; - private static final String NODEPR_NOPKGS_OUTPUT_DIR = OUTPUT_DIR + "-4"; - //Javadoc arguments. - private static final String[] ARGS3 = new String[]{ - "-d", PROFILE_CONFIGURATION_OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-nocomment", "-keywords", "-Xprofilespath", SRC_DIR + - "/profile-rtjar-includes.txt", "-doctitle", "Simple doctitle", - "-use", "pkg3", "pkg1", "pkg2", "pkg4", - "pkg5", "-packagesheader", "Simple packages header","pkgDeprecated" - }; - private static final String[] ARGS4 = new String[]{ - "-d", NODEPR_NOPKGS_OUTPUT_DIR, "-sourcepath", SRC_DIR, "-nocomment", - "-nodeprecated", "-keywords", "-Xprofilespath", SRC_DIR + - "/profile-rtjar-includes-nopkgs.txt", "-doctitle", "Simple doctitle", - "-use", "-packagesheader", "Simple packages header", - "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated" - }; - private static final String[][] NODEPR_NOPKGS_TEST = { - { "overview-summary.html", - "" - }, - { "profile-overview-frame.html", - "" - } - }; - private static final String[][] NODEPR_NOPKGS_NEGATED_TEST = { - { "overview-summary.html", - "compact1" - } - }; - - private static final String[][] PROFILES_CONFIGURATION_TEST = { - //-use option test string fo profile view page - { "compact1-summary.html","
          • Use
          • " - }, - //-doctitle option test string - { "overview-summary.html", - "
            \n" + - "

            Simple doctitle

            " - }, - //-packagesheader option test string fo profiles - { "profile-overview-frame.html", - "

            Simple packages header

            " - }, - //-keywords option test string for profiles - { "compact1-summary.html", - "" - }, - //Deprecated information on a package - { "compact1-summary.html", - "

            pkgDeprecated

            \n" + - "
            " + - "Deprecated.
            " - } - }; - private static final String[][] PROFILES_CONFIGURATION_NEGATED_TEST = { - //-nocomments option test string - { "compact1-summary.html", - "
            Class1Pkg2.
            " - } - }; - - /** - * The entry point of the test. - * - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestProfilesConfiguration tester = new TestProfilesConfiguration(); - tester.run(ARGS3, PROFILES_CONFIGURATION_TEST, - PROFILES_CONFIGURATION_NEGATED_TEST); - tester.run(ARGS4, NODEPR_NOPKGS_TEST, - NODEPR_NOPKGS_NEGATED_TEST); - tester.printSummary(); + tester.runTests(); +// tester.run(ARGS3, PROFILES_CONFIGURATION_TEST, PROFILES_CONFIGURATION_NEGATED_TEST); +// tester.run(ARGS4, NODEPR_NOPKGS_TEST, NODEPR_NOPKGS_NEGATED_TEST); +// tester.printSummary(); + } + + @Test + void testProfiles() { + javadoc("-d", "out-profiles", + "-sourcepath", testSrc, + "-nocomment", + "-keywords", + "-Xprofilespath", testSrc("profile-rtjar-includes.txt"), + "-doctitle", "Simple doctitle", + "-use", + "-packagesheader", "Simple packages header", + "pkg3", "pkg1", "pkg2", "pkg4", "pkg5", "pkgDeprecated"); + checkExit(Exit.OK); + + checkOutput("compact1-summary.html", true, + //-use option test string fo profile view page + "
          • Use
          • ", + // -keywords option test string for profiles + "", + // Deprecated information on a package + "

            pkgDeprecated

            \n" + + "
            " + + "Deprecated.
            " + ); + + //-nocomments option test string + checkOutput("compact1-summary.html", false, + "
            Class1Pkg2.
            " + ); + + // -doctitle option test string + checkOutput("overview-summary.html", true, + "
            \n" + + "

            Simple doctitle

            " + ); + + // -packagesheader option test string fo profiles + checkOutput("profile-overview-frame.html", true, + "

            Simple packages header

            " + ); + } + + + @Test + void testNoDeprNoPackages() { + javadoc("-d", "out-noDeprNoPackages", + "-sourcepath", testSrc, + "-nocomment", + "-nodeprecated", + "-keywords", + "-Xprofilespath", testSrc("profile-rtjar-includes-nopkgs.txt"), + "-doctitle", "Simple doctitle", + "-use", + "-packagesheader", "Simple packages header", + "pkg1", "pkg2", "pkg3", "pkg4", "pkg5", "pkgDeprecated"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "" + ); + + checkOutput("profile-overview-frame.html", true, + "" + ); + + checkOutput("overview-summary.html", false, + "compact1" + ); + } } diff --git a/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java b/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java index d1957358a83..615c64bba6e 100644 --- a/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java +++ b/langtools/test/com/sun/javadoc/testRecurseSubPackages/TestRecurseSubPackages.java @@ -26,35 +26,33 @@ * @bug 4074234 * @summary Make Javadoc capable of traversing/recursing all of given subpackages. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestRecurseSubPackages * @run main TestRecurseSubPackages */ public class TestRecurseSubPackages extends JavadocTester { - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-subpackages", "pkg1", "-exclude", "pkg1.pkg2.packageToExclude" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - String[][] tests = new String[6][2]; - for (int i = 0; i < tests.length; i++) { - tests[i][0] = "allclasses-frame.html"; - tests[i][1] = "C" + (i+1) + ".html"; - } - String[][] negatedTests = new String[][] { - { "allclasses-frame.html", "DummyClass.html"} - }; + public static void main(String... args) throws Exception { TestRecurseSubPackages tester = new TestRecurseSubPackages(); - tester.run(ARGS, tests, negatedTests); - tester.printSummary(); + tester.runTests(); } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-subpackages", "pkg1", + "-exclude", "pkg1.pkg2.packageToExclude"); + checkExit(Exit.OK); + + for (int i = 1; i <= 6; i++) { + checkOutput("allclasses-frame.html", true, + "C" + i + ".html"); + } + + checkOutput("allclasses-frame.html", false, + "DummyClass.html"); + } + } diff --git a/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java b/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java index d4bd107c1a5..8d53c8dc014 100644 --- a/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java +++ b/langtools/test/com/sun/javadoc/testRelativeLinks/TestRelativeLinks.java @@ -27,81 +27,64 @@ * @summary Test to make sure that relative paths are redirected in the * output so that they are not broken. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestRelativeLinks * @run main TestRelativeLinks */ public class TestRelativeLinks extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-use", "-sourcepath", SRC_DIR, "pkg", "pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - //These relative paths should stay relative because they appear - //in the right places. - { "pkg/C.html", - "relative class link"}, - { "pkg/C.html", - "relative field link"}, - { "pkg/C.html", - "relative method link"}, - { "pkg/package-summary.html", - "relative package link"}, - { "pkg/C.html", - " relative-multi-line-link."}, - - //These relative paths should be redirected because they are in different - //places. - - //INDEX PAGE - { "index-all.html", - "relative class link"}, - { "index-all.html", - "relative field link"}, - { "index-all.html", - "relative method link"}, - { "index-all.html", - "relative package link"}, - { "index-all.html", - " relative-multi-line-link."}, - - - //PACKAGE USE - { "pkg/package-use.html", - "relative package link."}, - { "pkg/package-use.html", - "relative class link"}, - - //CLASS_USE - { "pkg/class-use/C.html", - "relative field link"}, - { "pkg/class-use/C.html", - "relative method link"}, - { "pkg/class-use/C.html", - "relative package link"}, - { "pkg/class-use/C.html", - " relative-multi-line-link."}, - - //PACKAGE OVERVIEW - { "overview-summary.html", - "relative package link"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestRelativeLinks tester = new TestRelativeLinks(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-use", + "-sourcepath", testSrc, + "pkg", "pkg2"); + checkExit(Exit.OK); + + // These relative paths should stay relative because they appear + // in the right places. + checkOutput("pkg/C.html", true, + "relative class link", + "relative field link", + "relative method link", + " relative-multi-line-link."); + checkOutput("pkg/package-summary.html", true, + "relative package link"); + + // These relative paths should be redirected because they are in different + // places. + + // INDEX PAGE + checkOutput("index-all.html", true, + "relative class link", + "relative field link", + "relative method link", + "relative package link", + " relative-multi-line-link."); + + // PACKAGE USE + checkOutput("pkg/package-use.html", true, + "relative package link.", + "relative class link"); + + // CLASS_USE + checkOutput("pkg/class-use/C.html", true, + "relative field link", + "relative method link", + "relative package link", + " relative-multi-line-link."); + + // PACKAGE OVERVIEW + checkOutput("overview-summary.html", true, + "relative package link"); } } diff --git a/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java b/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java index 661e1f75f5b..22370f6e14b 100644 --- a/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java +++ b/langtools/test/com/sun/javadoc/testRepeatedAnnotations/TestRepeatedAnnotations.java @@ -26,147 +26,125 @@ * @bug 8005092 * @summary Test repeated annotations output. * @author bpatel - * @library ../lib/ - * @build JavadocTester TestRepeatedAnnotations + * @library ../lib + * @build JavadocTester * @run main TestRepeatedAnnotations */ public class TestRepeatedAnnotations extends JavadocTester { - //Test information. - - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", "pkg1" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg/C.html", - "@ContaineeRegDoc " + - "@ContaineeRegDoc"}, - { "pkg/C.html", - "@RegContainerDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc})"}, - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg/C.html", - "@ContainerSynthDoc(" + - "value=" + - "@ContaineeSynthDoc)"}, - { "pkg/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - - { "pkg/D.html", - "@RegDoc" + - "(x=1)"}, - { "pkg/D.html", - "@RegArryDoc" + - "(y=1)"}, - { "pkg/D.html", - "@RegArryDoc" + - "(y={1,2})"}, - { "pkg/D.html", - "@NonSynthDocContainer" + - "(value=" + - "@RegArryDoc)"}, - - { "pkg1/C.html", - "@RegContainerValDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc}," + - "y=3)"}, - { "pkg1/C.html", - "@ContainerValDoc" + - "(value={" + - "@ContaineeNotDoc," + - "@ContaineeNotDoc}," + - "x=1)"} - }; - - private static final String[][] NEGATED_TEST = { - { "pkg/C.html", - "@RegContaineeDoc " + - "@RegContaineeDoc"}, - { "pkg/C.html", - "@RegContainerNotDoc" + - "(value={" + - "@RegContaineeNotDoc," + - "@RegContaineeNotDoc})"}, - - { "pkg1/C.html", - "@ContaineeSynthDoc " + - "@ContaineeSynthDoc"}, - { "pkg1/C.html", - "@RegContainerValNotDoc" + - "(value={" + - "@RegContaineeDoc," + - "@RegContaineeDoc}," + - "y=4)"}, - { "pkg1/C.html", - "@ContainerValNotDoc" + - "(value={" + - "@ContaineeNotDoc," + - "@ContaineeNotDoc}," + - "x=2)"}, - { "pkg1/C.html", - "@ContainerSynthNotDoc(" + - "value=" + - "@ContaineeSynthDoc)"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestRepeatedAnnotations tester = new TestRepeatedAnnotations(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg", "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@ContaineeRegDoc " + + "@ContaineeRegDoc", + "@RegContainerDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc})", + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@ContainerSynthDoc(" + + "value=" + + "@ContaineeSynthDoc)", + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc"); + + checkOutput("pkg/D.html", true, + "@RegDoc" + + "(x=1)", + "@RegArryDoc" + + "(y=1)", + "@RegArryDoc" + + "(y={1,2})", + "@NonSynthDocContainer" + + "(value=" + + "@RegArryDoc)"); + + checkOutput("pkg1/C.html", true, + "@RegContainerValDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc}," + + "y=3)", + "@ContainerValDoc" + + "(value={" + + "@ContaineeNotDoc," + + "@ContaineeNotDoc}," + + "x=1)"); + + checkOutput("pkg/C.html", false, + "@RegContaineeDoc " + + "@RegContaineeDoc", + "@RegContainerNotDoc" + + "(value={" + + "@RegContaineeNotDoc," + + "@RegContaineeNotDoc})"); + + checkOutput("pkg1/C.html", false, + "@ContaineeSynthDoc " + + "@ContaineeSynthDoc", + "@RegContainerValNotDoc" + + "(value={" + + "@RegContaineeDoc," + + "@RegContaineeDoc}," + + "y=4)", + "@ContainerValNotDoc" + + "(value={" + + "@ContaineeNotDoc," + + "@ContaineeNotDoc}," + + "x=2)", + "@ContainerSynthNotDoc(" + + "value=" + + "@ContaineeSynthDoc)"); } } diff --git a/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java b/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java index cef982bbba0..35278f60e69 100644 --- a/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java +++ b/langtools/test/com/sun/javadoc/testReturnTag/TestReturnTag.java @@ -26,26 +26,13 @@ * @bug 4490068 * @summary Warn when a return tag is used on a method without a return type. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestReturnTag * @run main TestReturnTag */ public class TestReturnTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + - "/TestReturnTag.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - {WARNING_OUTPUT, - "warning - @return tag cannot be used in method with void return type."} - }; - /** * Trigger warning message when return tag is used on a void method. * @@ -53,13 +40,20 @@ public class TestReturnTag extends JavadocTester { */ public void method() {} - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestReturnTag tester = new TestReturnTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void tests() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + testSrc("TestReturnTag.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @return tag cannot be used in method with void return type."); } } diff --git a/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java b/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java index cf5b3ef8b76..8ce6945de84 100644 --- a/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java +++ b/langtools/test/com/sun/javadoc/testSeeTag/TestSeeTag.java @@ -26,37 +26,29 @@ * @bug 8017191 * @summary Javadoc is confused by at-link to imported classes outside of the set of generated packages * @author jjg - * @library ../lib/ - * @build JavadocTester TestSeeTag + * @library ../lib + * @build JavadocTester * @run main TestSeeTag */ public class TestSeeTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/Test.html", - "List" - } - }; - private static final String[][] NEGATED_TEST = { - { "pkg/Test.html", - "<code>List</code>" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSeeTag tester = new TestSeeTag(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/Test.html", true, + "List"); + + checkOutput("pkg/Test.html", false, + "<code>List</code>"); } } diff --git a/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java b/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java index abffdc97069..23bbdf6c1e7 100644 --- a/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java +++ b/langtools/test/com/sun/javadoc/testSerialVersionUID/TestSerialVersionUID.java @@ -27,32 +27,25 @@ * @summary Test to make sure that the serialVersionUID is properly * documented in the serialized form. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSerialVersionUID * @run main TestSerialVersionUID */ public class TestSerialVersionUID extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, - SRC_DIR + "/C.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "serialized-form.html", "-111111111111111L"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSerialVersionUID tester = new TestSerialVersionUID(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("serialized-form.html", true, + "-111111111111111L"); } } diff --git a/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java b/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java index 6108f9141b1..209f7d73a4c 100644 --- a/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java +++ b/langtools/test/com/sun/javadoc/testSerializedForm/TestSerializedForm.java @@ -38,85 +38,76 @@ * @run main TestSerializedForm */ -import java.lang.*; import java.io.*; public class TestSerializedForm extends JavadocTester implements Serializable { + public static void main(String... args) throws Exception { + TestSerializedForm tester = new TestSerializedForm(); + tester.runTests(); +// tester.run(ARGS, TEST, NEGATED_TEST); +// tester.run(ARGS_PRIVATE, TEST_PRIVATE, NEGATED_TEST_PRIVATE); +// tester.printSummary(); + } - private static final String[][] TEST = { - { "serialized-form.html", - "protected java.lang.Object readResolve()"}, - { "serialized-form.html", - "protected java.lang.Object writeReplace()"}, - { "serialized-form.html", - "protected java.lang.Object readObjectNoData()"}, - { "serialized-form.html", - "See Also"}, - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PrivateIncludeInnerClass.PriInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + - "java.lang.Object implements Serializable

            "} - }; + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + testSrc("TestSerializedForm.java"), "pkg1"); + checkExit(Exit.OK); - private static final String[][] TEST_PRIVATE = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.PrivateIncludeInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "} - }; + checkOutput("serialized-form.html", true, + "protected java.lang.Object readResolve()", + "protected java.lang.Object writeReplace()", + "protected java.lang.Object readObjectNoData()", + "See Also", + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PrivateIncludeInnerClass.PriInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + + "java.lang.Object implements Serializable

            "); - private static final String[][] NEGATED_TEST = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.PrivateInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class " + - "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements " + - "Serializable

            "} - }; + checkOutput("serialized-form.html", false, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.PrivateInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass extends java.lang.Object implements " + + "Serializable

            "); + } - private static final String[][] NEGATED_TEST_PRIVATE = { - { "serialized-form.html", - "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + - "extends java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PrivateInnerClass.PriInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + - "java.lang.Object implements Serializable

            "}, - { "serialized-form.html", - "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass " + - "extends java.lang.Object implements Serializable

            "} - }; + @Test + void testPrivate() { + javadoc("-private", + "-d", "out-private", + "-sourcepath", testSrc, + testSrc("TestSerializedForm.java"), "pkg1"); + checkExit(Exit.OK); - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestSerializedForm.java", "pkg1" - }; + checkOutput("serialized-form.html", true, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.PrivateIncludeInnerClass.PriInnerClass extends java.lang.Object implements Serializable

            ", + "

            Class " + + "pkg1.ProtectedInnerClass.ProInnerClass extends java.lang.Object implements Serializable

            "); - private static final String[] ARGS_PRIVATE = new String[] { - "-private", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, - SRC_DIR + "/TestSerializedForm.java", "pkg1" - }; + checkOutput("serialized-form.html", false, + "

            Class pkg1.NestedInnerClass.InnerClass.ProNestedInnerClass " + + "extends java.lang.Object implements Serializable

            ", + "

            Class pkg1.PrivateInnerClass.PriInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.ProtectedInnerClass.ProInnerClass extends " + + "java.lang.Object implements Serializable

            ", + "

            Class pkg1.PublicExcludeInnerClass.PubInnerClass " + + "extends java.lang.Object implements Serializable

            "); + } /** * @serial @@ -128,12 +119,6 @@ public class TestSerializedForm extends JavadocTester implements Serializable { * The entry point of the test. * @param args the array of command line arguments. */ - public static void main(String[] args) { - TestSerializedForm tester = new TestSerializedForm(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS_PRIVATE, TEST_PRIVATE, NEGATED_TEST_PRIVATE); - tester.printSummary(); - } /** * @param s ObjectInputStream. diff --git a/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java b/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java index 20e28da635e..67893c46650 100644 --- a/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java +++ b/langtools/test/com/sun/javadoc/testSerializedFormDeprecationInfo/TestSerializedFormDeprecationInfo.java @@ -28,118 +28,142 @@ * @bug 6802694 8025633 8026567 * @summary This test verifies deprecation info in serialized-form.html. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSerializedFormDeprecationInfo * @run main TestSerializedFormDeprecationInfo */ public class TestSerializedFormDeprecationInfo extends JavadocTester { + public static void main(String... args) throws Exception { + TestSerializedFormDeprecationInfo tester = new TestSerializedFormDeprecationInfo(); + tester.runTests(); + } + + @Test + void testDefault() { + javadoc("-d", "out-default", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkCommentDeprecated(true); + checkNoComment(false); + } + + @Test + void testNoComment() { + javadoc("-d", "out-nocmnt", + "-nocomment", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkNoComment(true); + checkCommentDeprecated(false); + } + + @Test + void testNoDeprecated() { + javadoc("-d", "out-nodepr", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + + checkNoDeprecated(true); + checkNoCommentNoDeprecated(false); + } + + @Test + void testNoCommentNoDeprecated() { + javadoc("-d", "out-nocmnt-nodepr", + "-nocomment", + "-nodeprecated", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: should be OK + checkNoCommentNoDeprecated(true); + checkNoDeprecated(false); + } + // Test for normal run of javadoc. The serialized-form.html should // display the inline comments, tags and deprecation information if any. - private static final String[][] TEST_CMNT_DEPR = { - { "serialized-form.html", "
            \n" + - "
            Throws:
            \n" + - "
            " + - "java.io.IOException
            \n" + - "
            See Also:" + - "
            \n" + - "
            " + - "C1.setUndecorated(boolean)
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - "
            This field indicates whether the C1 " + - "is undecorated.
            \n" + - " \n" + - "
            \n" + - "
            Since:
            \n" + - "
            1.4
            \n" + - "
            See Also:" + - "
            \n" + - "
            " + - "C1.setUndecorated(boolean)
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - "
            Reads the object stream.
            \n" + - "
            \n" + - "
            Throws:
            \n" + - "
            " + - "IOException
            \n" + - "
            java.io.IOException
            \n" + - "
            "}, - { "serialized-form.html", - "Deprecated." + - " \n" + - "
            " + - "The name for this class.
            "}}; + void checkCommentDeprecated(boolean expectFound) { + checkOutput("serialized-form.html", expectFound, + "
            \n" + + "
            Throws:
            \n" + + "
            " + + "java.io.IOException
            \n" + + "
            See Also:" + + "
            \n" + + "
            " + + "C1.setUndecorated(boolean)
            \n" + + "
            ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
            This field indicates whether the C1 " + + "is undecorated.
            \n" + + " \n" + + "
            \n" + + "
            Since:
            \n" + + "
            1.4
            \n" + + "
            See Also:" + + "
            \n" + + "
            " + + "C1.setUndecorated(boolean)
            \n" + + "
            ", + "Deprecated." + + " As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + "
            Reads the object stream.
            \n" + + "
            \n" + + "
            Throws:
            \n" + + "
            " + + "IOException
            \n" + + "
            java.io.IOException
            \n" + + "
            ", + "Deprecated." + + " \n" + + "
            " + + "The name for this class.
            "); + } // Test with -nocomment option. The serialized-form.html should // not display the inline comments and tags but should display deprecation // information if any. - private static final String[][] TEST_NOCMNT = { - { "serialized-form.html", - "
            boolean undecorated
            \n" + - "
            Deprecated. " + - "As of JDK version 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).
            \n" + - ""}, - { "serialized-form.html", - "" + - "Deprecated. As of JDK version" + - " 1.5, replaced by\n" + - " " + - "setUndecorated(boolean).\n" + - ""}}; + void checkNoComment(boolean expectFound) { + checkOutput("serialized-form.html", expectFound, + "
            boolean undecorated
            \n" + + "
            Deprecated. " + + "As of JDK version 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).
            \n" + + "", + "" + + "Deprecated. As of JDK version" + + " 1.5, replaced by\n" + + " " + + "setUndecorated(boolean).\n" + + ""); + } // Test with -nodeprecated option. The serialized-form.html should // ignore the -nodeprecated tag and display the deprecation info. This // test is similar to the normal run of javadoc in which inline comment, tags // and deprecation information will be displayed. - private static final String[][] TEST_NODEPR = TEST_CMNT_DEPR; + void checkNoDeprecated(boolean expectFound) { + checkCommentDeprecated(expectFound); + } // Test with -nodeprecated and -nocomment options. The serialized-form.html should // ignore the -nodeprecated tag and display the deprecation info but should not // display the inline comments and tags. This test is similar to the test with // -nocomment option. - private static final String[][] TEST_NOCMNT_NODEPR = TEST_NOCMNT; - - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR + "-2", "-nocomment", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS3 = - new String[] { - "-d", OUTPUT_DIR + "-3", "-nodeprecated", "-sourcepath", SRC_DIR, "pkg1"}; - - private static final String[] ARGS4 = - new String[] { - "-d", OUTPUT_DIR + "-4", "-nocomment", "-nodeprecated", "-sourcepath", - SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSerializedFormDeprecationInfo tester = new TestSerializedFormDeprecationInfo(); - tester.run(ARGS1, TEST_CMNT_DEPR, TEST_NOCMNT); - tester.run(ARGS2, TEST_NOCMNT, TEST_CMNT_DEPR); - tester.run(ARGS3, TEST_NODEPR, TEST_NOCMNT_NODEPR); - tester.run(ARGS4, TEST_NOCMNT_NODEPR, TEST_NODEPR); - tester.printSummary(); + void checkNoCommentNoDeprecated(boolean expectFound) { + checkNoComment(expectFound); } } diff --git a/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java b/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java index 4cabbf4d5b7..f9169cef77b 100644 --- a/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java +++ b/langtools/test/com/sun/javadoc/testSimpleTag/TestSimpleTag.java @@ -24,47 +24,38 @@ /* * @test * @bug 4695326 4750173 4920381 8026567 - * @summary Test the declarartion of simple tags using -tag. Verify that + * @summary Test the declaration of simple tags using -tag. Verify that * "-tag name" is a shortcut for "-tag name:a:Name:". Also verity that * you can escape the ":" character with a back slash so that it is not * considered a separator when parsing the simple tag argument. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSimpleTag * @run main TestSimpleTag */ public class TestSimpleTag extends JavadocTester { - private static final String[][] TEST = - new String[][] { - { "C.html", - "Todo:"}, - { "C.html", - "EJB Beans:"}, - { "C.html", - "Regular Tag:"}, - { "C.html", - "Back-Slash-Tag:"}, - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tag", "todo", - "-tag", "ejb\\:bean:a:EJB Beans:", - "-tag", "regular:a:Regular Tag:", - "-tag", "back-slash\\:tag\\\\:a:Back-Slash-Tag:", - SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSimpleTag tester = new TestSimpleTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "todo", + "-tag", "ejb\\:bean:a:EJB Beans:", + "-tag", "regular:a:Regular Tag:", + "-tag", "back-slash\\:tag\\\\:a:Back-Slash-Tag:", + testSrc("C.java")); + checkExit(Exit.FAILED); // TODO: investigate why failed + + checkOutput("C.html", true, + "Todo:", + "EJB Beans:", + "Regular Tag:", + "Back-Slash-Tag:"); } } diff --git a/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java b/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java index d914b0ddc2f..9064ec09151 100644 --- a/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java +++ b/langtools/test/com/sun/javadoc/testSimpleTagExclude/TestSimpleTagExclude.java @@ -27,31 +27,27 @@ * @summary Test the parsing of the -tag option. The user should be able to * exclude a simple tag by using -tag tagname:X * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSimpleTagExclude * @run main TestSimpleTagExclude */ public class TestSimpleTagExclude extends JavadocTester { - private static final String[][] NEGATED_TEST = { - { "DummyClass.html", "todo"} - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-tag", "todo:X", - SRC_DIR + "/DummyClass.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSimpleTagExclude tester = new TestSimpleTagExclude(); - if (tester.run(ARGS, NO_TEST, NEGATED_TEST) != 0) { - throw new Error("Javadoc failed to execute."); - } - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "todo:X", + testSrc("DummyClass.java")); + checkExit(Exit.OK); + + checkOutput("DummyClass.html", false, + "todo"); } } diff --git a/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java b/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java index 76087015065..011533fa379 100644 --- a/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java +++ b/langtools/test/com/sun/javadoc/testSimpleTagInherit/TestSimpleTagInherit.java @@ -25,8 +25,8 @@ * @test * @bug 8008768 8026567 * @summary Using {@inheritDoc} in simple tag defined via -tag fails - * @library ../lib/ - * @build JavadocTester TestSimpleTagInherit + * @library ../lib + * @build JavadocTester * @run main TestSimpleTagInherit */ @@ -34,28 +34,31 @@ public class TestSimpleTagInherit extends JavadocTester { //Javadoc arguments. private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-tag", "custom:optcm:Custom:", - "p" + }; //Input for string search tests. private static final String[][] TEST = { - { "p/TestClass.html", - "
            Custom:
            \n" + - "
            doc for BaseClass class
            " }, - { "p/TestClass.html", - "
            Custom:
            \n" + - "
            doc for BaseClass method
            " } + { } }; - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSimpleTagInherit tester = new TestSimpleTagInherit(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-tag", "custom:optcm:Custom:", + "p"); + checkExit(Exit.OK); + + checkOutput("p/TestClass.html", true, + "
            Custom:
            \n" + + "
            doc for BaseClass class
            ", + "
            Custom:
            \n" + + "
            doc for BaseClass method
            "); } } diff --git a/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java b/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java index 451cd30bf32..49c54abcde3 100644 --- a/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java +++ b/langtools/test/com/sun/javadoc/testSinceTag/TestSinceTag.java @@ -26,44 +26,49 @@ * @bug 7180906 8026567 * @summary Test to make sure that the since tag works correctly * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestSinceTag + * @library ../lib + * @build JavadocTester * @run main TestSinceTag */ public class TestSinceTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[] { - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg1" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR + "-2", "-sourcepath", SRC_DIR, "-nosince", "pkg1" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg1/C1.html", - "
            \n" + - "
            Since:
            \n" + - "
            JDK1.0
            " - }, - { "serialized-form.html", - "
            \n" + - "
            Since:
            \n" + - "
            1.4
            " - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSinceTag tester = new TestSinceTag(); - tester.run(ARGS1, TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, TEST); + tester.runTests(); tester.printSummary(); } + + @Test + void testSince() { + javadoc("-d", "out-since", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.FAILED); // TODO: investigate + + checkSince(true); + } + + @Test + void testNoSince() { + javadoc("-d", "out-nosince", + "-sourcepath", testSrc, + "-nosince", + "pkg1"); + checkExit(Exit.FAILED); // TODO: investigate + + checkSince(false); + } + + void checkSince(boolean on) { + checkOutput("pkg1/C1.html", on, + "
            \n" + + "
            Since:
            \n" + + "
            JDK1.0
            "); + + checkOutput("serialized-form.html", on, + "
            \n" + + "
            Since:
            \n" + + "
            1.4
            "); + } } diff --git a/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java b/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java index 506d85da5e2..bdeaec8defc 100644 --- a/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java +++ b/langtools/test/com/sun/javadoc/testSingleQuotedLink/TestSingleQuotedLink.java @@ -26,35 +26,32 @@ * @bug 6457406 * @summary Verify that a link in single quotes copied to the class-use page as is. * @author Yuri Nesterenko - * @library ../lib/ - * @build JavadocTester TestSingleQuotedLink + * @library ../lib + * @build JavadocTester * @run main TestSingleQuotedLink */ public class TestSingleQuotedLink extends JavadocTester { - // We are testing the redirection algorithm with a known scenario when a writer is not forced to ignore it: "-use". - private static final String[][] TEST = { - { "pkg1/class-use/C1.html", - "" - } - }; - private static final String[][] NEGATED_TEST = { - { "pkg1/class-use/C1.html", - "pkg1/\'http://download.oracle.com/javase/8/docs/technotes/guides/indexC2.html\'>" - } - }; - private static final String[] ARGS = - new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSingleQuotedLink tester = new TestSingleQuotedLink(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void run() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-use", + "pkg1"); + checkExit(Exit.OK); + + // We are testing the redirection algorithm with a known scenario when a + // writer is not forced to ignore it: "-use". + + checkOutput("pkg1/class-use/C1.html", true, + ""); + + checkOutput("pkg1/class-use/C1.html", false, + "pkg1/\'http://download.oracle.com/javase/8/docs/technotes/guides/indexC2.html\'>"); } } diff --git a/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java b/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java index e0a328122ec..1364ece4ae8 100644 --- a/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java +++ b/langtools/test/com/sun/javadoc/testSourceTab/TestSourceTab.java @@ -27,9 +27,8 @@ * @summary Test to make sure that the source documentation is indented properly * when -linksourcetab is used. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSourceTab * @run main TestSourceTab */ @@ -37,45 +36,39 @@ import java.io.*; public class TestSourceTab extends JavadocTester { - private static final String TMP_SRC_DIR = "tmpSrc"; - private static final String OUTPUT_DIR1 = OUTPUT_DIR + "-tabLengthEight"; - private static final String OUTPUT_DIR2 = OUTPUT_DIR + "-tabLengthFour"; - - //Run Javadoc on a source file with that is indented with a single tab per line - private static final String[] ARGS1 = - new String[] { - "-d", OUTPUT_DIR1, "-sourcepath", TMP_SRC_DIR, - "-notimestamp", "-linksource", TMP_SRC_DIR + "/SingleTab/C.java" - }; - - //Run Javadoc on a source file with that is indented with a two tab per line - //If we double the tabs and decrease the tab length by a half, the output should - //be the same as the one generated above. - private static final String[] ARGS2 = - new String[] { - "-d", OUTPUT_DIR2, "-sourcepath", TMP_SRC_DIR, - "-notimestamp", "-sourcetab", "4", TMP_SRC_DIR + "/DoubleTab/C.java" - }; - - //Files to diff - private static final String[] FILES_TO_DIFF = { - "src-html/C.html", - "C.html" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws IOException { + public static void main(String... args) throws Exception { TestSourceTab tester = new TestSourceTab(); - tester.run(ARGS1, NO_TEST, NO_TEST); - tester.run(ARGS2, NO_TEST, NO_TEST); - tester.runDiffs(OUTPUT_DIR1, OUTPUT_DIR2, FILES_TO_DIFF); + tester.runTests(); } - TestSourceTab() throws IOException { - initTabs(new File(SRC_DIR), new File(TMP_SRC_DIR)); + @Test + void test() throws Exception { + String tmpSrcDir = "tmpSrc"; + String outdir1 = "out-tabLengthEight"; + String outdir2 = "out-tabLengthFour"; + initTabs(new File(testSrc), new File(tmpSrcDir)); + + // Run Javadoc on a source file with that is indented with a single tab per line + javadoc("-d", outdir1, + "-sourcepath", tmpSrcDir, + "-notimestamp", + "-linksource", + tmpSrcDir + "/SingleTab/C.java"); + checkExit(Exit.OK); + + // Run Javadoc on a source file with that is indented with a two tab per line + // If we double the tabs and decrease the tab length by a half, the output should + // be the same as the one generated above. + javadoc("-d", outdir2, + "-sourcepath", tmpSrcDir, + "-notimestamp", + "-sourcetab", "4", + tmpSrcDir + "/DoubleTab/C.java"); + checkExit(Exit.OK); + + diff(outdir1, outdir2, + "src-html/C.html", + "C.html"); } void initTabs(File from, File to) throws IOException { @@ -91,26 +84,20 @@ public class TestSourceTab extends JavadocTester { String read(File f) throws IOException { StringBuilder sb = new StringBuilder(); - BufferedReader in = new BufferedReader(new FileReader(f)); - try { + try (BufferedReader in = new BufferedReader(new FileReader(f))) { String line; while ((line = in.readLine()) != null) { sb.append(line); - sb.append("\n"); + sb.append(NL); } - } finally { - in.close(); } return sb.toString(); } void write(File f, String s) throws IOException { f.getParentFile().mkdirs(); - Writer out = new FileWriter(f); - try { + try (Writer out = new FileWriter(f)) { out.write(s); - } finally { - out.close(); } } } diff --git a/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java b/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java index 65ceecdfa98..e433ae8eefb 100644 --- a/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java +++ b/langtools/test/com/sun/javadoc/testStylesheet/TestStylesheet.java @@ -26,132 +26,118 @@ * @bug 4494033 7028815 7052425 8007338 8023608 8008164 8016549 * @summary Run tests on doclet stylesheet. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestStylesheet + * @library ../lib + * @build JavadocTester * @run main TestStylesheet */ public class TestStylesheet extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestStylesheet tester = new TestStylesheet(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + // TODO: most of this test seems a bit silly, since javadoc is simply + // copying in the stylesheet from the source directory + checkOutput("stylesheet.css", true, + "/* Javadoc style sheet */", + "/*\n" + + "Overall document style\n" + + "*/", + "/*\n" + + "Heading styles\n" + + "*/", + "/*\n" + + "Navigation bar styles\n" + + "*/", + "body {\n" + + " background-color:#ffffff;\n" + + " color:#353833;\n" + + " font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;\n" + + " font-size:14px;\n" + + " margin:0;\n" + + "}", + "ul {\n" + + " list-style-type:disc;\n" + + "}", + ".overviewSummary caption, .memberSummary caption, .typeSummary caption,\n" + + ".useSummary caption, .constantsSummary caption, .deprecatedSummary caption {\n" + + " position:relative;\n" + + " text-align:left;\n" + + " background-repeat:no-repeat;\n" + + " color:#253441;\n" + + " font-weight:bold;\n" + + " clear:none;\n" + + " overflow:hidden;\n" + + " padding:0px;\n" + + " padding-top:10px;\n" + + " padding-left:1px;\n" + + " margin:0px;\n" + + " white-space:pre;\n" + + "}", + ".overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,\n" + + ".useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " padding-bottom:7px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#F8981D;\n" + + " border: none;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.activeTableTab span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " margin-right:3px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#F8981D;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.tableTab span {\n" + + " white-space:nowrap;\n" + + " padding-top:5px;\n" + + " padding-left:12px;\n" + + " padding-right:12px;\n" + + " margin-right:3px;\n" + + " display:inline-block;\n" + + " float:left;\n" + + " background-color:#4D7A97;\n" + + " height:16px;\n" + + "}", + ".memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {\n" + + " padding-top:0px;\n" + + " padding-left:0px;\n" + + " padding-right:0px;\n" + + " background-image:none;\n" + + " float:none;\n" + + " display:inline;\n" + + "}", + "@import url('resources/fonts/dejavu.css');"); - //Input for string search tests. - private static final String[][] TEST = { - { "stylesheet.css", - "/* Javadoc style sheet */"}, - { "stylesheet.css", - "/*\n" + - "Overall document style\n" + - "*/"}, - { "stylesheet.css", - "/*\n" + - "Heading styles\n" + - "*/"}, - { "stylesheet.css", - "/*\n" + - "Navigation bar styles\n" + - "*/"}, - { "stylesheet.css", - "body {\n" + - " background-color:#ffffff;\n" + - " color:#353833;\n" + - " font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;\n" + - " font-size:14px;\n" + - " margin:0;\n" + - "}"}, - { "stylesheet.css", - "ul {\n" + - " list-style-type:disc;\n" + - "}"}, - { "stylesheet.css", - ".overviewSummary caption, .memberSummary caption, .typeSummary caption,\n" + - ".useSummary caption, .constantsSummary caption, .deprecatedSummary caption {\n" + - " position:relative;\n" + - " text-align:left;\n" + - " background-repeat:no-repeat;\n" + - " color:#253441;\n" + - " font-weight:bold;\n" + - " clear:none;\n" + - " overflow:hidden;\n" + - " padding:0px;\n" + - " padding-top:10px;\n" + - " padding-left:1px;\n" + - " margin:0px;\n" + - " white-space:pre;\n" + - "}"}, - { "stylesheet.css", - ".overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,\n" + - ".useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " padding-bottom:7px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#F8981D;\n" + - " border: none;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.activeTableTab span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " margin-right:3px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#F8981D;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.tableTab span {\n" + - " white-space:nowrap;\n" + - " padding-top:5px;\n" + - " padding-left:12px;\n" + - " padding-right:12px;\n" + - " margin-right:3px;\n" + - " display:inline-block;\n" + - " float:left;\n" + - " background-color:#4D7A97;\n" + - " height:16px;\n" + - "}"}, - { "stylesheet.css", - ".memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {\n" + - " padding-top:0px;\n" + - " padding-left:0px;\n" + - " padding-right:0px;\n" + - " background-image:none;\n" + - " float:none;\n" + - " display:inline;\n" + - "}"}, - { "stylesheet.css", - "@import url('resources/fonts/dejavu.css');"}, // Test whether a link to the stylesheet file is inserted properly // in the class documentation. - { "pkg/A.html", - ""} - }; - private static final String[][] NEGATED_TEST = { - { "stylesheet.css", - "* {\n" + - " margin:0;\n" + - " padding:0;\n" + - "}"} - }; + checkOutput("pkg/A.html", true, + ""); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestStylesheet tester = new TestStylesheet(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + checkOutput("stylesheet.css", false, + "* {\n" + + " margin:0;\n" + + " padding:0;\n" + + "}"); } } diff --git a/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java b/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java index e5df26063ee..d2342bd0a0f 100644 --- a/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java +++ b/langtools/test/com/sun/javadoc/testSubTitle/TestSubTitle.java @@ -26,44 +26,38 @@ * @bug 7010342 * @summary Test for correct sub title generation. * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSubTitle * @run main TestSubTitle */ public class TestSubTitle extends JavadocTester { - private static final String[][] TEST = { - { "pkg/package-summary.html", - "
            This is the description of package pkg.
            " - }, - { "pkg/C.html", - "
            pkg
            " - } - }; - private static final String[][] NEG_TEST = { - { "pkg/package-summary.html", + public static void main(String... args) throws Exception { + TestSubTitle tester = new TestSubTitle(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/package-summary.html", true, + "
            This is the description of package pkg.
            "); + + checkOutput("pkg/C.html", true, + "
            pkg
            "); + + checkOutput("pkg/package-summary.html", false, "

            \n" + "

            This is the " + "description of package pkg.
            \n" + - "

            " - }, - { "pkg/C.html", - "

            pkg

            " - } - }; - private static final String[] ARGS = new String[]{ - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + "

            "); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestSubTitle tester = new TestSubTitle(); - tester.run(ARGS, TEST, NEG_TEST); - tester.printSummary(); + checkOutput("pkg/C.html", false, + "

            pkg

            "); } } diff --git a/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java b/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java index 3f4cf511aaa..1ffeb024e0e 100644 --- a/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java +++ b/langtools/test/com/sun/javadoc/testSummaryHeading/TestSummaryHeading.java @@ -28,31 +28,26 @@ * "Method Summary" heading should still show up since the class * inherits methods. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSummaryHeading * @run main TestSummaryHeading */ public class TestSummaryHeading extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "C.html", "

            Method Summary

            "} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSummaryHeading tester = new TestSummaryHeading(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "

            Method Summary

            "); } } diff --git a/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java b/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java index 57751a9191b..1ff2c9ad2ce 100644 --- a/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java +++ b/langtools/test/com/sun/javadoc/testSuperclassInSerialForm/TestSuperClassInSerialForm.java @@ -27,30 +27,27 @@ * @summary Test to make sure link to superclass is generated for * each class in serialized form page. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSuperClassInSerialForm * @run main TestSuperClassInSerialForm */ public class TestSuperClassInSerialForm extends JavadocTester { - private static final String[][] TEST = { - { "serialized-form.html", - "
            pkg.SubClass extends SuperClass"} - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSuperClassInSerialForm tester = new TestSuperClassInSerialForm(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("serialized-form.html", true, + "pkg.SubClass" + + " extends SuperClass"); } } diff --git a/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java b/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java index 8b09c1cb1df..7c4355857b8 100644 --- a/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java +++ b/langtools/test/com/sun/javadoc/testSupplementary/TestSupplementary.java @@ -27,9 +27,8 @@ * @summary Test to make sure that "see" tag and "serialField" tag handle supplementary * characters correctly. This test case needs to be run in en_US locale. * @author Naoto Sato - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestSupplementary * @run main TestSupplementary */ @@ -37,33 +36,33 @@ import java.util.Locale; public class TestSupplementary extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "C.java:38: warning - Tag @see:illegal character: \"119040\" in \"C#method\ud834\udd00()"}, - {WARNING_OUTPUT, "C.java:44: warning - illegal character \ud801 in @serialField tag: field\ud801\ud801 int."}, - {WARNING_OUTPUT, "C.java:44: warning - illegal character \ud834\udd7b in @serialField tag: \ud834\udd7bfield int."}, - }; - private static final String[][] NEGATED_TEST = { - {WARNING_OUTPUT, "C.java:14: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:19: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:24: warning - Tag @see:illegal character"}, - {WARNING_OUTPUT, "C.java:31: warning - illegal character"}, - }; - private static final String[] ARGS = new String[] { - "-locale", "en_US", "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { Locale saveLocale = Locale.getDefault(); try { TestSupplementary tester = new TestSupplementary(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); } finally { Locale.setDefault(saveLocale); } } + + @Test + void test() { + javadoc("-locale", "en_US", + "-d", "out", + testSrc("C.java")); + checkExit(Exit.FAILED); + + checkOutput(Output.WARNING, true, + "C.java:38: warning - Tag @see:illegal character: \"119040\" in \"C#method\ud834\udd00()", + "C.java:44: warning - illegal character \ud801 in @serialField tag: field\ud801\ud801 int.", + "C.java:44: warning - illegal character \ud834\udd7b in @serialField tag: \ud834\udd7bfield int."); + + // TODO: do we need to specify the file and line number in these messages? + checkOutput(Output.WARNING, false, + "C.java:14: warning - Tag @see:illegal character", + "C.java:19: warning - Tag @see:illegal character", + "C.java:24: warning - Tag @see:illegal character", + "C.java:31: warning - illegal character"); + } } diff --git a/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java b/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java index 72082856991..4a590de8d52 100644 --- a/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java +++ b/langtools/test/com/sun/javadoc/testTagHolderMethod/TestTagHolderMethod.java @@ -26,7 +26,7 @@ * @bug 4706525 * @summary Determine if the new Tag.holder() method works properly. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestTagHolderMethod * @run main TestTagHolderMethod @@ -36,10 +36,6 @@ import com.sun.javadoc.*; public class TestTagHolderMethod extends JavadocTester { - public static final String[] ARGS = new String[] { - "-docletpath", SRC_DIR, "-doclet", "TestTagHolderMethod", "-sourcepath", - SRC_DIR, "pkg"}; - /** * Doclet entry point. */ @@ -55,14 +51,13 @@ public class TestTagHolderMethod extends JavadocTester { } private static void checkHolders(Doc[] holders) throws Exception { - for (int i = 0; i < holders.length; i++) { - Doc holder = holders[i]; + for (Doc holder : holders) { Tag[] tags = holder.tags(); - for (int j = 0; j < tags.length; j++) { - if (! tags[j].holder().name().equals(holder.name())) { + for (Tag tag : tags) { + if (!tag.holder().name().equals(holder.name())) { throw new Exception("The holder method does not return the correct Doc object."); } else { - System.out.println(tags[j].name() + " is held by " + holder.name()); + System.out.println(tag.name() + " is held by " + holder.name()); } } } @@ -71,9 +66,19 @@ public class TestTagHolderMethod extends JavadocTester { /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { JavadocTester tester = new TestTagHolderMethod(); - tester.run(ARGS, new String[][]{}, new String[][]{}); + tester.runTests(); + } + + @Test + void test() { + javadoc("-docletpath", testSrc, // unlikely to be effective + "-doclet", "TestTagHolderMethod", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); } } diff --git a/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java b/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java index 0a284352309..e3ddc6a636f 100644 --- a/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java +++ b/langtools/test/com/sun/javadoc/testTagInheritence/TestTagInheritence.java @@ -26,46 +26,44 @@ * @bug 4496223 4496270 4618686 4720974 4812240 6253614 6253604 * @summary * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTagInheritence * @run main TestTagInheritence */ +// TODO: Inheritence should be Inheritance! fix separately as noreg-trivial public class TestTagInheritence extends JavadocTester { - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg", - "firstSentence", "firstSentence2" - }; + public static void main(String... args) throws Exception { + TestTagInheritence tester = new TestTagInheritence(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + "-sourcepath", testSrc, + "pkg", "firstSentence", "firstSentence2"); + checkExit(Exit.OK); - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - String[][] tests = new String[42][2]; //Test bad inheritDoc tag warning. - tests[0][0]= WARNING_OUTPUT; - tests[0][1] = "warning - @inheritDoc used but testBadInheritDocTag() " + - "does not override or implement any method."; + checkOutput(Output.WARNING, true, + "warning - @inheritDoc used but testBadInheritDocTag() " + + "does not override or implement any method."); //Test valid usage of inheritDoc tag. - for (int i = 1; i < tests.length-2; i++) { - tests[i][0] = "pkg/TestTagInheritence.html"; - tests[i][1] = "Test " + i + " passes"; + for (int i = 1; i < 40; i++) { + checkOutput("pkg/TestTagInheritence.html", true, + "Test " + i + " passes"); } //First sentence test (6253614) - tests[tests.length - 2][0] = "firstSentence/B.html"; - tests[tests.length - 2][1] = "
            First sentence.
            "; + checkOutput("firstSentence/B.html", true, + "
            First sentence.
            "); //Another first sentence test (6253604) - tests[tests.length - 1][0] = "firstSentence2/C.html"; - tests[tests.length - 1][1] = "
            First sentence.
            "; - - TestTagInheritence tester = new TestTagInheritence(); - tester.run(ARGS, tests, NO_TEST); - tester.printSummary(); + checkOutput("firstSentence2/C.html", true, + "
            First sentence.
            "); } } diff --git a/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java b/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java index 514ee736619..e133189214d 100644 --- a/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java +++ b/langtools/test/com/sun/javadoc/testTagMisuse/TestTagMisuse.java @@ -25,31 +25,35 @@ * @test * @summary Determine if proper warning messages are printed when know. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester * @build TestTagMisuse * @run main TestTagMisuse */ public class TestTagMisuse extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "warning - Tag @param cannot be used in field documentation."}, - {WARNING_OUTPUT, "warning - Tag @throws cannot be used in field documentation."}, - {WARNING_OUTPUT, "warning - Tag @return cannot be used in constructor documentation."}, - {WARNING_OUTPUT, "warning - Tag @throws cannot be used in inline documentation."}, - }; - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/TestTagMisuse.java" - }; - /** * The entry point of the test. * @param args the array of command line arguments. + * @throws Exception if the test fails */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTagMisuse tester = new TestTagMisuse(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("TestTagMisuse.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - Tag @param cannot be used in field documentation.", + "warning - Tag @throws cannot be used in field documentation.", + "warning - Tag @return cannot be used in constructor documentation.", + "warning - Tag @throws cannot be used in inline documentation."); } /** diff --git a/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java b/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java index 09551abb744..bb99e3fdc03 100644 --- a/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java +++ b/langtools/test/com/sun/javadoc/testTagOutput/TestTagOutput.java @@ -28,36 +28,32 @@ * @bug 8026370 8026567 * @summary This test checks the generated tag output. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestTagOutput + * @library ../lib + * @build JavadocTester * @run main TestTagOutput */ public class TestTagOutput extends JavadocTester { - private static final String[][] TEST = { - { "pkg1/DeprecatedTag.html", - "
            Deprecated. 
            "}, - { "pkg1/DeprecatedTag.html", - "
            Deprecated. " + - "Do not use this.
            "}}; - - private static final String[][] NEGATED_TEST = { - { "pkg1/DeprecatedTag.html", - "
            Deprecated." + - " 
            "}}; - - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg1"}; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTagOutput tester = new TestTagOutput(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg1"); + checkExit(Exit.OK); + + checkOutput("pkg1/DeprecatedTag.html", true, + "
            Deprecated. 
            ", + "
            Deprecated. " + + "Do not use this.
            "); + + checkOutput("pkg1/DeprecatedTag.html", false, + "
            Deprecated." + + " 
            "); } } diff --git a/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java b/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java index 43188a842be..9ab76f6b4f4 100644 --- a/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java +++ b/langtools/test/com/sun/javadoc/testTaglets/TestTaglets.java @@ -29,49 +29,41 @@ * Run Javadoc on some sample source that uses {@inheritDoc}. Make * sure that only the first sentence shows up in the summary table. * @author jamieh - * @library ../lib/ - * @build JavadocTester - * @build TestTaglets - * @build taglets.Foo + * @library ../lib + * @build JavadocTester taglets.Foo * @run main TestTaglets */ public class TestTaglets extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS_4654308 = new String[] { - "-d", "4654308", "-tagletpath", SRC_DIR, "-taglet", "taglets.Foo", - "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; - - private static final String[] ARGS_4767038 = new String[] { - "-d", "4767038", "-sourcepath", SRC_DIR, SRC_DIR + "/Parent.java", - SRC_DIR + "/Child.java" - }; - - //Input for string search tests. - private static final String[][] TEST_4654308 = new String[][] { - { "C.html", "Foo:" + - "
            my only method is here" + - "
            "} - }; - - private static final String[][] TEST_4767038 = new String[][] { - { "Child.html", - "This is the first sentence."} - }; - - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTaglets tester = new TestTaglets(); - tester.run(ARGS_4654308, TEST_4654308, NO_TEST); - tester.printSummary(); - tester = new TestTaglets(); - tester.run(ARGS_4767038, TEST_4767038, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test_4654308() { + javadoc("-d", "out-4654308", + "-tagletpath", testSrc, // TODO: probably does no good + "-taglet", "taglets.Foo", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "Foo:" + + "
            my only method is here" + + "
            "); + } + + @Test + void test_4767038() { + javadoc("-d", "out-4767038", + "-sourcepath", testSrc, + testSrc("Parent.java"), testSrc("Child.java")); + checkExit(Exit.OK); + + checkOutput("Child.html", true, + "This is the first sentence."); } } diff --git a/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java b/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java index fca7de722ac..fcec5953a0a 100644 --- a/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java +++ b/langtools/test/com/sun/javadoc/testThrowsHead/TestThrowsHead.java @@ -28,28 +28,25 @@ * not documented with a throws tag, we generate a link to it in the * throws section. Make sure that the link is below a Throws heading. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsHead * @run main TestThrowsHead */ public class TestThrowsHead extends JavadocTester { - private static final String[][] TEST = { - { "C.html", "
            Throws:"} - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestThrowsHead tester = new TestThrowsHead(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("C.html", true, + "
            Throws:"); } } diff --git a/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java b/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java index 543a8a01f09..99fc0a8eadd 100644 --- a/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java +++ b/langtools/test/com/sun/javadoc/testThrowsInheritence/TestThrowsTagInheritence.java @@ -28,36 +28,35 @@ * override the throws tags in interface. This test also verifies that throws tags are inherited properly * the case where the name of one exception is not fully qualified. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsTagInheritence * @run main TestThrowsTagInheritence */ +// TODO: should be TestThrowsInheritance! public class TestThrowsTagInheritence extends JavadocTester { - private static final String[][] TEST = { - //The class should not inherit the tag from the interface. - { "Foo.html", "Test 1 passes."} - }; - private static final String[][] NEGATED_TEST = { - //The class should not inherit the tag from the interface. - { "C.html", "Test 1 fails."} - - }; - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java", - SRC_DIR + "/I.java", SRC_DIR + "/Foo.java", - SRC_DIR + "/Iface.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestThrowsTagInheritence tester = new TestThrowsTagInheritence(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java"), + testSrc("I.java"), + testSrc("Foo.java"), + testSrc("Iface.java")); + checkExit(Exit.OK); + + // The class should not inherit the tag from the interface. + checkOutput("Foo.html", true, + "Test 1 passes."); + + //The class should not inherit the tag from the interface. + checkOutput("C.html", false, + "Test 1 fails."); } } diff --git a/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java b/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java index 63d5280ab3d..3b5b7bca314 100644 --- a/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java +++ b/langtools/test/com/sun/javadoc/testThrowsTag/TestThrowsTag.java @@ -27,22 +27,26 @@ * @summary Test to make sure that exceptions always show up in the * correct order. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestThrowsTag * @run main TestThrowsTag */ public class TestThrowsTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "pkg" - }; + public static void main(String... args) throws Exception { + TestThrowsTag tester = new TestThrowsTag(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/C.html", + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate why failed + + checkOutput("pkg/C.html", true, "
            T1 - the first throws tag.
            \n" + "
            T2 - the second throws tag.
            \n" + "
            T3 - the third throws tag.
            \n" + @@ -51,16 +55,6 @@ public class TestThrowsTag extends JavadocTester { "
            T6 - the second inherited throws tag.
            \n" + "
            T7 - the third inherited throws tag.
            \n" + "
            T8 - the fourth inherited throws tag.
            " - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestThrowsTag tester = new TestThrowsTag(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + ); } } diff --git a/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java b/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java index 1d21d60b7fb..d5e977250b4 100644 --- a/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java +++ b/langtools/test/com/sun/javadoc/testTitleInHref/TestTitleInHref.java @@ -26,42 +26,35 @@ * @bug 4714257 * @summary Test to make sure that the title attribute shows up in links. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTitleInHref * @run main TestTitleInHref */ public class TestTitleInHref extends JavadocTester { - private static final String[][] TEST = { - //Test to make sure that the title shows up in a class link. - { "pkg/Links.html", - ""}, - - //Test to make sure that the title shows up in an interface link. - { "pkg/Links.html", - ""}, - - //Test to make sure that the title shows up in cross link shows up - { "pkg/Links.html", - "This is a cross link to class File"}, - - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - "-linkoffline", "http://java.sun.com/j2se/1.4/docs/api", - SRC_DIR, "pkg" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTitleInHref tester = new TestTitleInHref(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + String uri = "http://java.sun.com/j2se/1.4/docs/api"; + javadoc("-d", "out", + "-sourcepath", testSrc, + "-linkoffline", uri, testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/Links.html", true, + //Test to make sure that the title shows up in a class link. + "", + //Test to make sure that the title shows up in an interface link. + "", + //Test to make sure that the title shows up in cross link shows up + "" + + "This is a cross link to class File"); } } diff --git a/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java b/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java index ba9de8503fb..7d173ed24e6 100644 --- a/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java +++ b/langtools/test/com/sun/javadoc/testTopOption/TestTopOption.java @@ -26,55 +26,44 @@ * @bug 6227616 * @summary Test the new -top option. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestTopOption * @run main TestTopOption */ public class TestTopOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-overview", "SRC_DIR + '/' + overview.html", "-use", "-top", - "TOP TEXT", "-d", OUTPUT_DIR, "-sourcepath", - SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/AnnotationType.html", - "TOP TEXT"}, - { "pkg/class-use/AnnotationType.html", - "TOP TEXT"}, - - { "pkg/Cl.html", - "TOP TEXT"}, - { "pkg/class-use/Cl.html", - "TOP TEXT"}, - - { "pkg/package-summary.html", - "TOP TEXT"}, - { "pkg/package-use.html", - "TOP TEXT"}, - - { "overview-summary.html", - "TOP TEXT"}, - { "overview-tree.html", - "TOP TEXT"}, - { "constant-values.html", - "TOP TEXT"}, - { "help-doc.html", - "TOP TEXT"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestTopOption tester = new TestTopOption(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-overview", testSrc("overview.html"), + "-use", + "-top", "TOP TEXT", + "-d", "out", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkTopText( + "pkg/AnnotationType.html", + "pkg/class-use/AnnotationType.html", + "pkg/Cl.html", + "pkg/class-use/Cl.html", + "pkg/package-summary.html", + "pkg/package-use.html", + "overview-summary.html", + "overview-tree.html", + "constant-values.html", + "help-doc.html"); + } + + void checkTopText(String... files) { + for (String file : files) { + checkOutput(file, true, "TOP TEXT"); + } } } diff --git a/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java b/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java index 7d896b1e172..189369dd226 100644 --- a/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java +++ b/langtools/test/com/sun/javadoc/testTypeAnnotations/TestTypeAnnotations.java @@ -26,360 +26,327 @@ * @bug 8005091 8009686 8025633 8026567 * @summary Make sure that type annotations are displayed correctly * @author Bhavesh Patel - * @library ../lib/ + * @library ../lib * @ignore - * @build JavadocTester TestTypeAnnotations + * @build JavadocTester * @run main TestTypeAnnotations */ public class TestTypeAnnotations extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-private", "typeannos" - }; + public static void main(String... args) throws Exception { + TestTypeAnnotations tester = new TestTypeAnnotations(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + "-private", + "typeannos"); + checkExit(Exit.OK); - //Input for string search tests. - private static final String[][] TEST = { // Test for type annotations on Class Extends (ClassExtends.java). - { "typeannos/MyClass.html", - "extends @ClassExtA ParameterizedClass<" + - "@ClassExtB java.lang.String>" - }, - { "typeannos/MyClass.html", - "implements @ClassExtB java.lang.CharSequence, " + - "@ClassExtA ParameterizedInterface<" + - "@ClassExtB java.lang.String>" - }, - { "typeannos/MyInterface.html", - "extends @ClassExtA " + - "ParameterizedInterface<@ClassExtA java.lang.String>, " + - "@ClassExtB java.lang.CharSequence" - }, + checkOutput("typeannos/MyClass.html", true, + "extends @ClassExtA ParameterizedClass<" + + "@ClassExtB java.lang.String>", + + "implements @ClassExtB java.lang.CharSequence, " + + "@ClassExtA ParameterizedInterface<" + + "@ClassExtB java.lang.String>"); + + checkOutput("typeannos/MyInterface.html", true, + "extends @ClassExtA " + + "ParameterizedInterface<@ClassExtA java.lang.String>, " + + "@ClassExtB java.lang.CharSequence"); // Test for type annotations on Class Parameters (ClassParameters.java). - { "typeannos/ExtendsBound.html", - "class ExtendsBound<K extends @ClassParamA java.lang.String>" - }, - { "typeannos/ExtendsGeneric.html", - "
            class ExtendsGeneric<K extends " +
            -            "@ClassParamA Unannotated<" +
            -            "@ClassParamB java.lang.String>>"
            -        },
            -        { "typeannos/TwoBounds.html",
            -            "
            class TwoBounds<K extends " +
            -            "@ClassParamA java.lang.String,V extends @ClassParamB" +
            -            " java.lang.String>"
            -        },
            -        { "typeannos/Complex1.html",
            -            "class Complex1<K extends " +
            -            "@ClassParamA java.lang.String & java.lang.Runnable>"
            -        },
            -        { "typeannos/Complex2.html",
            -            "class Complex2<K extends java.lang." +
            -            "String & @ClassParamB java.lang.Runnable>"
            -        },
            -        { "typeannos/ComplexBoth.html",
            -            "class ComplexBoth<K extends @ClassParamA java.lang.String & @ClassParamA" +
            -            " java.lang.Runnable>"
            -        },
            +        checkOutput("typeannos/ExtendsBound.html", true,
            +                "class ExtendsBound<K extends @ClassParamA java.lang.String>");
            +
            +        checkOutput("typeannos/ExtendsGeneric.html", true,
            +                "
            class ExtendsGeneric<K extends "
            +                + "@ClassParamA Unannotated<"
            +                + "@ClassParamB java.lang.String>>");
            +
            +        checkOutput("typeannos/TwoBounds.html", true,
            +                "
            class TwoBounds<K extends "
            +                + "@ClassParamA java.lang.String,V extends @ClassParamB"
            +                + " java.lang.String>");
            +
            +        checkOutput("typeannos/Complex1.html", true,
            +                "class Complex1<K extends "
            +                + "@ClassParamA java.lang.String & java.lang.Runnable>");
            +
            +        checkOutput("typeannos/Complex2.html", true,
            +                "class Complex2<K extends java.lang."
            +                + "String & @ClassParamB java.lang.Runnable>");
            +
            +        checkOutput("typeannos/ComplexBoth.html", true,
            +                "class ComplexBoth<K extends @ClassParamA java.lang.String & @ClassParamA"
            +                + " java.lang.Runnable>");
             
                     // Test for type annotations on fields (Fields.java).
            -        { "typeannos/DefaultScope.html",
            -            "
            Parameterized<@FldA java.lang.String," +
            -            "@FldB java.lang.String> bothTypeArgs
            " - }, - { "typeannos/DefaultScope.html", - "
            @FldA java.lang.String @FldB [] " +
            -            "array1Deep
            " - }, - { "typeannos/DefaultScope.html", - "
            java.lang.String[] @FldB [] array2SecondOld
            " - }, - { "typeannos/DefaultScope.html", - "
            @FldD java.lang.String @FldC @FldA" +
            -            " [] @FldC @FldB [] array2Deep
            " - }, - { "typeannos/ModifiedScoped.html", - "
            public final Parameterized<@FldA " +
            -            "Parameterized<@FldA java.lang.String," +
            -            "@FldB java.lang.String>,@FldB java.lang.String> " +
            -            "nestedParameterized
            " - }, - { "typeannos/ModifiedScoped.html", - "
            public final @FldA java.lang.String[][] " +
            -            "array2
            " - }, + checkOutput("typeannos/DefaultScope.html", true, + "
            Parameterized<@FldA java.lang.String,"
            +                + "@FldB java.lang.String> bothTypeArgs
            ", + + "
            @FldA java.lang.String @FldB [] "
            +                + "array1Deep
            ", + + "
            java.lang.String[] @FldB [] array2SecondOld
            ", + + "
            @FldD java.lang.String @FldC @FldA"
            +                + " [] @FldC @FldB [] array2Deep
            "); + + checkOutput("typeannos/ModifiedScoped.html", true, + "
            public final Parameterized<@FldA "
            +                + "Parameterized<@FldA java.lang.String,"
            +                + "@FldB java.lang.String>,@FldB java.lang.String> "
            +                + "nestedParameterized
            ", + + "
            public final @FldA java.lang.String[][] "
            +                + "array2
            "); // Test for type annotations on method return types (MethodReturnType.java). - { "typeannos/MtdDefaultScope.html", - "
            public <T> @MRtnA java.lang.String" +
            -            " method()
            " - }, - { "typeannos/MtdDefaultScope.html", - "
            @MRtnA java.lang.String @MRtnA [] " +
            -            "@MRtnB [] array2Deep()
            " - }, - { "typeannos/MtdDefaultScope.html", - "
            @MRtnA java.lang.String[][] array2()
            " - }, - { "typeannos/MtdModifiedScoped.html", - "
            public final MtdParameterized<@MRtnA " +
            -            "MtdParameterized<@MRtnA java.lang." +
            -            "String,@MRtnB java.lang.String>,@MRtnB java." +
            -            "lang.String> nestedMtdParameterized()
            " - }, + checkOutput("typeannos/MtdDefaultScope.html", true, + "
            public <T> @MRtnA java.lang.String"
            +                + " method()
            ", + + "
            @MRtnA java.lang.String @MRtnA [] "
            +                + "@MRtnB [] array2Deep()
            ", + + "
            @MRtnA java.lang.String[][] array2()
            "); + + checkOutput("typeannos/MtdModifiedScoped.html", true, + "
            public final MtdParameterized<@MRtnA "
            +                + "MtdParameterized<@MRtnA java.lang."
            +                + "String,@MRtnB java.lang.String>,@MRtnB java."
            +                + "lang.String> nestedMtdParameterized()
            "); // Test for type annotations on method type parameters (MethodTypeParameters.java). - { "typeannos/UnscopedUnmodified.html", - "
            <K extends @MTyParamA java.lang.String>" +
            -            " void methodExtends()
            " - }, - { "typeannos/UnscopedUnmodified.html", - "
            <K extends @MTyParamA " +
            -            "MtdTyParameterized<@MTyParamB java.lang.String" +
            -            ">> void nestedExtends()
            " - }, - { "typeannos/PublicModifiedMethods.html", - "
            public final <K extends @MTyParamA " +
            -            "java.lang.String> void methodExtends()
            " - }, - { "typeannos/PublicModifiedMethods.html", - "
            public final <K extends @MTyParamA " +
            -            "java.lang.String,V extends @MTyParamA " +
            -            "MtdTyParameterized<@MTyParamB java.lang.String" +
            -            ">> void dual()
            " - }, + checkOutput("typeannos/UnscopedUnmodified.html", true, + "
            <K extends @MTyParamA java.lang.String>"
            +                + " void methodExtends()
            ", + + "
            <K extends @MTyParamA "
            +                + "MtdTyParameterized<@MTyParamB java.lang.String"
            +                + ">> void nestedExtends()
            "); + + checkOutput("typeannos/PublicModifiedMethods.html", true, + "
            public final <K extends @MTyParamA "
            +                + "java.lang.String> void methodExtends()
            ", + + "
            public final <K extends @MTyParamA "
            +                + "java.lang.String,V extends @MTyParamA "
            +                + "MtdTyParameterized<@MTyParamB java.lang.String"
            +                + ">> void dual()
            "); // Test for type annotations on parameters (Parameters.java). - { "typeannos/Parameters.html", - "
            void unannotated(" +
            -            "ParaParameterized<java.lang.String,java.lang.String>" +
            -            " a)
            " - }, - { "typeannos/Parameters.html", - "
            void nestedParaParameterized(" +
            -            "ParaParameterized<@ParamA " +
            -            "ParaParameterized<@ParamA java.lang.String," +
            -            "@ParamB java.lang.String>,@ParamB" +
            -            " java.lang.String> a)
            " - }, - { "typeannos/Parameters.html", - "
            void array2Deep(@ParamA java.lang.String " +
            -            "@ParamA [] @ParamB [] a)
            " - }, + checkOutput("typeannos/Parameters.html", true, + "
            void unannotated("
            +                + "ParaParameterized<java.lang.String,java.lang.String>"
            +                + " a)
            ", + + "
            void nestedParaParameterized("
            +                + "ParaParameterized<@ParamA "
            +                + "ParaParameterized<@ParamA java.lang.String,"
            +                + "@ParamB java.lang.String>,@ParamB"
            +                + " java.lang.String> a)
            ", + + "
            void array2Deep(@ParamA java.lang.String "
            +                + "@ParamA [] @ParamB [] a)
            "); // Test for type annotations on throws (Throws.java). - { "typeannos/ThrDefaultUnmodified.html", - "
            void oneException()\n" +
            -            "           throws @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrDefaultUnmodified.html", - "
            void twoExceptions()\n" +
            -            "            throws @ThrA java.lang.RuntimeException,\n" +
            -            "                   @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrPublicModified.html", - "
            public final void oneException(java.lang.String a)\n" +
            -            "                        throws @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrPublicModified.html", - "
            public final void twoExceptions(java.lang.String a)\n" +
            -            "                         throws @ThrA java.lang.RuntimeException,\n" +
            -            "                                @ThrA java.lang.Exception
            " - }, - { "typeannos/ThrWithValue.html", - "
            void oneException()\n" +
            -            "           throws @ThrB(value=\"m\") java.lang.Exception
            " - }, - { "typeannos/ThrWithValue.html", - "
            void twoExceptions()\n" +
            -            "            throws @ThrB(value=\"m\") java.lang.RuntimeException,\n" +
            -            "                   @ThrA java.lang.Exception
            " - }, + checkOutput("typeannos/ThrDefaultUnmodified.html", true, + "
            void oneException()\n"
            +                + "           throws @ThrA java.lang.Exception
            ", + + "
            void twoExceptions()\n"
            +                + "            throws @ThrA java.lang.RuntimeException,\n"
            +                + "                   @ThrA java.lang.Exception
            "); + + checkOutput("typeannos/ThrPublicModified.html", true, + "
            public final void oneException(java.lang.String a)\n"
            +                + "                        throws @ThrA java.lang.Exception
            ", + + "
            public final void twoExceptions(java.lang.String a)\n"
            +                + "                         throws @ThrA java.lang.RuntimeException,\n"
            +                + "                                @ThrA java.lang.Exception
            "); + + checkOutput("typeannos/ThrWithValue.html", true, + "
            void oneException()\n"
            +                + "           throws @ThrB(value=\"m\") java.lang.Exception
            ", + + "
            void twoExceptions()\n"
            +                + "            throws @ThrB(value=\"m\") java.lang.RuntimeException,\n"
            +                + "                   @ThrA java.lang.Exception
            "); // Test for type annotations on type parameters (TypeParameters.java). - { "typeannos/TestMethods.html", - "
            <K,V extends @TyParaA java.lang.String> " +
            -            "void secondAnnotated()
            " - }, + checkOutput("typeannos/TestMethods.html", true, + "
            <K,V extends @TyParaA java.lang.String> "
            +                + "void secondAnnotated()
            "); // Test for type annotations on wildcard type (Wildcards.java). - { "typeannos/BoundTest.html", - "
            void wcExtends(MyList<? extends @WldA" +
            -            " java.lang.String> l)
            " - }, - { "typeannos/BoundTest.html", - "
            MyList<? super @WldA java.lang.String>" +
            -            " returnWcSuper()
            " - }, - { "typeannos/BoundWithValue.html", - "
            void wcSuper(MyList<? super @WldB(value=\"m\") java.lang." +
            -            "String> l)
            " - }, - { "typeannos/BoundWithValue.html", - "
            MyList<? extends @WldB(value=\"m\") java.lang.String" +
            -            "> returnWcExtends()
            " - }, + checkOutput("typeannos/BoundTest.html", true, + "
            void wcExtends(MyList<? extends @WldA"
            +                + " java.lang.String> l)
            ", + + "
            MyList<? super @WldA java.lang.String>"
            +                + " returnWcSuper()
            "); + + checkOutput("typeannos/BoundWithValue.html", true, + "
            void wcSuper(MyList<? super @WldB(value=\"m\") java.lang."
            +                + "String> l)
            ", + + "
            MyList<? extends @WldB(value=\"m\") java.lang.String"
            +                + "> returnWcExtends()
            "); // Test for receiver annotations (Receivers.java). - { "typeannos/DefaultUnmodified.html", - "
            void withException(@RcvrA " +
            -            "DefaultUnmodified this)\n" +
            -            "            throws java." +
            -            "lang.Exception
            " - }, - { "typeannos/DefaultUnmodified.html", - "
            java.lang.String nonVoid(@RcvrA @RcvrB" +
            -            "(value=\"m\")" +
            -            " DefaultUnmodified this)
            " - }, - { "typeannos/DefaultUnmodified.html", - "
            <T extends java.lang.Runnable> void accept(" +
            -            "@RcvrA DefaultUnmodified this,\n" +
            -            "                                           T r)\n" +
            -            "                                    throws java.lang.Exception
            " - }, - { "typeannos/PublicModified.html", - "
            public final java.lang.String nonVoid(" +
            -            "@RcvrA PublicModified this)
            " - }, - { "typeannos/PublicModified.html", - "
            public final <T extends java.lang.Runnable> " +
            -            "void accept(@RcvrA PublicModified this,\n" +
            -            "                                                        T r)\n" +
            -            "                                                 throws java.lang.Exception
            " - }, - { "typeannos/WithValue.html", - "
            <T extends java.lang.Runnable> void accept(" +
            -            "@RcvrB(" +
            -            "value=\"m\") WithValue this,\n" +
            -            "                                           T r)\n" +
            -            "                                    throws java.lang.Exception
            " - }, - { "typeannos/WithFinal.html", - "
            java.lang.String nonVoid(@RcvrB(value=\"m\") WithFinal" +
            -            " this)
            " - }, - { "typeannos/WithBody.html", - "
            void field(@RcvrA WithBody this)
            " - }, - { "typeannos/Generic2.html", - "
            void test2(@RcvrA Generic2<X> this)
            " - } - }; + checkOutput("typeannos/DefaultUnmodified.html", true, + "
            void withException(@RcvrA "
            +                + "DefaultUnmodified this)\n"
            +                + "            throws java."
            +                + "lang.Exception
            ", - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTypeAnnotations tester = new TestTypeAnnotations(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + "
            java.lang.String nonVoid(@RcvrA @RcvrB"
            +                + "(value=\"m\")"
            +                + " DefaultUnmodified this)
            ", + + "
            <T extends java.lang.Runnable> void accept("
            +                + "@RcvrA DefaultUnmodified this,\n"
            +                + "                                           T r)\n"
            +                + "                                    throws java.lang.Exception
            "); + + checkOutput("typeannos/PublicModified.html", true, + "
            public final java.lang.String nonVoid("
            +                + "@RcvrA PublicModified this)
            ", + + "
            public final <T extends java.lang.Runnable> "
            +                + "void accept(@RcvrA PublicModified this,\n"
            +                + "                                                        T r)\n"
            +                + "                                                 throws java.lang.Exception
            "); + + checkOutput("typeannos/WithValue.html", true, + "
            <T extends java.lang.Runnable> void accept("
            +                + "@RcvrB("
            +                + "value=\"m\") WithValue this,\n"
            +                + "                                           T r)\n"
            +                + "                                    throws java.lang.Exception
            "); + + checkOutput("typeannos/WithFinal.html", true, + "
            java.lang.String nonVoid(@RcvrB(value=\"m\") WithFinal"
            +                + " this)
            "); + + checkOutput("typeannos/WithBody.html", true, + "
            void field(@RcvrA WithBody this)
            "); + + checkOutput("typeannos/Generic2.html", true, + "
            void test2(@RcvrA Generic2<X> this)
            "); } } diff --git a/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java b/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java index d07899011ca..0612c6af322 100644 --- a/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java +++ b/langtools/test/com/sun/javadoc/testTypeParams/TestTypeParameters.java @@ -30,66 +30,61 @@ * class-use pages. The class/annotation pages should check for type * parameter links in the class/annotation signature section when -linksource is set. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestTypeParameters + * @library ../lib + * @build JavadocTester * @run main TestTypeParameters */ public class TestTypeParameters extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS1 = new String[]{ - "-d", OUTPUT_DIR + "-1", "-use", "-sourcepath", SRC_DIR, - "pkg" - }; - private static final String[] ARGS2 = new String[]{ - "-d", OUTPUT_DIR + "-2", "-linksource", "-sourcepath", SRC_DIR, - "pkg" - }; + public static void main(String... args) throws Exception { + TestTypeParameters tester = new TestTypeParameters(); + tester.runTests(); + } - //Input for string search tests. - private static final String[][] TEST1 = { - { "pkg/C.html", - "
            " - }, - { "pkg/C.html", - "<T> java.lang.Object" - }, - { "pkg/package-summary.html", - "C<E extends Parent>" - }, - { "pkg/class-use/Foo4.html", - "" + - "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + - "Foo4>>>" - }, - //Nested type parameters - { "pkg/C.html", - "\n" + - "\n" + - "" - }, - }; - private static final String[][] TEST2 = { - { "pkg/ClassUseTest3.html", + @Test + void test1() { + javadoc("-d", "out-1", + "-use", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/C.html", true, + "", + "<T> java.lang.Object"); + + checkOutput("pkg/package-summary.html", true, + "C<E extends Parent>"); + + checkOutput("pkg/class-use/Foo4.html", true, + "" + + "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + + "Foo4>>>"); + + // Nested type parameters + checkOutput("pkg/C.html", true, + "\n" + + "\n" + + ""); + } + + + @Test + void test2() { + javadoc("-d", "out-2", + "-linksource", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/ClassUseTest3.html", true, "public class " + "ClassUseTest3<T extends ParamTest2<java.util.List<? extends " + - "Foo4>>>" - } - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { - TestTypeParameters tester = new TestTypeParameters(); - tester.run(ARGS1, TEST1, NO_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + "Foo4>>>"); } } diff --git a/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java b/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java index ff61c3459a7..85e8a42d912 100644 --- a/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java +++ b/langtools/test/com/sun/javadoc/testUnnamedPackage/TestUnnamedPackage.java @@ -27,49 +27,40 @@ * @summary Reference unnamed package as "Unnamed", not empty string. * Generate a package summary for the unnamed package. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestUnnamedPackage * @run main TestUnnamedPackage */ public class TestUnnamedPackage extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, SRC_DIR + "/C.java" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "package-summary.html", - "

            Package <Unnamed>

            " - }, - { "package-summary.html", - "This is a package comment for the unnamed package." - }, - { "package-summary.html", - "This is a class in the unnamed package." - }, - { "package-tree.html", - "

            Hierarchy For Package <Unnamed>

            " - }, - { "index-all.html", - "title=\"class in <Unnamed>\"" - }, - { "C.html", ""} - }; - private static final String[][] NEGATED_TEST = { - {ERROR_OUTPUT, "BadSource"}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestUnnamedPackage tester = new TestUnnamedPackage(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-sourcepath", testSrc, + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput("package-summary.html", true, + "

            Package <Unnamed>

            ", + "This is a package comment for the unnamed package.", + "This is a class in the unnamed package."); + + checkOutput("package-tree.html", true, + "

            Hierarchy For Package <Unnamed>

            "); + + checkOutput("index-all.html", true, + "title=\"class in <Unnamed>\""); + + checkOutput("C.html", true, + "
            "); + + checkOutput(Output.ERROR, false, + "BadSource"); } } diff --git a/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java index 594c61aaf40..572aa097f94 100644 --- a/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java +++ b/langtools/test/com/sun/javadoc/testUseOption/TestUseOption.java @@ -26,100 +26,76 @@ * @bug 4496290 4985072 7006178 7068595 8016328 * @summary A simple test to determine if -use works. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestUseOption * @run main TestUseOption */ public class TestUseOption extends JavadocTester { - //Input for string search tests. - private static final String[] TEST2 = { - "Field in C1.", - "Field in C2.", - "Field in C4.", - "Field in C5.", - "Field in C6.", - "Field in C7.", - "Field in C8.", - "Method in C1.", - "Method in C2.", - "Method in C4.", - "Method in C5.", - "Method in C6.", - "Method in C7.", - "Method in C8.", - }; - - private static final String[][] TEST3 = { - { "class-use/UsedInC.html", - "Uses of " + - "UsedInC in <Unnamed>" - }, - { "package-use.html", - "" - } - }; - - private static final String[][] TEST4 = { - { "pkg2/class-use/C3.html", - "" + - "Frames" - } - }; - - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR+"-2", "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - private static final String[] ARGS3 = new String[] { - "-d", OUTPUT_DIR + "-3", "-sourcepath", SRC_DIR, "-use", - SRC_DIR + "/C.java", SRC_DIR + "/UsedInC.java" - }; - - private static final String[] ARGS4 = new String[] { - "-d", OUTPUT_DIR + "-4", "-sourcepath", SRC_DIR, "-use", "pkg1", "pkg2" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) throws Exception { - String[][] tests = new String[11][2]; - //Eight tests for class use. - for (int i = 0; i < 8; i++) { - tests[i][0] = "pkg1/class-use/C1.html"; - tests[i][1] = "Test " + (i + 1) + " passes"; - } - //Three more tests for package use. - for (int i = 8, j = 1; i < tests.length; i++, j++) { - tests[i][0] = "pkg1/package-use.html"; - tests[i][1] = "Test " + j + " passes"; - } + public static void main(String... args) throws Exception { TestUseOption tester = new TestUseOption(); - tester.run(ARGS, tests, NO_TEST); - tester.printSummary(); - tester.run(ARGS2, NO_TEST, NO_TEST); - String usePageContents = tester.readFileToString("pkg1/class-use/UsedClass.html"); - int prevIndex = -1; - int currentIndex = -1; - for (int i = 0; i < TEST2.length; i++) { - currentIndex = usePageContents.indexOf(TEST2[i]); - System.err.println(TEST2[i] + " at index " + currentIndex); - if (currentIndex < prevIndex) - throw new Exception(TEST2[i] + " is in the wrong order."); - prevIndex = currentIndex; + tester.runTests(); + } + + @Test + void test1() { + javadoc("-d", "out-1", + "-sourcepath", testSrc, + "-use", + "pkg1", "pkg2"); + checkExit(Exit.OK); + + // Eight tests for class use. + for (int i = 1; i <= 8; i++) { + checkOutput("pkg1/class-use/C1.html", true, + "Test " + i + " passes"); } - tester.printSummary(); - tester.run(ARGS3, TEST3, NO_TEST); - tester.run(ARGS4, TEST4, NO_TEST); - tester.printSummary(); + + // Three more tests for package use. + for (int i = 1; i <= 3; i++) { + checkOutput("pkg1/package-use.html", true, + "Test " + i + " passes"); + } + + checkOrder("pkg1/class-use/UsedClass.html", + "Field in C1.", + "Field in C2.", + "Field in C4.", + "Field in C5.", + "Field in C6.", + "Field in C7.", + "Field in C8.", + "Method in C1.", + "Method in C2.", + "Method in C4.", + "Method in C5.", + "Method in C6.", + "Method in C7.", + "Method in C8." + ); + + checkOutput("pkg2/class-use/C3.html", true, + "" + + "Frames" + ); + } + + @Test + void test2() { + javadoc("-d", "out-2", + "-sourcepath", testSrc, + "-use", + testSrc("C.java"), testSrc("UsedInC.java")); + checkExit(Exit.OK); + + checkOutput("class-use/UsedInC.html", true, + "Uses of " + + "UsedInC in <Unnamed>" + ); + checkOutput("package-use.html", true, + "" + ); } } diff --git a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java index 1c34fd5295c..9dfe0921493 100644 --- a/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java +++ b/langtools/test/com/sun/javadoc/testValueTag/TestValueTag.java @@ -27,141 +27,114 @@ * @summary This test ensures that the value tag works in all * use cases. The explainations for each test case are written below. * @author jamieh - * @library ../lib/ - * @build JavadocTester TestValueTag + * @library ../lib + * @build JavadocTester * @run main TestValueTag */ public class TestValueTag extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = - new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-tag", - "todo", "pkg1", "pkg2" - }; - - private static final String[] ARGS1 = - new String[] { - "-Xdoclint:none", - "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "-tag", - "todo", "pkg1", "pkg2" - }; - - //Input for string search tests. - private static final String[][] TEST = { - //Base case: using @value on a constant. - { "pkg1/Class1.html", - "Result: \"Test 1 passes\""}, - //Retrieve value of constant in same class. - { "pkg1/Class1.html", - "Result: \"Test 2 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 3 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 4 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 5 passes\""}, - { "pkg1/Class1.html", - "Result: \"Test 6 passes\""}, - //Retrieve value of constant in different class. - { "pkg1/Class2.html", - "Result: \"Test 7 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 8 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 9 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 10 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 11 passes\""}, - //Retrieve value of constant in different package - { "pkg1/Class2.html", - "Result: \"Test 12 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 13 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 14 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 15 passes\""}, - { "pkg1/Class2.html", - "Result: \"Test 16 passes\""}, - //Retrieve value of constant from a package page - { "pkg2/package-summary.html", - "Result: \"Test 17 passes\""}, - //Test @value tag used with custom tag. - { "pkg1/CustomTagUsage.html", - "
            Todo:
            \n" + - "
            the value of this constant is 55.
            "}, - //Test @value errors printed dues to invalid use or when used with - //non-constant or with bad references. - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Result: {@value TEST_12_ERROR}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Result: {@value}" - }, - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Result: {@value NULL}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Invalid (null): {@value}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * Invalid (non-constant field): {@value}" - }, - {ERROR_OUTPUT,"error: value does not refer to a constant\n" + - " * Here is a bad value reference: {@value UnknownClass#unknownConstant}" - }, - {ERROR_OUTPUT,"error: reference not found\n" + - " * Here is a bad value reference: {@value UnknownClass#unknownConstant}" - }, - {ERROR_OUTPUT,"error: {@value} not allowed here\n" + - " * @todo the value of this constant is {@value}" - } - }; - private static final String[][] TEST1 = { - //Test @value warning printed when used with non-constant. - {WARNING_OUTPUT,"warning - @value tag (which references nonConstant) " + - "can only be used in constants." - }, - {WARNING_OUTPUT,"warning - @value tag (which references NULL) " + - "can only be used in constants." - }, - {WARNING_OUTPUT,"warning - @value tag (which references TEST_12_ERROR) " + - "can only be used in constants." - }, - //Test warning printed for bad reference. - {WARNING_OUTPUT,"warning - UnknownClass#unknownConstant (referenced by " + - "@value tag) is an unknown reference." - }, - //Test warning printed for invalid use of @value. - {WARNING_OUTPUT,"warning - @value tag cannot be used here." - } - }; - private static final String[][] NEGATED_TEST = { - //Base case: using @value on a constant. - { "pkg1/Class1.html", - "Result: \"Test 12 " + - "generates an error message\""}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestValueTag tester = new TestValueTag(); - tester.run(ARGS, TEST, NEGATED_TEST); - checkForException(tester); - tester.run(ARGS1, TEST1, NO_TEST); - checkForException(tester); - tester.printSummary(); + tester.runTests(); } - public static void checkForException(TestValueTag tester) { - if (tester.getErrorOutput().contains("DocletAbortException")) { - throw new AssertionError("javadoc threw DocletAbortException"); - } + @Test + void test1() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-tag", "todo", + "pkg1", "pkg2"); + checkExit(Exit.FAILED); + + checkOutput("pkg1/Class1.html", true, + // Base case: using @value on a constant. + "Result: \"Test 1 passes\"", + // Retrieve value of constant in same class. + "Result: \"Test 2 passes\"", + "Result: \"Test 3 passes\"", + "Result: \"Test 4 passes\"", + "Result: \"Test 5 passes\"", + "Result: \"Test 6 passes\""); + + checkOutput("pkg1/Class2.html", true, + // Retrieve value of constant in different class. + "Result: \"Test 7 passes\"", + "Result: \"Test 8 passes\"", + "Result: \"Test 9 passes\"", + "Result: \"Test 10 passes\"", + "Result: \"Test 11 passes\"", + // Retrieve value of constant in different package + "Result: \"Test 12 passes\"", + "Result: \"Test 13 passes\"", + "Result: \"Test 14 passes\"", + "Result: \"Test 15 passes\"", + "Result: \"Test 16 passes\""); + + checkOutput("pkg2/package-summary.html", true, + // Retrieve value of constant from a package page + "Result: \"Test 17 passes\""); + + checkOutput("pkg1/CustomTagUsage.html", true, + // Test @value tag used with custom tag. + "
            Todo:
            \n" + + "
            the value of this constant is 55.
            "); + + checkOutput(Output.ERROR, true, + // Test @value errors printed due to invalid use or when used with + // non-constant or with bad references. + "error: value does not refer to a constant\n" + + " * Result: {@value TEST_12_ERROR}", + "error: {@value} not allowed here\n" + + " * Result: {@value}", + "error: value does not refer to a constant\n" + + " * Result: {@value NULL}", + "error: {@value} not allowed here\n" + + " * Invalid (null): {@value}", + "error: {@value} not allowed here\n" + + " * Invalid (non-constant field): {@value}", + "error: value does not refer to a constant\n" + + " * Here is a bad value reference: {@value UnknownClass#unknownConstant}", + "error: reference not found\n" + + " * Here is a bad value reference: {@value UnknownClass#unknownConstant}", + "error: {@value} not allowed here\n" + + " * @todo the value of this constant is {@value}" + ); + + checkOutput("pkg1/Class1.html", false, + //Base case: using @value on a constant. + "Result: \"Test 12 " + + "generates an error message\""); + + checkForException(); + } + + @Test() + void test2() { + javadoc("-Xdoclint:none", + "-d", "out2", + "-sourcepath", testSrc, + "-tag", "todo", + "pkg1", "pkg2"); + checkExit(Exit.OK); + checkOutput(Output.WARNING, true, + //Test @value warning printed when used with non-constant. + "warning - @value tag (which references nonConstant) " + + "can only be used in constants.", + "warning - @value tag (which references NULL) " + + "can only be used in constants.", + "warning - @value tag (which references TEST_12_ERROR) " + + "can only be used in constants.", + //Test warning printed for bad reference. + "warning - UnknownClass#unknownConstant (referenced by " + + "@value tag) is an unknown reference.", + //Test warning printed for invalid use of @value. + "warning - @value tag cannot be used here." + ); + checkForException(); + } + + void checkForException() { + checkOutput(Output.STDERR, false, "DocletAbortException"); } } diff --git a/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java b/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java index 637d4d6ee24..8d090f9bf5a 100644 --- a/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java +++ b/langtools/test/com/sun/javadoc/testWarnBadParamNames/TestWarnBadParamNames.java @@ -24,33 +24,31 @@ /* * @test * @bug 4693440 - * @summary Test to make sure that warning is printed when bad paramenter + * @summary Test to make sure that warning is printed when bad parameter * name is used with param. * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestWarnBadParamNames * @run main TestWarnBadParamNames */ public class TestWarnBadParamNames extends JavadocTester { - private static final String[][] TEST = { - {WARNING_OUTPUT, "warning - @param argument \"int\" is not a parameter name."}, - {WARNING_OUTPUT, "warning - @param argument \"IDontExist\" is not a parameter name."}, - {WARNING_OUTPUT, "warning - Parameter \"arg\" is documented more than once."}, - }; - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR, SRC_DIR + "/C.java" - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestWarnBadParamNames tester = new TestWarnBadParamNames(); - tester.run(ARGS, TEST, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-Xdoclint:none", + "-d", "out", + testSrc("C.java")); + checkExit(Exit.OK); + + checkOutput(Output.WARNING, true, + "warning - @param argument \"int\" is not a parameter name.", + "warning - @param argument \"IDontExist\" is not a parameter name.", + "warning - Parameter \"arg\" is documented more than once."); } } diff --git a/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java b/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java index c2c13ab736a..8554624ac48 100644 --- a/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java +++ b/langtools/test/com/sun/javadoc/testWarnings/TestWarnings.java @@ -30,55 +30,50 @@ * a "link unresolved" warning. * Make sure error message starts with "error -". * @author jamieh - * @library ../lib/ + * @library ../lib * @build JavadocTester - * @build TestWarnings * @run main TestWarnings */ public class TestWarnings extends JavadocTester { - - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-1", "-sourcepath", SRC_DIR, "pkg" - }; - - private static final String[] ARGS2 = new String[] { - "-Xdoclint:none", "-d", OUTPUT_DIR + "-2", "-private", "-sourcepath", SRC_DIR, - "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - {WARNING_OUTPUT, - "X.java:11: warning - Missing closing '}' character for inline tag"}, - {ERROR_OUTPUT, - "package.html: error - Body tag missing from HTML"}, - - }; - private static final String[][] NEGATED_TEST = { - { "pkg/X.html", "can't find m()"}, - { "pkg/X.html", "can't find X()"}, - { "pkg/X.html", "can't find f"}, - }; - - private static final String[][] TEST2 = { - { "pkg/X.html", - "m()
            "}, - { "pkg/X.html", - "X()
            "}, - { "pkg/X.html", - "f
            "}, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestWarnings tester = new TestWarnings(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.run(ARGS2, TEST2, NO_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testDefault() { + javadoc("-Xdoclint:none", + "-d", "out-default", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate; suspect bad input HTML + + checkOutput(Output.WARNING, true, + "X.java:11: warning - Missing closing '}' character for inline tag"); + checkOutput(Output.ERROR, true, + "package.html: error - Body tag missing from HTML"); + + checkOutput("pkg/X.html", false, + "can't find m()"); + checkOutput("pkg/X.html", false, + "can't find X()"); + checkOutput("pkg/X.html", false, + "can't find f"); + } + + @Test + void testPrivate() { + javadoc("-Xdoclint:none", + "-d", "out-private", + "-private", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.FAILED); // TODO: investigate; suspect bad input HTML + + checkOutput("pkg/X.html", true, + "m()
            ", + "X()
            ", + "f
            "); } } diff --git a/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java b/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java index cfeb106b1ef..060fbcee19c 100644 --- a/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java +++ b/langtools/test/com/sun/javadoc/testWindowTitle/TestWindowTitle.java @@ -26,180 +26,192 @@ * @bug 8016675 8026736 * @summary Test for window title. * @author Bhavesh Patel - * @library ../lib/ - * @build JavadocTester TestWindowTitle + * @library ../lib + * @build JavadocTester * @run main TestWindowTitle */ - public class TestWindowTitle extends JavadocTester { - //Window title with JavaScript special characters. - private static final String TITLE_JS_CHARS = - "Testing \"Window 'Title'\" with a \\ backslash and a / " + - "forward slash and a \u00e8 unicode char also a tab and also a " + - "\t special character another \u0002 unicode)"; - private static final String[] ARGS_JS_CHARS = new String[]{ - "-d", OUTPUT_DIR + "-1", "-windowtitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_JS_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + - "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + - "also a tab and also a \\t special character another \\u0002 unicode))\";" - }, - }; - private static final String[][] NEG_TEST_JS_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " + - "with a \\ backslash and a / forward slash and a \u00E8 unicode char " + - "also a tab and also a \t special character another \u0002 unicode))\";" - } - }; - - //Window title with a script tag. - private static final String TITLE_SCRIPT_TAG = - "Testing script tag in title ."; - private static final String[] ARGS_SCRIPT_TAG = new String[]{ - "-d", OUTPUT_DIR + "-2", "-windowtitle", TITLE_SCRIPT_TAG, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_SCRIPT_TAG = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing script tag in title alert" + - "(\\\"Should not pop up\\\").)\";" - }, - { "p2/C2.html", - "parent.document.title=\"C2 (Testing script tag in title alert" + - "(\\\"Should not pop up\\\").)\";" - } - }; - private static final String[][] NEG_TEST_SCRIPT_TAG = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing script tag in title .)\";" - }, - { "p2/C2.html", - "parent.document.title=\"C2 (Testing script tag in title .)\";" - } - }; - - //Window title with other HTML tags. - private static final String TITLE_HTML_TAGS = - "Testing another

            HTML

            tag. Another

            tag

            . A " + - "tag with attributes. "; - private static final String[] ARGS_EMPTY_TAGS = new String[]{ - "-d", OUTPUT_DIR + "-5", "-windowtitle", TITLE_EMPTY_TAGS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_EMPTY_TAGS = { - { "overview-summary.html", - "parent.document.title=\"Overview\";" - } - }; - private static final String[][] NEG_TEST_EMPTY_TAGS = { - { "overview-summary.html", - "parent.document.title=\"Overview ()\";" - } - }; - - //Window title with unicode characters. - private static final String TITLE_UNICODE_CHARS = - "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e."; - private static final String[] ARGS_UNICODE_CHARS = new String[]{ - "-d", OUTPUT_DIR + "-6", "-windowtitle", TITLE_UNICODE_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_UNICODE_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " + - "not pop up\\\").)\";" - } - }; - private static final String[][] NEG_TEST_UNICODE_CHARS = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing unicode .)\";" - } - }; - - //An empty window title. - private static final String TITLE_EMPTY = - ""; - private static final String[] ARGS_EMPTY_TITLE = new String[]{ - "-d", OUTPUT_DIR + "-7", "-windowtitle", TITLE_EMPTY, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] TEST_EMPTY = { - { "overview-summary.html", - "parent.document.title=\"Overview\";" - } - }; - - //Test doctitle. - private static final String[] ARGS_DOCTITLE = new String[]{ - "-d", OUTPUT_DIR + "-8", "-doctitle", TITLE_JS_CHARS, "-sourcepath", SRC_DIR, "p1", "p2" - }; - private static final String[][] NEG_TEST_DOCTITLE = { - { "overview-summary.html", - "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + - "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + - "also a tab and also a \\t special character another \\u0002 unicode)\";" - }, - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestWindowTitle tester = new TestWindowTitle(); - tester.run(ARGS_JS_CHARS, TEST_JS_CHARS, NEG_TEST_JS_CHARS); - tester.run(ARGS_SCRIPT_TAG, TEST_SCRIPT_TAG, NEG_TEST_SCRIPT_TAG); - tester.run(ARGS_HTML_TAGS, TEST_HTML_TAGS, NEG_TEST_HTML_TAGS); - tester.run(ARGS_HTML_ENTITIES, TEST_HTML_ENTITIES, NEG_TEST_HTML_ENTITIES); - tester.run(ARGS_EMPTY_TAGS, TEST_EMPTY_TAGS, NEG_TEST_EMPTY_TAGS); - tester.run(ARGS_UNICODE_CHARS, TEST_UNICODE_CHARS, NEG_TEST_UNICODE_CHARS); - tester.run(ARGS_EMPTY_TITLE, TEST_EMPTY, NO_TEST); - tester.run(ARGS_DOCTITLE, NO_TEST, NEG_TEST_DOCTITLE); + tester.runTests(); tester.printSummary(); } + + @Test + void testJavaScriptChars() { + // Window title with JavaScript special characters. + String title = "Testing \"Window 'Title'\" with a \\ backslash and a / " + + "forward slash and a \u00e8 unicode char also a tab and also a " + + "\t special character another \u0002 unicode)"; + + javadoc("-d", "out-js-chars", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + + "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + + "also a tab and also a \\t special character another \\u0002 unicode))\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing \"Window \'Title\'\" " + + "with a \\ backslash and a / forward slash and a \u00E8 unicode char " + + "also a tab and also a \t special character another \u0002 unicode))\";" + ); + } + + @Test + void testScriptTag() { + // Window title with a script tag. + String title = "Testing script tag in title ."; + + javadoc("-d", "out-script", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing script tag in title alert" + + "(\\\"Should not pop up\\\").)\";" + ); + + checkOutput("p2/C2.html", true, + "parent.document.title=\"C2 (Testing script tag in title alert" + + "(\\\"Should not pop up\\\").)\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing script tag in title .)\";" + ); + + checkOutput("p2/C2.html", false, + "parent.document.title=\"C2 (Testing script tag in title .)\";" + ); + } + + @Test + void testHtmlTags() { + // Window title with other HTML tags. + String title = "Testing another

            HTML

            tag. Another

            tag

            . A " + + "tag with attributes. "; + + javadoc("-d", "out-empty-tags", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview ()\";" + ); + } + + @Test + void testUnicode() { + //Window title with unicode characters. + String title = "Testing unicode \u003cscript\u003ealert(\"Should not pop up\")\u003c/script\u003e."; + + javadoc("-d", "out-unicode", + "-windowtitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview (Testing unicode alert(\\\"Should " + + "not pop up\\\").)\";" + ); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing unicode .)\";" + ); + } + + @Test + void testEmpty() { + // An empty window title. + String title = ""; + javadoc("-d", "out-empty", + "-windowtitle", title, + "-sourcepath", testSrc, "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", true, + "parent.document.title=\"Overview\";" + ); + } + + @Test + void testDocTitle() { + // Window title with JavaScript special characters, specified with -doctitle + String title = "Testing \"Window 'Title'\" with a \\ backslash and a / " + + "forward slash and a \u00e8 unicode char also a tab and also a " + + "\t special character another \u0002 unicode)"; + + javadoc("-d", "out-doctitle", + "-doctitle", title, + "-sourcepath", testSrc, + "p1", "p2"); + checkExit(Exit.OK); + + checkOutput("overview-summary.html", false, + "parent.document.title=\"Overview (Testing \\\"Window \\\'Title\\\'\\\" " + + "with a \\\\ backslash and a / forward slash and a \\u00E8 unicode char " + + "also a tab and also a \\t special character another \\u0002 unicode)\";" + ); + } } diff --git a/langtools/test/com/sun/javadoc/testXOption/TestXOption.java b/langtools/test/com/sun/javadoc/testXOption/TestXOption.java index 8d21b6ee51f..4227d6a40bc 100644 --- a/langtools/test/com/sun/javadoc/testXOption/TestXOption.java +++ b/langtools/test/com/sun/javadoc/testXOption/TestXOption.java @@ -25,43 +25,48 @@ * @test * @bug 8007687 * @summary Make sure that the -X option works properly. - * @library ../lib/ - * @build JavadocTester TestXOption + * @library ../lib + * @build JavadocTester * @run main TestXOption */ public class TestXOption extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, "-X", - SRC_DIR + "/TestXOption.java" - }; - - private static final String[] ARGS2 = new String[] { - "-d", OUTPUT_DIR, "-sourcepath", SRC_DIR, - SRC_DIR + "/TestXOption.java" - }; - - private static final String[][] TEST = { - {NOTICE_OUTPUT, "-Xmaxerrs "}, - {NOTICE_OUTPUT, "-Xmaxwarns "}, - {STANDARD_OUTPUT, "-Xdocrootparent "}, - {STANDARD_OUTPUT, "-Xdoclint "}, - {STANDARD_OUTPUT, "-Xdoclint:"}, - }; - - //The help option should not crash the doclet. - private static final int EXPECTED_EXIT_CODE = 0; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestXOption tester = new TestXOption(); - int actualExitCode = tester.run(ARGS, TEST, NO_TEST); - tester.checkExitCode(EXPECTED_EXIT_CODE, actualExitCode); - tester.printSummary(); + tester.runTests(); + } + + @Test + void testWithOption() { + javadoc("-d", "out1", + "-sourcepath", testSrc, + "-X", + testSrc("TestXOption.java")); + checkExit(Exit.OK); + checkOutput(true); + } + + @Test + void testWithoutOption() { + javadoc("-d", "out2", + "-sourcepath", testSrc, + testSrc("TestXOption.java")); + checkExit(Exit.OK); + checkOutput(false); + } + + private void checkOutput(boolean expectFound) { + // TODO: It's an ugly hidden side-effect of the current doclet API + // that the -X output from the tool and the -X output from the doclet + // come out on different streams! + // When we clean up the doclet API, this should be rationalized. + checkOutput(Output.NOTICE, expectFound, + "-Xmaxerrs ", + "-Xmaxwarns "); + checkOutput(Output.STDOUT, expectFound, + "-Xdocrootparent ", + "-Xdoclint ", + "-Xdoclint:"); } } diff --git a/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java b/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java index d2ab2abcedc..00df273bad8 100644 --- a/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java +++ b/langtools/test/com/sun/javadoc/typeAnnotations/smoke/TestSmoke.java @@ -27,91 +27,84 @@ * @summary Smoke test for ensuring that annotations are emitted to javadoc * * @author Mahmood Ali - * @library ../../lib/ + * @library ../../lib * @ignore * @build JavadocTester - * @build TestSmoke * @run main TestSmoke */ public class TestSmoke extends JavadocTester { - //Javadoc arguments. - private static final String[] ARGS = new String[] { - "-d", OUTPUT_DIR, "-private", "-sourcepath", SRC_DIR, "pkg" - }; - - //Input for string search tests. - private static final String[][] TEST = { - { "pkg/T0x1C.html", "@DA"}, - { "pkg/T0x1D.html", "@DA"}, - { "pkg/T0x0D.html", "@DA"}, - { "pkg/T0x06.html", "@DA"}, - { "pkg/T0x0B.html", "@DA"}, - { "pkg/T0x0F.html", "@DA"}, - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20.html", "@DA"}, - */ - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20A.html", "@DTPA"}, - */ - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x20B.html", "@DA"}, - */ - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22.html", "@DA"}, - */ - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22A.html", "@DTPA"}, - */ - /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java - { "pkg/T0x22B.html", "@DA"}, - */ - { "pkg/T0x10.html", "@DA"}, - { "pkg/T0x10A.html", "@DA"}, - { "pkg/T0x12.html", "@DA"}, - { "pkg/T0x11.html", "@DA"}, - { "pkg/T0x13.html", "@DA"}, - { "pkg/T0x15.html", "@DA"}, - { "pkg/T0x14.html", "@DA"}, - { "pkg/T0x16.html", "@DA"} - }; - - private static final String[][] NEGATED_TEST = { - { "pkg/T0x1C.html", "@A"}, - { "pkg/T0x1D.html", "@A"}, - { "pkg/T0x00.html", "@A"}, - { "pkg/T0x01.html", "@A"}, - { "pkg/T0x02.html", "@A"}, - { "pkg/T0x04.html", "@A"}, - { "pkg/T0x08.html", "@A"}, - { "pkg/T0x0D.html", "@A"}, - { "pkg/T0x06.html", "@A"}, - { "pkg/T0x0B.html", "@A"}, - { "pkg/T0x0F.html", "@A"}, - { "pkg/T0x20.html", "@A"}, - { "pkg/T0x20A.html", "@A"}, - { "pkg/T0x20B.html", "@A"}, - { "pkg/T0x22.html", "@A"}, - { "pkg/T0x22A.html", "@A"}, - { "pkg/T0x22B.html", "@A"}, - { "pkg/T0x10.html", "@A"}, - { "pkg/T0x10A.html", "@A"}, - { "pkg/T0x12.html", "@A"}, - { "pkg/T0x11.html", "@A"}, - { "pkg/T0x13.html", "@A"}, - { "pkg/T0x15.html", "@A"}, - { "pkg/T0x14.html", "@A"}, - { "pkg/T0x16.html", "@A"} - }; - - /** - * The entry point of the test. - * @param args the array of command line arguments. - */ - public static void main(String[] args) { + public static void main(String... args) throws Exception { TestSmoke tester = new TestSmoke(); - tester.run(ARGS, TEST, NEGATED_TEST); - tester.printSummary(); + tester.runTests(); + } + + @Test + void test() { + javadoc("-d", "out", + "-private", + "-sourcepath", testSrc, + "pkg"); + checkExit(Exit.OK); + + checkOutput("pkg/T0x1C.html", true, "@DA"); + checkOutput("pkg/T0x1D.html", true, "@DA"); + checkOutput("pkg/T0x0D.html", true, "@DA"); + checkOutput("pkg/T0x06.html", true, "@DA"); + checkOutput("pkg/T0x0B.html", true, "@DA"); + checkOutput("pkg/T0x0F.html", true, "@DA"); + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x20.html", true, "@DA"); + */ + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x20A.html", true, "@DTPA"); + */ + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x20B.html", true, "@DA"); + */ + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x22.html", true, "@DA"); + */ + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x22A.html", true, "@DTPA"); + */ + /* @ignore 8013406: Test cases fail in javadoc test TestSmoke.java + checkOutput("pkg/T0x22B.html", true, "@DA"); + */ + checkOutput("pkg/T0x10.html", true, "@DA"); + checkOutput("pkg/T0x10A.html", true, "@DA"); + checkOutput("pkg/T0x12.html", true, "@DA"); + checkOutput("pkg/T0x11.html", true, "@DA"); + checkOutput("pkg/T0x13.html", true, "@DA"); + checkOutput("pkg/T0x15.html", true, "@DA"); + checkOutput("pkg/T0x14.html", true, "@DA"); + checkOutput("pkg/T0x16.html", true, "@DA"); + + checkOutput("pkg/T0x1C.html", false, "@A"); + checkOutput("pkg/T0x1D.html", false, "@A"); + checkOutput("pkg/T0x00.html", false, "@A"); + checkOutput("pkg/T0x01.html", false, "@A"); + checkOutput("pkg/T0x02.html", false, "@A"); + checkOutput("pkg/T0x04.html", false, "@A"); + checkOutput("pkg/T0x08.html", false, "@A"); + checkOutput("pkg/T0x0D.html", false, "@A"); + checkOutput("pkg/T0x06.html", false, "@A"); + checkOutput("pkg/T0x0B.html", false, "@A"); + checkOutput("pkg/T0x0F.html", false, "@A"); + checkOutput("pkg/T0x20.html", false, "@A"); + checkOutput("pkg/T0x20A.html", false, "@A"); + checkOutput("pkg/T0x20B.html", false, "@A"); + checkOutput("pkg/T0x22.html", false, "@A"); + checkOutput("pkg/T0x22A.html", false, "@A"); + checkOutput("pkg/T0x22B.html", false, "@A"); + checkOutput("pkg/T0x10.html", false, "@A"); + checkOutput("pkg/T0x10A.html", false, "@A"); + checkOutput("pkg/T0x12.html", false, "@A"); + checkOutput("pkg/T0x11.html", false, "@A"); + checkOutput("pkg/T0x13.html", false, "@A"); + checkOutput("pkg/T0x15.html", false, "@A"); + checkOutput("pkg/T0x14.html", false, "@A"); + checkOutput("pkg/T0x16.html", false, "@A"); } } diff --git a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java index 5896d6e9dda..a3a627fa578 100644 --- a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java +++ b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.java @@ -1,30 +1,8 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 8029569 + * @test /nodynamiccopyright/ + * @bug 8029569 8037379 * @summary internal javac cast exception when resolving varargs ambiguity + * fix for JDK-8029569 doesn't cover all possible cases * @compile/fail/ref=VarargsAmbiguityCrashTest.out -XDrawDiagnostics VarargsAmbiguityCrashTest.java */ diff --git a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out index 28991e006ce..5cf8fb0be38 100644 --- a/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out +++ b/langtools/test/tools/javac/T8029569/VarargsAmbiguityCrashTest.out @@ -1,2 +1,2 @@ -VarargsAmbiguityCrashTest.java:33:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest +VarargsAmbiguityCrashTest.java:11:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(java.lang.Exception...), VarargsAmbiguityCrashTest, kindname.method, m2(java.lang.Long,java.lang.Exception...), VarargsAmbiguityCrashTest 1 error diff --git a/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java b/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java index c1d226a3b78..2493edfbf9e 100644 --- a/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java +++ b/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Driver.java @@ -42,7 +42,7 @@ import com.sun.tools.classfile.TypeAnnotation.TargetType; public class Driver { - private static final PrintStream out = System.out; + private static final PrintStream out = System.err; public static void main(String[] args) throws Exception { if (args.length == 0 || args.length > 1) diff --git a/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java b/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java new file mode 100644 index 00000000000..4e292488ac0 --- /dev/null +++ b/langtools/test/tools/javac/api/taskListeners/EventsBalancedTest.java @@ -0,0 +1,127 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8040822 + * @summary Check that all TaskEvents are balanced. + */ + +import java.io.*; +import java.net.URI; +import java.util.*; +import java.util.Map.Entry; + +import javax.tools.*; + +import com.sun.source.util.*; +import com.sun.source.util.TaskEvent.Kind; +import com.sun.tools.javac.api.JavacTool; +import com.sun.tools.javac.comp.CompileStates.CompileState; + +public class EventsBalancedTest { + JavacTool tool = (JavacTool) ToolProvider.getSystemJavaCompiler(); + StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null); + + public static void main(String... args) throws IOException { + new EventsBalancedTest().test(); + } + + void test() throws IOException { + TestSource a = new TestSource("B", "class B extends A { }"); + TestSource b = new TestSource("A", "abstract class A { }"); + + test(null, Arrays.asList(a, b)); + test(null, Arrays.asList(b, a)); + test(Arrays.asList("-XD-relax"), Arrays.asList(a, b)); + test(Arrays.asList("-XD-relax"), Arrays.asList(b, a)); + + for (CompileState stop : CompileState.values()) { + test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, + "-XDshouldStopPolicyIfError=" + stop), + Arrays.asList(a, b)); + test(Arrays.asList("-XDshouldStopPolicyIfNoError=" + stop, + "-XDshouldStopPolicyIfError=" + stop), + Arrays.asList(b, a)); + } + } + + void test(Iterable options, Iterable files) throws IOException { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + TestListener listener = new TestListener(); + JavacTask task = tool.getTask(pw, fm, null, options, null, files); + + task.setTaskListener(listener); + + task.call(); + + for (Entry e : listener.kind2Count.entrySet()) { + if (e.getValue() != null && e.getValue() != 0) { + throw new IllegalStateException("Not balanced event: " + e.getKey()); + } + } + } + + static class TestListener implements TaskListener { + final Map kind2Count = new HashMap<>(); + + int get(Kind k) { + Integer count = kind2Count.get(k); + + if (count == null) + kind2Count.put(k, count = 0); + + return count; + } + + @Override + public void started(TaskEvent e) { + kind2Count.put(e.getKind(), get(e.getKind()) + 1); + } + + @Override + public void finished(TaskEvent e) { + int count = get(e.getKind()); + + if (count <= 0) + throw new IllegalStateException("count<=0 for: " + e.getKind()); + + kind2Count.put(e.getKind(), count - 1); + } + + } + static class TestSource extends SimpleJavaFileObject { + final String content; + public TestSource(String fileName, String content) { + super(URI.create("myfo:/" + fileName + ".java"), JavaFileObject.Kind.SOURCE); + this.content = content; + } + + @Override + public CharSequence getCharContent(boolean ignoreEncodingErrors) { + return content; + } + } + +} diff --git a/jdk/test/java/util/Properties/MyXmlPropertiesProvider.java b/langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java similarity index 54% rename from jdk/test/java/util/Properties/MyXmlPropertiesProvider.java rename to langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java index 652fa28ac5f..8b7c170167d 100644 --- a/jdk/test/java/util/Properties/MyXmlPropertiesProvider.java +++ b/langtools/test/tools/javac/generics/inference/T8028503/PrimitiveTypeInBoundForMethodRefTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -21,36 +21,28 @@ * questions. */ -import java.util.*; -import java.io.*; +/** + * @test + * @bug 8028503 + * @summary javac, for method references a primitive type can be added as a bound + * @compile PrimitiveTypeInBoundForMethodRefTest.java + */ -public class MyXmlPropertiesProvider - extends sun.util.spi.XmlPropertiesProvider -{ - private static int createCount; - private static int loadCount; - private static int storeCount; +class PrimitiveTypeInBoundForMethodRefTest { - static int createCount() { return createCount; } - static int loadCount() { return loadCount; } - static int storeCount() { return storeCount; } - - public MyXmlPropertiesProvider() { - createCount++; + interface Mapper { + U map(T t); } - @Override - public void load(Properties props, InputStream in) - throws IOException, InvalidPropertiesFormatException - { - loadCount++; + static Iterable map(Mapper mapper) { + return null; } - @Override - public void store(Properties props, OutputStream out, - String comment, String encoding) - throws IOException - { - storeCount++; + static void test() { + Iterable map = map(PrimitiveTypeInBoundForMethodRefTest::length); + } + + public static int length(String s) { + return 0; } } diff --git a/langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java b/langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java new file mode 100644 index 00000000000..0293067cb3f --- /dev/null +++ b/langtools/test/tools/javac/generics/typevars/IntersectionSubVar.java @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8042656 + * @summary Subtyping for intersection types containing type variables + * @compile IntersectionSubVar.java + */ + +class IntersectionSubVar { + + interface Box { + void set(T arg); + T get(); + } + + Box glb(Box arg1, Box arg2) { + return null; + } + + void takeBox(Box box) {} + + void test(Box arg1, Box arg2, Box arg3) { + T t = glb(arg1, arg2).get(); // assign T&Cloneable to T + takeBox(arg3); // inference tests Box <: Box + } + +} diff --git a/langtools/test/tools/javac/lambda/MethodReference42.out b/langtools/test/tools/javac/lambda/MethodReference42.out index ab324c44665..1a4309fca62 100644 --- a/langtools/test/tools/javac/lambda/MethodReference42.out +++ b/langtools/test/tools/javac/lambda/MethodReference42.out @@ -1,4 +1,4 @@ -MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) -MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) +MethodReference42.java:38:11: compiler.err.cant.apply.symbol: kindname.method, m1, MethodReference42.SAM1, @811, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) +MethodReference42.java:40:11: compiler.err.cant.apply.symbol: kindname.method, m3, MethodReference42.SAM3, @855, kindname.class, MethodReference42, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) MethodReference42.java:41:9: compiler.err.ref.ambiguous: m4, kindname.method, m4(MethodReference42.SAM2), MethodReference42, kindname.method, m4(MethodReference42.SAM3), MethodReference42 3 errors diff --git a/langtools/test/tools/javac/lambda/MethodReference44.out b/langtools/test/tools/javac/lambda/MethodReference44.out index 56c991c21f9..10681e0130d 100644 --- a/langtools/test/tools/javac/lambda/MethodReference44.out +++ b/langtools/test/tools/javac/lambda/MethodReference44.out @@ -1,4 +1,4 @@ -MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number)) -MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number)) +MethodReference44.java:40:11: compiler.err.cant.apply.symbol: kindname.method, g1, MethodReference44.SAM1, @864, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.String, java.lang.Number))) +MethodReference44.java:42:11: compiler.err.cant.apply.symbol: kindname.method, g3, MethodReference44.SAM3, @932, kindname.class, MethodReference44, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.ret.type.in.lambda: (compiler.misc.incompatible.eq.upper.bounds: X, java.lang.Object, java.lang.Number))) MethodReference44.java:43:9: compiler.err.ref.ambiguous: g4, kindname.method, g4(MethodReference44.SAM2), MethodReference44, kindname.method, g4(MethodReference44.SAM3), MethodReference44 3 errors diff --git a/langtools/test/tools/javac/lambda/MostSpecific10.java b/langtools/test/tools/javac/lambda/MostSpecific10.java new file mode 100644 index 00000000000..4e31788d79e --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific10.java @@ -0,0 +1,54 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8034223 + * @summary Structural most-specific logic for lambdas, method refs, parens, and conditionals + * @compile MostSpecific10.java + */ +class MostSpecific10 { + + interface GetInt { + int get(); + } + + interface GetInteger { + Integer get(); + } + + void m(GetInt getter) {} + void m(GetInteger getter) {} + + void test(boolean cond) { + m(() -> 23); + m("abc"::length); + m(( () -> 23 )); + m(( "abc"::length )); + m(cond ? () -> 23 : "abc"::length); + m(( cond ? () -> 23 : "abc"::length )); + m(cond ? (() -> 23) : ("abc"::length) ); + m(( cond ? () -> 23 : cond ? ("abc"::length) : (() -> 23) )); + } + +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific11.java b/langtools/test/tools/javac/lambda/MostSpecific11.java new file mode 100644 index 00000000000..9946ddd67ea --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific11.java @@ -0,0 +1,42 @@ +/* + * 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. + */ + +/* + * @test + * @bug 8034223 + * @summary Return type Object is not more specific than return type String + * @compile MostSpecific11.java + */ +class MostSpecific11 { + + interface I { Object run(); } + interface J { String run(); } + + void m(I arg) {} + void m(J arg) {} + + void test() { + m(() -> { throw new RuntimeException(); }); + } + +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific12.java b/langtools/test/tools/javac/lambda/MostSpecific12.java new file mode 100644 index 00000000000..3a82c88358e --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific12.java @@ -0,0 +1,38 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing with inference variables in function parameter types + * @compile/fail/ref=MostSpecific12.out -XDrawDiagnostics MostSpecific12.java + */ +class MostSpecific12 { + + interface I { void take(T arg1, String arg2); } + interface J { void take(String arg1, T arg2); } + interface K { void take(String arg1, String arg2); } + + void m1(I arg) {} + void m1(K arg) {} + + void m2(J arg) {} + void m2(K arg) {} + + void m3(I arg) {} + void m3(J arg) {} + + void test() { + m1((String s1, String s2) -> {}); // ok + m2((String s1, String s2) -> {}); // ok + m3((String s1, String s2) -> {}); // error + + m1(this::referencedMethod); // ok + m2(this::referencedMethod); // ok + m3(this::referencedMethod); // error + + m1(String::compareTo); // ok + m2(String::compareTo); // ok + m3(String::compareTo); // error + } + + void referencedMethod(String s1, String s2) {} + +} diff --git a/langtools/test/tools/javac/lambda/MostSpecific12.out b/langtools/test/tools/javac/lambda/MostSpecific12.out new file mode 100644 index 00000000000..827ba7dd1ec --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific12.out @@ -0,0 +1,4 @@ +MostSpecific12.java:25:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +MostSpecific12.java:29:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +MostSpecific12.java:33:9: compiler.err.ref.ambiguous: m3, kindname.method, m3(MostSpecific12.I), MostSpecific12, kindname.method, m3(MostSpecific12.J), MostSpecific12 +3 errors diff --git a/langtools/test/tools/javac/lambda/MostSpecific13.java b/langtools/test/tools/javac/lambda/MostSpecific13.java new file mode 100644 index 00000000000..364bcf961f8 --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific13.java @@ -0,0 +1,21 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing with inference variables in function parameter types + * @compile/fail/ref=MostSpecific13.out -XDrawDiagnostics MostSpecific13.java + */ +class MostSpecific13 { + + interface UnaryOp { T apply(T arg); } + interface IntegerToNumber { Number apply(Integer arg); } + + void m(UnaryOp f) {} + void m(IntegerToNumber f) {} + + void test() { + m((Integer i) -> i); // error + m(this::id); // error + } + + Integer id(Integer arg) { return arg; } +} \ No newline at end of file diff --git a/langtools/test/tools/javac/lambda/MostSpecific13.out b/langtools/test/tools/javac/lambda/MostSpecific13.out new file mode 100644 index 00000000000..42f26242377 --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific13.out @@ -0,0 +1,3 @@ +MostSpecific13.java:16:9: compiler.err.ref.ambiguous: m, kindname.method, m(MostSpecific13.UnaryOp), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 +MostSpecific13.java:17:9: compiler.err.ref.ambiguous: m, kindname.method, m(MostSpecific13.UnaryOp), MostSpecific13, kindname.method, m(MostSpecific13.IntegerToNumber), MostSpecific13 +2 errors diff --git a/langtools/test/tools/javac/lambda/MostSpecific14.java b/langtools/test/tools/javac/lambda/MostSpecific14.java new file mode 100644 index 00000000000..29e2a621916 --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific14.java @@ -0,0 +1,33 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8034223 + * @summary Most-specific testing for nested functional interface types + * @compile/fail/ref=MostSpecific14.out -XDrawDiagnostics MostSpecific14.java + */ +class MostSpecific14 { + interface ToNumber { Number get(); } + interface ToToNumber { ToNumber get(); } + interface Factory { T get(); } + + void m1(Factory> f) {} + void m1(ToToNumber f) {} + + void m2(Factory> f) {} + void m2(ToToNumber f) {} + + void m3(Factory> f) {} + void m3(ToToNumber f) {} + + + void test() { + m1(() -> () -> 23); // ok: choose ToToNumber + m2(() -> () -> 23); // error: ambiguous + m3(() -> () -> 23); // ok: choose Factory> + + m1(() -> this::getInteger); // ok: choose ToToNumber + m2(() -> this::getInteger); // error: ambiguous + m3(() -> this::getInteger); // ok: choose Factory> + } + + Integer getInteger() { return 23; } +} \ No newline at end of file diff --git a/langtools/test/tools/javac/lambda/MostSpecific14.out b/langtools/test/tools/javac/lambda/MostSpecific14.out new file mode 100644 index 00000000000..2c23097bb31 --- /dev/null +++ b/langtools/test/tools/javac/lambda/MostSpecific14.out @@ -0,0 +1,3 @@ +MostSpecific14.java:24:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 +MostSpecific14.java:28:9: compiler.err.ref.ambiguous: m2, kindname.method, m2(MostSpecific14.Factory>), MostSpecific14, kindname.method, m2(MostSpecific14.ToToNumber), MostSpecific14 +2 errors diff --git a/langtools/test/tools/javac/lambda/TargetType16.java b/langtools/test/tools/javac/lambda/TargetType16.java index 1de0d125b99..5b205876b20 100644 --- a/langtools/test/tools/javac/lambda/TargetType16.java +++ b/langtools/test/tools/javac/lambda/TargetType16.java @@ -1,9 +1,9 @@ /* * @test /nodynamiccopyright/ - * @bug 8003280 + * @bug 8003280 8034223 * @summary Add lambda tests * Check void-compatibility in strict vs. loose conversion contexts - * @compile/fail/ref=TargetType16.out -XDrawDiagnostics TargetType16.java + * @compile TargetType16.java */ class TargetType16 { @@ -20,6 +20,6 @@ class TargetType16 { static void m(SAM2 s2) { } public static void main(String[] args) { - m(() -> { throw new AssertionError(); }); //ambiguous + m(() -> { throw new AssertionError(); }); // prefer SAM2 } } diff --git a/langtools/test/tools/javac/lambda/TargetType16.out b/langtools/test/tools/javac/lambda/TargetType16.out deleted file mode 100644 index f803ca37b38..00000000000 --- a/langtools/test/tools/javac/lambda/TargetType16.out +++ /dev/null @@ -1,2 +0,0 @@ -TargetType16.java:23:9: compiler.err.ref.ambiguous: m, kindname.method, m(TargetType16.SAM1), TargetType16, kindname.method, m(TargetType16.SAM2), TargetType16 -1 error diff --git a/langtools/test/tools/javac/lambda/TargetType23.java b/langtools/test/tools/javac/lambda/TargetType23.java index 0786af38318..bac45e9351e 100644 --- a/langtools/test/tools/javac/lambda/TargetType23.java +++ b/langtools/test/tools/javac/lambda/TargetType23.java @@ -31,7 +31,12 @@ class TargetType23 { void call(Sam2 s) { } void call(Sam3 s) { } + void call2(Sam0 s) { } + void call2(Sam2 s) { } + void call2(Sam3 s) { } + void test() { - call(()-> { throw new RuntimeException(); }); //ambiguous - both call(Sam0), call(Sam2), call(Sam3) match + call(()-> { throw new RuntimeException(); }); // ambiguous - call(Sam1) vs. call(Sam2) + call2(()-> { throw new RuntimeException(); }); // ok } } diff --git a/langtools/test/tools/javac/lambda/TargetType23.out b/langtools/test/tools/javac/lambda/TargetType23.out index 2b40d26ccc1..049a5aad417 100644 --- a/langtools/test/tools/javac/lambda/TargetType23.out +++ b/langtools/test/tools/javac/lambda/TargetType23.out @@ -1,2 +1,2 @@ -TargetType23.java:35:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam2), TargetType23, kindname.method, call(TargetType23.Sam3), TargetType23 +TargetType23.java:39:9: compiler.err.ref.ambiguous: call, kindname.method, call(TargetType23.Sam1), TargetType23, kindname.method, call(TargetType23.Sam2), TargetType23 1 error diff --git a/langtools/test/tools/javac/options/xprefer/XPreferTest.java b/langtools/test/tools/javac/options/xprefer/XPreferTest.java index ab2488f8cdc..7d9c6da190e 100644 --- a/langtools/test/tools/javac/options/xprefer/XPreferTest.java +++ b/langtools/test/tools/javac/options/xprefer/XPreferTest.java @@ -26,6 +26,7 @@ * @summary Tests which path is used to represent an implicit type given * various xprefer arguments and multiple .class / .java files involved. * @bug 8028196 + * @ignore 8042839 XPreferTest fails on Windows */ import java.io.File; diff --git a/langtools/test/tools/javac/resolve/AmbiguityErrorTest.java b/langtools/test/tools/javac/resolve/AmbiguityErrorTest.java new file mode 100644 index 00000000000..0641c146806 --- /dev/null +++ b/langtools/test/tools/javac/resolve/AmbiguityErrorTest.java @@ -0,0 +1,75 @@ +/* + * 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. + */ + +/** + * @test + * @bug 8041663 + */ + +public class AmbiguityErrorTest { + + public interface A { } + + public interface B extends A { } + + public interface C { + A m(B strategy); + } + + public interface D { + A m(A strategy); + A m(B strategy); + } + + public interface T1 extends C, D { } + public interface T2 extends D, C { } + + int count; + + class T1Impl implements T1, T2 { + public A m(B strategy) { + count++; + return null; + } + public A m(A strategy) { + throw new AssertionError("Should not get here."); + } + } + + public static void main(String... args) { + new AmbiguityErrorTest().test(); + } + + void test() { + T1 t1 = new T1Impl(); + T2 t2 = new T1Impl(); + final B b = new B() { }; + t1.m(b); + t2.m(b); + + if (count != 2) { + throw new IllegalStateException("Did not call the methods properly"); + } + } + +} diff --git a/langtools/test/tools/javac/resolve/ResolveHarness.java b/langtools/test/tools/javac/resolve/ResolveHarness.java index 7d79f1c851f..1abd5c45960 100644 --- a/langtools/test/tools/javac/resolve/ResolveHarness.java +++ b/langtools/test/tools/javac/resolve/ResolveHarness.java @@ -23,8 +23,8 @@ /* * @test - * @bug 7098660 8014649 - * @summary Write better overload resolution/inference tests + * @bug 7098660 8014649 8034223 + * @summary Test harness for overload resolution/inference tests * @library /tools/javac/lib * @build JavacTestingAbstractProcessor ResolveHarness * @run main ResolveHarness diff --git a/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java b/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java index 63fc7525af6..2c61182c15a 100644 --- a/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java +++ b/langtools/test/tools/javac/resolve/tests/PrimitiveOverReferenceVarargsAmbiguous.java @@ -23,44 +23,44 @@ @TraceResolve(keys={"compiler.err.ref.ambiguous"}) class PrimitiveOverReferenceVarargsAmbiguous { - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_byte(byte... b) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_byte(Byte... b) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_short(short... s) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_short(Short... s) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_int(int... i) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_int(Integer... i) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_long(long... l) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_long(Long... l) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_float(float... f) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_float(Float... f) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_double(double... d) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_double(Double... d) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_char(char... c) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_char(Character... c) {} - @Candidate(applicable=Phase.VARARGS, mostSpecific=true) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_bool(boolean... z) {} - @Candidate(applicable=Phase.VARARGS) + @Candidate(applicable=Phase.VARARGS, mostSpecific=false) static void m_bool(Boolean... z) {} { diff --git a/langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java b/langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java new file mode 100644 index 00000000000..0ac1598404a --- /dev/null +++ b/langtools/test/tools/javac/resolve/tests/PrimitiveVsReferenceSamePhase.java @@ -0,0 +1,76 @@ +/* + * 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. + */ + +@TraceResolve(keys={"compiler.err.ref.ambiguous"}) +class PrimitiveVsReferenceSamePhase { + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_byte(Byte b1, byte b2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_byte(Byte b1, Byte b2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_short(Short s1, short s2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_short(Short s1, Short s2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_int(Integer i1, int i2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_int(Integer i1, Integer i2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_long(Long l1, long l2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_long(Long l1, Long l2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_float(Float f1, float f2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_float(Float f1, Float f2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_double(Double d1, double d2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_double(Double d1, Double d2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_char(Character c1, char c2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_char(Character c1, Character c2) {} + + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_bool(Boolean z1, boolean z2) {} + @Candidate(applicable=Phase.BOX, mostSpecific=false) + static void m_bool(Boolean z1, Boolean z2) {} + + { + m_byte((byte)0, (byte)0); + m_short((short)0, (short)0); + m_int(0, 0); + m_long(0L, 0L); + m_float(0.0f, 0.0f); + m_double(0.0, 0.0); + m_char('?', '?'); + m_bool(false, false); + } +} diff --git a/langtools/test/tools/javac/types/TypeHarness.java b/langtools/test/tools/javac/types/TypeHarness.java index b4837907820..f826c2acecb 100644 --- a/langtools/test/tools/javac/types/TypeHarness.java +++ b/langtools/test/tools/javac/types/TypeHarness.java @@ -255,7 +255,8 @@ public class TypeHarness { public ClassType Class(long flags, Type... typeArgs) { ClassSymbol csym = new ClassSymbol(flags, syntheticName(), predef.noSymbol); - csym.type = new ClassType(Type.noType, List.from(typeArgs), csym); + csym.type = new ClassType(Type.noType, List.from(typeArgs), csym, + Type.noAnnotations); ((ClassType)csym.type).supertype_field = predef.objectType; return (ClassType)csym.type; } @@ -301,7 +302,7 @@ public class TypeHarness { } public ArrayType Array(Type elemType) { - return new ArrayType(elemType, predef.arrayClass); + return new ArrayType(elemType, predef.arrayClass, Type.noAnnotations); } public TypeVar TypeVariable() { @@ -310,16 +311,16 @@ public class TypeHarness { public TypeVar TypeVariable(Type bound) { TypeSymbol tvsym = new TypeVariableSymbol(0, syntheticName(), null, predef.noSymbol); - tvsym.type = new TypeVar(tvsym, bound, null); + tvsym.type = new TypeVar(tvsym, bound, null, Type.noAnnotations); return (TypeVar)tvsym.type; } public WildcardType Wildcard(BoundKind bk, Type bound) { - return new WildcardType(bound, bk, predef.boundClass); + return new WildcardType(bound, bk, predef.boundClass, Type.noAnnotations); } public CapturedType CapturedVariable(Type upper, Type lower) { - return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null); + return new CapturedType(syntheticName(), predef.noSymbol, upper, lower, null, Type.noAnnotations); } public ClassType Intersection(Type classBound, Type... intfBounds) { diff --git a/make/Jprt.gmk b/make/Jprt.gmk index 75ee37da374..a7f9226d99f 100644 --- a/make/Jprt.gmk +++ b/make/Jprt.gmk @@ -23,8 +23,22 @@ # questions. # -# This file is contains targets utilities needed by JPRT. +# This file contains targets and utilities needed by JPRT. +# Cygpath is only defined when running on Cygwin +ifneq ($(CYGPATH), ) + # If we get JPRT_ARCHIVE_*BUNDLE externally, make sure they have /cygdrive + # style paths + ifdef JPRT_ARCHIVE_BUNDLE + override JPRT_ARCHIVE_BUNDLE := $(shell $(CYGPATH) -u $(JPRT_ARCHIVE_BUNDLE)) + endif + ifdef JPRT_ARCHIVE_INSTALL_BUNDLE + override JPRT_ARCHIVE_INSTALL_BUNDLE := $(shell $(CYGPATH) -u $(JPRT_ARCHIVE_INSTALL_BUNDLE)) + endif +endif + +# When running in JPRT these will be provided. Need defaults so that this makefile +# is valid anyway. ifndef JPRT_ARCHIVE_BUNDLE JPRT_ARCHIVE_BUNDLE=/tmp/jprt_bundles/j2sdk-image.zip endif diff --git a/nashorn/.hgtags b/nashorn/.hgtags index 2f71531b2c8..4eb279cc390 100644 --- a/nashorn/.hgtags +++ b/nashorn/.hgtags @@ -246,3 +246,4 @@ b3517e51f40477f10db8bc30a557aa0ea712c274 jdk9-b02 0eaa55c7abe5d96023a4b38a326f411209c43f49 jdk9-b10 4d60c3292e14aac90dc3b8232496ba4af4254cc3 jdk9-b11 282e9a675e079cc84dbfaa4c10050f08397faab0 jdk9-b12 +be4580ae56e2ef0ce521d3f840753eaa83cacf33 jdk9-b13 diff --git a/nashorn/make/build.xml b/nashorn/make/build.xml index 3c1954a2afd..e8058a32f9b 100644 --- a/nashorn/make/build.xml +++ b/nashorn/make/build.xml @@ -279,6 +279,10 @@ +grant codeBase "file:/${toString:nashorn.ext.path}/nashorn.jar" { + permission java.security.AllPermission; +}; + grant codeBase "file:/${basedir}/${nashorn.internal.tests.jar}" { permission java.security.AllPermission; };
            <W extends java.lang.String,V extends " + - "java.util.List>
            java.lang.Object
            <W extends java.lang.String,V extends " + + "java.util.List>
            java.lang.Object
            " + - "UsedInC " + + "UsedInC