This README file contains build instructions for the
+OpenJDK. Building the source code for the OpenJDK
+requires a certain degree of technical expertise.
+
+
!!!!!!!!!!!!!!! THIS IS A MAJOR RE-WRITE of this document. !!!!!!!!!!!!!
+
+
Some Headlines:
+
+
+
The build is now a "configure && make" style build
+
Any GNU make 3.81 or newer should work, except on Windows where 4.0 or newer
+is recommended.
+
The build should scale, i.e. more processors should cause the build to be
+done in less wall-clock time
+
Nested or recursive make invocations have been significantly reduced,
+as has the total fork/exec or spawning of sub processes during the build
+
Windows MKS usage is no longer supported
+
Windows Visual Studio vsvars*.bat and vcvars*.bat files are run
+automatically
+
Ant is no longer used when building the OpenJDK
+
Use of ALT_* environment variables for configuring the build is no longer
+supported
The OpenJDK sources are maintained with the revision control system
+Mercurial. If you are new to
+Mercurial, please see the Beginner Guides or refer to the Mercurial Book.
+The first few chapters of the book provide an excellent overview of Mercurial,
+what it is and how it works.
Once you have all the repositories, keep in mind that each repository is its
+own independent repository. You can also re-run ./get_source.sh anytime to
+pull over all the latest changesets in all the repositories. This set of
+nested repositories has been given the term "forest" and there are various
+ways to apply the same hg command to each of the repositories. For
+example, the script make/scripts/hgforest.sh can be used to repeat the
+same hg command on every repository, e.g.
+
+
cd YourOpenJDK
+ bash ./make/scripts/hgforest.sh status
+
+
+
+
+
Repositories
+
+
The set of repositories and what they contain:
+
+
+
. (root) contains common configure and makefile logic
+
hotspot contains source code and make files for building the OpenJDK
+Hotspot Virtual Machine
+
langtools contains source code for the OpenJDK javac and language tools
+
jdk contains source code and make files for building the OpenJDK runtime
+libraries and misc files
+
jaxp contains source code for the OpenJDK JAXP functionality
+
jaxws contains source code for the OpenJDK JAX-WS functionality
+
corba contains source code for the OpenJDK Corba functionality
+
nashorn contains source code for the OpenJDK JavaScript implementation
+
+
+
Repository Source Guidelines
+
+
There are some very basic guidelines:
+
+
+
Use of whitespace in source files (.java, .c, .h, .cpp, and .hpp files) is
+restricted. No TABs, no trailing whitespace on lines, and files should not
+terminate in more than one blank line.
+
Files with execute permissions should not be added to the source
+repositories.
+
All generated files need to be kept isolated from the files maintained or
+managed by the source control system. The standard area for generated files
+is the top level build/ directory.
+
The default build process should be to build the product and nothing else,
+in one form, e.g. a product (optimized), debug (non-optimized, -g plus
+assert logic), or fastdebug (optimized, -g plus assert logic).
+
The .hgignore file in each repository must exist and should include
+^build/, ^dist/ and optionally any nbproject/private directories. It
+should NEVER include anything in the src/ or test/ or any managed
+directory area of a repository.
+
Directory names and file names should never contain blanks or non-printing
+characters.
+
Generated source or binary files should NEVER be added to the repository
+(that includes javah output). There are some exceptions to this rule, in
+particular with some of the generated configure scripts.
+
Files not needed for typical building or testing of the repository should
+not be added to the repository.
+
+
+
+
+
+
+
Building
+
+
The very first step in building the OpenJDK is making sure the system itself
+has everything it needs to do OpenJDK builds. Once a system is setup, it
+generally doesn't need to be done again.
+
+
Building the OpenJDK is now done with running a configure script which will
+try and find and verify you have everything you need, followed by running
+make, e.g.
- This README file contains build instructions for the
- OpenJDK.
- Building the source code for the
- OpenJDK
- requires
- a certain degree of technical expertise.
-
-
-
!!!!!!!!!!!!!!! THIS IS A MAJOR RE-WRITE of this document. !!!!!!!!!!!!!
-
- Some Headlines:
-
-
- The build is now a "configure && make" style build
-
-
- Any GNU make 3.81 or newer should work, except on
- Windows where 4.0 or newer is recommended.
-
-
- The build should scale, i.e. more processors should
- cause the build to be done in less wall-clock time
-
-
- Nested or recursive make invocations have been significantly
- reduced, as has the total fork/exec or spawning
- of sub processes during the build
-
-
- Windows MKS usage is no longer supported
-
-
- Windows Visual Studio vsvars*.bat and
- vcvars*.bat files are run automatically
-
-
- Ant is no longer used when building the OpenJDK
-
-
- Use of ALT_* environment variables for configuring the
- build is no longer supported
-
- The OpenJDK sources are maintained with the revision control system
- Mercurial.
- If you are new to Mercurial, please see the
-
- Beginner Guides
- or refer to the
- Mercurial Book.
- The first few chapters of the book provide an excellent overview of
- Mercurial, what it is and how it works.
-
- For using Mercurial with the OpenJDK refer to the
-
- Developer Guide: Installing and Configuring Mercurial
- section for more information.
-
-
- Once you have all the repositories, keep in mind that each
- repository is its own independent repository.
- You can also re-run ./get_source.sh anytime to
- pull over all the latest changesets in all the repositories.
- This set of nested repositories has been given the term
- "forest" and there are various ways to apply the same
- hg command to each of the repositories.
- For example, the script make/scripts/hgforest.sh
- can be used to repeat the same hg
- command on every repository, e.g.
-
-
- cd YourOpenJDK
-
- bash ./make/scripts/hgforest.sh status
-
-
- Use of whitespace in source files
- (.java, .c, .h, .cpp, and .hpp files)
- is restricted.
- No TABs, no trailing whitespace on lines, and files
- should not terminate in more than one blank line.
-
-
- Files with execute permissions should not be added
- to the source repositories.
-
-
- All generated files need to be kept isolated from
- the files
- maintained or managed by the source control system.
- The standard area for generated files is the top level
- build/ directory.
-
-
- The default build process should be to build the product
- and nothing else, in one form, e.g. a product (optimized),
- debug (non-optimized, -g plus assert logic), or
- fastdebug (optimized, -g plus assert logic).
-
-
- The .hgignore file in each repository
- must exist and should
- include ^build/, ^dist/ and
- optionally any
- nbproject/private directories.
- It should NEVER include
- anything in the
- src/ or test/
- or any managed directory area of a repository.
-
-
- Directory names and file names should never contain
- blanks or
- non-printing characters.
-
-
- Generated source or binary files should NEVER be added to
- the repository (that includes javah output).
- There are some exceptions to this rule, in particular
- with some of the generated configure scripts.
-
-
- Files not needed for typical building
- or testing of the repository
- should not be added to the repository.
-
- The very first step in building the OpenJDK is making sure the
- system itself has everything it needs to do OpenJDK builds.
- Once a system is setup, it generally doesn't need to be done again.
-
- Building the OpenJDK is now done with running a
- configure
- script which will try and find and verify you have everything
- you need, followed by running
- make, e.g.
-
-
-
- bash ./configure
- make all
-
-
-
- Where possible the configure script will attempt to located the
- various components in the default locations or via component
- specific variable settings.
- When the normal defaults fail or components cannot be found,
- additional configure options may be necessary to help configure
- find the necessary tools for the build, or you may need to
- re-visit the setup of your system due to missing software
- packages.
-
- NOTE: The configure script
- file does not have
- execute permissions and will need to be explicitly run with
- bash,
- see the source guidelines.
-
-
-
-
- Before even attempting to use a system to build the OpenJDK
- there are some very basic system setups needed.
- For all systems:
-
-
- Be sure the GNU make utility is version 3.81 (4.0 on
- windows) or newer, e.g. run "make -version"
-
-
- Install a
- Bootstrap JDK.
- All OpenJDK builds require access to a previously released
- JDK called the bootstrap JDK or boot JDK.
- The general rule is that the bootstrap JDK
- must be an instance of the previous major
- release of the JDK. In addition, there may be
- a requirement to use a release at or beyond a
- particular update level.
-
-
- Building JDK 9 requires JDK 8. JDK 9
- developers should not use JDK 9 as the boot
- JDK, to ensure that JDK 9 dependencies are
- not introduced into the parts of the system
- that are built with JDK 8.
-
-
- The JDK 8 binaries can be downloaded from Oracle's
- JDK 8 download site.
- For build performance reasons it
- is very important that this bootstrap JDK be made available
- on the local disk of the machine doing the build.
- You should add its bin directory
- to the PATH environment variable.
- If configure has any issues finding this JDK, you may
- need to use the configure option
- --with-boot-jdk.
-
-
- Ensure that GNU make, the Bootstrap JDK,
- and the compilers are all
- in your PATH environment variable
-
- With Linux, try and favor the system packages over
- building your own
- or getting packages from other areas.
- Most Linux builds should be possible with the system's
- available packages.
-
- Note that some Linux systems have a habit of pre-populating
- your environment variables for you, for example JAVA_HOME
- might get pre-defined for you to refer to the JDK installed on
- your Linux system.
- You will need to unset JAVA_HOME.
- It's a good idea to run env and verify the
- environment variables you are getting from the default system
- settings make sense for building the OpenJDK.
-
-
- At a minimum, the
-
- Studio 12 Update 1 Compilers
- (containing version 5.10 of the C and C++ compilers) is required,
- including specific patches.
-
- The Solaris SPARC patch list is:
-
-
- 118683-05: SunOS 5.10: Patch for profiling libraries and assembler
-
-
- 119963-21: SunOS 5.10: Shared library patch for C++
-
- 141858-06: Sun Studio 12 Update 1_x86: Sun Compiler Common patch for x86 backend
-
-
- 128229-09: Sun Studio 12 Update 1_x86: Patch for C++ Compiler
-
-
- 142363-05: Sun Studio 12 Update 1_x86: Patch for C Compiler
-
-
- 142368-01: Sun Studio 12.1_x86: Patch for Performance Analyzer Tools
-
-
-
- Place the bin directory in PATH.
-
- The Oracle Solaris Studio Express compilers at:
-
- Oracle Solaris Studio Express Download site
- are also an option, although these compilers have not
- been extensively used yet.
-
- Building on Windows requires a Unix-like environment, notably a
- Unix-like shell.
- There are several such environments available of which
- Cygwin and
- MinGW/MSYS are
- currently supported for
- the OpenJDK build. One of the differences of these
- systems from standard Windows tools is the way
- they handle Windows path names, particularly path names which contain
- spaces, backslashes as path separators and possibly drive letters.
- Depending
- on the use case and the specifics of each environment these path
- problems can
- be solved by a combination of quoting whole paths, translating
- backslashes to
- forward slashes, escaping backslashes with additional backslashes and
- translating the path names to their
-
- "8.3" version.
-
-
- CYGWIN is an open source, Linux-like environment which tries to emulate
- a complete POSIX layer on Windows. It tries to be smart about path names
- and can usually handle all kinds of paths if they are correctly quoted
- or escaped although internally it maps drive letters <drive>:
- to a virtual directory /cygdrive/<drive>.
-
- You can always use the cygpath utility to map pathnames with spaces
- or the backslash character into the C:/ style of pathname
- (called 'mixed'), e.g. cygpath -s -m "path".
-
-
- Note that the use of CYGWIN creates a unique problem with regards to
- setting PATH. Normally on Windows
- the PATH variable contains directories
- separated with the ";" character (Solaris and Linux use ":").
- With CYGWIN, it uses ":", but that means that paths like "C:/path"
- cannot be placed in the CYGWIN version of PATH and
- instead CYGWIN uses something like /cygdrive/c/path
- which CYGWIN understands, but only CYGWIN understands.
-
-
- The OpenJDK build requires CYGWIN version 1.7.16 or newer.
- Information about CYGWIN can
- be obtained from the CYGWIN website at
- www.cygwin.com.
-
-
- By default CYGWIN doesn't install all the tools required for building
- the OpenJDK.
- Along with the default installation, you need to install
- the following tools.
-
-
-
-
-
Binary Name
-
Category
-
Package
-
Description
-
-
-
-
-
ar.exe
-
Devel
-
binutils
-
- The GNU assembler, linker and binary utilities
-
-
-
-
make.exe
-
Devel
-
make
-
- The GNU version of the 'make' utility built for CYGWIN
-
-
-
-
m4.exe
-
Interpreters
-
m4
-
- GNU implementation of the traditional Unix macro
- processor
-
-
-
-
cpio.exe
-
Utils
-
cpio
-
- A program to manage archives of files
-
-
-
-
gawk.exe
-
Utils
-
awk
-
- Pattern-directed scanning and processing language
-
-
-
-
file.exe
-
Utils
-
file
-
- Determines file type using 'magic' numbers
-
-
-
-
zip.exe
-
Archive
-
zip
-
- Package and compress (archive) files
-
-
-
-
unzip.exe
-
Archive
-
unzip
-
- Extract compressed files in a ZIP archive
-
-
-
-
free.exe
-
System
-
procps
-
- Display amount of free and used memory in the system
-
-
-
-
-
- Note that the CYGWIN software can conflict with other non-CYGWIN
- software on your Windows system.
- CYGWIN provides a
- FAQ for
- known issues and problems, of particular interest is the
- section on
-
- BLODA (applications that interfere with CYGWIN).
-
- MinGW ("Minimalist GNU for Windows") is a collection of free Windows
- specific header files and import libraries combined with GNU toolsets that
- allow one to produce native Windows programs that do not rely on any
- 3rd-party C runtime DLLs. MSYS is a supplement to MinGW which allows building
- applications and programs which rely on traditional UNIX tools to
- be present. Among others this includes tools like bash
- and make.
- See MinGW/MSYS
- for more information.
-
- Like Cygwin, MinGW/MSYS can handle different types of path formats. They
- are internally converted to paths with forward slashes and drive letters
- <drive>: replaced by a virtual
- directory /<drive>. Additionally, MSYS automatically
- detects binaries compiled for the MSYS environment and feeds them with the
- internal, Unix-style path names. If native Windows applications are called
- from within MSYS programs their path arguments are automatically converted
- back to Windows style path names with drive letters and backslashes as
- path separators. This may cause problems for Windows applications which
- use forward slashes as parameter separator (e.g. cl /nologo /I)
- because MSYS may wrongly
- replace such parameters by drive letters.
-
-
- In addition to the tools which will be installed
- by default, you have
- to manually install the
- msys-zip and
- msys-unzip packages.
- This can be easily done with the MinGW command line installer:
-
- The 32-bit and 64-bit OpenJDK Windows build requires
- Microsoft Visual Studio C++ 2013 (VS2013) Professional
- Edition or Express compiler.
- The compiler and other tools are expected to reside
- in the location defined by the variable
- VS120COMNTOOLS which
- is set by the Microsoft Visual Studio installer.
-
-
- Only the C++ part of VS2013 is needed.
- Try to let the installation go to the default
- install directory.
- Always reboot your system after installing VS2013.
- The system environment variable VS120COMNTOOLS
- should be
- set in your environment.
-
-
- Make sure that TMP and TEMP are also set
- in the environment
- and refer to Windows paths that exist,
- like C:\temp,
- not /tmp, not /cygdrive/c/temp,
- and not C:/temp.
- C:\temp is just an example,
- it is assumed that this area is
- private to the user, so by default
- after installs you should
- see a unique user path in these variables.
-
- The basic invocation of the configure script
- looks like:
-
- bash ./configure [options]
-
- This will create an output directory containing the
- "configuration" and setup an area for the build result.
- This directory typically looks like:
-
- build/linux-x64-normal-server-release
-
- configure will try to figure out what system you are running on
- and where all necessary build components are.
- If you have all prerequisites for building installed,
- it should find everything.
- If it fails to detect any component automatically,
- it will exit and inform you about the problem.
- When this happens, read more below in
- the configure options.
-
- Complete details on all the OpenJDK configure options can
- be seen with:
-
- bash ./configure --help=short
-
- Use -help to see all the configure options
- available.
-
- You can generate any number of different configurations,
- e.g. debug, release, 32, 64, etc.
-
- Some of the more commonly used configure options are:
-
-
-
-
-
OpenJDK Configure Option
-
Description
-
-
-
-
-
--enable-debug
-
- set the debug level to fastdebug (this is a shorthand for
- --with-debug-level=fastdebug)
-
-
-
-
--with-alsa=path
-
- select the location of the
- Advanced Linux Sound Architecture (ALSA)
-
- Version 0.9.1 or newer of the ALSA files are
- required for building the OpenJDK on Linux.
- These Linux files are usually available from an "alsa"
- of "libasound"
- development package,
- and it's highly recommended that you try and use
- the package provided by the particular version of Linux that
- you are using.
-
- provide the JVM options to be used to run the
- Bootstrap JDK
-
-
-
-
--with-cacerts=path
-
- select the path to the cacerts file.
-
- See
- http://en.wikipedia.org/wiki/Certificate_Authority
- for a better understanding of the Certificate Authority (CA).
- A certificates file named "cacerts"
- represents a system-wide keystore with CA certificates.
- In JDK and JRE
- binary bundles, the "cacerts" file contains root CA certificates from
- several public CAs (e.g., VeriSign, Thawte, and Baltimore).
- The source contain a cacerts file
- without CA root certificates.
- Formal JDK builders will need to secure
- permission from each public CA and include the certificates into their
- own custom cacerts file.
- Failure to provide a populated cacerts file
- will result in verification errors of a certificate chain during runtime.
- By default an empty cacerts file is provided and that should be
- fine for most JDK developers.
-
-
-
-
--with-cups=path
-
- select the CUPS install location
-
- The
- Common UNIX Printing System (CUPS) Headers
- are required for building the
- OpenJDK on Solaris and Linux.
- The Solaris header files can be obtained by installing
- the package SFWcups from the Solaris Software
- Companion CD/DVD, these often will be installed into the
- directory /opt/sfw/cups.
-
- The CUPS header files can always be downloaded from
- www.cups.org.
-
-
-
-
--with-cups-include=path
-
- select the CUPS include directory location
-
-
-
-
--with-debug-level=level
-
- select the debug information level of release,
- fastdebug, or slowdebug
-
-
-
-
--with-dev-kit=path
-
- select location of the compiler install or
- developer install location
-
-
-
-
--with-freetype=path
-
- select the freetype files to use.
-
- Expecting the
- freetype libraries under
- lib/ and the
- headers under include/.
-
- Version 2.3 or newer of FreeType is required.
- On Unix systems required files can be available as part of your
- distribution (while you still may need to upgrade them).
- Note that you need development version of package that
- includes both the FreeType library and header files.
-
- You can always download latest FreeType version from the
- FreeType website.
-
- Building the freetype 2 libraries from scratch is also possible,
- however on Windows refer to the
-
- Windows FreeType DLL build instructions.
-
- Note that by default FreeType is built with byte code hinting
- support disabled due to licensing restrictions.
- In this case, text appearance and metrics are expected to
- differ from Sun's official JDK build.
- See
-
- the SourceForge FreeType2 Home Page
-
- for more information.
-
-
-
-
--with-import-hotspot=path
-
- select the location to find hotspot
- binaries from a previous build to avoid building
- hotspot
-
-
-
-
--with-target-bits=arg
-
- select 32 or 64 bit build
-
-
-
-
--with-jvm-variants=variants
-
- select the JVM variants to build from, comma
- separated list that can include:
- server, client, kernel, zero and zeroshark
-
-
-
-
--with-memory-size=size
-
- select the RAM size that GNU make will think
- this system has
-
- select the msvcr100.dll
- file to include in the
- Windows builds (C/C++ runtime library for
- Visual Studio).
-
- This is usually picked up automatically
- from the redist
- directories of Visual Studio 2013.
-
-
-
-
--with-num-cores=cores
-
- select the number of cores to use (processor
- count or CPU count)
-
-
-
-
--with-x=path
-
- select the location of the X11 and xrender files.
-
- The
- XRender Extension Headers
- are required for building the
- OpenJDK on Solaris and Linux.
-
- The Linux header files are usually available from a "Xrender"
- development package, it's recommended that you try and use
- the package provided by the particular distribution of Linux that
- you are using.
-
- The Solaris XRender header files is
- included with the other X11 header files
- in the package SFWxwinc
- on new enough versions of
- Solaris and will be installed in
- /usr/X11/include/X11/extensions/Xrender.h or
- /usr/openwin/share/include/X11/extensions/Xrender.h
-
- The basic invocation of the make utility
- looks like:
-
- make all
-
- This will start the build to the output directory containing the
- "configuration" that was created by the configure
- script. Run make help for more information on
- the available targets.
-
- There are some of the make targets that
- are of general interest:
-
-
-
-
Make Target
-
Description
-
-
-
-
-
empty
-
build everything but no images
-
-
-
all
-
build everything including images
-
-
-
all-conf
-
build all configurations
-
-
-
images
-
create complete j2sdk and j2re images
-
-
-
install
-
install the generated images locally,
- typically in /usr/local
-
-
-
clean
-
remove all files generated by make,
- but not those generated by configure
-
-
-
dist-clean
-
remove all files generated by both
- and configure (basically killing the configuration)
-
-
-
help
-
give some help on using make,
- including some interesting make targets
- When the build is completed, you should see the generated
- binaries and associated files in the j2sdk-image
- directory in the output directory.
- In particular, the
- build/*/images/j2sdk-image/bin
- directory should contain executables for the
- OpenJDK tools and utilities for that configuration.
- The testing tool jtreg will be needed
- and can be found at:
-
- the jtreg site.
- The provided regression tests in the repositories
- can be run with the command:
-
- cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all
-
- Q: The generated-configure.sh file looks horrible!
- How are you going to edit it?
-
- A: The generated-configure.sh file is generated (think
- "compiled") by the autoconf tools. The source code is
- in configure.ac and various .m4 files in common/autoconf,
- which are much more readable.
-
-
-
- Q:
- Why is the generated-configure.sh file checked in,
- if it is generated?
-
- A:
- If it was not generated, every user would need to have the autoconf
- tools installed, and re-generate the configure file
- as the first step.
- Our goal is to minimize the work needed to be done by the user
- to start building OpenJDK, and to minimize
- the number of external dependencies required.
-
-
-
- Q:
- Do you require a specific version of autoconf for regenerating
- generated-configure.sh?
-
- A:
- Yes, version 2.69 is required and should be easy
- enough to aquire on all supported operating
- systems. The reason for this is to avoid
- large spurious changes in generated-configure.sh.
-
-
-
- Q:
- How do you regenerate generated-configure.sh
- after making changes to the input files?
-
- A:
- Regnerating generated-configure.sh
- should always be done using the
- script common/autoconf/autogen.sh to
- ensure that the correct files get updated. This
- script should also be run after mercurial tries to
- merge generated-configure.sh as a
- merge of the generated file is not guaranteed to
- be correct.
-
-
-
- Q:
- What are the files in common/makefiles/support/* for?
- They look like gibberish.
-
- A:
- They are a somewhat ugly hack to compensate for command line length
- limitations on certain platforms (Windows, Solaris).
- Due to a combination of limitations in make and the shell,
- command lines containing too many files will not work properly.
- These
- helper files are part of an elaborate hack that will compress the
- command line in the makefile and then uncompress it safely.
- We're
- not proud of it, but it does fix the problem.
- If you have any better suggestions, we're all ears! :-)
-
-
-
- Q:
- I want to see the output of the commands that make runs,
- like in the old build. How do I do that?
-
- A:
- You specify the LOG variable to make. There are
- several log levels:
-
-
-
-
- warn — Default and very quiet.
-
-
- info — Shows more progress information
- than warn.
-
-
- debug — Echos all command lines and
- prints all macro calls for compilation definitions.
-
-
- trace — Echos all $(shell) command
- lines as well.
-
-
-
-
-
- Q:
- When do I have to re-run configure?
-
- A:
- Normally you will run configure only once for creating a
- configuration.
- You need to re-run configuration only if you want to change any
- configuration options,
- or if you pull down changes to the configure script.
-
-
-
- Q:
- I have added a new source file. Do I need to modify the makefiles?
-
- A:
- Normally, no. If you want to create e.g. a new native
- library,
- you will need to modify the makefiles. But for normal file
- additions or removals, no changes are needed. There are certan
- exceptions for some native libraries where the source files are spread
- over many directories which also contain sources for other
- libraries. In these cases it was simply easier to create include lists
- rather than excludes.
-
-
-
- Q:
- When I run configure --help, I see many strange options,
- like --dvidir. What is this?
-
- A:
- Configure provides a slew of options by default, to all projects
- that use autoconf. Most of them are not used in OpenJDK,
- so you can safely ignore them. To list only OpenJDK specific features,
- use configure --help=short instead.
-
-
-
- Q:
- configure provides OpenJDK-specific features such as
- --with-builddeps-server that are not
- described in this document. What about those?
-
- A:
- Try them out if you like! But be aware that most of these are
- experimental features.
- Many of them don't do anything at all at the moment; the option
- is just a placeholder. Others depend on
- pieces of code or infrastructure that is currently
- not ready for prime time.
-
-
-
- Q:
- How will you make sure you don't break anything?
-
- A:
- We have a script that compares the result of the new build system
- with the result of the old. For most part, we aim for (and achieve)
- byte-by-byte identical output. There are however technical issues
- with e.g. native binaries, which might differ in a byte-by-byte
- comparison, even
- when building twice with the old build system.
- For these, we compare relevant aspects
- (e.g. the symbol table and file size).
- Note that we still don't have 100%
- equivalence, but we're close.
-
-
-
- Q:
- I noticed this thing X in the build that looks very broken by design.
- Why don't you fix it?
-
- A:
- Our goal is to produce a build output that is as close as
- technically possible to the old build output.
- If things were weird in the old build,
- they will be weird in the new build.
- Often, things were weird before due to obscurity,
- but in the new build system the weird stuff comes up to the surface.
- The plan is to attack these things at a later stage,
- after the new build system is established.
-
-
-
- Q:
- The code in the new build system is not that well-structured.
- Will you fix this?
-
- A:
- Yes! The new build system has grown bit by bit as we converted
- the old system. When all of the old build system is converted,
- we can take a step back and clean up the structure of the new build
- system. Some of this we plan to do before replacing the old build
- system and some will need to wait until after.
-
-
-
- Q:
- Is anything able to use the results of the new build's default make target?
-
- A:
- Yes, this is the minimal (or roughly minimal)
- set of compiled output needed for a developer to actually
- execute the newly built JDK. The idea is that in an incremental
- development fashion, when doing a normal make,
- you should only spend time recompiling what's changed
- (making it purely incremental) and only do the work that's
- needed to actually run and test your code.
- The packaging stuff that is part of the images
- target is not needed for a normal developer who wants to
- test his new code. Even if it's quite fast, it's still unnecessary.
- We're targeting sub-second incremental rebuilds! ;-)
- (Or, well, at least single-digit seconds...)
-
-
-
- Q:
- I usually set a specific environment variable when building,
- but I can't find the equivalent in the new build.
- What should I do?
-
- A:
- It might very well be that we have neglected to add support for
- an option that was actually used from outside the build system.
- Email us and we will add support for it!
-
Building OpenJDK requires a lot of horsepower.
- Some of the build tools can be adjusted to utilize more or less
- of resources such as
- parallel threads and memory.
- The configure script analyzes your system and selects reasonable
- values for such options based on your hardware.
- If you encounter resource problems, such as out of memory conditions,
- you can modify the detected values with:
-
-
-
- --with-num-cores
- —
- number of cores in the build system,
- e.g. --with-num-cores=8
-
-
- --with-memory-size
- — memory (in MB) available in the build system,
- e.g. --with-memory-size=1024
-
-
-
-
It might also be necessary to specify the JVM arguments passed
- to the Bootstrap JDK, using e.g.
- --with-boot-jdk-jvmargs="-Xmx8G -enableassertions".
- Doing this will override the default JVM arguments
- passed to the Bootstrap JDK.
-
-
-
One of the top goals of the new build system is to improve the
- build performance and decrease the time needed to build. This will
- soon also apply to the java compilation when the Smart Javac wrapper
- is fully supported.
-
-
At the end of a successful execution of configure,
- you will get a performance summary,
- indicating how well the build will perform. Here you will
- also get performance hints.
- If you want to build fast, pay attention to those!
-
-
Building with ccache
-
-
The OpenJDK build supports building with ccache
- when using gcc or clang. Using ccache can
- radically speed up compilation of native code if
- you often rebuild the same sources. Your milage
- may vary however so we recommend evaluating it for
- yourself. To enable it, make sure it's on the path
- and configure with --enable-ccache.
-
-
Building on local disk
-
-
If you are using network shares, e.g. via NFS, for your source code,
- make sure the build directory is situated on local disk.
- The performance
- penalty is extremely high for building on a network share,
- close to unusable.
-
-
Building only one JVM
-
-
The old build builds multiple JVMs on 32-bit systems (client and
- server; and on Windows kernel as well). In the new build we have
- changed this default to only build server when it's available. This
- improves build times for those not interested in multiple JVMs. To
- mimic the old behavior on platforms that support it,
- use --with-jvm-variants=client,server.
-
-
Selecting the number of cores to build on
-
-
By default, configure will analyze your machine and run the make
- process in parallel with as many threads as you have cores. This
- behavior can be overridden, either "permanently" (on a configure
- basis) using --with-num-cores=N or for a single build
- only (on a make basis), using make JOBS=N.
-
-
If you want to make a slower build just this time, to save some CPU
- power for other processes, you can run
- e.g. make JOBS=2. This will force the makefiles
- to only run 2 parallel processes, or even make JOBS=1
- which will disable parallelism.
-
-
If you want to have it the other way round, namely having slow
- builds default and override with fast if you're
- impatient, you should call configure with
- --with-num-cores=2, making 2 the default.
- If you want to run with more
- cores, run make JOBS=8
- If the build fails (and it's not due to a compilation error in
- a source file you've changed), the first thing you should do
- is to re-run the build with more verbosity.
- Do this by adding LOG=debug to your make command line.
-
- The build log (with both stdout and stderr intermingled,
- basically the same as you see on your console) can be found as
- build.log in your build directory.
-
- You can ask for help on build problems with the new build system
- on either the
-
- build-dev
- or the
-
- build-infra-dev
- mailing lists. Please include the relevant parts
- of the build log.
-
- A build can fail for any number of reasons.
- Most failures
- are a result of trying to build in an environment in which all the
- pre-build requirements have not been met.
- The first step in
- troubleshooting a build failure is to recheck that you have satisfied
- all the pre-build requirements for your platform.
- Scanning the configure log is a good first step, making
- sure that what it found makes sense for your system.
- Look for strange error messages or any difficulties that
- configure had in finding things.
-
- Some of the more common problems with builds are briefly
- described
- below, with suggestions for remedies.
-
-
- Corrupted Bundles on Windows:
-
- Some virus scanning software has been known to
- corrupt the
- downloading of zip bundles.
- It may be necessary to disable the 'on access' or
- 'real time'
- virus scanning features to prevent this corruption.
- This type of "real time" virus scanning can also
- slow down the
- build process significantly.
- Temporarily disabling the feature, or excluding the build
- output directory may be necessary to get correct and
- faster builds.
-
-
-
- Slow Builds:
-
- If your build machine seems to be overloaded from too many
- simultaneous C++ compiles, try setting the
- JOBS=1 on the make command line.
- Then try increasing the count slowly to an acceptable
- level for your system. Also:
-
- Creating the javadocs can be very slow,
- if you are running
- javadoc, consider skipping that step.
-
- Faster CPUs, more RAM, and a faster DISK usually helps.
- The VM build tends to be CPU intensive
- (many C++ compiles),
- and the rest of the JDK will often be disk intensive.
-
- Faster compiles are possible using a tool called
- ccache.
-
-
-
-
- File time issues:
-
- If you see warnings that refer to file time stamps, e.g.
-
- Warning message:
- File `xxx' has modification time in
- the future.
-
- Warning message: Clock skew detected.
- Your build may
- be incomplete.
-
- These warnings can occur when the clock on the build
- machine is out of
- sync with the timestamps on the source files.
- Other errors, apparently
- unrelated but in fact caused by the clock skew,
- can occur along with
- the clock skew warnings.
- These secondary errors may tend to obscure the
- fact that the true root cause of the problem
- is an out-of-sync clock.
-
- If you see these warnings, reset the clock on the
- build
- machine, run "gmake clobber"
- or delete the directory
- containing the build output, and restart the
- build from the beginning.
-
-
-
- Error message:
- Trouble writing out table to disk
-
- Increase the amount of swap space on your build machine.
- This could be caused by overloading the system and
- it may be necessary to use:
-
- make JOBS=1
-
- to reduce the load on the system.
-
-
-
- Error Message:
- libstdc++ not found:
-
- This is caused by a missing libstdc++.a library.
- This is installed as part of a specific package
- (e.g. libstdc++.so.devel.386).
- By default some 64-bit Linux versions (e.g. Fedora)
- only install the 64-bit version of the libstdc++ package.
- Various parts of the JDK build require a static
- link of the C++ runtime libraries to allow for maximum
- portability of the built images.
-
-
-
- Linux Error Message:
- cannot restore segment prot after reloc
-
- This is probably an issue with SELinux (See
-
- http://en.wikipedia.org/wiki/SELinux).
- Parts of the VM is built without the -fPIC for
- performance reasons.
-
- To completely disable SELinux:
-
-
$ su root
-
# system-config-securitylevel
-
In the window that appears, select the SELinux tab
-
Disable SELinux
-
-
- Alternatively, instead of completely disabling it you could
- disable just this one check.
-
-
Select System->Administration->SELinux Management
-
In the SELinux Management Tool which appears,
- select "Boolean" from the menu on the left
-
Expand the "Memory Protection" group
-
Check the first item, labeled
- "Allow all unconfined executables to use
- libraries requiring text relocation ..."
-
-
-
-
- Windows Error Messages:
-
- *** fatal error - couldn't allocate heap, ...
-
- rm fails with "Directory not empty"
-
- unzip fails with "cannot create ... Permission denied"
-
- unzip fails with "cannot create ... Error 50"
-
-
- Try rebooting the system, or there could be some kind of
- issue with the disk or disk partition being used.
- Sometimes it comes with a "Permission Denied" message.
-
-
- The Makefiles in the OpenJDK are only valid when used with the
- GNU version of the utility command make
- (usually called gmake on Solaris).
- A few notes about using GNU make:
-
-
- You need GNU make version 3.81 or newer. On Windows 4.0 or
- newer is recommended.
- If the GNU make utility on your systems is not of a suitable
- version see "Building GNU make".
-
-
- Place the location of the GNU make binary in the
- PATH.
-
-
- Solaris:
- Do NOT use /usr/bin/make on Solaris.
- If your Solaris system has the software
- from the Solaris Developer Companion CD installed,
- you should try and use gmake
- which will be located in either the
- /usr/bin, /opt/sfw/bin or
- /usr/sfw/bin directory.
-
-
- Windows:
- Make sure you start your build inside a bash shell.
-
-
- Mac OS X:
- The XCode "command line tools" must be installed on your Mac.
-
- First step is to get the GNU make 3.81 or newer source from
-
- ftp.gnu.org/pub/gnu/make/.
- Building is a little different depending on the OS but is
- basically done with:
-
- This file often describes specific requirements for what we
- call the
- "minimum build environments" (MBE) for this
- specific release of the JDK.
- What is listed below is what the Oracle Release
- Engineering Team will use to build the Oracle JDK product.
- Building with the MBE will hopefully generate the most compatible
- bits that install on, and run correctly on, the most variations
- of the same base OS and hardware architecture.
- In some cases, these represent what is often called the
- least common denominator, but each Operating System has different
- aspects to it.
-
- In all cases, the Bootstrap JDK version minimum is critical,
- we cannot guarantee builds will work with older Bootstrap JDK's.
- Also in all cases, more RAM and more processors is better,
- the minimums listed below are simply recommendations.
-
- With Solaris and Mac OS X, the version listed below is the
- oldest release we can guarantee builds and works, and the
- specific version of the compilers used could be critical.
-
- With Windows the critical aspect is the Visual Studio compiler
- used, which due to it's runtime, generally dictates what Windows
- systems can do the builds and where the resulting bits can
- be used.
- NOTE: We expect a change here off these older Windows OS releases
- and to a 'less older' one, probably Windows 2008R2 X64.
-
- With Linux, it was just a matter of picking a
- stable distribution that is a good representative for Linux
- in general.
- NOTE: We expect a change here from Fedora 9 to something else,
- but it has not been completely determined yet, possibly
- Ubuntu 12.04 X64, unbiased community feedback would be welcome on
- what a good choice would be here.
-
- It is understood that most developers will NOT be using these
- specific versions, and in fact creating these specific versions
- may be difficult due to the age of some of this software.
- It is expected that developers are more often using the more
- recent releases and distributions of these operating systems.
-
- Compilation problems with newer or different C/C++ compilers is a
- common problem.
- Similarly, compilation problems related to changes to the
- /usr/include or system header files is also a
- common problem with older, newer, or unreleased OS versions.
- Please report these types of problems as bugs so that they
- can be dealt with accordingly.
-
-
-
-
-
Base OS and Architecture
-
OS
-
C/C++ Compiler
-
Bootstrap JDK
-
Processors
-
RAM Minimum
-
DISK Needs
-
-
-
-
-
Linux X86 (32-bit) and X64 (64-bit)
-
Oracle Enterprise Linux 6.4
-
gcc 4.8.2
-
JDK 8
-
2 or more
-
1 GB
-
6 GB
-
-
-
Solaris SPARCV9 (64-bit)
-
Solaris 10 Update 10
-
Studio 12 Update 3 + patches
-
JDK 8
-
4 or more
-
4 GB
-
8 GB
-
-
-
Solaris X64 (64-bit)
-
Solaris 10 Update 10
-
Studio 12 Update 3 + patches
-
JDK 8
-
4 or more
-
4 GB
-
8 GB
-
-
-
Windows X86 (32-bit)
-
Windows Server 2012 R2 x64
-
Microsoft Visual Studio C++ 2013 Professional Edition
-
JDK 8
-
2 or more
-
2 GB
-
6 GB
-
-
-
Windows X64 (64-bit)
-
Windows Server 2012 R2 x64
-
Microsoft Visual Studio C++ 2013 Professional Edition
- After installing the latest
- Fedora
- you need to install several build dependencies.
- The simplest way to do it is to execute the
- following commands as user root:
-
- After installing
- CentOS 5.5
- you need to make sure you have
- the following Development bundles installed:
-
-
-
Development Libraries
-
Development Tools
-
Java Development
-
X Software Development (Including XFree86-devel)
-
-
-
- Plus the following packages:
-
-
-
cups devel: Cups Development Package
-
alsa devel: Alsa Development Package
-
Xi devel: libXi.so Development Package
-
-
-
- The freetype 2.3 packages don't seem to be available,
- but the freetype 2.3 sources can be downloaded, built,
- and installed easily enough from
-
- the freetype site.
- Build and install with something like:
-
- bash ./configure
-
- make
-
- sudo -u root make install
-
-
- Mercurial packages could not be found easily, but a Google
- search should find ones, and they usually include Python if
- it's needed.
-
- After installing Debian 5
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands as user root:
-
- After installing OpenSUSE 11.1
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands:
-
- After installing Mandriva
- Linux One 2009 Spring
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands as user root:
-
- urpmi java-1.7.0-openjdk-devel make gcc gcc-c++
- freetype-devel zip unzip libcups2-devel libxrender1-devel
- libalsa2-devel libstc++-static-devel libxtst6-devel
- libxi-devel
-
-
- In addition, it is necessary to set a few environment
- variables for the build:
-
- After installing OpenSolaris 2009.06
- you need to install several build dependencies.
- The simplest way to install the build dependencies is to
- execute the following commands:
-
End of OpenJDK README-builds.html document. Please come again!
-
+
-
+
System Setup
+
+
Before even attempting to use a system to build the OpenJDK there are some very
+basic system setups needed. For all systems:
+
+
+
Be sure the GNU make utility is version 3.81 (4.0 on windows) or newer, e.g.
+run "make -version"
+
+
+
Install a Bootstrap JDK. All OpenJDK builds require access to a previously
+released JDK called the bootstrap JDK or boot JDK. The general rule is
+that the bootstrap JDK must be an instance of the previous major release of
+the JDK. In addition, there may be a requirement to use a release at or
+beyond a particular update level.
+
+
Building JDK 9 requires JDK 8. JDK 9 developers should not use JDK 9 as
+the boot JDK, to ensure that JDK 9 dependencies are not introduced into the
+parts of the system that are built with JDK 8.
+
+
The JDK 8 binaries can be downloaded from Oracle's JDK 8 download
+site.
+For build performance reasons it is very important that this bootstrap JDK
+be made available on the local disk of the machine doing the build. You
+should add its bin directory to the PATH environment variable. If
+configure has any issues finding this JDK, you may need to use the
+configure option --with-boot-jdk.
+
Ensure that GNU make, the Bootstrap JDK, and the compilers are all in your
+PATH environment variable.
Install XCode 4.5.2 and also
+install the "Command line tools" found under the preferences pane
+"Downloads"
+
+
+
+
+
Linux
+
+
With Linux, try and favor the system packages over building your own or getting
+packages from other areas. Most Linux builds should be possible with the
+system's available packages.
+
+
Note that some Linux systems have a habit of pre-populating your environment
+variables for you, for example JAVA_HOME might get pre-defined for you to
+refer to the JDK installed on your Linux system. You will need to unset
+JAVA_HOME. It's a good idea to run env and verify the environment variables
+you are getting from the default system settings make sense for building the
+OpenJDK.
+
+
+
+
Solaris
+
+
+
+
Studio Compilers
+
+
At a minimum, the Studio 12 Update 1 Compilers (containing
+version 5.10 of the C and C++ compilers) is required, including specific
+patches.
+
+
The Solaris SPARC patch list is:
+
+
+
118683-05: SunOS 5.10: Patch for profiling libraries and assembler
+
119963-21: SunOS 5.10: Shared library patch for C++
Building on Windows requires a Unix-like environment, notably a Unix-like
+shell. There are several such environments available of which
+Cygwin and
+MinGW/MSYS are currently supported for the
+OpenJDK build. One of the differences of these systems from standard Windows
+tools is the way they handle Windows path names, particularly path names which
+contain spaces, backslashes as path separators and possibly drive letters.
+Depending on the use case and the specifics of each environment these path
+problems can be solved by a combination of quoting whole paths, translating
+backslashes to forward slashes, escaping backslashes with additional
+backslashes and translating the path names to their "8.3"
+version.
+
+
+
+
CYGWIN
+
+
CYGWIN is an open source, Linux-like environment which tries to emulate a
+complete POSIX layer on Windows. It tries to be smart about path names and can
+usually handle all kinds of paths if they are correctly quoted or escaped
+although internally it maps drive letters <drive>: to a virtual directory
+/cygdrive/<drive>.
+
+
You can always use the cygpath utility to map pathnames with spaces or the
+backslash character into the C:/ style of pathname (called 'mixed'), e.g.
+cygpath -s -m "<path>".
+
+
Note that the use of CYGWIN creates a unique problem with regards to setting
+PATH. Normally on Windows the PATH variable contains directories
+separated with the ";" character (Solaris and Linux use ":"). With CYGWIN, it
+uses ":", but that means that paths like "C:/path" cannot be placed in the
+CYGWIN version of PATH and instead CYGWIN uses something like
+/cygdrive/c/path which CYGWIN understands, but only CYGWIN understands.
+
+
The OpenJDK build requires CYGWIN version 1.7.16 or newer. Information about
+CYGWIN can be obtained from the CYGWIN website at
+www.cygwin.com.
+
+
By default CYGWIN doesn't install all the tools required for building the
+OpenJDK. Along with the default installation, you need to install the following
+tools.
+
+
+
+
+
+
Binary Name
+
Category
+
Package
+
Description
+
+
+
+
+
ar.exe
+
Devel
+
binutils
+
The GNU assembler, linker and binary utilities
+
+
+
make.exe
+
Devel
+
make
+
The GNU version of the 'make' utility built for CYGWIN
+
+
+
m4.exe
+
Interpreters
+
m4
+
GNU implementation of the traditional Unix macro processor
+
+
+
cpio.exe
+
Utils
+
cpio
+
A program to manage archives of files
+
+
+
gawk.exe
+
Utils
+
awk
+
Pattern-directed scanning and processing language
+
+
+
file.exe
+
Utils
+
file
+
Determines file type using 'magic' numbers
+
+
+
zip.exe
+
Archive
+
zip
+
Package and compress (archive) files
+
+
+
unzip.exe
+
Archive
+
unzip
+
Extract compressed files in a ZIP archive
+
+
+
free.exe
+
System
+
procps
+
Display amount of free and used memory in the system
+
+
+
+
+
+
Note that the CYGWIN software can conflict with other non-CYGWIN software on
+your Windows system. CYGWIN provides a FAQ for known issues and problems, of particular interest is the
+section on BLODA (applications that interfere with
+CYGWIN).
+
+
+
+
MinGW/MSYS
+
+
MinGW ("Minimalist GNU for Windows") is a collection of free Windows specific
+header files and import libraries combined with GNU toolsets that allow one to
+produce native Windows programs that do not rely on any 3rd-party C runtime
+DLLs. MSYS is a supplement to MinGW which allows building applications and
+programs which rely on traditional UNIX tools to be present. Among others this
+includes tools like bash and make. See MinGW/MSYS for more information.
+
+
Like Cygwin, MinGW/MSYS can handle different types of path formats. They are
+internally converted to paths with forward slashes and drive letters
+<drive>: replaced by a virtual directory /<drive>. Additionally, MSYS
+automatically detects binaries compiled for the MSYS environment and feeds them
+with the internal, Unix-style path names. If native Windows applications are
+called from within MSYS programs their path arguments are automatically
+converted back to Windows style path names with drive letters and backslashes
+as path separators. This may cause problems for Windows applications which use
+forward slashes as parameter separator (e.g. cl /nologo /I) because MSYS may
+wrongly replace such parameters by drive letters.
+
+
In addition to the tools which will be installed by default, you have to
+manually install the msys-zip and msys-unzip packages. This can be easily
+done with the MinGW command line installer:
The 32-bit and 64-bit OpenJDK Windows build requires Microsoft Visual Studio
+C++ 2013 (VS2013) Professional Edition or Express compiler. The compiler and
+other tools are expected to reside in the location defined by the variable
+VS120COMNTOOLS which is set by the Microsoft Visual Studio installer.
+
+
Only the C++ part of VS2013 is needed. Try to let the installation go to the
+default install directory. Always reboot your system after installing VS2013.
+The system environment variable VS120COMNTOOLS should be set in your
+environment.
+
+
Make sure that TMP and TEMP are also set in the environment and refer to
+Windows paths that exist, like C:\temp, not /tmp, not /cygdrive/c/temp,
+and not C:/temp. C:\temp is just an example, it is assumed that this area
+is private to the user, so by default after installs you should see a unique
+user path in these variables.
+
+
+
+
Mac OS X
+
+
Make sure you get the right XCode version.
+
+
+
+
+
+
Configure
+
+
The basic invocation of the configure script looks like:
+
+
+
bash ./configure [options]
+
+
+
This will create an output directory containing the "configuration" and setup
+an area for the build result. This directory typically looks like:
+
+
+
build/linux-x64-normal-server-release
+
+
+
configure will try to figure out what system you are running on and where all
+necessary build components are. If you have all prerequisites for building
+installed, it should find everything. If it fails to detect any component
+automatically, it will exit and inform you about the problem. When this
+happens, read more below in the configure options.
+
+
Some examples:
+
+
+
Windows 32bit build with freetype specified:
+ bash ./configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-
+bits=32
Complete details on all the OpenJDK configure options can be seen with:
+
+
+
bash ./configure --help=short
+
+
+
Use -help to see all the configure options available. You can generate any
+number of different configurations, e.g. debug, release, 32, 64, etc.
+
+
Some of the more commonly used configure options are:
+
+
+
--enable-debug
+ set the debug level to fastdebug (this is a shorthand for --with-debug-
+ level=fastdebug)
+
+
+
+
+
+
--with-alsa=path
+ select the location of the Advanced Linux Sound Architecture (ALSA)
+
+
Version 0.9.1 or newer of the ALSA files are required for building the
+ OpenJDK on Linux. These Linux files are usually available from an "alsa" of
+ "libasound" development package, and it's highly recommended that you try
+ and use the package provided by the particular version of Linux that you are
+ using.
--with-boot-jdk-jvmargs="args"
+ provide the JVM options to be used to run the Bootstrap JDK
+
+
--with-cacerts=path
+ select the path to the cacerts file.
+
+
See Certificate Authority on Wikipedia for a better understanding of the Certificate
+ Authority (CA). A certificates file named "cacerts" represents a system-wide
+ keystore with CA certificates. In JDK and JRE binary bundles, the "cacerts"
+ file contains root CA certificates from several public CAs (e.g., VeriSign,
+ Thawte, and Baltimore). The source contain a cacerts file without CA root
+ certificates. Formal JDK builders will need to secure permission from each
+ public CA and include the certificates into their own custom cacerts file.
+ Failure to provide a populated cacerts file will result in verification
+ errors of a certificate chain during runtime. By default an empty cacerts
+ file is provided and that should be fine for most JDK developers.
+
+
+
+
+
+
--with-cups=path
+ select the CUPS install location
+
+
The Common UNIX Printing System (CUPS) Headers are required for building the
+ OpenJDK on Solaris and Linux. The Solaris header files can be obtained by
+ installing the package SFWcups from the Solaris Software Companion
+ CD/DVD, these often will be installed into the directory /opt/sfw/cups.
+
+
The CUPS header files can always be downloaded from
+ www.cups.org.
+
+
--with-cups-include=path
+ select the CUPS include directory location
+
+
--with-debug-level=level
+ select the debug information level of release, fastdebug, or slowdebug
+
+
--with-dev-kit=path
+ select location of the compiler install or developer install location
+
+
+
+
+
+
--with-freetype=path
+ select the freetype files to use.
+
+
Expecting the freetype libraries under lib/ and the headers under
+ include/.
+
+
Version 2.3 or newer of FreeType is required. On Unix systems required files
+ can be available as part of your distribution (while you still may need to
+ upgrade them). Note that you need development version of package that
+ includes both the FreeType library and header files.
Note that by default FreeType is built with byte code hinting support
+ disabled due to licensing restrictions. In this case, text appearance and
+ metrics are expected to differ from Sun's official JDK build. See the
+ SourceForge FreeType2 Home Page
+ for more information.
+
+
--with-import-hotspot=path
+ select the location to find hotspot binaries from a previous build to avoid
+ building hotspot
+
+
--with-target-bits=arg
+ select 32 or 64 bit build
+
+
--with-jvm-variants=variants
+ select the JVM variants to build from, comma separated list that can
+ include: server, client, kernel, zero and zeroshark
+
+
--with-memory-size=size
+ select the RAM size that GNU make will think this system has
+
+
--with-msvcr-dll=path
+ select the msvcr100.dll file to include in the Windows builds (C/C++
+ runtime library for Visual Studio).
+
+
This is usually picked up automatically from the redist directories of
+ Visual Studio 2013.
+
+
--with-num-cores=cores
+ select the number of cores to use (processor count or CPU count)
+
+
+
+
+
+
--with-x=path
+ select the location of the X11 and xrender files.
+
+
The XRender Extension Headers are required for building the OpenJDK on
+ Solaris and Linux. The Linux header files are usually available from a
+ "Xrender" development package, it's recommended that you try and use the
+ package provided by the particular distribution of Linux that you are using.
+ The Solaris XRender header files is included with the other X11 header files
+ in the package SFWxwinc on new enough versions of Solaris and will be
+ installed in /usr/X11/include/X11/extensions/Xrender.h or
+ /usr/openwin/share/include/X11/extensions/Xrender.h
+
+
+
+
+
+
+
Make
+
+
The basic invocation of the make utility looks like:
+
+
+
make all
+
+
+
This will start the build to the output directory containing the
+"configuration" that was created by the configure script. Run make help for
+more information on the available targets.
+
+
There are some of the make targets that are of general interest:
+
+
+
empty
+ build everything but no images
+
+
all
+ build everything including images
+
+
all-conf
+ build all configurations
+
+
images
+ create complete j2sdk and j2re images
+
+
install
+ install the generated images locally, typically in /usr/local
+
+
clean
+ remove all files generated by make, but not those generated by configure
+
+
dist-clean
+ remove all files generated by both and configure (basically killing the
+ configuration)
+
+
help
+ give some help on using make, including some interesting make targets
+
+
+
+
+
+
+
Testing
+
+
When the build is completed, you should see the generated binaries and
+associated files in the j2sdk-image directory in the output directory. In
+particular, the build/*/images/j2sdk-image/bin directory should contain
+executables for the OpenJDK tools and utilities for that configuration. The
+testing tool jtreg will be needed and can be found at: the jtreg
+site. The provided regression tests in the
+repositories can be run with the command:
+
+
+
cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all
+
+
+
+
+
+
+
Appendix A: Hints and Tips
+
+
+
+
FAQ
+
+
Q: The generated-configure.sh file looks horrible! How are you going to
+edit it?
+A: The generated-configure.sh file is generated (think "compiled") by the
+autoconf tools. The source code is in configure.ac and various .m4 files in
+common/autoconf, which are much more readable.
+
+
Q: Why is the generated-configure.sh file checked in, if it is
+generated?
+A: If it was not generated, every user would need to have the autoconf
+tools installed, and re-generate the configure file as the first step. Our
+goal is to minimize the work needed to be done by the user to start building
+OpenJDK, and to minimize the number of external dependencies required.
+
+
Q: Do you require a specific version of autoconf for regenerating
+generated-configure.sh?
+A: Yes, version 2.69 is required and should be easy enough to aquire on all
+supported operating systems. The reason for this is to avoid large spurious
+changes in generated-configure.sh.
+
+
Q: How do you regenerate generated-configure.sh after making changes to
+the input files?
+A: Regnerating generated-configure.sh should always be done using the
+script common/autoconf/autogen.sh to ensure that the correct files get
+updated. This script should also be run after mercurial tries to merge
+generated-configure.sh as a merge of the generated file is not guaranteed to
+be correct.
+
+
Q: What are the files in common/makefiles/support/* for? They look like
+gibberish.
+A: They are a somewhat ugly hack to compensate for command line length
+limitations on certain platforms (Windows, Solaris). Due to a combination of
+limitations in make and the shell, command lines containing too many files will
+not work properly. These helper files are part of an elaborate hack that will
+compress the command line in the makefile and then uncompress it safely. We're
+not proud of it, but it does fix the problem. If you have any better
+suggestions, we're all ears! :-)
+
+
Q: I want to see the output of the commands that make runs, like in the old
+build. How do I do that?
+A: You specify the LOG variable to make. There are several log levels:
+
+
+
warn -- Default and very quiet.
+
info -- Shows more progress information than warn.
+
debug -- Echos all command lines and prints all macro calls for
+compilation definitions.
+
trace -- Echos all $(shell) command lines as well.
+
+
+
Q: When do I have to re-run configure?
+A: Normally you will run configure only once for creating a
+configuration. You need to re-run configuration only if you want to change any
+configuration options, or if you pull down changes to the configure script.
+
+
Q: I have added a new source file. Do I need to modify the makefiles?
+A: Normally, no. If you want to create e.g. a new native library, you will
+need to modify the makefiles. But for normal file additions or removals, no
+changes are needed. There are certan exceptions for some native libraries where
+the source files are spread over many directories which also contain sources
+for other libraries. In these cases it was simply easier to create include
+lists rather than excludes.
+
+
Q: When I run configure --help, I see many strange options, like
+--dvidir. What is this?
+A: Configure provides a slew of options by default, to all projects that
+use autoconf. Most of them are not used in OpenJDK, so you can safely ignore
+them. To list only OpenJDK specific features, use configure --help=short
+instead.
+
+
Q:configure provides OpenJDK-specific features such as --with-
+builddeps-server that are not described in this document. What about those?
+A: Try them out if you like! But be aware that most of these are
+experimental features. Many of them don't do anything at all at the moment; the
+option is just a placeholder. Others depend on pieces of code or infrastructure
+that is currently not ready for prime time.
+
+
Q: How will you make sure you don't break anything?
+A: We have a script that compares the result of the new build system with
+the result of the old. For most part, we aim for (and achieve) byte-by-byte
+identical output. There are however technical issues with e.g. native binaries,
+which might differ in a byte-by-byte comparison, even when building twice with
+the old build system. For these, we compare relevant aspects (e.g. the symbol
+table and file size). Note that we still don't have 100% equivalence, but we're
+close.
+
+
Q: I noticed this thing X in the build that looks very broken by design.
+Why don't you fix it?
+A: Our goal is to produce a build output that is as close as technically
+possible to the old build output. If things were weird in the old build, they
+will be weird in the new build. Often, things were weird before due to
+obscurity, but in the new build system the weird stuff comes up to the surface.
+The plan is to attack these things at a later stage, after the new build system
+is established.
+
+
Q: The code in the new build system is not that well-structured. Will you
+fix this?
+A: Yes! The new build system has grown bit by bit as we converted the old
+system. When all of the old build system is converted, we can take a step back
+and clean up the structure of the new build system. Some of this we plan to do
+before replacing the old build system and some will need to wait until after.
+
+
Q: Is anything able to use the results of the new build's default make
+target?
+A: Yes, this is the minimal (or roughly minimal) set of compiled output
+needed for a developer to actually execute the newly built JDK. The idea is
+that in an incremental development fashion, when doing a normal make, you
+should only spend time recompiling what's changed (making it purely
+incremental) and only do the work that's needed to actually run and test your
+code. The packaging stuff that is part of the images target is not needed for
+a normal developer who wants to test his new code. Even if it's quite fast,
+it's still unnecessary. We're targeting sub-second incremental rebuilds! ;-)
+(Or, well, at least single-digit seconds...)
+
+
Q: I usually set a specific environment variable when building, but I can't
+find the equivalent in the new build. What should I do?
+A: It might very well be that we have neglected to add support for an
+option that was actually used from outside the build system. Email us and we
+will add support for it!
+
+
+
+
Build Performance Tips
+
+
Building OpenJDK requires a lot of horsepower. Some of the build tools can be
+adjusted to utilize more or less of resources such as parallel threads and
+memory. The configure script analyzes your system and selects reasonable
+values for such options based on your hardware. If you encounter resource
+problems, such as out of memory conditions, you can modify the detected values
+with:
+
+
+
--with-num-cores -- number of cores in the build system, e.g.
+--with-num-cores=8
+
--with-memory-size -- memory (in MB) available in the build system,
+e.g. --with-memory-size=1024
+
+
+
It might also be necessary to specify the JVM arguments passed to the Bootstrap
+JDK, using e.g. --with-boot-jdk-jvmargs="-Xmx8G -enableassertions". Doing
+this will override the default JVM arguments passed to the Bootstrap JDK.
+
+
One of the top goals of the new build system is to improve the build
+performance and decrease the time needed to build. This will soon also apply to
+the java compilation when the Smart Javac wrapper is fully supported.
+
+
At the end of a successful execution of configure, you will get a performance
+summary, indicating how well the build will perform. Here you will also get
+performance hints. If you want to build fast, pay attention to those!
+
+
Building with ccache
+
+
The OpenJDK build supports building with ccache when using gcc or clang. Using
+ccache can radically speed up compilation of native code if you often rebuild
+the same sources. Your milage may vary however so we recommend evaluating it
+for yourself. To enable it, make sure it's on the path and configure with
+--enable-ccache.
+
+
Building on local disk
+
+
If you are using network shares, e.g. via NFS, for your source code, make sure
+the build directory is situated on local disk. The performance penalty is
+extremely high for building on a network share, close to unusable.
+
+
Building only one JVM
+
+
The old build builds multiple JVMs on 32-bit systems (client and server; and on
+Windows kernel as well). In the new build we have changed this default to only
+build server when it's available. This improves build times for those not
+interested in multiple JVMs. To mimic the old behavior on platforms that
+support it, use --with-jvm-variants=client,server.
+
+
Selecting the number of cores to build on
+
+
By default, configure will analyze your machine and run the make process in
+parallel with as many threads as you have cores. This behavior can be
+overridden, either "permanently" (on a configure basis) using
+--with-num-cores=N or for a single build only (on a make basis), using
+make JOBS=N.
+
+
If you want to make a slower build just this time, to save some CPU power for
+other processes, you can run e.g. make JOBS=2. This will force the makefiles
+to only run 2 parallel processes, or even make JOBS=1 which will disable
+parallelism.
+
+
If you want to have it the other way round, namely having slow builds default
+and override with fast if you're impatient, you should call configure with
+--with-num-cores=2, making 2 the default. If you want to run with more cores,
+run make JOBS=8
+
+
+
+
Troubleshooting
+
+
Solving build problems
+
+
If the build fails (and it's not due to a compilation error in a source file
+you've changed), the first thing you should do is to re-run the build with more
+verbosity. Do this by adding LOG=debug to your make command line.
+
+
The build log (with both stdout and stderr intermingled, basically the same as
+you see on your console) can be found as build.log in your build directory.
+
+
You can ask for help on build problems with the new build system on either the
+build-dev or the
+build-infra-dev
+mailing lists. Please include the relevant parts of the build log.
+
+
A build can fail for any number of reasons. Most failures are a result of
+trying to build in an environment in which all the pre-build requirements have
+not been met. The first step in troubleshooting a build failure is to recheck
+that you have satisfied all the pre-build requirements for your platform.
+Scanning the configure log is a good first step, making sure that what it
+found makes sense for your system. Look for strange error messages or any
+difficulties that configure had in finding things.
+
+
Some of the more common problems with builds are briefly described below, with
+suggestions for remedies.
+
+
+
Corrupted Bundles on Windows:
+Some virus scanning software has been known to corrupt the downloading of
+zip bundles. It may be necessary to disable the 'on access' or 'real time'
+virus scanning features to prevent this corruption. This type of 'real time'
+virus scanning can also slow down the build process significantly.
+Temporarily disabling the feature, or excluding the build output directory
+may be necessary to get correct and faster builds.
+
Slow Builds:
+If your build machine seems to be overloaded from too many simultaneous C++
+compiles, try setting the JOBS=1 on the make command line. Then try
+increasing the count slowly to an acceptable level for your system. Also:
+
+
Creating the javadocs can be very slow, if you are running javadoc, consider
+skipping that step.
+
+
Faster CPUs, more RAM, and a faster DISK usually helps. The VM build tends
+to be CPU intensive (many C++ compiles), and the rest of the JDK will often
+be disk intensive.
+
+
Faster compiles are possible using a tool called
+ccache.
+
File time issues:
+If you see warnings that refer to file time stamps, e.g.
+
+
+
Warning message:File 'xxx' has modification time in the future.
+Warning message:Clock skew detected. Your build may be incomplete.
+
+
+
These warnings can occur when the clock on the build machine is out of sync
+with the timestamps on the source files. Other errors, apparently unrelated
+but in fact caused by the clock skew, can occur along with the clock skew
+warnings. These secondary errors may tend to obscure the fact that the true
+root cause of the problem is an out-of-sync clock.
+
+
If you see these warnings, reset the clock on the build machine, run
+"gmake clobber" or delete the directory containing the build output, and
+restart the build from the beginning.
+
Error message: Trouble writing out table to disk
+Increase the amount of swap space on your build machine. This could be
+caused by overloading the system and it may be necessary to use:
+
+
+
make JOBS=1
+
+
+
to reduce the load on the system.
+
Error Message: libstdc++ not found:
+This is caused by a missing libstdc++.a library. This is installed as part
+of a specific package (e.g. libstdc++.so.devel.386). By default some 64-bit
+Linux versions (e.g. Fedora) only install the 64-bit version of the
+libstdc++ package. Various parts of the JDK build require a static link of
+the C++ runtime libraries to allow for maximum portability of the built
+images.
+
Linux Error Message: cannot restore segment prot after reloc
+This is probably an issue with SELinux (See SELinux on
+Wikipedia). Parts of the VM is built
+without the -fPIC for performance reasons.
+
+
To completely disable SELinux:
+
+
+
$ su root
+
# system-config-securitylevel
+
In the window that appears, select the SELinux tab
+
Disable SELinux
+
+
+
Alternatively, instead of completely disabling it you could disable just
+this one check.
+
+
+
Select System->Administration->SELinux Management
+
In the SELinux Management Tool which appears, select "Boolean" from the
+menu on the left
+
Expand the "Memory Protection" group
+
Check the first item, labeled "Allow all unconfined executables to use
+libraries requiring text relocation ..."
+
+
Windows Error Messages:
+*** fatal error - couldn't allocate heap, ...
+rm fails with "Directory not empty"
+unzip fails with "cannot create ... Permission denied"
+unzip fails with "cannot create ... Error 50"
Windows Error Message: spawn failed
+Try rebooting the system, or there could be some kind of issue with the disk
+or disk partition being used. Sometimes it comes with a "Permission Denied"
+message.
+
+
+
+
+
+
+
Appendix B: GNU make
+
+
The Makefiles in the OpenJDK are only valid when used with the GNU version of
+the utility command make (usually called gmake on Solaris). A few notes
+about using GNU make:
+
+
+
You need GNU make version 3.81 or newer. On Windows 4.0 or newer is
+recommended. If the GNU make utility on your systems is not of a suitable
+version, see "Building GNU make".
+
Place the location of the GNU make binary in the PATH.
+
Solaris: Do NOT use /usr/bin/make on Solaris. If your Solaris system
+has the software from the Solaris Developer Companion CD installed, you
+should try and use gmake which will be located in either the /usr/bin,
+/opt/sfw/bin or /usr/sfw/bin directory.
+
Windows: Make sure you start your build inside a bash shell.
+
Mac OS X: The XCode "command line tools" must be installed on your Mac.
+
+
+
Information on GNU make, and access to ftp download sites, are available on the
+GNU make web site . The latest
+source to GNU make is available at
+ftp.gnu.org/pub/gnu/make/.
+
+
+
+
Building GNU make
+
+
First step is to get the GNU make 3.81 or newer source from
+ftp.gnu.org/pub/gnu/make/. Building is a
+little different depending on the OS but is basically done with:
+
+
bash ./configure
+ make
+
+
+
+
+
+
+
Appendix C: Build Environments
+
+
Minimum Build Environments
+
+
This file often describes specific requirements for what we call the "minimum
+build environments" (MBE) for this specific release of the JDK. What is listed
+below is what the Oracle Release Engineering Team will use to build the Oracle
+JDK product. Building with the MBE will hopefully generate the most compatible
+bits that install on, and run correctly on, the most variations of the same
+base OS and hardware architecture. In some cases, these represent what is often
+called the least common denominator, but each Operating System has different
+aspects to it.
+
+
In all cases, the Bootstrap JDK version minimum is critical, we cannot
+guarantee builds will work with older Bootstrap JDK's. Also in all cases, more
+RAM and more processors is better, the minimums listed below are simply
+recommendations.
+
+
With Solaris and Mac OS X, the version listed below is the oldest release we
+can guarantee builds and works, and the specific version of the compilers used
+could be critical.
+
+
With Windows the critical aspect is the Visual Studio compiler used, which due
+to it's runtime, generally dictates what Windows systems can do the builds and
+where the resulting bits can be used.
+
+
NOTE: We expect a change here off these older Windows OS releases and to a
+'less older' one, probably Windows 2008R2 X64.
+
+
With Linux, it was just a matter of picking a stable distribution that is a
+good representative for Linux in general.
+
+
NOTE: We expect a change here from Fedora 9 to something else, but it has not
+been completely determined yet, possibly Ubuntu 12.04 X64, unbiased community
+feedback would be welcome on what a good choice would be here.
+
+
It is understood that most developers will NOT be using these specific
+versions, and in fact creating these specific versions may be difficult due to
+the age of some of this software. It is expected that developers are more often
+using the more recent releases and distributions of these operating systems.
+
+
Compilation problems with newer or different C/C++ compilers is a common
+problem. Similarly, compilation problems related to changes to the
+/usr/include or system header files is also a common problem with older,
+newer, or unreleased OS versions. Please report these types of problems as bugs
+so that they can be dealt with accordingly.
+
+
+
+
+
+
Base OS and Architecture
+
OS
+
C/C++ Compiler
+
Bootstrap JDK
+
Processors
+
RAM Minimum
+
DISK Needs
+
+
+
+
+
Linux X86 (32-bit) and X64 (64-bit)
+
Oracle Enterprise Linux 6.4
+
gcc 4.8.2
+
JDK 8
+
2 or more
+
1 GB
+
6 GB
+
+
+
Solaris SPARCV9 (64-bit)
+
Solaris 10 Update 10
+
Studio 12 Update 3 + patches
+
JDK 8
+
4 or more
+
4 GB
+
8 GB
+
+
+
Solaris X64 (64-bit)
+
Solaris 10 Update 10
+
Studio 12 Update 3 + patches
+
JDK 8
+
4 or more
+
4 GB
+
8 GB
+
+
+
Windows X86 (32-bit)
+
Windows Server 2012 R2 x64
+
Microsoft Visual Studio C++ 2013 Professional Edition
+
JDK 8
+
2 or more
+
2 GB
+
6 GB
+
+
+
Windows X64 (64-bit)
+
Windows Server 2012 R2 x64
+
Microsoft Visual Studio C++ 2013 Professional Edition
+
JDK 8
+
2 or more
+
2 GB
+
6 GB
+
+
+
Mac OS X X64 (64-bit)
+
Mac OS X 10.9 "Mavericks"
+
XCode 5.1.1 or newer
+
JDK 8
+
2 or more
+
4 GB
+
6 GB
+
+
+
+
+
+
+
+
+
+
Specific Developer Build Environments
+
+
We won't be listing all the possible environments, but we will try to provide
+what information we have available to us.
+
+
NOTE: The community can help out by updating this part of the document.
+
+
Fedora
+
+
After installing the latest Fedora you need to
+install several build dependencies. The simplest way to do it is to execute the
+following commands as user root:
After installing CentOS 5.5 you need to make sure you
+have the following Development bundles installed:
+
+
+
Development Libraries
+
Development Tools
+
Java Development
+
X Software Development (Including XFree86-devel)
+
+
+
Plus the following packages:
+
+
+
cups devel: Cups Development Package
+
alsa devel: Alsa Development Package
+
Xi devel: libXi.so Development Package
+
+
+
The freetype 2.3 packages don't seem to be available, but the freetype 2.3
+sources can be downloaded, built, and installed easily enough from the
+freetype site. Build and install
+with something like:
+
+
bash ./configure
+ make
+ sudo -u root make install
+
+
+
Mercurial packages could not be found easily, but a Google search should find
+ones, and they usually include Python if it's needed.
+
+
Debian 5.0 (Lenny)
+
+
After installing Debian 5 you need to install several
+build dependencies. The simplest way to install the build dependencies is to
+execute the following commands as user root:
After installing OpenSUSE 11.1 you need to install
+several build dependencies. The simplest way to install the build dependencies
+is to execute the following commands:
Finally, you need to unset the JAVA_HOME environment variable:
+
+
export -n JAVA_HOME`
+
+
+
Mandriva Linux One 2009 Spring
+
+
After installing Mandriva Linux One 2009 Spring you need
+to install several build dependencies. The simplest way to install the build
+dependencies is to execute the following commands as user root:
+
+
urpmi java-1.7.0-openjdk-devel make gcc gcc-c++ freetype-devel zip unzip
+ libcups2-devel libxrender1-devel libalsa2-devel libstc++-static-devel
+ libxtst6-devel libxi-devel
+
+
+
In addition, it is necessary to set a few environment variables for the build:
After installing OpenSolaris 2009.06 you need to
+install several build dependencies. The simplest way to install the build
+dependencies is to execute the following commands:
+
diff --git a/README-builds.md b/README-builds.md
new file mode 100644
index 00000000000..21367477890
--- /dev/null
+++ b/README-builds.md
@@ -0,0 +1,1263 @@
+
+# OpenJDK Build README
+
+*****
+
+
+## Introduction
+
+This README file contains build instructions for the
+[OpenJDK](http://openjdk.java.net). Building the source code for the OpenJDK
+requires a certain degree of technical expertise.
+
+### !!!!!!!!!!!!!!! THIS IS A MAJOR RE-WRITE of this document. !!!!!!!!!!!!!
+
+Some Headlines:
+
+ * The build is now a "`configure && make`" style build
+ * Any GNU make 3.81 or newer should work, except on Windows where 4.0 or newer
+ is recommended.
+ * The build should scale, i.e. more processors should cause the build to be
+ done in less wall-clock time
+ * Nested or recursive make invocations have been significantly reduced,
+ as has the total fork/exec or spawning of sub processes during the build
+ * Windows MKS usage is no longer supported
+ * Windows Visual Studio `vsvars*.bat` and `vcvars*.bat` files are run
+ automatically
+ * Ant is no longer used when building the OpenJDK
+ * Use of ALT_* environment variables for configuring the build is no longer
+ supported
+
+*****
+
+## Contents
+
+ * [Introduction](#introduction)
+ * [Use of Mercurial](#hg)
+ * [Getting the Source](#get_source)
+ * [Repositories](#repositories)
+ * [Building](#building)
+ * [System Setup](#setup)
+ * [Linux](#linux)
+ * [Solaris](#solaris)
+ * [Mac OS X](#macosx)
+ * [Windows](#windows)
+ * [Configure](#configure)
+ * [Make](#make)
+ * [Testing](#testing)
+
+*****
+
+ * [Appendix A: Hints and Tips](#hints)
+ * [FAQ](#faq)
+ * [Build Performance Tips](#performance)
+ * [Troubleshooting](#troubleshooting)
+ * [Appendix B: GNU Make Information](#gmake)
+ * [Appendix C: Build Environments](#buildenvironments)
+
+*****
+
+
+## Use of Mercurial
+
+The OpenJDK sources are maintained with the revision control system
+[Mercurial](http://mercurial.selenic.com/wiki/Mercurial). If you are new to
+Mercurial, please see the [Beginner Guides](http://mercurial.selenic.com/wiki/
+BeginnersGuides) or refer to the [Mercurial Book](http://hgbook.red-bean.com/).
+The first few chapters of the book provide an excellent overview of Mercurial,
+what it is and how it works.
+
+For using Mercurial with the OpenJDK refer to the [Developer Guide: Installing
+and Configuring Mercurial](http://openjdk.java.net/guide/
+repositories.html#installConfig) section for more information.
+
+
+### Getting the Source
+
+To get the entire set of OpenJDK Mercurial repositories use the script
+`get_source.sh` located in the root repository:
+
+ hg clone http://hg.openjdk.java.net/jdk9/jdk9 YourOpenJDK
+ cd YourOpenJDK
+ bash ./get_source.sh
+
+Once you have all the repositories, keep in mind that each repository is its
+own independent repository. You can also re-run `./get_source.sh` anytime to
+pull over all the latest changesets in all the repositories. This set of
+nested repositories has been given the term "forest" and there are various
+ways to apply the same `hg` command to each of the repositories. For
+example, the script `make/scripts/hgforest.sh` can be used to repeat the
+same `hg` command on every repository, e.g.
+
+ cd YourOpenJDK
+ bash ./make/scripts/hgforest.sh status
+
+
+### Repositories
+
+The set of repositories and what they contain:
+
+ * **. (root)** contains common configure and makefile logic
+ * **hotspot** contains source code and make files for building the OpenJDK
+ Hotspot Virtual Machine
+ * **langtools** contains source code for the OpenJDK javac and language tools
+ * **jdk** contains source code and make files for building the OpenJDK runtime
+ libraries and misc files
+ * **jaxp** contains source code for the OpenJDK JAXP functionality
+ * **jaxws** contains source code for the OpenJDK JAX-WS functionality
+ * **corba** contains source code for the OpenJDK Corba functionality
+ * **nashorn** contains source code for the OpenJDK JavaScript implementation
+
+### Repository Source Guidelines
+
+There are some very basic guidelines:
+
+ * Use of whitespace in source files (.java, .c, .h, .cpp, and .hpp files) is
+ restricted. No TABs, no trailing whitespace on lines, and files should not
+ terminate in more than one blank line.
+ * Files with execute permissions should not be added to the source
+ repositories.
+ * All generated files need to be kept isolated from the files maintained or
+ managed by the source control system. The standard area for generated files
+ is the top level `build/` directory.
+ * The default build process should be to build the product and nothing else,
+ in one form, e.g. a product (optimized), debug (non-optimized, -g plus
+ assert logic), or fastdebug (optimized, -g plus assert logic).
+ * The `.hgignore` file in each repository must exist and should include
+ `^build/`, `^dist/` and optionally any `nbproject/private` directories. **It
+ should NEVER** include anything in the `src/` or `test/` or any managed
+ directory area of a repository.
+ * Directory names and file names should never contain blanks or non-printing
+ characters.
+ * Generated source or binary files should NEVER be added to the repository
+ (that includes `javah` output). There are some exceptions to this rule, in
+ particular with some of the generated configure scripts.
+ * Files not needed for typical building or testing of the repository should
+ not be added to the repository.
+
+*****
+
+
+## Building
+
+The very first step in building the OpenJDK is making sure the system itself
+has everything it needs to do OpenJDK builds. Once a system is setup, it
+generally doesn't need to be done again.
+
+Building the OpenJDK is now done with running a `configure` script which will
+try and find and verify you have everything you need, followed by running
+`make`, e.g.
+
+> **`bash ./configure`**
+> **`make all`**
+
+Where possible the `configure` script will attempt to located the various
+components in the default locations or via component specific variable
+settings. When the normal defaults fail or components cannot be found,
+additional `configure` options may be necessary to help `configure` find the
+necessary tools for the build, or you may need to re-visit the setup of your
+system due to missing software packages.
+
+**NOTE:** The `configure` script file does not have execute permissions and
+will need to be explicitly run with `bash`, see the source guidelines.
+
+*****
+
+
+### System Setup
+
+Before even attempting to use a system to build the OpenJDK there are some very
+basic system setups needed. For all systems:
+
+ * Be sure the GNU make utility is version 3.81 (4.0 on windows) or newer, e.g.
+ run "`make -version`"
+
+
+ * Install a Bootstrap JDK. All OpenJDK builds require access to a previously
+ released JDK called the _bootstrap JDK_ or _boot JDK._ The general rule is
+ that the bootstrap JDK must be an instance of the previous major release of
+ the JDK. In addition, there may be a requirement to use a release at or
+ beyond a particular update level.
+
+ **_Building JDK 9 requires JDK 8. JDK 9 developers should not use JDK 9 as
+ the boot JDK, to ensure that JDK 9 dependencies are not introduced into the
+ parts of the system that are built with JDK 8._**
+
+ The JDK 8 binaries can be downloaded from Oracle's [JDK 8 download
+ site](http://www.oracle.com/technetwork/java/javase/downloads/index.html).
+ For build performance reasons it is very important that this bootstrap JDK
+ be made available on the local disk of the machine doing the build. You
+ should add its `bin` directory to the `PATH` environment variable. If
+ `configure` has any issues finding this JDK, you may need to use the
+ `configure` option `--with-boot-jdk`.
+
+ * Ensure that GNU make, the Bootstrap JDK, and the compilers are all in your
+ PATH environment variable.
+
+And for specific systems:
+
+ * **Linux**
+
+ Install all the software development packages needed including
+ [alsa](#alsa), [freetype](#freetype), [cups](#cups), and
+ [xrender](#xrender). See [specific system packages](#SDBE).
+
+ * **Solaris**
+
+ Install all the software development packages needed including [Studio
+ Compilers](#studio), [freetype](#freetype), [cups](#cups), and
+ [xrender](#xrender). See [specific system packages](#SDBE).
+
+ * **Windows**
+
+ * Install one of [CYGWIN](#cygwin) or [MinGW/MSYS](#msys)
+ * Install [Visual Studio 2013](#vs2013)
+
+ * **Mac OS X**
+
+ Install [XCode 4.5.2](https://developer.apple.com/xcode/) and also
+ install the "Command line tools" found under the preferences pane
+ "Downloads"
+
+
+#### Linux
+
+With Linux, try and favor the system packages over building your own or getting
+packages from other areas. Most Linux builds should be possible with the
+system's available packages.
+
+Note that some Linux systems have a habit of pre-populating your environment
+variables for you, for example `JAVA_HOME` might get pre-defined for you to
+refer to the JDK installed on your Linux system. You will need to unset
+`JAVA_HOME`. It's a good idea to run `env` and verify the environment variables
+you are getting from the default system settings make sense for building the
+OpenJDK.
+
+
+#### Solaris
+
+
+##### Studio Compilers
+
+At a minimum, the [Studio 12 Update 1 Compilers](http://www.oracle.com/
+technetwork/server-storage/solarisstudio/downloads/index.htm) (containing
+version 5.10 of the C and C++ compilers) is required, including specific
+patches.
+
+The Solaris SPARC patch list is:
+
+ * 118683-05: SunOS 5.10: Patch for profiling libraries and assembler
+ * 119963-21: SunOS 5.10: Shared library patch for C++
+ * 120753-08: SunOS 5.10: Microtasking libraries (libmtsk) patch
+ * 128228-09: Sun Studio 12 Update 1: Patch for Sun C++ Compiler
+ * 141860-03: Sun Studio 12 Update 1: Patch for Compiler Common patch for Sun C
+ C++ F77 F95
+ * 141861-05: Sun Studio 12 Update 1: Patch for Sun C Compiler
+ * 142371-01: Sun Studio 12.1 Update 1: Patch for dbx
+ * 143384-02: Sun Studio 12 Update 1: Patch for debuginfo handling
+ * 143385-02: Sun Studio 12 Update 1: Patch for Compiler Common patch for Sun C
+ C++ F77 F95
+ * 142369-01: Sun Studio 12.1: Patch for Performance Analyzer Tools
+
+The Solaris X86 patch list is:
+
+ * 119961-07: SunOS 5.10_x86, x64, Patch for profiling libraries and assembler
+ * 119964-21: SunOS 5.10_x86: Shared library patch for C++\_x86
+ * 120754-08: SunOS 5.10_x86: Microtasking libraries (libmtsk) patch
+ * 141858-06: Sun Studio 12 Update 1_x86: Sun Compiler Common patch for x86
+ backend
+ * 128229-09: Sun Studio 12 Update 1_x86: Patch for C++ Compiler
+ * 142363-05: Sun Studio 12 Update 1_x86: Patch for C Compiler
+ * 142368-01: Sun Studio 12.1_x86: Patch for Performance Analyzer Tools
+
+Place the `bin` directory in `PATH`.
+
+The Oracle Solaris Studio Express compilers at: [Oracle Solaris Studio Express
+Download site](http://www.oracle.com/technetwork/server-storage/solarisstudio/
+downloads/index-jsp-142582.html) are also an option, although these compilers
+have not been extensively used yet.
+
+
+#### Windows
+
+##### Windows Unix Toolkit
+
+Building on Windows requires a Unix-like environment, notably a Unix-like
+shell. There are several such environments available of which
+[Cygwin](http://www.cygwin.com/) and
+[MinGW/MSYS](http://www.mingw.org/wiki/MSYS) are currently supported for the
+OpenJDK build. One of the differences of these systems from standard Windows
+tools is the way they handle Windows path names, particularly path names which
+contain spaces, backslashes as path separators and possibly drive letters.
+Depending on the use case and the specifics of each environment these path
+problems can be solved by a combination of quoting whole paths, translating
+backslashes to forward slashes, escaping backslashes with additional
+backslashes and translating the path names to their ["8.3"
+version](http://en.wikipedia.org/wiki/8.3_filename).
+
+
+###### CYGWIN
+
+CYGWIN is an open source, Linux-like environment which tries to emulate a
+complete POSIX layer on Windows. It tries to be smart about path names and can
+usually handle all kinds of paths if they are correctly quoted or escaped
+although internally it maps drive letters `:` to a virtual directory
+`/cygdrive/`.
+
+You can always use the `cygpath` utility to map pathnames with spaces or the
+backslash character into the `C:/` style of pathname (called 'mixed'), e.g.
+`cygpath -s -m ""`.
+
+Note that the use of CYGWIN creates a unique problem with regards to setting
+[`PATH`](#path). Normally on Windows the `PATH` variable contains directories
+separated with the ";" character (Solaris and Linux use ":"). With CYGWIN, it
+uses ":", but that means that paths like "C:/path" cannot be placed in the
+CYGWIN version of `PATH` and instead CYGWIN uses something like
+`/cygdrive/c/path` which CYGWIN understands, but only CYGWIN understands.
+
+The OpenJDK build requires CYGWIN version 1.7.16 or newer. Information about
+CYGWIN can be obtained from the CYGWIN website at
+[www.cygwin.com](http://www.cygwin.com).
+
+By default CYGWIN doesn't install all the tools required for building the
+OpenJDK. Along with the default installation, you need to install the following
+tools.
+
+>
+
+
+
Binary Name
+
Category
+
Package
+
Description
+
+
+
+
+
ar.exe
+
Devel
+
binutils
+
The GNU assembler, linker and binary utilities
+
+
+
make.exe
+
Devel
+
make
+
The GNU version of the 'make' utility built for CYGWIN
+
+
+
m4.exe
+
Interpreters
+
m4
+
GNU implementation of the traditional Unix macro processor
+
+
+
cpio.exe
+
Utils
+
cpio
+
A program to manage archives of files
+
+
+
gawk.exe
+
Utils
+
awk
+
Pattern-directed scanning and processing language
+
+
+
file.exe
+
Utils
+
file
+
Determines file type using 'magic' numbers
+
+
+
zip.exe
+
Archive
+
zip
+
Package and compress (archive) files
+
+
+
unzip.exe
+
Archive
+
unzip
+
Extract compressed files in a ZIP archive
+
+
+
free.exe
+
System
+
procps
+
Display amount of free and used memory in the system
+
+
+
+
+Note that the CYGWIN software can conflict with other non-CYGWIN software on
+your Windows system. CYGWIN provides a [FAQ](http://cygwin.com/faq/
+faq.using.html) for known issues and problems, of particular interest is the
+section on [BLODA (applications that interfere with
+CYGWIN)](http://cygwin.com/faq/faq.using.html#faq.using.bloda).
+
+
+###### MinGW/MSYS
+
+MinGW ("Minimalist GNU for Windows") is a collection of free Windows specific
+header files and import libraries combined with GNU toolsets that allow one to
+produce native Windows programs that do not rely on any 3rd-party C runtime
+DLLs. MSYS is a supplement to MinGW which allows building applications and
+programs which rely on traditional UNIX tools to be present. Among others this
+includes tools like `bash` and `make`. See [MinGW/MSYS](http://www.mingw.org/
+wiki/MSYS) for more information.
+
+Like Cygwin, MinGW/MSYS can handle different types of path formats. They are
+internally converted to paths with forward slashes and drive letters
+`:` replaced by a virtual directory `/`. Additionally, MSYS
+automatically detects binaries compiled for the MSYS environment and feeds them
+with the internal, Unix-style path names. If native Windows applications are
+called from within MSYS programs their path arguments are automatically
+converted back to Windows style path names with drive letters and backslashes
+as path separators. This may cause problems for Windows applications which use
+forward slashes as parameter separator (e.g. `cl /nologo /I`) because MSYS may
+wrongly [replace such parameters by drive letters](http://mingw.org/wiki/
+Posix_path_conversion).
+
+In addition to the tools which will be installed by default, you have to
+manually install the `msys-zip` and `msys-unzip` packages. This can be easily
+done with the MinGW command line installer:
+
+ mingw-get.exe install msys-zip
+ mingw-get.exe install msys-unzip
+
+
+##### Visual Studio 2013 Compilers
+
+The 32-bit and 64-bit OpenJDK Windows build requires Microsoft Visual Studio
+C++ 2013 (VS2013) Professional Edition or Express compiler. The compiler and
+other tools are expected to reside in the location defined by the variable
+`VS120COMNTOOLS` which is set by the Microsoft Visual Studio installer.
+
+Only the C++ part of VS2013 is needed. Try to let the installation go to the
+default install directory. Always reboot your system after installing VS2013.
+The system environment variable VS120COMNTOOLS should be set in your
+environment.
+
+Make sure that TMP and TEMP are also set in the environment and refer to
+Windows paths that exist, like `C:\temp`, not `/tmp`, not `/cygdrive/c/temp`,
+and not `C:/temp`. `C:\temp` is just an example, it is assumed that this area
+is private to the user, so by default after installs you should see a unique
+user path in these variables.
+
+
+#### Mac OS X
+
+Make sure you get the right XCode version.
+
+*****
+
+
+### Configure
+
+The basic invocation of the `configure` script looks like:
+
+> **`bash ./configure [options]`**
+
+This will create an output directory containing the "configuration" and setup
+an area for the build result. This directory typically looks like:
+
+> **`build/linux-x64-normal-server-release`**
+
+`configure` will try to figure out what system you are running on and where all
+necessary build components are. If you have all prerequisites for building
+installed, it should find everything. If it fails to detect any component
+automatically, it will exit and inform you about the problem. When this
+happens, read more below in [the `configure` options](#configureoptions).
+
+Some examples:
+
+> **Windows 32bit build with freetype specified:**
+> `bash ./configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-
+bits=32`
+
+> **Debug 64bit Build:**
+> `bash ./configure --enable-debug --with-target-bits=64`
+
+
+#### Configure Options
+
+Complete details on all the OpenJDK `configure` options can be seen with:
+
+> **`bash ./configure --help=short`**
+
+Use `-help` to see all the `configure` options available. You can generate any
+number of different configurations, e.g. debug, release, 32, 64, etc.
+
+Some of the more commonly used `configure` options are:
+
+> **`--enable-debug`**
+> set the debug level to fastdebug (this is a shorthand for `--with-debug-
+ level=fastdebug`)
+
+
+> **`--with-alsa=`**_path_
+> select the location of the Advanced Linux Sound Architecture (ALSA)
+
+> Version 0.9.1 or newer of the ALSA files are required for building the
+ OpenJDK on Linux. These Linux files are usually available from an "alsa" of
+ "libasound" development package, and it's highly recommended that you try
+ and use the package provided by the particular version of Linux that you are
+ using.
+
+> **`--with-boot-jdk=`**_path_
+> select the [Bootstrap JDK](#bootjdk)
+
+> **`--with-boot-jdk-jvmargs=`**"_args_"
+> provide the JVM options to be used to run the [Bootstrap JDK](#bootjdk)
+
+> **`--with-cacerts=`**_path_
+> select the path to the cacerts file.
+
+> See [Certificate Authority on Wikipedia](http://en.wikipedia.org/wiki/
+ Certificate_Authority) for a better understanding of the Certificate
+ Authority (CA). A certificates file named "cacerts" represents a system-wide
+ keystore with CA certificates. In JDK and JRE binary bundles, the "cacerts"
+ file contains root CA certificates from several public CAs (e.g., VeriSign,
+ Thawte, and Baltimore). The source contain a cacerts file without CA root
+ certificates. Formal JDK builders will need to secure permission from each
+ public CA and include the certificates into their own custom cacerts file.
+ Failure to provide a populated cacerts file will result in verification
+ errors of a certificate chain during runtime. By default an empty cacerts
+ file is provided and that should be fine for most JDK developers.
+
+
+> **`--with-cups=`**_path_
+> select the CUPS install location
+
+> The Common UNIX Printing System (CUPS) Headers are required for building the
+ OpenJDK on Solaris and Linux. The Solaris header files can be obtained by
+ installing the package **SFWcups** from the Solaris Software Companion
+ CD/DVD, these often will be installed into the directory `/opt/sfw/cups`.
+
+> The CUPS header files can always be downloaded from
+ [www.cups.org](http://www.cups.org).
+
+> **`--with-cups-include=`**_path_
+> select the CUPS include directory location
+
+> **`--with-debug-level=`**_level_
+> select the debug information level of release, fastdebug, or slowdebug
+
+> **`--with-dev-kit=`**_path_
+> select location of the compiler install or developer install location
+
+
+> **`--with-freetype=`**_path_
+> select the freetype files to use.
+
+> Expecting the freetype libraries under `lib/` and the headers under
+ `include/`.
+
+> Version 2.3 or newer of FreeType is required. On Unix systems required files
+ can be available as part of your distribution (while you still may need to
+ upgrade them). Note that you need development version of package that
+ includes both the FreeType library and header files.
+
+> You can always download latest FreeType version from the [FreeType
+ website](http://www.freetype.org). Building the freetype 2 libraries from
+ scratch is also possible, however on Windows refer to the [Windows FreeType
+ DLL build instructions](http://freetype.freedesktop.org/wiki/FreeType_DLL).
+
+> Note that by default FreeType is built with byte code hinting support
+ disabled due to licensing restrictions. In this case, text appearance and
+ metrics are expected to differ from Sun's official JDK build. See the
+ [SourceForge FreeType2 Home Page](http://freetype.sourceforge.net/freetype2)
+ for more information.
+
+> **`--with-import-hotspot=`**_path_
+> select the location to find hotspot binaries from a previous build to avoid
+ building hotspot
+
+> **`--with-target-bits=`**_arg_
+> select 32 or 64 bit build
+
+> **`--with-jvm-variants=`**_variants_
+> select the JVM variants to build from, comma separated list that can
+ include: server, client, kernel, zero and zeroshark
+
+> **`--with-memory-size=`**_size_
+> select the RAM size that GNU make will think this system has
+
+> **`--with-msvcr-dll=`**_path_
+> select the `msvcr100.dll` file to include in the Windows builds (C/C++
+ runtime library for Visual Studio).
+
+> This is usually picked up automatically from the redist directories of
+ Visual Studio 2013.
+
+> **`--with-num-cores=`**_cores_
+> select the number of cores to use (processor count or CPU count)
+
+
+> **`--with-x=`**_path_
+> select the location of the X11 and xrender files.
+
+> The XRender Extension Headers are required for building the OpenJDK on
+ Solaris and Linux. The Linux header files are usually available from a
+ "Xrender" development package, it's recommended that you try and use the
+ package provided by the particular distribution of Linux that you are using.
+ The Solaris XRender header files is included with the other X11 header files
+ in the package **SFWxwinc** on new enough versions of Solaris and will be
+ installed in `/usr/X11/include/X11/extensions/Xrender.h` or
+ `/usr/openwin/share/include/X11/extensions/Xrender.h`
+
+*****
+
+
+### Make
+
+The basic invocation of the `make` utility looks like:
+
+> **`make all`**
+
+This will start the build to the output directory containing the
+"configuration" that was created by the `configure` script. Run `make help` for
+more information on the available targets.
+
+There are some of the make targets that are of general interest:
+
+> _empty_
+> build everything but no images
+
+> **`all`**
+> build everything including images
+
+> **`all-conf`**
+> build all configurations
+
+> **`images`**
+> create complete j2sdk and j2re images
+
+> **`install`**
+> install the generated images locally, typically in `/usr/local`
+
+> **`clean`**
+> remove all files generated by make, but not those generated by `configure`
+
+> **`dist-clean`**
+> remove all files generated by both and `configure` (basically killing the
+ configuration)
+
+> **`help`**
+> give some help on using `make`, including some interesting make targets
+
+*****
+
+
+## Testing
+
+When the build is completed, you should see the generated binaries and
+associated files in the `j2sdk-image` directory in the output directory. In
+particular, the `build/*/images/j2sdk-image/bin` directory should contain
+executables for the OpenJDK tools and utilities for that configuration. The
+testing tool `jtreg` will be needed and can be found at: [the jtreg
+site](http://openjdk.java.net/jtreg/). The provided regression tests in the
+repositories can be run with the command:
+
+> **``cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all``**
+
+*****
+
+
+## Appendix A: Hints and Tips
+
+
+### FAQ
+
+**Q:** The `generated-configure.sh` file looks horrible! How are you going to
+edit it?
+**A:** The `generated-configure.sh` file is generated (think "compiled") by the
+autoconf tools. The source code is in `configure.ac` and various .m4 files in
+common/autoconf, which are much more readable.
+
+**Q:** Why is the `generated-configure.sh` file checked in, if it is
+generated?
+**A:** If it was not generated, every user would need to have the autoconf
+tools installed, and re-generate the `configure` file as the first step. Our
+goal is to minimize the work needed to be done by the user to start building
+OpenJDK, and to minimize the number of external dependencies required.
+
+**Q:** Do you require a specific version of autoconf for regenerating
+`generated-configure.sh`?
+**A:** Yes, version 2.69 is required and should be easy enough to aquire on all
+supported operating systems. The reason for this is to avoid large spurious
+changes in `generated-configure.sh`.
+
+**Q:** How do you regenerate `generated-configure.sh` after making changes to
+the input files?
+**A:** Regnerating `generated-configure.sh` should always be done using the
+script `common/autoconf/autogen.sh` to ensure that the correct files get
+updated. This script should also be run after mercurial tries to merge
+`generated-configure.sh` as a merge of the generated file is not guaranteed to
+be correct.
+
+**Q:** What are the files in `common/makefiles/support/*` for? They look like
+gibberish.
+**A:** They are a somewhat ugly hack to compensate for command line length
+limitations on certain platforms (Windows, Solaris). Due to a combination of
+limitations in make and the shell, command lines containing too many files will
+not work properly. These helper files are part of an elaborate hack that will
+compress the command line in the makefile and then uncompress it safely. We're
+not proud of it, but it does fix the problem. If you have any better
+suggestions, we're all ears! :-)
+
+**Q:** I want to see the output of the commands that make runs, like in the old
+build. How do I do that?
+**A:** You specify the `LOG` variable to make. There are several log levels:
+
+ * **`warn`** -- Default and very quiet.
+ * **`info`** -- Shows more progress information than warn.
+ * **`debug`** -- Echos all command lines and prints all macro calls for
+ compilation definitions.
+ * **`trace`** -- Echos all $(shell) command lines as well.
+
+**Q:** When do I have to re-run `configure`?
+**A:** Normally you will run `configure` only once for creating a
+configuration. You need to re-run configuration only if you want to change any
+configuration options, or if you pull down changes to the `configure` script.
+
+**Q:** I have added a new source file. Do I need to modify the makefiles?
+**A:** Normally, no. If you want to create e.g. a new native library, you will
+need to modify the makefiles. But for normal file additions or removals, no
+changes are needed. There are certan exceptions for some native libraries where
+the source files are spread over many directories which also contain sources
+for other libraries. In these cases it was simply easier to create include
+lists rather than excludes.
+
+**Q:** When I run `configure --help`, I see many strange options, like
+`--dvidir`. What is this?
+**A:** Configure provides a slew of options by default, to all projects that
+use autoconf. Most of them are not used in OpenJDK, so you can safely ignore
+them. To list only OpenJDK specific features, use `configure --help=short`
+instead.
+
+**Q:** `configure` provides OpenJDK-specific features such as `--with-
+builddeps-server` that are not described in this document. What about those?
+**A:** Try them out if you like! But be aware that most of these are
+experimental features. Many of them don't do anything at all at the moment; the
+option is just a placeholder. Others depend on pieces of code or infrastructure
+that is currently not ready for prime time.
+
+**Q:** How will you make sure you don't break anything?
+**A:** We have a script that compares the result of the new build system with
+the result of the old. For most part, we aim for (and achieve) byte-by-byte
+identical output. There are however technical issues with e.g. native binaries,
+which might differ in a byte-by-byte comparison, even when building twice with
+the old build system. For these, we compare relevant aspects (e.g. the symbol
+table and file size). Note that we still don't have 100% equivalence, but we're
+close.
+
+**Q:** I noticed this thing X in the build that looks very broken by design.
+Why don't you fix it?
+**A:** Our goal is to produce a build output that is as close as technically
+possible to the old build output. If things were weird in the old build, they
+will be weird in the new build. Often, things were weird before due to
+obscurity, but in the new build system the weird stuff comes up to the surface.
+The plan is to attack these things at a later stage, after the new build system
+is established.
+
+**Q:** The code in the new build system is not that well-structured. Will you
+fix this?
+**A:** Yes! The new build system has grown bit by bit as we converted the old
+system. When all of the old build system is converted, we can take a step back
+and clean up the structure of the new build system. Some of this we plan to do
+before replacing the old build system and some will need to wait until after.
+
+**Q:** Is anything able to use the results of the new build's default make
+target?
+**A:** Yes, this is the minimal (or roughly minimal) set of compiled output
+needed for a developer to actually execute the newly built JDK. The idea is
+that in an incremental development fashion, when doing a normal make, you
+should only spend time recompiling what's changed (making it purely
+incremental) and only do the work that's needed to actually run and test your
+code. The packaging stuff that is part of the `images` target is not needed for
+a normal developer who wants to test his new code. Even if it's quite fast,
+it's still unnecessary. We're targeting sub-second incremental rebuilds! ;-)
+(Or, well, at least single-digit seconds...)
+
+**Q:** I usually set a specific environment variable when building, but I can't
+find the equivalent in the new build. What should I do?
+**A:** It might very well be that we have neglected to add support for an
+option that was actually used from outside the build system. Email us and we
+will add support for it!
+
+
+### Build Performance Tips
+
+Building OpenJDK requires a lot of horsepower. Some of the build tools can be
+adjusted to utilize more or less of resources such as parallel threads and
+memory. The `configure` script analyzes your system and selects reasonable
+values for such options based on your hardware. If you encounter resource
+problems, such as out of memory conditions, you can modify the detected values
+with:
+
+ * **`--with-num-cores`** -- number of cores in the build system, e.g.
+ `--with-num-cores=8`
+ * **`--with-memory-size`** -- memory (in MB) available in the build system,
+ e.g. `--with-memory-size=1024`
+
+It might also be necessary to specify the JVM arguments passed to the Bootstrap
+JDK, using e.g. `--with-boot-jdk-jvmargs="-Xmx8G -enableassertions"`. Doing
+this will override the default JVM arguments passed to the Bootstrap JDK.
+
+One of the top goals of the new build system is to improve the build
+performance and decrease the time needed to build. This will soon also apply to
+the java compilation when the Smart Javac wrapper is fully supported.
+
+At the end of a successful execution of `configure`, you will get a performance
+summary, indicating how well the build will perform. Here you will also get
+performance hints. If you want to build fast, pay attention to those!
+
+#### Building with ccache
+
+The OpenJDK build supports building with ccache when using gcc or clang. Using
+ccache can radically speed up compilation of native code if you often rebuild
+the same sources. Your milage may vary however so we recommend evaluating it
+for yourself. To enable it, make sure it's on the path and configure with
+`--enable-ccache`.
+
+#### Building on local disk
+
+If you are using network shares, e.g. via NFS, for your source code, make sure
+the build directory is situated on local disk. The performance penalty is
+extremely high for building on a network share, close to unusable.
+
+#### Building only one JVM
+
+The old build builds multiple JVMs on 32-bit systems (client and server; and on
+Windows kernel as well). In the new build we have changed this default to only
+build server when it's available. This improves build times for those not
+interested in multiple JVMs. To mimic the old behavior on platforms that
+support it, use `--with-jvm-variants=client,server`.
+
+#### Selecting the number of cores to build on
+
+By default, `configure` will analyze your machine and run the make process in
+parallel with as many threads as you have cores. This behavior can be
+overridden, either "permanently" (on a `configure` basis) using
+`--with-num-cores=N` or for a single build only (on a make basis), using
+`make JOBS=N`.
+
+If you want to make a slower build just this time, to save some CPU power for
+other processes, you can run e.g. `make JOBS=2`. This will force the makefiles
+to only run 2 parallel processes, or even `make JOBS=1` which will disable
+parallelism.
+
+If you want to have it the other way round, namely having slow builds default
+and override with fast if you're impatient, you should call `configure` with
+`--with-num-cores=2`, making 2 the default. If you want to run with more cores,
+run `make JOBS=8`
+
+
+### Troubleshooting
+
+#### Solving build problems
+
+If the build fails (and it's not due to a compilation error in a source file
+you've changed), the first thing you should do is to re-run the build with more
+verbosity. Do this by adding `LOG=debug` to your make command line.
+
+The build log (with both stdout and stderr intermingled, basically the same as
+you see on your console) can be found as `build.log` in your build directory.
+
+You can ask for help on build problems with the new build system on either the
+[build-dev](http://mail.openjdk.java.net/mailman/listinfo/build-dev) or the
+[build-infra-dev](http://mail.openjdk.java.net/mailman/listinfo/build-infra-dev)
+mailing lists. Please include the relevant parts of the build log.
+
+A build can fail for any number of reasons. Most failures are a result of
+trying to build in an environment in which all the pre-build requirements have
+not been met. The first step in troubleshooting a build failure is to recheck
+that you have satisfied all the pre-build requirements for your platform.
+Scanning the `configure` log is a good first step, making sure that what it
+found makes sense for your system. Look for strange error messages or any
+difficulties that `configure` had in finding things.
+
+Some of the more common problems with builds are briefly described below, with
+suggestions for remedies.
+
+ * **Corrupted Bundles on Windows:**
+ Some virus scanning software has been known to corrupt the downloading of
+ zip bundles. It may be necessary to disable the 'on access' or 'real time'
+ virus scanning features to prevent this corruption. This type of 'real time'
+ virus scanning can also slow down the build process significantly.
+ Temporarily disabling the feature, or excluding the build output directory
+ may be necessary to get correct and faster builds.
+
+ * **Slow Builds:**
+ If your build machine seems to be overloaded from too many simultaneous C++
+ compiles, try setting the `JOBS=1` on the `make` command line. Then try
+ increasing the count slowly to an acceptable level for your system. Also:
+
+ Creating the javadocs can be very slow, if you are running javadoc, consider
+ skipping that step.
+
+ Faster CPUs, more RAM, and a faster DISK usually helps. The VM build tends
+ to be CPU intensive (many C++ compiles), and the rest of the JDK will often
+ be disk intensive.
+
+ Faster compiles are possible using a tool called
+ [ccache](http://ccache.samba.org/).
+
+ * **File time issues:**
+ If you see warnings that refer to file time stamps, e.g.
+
+ > _Warning message:_ ` File 'xxx' has modification time in the future.`
+ > _Warning message:_ ` Clock skew detected. Your build may be incomplete.`
+
+ These warnings can occur when the clock on the build machine is out of sync
+ with the timestamps on the source files. Other errors, apparently unrelated
+ but in fact caused by the clock skew, can occur along with the clock skew
+ warnings. These secondary errors may tend to obscure the fact that the true
+ root cause of the problem is an out-of-sync clock.
+
+ If you see these warnings, reset the clock on the build machine, run
+ "`gmake clobber`" or delete the directory containing the build output, and
+ restart the build from the beginning.
+
+ * **Error message: `Trouble writing out table to disk`**
+ Increase the amount of swap space on your build machine. This could be
+ caused by overloading the system and it may be necessary to use:
+
+ > `make JOBS=1`
+
+ to reduce the load on the system.
+
+ * **Error Message: `libstdc++ not found`:**
+ This is caused by a missing libstdc++.a library. This is installed as part
+ of a specific package (e.g. libstdc++.so.devel.386). By default some 64-bit
+ Linux versions (e.g. Fedora) only install the 64-bit version of the
+ libstdc++ package. Various parts of the JDK build require a static link of
+ the C++ runtime libraries to allow for maximum portability of the built
+ images.
+
+ * **Linux Error Message: `cannot restore segment prot after reloc`**
+ This is probably an issue with SELinux (See [SELinux on
+ Wikipedia](http://en.wikipedia.org/wiki/SELinux)). Parts of the VM is built
+ without the `-fPIC` for performance reasons.
+
+ To completely disable SELinux:
+
+ 1. `$ su root`
+ 2. `# system-config-securitylevel`
+ 3. `In the window that appears, select the SELinux tab`
+ 4. `Disable SELinux`
+
+ Alternatively, instead of completely disabling it you could disable just
+ this one check.
+
+ 1. Select System->Administration->SELinux Management
+ 2. In the SELinux Management Tool which appears, select "Boolean" from the
+ menu on the left
+ 3. Expand the "Memory Protection" group
+ 4. Check the first item, labeled "Allow all unconfined executables to use
+ libraries requiring text relocation ..."
+
+ * **Windows Error Messages:**
+ `*** fatal error - couldn't allocate heap, ... `
+ `rm fails with "Directory not empty"`
+ `unzip fails with "cannot create ... Permission denied"`
+ `unzip fails with "cannot create ... Error 50"`
+
+ The CYGWIN software can conflict with other non-CYGWIN software. See the
+ CYGWIN FAQ section on [BLODA (applications that interfere with
+ CYGWIN)](http://cygwin.com/faq/faq.using.html#faq.using.bloda).
+
+ * **Windows Error Message: `spawn failed`**
+ Try rebooting the system, or there could be some kind of issue with the disk
+ or disk partition being used. Sometimes it comes with a "Permission Denied"
+ message.
+
+*****
+
+
+## Appendix B: GNU make
+
+The Makefiles in the OpenJDK are only valid when used with the GNU version of
+the utility command `make` (usually called `gmake` on Solaris). A few notes
+about using GNU make:
+
+ * You need GNU make version 3.81 or newer. On Windows 4.0 or newer is
+ recommended. If the GNU make utility on your systems is not of a suitable
+ version, see "[Building GNU make](#buildgmake)".
+ * Place the location of the GNU make binary in the `PATH`.
+ * **Solaris:** Do NOT use `/usr/bin/make` on Solaris. If your Solaris system
+ has the software from the Solaris Developer Companion CD installed, you
+ should try and use `gmake` which will be located in either the `/usr/bin`,
+ `/opt/sfw/bin` or `/usr/sfw/bin` directory.
+ * **Windows:** Make sure you start your build inside a bash shell.
+ * **Mac OS X:** The XCode "command line tools" must be installed on your Mac.
+
+Information on GNU make, and access to ftp download sites, are available on the
+[GNU make web site ](http://www.gnu.org/software/make/make.html). The latest
+source to GNU make is available at
+[ftp.gnu.org/pub/gnu/make/](http://ftp.gnu.org/pub/gnu/make/).
+
+
+### Building GNU make
+
+First step is to get the GNU make 3.81 or newer source from
+[ftp.gnu.org/pub/gnu/make/](http://ftp.gnu.org/pub/gnu/make/). Building is a
+little different depending on the OS but is basically done with:
+
+ bash ./configure
+ make
+
+*****
+
+
+## Appendix C: Build Environments
+
+### Minimum Build Environments
+
+This file often describes specific requirements for what we call the "minimum
+build environments" (MBE) for this specific release of the JDK. What is listed
+below is what the Oracle Release Engineering Team will use to build the Oracle
+JDK product. Building with the MBE will hopefully generate the most compatible
+bits that install on, and run correctly on, the most variations of the same
+base OS and hardware architecture. In some cases, these represent what is often
+called the least common denominator, but each Operating System has different
+aspects to it.
+
+In all cases, the Bootstrap JDK version minimum is critical, we cannot
+guarantee builds will work with older Bootstrap JDK's. Also in all cases, more
+RAM and more processors is better, the minimums listed below are simply
+recommendations.
+
+With Solaris and Mac OS X, the version listed below is the oldest release we
+can guarantee builds and works, and the specific version of the compilers used
+could be critical.
+
+With Windows the critical aspect is the Visual Studio compiler used, which due
+to it's runtime, generally dictates what Windows systems can do the builds and
+where the resulting bits can be used.
+
+**NOTE: We expect a change here off these older Windows OS releases and to a
+'less older' one, probably Windows 2008R2 X64.**
+
+With Linux, it was just a matter of picking a stable distribution that is a
+good representative for Linux in general.
+
+**NOTE: We expect a change here from Fedora 9 to something else, but it has not
+been completely determined yet, possibly Ubuntu 12.04 X64, unbiased community
+feedback would be welcome on what a good choice would be here.**
+
+It is understood that most developers will NOT be using these specific
+versions, and in fact creating these specific versions may be difficult due to
+the age of some of this software. It is expected that developers are more often
+using the more recent releases and distributions of these operating systems.
+
+Compilation problems with newer or different C/C++ compilers is a common
+problem. Similarly, compilation problems related to changes to the
+`/usr/include` or system header files is also a common problem with older,
+newer, or unreleased OS versions. Please report these types of problems as bugs
+so that they can be dealt with accordingly.
+
+>
+
+
+
Base OS and Architecture
+
OS
+
C/C++ Compiler
+
Bootstrap JDK
+
Processors
+
RAM Minimum
+
DISK Needs
+
+
+
+
+
Linux X86 (32-bit) and X64 (64-bit)
+
Oracle Enterprise Linux 6.4
+
gcc 4.8.2
+
JDK 8
+
2 or more
+
1 GB
+
6 GB
+
+
+
Solaris SPARCV9 (64-bit)
+
Solaris 10 Update 10
+
Studio 12 Update 3 + patches
+
JDK 8
+
4 or more
+
4 GB
+
8 GB
+
+
+
Solaris X64 (64-bit)
+
Solaris 10 Update 10
+
Studio 12 Update 3 + patches
+
JDK 8
+
4 or more
+
4 GB
+
8 GB
+
+
+
Windows X86 (32-bit)
+
Windows Server 2012 R2 x64
+
Microsoft Visual Studio C++ 2013 Professional Edition
+
JDK 8
+
2 or more
+
2 GB
+
6 GB
+
+
+
Windows X64 (64-bit)
+
Windows Server 2012 R2 x64
+
Microsoft Visual Studio C++ 2013 Professional Edition
+
JDK 8
+
2 or more
+
2 GB
+
6 GB
+
+
+
Mac OS X X64 (64-bit)
+
Mac OS X 10.9 "Mavericks"
+
XCode 5.1.1 or newer
+
JDK 8
+
2 or more
+
4 GB
+
6 GB
+
+
+
+
+*****
+
+
+### Specific Developer Build Environments
+
+We won't be listing all the possible environments, but we will try to provide
+what information we have available to us.
+
+**NOTE: The community can help out by updating this part of the document.**
+
+#### Fedora
+
+After installing the latest [Fedora](http://fedoraproject.org) you need to
+install several build dependencies. The simplest way to do it is to execute the
+following commands as user `root`:
+
+ yum-builddep java-1.7.0-openjdk
+ yum install gcc gcc-c++
+
+In addition, it's necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/usr/lib/jvm/java-openjdk/bin:${PATH}"
+
+#### CentOS 5.5
+
+After installing [CentOS 5.5](http://www.centos.org/) you need to make sure you
+have the following Development bundles installed:
+
+ * Development Libraries
+ * Development Tools
+ * Java Development
+ * X Software Development (Including XFree86-devel)
+
+Plus the following packages:
+
+ * cups devel: Cups Development Package
+ * alsa devel: Alsa Development Package
+ * Xi devel: libXi.so Development Package
+
+The freetype 2.3 packages don't seem to be available, but the freetype 2.3
+sources can be downloaded, built, and installed easily enough from [the
+freetype site](http://downloads.sourceforge.net/freetype). Build and install
+with something like:
+
+ bash ./configure
+ make
+ sudo -u root make install
+
+Mercurial packages could not be found easily, but a Google search should find
+ones, and they usually include Python if it's needed.
+
+#### Debian 5.0 (Lenny)
+
+After installing [Debian](http://debian.org) 5 you need to install several
+build dependencies. The simplest way to install the build dependencies is to
+execute the following commands as user `root`:
+
+ aptitude build-dep openjdk-7
+ aptitude install openjdk-7-jdk libmotif-dev
+
+In addition, it's necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/usr/lib/jvm/java-7-openjdk/bin:${PATH}"
+
+#### Ubuntu 12.04
+
+After installing [Ubuntu](http://ubuntu.org) 12.04 you need to install several
+build dependencies. The simplest way to do it is to execute the following
+commands:
+
+ sudo aptitude build-dep openjdk-7
+ sudo aptitude install openjdk-7-jdk
+
+In addition, it's necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/usr/lib/jvm/java-7-openjdk/bin:${PATH}"
+
+#### OpenSUSE 11.1
+
+After installing [OpenSUSE](http://opensuse.org) 11.1 you need to install
+several build dependencies. The simplest way to install the build dependencies
+is to execute the following commands:
+
+ sudo zypper source-install -d java-1_7_0-openjdk
+ sudo zypper install make
+
+In addition, it is necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/usr/lib/jvm/java-1.7.0-openjdk/bin:$[PATH}"
+
+Finally, you need to unset the `JAVA_HOME` environment variable:
+
+ export -n JAVA_HOME`
+
+#### Mandriva Linux One 2009 Spring
+
+After installing [Mandriva](http://mandriva.org) Linux One 2009 Spring you need
+to install several build dependencies. The simplest way to install the build
+dependencies is to execute the following commands as user `root`:
+
+ urpmi java-1.7.0-openjdk-devel make gcc gcc-c++ freetype-devel zip unzip
+ libcups2-devel libxrender1-devel libalsa2-devel libstc++-static-devel
+ libxtst6-devel libxi-devel
+
+In addition, it is necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/usr/lib/jvm/java-1.7.0-openjdk/bin:${PATH}"
+
+#### OpenSolaris 2009.06
+
+After installing [OpenSolaris](http://opensolaris.org) 2009.06 you need to
+install several build dependencies. The simplest way to install the build
+dependencies is to execute the following commands:
+
+ pfexec pkg install SUNWgmake SUNWj7dev sunstudioexpress SUNWcups SUNWzip
+ SUNWunzip SUNWxwhl SUNWxorg-headers SUNWaudh SUNWfreetype2
+
+In addition, it is necessary to set a few environment variables for the build:
+
+ export LANG=C
+ export PATH="/opt/SunStudioExpress/bin:${PATH}"
+
+*****
+
+End of the OpenJDK build README document.
+
+Please come again!
diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4
index a5d5797f584..fa15ac3bf9f 100644
--- a/common/autoconf/basics.m4
+++ b/common/autoconf/basics.m4
@@ -410,6 +410,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
BASIC_REQUIRE_PROGS(NAWK, [nawk gawk awk])
BASIC_REQUIRE_PROGS(PRINTF, printf)
BASIC_REQUIRE_PROGS(RM, rm)
+ BASIC_REQUIRE_PROGS(RMDIR, rmdir)
BASIC_REQUIRE_PROGS(SH, sh)
BASIC_REQUIRE_PROGS(SORT, sort)
BASIC_REQUIRE_PROGS(TAIL, tail)
diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4
index 35f5d63d39b..524103eb013 100644
--- a/common/autoconf/boot-jdk.m4
+++ b/common/autoconf/boot-jdk.m4
@@ -305,6 +305,16 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK],
BOOT_JDK_SOURCETARGET="-source 8 -target 8"
AC_SUBST(BOOT_JDK_SOURCETARGET)
AC_SUBST(JAVAC_FLAGS)
+
+ # Check if the boot jdk is 32 or 64 bit
+ if "$JAVA" -d64 -version > /dev/null 2>&1; then
+ BOOT_JDK_BITS="64"
+ else
+ BOOT_JDK_BITS="32"
+ fi
+ AC_MSG_CHECKING([if Boot JDK is 32 or 64 bits])
+ AC_MSG_RESULT([$BOOT_JDK_BITS])
+ AC_SUBST(BOOT_JDK_BITS)
])
AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
@@ -341,7 +351,7 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
# Maximum amount of heap memory.
# Maximum stack size.
JVM_MAX_HEAP=`expr $MEMORY_SIZE / 2`
- if test "x$BUILD_NUM_BITS" = x32; then
+ if test "x$BOOT_JDK_BITS" = "x32"; then
if test "$JVM_MAX_HEAP" -gt "1100"; then
JVM_MAX_HEAP=1100
elif test "$JVM_MAX_HEAP" -lt "512"; then
@@ -349,10 +359,7 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
fi
STACK_SIZE=768
else
- # Running Javac on a JVM on a 64-bit machine, takes more space since 64-bit
- # pointers are used. Apparently, we need to increase the heap and stack
- # space for the jvm. More specifically, when running javac to build huge
- # jdk batch
+ # Running a 64 bit JVM allows for and requires a bigger heap
if test "$JVM_MAX_HEAP" -gt "1600"; then
JVM_MAX_HEAP=1600
elif test "$JVM_MAX_HEAP" -lt "512"; then
diff --git a/common/autoconf/build-performance.m4 b/common/autoconf/build-performance.m4
index b5911b789a7..e2fa4f566cf 100644
--- a/common/autoconf/build-performance.m4
+++ b/common/autoconf/build-performance.m4
@@ -328,12 +328,23 @@ AC_DEFUN_ONCE([BPERF_SETUP_SMART_JAVAC],
AC_ARG_ENABLE([sjavac], [AS_HELP_STRING([--enable-sjavac],
[use sjavac to do fast incremental compiles @<:@disabled@:>@])],
- [ENABLE_SJAVAC="${enableval}"], [ENABLE_SJAVAC='no'])
+ [ENABLE_SJAVAC="${enableval}"], [ENABLE_SJAVAC="no"])
if test "x$JVM_ARG_OK" = "xfalse"; then
AC_MSG_WARN([Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling sjavac])
- ENABLE_SJAVAC=no;
+ ENABLE_SJAVAC="no"
fi
AC_MSG_CHECKING([whether to use sjavac])
AC_MSG_RESULT([$ENABLE_SJAVAC])
AC_SUBST(ENABLE_SJAVAC)
+
+ AC_ARG_ENABLE([javac-server], [AS_HELP_STRING([--enable-javac-server],
+ [use only the server part of sjavac for faster javac compiles @<:@disabled@:>@])],
+ [ENABLE_JAVAC_SERVER="${enableval}"], [ENABLE_JAVAC_SERVER="no"])
+ if test "x$JVM_ARG_OK" = "xfalse"; then
+ AC_MSG_WARN([Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling javac server])
+ ENABLE_JAVAC_SERVER="no"
+ fi
+ AC_MSG_CHECKING([whether to use javac server])
+ AC_MSG_RESULT([$ENABLE_JAVAC_SERVER])
+ AC_SUBST(ENABLE_JAVAC_SERVER)
])
diff --git a/common/autoconf/compare.sh.in b/common/autoconf/compare.sh.in
index 3e426776535..b7bf2b4cecb 100644
--- a/common/autoconf/compare.sh.in
+++ b/common/autoconf/compare.sh.in
@@ -66,7 +66,7 @@ export STRIP="@STRIP@ @STRIPFLAGS@"
export TEE="@TEE@"
export UNIQ="@UNIQ@"
export UNPACK200="@FIXPATH@ @BOOT_JDK@/bin/unpack200"
-export UNZIP="@UNZIP@"
+export UNARCHIVE="@UNZIP@ -q"
export SRC_ROOT="@TOPDIR@"
export OUTPUT_ROOT="@OUTPUT_ROOT@"
diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh
index b8b6177d86d..47d1b441dff 100644
--- a/common/autoconf/generated-configure.sh
+++ b/common/autoconf/generated-configure.sh
@@ -632,6 +632,7 @@ LIBOBJS
CFLAGS_CCACHE
CCACHE
USE_PRECOMPILED_HEADER
+ENABLE_JAVAC_SERVER
ENABLE_SJAVAC
SJAVAC_SERVER_JAVA_FLAGS
SJAVAC_SERVER_JAVA
@@ -815,6 +816,7 @@ JAXWS_TOPDIR
JAXP_TOPDIR
CORBA_TOPDIR
LANGTOOLS_TOPDIR
+BOOT_JDK_BITS
JAVAC_FLAGS
BOOT_JDK_SOURCETARGET
JARSIGNER
@@ -968,6 +970,7 @@ TAR
TAIL
SORT
SH
+RMDIR
RM
PRINTF
NAWK
@@ -1115,6 +1118,7 @@ with_jobs
with_boot_jdk_jvmargs
with_sjavac_server_java
enable_sjavac
+enable_javac_server
enable_precompiled_headers
enable_ccache
with_ccache_dir
@@ -1146,6 +1150,7 @@ MV
NAWK
PRINTF
RM
+RMDIR
SH
SORT
TAIL
@@ -1864,6 +1869,8 @@ Optional Features:
--with-freetype, disabled otherwise]
--enable-sjavac use sjavac to do fast incremental compiles
[disabled]
+ --enable-javac-server use only the server part of sjavac for faster javac
+ compiles [disabled]
--disable-precompiled-headers
disable using precompiled headers when compiling C++
[enabled]
@@ -2025,6 +2032,7 @@ Some influential environment variables:
NAWK Override default value for NAWK
PRINTF Override default value for PRINTF
RM Override default value for RM
+ RMDIR Override default value for RMDIR
SH Override default value for SH
SORT Override default value for SORT
TAIL Override default value for TAIL
@@ -4587,7 +4595,7 @@ VS_SDK_PLATFORM_NAME_2013=
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1444224363
+DATE_WHEN_GENERATED=1445964676
###############################################################################
#
@@ -9511,6 +9519,209 @@ $as_echo "$tool_specified" >&6; }
+ # Publish this variable in the help.
+
+
+ if [ -z "${RMDIR+x}" ]; then
+ # The variable is not set by user, try to locate tool using the code snippet
+ for ac_prog in rmdir
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RMDIR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $RMDIR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RMDIR="$RMDIR" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_RMDIR="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+RMDIR=$ac_cv_path_RMDIR
+if test -n "$RMDIR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDIR" >&5
+$as_echo "$RMDIR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$RMDIR" && break
+done
+
+ else
+ # The variable is set, but is it from the command line or the environment?
+
+ # Try to remove the string !RMDIR! from our list.
+ try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!RMDIR!/}
+ if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
+ # If it failed, the variable was not from the command line. Ignore it,
+ # but warn the user (except for BASH, which is always set by the calling BASH).
+ if test "xRMDIR" != xBASH; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of RMDIR from the environment. Use command line variables instead." >&5
+$as_echo "$as_me: WARNING: Ignoring value of RMDIR from the environment. Use command line variables instead." >&2;}
+ fi
+ # Try to locate tool using the code snippet
+ for ac_prog in rmdir
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RMDIR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $RMDIR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RMDIR="$RMDIR" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_RMDIR="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+RMDIR=$ac_cv_path_RMDIR
+if test -n "$RMDIR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDIR" >&5
+$as_echo "$RMDIR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$RMDIR" && break
+done
+
+ else
+ # If it succeeded, then it was overridden by the user. We will use it
+ # for the tool.
+
+ # First remove it from the list of overridden variables, so we can test
+ # for unknown variables in the end.
+ CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
+
+ # Check if we try to supply an empty value
+ if test "x$RMDIR" = x; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool RMDIR= (no value)" >&5
+$as_echo "$as_me: Setting user supplied tool RMDIR= (no value)" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RMDIR" >&5
+$as_echo_n "checking for RMDIR... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
+$as_echo "disabled" >&6; }
+ else
+ # Check if the provided tool contains a complete path.
+ tool_specified="$RMDIR"
+ tool_basename="${tool_specified##*/}"
+ if test "x$tool_basename" = "x$tool_specified"; then
+ # A command without a complete path is provided, search $PATH.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool RMDIR=$tool_basename" >&5
+$as_echo "$as_me: Will search for user supplied tool RMDIR=$tool_basename" >&6;}
+ # Extract the first word of "$tool_basename", so it can be a program name with args.
+set dummy $tool_basename; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_RMDIR+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $RMDIR in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RMDIR="$RMDIR" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_RMDIR="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+RMDIR=$ac_cv_path_RMDIR
+if test -n "$RMDIR"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDIR" >&5
+$as_echo "$RMDIR" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$RMDIR" = x; then
+ as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
+ fi
+ else
+ # Otherwise we believe it is a complete path. Use it as it is.
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool RMDIR=$tool_specified" >&5
+$as_echo "$as_me: Will use user supplied tool RMDIR=$tool_specified" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for RMDIR" >&5
+$as_echo_n "checking for RMDIR... " >&6; }
+ if test ! -x "$tool_specified"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ as_fn_error $? "User supplied tool RMDIR=$tool_specified does not exist or is not executable" "$LINENO" 5
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
+$as_echo "$tool_specified" >&6; }
+ fi
+ fi
+ fi
+ fi
+
+
+
+ if test "x$RMDIR" = x; then
+ as_fn_error $? "Could not find required tool for RMDIR" "$LINENO" 5
+ fi
+
+
+
+
+
# Publish this variable in the help.
@@ -26920,6 +27131,18 @@ $as_echo "$tool_specified" >&6; }
+ # Check if the boot jdk is 32 or 64 bit
+ if "$JAVA" -d64 -version > /dev/null 2>&1; then
+ BOOT_JDK_BITS="64"
+ else
+ BOOT_JDK_BITS="32"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Boot JDK is 32 or 64 bits" >&5
+$as_echo_n "checking if Boot JDK is 32 or 64 bits... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_BITS" >&5
+$as_echo "$BOOT_JDK_BITS" >&6; }
+
+
###############################################################################
#
@@ -46678,10 +46901,24 @@ $as_echo "$as_me: WARNING: X11 is not used, so --with-x is ignored" >&2;}
X_CFLAGS=
X_LIBS=
else
- # Check if the user has specified sysroot, but not --x-includes or --x-libraries.
- # Make a simple check for the libraries at the sysroot, and setup --x-includes and
- # --x-libraries for the sysroot, if that seems to be correct.
- if test "x$OPENJDK_TARGET_OS" = "xlinux"; then
+
+ if test "x${with_x}" = xno; then
+ as_fn_error $? "It is not possible to disable the use of X11. Remove the --without-x option." "$LINENO" 5
+ fi
+
+ if test "x${with_x}" != x && test "x${with_x}" != xyes; then
+ # The user has specified a X11 base directory. Use it for includes and
+ # libraries, unless explicitely overridden.
+ if test "x$x_includes" = xNONE; then
+ x_includes="${with_x}/include"
+ fi
+ if test "x$x_libraries" = xNONE; then
+ x_libraries="${with_x}/lib"
+ fi
+ else
+ # Check if the user has specified sysroot, but not --with-x, --x-includes or --x-libraries.
+ # Make a simple check for the libraries at the sysroot, and setup --x-includes and
+ # --x-libraries for the sysroot, if that seems to be correct.
if test "x$SYSROOT" != "x"; then
if test "x$x_includes" = xNONE; then
if test -f "$SYSROOT/usr/X11R6/include/X11/Xlib.h"; then
@@ -53085,7 +53322,7 @@ $as_echo_n "checking flags for boot jdk java command for big workloads... " >&6;
# Maximum amount of heap memory.
# Maximum stack size.
JVM_MAX_HEAP=`expr $MEMORY_SIZE / 2`
- if test "x$BUILD_NUM_BITS" = x32; then
+ if test "x$BOOT_JDK_BITS" = "x32"; then
if test "$JVM_MAX_HEAP" -gt "1100"; then
JVM_MAX_HEAP=1100
elif test "$JVM_MAX_HEAP" -lt "512"; then
@@ -53093,10 +53330,7 @@ $as_echo_n "checking flags for boot jdk java command for big workloads... " >&6;
fi
STACK_SIZE=768
else
- # Running Javac on a JVM on a 64-bit machine, takes more space since 64-bit
- # pointers are used. Apparently, we need to increase the heap and stack
- # space for the jvm. More specifically, when running javac to build huge
- # jdk batch
+ # Running a 64 bit JVM allows for and requires a bigger heap
if test "$JVM_MAX_HEAP" -gt "1600"; then
JVM_MAX_HEAP=1600
elif test "$JVM_MAX_HEAP" -lt "512"; then
@@ -53285,13 +53519,13 @@ fi
if test "${enable_sjavac+set}" = set; then :
enableval=$enable_sjavac; ENABLE_SJAVAC="${enableval}"
else
- ENABLE_SJAVAC='no'
+ ENABLE_SJAVAC="no"
fi
if test "x$JVM_ARG_OK" = "xfalse"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling sjavac" >&5
$as_echo "$as_me: WARNING: Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling sjavac" >&2;}
- ENABLE_SJAVAC=no;
+ ENABLE_SJAVAC="no"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use sjavac" >&5
$as_echo_n "checking whether to use sjavac... " >&6; }
@@ -53299,6 +53533,24 @@ $as_echo_n "checking whether to use sjavac... " >&6; }
$as_echo "$ENABLE_SJAVAC" >&6; }
+ # Check whether --enable-javac-server was given.
+if test "${enable_javac_server+set}" = set; then :
+ enableval=$enable_javac_server; ENABLE_JAVAC_SERVER="${enableval}"
+else
+ ENABLE_JAVAC_SERVER="no"
+fi
+
+ if test "x$JVM_ARG_OK" = "xfalse"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling javac server" >&5
+$as_echo "$as_me: WARNING: Could not set -Xms${MS_VALUE}M -Xmx${MX_VALUE}M, disabling javac server" >&2;}
+ ENABLE_JAVAC_SERVER="no"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use javac server" >&5
+$as_echo_n "checking whether to use javac server... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ENABLE_JAVAC_SERVER" >&5
+$as_echo "$ENABLE_JAVAC_SERVER" >&6; }
+
+
# Can the C/C++ compiler use precompiled headers?
diff --git a/common/autoconf/lib-x11.m4 b/common/autoconf/lib-x11.m4
index b5671af2ff4..1fbc583db9f 100644
--- a/common/autoconf/lib-x11.m4
+++ b/common/autoconf/lib-x11.m4
@@ -35,10 +35,24 @@ AC_DEFUN_ONCE([LIB_SETUP_X11],
X_CFLAGS=
X_LIBS=
else
- # Check if the user has specified sysroot, but not --x-includes or --x-libraries.
- # Make a simple check for the libraries at the sysroot, and setup --x-includes and
- # --x-libraries for the sysroot, if that seems to be correct.
- if test "x$OPENJDK_TARGET_OS" = "xlinux"; then
+
+ if test "x${with_x}" = xno; then
+ AC_MSG_ERROR([It is not possible to disable the use of X11. Remove the --without-x option.])
+ fi
+
+ if test "x${with_x}" != x && test "x${with_x}" != xyes; then
+ # The user has specified a X11 base directory. Use it for includes and
+ # libraries, unless explicitely overridden.
+ if test "x$x_includes" = xNONE; then
+ x_includes="${with_x}/include"
+ fi
+ if test "x$x_libraries" = xNONE; then
+ x_libraries="${with_x}/lib"
+ fi
+ else
+ # Check if the user has specified sysroot, but not --with-x, --x-includes or --x-libraries.
+ # Make a simple check for the libraries at the sysroot, and setup --x-includes and
+ # --x-libraries for the sysroot, if that seems to be correct.
if test "x$SYSROOT" != "x"; then
if test "x$x_includes" = xNONE; then
if test -f "$SYSROOT/usr/X11R6/include/X11/Xlib.h"; then
diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in
index 4b6983a54a3..8731756c772 100644
--- a/common/autoconf/spec.gmk.in
+++ b/common/autoconf/spec.gmk.in
@@ -245,6 +245,7 @@ MEMORY_SIZE:=@MEMORY_SIZE@
# Enable sjavac support = use a javac server,
# multi core javac compilation and dependency tracking.
ENABLE_SJAVAC:=@ENABLE_SJAVAC@
+ENABLE_JAVAC_SERVER:=@ENABLE_JAVAC_SERVER@
# Store sjavac server synchronization files here, and
# the sjavac server log files.
SJAVAC_SERVER_DIR=$(MAKESUPPORT_OUTPUTDIR)/javacservers
@@ -504,6 +505,7 @@ PATCH:=@PATCH@
PRINTF:=@PRINTF@
PWD:=@THEPWDCMD@
RM:=@RM@
+RMDIR:=@RMDIR@
SED:=@SED@
SH:=@SH@
SORT:=@SORT@
diff --git a/common/bin/compare.sh b/common/bin/compare.sh
index 77d51c41df0..7952b2b6abb 100644
--- a/common/bin/compare.sh
+++ b/common/bin/compare.sh
@@ -51,8 +51,6 @@ else
STAT_PRINT_SIZE="-c %s"
fi
-UNARCHIVE="$UNZIP -q"
-
COMPARE_EXCEPTIONS_INCLUDE="$SRC_ROOT/common/bin/compare_exceptions.sh.incl"
if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
diff --git a/common/bin/update-build-readme.sh b/common/bin/update-build-readme.sh
new file mode 100644
index 00000000000..9d1968a4c60
--- /dev/null
+++ b/common/bin/update-build-readme.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+
+# Get an absolute path to this script, since that determines the top-level
+# directory.
+this_script_dir=`dirname $0`
+TOPDIR=`cd $this_script_dir/../.. > /dev/null && pwd`
+
+GREP=grep
+MD_FILE=$TOPDIR/README-builds.md
+HTML_FILE=$TOPDIR/README-builds.html
+
+# Locate the markdown processor tool and check that it is the correct version.
+locate_markdown_processor() {
+ if [ -z "$MARKDOWN" ]; then
+ MARKDOWN=`which markdown 2> /dev/null`
+ if [ -z "$MARKDOWN" ]; then
+ echo "Error: Cannot locate markdown processor" 1>&2
+ exit 1
+ fi
+ fi
+
+ # Test version
+ MARKDOWN_VERSION=`$MARKDOWN -version | $GREP version`
+ if [ "x$MARKDOWN_VERSION" != "xThis is Markdown, version 1.0.1." ]; then
+ echo "Error: Expected markdown version 1.0.1." 1>&2
+ echo "Actual version found: $MARKDOWN_VERSION" 1>&2
+ echo "Download markdown here: https://daringfireball.net/projects/markdown/" 1>&2
+ exit 1
+ fi
+
+}
+
+# Verify that the source markdown file looks sound.
+verify_source_code() {
+ TOO_LONG_LINES=`$GREP -E -e '^.{80}.+$' $MD_FILE`
+ if [ "x$TOO_LONG_LINES" != x ]; then
+ echo "Warning: The following lines are longer than 80 characters:"
+ $GREP -E -e '^.{80}.+$' $MD_FILE
+ fi
+}
+
+# Convert the markdown file to html format.
+process_source() {
+ echo "Generating html file from markdown"
+ cat > $HTML_FILE << END
+
+
+ OpenJDK Build README
+
+
+END
+ markdown $MD_FILE >> $HTML_FILE
+ cat >> $HTML_FILE <
+
+END
+ echo "Done"
+}
+
+locate_markdown_processor
+verify_source_code
+process_source
diff --git a/corba/.hgtags b/corba/.hgtags
index 492bb735842..18dffcd5e71 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -329,3 +329,5 @@ ca8a1719588424f6e04e943790c7fcb7cb0b8c8f jdk9-b83
df70bb200356fec686681f0295c50cc3ed43c3b3 jdk9-b84
3ec06af1368924469f7ce60a00324bac55eaeecc jdk9-b85
0a3f0d25c201b40575a7c3920fce4d6f4d3ae310 jdk9-b86
+a5c40ac9b916ff44d512ee764fa919ed2097e149 jdk9-b87
+00f48ecbc09915f793d9e5ad74ab0b25f2549bf5 jdk9-b88
diff --git a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java
index 0c3ff08a7ad..c9d6320f65a 100644
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java
@@ -567,6 +567,11 @@ public class IIOPInputStream
// XXX I18N, logging needed.
throw new NotActiveException("defaultReadObjectDelegate");
+ if (!currentClassDesc.forClass().isAssignableFrom(
+ currentObject.getClass())) {
+ throw new IOException("Object Type mismatch");
+ }
+
// The array will be null unless fields were retrieved
// remotely because of a serializable version difference.
// Bug fix for 4365188. See the definition of
@@ -1063,6 +1068,9 @@ public class IIOPInputStream
int spBase = spClass; // current top of stack
+ if (currentClass.getName().equals("java.lang.String")) {
+ return this.readUTF();
+ }
/* The object's classes should be processed from supertype to subtype
* Push all the clases of the current object onto a stack.
* Note that only the serializable classes are represented
@@ -2257,6 +2265,27 @@ public class IIOPInputStream
try {
Class fieldCl = fields[i].getClazz();
+ if ((objectValue != null)
+ && (!fieldCl.isAssignableFrom(
+ objectValue.getClass()))) {
+ throw new IllegalArgumentException("Field mismatch");
+ }
+ Field classField = null;
+ try {
+ classField = cl.getDeclaredField(fields[i].getName());
+ } catch (NoSuchFieldException nsfEx) {
+ throw new IllegalArgumentException(nsfEx);
+ } catch (SecurityException secEx) {
+ throw new IllegalArgumentException(secEx.getCause());
+ }
+ Class> declaredFieldClass = classField.getType();
+
+ // check input field type is a declared field type
+ // input field is a subclass of the declared field
+ if (!declaredFieldClass.isAssignableFrom(fieldCl)) {
+ throw new IllegalArgumentException(
+ "Field Type mismatch");
+ }
if (objectValue != null && !fieldCl.isInstance(objectValue)) {
throw new IllegalArgumentException();
}
diff --git a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPOutputStream.java b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPOutputStream.java
index 1ca9e118cfd..a8fcb186c8b 100644
--- a/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPOutputStream.java
+++ b/corba/src/java.corba/share/classes/com/sun/corba/se/impl/io/IIOPOutputStream.java
@@ -559,6 +559,10 @@ public class IIOPOutputStream
* Push all the clases of the current object onto a stack.
* Remember the stack pointer where this set of classes is being pushed.
*/
+ if (currentClassDesc.forClass().getName().equals("java.lang.String")) {
+ this.writeUTF((String)obj);
+ return;
+ }
int stackMark = classDescStack.size();
try {
ObjectStreamClass next;
diff --git a/corba/src/jdk.rmic/share/classes/sun/rmi/rmic/iiop/StubGenerator.java b/corba/src/jdk.rmic/share/classes/sun/rmi/rmic/iiop/StubGenerator.java
index 0d41c1edb90..bceb86cf774 100644
--- a/corba/src/jdk.rmic/share/classes/sun/rmi/rmic/iiop/StubGenerator.java
+++ b/corba/src/jdk.rmic/share/classes/sun/rmi/rmic/iiop/StubGenerator.java
@@ -446,6 +446,9 @@ public class StubGenerator extends sun.rmi.rmic.iiop.Generator {
if (emitPermissionCheck) {
// produce the following generated code for example
+ //
+ // private transient boolean _instantiated = false;
+ //
// private static Void checkPermission() {
// SecurityManager sm = System.getSecurityManager();
// if (sm != null) {
@@ -460,11 +463,21 @@ public class StubGenerator extends sun.rmi.rmic.iiop.Generator {
//
// public _XXXXX_Stub() {
// this(checkPermission());
+ // _instantiated = true;
+ // }
+ //
+ // private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {
+ // checkPermission();
+ // s.defaultReadObject();
+ // _instantiated = true;
// }
//
// where XXXXX is the name of the remote interface
p.pln();
+ p.plnI("private transient boolean _instantiated = false;");
+ p.pln();
+ p.pO();
p.plnI("private static Void checkPermission() {");
p.plnI("SecurityManager sm = System.getSecurityManager();");
p.pln("if (sm != null) {");
@@ -481,13 +494,23 @@ public class StubGenerator extends sun.rmi.rmic.iiop.Generator {
p.pO();
p.pI();
- p.pln("private " + currentClass + "(Void ignore) { }");
+ p.plnI("private " + currentClass + "(Void ignore) { }");
p.pln();
+ p.pO();
p.plnI("public " + currentClass + "() { ");
p.pln("this(checkPermission());");
+ p.pln("_instantiated = true;");
p.pOln("}");
p.pln();
+ p.plnI("private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException {");
+ p.plnI("checkPermission();");
+ p.pO();
+ p.pln("s.defaultReadObject();");
+ p.pln("_instantiated = true;");
+ p.pOln("}");
+ p.pln();
+ //p.pO();
}
if (!emitPermissionCheck) {
@@ -894,6 +917,7 @@ public class StubGenerator extends sun.rmi.rmic.iiop.Generator {
String paramNames[] = method.getArgumentNames();
Type returnType = method.getReturnType();
ValueType[] exceptions = getStubExceptions(method,false);
+ boolean hasIOException = false;
addNamesInUse(method);
addNameInUse("_type_ids");
@@ -921,6 +945,13 @@ public class StubGenerator extends sun.rmi.rmic.iiop.Generator {
p.plnI(" {");
// Now create the method body...
+ if (emitPermissionCheck) {
+ p.pln("if ((System.getSecurityManager() != null) && (!_instantiated)) {");
+ p.plnI(" throw new java.io.IOError(new java.io.IOException(\"InvalidObject \"));");
+ p.pOln("}");
+ p.pln();
+ }
+
if (localStubs) {
writeLocalStubMethodBody(p,method,theType);
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index a19cb298ea3..57ffaf65cc0 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -489,3 +489,5 @@ e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79
184c4328444974edd6b3b490b9d0177ace7e331c jdk9-b84
03845376ea9dbf9690b6a9cfb4ed63f8cc0541c0 jdk9-b85
1ae4191359d811a51512f17dca80ffe79837a5ff jdk9-b86
+d7ffd16382fe7071181b967932b47cff6d1312e1 jdk9-b87
+bc48b669bc6610fac97e16593050c0f559cf6945 jdk9-b88
diff --git a/hotspot/make/gensrc/Gensrc-jdk.vm.ci.gmk b/hotspot/make/gensrc/Gensrc-jdk.vm.ci.gmk
index bafe0a3b058..15c55012cc8 100644
--- a/hotspot/make/gensrc/Gensrc-jdk.vm.ci.gmk
+++ b/hotspot/make/gensrc/Gensrc-jdk.vm.ci.gmk
@@ -77,6 +77,7 @@ $(GENSRC_DIR)/_gensrc_proc_done: $(PROC_SRCS) \
$(MKDIR) -p $(@D)
$(eval $(call ListPathsSafely,PROC_SRCS,$(@D)/_gensrc_proc_files))
$(JAVA_SMALL) $(NEW_JAVAC) \
+ -XDignore.symbol.file \
-sourcepath $(SOURCEPATH) \
-implicit:none \
-proc:only \
diff --git a/hotspot/src/share/vm/oops/constantPool.cpp b/hotspot/src/share/vm/oops/constantPool.cpp
index ce6d18728c0..006a1e5b5a6 100644
--- a/hotspot/src/share/vm/oops/constantPool.cpp
+++ b/hotspot/src/share/vm/oops/constantPool.cpp
@@ -111,7 +111,7 @@ objArrayOop ConstantPool::resolved_references() const {
// to map it back for resolving and some unlikely miscellaneous uses.
// The objects created by invokedynamic are appended to this list.
void ConstantPool::initialize_resolved_references(ClassLoaderData* loader_data,
- intStack reference_map,
+ const intStack& reference_map,
int constant_pool_map_length,
TRAPS) {
// Initialized the resolved object cache.
diff --git a/hotspot/src/share/vm/oops/constantPool.hpp b/hotspot/src/share/vm/oops/constantPool.hpp
index 2f8c7b7f402..99d77253be9 100644
--- a/hotspot/src/share/vm/oops/constantPool.hpp
+++ b/hotspot/src/share/vm/oops/constantPool.hpp
@@ -185,7 +185,7 @@ class ConstantPool : public Metadata {
// Create object cache in the constant pool
void initialize_resolved_references(ClassLoaderData* loader_data,
- intStack reference_map,
+ const intStack& reference_map,
int constant_pool_map_length,
TRAPS);
diff --git a/jaxp/.hgtags b/jaxp/.hgtags
index 4dcf642142e..06e9495b555 100644
--- a/jaxp/.hgtags
+++ b/jaxp/.hgtags
@@ -329,3 +329,5 @@ f464f9b2fb1178f6a957e5730b4b5252c6149ed9 jdk9-b80
91795d86744f3074d1e59b1e75d9c851c098688f jdk9-b84
1d9850c1b35c74e8b5c17970ed5d46dc0fc33f06 jdk9-b85
88d9b1f6b73e0c46fcb5ccabe1231a30ce758a22 jdk9-b86
+eb435c878c2cbbfb043d0b205f4d5bd6faffd44a jdk9-b87
+4700fd67e942714046df1d0514f2ef4ddcac78bb jdk9-b88
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/lib/ExsltSets.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/lib/ExsltSets.java
index e35996ce71f..46d5df19c7e 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/lib/ExsltSets.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/lib/ExsltSets.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -22,10 +22,10 @@
*/
package com.sun.org.apache.xalan.internal.lib;
-import java.util.Hashtable;
-
import com.sun.org.apache.xml.internal.utils.DOMHelper;
import com.sun.org.apache.xpath.internal.NodeSet;
+import java.util.HashMap;
+import java.util.Map;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -192,7 +192,7 @@ public class ExsltSets extends ExsltBase
NodeSet dist = new NodeSet();
dist.setShouldCacheNodes(true);
- Hashtable stringTable = new Hashtable();
+ Map stringTable = new HashMap<>();
for (int i = 0; i < nl.getLength(); i++)
{
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java
index 0883841c4cf..0701bb124e8 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/XMLSecurityManager.java
@@ -65,27 +65,31 @@ public final class XMLSecurityManager {
*/
public static enum Limit {
- ENTITY_EXPANSION_LIMIT(XalanConstants.JDK_ENTITY_EXPANSION_LIMIT,
+ ENTITY_EXPANSION_LIMIT("EntityExpansionLimit", XalanConstants.JDK_ENTITY_EXPANSION_LIMIT,
XalanConstants.SP_ENTITY_EXPANSION_LIMIT, 0, 64000),
- MAX_OCCUR_NODE_LIMIT(XalanConstants.JDK_MAX_OCCUR_LIMIT,
+ MAX_OCCUR_NODE_LIMIT("MaxOccurLimit", XalanConstants.JDK_MAX_OCCUR_LIMIT,
XalanConstants.SP_MAX_OCCUR_LIMIT, 0, 5000),
- ELEMENT_ATTRIBUTE_LIMIT(XalanConstants.JDK_ELEMENT_ATTRIBUTE_LIMIT,
+ ELEMENT_ATTRIBUTE_LIMIT("ElementAttributeLimit", XalanConstants.JDK_ELEMENT_ATTRIBUTE_LIMIT,
XalanConstants.SP_ELEMENT_ATTRIBUTE_LIMIT, 0, 10000),
- TOTAL_ENTITY_SIZE_LIMIT(XalanConstants.JDK_TOTAL_ENTITY_SIZE_LIMIT,
+ TOTAL_ENTITY_SIZE_LIMIT("TotalEntitySizeLimit", XalanConstants.JDK_TOTAL_ENTITY_SIZE_LIMIT,
XalanConstants.SP_TOTAL_ENTITY_SIZE_LIMIT, 0, 50000000),
- GENERAL_ENTITY_SIZE_LIMIT(XalanConstants.JDK_GENERAL_ENTITY_SIZE_LIMIT,
+ GENERAL_ENTITY_SIZE_LIMIT("MaxEntitySizeLimit", XalanConstants.JDK_GENERAL_ENTITY_SIZE_LIMIT,
XalanConstants.SP_GENERAL_ENTITY_SIZE_LIMIT, 0, 0),
- PARAMETER_ENTITY_SIZE_LIMIT(XalanConstants.JDK_PARAMETER_ENTITY_SIZE_LIMIT,
+ PARAMETER_ENTITY_SIZE_LIMIT("MaxEntitySizeLimit", XalanConstants.JDK_PARAMETER_ENTITY_SIZE_LIMIT,
XalanConstants.SP_PARAMETER_ENTITY_SIZE_LIMIT, 0, 1000000),
- MAX_ELEMENT_DEPTH_LIMIT(XalanConstants.JDK_MAX_ELEMENT_DEPTH,
- XalanConstants.SP_MAX_ELEMENT_DEPTH, 0, 0);
+ MAX_ELEMENT_DEPTH_LIMIT("MaxElementDepthLimit", XalanConstants.JDK_MAX_ELEMENT_DEPTH,
+ XalanConstants.SP_MAX_ELEMENT_DEPTH, 0, 0),
+ MAX_NAME_LIMIT("MaxXMLNameLimit", XalanConstants.JDK_XML_NAME_LIMIT,
+ XalanConstants.SP_XML_NAME_LIMIT, 1000, 1000);
+ final String key;
final String apiProperty;
final String systemProperty;
final int defaultValue;
final int secureValue;
- Limit(String apiProperty, String systemProperty, int value, int secureValue) {
+ Limit(String key, String apiProperty, String systemProperty, int value, int secureValue) {
+ this.key = key;
this.apiProperty = apiProperty;
this.systemProperty = systemProperty;
this.defaultValue = value;
@@ -100,6 +104,10 @@ public final class XMLSecurityManager {
return (propertyName == null) ? false : systemProperty.equals(propertyName);
}
+ public String key() {
+ return key;
+ }
+
public String apiProperty() {
return apiProperty;
}
@@ -108,7 +116,7 @@ public final class XMLSecurityManager {
return systemProperty;
}
- int defaultValue() {
+ public int defaultValue() {
return defaultValue;
}
@@ -160,7 +168,7 @@ public final class XMLSecurityManager {
/**
* Index of the special entityCountInfo property
*/
- private int indexEntityCountInfo = 10000;
+ private final int indexEntityCountInfo = 10000;
private String printEntityCountInfo = "";
/**
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/DOM.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/DOM.java
index 603f0bc425e..1e6be9a9d85 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/DOM.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/DOM.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -23,14 +23,12 @@
package com.sun.org.apache.xalan.internal.xsltc;
-import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
-
+import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
+import java.util.Map;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
-import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
-
/**
* @author Jacek Ambroziak
* @author Santiago Pericas-Geertsen
@@ -103,5 +101,5 @@ public interface DOM {
public int getNSType(int node);
public int getDocument();
public String getUnparsedEntityURI(String name);
- public Hashtable getElementsWithIDs();
+ public Map getElementsWithIDs();
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyTemplates.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyTemplates.java
index d4aeb31c3b7..6d6a47c157a 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyTemplates.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ApplyTemplates.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -41,6 +41,7 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import com.sun.org.apache.xml.internal.utils.XML11Char;
+import java.util.Iterator;
/**
* @author Jacek Ambroziak
@@ -122,9 +123,9 @@ final class ApplyTemplates extends Instruction {
// check if sorting nodes is required
final Vector sortObjects = new Vector();
- final Enumeration children = elements();
- while (children.hasMoreElements()) {
- final Object child = children.nextElement();
+ final Iterator children = elements();
+ while (children.hasNext()) {
+ final SyntaxTreeNode child = children.next();
if (child instanceof Sort) {
sortObjects.addElement(child);
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeSet.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeSet.java
index 1ba7abe4ec4..33d2b071743 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeSet.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeSet.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -23,9 +23,6 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.util.Enumeration;
-import java.util.Vector;
-
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
@@ -37,6 +34,11 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import com.sun.org.apache.xml.internal.utils.XML11Char;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
/**
* @author Jacek Ambroziak
@@ -111,10 +113,10 @@ final class AttributeSet extends TopLevelElement {
// Parse the contents of this node. All child elements must be
// elements. Other elements cause an error.
- final Vector contents = getContents();
+ final List contents = getContents();
final int count = contents.size();
for (int i=0; i attributes = elements();
+ while (attributes.hasNext()) {
+ SyntaxTreeNode element = (SyntaxTreeNode)attributes.next();
if (element instanceof XslAttribute) {
final XslAttribute attribute = (XslAttribute)element;
attribute.translate(classGen, methodGen);
@@ -198,10 +200,10 @@ final class AttributeSet extends TopLevelElement {
public String toString() {
StringBuffer buf = new StringBuffer("attribute-set: ");
// Translate all local attributes
- final Enumeration attributes = elements();
- while (attributes.hasMoreElements()) {
+ final Iterator attributes = elements();
+ while (attributes.hasNext()) {
final XslAttribute attribute =
- (XslAttribute)attributes.nextElement();
+ (XslAttribute)attributes.next();
buf.append(attribute);
}
return(buf.toString());
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValueTemplate.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValueTemplate.java
index f73c4271205..13d0fa03f13 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValueTemplate.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/AttributeValueTemplate.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -39,6 +39,8 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
+import java.util.Iterator;
+import java.util.List;
/**
* @author Jacek Ambroziak
@@ -206,12 +208,12 @@ final class AttributeValueTemplate extends AttributeValue {
}
public Type typeCheck(SymbolTable stable) throws TypeCheckError {
- final Vector contents = getContents();
+ final List contents = getContents();
final int n = contents.size();
for (int i = 0; i < n; i++) {
- final Expression exp = (Expression)contents.elementAt(i);
+ final Expression exp = (Expression)contents.get(i);
if (!exp.typeCheck(stable).identicalTo(Type.String)) {
- contents.setElementAt(new CastExpr(exp, Type.String), i);
+ contents.set(i, new CastExpr(exp, Type.String));
}
}
return _type = Type.String;
@@ -251,9 +253,9 @@ final class AttributeValueTemplate extends AttributeValue {
il.append(DUP);
il.append(new INVOKESPECIAL(initBuffer));
// StringBuffer is on the stack
- final Enumeration elements = elements();
- while (elements.hasMoreElements()) {
- final Expression exp = (Expression)elements.nextElement();
+ final Iterator elements = elements();
+ while (elements.hasNext()) {
+ final Expression exp = (Expression)elements.next();
exp.translate(classGen, methodGen);
il.append(append);
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/CastExpr.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/CastExpr.java
index 07809ef4abf..e6f0b457bf6 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/CastExpr.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/CastExpr.java
@@ -1,15 +1,15 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -51,7 +51,7 @@ final class CastExpr extends Expression {
/**
* Legal conversions between internal types.
*/
- static private MultiHashtable InternalTypeMap = new MultiHashtable();
+ private static final MultiHashtable InternalTypeMap = new MultiHashtable<>();
static {
// Possible type conversions between internal types
@@ -118,6 +118,8 @@ final class CastExpr extends Expression {
InternalTypeMap.put(Type.Object, Type.String);
InternalTypeMap.put(Type.Void, Type.String);
+
+ InternalTypeMap.makeUnmodifiable();
}
private boolean _typeTest = false;
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Choose.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Choose.java
index 904b4709e86..4886c148bf2 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Choose.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Choose.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -37,6 +37,7 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
+import java.util.Iterator;
/**
* @author Jacek Ambroziak
@@ -62,15 +63,15 @@ final class Choose extends Instruction {
public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
final Vector whenElements = new Vector();
Otherwise otherwise = null;
- Enumeration elements = elements();
+ Iterator elements = elements();
// These two are for reporting errors only
ErrorMsg error = null;
final int line = getLineNumber();
// Traverse all child nodes - must be either When or Otherwise
- while (elements.hasMoreElements()) {
- Object element = elements.nextElement();
+ while (elements.hasNext()) {
+ SyntaxTreeNode element = elements.next();
// Add a When child element
if (element instanceof When) {
whenElements.addElement(element);
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ForEach.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ForEach.java
index ed33ca44842..089bcac649c 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ForEach.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/ForEach.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -42,6 +42,7 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ResultTreeType;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
+import java.util.Iterator;
/**
* @author Jacek Ambroziak
@@ -97,9 +98,9 @@ final class ForEach extends Instruction {
// Collect sort objects associated with this instruction
final Vector sortObjects = new Vector();
- Enumeration children = elements();
- while (children.hasMoreElements()) {
- final Object child = children.nextElement();
+ Iterator children = elements();
+ while (children.hasNext()) {
+ final Object child = children.next();
if (child instanceof Sort) {
sortObjects.addElement(child);
}
@@ -187,7 +188,7 @@ final class ForEach extends Instruction {
MethodGenerator methodGen) {
final int n = elementCount();
for (int i = 0; i < n; i++) {
- final Object child = getContents().elementAt(i);
+ final Object child = getContents().get(i);
if (child instanceof Variable) {
Variable var = (Variable)child;
var.initialize(classGen, methodGen);
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java
index 7b55225f78a..03a7498bad4 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java
@@ -1,15 +1,15 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,13 +23,6 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.IFEQ;
import com.sun.org.apache.bcel.internal.generic.INVOKEINTERFACE;
@@ -43,6 +36,7 @@ import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.xalan.internal.utils.FeatureManager;
+import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ErrorMsg;
@@ -54,8 +48,15 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ObjectType;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ReferenceType;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
-import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Objects;
+import java.util.Vector;
/**
* @author Jacek Ambroziak
@@ -138,23 +139,23 @@ class FunctionCall extends Expression {
private boolean _isStatic = false;
// Legal conversions between internal and Java types.
- private static final MultiHashtable _internal2Java = new MultiHashtable();
+ private static final MultiHashtable _internal2Java = new MultiHashtable<>();
// Legal conversions between Java and internal types.
- private static final Hashtable _java2Internal = new Hashtable();
+ private static final Map, Type> JAVA2INTERNAL;
// The mappings between EXSLT extension namespaces and implementation classes
- private static final Hashtable _extensionNamespaceTable = new Hashtable();
+ private static final Map EXTENSIONNAMESPACE;
// Extension functions that are implemented in BasisLibrary
- private static final Hashtable _extensionFunctionTable = new Hashtable();
+ private static final Map EXTENSIONFUNCTION;
/**
* inner class to used in internal2Java mappings, contains
* the Java type and the distance between the internal type and
* the Java type.
*/
static class JavaType {
- public Class type;
+ public Class> type;
public int distance;
public JavaType(Class type, int distance){
@@ -168,8 +169,15 @@ class FunctionCall extends Expression {
}
@Override
- public boolean equals(Object query){
- return query != null && query.equals(type);
+ public boolean equals(Object query) {
+ if (query == null) {
+ return false;
+ }
+ if (query.getClass().isAssignableFrom(JavaType.class)) {
+ return ((JavaType)query).type.equals(type);
+ } else {
+ return query.equals(type);
+ }
}
}
@@ -180,99 +188,112 @@ class FunctionCall extends Expression {
* These two tables are used when calling external (Java) functions.
*/
static {
+ final Class> nodeClass, nodeListClass;
try {
- final Class nodeClass = Class.forName("org.w3c.dom.Node");
- final Class nodeListClass = Class.forName("org.w3c.dom.NodeList");
-
- // -- Internal to Java --------------------------------------------
-
- // Type.Boolean -> { boolean(0), Boolean(1), Object(2) }
- _internal2Java.put(Type.Boolean, new JavaType(Boolean.TYPE, 0));
- _internal2Java.put(Type.Boolean, new JavaType(Boolean.class, 1));
- _internal2Java.put(Type.Boolean, new JavaType(Object.class, 2));
-
- // Type.Real -> { double(0), Double(1), float(2), long(3), int(4),
- // short(5), byte(6), char(7), Object(8) }
- _internal2Java.put(Type.Real, new JavaType(Double.TYPE, 0));
- _internal2Java.put(Type.Real, new JavaType(Double.class, 1));
- _internal2Java.put(Type.Real, new JavaType(Float.TYPE, 2));
- _internal2Java.put(Type.Real, new JavaType(Long.TYPE, 3));
- _internal2Java.put(Type.Real, new JavaType(Integer.TYPE, 4));
- _internal2Java.put(Type.Real, new JavaType(Short.TYPE, 5));
- _internal2Java.put(Type.Real, new JavaType(Byte.TYPE, 6));
- _internal2Java.put(Type.Real, new JavaType(Character.TYPE, 7));
- _internal2Java.put(Type.Real, new JavaType(Object.class, 8));
-
- // Type.Int must be the same as Type.Real
- _internal2Java.put(Type.Int, new JavaType(Double.TYPE, 0));
- _internal2Java.put(Type.Int, new JavaType(Double.class, 1));
- _internal2Java.put(Type.Int, new JavaType(Float.TYPE, 2));
- _internal2Java.put(Type.Int, new JavaType(Long.TYPE, 3));
- _internal2Java.put(Type.Int, new JavaType(Integer.TYPE, 4));
- _internal2Java.put(Type.Int, new JavaType(Short.TYPE, 5));
- _internal2Java.put(Type.Int, new JavaType(Byte.TYPE, 6));
- _internal2Java.put(Type.Int, new JavaType(Character.TYPE, 7));
- _internal2Java.put(Type.Int, new JavaType(Object.class, 8));
-
- // Type.String -> { String(0), Object(1) }
- _internal2Java.put(Type.String, new JavaType(String.class, 0));
- _internal2Java.put(Type.String, new JavaType(Object.class, 1));
-
- // Type.NodeSet -> { NodeList(0), Node(1), Object(2), String(3) }
- _internal2Java.put(Type.NodeSet, new JavaType(nodeListClass, 0));
- _internal2Java.put(Type.NodeSet, new JavaType(nodeClass, 1));
- _internal2Java.put(Type.NodeSet, new JavaType(Object.class, 2));
- _internal2Java.put(Type.NodeSet, new JavaType(String.class, 3));
-
- // Type.Node -> { Node(0), NodeList(1), Object(2), String(3) }
- _internal2Java.put(Type.Node, new JavaType(nodeListClass, 0));
- _internal2Java.put(Type.Node, new JavaType(nodeClass, 1));
- _internal2Java.put(Type.Node, new JavaType(Object.class, 2));
- _internal2Java.put(Type.Node, new JavaType(String.class, 3));
-
- // Type.ResultTree -> { NodeList(0), Node(1), Object(2), String(3) }
- _internal2Java.put(Type.ResultTree, new JavaType(nodeListClass, 0));
- _internal2Java.put(Type.ResultTree, new JavaType(nodeClass, 1));
- _internal2Java.put(Type.ResultTree, new JavaType(Object.class, 2));
- _internal2Java.put(Type.ResultTree, new JavaType(String.class, 3));
-
- _internal2Java.put(Type.Reference, new JavaType(Object.class, 0));
-
- // Possible conversions between Java and internal types
- _java2Internal.put(Boolean.TYPE, Type.Boolean);
- _java2Internal.put(Void.TYPE, Type.Void);
- _java2Internal.put(Character.TYPE, Type.Real);
- _java2Internal.put(Byte.TYPE, Type.Real);
- _java2Internal.put(Short.TYPE, Type.Real);
- _java2Internal.put(Integer.TYPE, Type.Real);
- _java2Internal.put(Long.TYPE, Type.Real);
- _java2Internal.put(Float.TYPE, Type.Real);
- _java2Internal.put(Double.TYPE, Type.Real);
-
- _java2Internal.put(String.class, Type.String);
-
- _java2Internal.put(Object.class, Type.Reference);
-
- // Conversions from org.w3c.dom.Node/NodeList to internal NodeSet
- _java2Internal.put(nodeListClass, Type.NodeSet);
- _java2Internal.put(nodeClass, Type.NodeSet);
-
- // Initialize the extension namespace table
- _extensionNamespaceTable.put(EXT_XALAN, "com.sun.org.apache.xalan.internal.lib.Extensions");
- _extensionNamespaceTable.put(EXSLT_COMMON, "com.sun.org.apache.xalan.internal.lib.ExsltCommon");
- _extensionNamespaceTable.put(EXSLT_MATH, "com.sun.org.apache.xalan.internal.lib.ExsltMath");
- _extensionNamespaceTable.put(EXSLT_SETS, "com.sun.org.apache.xalan.internal.lib.ExsltSets");
- _extensionNamespaceTable.put(EXSLT_DATETIME, "com.sun.org.apache.xalan.internal.lib.ExsltDatetime");
- _extensionNamespaceTable.put(EXSLT_STRINGS, "com.sun.org.apache.xalan.internal.lib.ExsltStrings");
-
- // Initialize the extension function table
- _extensionFunctionTable.put(EXSLT_COMMON + ":nodeSet", "nodeset");
- _extensionFunctionTable.put(EXSLT_COMMON + ":objectType", "objectType");
- _extensionFunctionTable.put(EXT_XALAN + ":nodeset", "nodeset");
+ nodeClass = Class.forName("org.w3c.dom.Node");
+ nodeListClass = Class.forName("org.w3c.dom.NodeList");
}
catch (ClassNotFoundException e) {
- System.err.println(e);
+ ErrorMsg err = new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR,"org.w3c.dom.Node or NodeList");
+ throw new Error(err.toString());
}
+
+ // -- Internal to Java --------------------------------------------
+
+ // Type.Boolean -> { boolean(0), Boolean(1), Object(2) }
+ _internal2Java.put(Type.Boolean, new JavaType(Boolean.TYPE, 0));
+ _internal2Java.put(Type.Boolean, new JavaType(Boolean.class, 1));
+ _internal2Java.put(Type.Boolean, new JavaType(Object.class, 2));
+
+ // Type.Real -> { double(0), Double(1), float(2), long(3), int(4),
+ // short(5), byte(6), char(7), Object(8) }
+ _internal2Java.put(Type.Real, new JavaType(Double.TYPE, 0));
+ _internal2Java.put(Type.Real, new JavaType(Double.class, 1));
+ _internal2Java.put(Type.Real, new JavaType(Float.TYPE, 2));
+ _internal2Java.put(Type.Real, new JavaType(Long.TYPE, 3));
+ _internal2Java.put(Type.Real, new JavaType(Integer.TYPE, 4));
+ _internal2Java.put(Type.Real, new JavaType(Short.TYPE, 5));
+ _internal2Java.put(Type.Real, new JavaType(Byte.TYPE, 6));
+ _internal2Java.put(Type.Real, new JavaType(Character.TYPE, 7));
+ _internal2Java.put(Type.Real, new JavaType(Object.class, 8));
+
+ // Type.Int must be the same as Type.Real
+ _internal2Java.put(Type.Int, new JavaType(Double.TYPE, 0));
+ _internal2Java.put(Type.Int, new JavaType(Double.class, 1));
+ _internal2Java.put(Type.Int, new JavaType(Float.TYPE, 2));
+ _internal2Java.put(Type.Int, new JavaType(Long.TYPE, 3));
+ _internal2Java.put(Type.Int, new JavaType(Integer.TYPE, 4));
+ _internal2Java.put(Type.Int, new JavaType(Short.TYPE, 5));
+ _internal2Java.put(Type.Int, new JavaType(Byte.TYPE, 6));
+ _internal2Java.put(Type.Int, new JavaType(Character.TYPE, 7));
+ _internal2Java.put(Type.Int, new JavaType(Object.class, 8));
+
+ // Type.String -> { String(0), Object(1) }
+ _internal2Java.put(Type.String, new JavaType(String.class, 0));
+ _internal2Java.put(Type.String, new JavaType(Object.class, 1));
+
+ // Type.NodeSet -> { NodeList(0), Node(1), Object(2), String(3) }
+ _internal2Java.put(Type.NodeSet, new JavaType(nodeListClass, 0));
+ _internal2Java.put(Type.NodeSet, new JavaType(nodeClass, 1));
+ _internal2Java.put(Type.NodeSet, new JavaType(Object.class, 2));
+ _internal2Java.put(Type.NodeSet, new JavaType(String.class, 3));
+
+ // Type.Node -> { Node(0), NodeList(1), Object(2), String(3) }
+ _internal2Java.put(Type.Node, new JavaType(nodeListClass, 0));
+ _internal2Java.put(Type.Node, new JavaType(nodeClass, 1));
+ _internal2Java.put(Type.Node, new JavaType(Object.class, 2));
+ _internal2Java.put(Type.Node, new JavaType(String.class, 3));
+
+ // Type.ResultTree -> { NodeList(0), Node(1), Object(2), String(3) }
+ _internal2Java.put(Type.ResultTree, new JavaType(nodeListClass, 0));
+ _internal2Java.put(Type.ResultTree, new JavaType(nodeClass, 1));
+ _internal2Java.put(Type.ResultTree, new JavaType(Object.class, 2));
+ _internal2Java.put(Type.ResultTree, new JavaType(String.class, 3));
+
+ _internal2Java.put(Type.Reference, new JavaType(Object.class, 0));
+
+ _internal2Java.makeUnmodifiable();
+
+ Map, Type> java2Internal = new HashMap<>();
+ Map extensionNamespaceTable = new HashMap<>();
+ Map extensionFunctionTable = new HashMap<>();
+
+ // Possible conversions between Java and internal types
+ java2Internal.put(Boolean.TYPE, Type.Boolean);
+ java2Internal.put(Void.TYPE, Type.Void);
+ java2Internal.put(Character.TYPE, Type.Real);
+ java2Internal.put(Byte.TYPE, Type.Real);
+ java2Internal.put(Short.TYPE, Type.Real);
+ java2Internal.put(Integer.TYPE, Type.Real);
+ java2Internal.put(Long.TYPE, Type.Real);
+ java2Internal.put(Float.TYPE, Type.Real);
+ java2Internal.put(Double.TYPE, Type.Real);
+
+ java2Internal.put(String.class, Type.String);
+
+ java2Internal.put(Object.class, Type.Reference);
+
+ // Conversions from org.w3c.dom.Node/NodeList to internal NodeSet
+ java2Internal.put(nodeListClass, Type.NodeSet);
+ java2Internal.put(nodeClass, Type.NodeSet);
+
+ // Initialize the extension namespace table
+ extensionNamespaceTable.put(EXT_XALAN, "com.sun.org.apache.xalan.internal.lib.Extensions");
+ extensionNamespaceTable.put(EXSLT_COMMON, "com.sun.org.apache.xalan.internal.lib.ExsltCommon");
+ extensionNamespaceTable.put(EXSLT_MATH, "com.sun.org.apache.xalan.internal.lib.ExsltMath");
+ extensionNamespaceTable.put(EXSLT_SETS, "com.sun.org.apache.xalan.internal.lib.ExsltSets");
+ extensionNamespaceTable.put(EXSLT_DATETIME, "com.sun.org.apache.xalan.internal.lib.ExsltDatetime");
+ extensionNamespaceTable.put(EXSLT_STRINGS, "com.sun.org.apache.xalan.internal.lib.ExsltStrings");
+
+ // Initialize the extension function table
+ extensionFunctionTable.put(EXSLT_COMMON + ":nodeSet", "nodeset");
+ extensionFunctionTable.put(EXSLT_COMMON + ":objectType", "objectType");
+ extensionFunctionTable.put(EXT_XALAN + ":nodeset", "nodeset");
+
+ JAVA2INTERNAL = Collections.unmodifiableMap(java2Internal);
+ EXTENSIONNAMESPACE = Collections.unmodifiableMap(extensionNamespaceTable);
+ EXTENSIONFUNCTION = Collections.unmodifiableMap(extensionFunctionTable);
+
}
public FunctionCall(QName fname, Vector arguments) {
@@ -304,7 +325,7 @@ class FunctionCall extends Expression {
public String getClassNameFromUri(String uri)
{
- String className = (String)_extensionNamespaceTable.get(uri);
+ String className = EXTENSIONNAMESPACE.get(uri);
if (className != null)
return className;
@@ -384,7 +405,7 @@ class FunctionCall extends Expression {
local = replaceDash(local);
}
- String extFunction = (String)_extensionFunctionTable.get(namespace + ":" + local);
+ String extFunction = EXTENSIONFUNCTION.get(namespace + ":" + local);
if (extFunction != null) {
_fname = new QName(null, null, extFunction);
return typeCheckStandard(stable);
@@ -464,15 +485,15 @@ class FunctionCall extends Expression {
(Constructor)constructors.elementAt(i);
final Class[] paramTypes = constructor.getParameterTypes();
- Class extType = null;
+ Class> extType;
int currConstrDistance = 0;
for (j = 0; j < nArgs; j++) {
// Convert from internal (translet) type to external (Java) type
extType = paramTypes[j];
final Type intType = (Type)argsType.elementAt(j);
- Object match = _internal2Java.maps(intType, extType);
+ JavaType match = _internal2Java.maps(intType, new JavaType(extType, 0));
if (match != null) {
- currConstrDistance += ((JavaType)match).distance;
+ currConstrDistance += match.distance;
}
else if (intType instanceof ObjectType) {
ObjectType objectType = (ObjectType)intType;
@@ -597,9 +618,9 @@ class FunctionCall extends Expression {
// Convert from internal (translet) type to external (Java) type
extType = paramTypes[j];
final Type intType = (Type)argsType.elementAt(j);
- Object match = _internal2Java.maps(intType, extType);
+ JavaType match = _internal2Java.maps(intType, new JavaType(extType, 0));
if (match != null) {
- currMethodDistance += ((JavaType)match).distance;
+ currMethodDistance += match.distance;
}
else {
// no mapping available
@@ -631,7 +652,7 @@ class FunctionCall extends Expression {
// Check if the return type can be converted
extType = method.getReturnType();
- _type = (Type) _java2Internal.get(extType);
+ _type = JAVA2INTERNAL.get(extType);
if (_type == null) {
_type = Type.newObjectType(extType);
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java
index e1971d35c06..010ed70d0d6 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Import.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -31,10 +31,7 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xml.internal.utils.SystemIDResolver;
-import java.io.File;
-import java.net.URL;
-import java.net.MalformedURLException;
-import java.util.Enumeration;
+import java.util.Iterator;
import javax.xml.XMLConstants;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
@@ -133,10 +130,10 @@ final class Import extends TopLevelElement {
parser.setCurrentStylesheet(_imported);
_imported.parseContents(parser);
- final Enumeration elements = _imported.elements();
+ final Iterator elements = _imported.elements();
final Stylesheet topStylesheet = parser.getTopLevelStylesheet();
- while (elements.hasMoreElements()) {
- final Object element = elements.nextElement();
+ while (elements.hasNext()) {
+ final Object element = elements.next();
if (element instanceof TopLevelElement) {
if (element instanceof Variable) {
topStylesheet.addVariable((Variable) element);
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java
index 5bf12f8dc1b..a35fb521ebe 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Include.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -31,11 +31,7 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xml.internal.utils.SystemIDResolver;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Enumeration;
+import java.util.Iterator;
import javax.xml.XMLConstants;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
@@ -133,10 +129,10 @@ final class Include extends TopLevelElement {
parser.setCurrentStylesheet(_included);
_included.parseContents(parser);
- final Enumeration elements = _included.elements();
+ final Iterator elements = _included.elements();
final Stylesheet topStylesheet = parser.getTopLevelStylesheet();
- while (elements.hasMoreElements()) {
- final Object element = elements.nextElement();
+ while (elements.hasNext()) {
+ final Object element = elements.next();
if (element instanceof TopLevelElement) {
if (element instanceof Variable) {
topStylesheet.addVariable((Variable) element);
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Key.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Key.java
index 82dbffb7edf..8cea5ff4aa6 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Key.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Key.java
@@ -1,15 +1,15 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -226,7 +226,7 @@ final class Key extends TopLevelElement {
// AbstractTranslet.buildKeyIndex(name,node_id,value) => void
final int key = cpg.addMethodref(TRANSLET_CLASS,
"buildKeyIndex",
- "("+STRING_SIG+"I"+OBJECT_SIG+")V");
+ "("+STRING_SIG+"I"+STRING_SIG+")V");
// AbstractTranslet.SetKeyIndexDom(name, Dom) => void
final int keyDom = cpg.addMethodref(TRANSLET_CLASS,
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java
index e9a0c84f00c..78078e3be07 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/LiteralElement.java
@@ -1,15 +1,15 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,10 +23,6 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Vector;
-
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.PUSH;
@@ -36,9 +32,13 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
-
import com.sun.org.apache.xml.internal.serializer.ElemDesc;
import com.sun.org.apache.xml.internal.serializer.ToHTMLStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* @author Jacek Ambroziak
@@ -49,8 +49,8 @@ final class LiteralElement extends Instruction {
private String _name;
private LiteralElement _literalElemParent = null;
- private Vector _attributeElements = null;
- private Hashtable _accessedPrefixes = null;
+ private List _attributeElements = null;
+ private Map _accessedPrefixes = null;
// True if all attributes of this LRE are unique, i.e. they all have
// different names. This flag is set to false if some attribute
@@ -85,14 +85,13 @@ final class LiteralElement extends Instruction {
return result;
}
}
- return _accessedPrefixes != null ?
- (String) _accessedPrefixes.get(prefix) : null;
+ return _accessedPrefixes != null ? _accessedPrefixes.get(prefix) : null;
}
/**
* Method used to keep track of what namespaces that are references by
* this literal element and its attributes. The output must contain a
- * definition for each namespace, so we stuff them in a hashtable.
+ * definition for each namespace, so we stuff them in a map.
*/
public void registerNamespace(String prefix, String uri,
SymbolTable stable, boolean declared) {
@@ -107,12 +106,12 @@ final class LiteralElement extends Instruction {
// Check if we have any declared namesaces
if (_accessedPrefixes == null) {
- _accessedPrefixes = new Hashtable();
+ _accessedPrefixes = new HashMap<>();
}
else {
if (!declared) {
// Check if this node has a declaration for this namespace
- final String old = (String)_accessedPrefixes.get(prefix);
+ final String old = _accessedPrefixes.get(prefix);
if (old != null) {
if (old.equals(uri))
return;
@@ -169,7 +168,7 @@ final class LiteralElement extends Instruction {
*/
public void addAttribute(SyntaxTreeNode attribute) {
if (_attributeElements == null) {
- _attributeElements = new Vector(2);
+ _attributeElements = new ArrayList<>(2);
}
_attributeElements.add(attribute);
}
@@ -179,9 +178,9 @@ final class LiteralElement extends Instruction {
*/
public void setFirstAttribute(SyntaxTreeNode attribute) {
if (_attributeElements == null) {
- _attributeElements = new Vector(2);
+ _attributeElements = new ArrayList<>(2);
}
- _attributeElements.insertElementAt(attribute,0);
+ _attributeElements.add(0, attribute);
}
/**
@@ -191,10 +190,7 @@ final class LiteralElement extends Instruction {
public Type typeCheck(SymbolTable stable) throws TypeCheckError {
// Type-check all attributes
if (_attributeElements != null) {
- final int count = _attributeElements.size();
- for (int i = 0; i < count; i++) {
- SyntaxTreeNode node =
- (SyntaxTreeNode)_attributeElements.elementAt(i);
+ for (SyntaxTreeNode node : _attributeElements) {
node.typeCheck(stable);
}
}
@@ -207,23 +203,19 @@ final class LiteralElement extends Instruction {
* and assembles a list of all prefixes that (for the given node) maps
* to _ANY_ namespace URI. Used by literal result elements to determine
*/
- public Enumeration getNamespaceScope(SyntaxTreeNode node) {
- Hashtable all = new Hashtable();
+ public Set> getNamespaceScope(SyntaxTreeNode node) {
+ Map all = new HashMap<>();
while (node != null) {
- Hashtable mapping = node.getPrefixMapping();
+ Map mapping = node.getPrefixMapping();
if (mapping != null) {
- Enumeration prefixes = mapping.keys();
- while (prefixes.hasMoreElements()) {
- String prefix = (String)prefixes.nextElement();
- if (!all.containsKey(prefix)) {
- all.put(prefix, mapping.get(prefix));
- }
- }
+ mapping.entrySet().stream().forEach((entry) -> {
+ all.putIfAbsent(entry.getKey(), entry.getValue());
+ });
}
node = node.getParent();
}
- return(all.keys());
+ return all.entrySet();
}
/**
@@ -288,9 +280,9 @@ final class LiteralElement extends Instruction {
// Register all namespaces that are in scope, except for those that
// are listed in the xsl:stylesheet element's *-prefixes attributes
- final Enumeration include = getNamespaceScope(this);
- while (include.hasMoreElements()) {
- final String prefix = (String)include.nextElement();
+ Set> include = getNamespaceScope(this);
+ for (Map.Entry entry : include) {
+ final String prefix = entry.getKey();
if (!prefix.equals("xml")) {
final String uri = lookupNamespace(prefix);
if (uri != null && !stable.isExcludedNamespace(uri)) {
@@ -356,11 +348,10 @@ final class LiteralElement extends Instruction {
// Compile code to emit namespace attributes
if (_accessedPrefixes != null) {
boolean declaresDefaultNS = false;
- Enumeration e = _accessedPrefixes.keys();
- while (e.hasMoreElements()) {
- final String prefix = (String)e.nextElement();
- final String uri = (String)_accessedPrefixes.get(prefix);
+ for (Map.Entry entry : _accessedPrefixes.entrySet()) {
+ final String prefix = entry.getKey();
+ final String uri = entry.getValue();
if (uri != Constants.EMPTYSTRING ||
prefix != Constants.EMPTYSTRING)
@@ -391,10 +382,7 @@ final class LiteralElement extends Instruction {
// Output all attributes
if (_attributeElements != null) {
- final int count = _attributeElements.size();
- for (int i = 0; i < count; i++) {
- SyntaxTreeNode node =
- (SyntaxTreeNode)_attributeElements.elementAt(i);
+ for (SyntaxTreeNode node : _attributeElements) {
if (!(node instanceof XslAttribute)) {
node.translate(classGen, methodGen);
}
@@ -445,18 +433,18 @@ final class LiteralElement extends Instruction {
if (_attributeElements != null) {
int numAttrs = _attributeElements.size();
- Hashtable attrsTable = null;
+ Map attrsTable = null;
for (int i = 0; i < numAttrs; i++) {
- SyntaxTreeNode node = (SyntaxTreeNode)_attributeElements.elementAt(i);
+ SyntaxTreeNode node = _attributeElements.get(i);
if (node instanceof UseAttributeSets) {
return false;
}
else if (node instanceof XslAttribute) {
if (attrsTable == null) {
- attrsTable = new Hashtable();
+ attrsTable = new HashMap<>();
for (int k = 0; k < i; k++) {
- SyntaxTreeNode n = (SyntaxTreeNode)_attributeElements.elementAt(k);
+ SyntaxTreeNode n = _attributeElements.get(k);
if (n instanceof LiteralAttribute) {
LiteralAttribute literalAttr = (LiteralAttribute)n;
attrsTable.put(literalAttr.getName(), literalAttr);
@@ -491,10 +479,8 @@ final class LiteralElement extends Instruction {
* children of the current node are not included in the check.
*/
private boolean canProduceAttributeNodes(SyntaxTreeNode node, boolean ignoreXslAttribute) {
- Vector contents = node.getContents();
- int size = contents.size();
- for (int i = 0; i < size; i++) {
- SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);
+ List contents = node.getContents();
+ for (SyntaxTreeNode child : contents) {
if (child instanceof Text) {
Text text = (Text)child;
if (text.isIgnore())
@@ -532,10 +518,8 @@ final class LiteralElement extends Instruction {
return true;
}
else if (child instanceof Choose) {
- Vector chooseContents = child.getContents();
- int num = chooseContents.size();
- for (int k = 0; k < num; k++) {
- SyntaxTreeNode chooseChild = (SyntaxTreeNode)chooseContents.elementAt(k);
+ List chooseContents = child.getContents();
+ for (SyntaxTreeNode chooseChild : chooseContents) {
if (chooseChild instanceof When || chooseChild instanceof Otherwise) {
if (canProduceAttributeNodes(chooseChild, false))
return true;
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Mode.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Mode.java
index 66f7a95984f..768e7592039 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Mode.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Mode.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -23,12 +23,6 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Vector;
-
-import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.BranchHandle;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
import com.sun.org.apache.bcel.internal.generic.DUP;
@@ -38,6 +32,7 @@ import com.sun.org.apache.bcel.internal.generic.ILOAD;
import com.sun.org.apache.bcel.internal.generic.INVOKEINTERFACE;
import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL;
import com.sun.org.apache.bcel.internal.generic.ISTORE;
+import com.sun.org.apache.bcel.internal.generic.Instruction;
import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
@@ -51,6 +46,12 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.NamedMethodGenerato
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import com.sun.org.apache.xml.internal.dtm.Axis;
import com.sun.org.apache.xml.internal.dtm.DTM;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
/**
* Mode gathers all the templates belonging to a given mode;
@@ -128,22 +129,22 @@ final class Mode implements Constants {
/**
* A mapping between templates and test sequences.
*/
- private Hashtable _neededTemplates = new Hashtable();
+ private Map _neededTemplates = new HashMap<>();
/**
* A mapping between named templates and Mode objects.
*/
- private Hashtable _namedTemplates = new Hashtable();
+ private Map _namedTemplates = new HashMap<>();
/**
* A mapping between templates and instruction handles.
*/
- private Hashtable _templateIHs = new Hashtable();
+ private Map _templateIHs = new HashMap<>();
/**
* A mapping between templates and instruction lists.
*/
- private Hashtable _templateILs = new Hashtable();
+ private Map _templateILs = new HashMap<>();
/**
* A reference to the pattern matching the root node.
@@ -152,14 +153,14 @@ final class Mode implements Constants {
/**
* Stores ranges of template precendences for the compilation
- * of apply-imports (a Hashtable for historical reasons).
+ * of apply-imports.
*/
- private Hashtable _importLevels = null;
+ private Map _importLevels = null;
/**
* A mapping between key names and keys.
*/
- private Hashtable _keys = null;
+ private Map _keys = null;
/**
* Variable index for the current node used in code generation.
@@ -195,9 +196,9 @@ final class Mode implements Constants {
public String functionName(int min, int max) {
if (_importLevels == null) {
- _importLevels = new Hashtable();
+ _importLevels = new HashMap<>();
}
- _importLevels.put(new Integer(max), new Integer(min));
+ _importLevels.put(max, min);
return _methodName + '_' + max;
}
@@ -244,7 +245,7 @@ final class Mode implements Constants {
/**
* Process all the test patterns in this mode
*/
- public void processPatterns(Hashtable keys) {
+ public void processPatterns(Map keys) {
_keys = keys;
/*
@@ -300,7 +301,7 @@ for (int i = 0; i < _templates.size(); i++) {
*/
private void flattenAlternative(Pattern pattern,
Template template,
- Hashtable keys) {
+ Map keys) {
// Patterns on type id() and key() are special since they do not have
// any kernel node type (it can be anything as long as the node is in
// the id's or key's index).
@@ -560,15 +561,13 @@ for (int i = 0; i < _templates.size(); i++) {
MethodGenerator methodGen,
InstructionHandle next)
{
- Enumeration templates = _namedTemplates.keys();
- while (templates.hasMoreElements()) {
- final Template template = (Template)templates.nextElement();
+ Set templates = _namedTemplates.keySet();
+ for (Template template : templates) {
compileNamedTemplate(template, classGen);
}
- templates = _neededTemplates.keys();
- while (templates.hasMoreElements()) {
- final Template template = (Template)templates.nextElement();
+ templates = _neededTemplates.keySet();
+ for (Template template : templates) {
if (template.hasContents()) {
// !!! TODO templates both named and matched
InstructionList til = template.compile(classGen, methodGen);
@@ -584,13 +583,12 @@ for (int i = 0; i < _templates.size(); i++) {
}
private void appendTemplateCode(InstructionList body) {
- final Enumeration templates = _neededTemplates.keys();
- while (templates.hasMoreElements()) {
- final Object iList =
- _templateILs.get(templates.nextElement());
+ for (Template template : _neededTemplates.keySet()) {
+ final InstructionList iList = _templateILs.get(template);
if (iList != null) {
- body.append((InstructionList)iList);
+ body.append(iList);
}
+
}
}
@@ -1043,11 +1041,8 @@ for (int i = 0; i < _templates.size(); i++) {
// Compile method(s) for for this mode
if (_importLevels != null) {
- Enumeration levels = _importLevels.keys();
- while (levels.hasMoreElements()) {
- Integer max = (Integer)levels.nextElement();
- Integer min = (Integer)_importLevels.get(max);
- compileApplyImports(classGen, min.intValue(), max.intValue());
+ for (Map.Entry entry : _importLevels.entrySet()) {
+ compileApplyImports(classGen, entry.getValue(), entry.getKey());
}
}
}
@@ -1055,9 +1050,7 @@ for (int i = 0; i < _templates.size(); i++) {
private void compileTemplateCalls(ClassGenerator classGen,
MethodGenerator methodGen,
InstructionHandle next, int min, int max){
- Enumeration templates = _neededTemplates.keys();
- while (templates.hasMoreElements()) {
- final Template template = (Template)templates.nextElement();
+ _neededTemplates.keySet().stream().forEach((template) -> {
final int prec = template.getImportPrecedence();
if ((prec >= min) && (prec < max)) {
if (template.hasContents()) {
@@ -1071,7 +1064,7 @@ for (int i = 0; i < _templates.size(); i++) {
_templateIHs.put(template, next);
}
}
- }
+ });
}
@@ -1081,10 +1074,10 @@ for (int i = 0; i < _templates.size(); i++) {
final Vector names = xsltc.getNamesIndex();
// Clear some datastructures
- _namedTemplates = new Hashtable();
- _neededTemplates = new Hashtable();
- _templateIHs = new Hashtable();
- _templateILs = new Hashtable();
+ _namedTemplates = new HashMap<>();
+ _neededTemplates = new HashMap<>();
+ _templateIHs = new HashMap<>();
+ _templateILs = new HashMap<>();
_patternGroups = new Vector[32];
_rootPattern = null;
@@ -1503,7 +1496,7 @@ for (int i = 0; i < _templates.size(); i++) {
}
public InstructionHandle getTemplateInstructionHandle(Template template) {
- return (InstructionHandle)_templateIHs.get(template);
+ return _templateIHs.get(template);
}
/**
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java
index 0903d9a9ef6..4845a190adb 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Parser.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -37,9 +37,10 @@ import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.Stack;
import java.util.StringTokenizer;
@@ -77,14 +78,14 @@ public class Parser implements Constants, ContentHandler {
private Vector _errors; // Contains all compilation errors
private Vector _warnings; // Contains all compilation errors
- private Hashtable _instructionClasses; // Maps instructions to classes
- private Hashtable _instructionAttrs;; // reqd and opt attrs
- private Hashtable _qNames;
- private Hashtable _namespaces;
+ private Map _instructionClasses; // Maps instructions to classes
+ private Map _instructionAttrs; // reqd and opt attrs
+ private Map _qNames;
+ private Map _namespaces;
private QName _useAttributeSets;
private QName _excludeResultPrefixes;
private QName _extensionElementPrefixes;
- private Hashtable _variableScope;
+ private Map _variableScope;
private Stylesheet _currentStylesheet;
private SymbolTable _symbolTable; // Maps QNames to syntax-tree nodes
private Output _output;
@@ -106,11 +107,11 @@ public class Parser implements Constants, ContentHandler {
}
public void init() {
- _qNames = new Hashtable(512);
- _namespaces = new Hashtable();
- _instructionClasses = new Hashtable();
- _instructionAttrs = new Hashtable();
- _variableScope = new Hashtable();
+ _qNames = new HashMap<>(512);
+ _namespaces = new HashMap<>();
+ _instructionClasses = new HashMap<>();
+ _instructionAttrs = new HashMap<>();
+ _variableScope = new HashMap<>();
_template = null;
_errors = new Vector();
_warnings = new Vector();
@@ -169,7 +170,7 @@ public class Parser implements Constants, ContentHandler {
}
private void addVariableOrParam(VariableBase var) {
- Object existing = _variableScope.get(var.getName());
+ Object existing = _variableScope.get(var.getName().getStringRep());
if (existing != null) {
if (existing instanceof Stack) {
Stack stack = (Stack)existing;
@@ -179,26 +180,26 @@ public class Parser implements Constants, ContentHandler {
Stack stack = new Stack();
stack.push(existing);
stack.push(var);
- _variableScope.put(var.getName(), stack);
+ _variableScope.put(var.getName().getStringRep(), stack);
}
}
else {
- _variableScope.put(var.getName(), var);
+ _variableScope.put(var.getName().getStringRep(), var);
}
}
public void removeVariable(QName name) {
- Object existing = _variableScope.get(name);
+ Object existing = _variableScope.get(name.getStringRep());
if (existing instanceof Stack) {
Stack stack = (Stack)existing;
if (!stack.isEmpty()) stack.pop();
if (!stack.isEmpty()) return;
}
- _variableScope.remove(name);
+ _variableScope.remove(name.getStringRep());
}
public VariableBase lookupVariable(QName name) {
- Object existing = _variableScope.get(name);
+ Object existing = _variableScope.get(name.getStringRep());
if (existing instanceof VariableBase) {
return((VariableBase)existing);
}
@@ -305,7 +306,7 @@ public class Parser implements Constants, ContentHandler {
public QName getQName(String namespace, String prefix, String localname) {
if (namespace == null || namespace.equals(EMPTYSTRING)) {
- QName name = (QName)_qNames.get(localname);
+ QName name = _qNames.get(localname);
if (name == null) {
name = new QName(null, prefix, localname);
_qNames.put(localname, name);
@@ -313,7 +314,7 @@ public class Parser implements Constants, ContentHandler {
return name;
}
else {
- Dictionary space = (Dictionary)_namespaces.get(namespace);
+ Map space = _namespaces.get(namespace);
String lexicalQName =
(prefix == null || prefix.length() == 0)
? localname
@@ -321,12 +322,12 @@ public class Parser implements Constants, ContentHandler {
if (space == null) {
final QName name = new QName(namespace, prefix, localname);
- _namespaces.put(namespace, space = new Hashtable());
+ _namespaces.put(namespace, space = new HashMap<>());
space.put(lexicalQName, name);
return name;
}
else {
- QName name = (QName)space.get(lexicalQName);
+ QName name = space.get(lexicalQName);
if (name == null) {
name = new QName(namespace, prefix, localname);
space.put(lexicalQName, name);
@@ -397,9 +398,9 @@ public class Parser implements Constants, ContentHandler {
if (stylesheet != null) {
stylesheet.parseContents(this);
final int precedence = stylesheet.getImportPrecedence();
- final Enumeration elements = stylesheet.elements();
- while (elements.hasMoreElements()) {
- Object child = elements.nextElement();
+ final Iterator elements = stylesheet.elements();
+ while (elements.hasNext()) {
+ Object child = elements.next();
if (child instanceof Text) {
final int l = getLineNumber();
ErrorMsg err =
@@ -609,11 +610,11 @@ public class Parser implements Constants, ContentHandler {
String id = root.getAttribute("id");
if (id.equals(href)) return root;
}
- Vector children = root.getContents();
+ List children = root.getContents();
if (children != null) {
final int count = children.size();
for (int i = 0; i < count; i++) {
- SyntaxTreeNode child = (SyntaxTreeNode)children.elementAt(i);
+ SyntaxTreeNode child = children.get(i);
SyntaxTreeNode node = findStylesheet(child, href);
if (node != null) return node;
}
@@ -640,7 +641,7 @@ public class Parser implements Constants, ContentHandler {
}
private void initAttrTable(String elementName, String[] attrs) {
- _instructionAttrs.put(getQName(XSLT_URI, XSL, elementName),
+ _instructionAttrs.put(getQName(XSLT_URI, XSL, elementName).getStringRep(),
attrs);
}
@@ -704,7 +705,7 @@ public class Parser implements Constants, ContentHandler {
/**
- * Initialize the _instructionClasses Hashtable, which maps XSL element
+ * Initialize the _instructionClasses map, which maps XSL element
* names to Java classes in this package.
*/
private void initStdClasses() {
@@ -746,12 +747,12 @@ public class Parser implements Constants, ContentHandler {
}
private void initStdClass(String elementName, String className) {
- _instructionClasses.put(getQName(XSLT_URI, XSL, elementName),
+ _instructionClasses.put(getQName(XSLT_URI, XSL, elementName).getStringRep(),
COMPILER_PACKAGE + '.' + className);
}
public boolean elementSupported(String namespace, String localName) {
- return(_instructionClasses.get(getQName(namespace, XSL, localName)) != null);
+ return(_instructionClasses.get(getQName(namespace, XSL, localName).getStringRep()) != null);
}
public boolean functionSupported(String fname) {
@@ -764,12 +765,12 @@ public class Parser implements Constants, ContentHandler {
}
private void initExtClass(String elementName, String className) {
- _instructionClasses.put(getQName(TRANSLET_URI, TRANSLET, elementName),
+ _instructionClasses.put(getQName(TRANSLET_URI, TRANSLET, elementName).getStringRep(),
COMPILER_PACKAGE + '.' + className);
}
private void initExtClass(String namespace, String elementName, String className) {
- _instructionClasses.put(getQName(namespace, TRANSLET, elementName),
+ _instructionClasses.put(getQName(namespace, TRANSLET, elementName).getStringRep(),
COMPILER_PACKAGE + '.' + className);
}
@@ -969,7 +970,7 @@ public class Parser implements Constants, ContentHandler {
{
SyntaxTreeNode node = null;
QName qname = getQName(uri, prefix, local);
- String className = (String)_instructionClasses.get(qname);
+ String className = _instructionClasses.get(qname.getStringRep());
if (className != null) {
try {
@@ -1052,7 +1053,7 @@ public class Parser implements Constants, ContentHandler {
{
QName qname = node.getQName();
boolean isStylesheet = (node instanceof Stylesheet);
- String[] legal = (String[]) _instructionAttrs.get(qname);
+ String[] legal = _instructionAttrs.get(qname.getStringRep());
if (versionIsOne && legal != null) {
int j;
final int n = attrs.getLength();
@@ -1250,7 +1251,7 @@ public class Parser implements Constants, ContentHandler {
/************************ SAX2 ContentHandler INTERFACE *****************/
private Stack _parentStack = null;
- private Hashtable _prefixMapping = null;
+ private Map _prefixMapping = null;
/**
* SAX2: Receive notification of the beginning of a document.
@@ -1274,7 +1275,7 @@ public class Parser implements Constants, ContentHandler {
*/
public void startPrefixMapping(String prefix, String uri) {
if (_prefixMapping == null) {
- _prefixMapping = new Hashtable();
+ _prefixMapping = new HashMap<>();
}
_prefixMapping.put(prefix, uri);
}
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java
index 2c244e151eb..539e17fdfa4 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/Stylesheet.java
@@ -1,15 +1,15 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -23,14 +23,6 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.util.Vector;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import com.sun.org.apache.xml.internal.utils.SystemIDResolver;
import com.sun.org.apache.bcel.internal.generic.ANEWARRAY;
import com.sun.org.apache.bcel.internal.generic.BasicType;
import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
@@ -59,6 +51,14 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTM;
+import com.sun.org.apache.xml.internal.utils.SystemIDResolver;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.Vector;
/**
* @author Jacek Ambroziak
@@ -121,7 +121,7 @@ public final class Stylesheet extends SyntaxTreeNode {
/**
* Mapping between mode names and Mode instances.
*/
- private final Hashtable _modes = new Hashtable();
+ private final Map _modes = new HashMap<>();
/**
* A reference to the default Mode object.
@@ -131,7 +131,7 @@ public final class Stylesheet extends SyntaxTreeNode {
/**
* Mapping between extension URIs and their prefixes.
*/
- private final Hashtable _extensions = new Hashtable();
+ private final Map _extensions = new HashMap<>();
/**
* Reference to the stylesheet from which this stylesheet was
@@ -164,7 +164,7 @@ public final class Stylesheet extends SyntaxTreeNode {
/**
* Mapping between key names and Key objects (needed by Key/IdPattern).
*/
- private Hashtable _keys = new Hashtable();
+ private Map _keys = new HashMap<>();
/**
* A reference to the SourceLoader set by the user (a URIResolver
@@ -323,9 +323,9 @@ public final class Stylesheet extends SyntaxTreeNode {
_importPrecedence = precedence;
// Set import precedence for all included stylesheets
- final Enumeration elements = elements();
- while (elements.hasMoreElements()) {
- SyntaxTreeNode child = (SyntaxTreeNode)elements.nextElement();
+ final Iterator elements = elements();
+ while (elements.hasNext()) {
+ SyntaxTreeNode child = elements.next();
if (child instanceof Include) {
Stylesheet included = ((Include)child).getIncludedStylesheet();
if (included != null && included._includedFrom == this) {
@@ -573,13 +573,13 @@ public final class Stylesheet extends SyntaxTreeNode {
stable.excludeNamespaces(excludePrefixes);
stable.excludeNamespaces(extensionPrefixes);
- final Vector contents = getContents();
+ final List contents = getContents();
final int count = contents.size();
// We have to scan the stylesheet element's top-level elements for
// variables and/or parameters before we parse the other elements
for (int i = 0; i < count; i++) {
- SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);
+ SyntaxTreeNode child = contents.get(i);
if ((child instanceof VariableBase) ||
(child instanceof NamespaceAlias)) {
parser.getSymbolTable().setCurrentNode(child);
@@ -589,7 +589,7 @@ public final class Stylesheet extends SyntaxTreeNode {
// Now go through all the other top-level elements...
for (int i = 0; i < count; i++) {
- SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);
+ SyntaxTreeNode child = contents.get(i);
if (!(child instanceof VariableBase) &&
!(child instanceof NamespaceAlias)) {
parser.getSymbolTable().setCurrentNode(child);
@@ -612,20 +612,16 @@ public final class Stylesheet extends SyntaxTreeNode {
if (_defaultMode == null)
_defaultMode = new Mode(null, this, Constants.EMPTYSTRING);
_defaultMode.processPatterns(_keys);
- final Enumeration modes = _modes.elements();
- while (modes.hasMoreElements()) {
- final Mode mode = (Mode)modes.nextElement();
+ _modes.values().stream().forEach((mode) -> {
mode.processPatterns(_keys);
- }
+ });
}
private void compileModes(ClassGenerator classGen) {
_defaultMode.compileApplyTemplates(classGen);
- final Enumeration modes = _modes.elements();
- while (modes.hasMoreElements()) {
- final Mode mode = (Mode)modes.nextElement();
+ _modes.values().stream().forEach((mode) -> {
mode.compileApplyTemplates(classGen);
- }
+ });
}
public Mode getMode(QName modeName) {
@@ -636,10 +632,10 @@ public final class Stylesheet extends SyntaxTreeNode {
return _defaultMode;
}
else {
- Mode mode = (Mode)_modes.get(modeName);
+ Mode mode = _modes.get(modeName.getStringRep());
if (mode == null) {
final String suffix = Integer.toString(_nextModeSerial++);
- _modes.put(modeName, mode = new Mode(modeName, this, suffix));
+ _modes.put(modeName.getStringRep(), mode = new Mode(modeName, this, suffix));
}
return mode;
}
@@ -707,9 +703,9 @@ public final class Stylesheet extends SyntaxTreeNode {
compileTransform(classGen);
// Translate all non-template elements and filter out all templates
- final Enumeration elements = elements();
- while (elements.hasMoreElements()) {
- Object element = elements.nextElement();
+ final Iterator elements = elements();
+ while (elements.hasNext()) {
+ SyntaxTreeNode element = elements.next();
// xsl:template
if (element instanceof Template) {
// Separate templates by modes
@@ -1054,9 +1050,9 @@ public final class Stylesheet extends SyntaxTreeNode {
// Create a new list containing variables/params + keys
Vector varDepElements = new Vector(_globals);
- Enumeration elements = elements();
- while (elements.hasMoreElements()) {
- final Object element = elements.nextElement();
+ Iterator elements = elements();
+ while (elements.hasNext()) {
+ SyntaxTreeNode element = elements.next();
if (element instanceof Key) {
varDepElements.add(element);
}
@@ -1079,8 +1075,8 @@ public final class Stylesheet extends SyntaxTreeNode {
// Compile code for other top-level elements
Vector whitespaceRules = new Vector();
elements = elements();
- while (elements.hasMoreElements()) {
- final Object element = elements.nextElement();
+ while (elements.hasNext()) {
+ SyntaxTreeNode element = elements.next();
// xsl:decimal-format
if (element instanceof DecimalFormatting) {
((DecimalFormatting)element).translate(classGen,toplevel);
@@ -1198,10 +1194,10 @@ public final class Stylesheet extends SyntaxTreeNode {
buildKeys.addException("com.sun.org.apache.xalan.internal.xsltc.TransletException");
- final Enumeration elements = elements();
- while (elements.hasMoreElements()) {
+ final Iterator elements = elements();
+ while (elements.hasNext()) {
// xsl:key
- final Object element = elements.nextElement();
+ final SyntaxTreeNode element = elements.next();
if (element instanceof Key) {
final Key key = (Key)element;
key.translate(classGen, buildKeys);
@@ -1325,8 +1321,8 @@ public final class Stylesheet extends SyntaxTreeNode {
"buildKeys", keySig);
// Look for top-level elements that need handling
- final Enumeration toplevel = elements();
- if (_globals.size() > 0 || toplevel.hasMoreElements()) {
+ final Iterator toplevel = elements();
+ if (_globals.size() > 0 || toplevel.hasNext()) {
// Compile method for handling top-level elements
final String topLevelSig = compileTopLevel(classGen);
// Get a reference to that method
diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SymbolTable.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SymbolTable.java
index 9a59fe26731..dfb95b71f95 100644
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SymbolTable.java
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/SymbolTable.java
@@ -1,13 +1,13 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
/*
- * Copyright 2001-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -23,13 +23,13 @@
package com.sun.org.apache.xalan.internal.xsltc.compiler;
-import java.util.Hashtable;
+import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodType;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.Vector;
-import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodType;
-
/**
* @author Jacek Ambroziak
* @author Santiago Pericas-Geertsen
@@ -37,67 +37,67 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodType;
*/
final class SymbolTable {
- // These hashtables are used for all stylesheets
- private final Hashtable _stylesheets = new Hashtable();
- private final Hashtable _primops = new Hashtable();
+ // These maps are used for all stylesheets
+ private final Map _stylesheets = new HashMap<>();
+ private final Map _primops = new HashMap<>();
- // These hashtables are used for some stylesheets
- private Hashtable _variables = null;
- private Hashtable _templates = null;
- private Hashtable _attributeSets = null;
- private Hashtable _aliases = null;
- private Hashtable _excludedURI = null;
- private Stack _excludedURIStack = null;
- private Hashtable _decimalFormats = null;
- private Hashtable _keys = null;
+ // These maps are used for some stylesheets
+ private Map _variables = null;
+ private Map _templates = null;
+ private Map _attributeSets = null;
+ private Map _aliases = null;
+ private Map _excludedURI = null;
+ private Stack