Mercurial > hg > jdk9-shenandoah > langtools
changeset 2944:fd782cd69b04 jdk9-b67
Merge
author | lana |
---|---|
date | Thu, 28 May 2015 16:54:56 -0700 |
parents | a3f6beca1df2 (current diff) f4bb7061c8d5 (diff) |
children | d9dc9de88b62 e72b28547e96 |
files | make/gensrc/Gensrc-jdk.dev.gmk src/jdk.compiler/share/classes/com/sun/tools/classfile/AccessFlags.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Annotation.java src/jdk.compiler/share/classes/com/sun/tools/classfile/AnnotationDefault_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/AttributeException.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Attributes.java src/jdk.compiler/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/CharacterRangeTable_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassFile.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassReader.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassTranslator.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassWriter.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Code_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/CompilationID_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPool.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPoolException.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantValue_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/DefaultAttribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependencies.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependency.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Deprecated_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Descriptor.java src/jdk.compiler/share/classes/com/sun/tools/classfile/DescriptorException.java src/jdk.compiler/share/classes/com/sun/tools/classfile/EnclosingMethod_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Exceptions_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Field.java src/jdk.compiler/share/classes/com/sun/tools/classfile/InnerClasses_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Instruction.java src/jdk.compiler/share/classes/com/sun/tools/classfile/LineNumberTable_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTable_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTypeTable_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Method.java src/jdk.compiler/share/classes/com/sun/tools/classfile/MethodParameters_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Opcode.java src/jdk.compiler/share/classes/com/sun/tools/classfile/ReferenceFinder.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleParameterAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleTypeAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeParameterAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeTypeAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleParameterAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleTypeAnnotations_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceFile_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceID_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMap_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Synthetic_attribute.java src/jdk.compiler/share/classes/com/sun/tools/classfile/Type.java src/jdk.compiler/share/classes/com/sun/tools/classfile/TypeAnnotation.java src/jdk.compiler/share/classes/com/sun/tools/classfile/package-info.java src/jdk.compiler/share/classes/com/sun/tools/javap/AnnotationWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/AttributeWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/BasicWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/ClassWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/CodeWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/ConstantWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/Context.java src/jdk.compiler/share/classes/com/sun/tools/javap/DisassemblerTool.java src/jdk.compiler/share/classes/com/sun/tools/javap/InstructionDetailWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/InternalError.java src/jdk.compiler/share/classes/com/sun/tools/javap/JavapFileManager.java src/jdk.compiler/share/classes/com/sun/tools/javap/JavapTask.java src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTableWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTypeTableWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/Main.java src/jdk.compiler/share/classes/com/sun/tools/javap/Messages.java src/jdk.compiler/share/classes/com/sun/tools/javap/Options.java src/jdk.compiler/share/classes/com/sun/tools/javap/SourceWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/StackMapWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/TryBlockWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java src/jdk.compiler/share/classes/com/sun/tools/javap/overview.html src/jdk.compiler/share/classes/com/sun/tools/javap/package-info.java src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap.properties src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_ja.properties src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties src/jdk.compiler/share/classes/com/sun/tools/javap/resources/version.properties-template src/jdk.dev/share/classes/com/sun/tools/jdeps/Analyzer.java src/jdk.dev/share/classes/com/sun/tools/jdeps/Archive.java src/jdk.dev/share/classes/com/sun/tools/jdeps/ClassFileReader.java src/jdk.dev/share/classes/com/sun/tools/jdeps/JdepsTask.java src/jdk.dev/share/classes/com/sun/tools/jdeps/Main.java src/jdk.dev/share/classes/com/sun/tools/jdeps/Module.java src/jdk.dev/share/classes/com/sun/tools/jdeps/ModulesXmlReader.java src/jdk.dev/share/classes/com/sun/tools/jdeps/PlatformClassPath.java src/jdk.dev/share/classes/com/sun/tools/jdeps/Profile.java src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps.properties src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdkinternals.properties src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/version.properties-template |
diffstat | 421 files changed, 19502 insertions(+), 18546 deletions(-) [+] |
line wrap: on
line diff
--- a/make/CompileInterim.gmk Thu May 28 16:13:55 2015 -0700 +++ b/make/CompileInterim.gmk Thu May 28 16:54:56 2015 -0700 @@ -41,11 +41,11 @@ DISABLE_SJAVAC := true, \ SRC := $(LANGTOOLS_TOPDIR)/src/java.compiler/share/classes \ $(LANGTOOLS_TOPDIR)/src/jdk.compiler/share/classes \ - $(LANGTOOLS_TOPDIR)/src/jdk.dev/share/classes \ $(LANGTOOLS_TOPDIR)/src/jdk.javadoc/share/classes \ + $(LANGTOOLS_TOPDIR)/src/jdk.jdeps/share/classes \ $(SUPPORT_OUTPUTDIR)/gensrc/jdk.compiler \ - $(SUPPORT_OUTPUTDIR)/gensrc/jdk.dev \ - $(SUPPORT_OUTPUTDIR)/gensrc/jdk.javadoc, \ + $(SUPPORT_OUTPUTDIR)/gensrc/jdk.javadoc \ + $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdeps, \ EXCLUDES := sun jdk, \ COPY := .gif .xml .css .js javax.tools.JavaCompilerTool, \ BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_interim_classes, \
--- a/make/build.properties Thu May 28 16:13:55 2015 -0700 +++ b/make/build.properties Thu May 28 16:54:56 2015 -0700 @@ -47,11 +47,11 @@ boot.javac.target = 8 #configuration of submodules (share by both the bootstrap and normal compilation): -langtools.modules=java.compiler:jdk.compiler:jdk.dev:jdk.javadoc +langtools.modules=java.compiler:jdk.compiler:jdk.jdeps:jdk.javadoc java.compiler.dependencies= jdk.compiler.dependencies=java.compiler jdk.javadoc.dependencies=java.compiler:jdk.compiler -jdk.dev.dependencies=java.compiler:jdk.compiler +jdk.jdeps.dependencies=java.compiler:jdk.compiler javac.resource.includes = \ com/sun/tools/javac/resources/compiler.properties
--- a/make/build.xml Thu May 28 16:13:55 2015 -0700 +++ b/make/build.xml Thu May 28 16:54:56 2015 -0700 @@ -257,7 +257,7 @@ <class location="${build.dir}/java.compiler/classes"/> <class location="${build.dir}/jdk.compiler/classes"/> <class location="${build.dir}/jdk.javadoc/classes"/> - <class location="${build.dir}/jdk.dev/classes"/> + <class location="${build.dir}/jdk.jdeps/classes"/> <sourcePath> <pathelement path="${langtools.sources}"/> </sourcePath> @@ -463,7 +463,7 @@ <build-module-jar module.name="java.compiler" compilation.kind="@{compilation.kind}" /> <build-module-jar module.name="jdk.compiler" compilation.kind="@{compilation.kind}" /> <build-module-jar module.name="jdk.javadoc" compilation.kind="@{compilation.kind}" /> - <build-module-jar module.name="jdk.dev" compilation.kind="@{compilation.kind}" /> + <build-module-jar module.name="jdk.jdeps" compilation.kind="@{compilation.kind}" /> </sequential> </macrodef> </target> @@ -527,7 +527,7 @@ resource.includes="${javac.resource.includes}" /> <build-module-classes module.name="jdk.javadoc" compilation.kind="@{compilation.kind}" /> - <build-module-classes module.name="jdk.dev" + <build-module-classes module.name="jdk.jdeps" compilation.kind="@{compilation.kind}" /> </sequential> </macrodef>
--- a/make/gensrc/Gensrc-jdk.compiler.gmk Thu May 28 16:13:55 2015 -0700 +++ b/make/gensrc/Gensrc-jdk.compiler.gmk Thu May 28 16:54:56 2015 -0700 @@ -31,11 +31,8 @@ $(eval $(call SetupVersionProperties,JAVAH_VERSION, \ com/sun/tools/javah/resources/version.properties)) -$(eval $(call SetupVersionProperties,JAVAP_VERSION, \ - com/sun/tools/javap/resources/version.properties)) - $(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \ - $(JAVAC_VERSION) $(JAVAH_VERSION) $(JAVAP_VERSION))) + $(JAVAC_VERSION) $(JAVAH_VERSION))) $(eval $(call SetupParseProperties,PARSE_PROPERTIES, \ com/sun/tools/javac/resources/compiler.properties))
--- a/make/gensrc/Gensrc-jdk.dev.gmk Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -# -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -include GensrcCommon.gmk - -$(eval $(call SetupVersionProperties,JDEPS_VERSION,\ - com/sun/tools/jdeps/resources/version.properties)) - -$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, $(JDEPS_VERSION))) - -all: $(COMPILE_PROPERTIES)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/gensrc/Gensrc-jdk.jdeps.gmk Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,37 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include GensrcCommon.gmk + +$(eval $(call SetupVersionProperties,JAVAP_VERSION, \ + com/sun/tools/javap/resources/version.properties)) + +$(eval $(call SetupVersionProperties,JDEPS_VERSION,\ + com/sun/tools/jdeps/resources/version.properties)) + +$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES,\ + $(JDEPS_VERSION) $(JAVAP_VERSION))) + +all: $(COMPILE_PROPERTIES)
--- a/make/intellij/langtools.iml Thu May 28 16:13:55 2015 -0700 +++ b/make/intellij/langtools.iml Thu May 28 16:54:56 2015 -0700 @@ -6,13 +6,13 @@ <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src/java.compiler/share/classes" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/jdk.compiler/share/classes" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/src/jdk.dev/share/classes" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/jdk.javadoc/share/classes" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/src/jdk.jdeps/share/classes" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/build/bootstrap/java.compiler/gensrc" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/bootstrap/jdk.compiler/gensrc" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/build/bootstrap/jdk.dev/gensrc" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/bootstrap/jdk.javadoc/gensrc" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/build/bootstrap/jdk.jdeps/gensrc" isTestSource="false" /> </content> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="inheritedJdk" />
--- a/make/intellij/workspace.xml Thu May 28 16:13:55 2015 -0700 +++ b/make/intellij/workspace.xml Thu May 28 16:54:56 2015 -0700 @@ -10,7 +10,7 @@ <!-- standard tools --> <configuration default="false" name="javac" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.javac.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> @@ -29,7 +29,7 @@ </configuration> <configuration default="false" name="javadoc" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.javadoc.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> @@ -48,7 +48,7 @@ </configuration> <configuration default="false" name="javap" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.javap.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> @@ -67,7 +67,7 @@ </configuration> <configuration default="false" name="javah" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.javah.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> @@ -86,7 +86,7 @@ </configuration> <configuration default="false" name="sjavac" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.sjavac.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" /> @@ -106,7 +106,7 @@ <!-- bootstrap javac --> <configuration default="false" name="javac (bootstrap)" type="Application" factoryName="Application"> <option name="MAIN_CLASS_NAME" value="com.sun.tools.javac.Main" /> - <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@bootstrap@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.dev@FILE_SEP@classes" /> + <option name="VM_PARAMETERS" value="-Xbootclasspath/p:build@FILE_SEP@bootstrap@FILE_SEP@java.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.compiler@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.javadoc@FILE_SEP@classes@PATH_SEP@build@FILE_SEP@bootstrap@FILE_SEP@jdk.jdeps@FILE_SEP@classes" /> <option name="PROGRAM_PARAMETERS" value="" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
--- a/make/netbeans/langtools/nbproject/project.xml Thu May 28 16:13:55 2015 -0700 +++ b/make/netbeans/langtools/nbproject/project.xml Thu May 28 16:54:56 2015 -0700 @@ -67,9 +67,9 @@ <location>${root}/src/jdk.compiler/share/classes</location> </source-folder> <source-folder> - <label>Source files - jdk.dev</label> + <label>Source files - jdk.jdeps</label> <type>java</type> - <location>${root}/src/jdk.dev/share/classes</location> + <location>${root}/src/jdk.jdeps/share/classes</location> </source-folder> <source-folder> <label>Source files - jdk.javadoc</label> @@ -128,10 +128,10 @@ </action> <action name="compile.single"> <target>compile-single</target> - <property name="module.name">jdk.dev</property> + <property name="module.name">jdk.jdeps</property> <context> <property>includes</property> - <folder>${root}/src/jdk.dev/share/classes</folder> + <folder>${root}/src/jdk.jdeps/share/classes</folder> <pattern>\.java$</pattern> <format>relative-path</format> <arity> @@ -195,7 +195,7 @@ <target>run-single</target> <context> <property>run.classname</property> - <folder>${root}/src/jdk.dev/share/classes</folder> + <folder>${root}/src/jdk.jdeps/share/classes</folder> <pattern>\.java$</pattern> <format>java-name</format> <arity> @@ -265,7 +265,7 @@ <target>debug-single</target> <context> <property>debug.classname</property> - <folder>${root}/src/jdk.dev/share/classes</folder> + <folder>${root}/src/jdk.jdeps/share/classes</folder> <pattern>\.java$</pattern> <format>java-name</format> <arity> @@ -329,10 +329,10 @@ </action> <action name="debug.fix"> <target>debug-fix</target> - <property name="module.name">jdk.dev</property> + <property name="module.name">jdk.jdeps</property> <context> <property>class</property> - <folder>${root}/src/jdk.dev/share/classes</folder> + <folder>${root}/src/jdk.jdeps/share/classes</folder> <pattern>\.java$</pattern> <format>relative-path-noext</format> <arity> @@ -382,8 +382,8 @@ <location>${root}/src/jdk.compiler/share/classes</location> </source-folder> <source-folder style="tree"> - <label>Source files - jdk.dev</label> - <location>${root}/src/jdk.dev/share/classes</location> + <label>Source files - jdk.jdeps</label> + <location>${root}/src/jdk.jdeps/share/classes</location> </source-folder> <source-folder style="tree"> <label>Source files - jdk.javadoc</label> @@ -443,10 +443,10 @@ <source-level>1.8</source-level> </compilation-unit> <compilation-unit> - <package-root>${root}/src/jdk.dev/share/classes</package-root> - <package-root>${root}/build/bootstrap/jdk.dev/gensrc</package-root> + <package-root>${root}/src/jdk.jdeps/share/classes</package-root> + <package-root>${root}/build/bootstrap/jdk.jdeps/gensrc</package-root> <classpath mode="compile">${root}/build/java.compiler/classes:${root}/build/jdk.compiler/classes</classpath> - <built-to>${root}/build/jdk.dev/classes</built-to> + <built-to>${root}/build/jdk.jdeps/classes</built-to> <source-level>1.8</source-level> </compilation-unit> <compilation-unit>
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/AccessFlags.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,258 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; -import java.util.LinkedHashSet; -import java.util.Set; - -/** - * See JVMS, sections 4.2, 4.6, 4.7. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class AccessFlags { - public static final int ACC_PUBLIC = 0x0001; // class, inner, field, method - public static final int ACC_PRIVATE = 0x0002; // inner, field, method - public static final int ACC_PROTECTED = 0x0004; // inner, field, method - public static final int ACC_STATIC = 0x0008; // inner, field, method - public static final int ACC_FINAL = 0x0010; // class, inner, field, method - public static final int ACC_SUPER = 0x0020; // class - public static final int ACC_SYNCHRONIZED = 0x0020; // method - public static final int ACC_VOLATILE = 0x0040; // field - public static final int ACC_BRIDGE = 0x0040; // method - public static final int ACC_TRANSIENT = 0x0080; // field - public static final int ACC_VARARGS = 0x0080; // method - public static final int ACC_NATIVE = 0x0100; // method - public static final int ACC_INTERFACE = 0x0200; // class, inner - public static final int ACC_ABSTRACT = 0x0400; // class, inner, method - public static final int ACC_STRICT = 0x0800; // method - public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method - public static final int ACC_ANNOTATION = 0x2000; // class, inner - public static final int ACC_ENUM = 0x4000; // class, inner, field - public static final int ACC_MANDATED = 0x8000; // class, inner, field, method - - public static enum Kind { Class, InnerClass, Field, Method} - - AccessFlags(ClassReader cr) throws IOException { - this(cr.readUnsignedShort()); - } - - public AccessFlags(int flags) { - this.flags = flags; - } - - public AccessFlags ignore(int mask) { - return new AccessFlags(flags & ~mask); - } - - public boolean is(int mask) { - return (flags & mask) != 0; - } - - public int byteLength() { - return 2; - } - - private static final int[] classModifiers = { - ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT - }; - - private static final int[] classFlags = { - ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, ACC_ABSTRACT, - ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM - }; - - public Set<String> getClassModifiers() { - int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); - return getModifiers(f, classModifiers, Kind.Class); - } - - public Set<String> getClassFlags() { - return getFlags(classFlags, Kind.Class); - } - - private static final int[] innerClassModifiers = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, - ACC_ABSTRACT - }; - - private static final int[] innerClassFlags = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SUPER, - ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM - }; - - public Set<String> getInnerClassModifiers() { - int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); - return getModifiers(f, innerClassModifiers, Kind.InnerClass); - } - - public Set<String> getInnerClassFlags() { - return getFlags(innerClassFlags, Kind.InnerClass); - } - - private static final int[] fieldModifiers = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, - ACC_VOLATILE, ACC_TRANSIENT - }; - - private static final int[] fieldFlags = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, - ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM - }; - - public Set<String> getFieldModifiers() { - return getModifiers(fieldModifiers, Kind.Field); - } - - public Set<String> getFieldFlags() { - return getFlags(fieldFlags, Kind.Field); - } - - private static final int[] methodModifiers = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, - ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT - }; - - private static final int[] methodFlags = { - ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, - ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, - ACC_STRICT, ACC_SYNTHETIC - }; - - public Set<String> getMethodModifiers() { - return getModifiers(methodModifiers, Kind.Method); - } - - public Set<String> getMethodFlags() { - return getFlags(methodFlags, Kind.Method); - } - - private Set<String> getModifiers(int[] modifierFlags, Kind t) { - return getModifiers(flags, modifierFlags, t); - } - - private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) { - Set<String> s = new LinkedHashSet<>(); - for (int m: modifierFlags) { - if ((flags & m) != 0) - s.add(flagToModifier(m, t)); - } - return s; - } - - private Set<String> getFlags(int[] expectedFlags, Kind t) { - Set<String> s = new LinkedHashSet<>(); - int f = flags; - for (int e: expectedFlags) { - if ((f & e) != 0) { - s.add(flagToName(e, t)); - f = f & ~e; - } - } - while (f != 0) { - int bit = Integer.highestOneBit(f); - s.add("0x" + Integer.toHexString(bit)); - f = f & ~bit; - } - return s; - } - - private static String flagToModifier(int flag, Kind t) { - switch (flag) { - case ACC_PUBLIC: - return "public"; - case ACC_PRIVATE: - return "private"; - case ACC_PROTECTED: - return "protected"; - case ACC_STATIC: - return "static"; - case ACC_FINAL: - return "final"; - case ACC_SYNCHRONIZED: - return "synchronized"; - case 0x80: - return (t == Kind.Field ? "transient" : null); - case ACC_VOLATILE: - return "volatile"; - case ACC_NATIVE: - return "native"; - case ACC_ABSTRACT: - return "abstract"; - case ACC_STRICT: - return "strictfp"; - case ACC_MANDATED: - return "mandated"; - default: - return null; - } - } - - private static String flagToName(int flag, Kind t) { - switch (flag) { - case ACC_PUBLIC: - return "ACC_PUBLIC"; - case ACC_PRIVATE: - return "ACC_PRIVATE"; - case ACC_PROTECTED: - return "ACC_PROTECTED"; - case ACC_STATIC: - return "ACC_STATIC"; - case ACC_FINAL: - return "ACC_FINAL"; - case 0x20: - return (t == Kind.Class ? "ACC_SUPER" : "ACC_SYNCHRONIZED"); - case 0x40: - return (t == Kind.Field ? "ACC_VOLATILE" : "ACC_BRIDGE"); - case 0x80: - return (t == Kind.Field ? "ACC_TRANSIENT" : "ACC_VARARGS"); - case ACC_NATIVE: - return "ACC_NATIVE"; - case ACC_INTERFACE: - return "ACC_INTERFACE"; - case ACC_ABSTRACT: - return "ACC_ABSTRACT"; - case ACC_STRICT: - return "ACC_STRICT"; - case ACC_SYNTHETIC: - return "ACC_SYNTHETIC"; - case ACC_ANNOTATION: - return "ACC_ANNOTATION"; - case ACC_ENUM: - return "ACC_ENUM"; - case ACC_MANDATED: - return "ACC_MANDATED"; - default: - return null; - } - } - - public final int flags; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Annotation.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.16. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Annotation { - static class InvalidAnnotation extends AttributeException { - private static final long serialVersionUID = -4620480740735772708L; - InvalidAnnotation(String msg) { - super(msg); - } - } - - Annotation(ClassReader cr) throws IOException, InvalidAnnotation { - type_index = cr.readUnsignedShort(); - num_element_value_pairs = cr.readUnsignedShort(); - element_value_pairs = new element_value_pair[num_element_value_pairs]; - for (int i = 0; i < element_value_pairs.length; i++) - element_value_pairs[i] = new element_value_pair(cr); - } - - public Annotation(ConstantPool constant_pool, - int type_index, - element_value_pair[] element_value_pairs) { - this.type_index = type_index; - num_element_value_pairs = element_value_pairs.length; - this.element_value_pairs = element_value_pairs; - } - - public int length() { - int n = 2 /*type_index*/ + 2 /*num_element_value_pairs*/; - for (element_value_pair pair: element_value_pairs) - n += pair.length(); - return n; - } - - public final int type_index; - public final int num_element_value_pairs; - public final element_value_pair element_value_pairs[]; - - /** - * See JVMS, section 4.8.16.1. - */ - public static abstract class element_value { - public static element_value read(ClassReader cr) - throws IOException, InvalidAnnotation { - int tag = cr.readUnsignedByte(); - switch (tag) { - case 'B': - case 'C': - case 'D': - case 'F': - case 'I': - case 'J': - case 'S': - case 'Z': - case 's': - return new Primitive_element_value(cr, tag); - - case 'e': - return new Enum_element_value(cr, tag); - - case 'c': - return new Class_element_value(cr, tag); - - case '@': - return new Annotation_element_value(cr, tag); - - case '[': - return new Array_element_value(cr, tag); - - default: - throw new InvalidAnnotation("unrecognized tag: " + tag); - } - } - - protected element_value(int tag) { - this.tag = tag; - } - - public abstract int length(); - - public abstract <R,P> R accept(Visitor<R,P> visitor, P p); - - public interface Visitor<R,P> { - R visitPrimitive(Primitive_element_value ev, P p); - R visitEnum(Enum_element_value ev, P p); - R visitClass(Class_element_value ev, P p); - R visitAnnotation(Annotation_element_value ev, P p); - R visitArray(Array_element_value ev, P p); - } - - public final int tag; - } - - public static class Primitive_element_value extends element_value { - Primitive_element_value(ClassReader cr, int tag) throws IOException { - super(tag); - const_value_index = cr.readUnsignedShort(); - } - - @Override - public int length() { - return 2; - } - - public <R,P> R accept(Visitor<R,P> visitor, P p) { - return visitor.visitPrimitive(this, p); - } - - public final int const_value_index; - - } - - public static class Enum_element_value extends element_value { - Enum_element_value(ClassReader cr, int tag) throws IOException { - super(tag); - type_name_index = cr.readUnsignedShort(); - const_name_index = cr.readUnsignedShort(); - } - - @Override - public int length() { - return 4; - } - - public <R,P> R accept(Visitor<R,P> visitor, P p) { - return visitor.visitEnum(this, p); - } - - public final int type_name_index; - public final int const_name_index; - } - - public static class Class_element_value extends element_value { - Class_element_value(ClassReader cr, int tag) throws IOException { - super(tag); - class_info_index = cr.readUnsignedShort(); - } - - @Override - public int length() { - return 2; - } - - public <R,P> R accept(Visitor<R,P> visitor, P p) { - return visitor.visitClass(this, p); - } - - public final int class_info_index; - } - - public static class Annotation_element_value extends element_value { - Annotation_element_value(ClassReader cr, int tag) - throws IOException, InvalidAnnotation { - super(tag); - annotation_value = new Annotation(cr); - } - - @Override - public int length() { - return annotation_value.length(); - } - - public <R,P> R accept(Visitor<R,P> visitor, P p) { - return visitor.visitAnnotation(this, p); - } - - public final Annotation annotation_value; - } - - public static class Array_element_value extends element_value { - Array_element_value(ClassReader cr, int tag) - throws IOException, InvalidAnnotation { - super(tag); - num_values = cr.readUnsignedShort(); - values = new element_value[num_values]; - for (int i = 0; i < values.length; i++) - values[i] = element_value.read(cr); - } - - @Override - public int length() { - int n = 2; - for (int i = 0; i < values.length; i++) - n += values[i].length(); - return n; - } - - public <R,P> R accept(Visitor<R,P> visitor, P p) { - return visitor.visitArray(this, p); - } - - public final int num_values; - public final element_value[] values; - } - - public static class element_value_pair { - element_value_pair(ClassReader cr) - throws IOException, InvalidAnnotation { - element_name_index = cr.readUnsignedShort(); - value = element_value.read(cr); - } - - public int length() { - return 2 + value.length(); - } - - public final int element_name_index; - public final element_value value; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/AnnotationDefault_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.15. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class AnnotationDefault_attribute extends Attribute { - AnnotationDefault_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(name_index, length); - default_value = Annotation.element_value.read(cr); - } - - public AnnotationDefault_attribute(ConstantPool constant_pool, Annotation.element_value default_value) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.AnnotationDefault), default_value); - } - - public AnnotationDefault_attribute(int name_index, Annotation.element_value default_value) { - super(name_index, default_value.length()); - this.default_value = default_value; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitAnnotationDefault(this, data); - } - - public final Annotation.element_value default_value; -} -
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.util.HashMap; -import java.util.Map; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ - -public abstract class Attribute { - public static final String AnnotationDefault = "AnnotationDefault"; - public static final String BootstrapMethods = "BootstrapMethods"; - public static final String CharacterRangeTable = "CharacterRangeTable"; - public static final String Code = "Code"; - public static final String ConstantValue = "ConstantValue"; - public static final String CompilationID = "CompilationID"; - public static final String Deprecated = "Deprecated"; - public static final String EnclosingMethod = "EnclosingMethod"; - public static final String Exceptions = "Exceptions"; - public static final String InnerClasses = "InnerClasses"; - public static final String LineNumberTable = "LineNumberTable"; - public static final String LocalVariableTable = "LocalVariableTable"; - public static final String LocalVariableTypeTable = "LocalVariableTypeTable"; - public static final String MethodParameters = "MethodParameters"; - public static final String RuntimeVisibleAnnotations = "RuntimeVisibleAnnotations"; - public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations"; - public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations"; - public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations"; - public static final String RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations"; - public static final String RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations"; - public static final String Signature = "Signature"; - public static final String SourceDebugExtension = "SourceDebugExtension"; - public static final String SourceFile = "SourceFile"; - public static final String SourceID = "SourceID"; - public static final String StackMap = "StackMap"; - public static final String StackMapTable = "StackMapTable"; - public static final String Synthetic = "Synthetic"; - - public static class Factory { - public Factory() { - // defer init of standardAttributeClasses until after options set up - } - - public Attribute createAttribute(ClassReader cr, int name_index, byte[] data) - throws IOException { - if (standardAttributes == null) { - init(); - } - - ConstantPool cp = cr.getConstantPool(); - String reasonForDefaultAttr; - try { - String name = cp.getUTF8Value(name_index); - Class<? extends Attribute> attrClass = standardAttributes.get(name); - if (attrClass != null) { - try { - Class<?>[] constrArgTypes = {ClassReader.class, int.class, int.class}; - Constructor<? extends Attribute> constr = attrClass.getDeclaredConstructor(constrArgTypes); - return constr.newInstance(cr, name_index, data.length); - } catch (Throwable t) { - reasonForDefaultAttr = t.toString(); - // fall through and use DefaultAttribute - // t.printStackTrace(); - } - } else { - reasonForDefaultAttr = "unknown attribute"; - } - } catch (ConstantPoolException e) { - reasonForDefaultAttr = e.toString(); - // fall through and use DefaultAttribute - } - return new DefaultAttribute(cr, name_index, data, reasonForDefaultAttr); - } - - protected void init() { - standardAttributes = new HashMap<>(); - standardAttributes.put(AnnotationDefault, AnnotationDefault_attribute.class); - standardAttributes.put(BootstrapMethods, BootstrapMethods_attribute.class); - standardAttributes.put(CharacterRangeTable, CharacterRangeTable_attribute.class); - standardAttributes.put(Code, Code_attribute.class); - standardAttributes.put(CompilationID, CompilationID_attribute.class); - standardAttributes.put(ConstantValue, ConstantValue_attribute.class); - standardAttributes.put(Deprecated, Deprecated_attribute.class); - standardAttributes.put(EnclosingMethod, EnclosingMethod_attribute.class); - standardAttributes.put(Exceptions, Exceptions_attribute.class); - standardAttributes.put(InnerClasses, InnerClasses_attribute.class); - standardAttributes.put(LineNumberTable, LineNumberTable_attribute.class); - standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class); - standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class); - standardAttributes.put(MethodParameters, MethodParameters_attribute.class); - standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class); - standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class); - standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class); - standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class); - standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class); - standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class); - standardAttributes.put(Signature, Signature_attribute.class); - standardAttributes.put(SourceDebugExtension, SourceDebugExtension_attribute.class); - standardAttributes.put(SourceFile, SourceFile_attribute.class); - standardAttributes.put(SourceID, SourceID_attribute.class); - standardAttributes.put(StackMap, StackMap_attribute.class); - standardAttributes.put(StackMapTable, StackMapTable_attribute.class); - standardAttributes.put(Synthetic, Synthetic_attribute.class); - } - - private Map<String,Class<? extends Attribute>> standardAttributes; - } - - public static Attribute read(ClassReader cr) throws IOException { - return cr.readAttribute(); - } - - protected Attribute(int name_index, int length) { - attribute_name_index = name_index; - attribute_length = length; - } - - public String getName(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(attribute_name_index); - } - - public abstract <R,D> R accept(Attribute.Visitor<R,D> visitor, D data); - - public int byteLength() { - return 6 + attribute_length; - } - - public final int attribute_name_index; - public final int attribute_length; - - - public interface Visitor<R,P> { - R visitBootstrapMethods(BootstrapMethods_attribute attr, P p); - R visitDefault(DefaultAttribute attr, P p); - R visitAnnotationDefault(AnnotationDefault_attribute attr, P p); - R visitCharacterRangeTable(CharacterRangeTable_attribute attr, P p); - R visitCode(Code_attribute attr, P p); - R visitCompilationID(CompilationID_attribute attr, P p); - R visitConstantValue(ConstantValue_attribute attr, P p); - R visitDeprecated(Deprecated_attribute attr, P p); - R visitEnclosingMethod(EnclosingMethod_attribute attr, P p); - R visitExceptions(Exceptions_attribute attr, P p); - R visitInnerClasses(InnerClasses_attribute attr, P p); - R visitLineNumberTable(LineNumberTable_attribute attr, P p); - R visitLocalVariableTable(LocalVariableTable_attribute attr, P p); - R visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, P p); - R visitMethodParameters(MethodParameters_attribute attr, P p); - R visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, P p); - R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p); - R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p); - R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p); - R visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, P p); - R visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, P p); - R visitSignature(Signature_attribute attr, P p); - R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p); - R visitSourceFile(SourceFile_attribute attr, P p); - R visitSourceID(SourceID_attribute attr, P p); - R visitStackMap(StackMap_attribute attr, P p); - R visitStackMapTable(StackMapTable_attribute attr, P p); - R visitSynthetic(Synthetic_attribute attr, P p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/AttributeException.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class AttributeException extends Exception { - private static final long serialVersionUID = -4231486387714867770L; - AttributeException() { } - - AttributeException(String msg) { - super(msg); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Attributes.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Attributes implements Iterable<Attribute> { - - public final Attribute[] attrs; - public final Map<String, Attribute> map; - - Attributes(ClassReader cr) throws IOException { - map = new HashMap<>(); - int attrs_count = cr.readUnsignedShort(); - attrs = new Attribute[attrs_count]; - for (int i = 0; i < attrs_count; i++) { - Attribute attr = Attribute.read(cr); - attrs[i] = attr; - try { - map.put(attr.getName(cr.getConstantPool()), attr); - } catch (ConstantPoolException e) { - // don't enter invalid names in map - } - } - } - - public Attributes(ConstantPool constant_pool, Attribute[] attrs) { - this.attrs = attrs; - map = new HashMap<>(); - for (Attribute attr : attrs) { - try { - map.put(attr.getName(constant_pool), attr); - } catch (ConstantPoolException e) { - // don't enter invalid names in map - } - } - } - - public Iterator<Attribute> iterator() { - return Arrays.asList(attrs).iterator(); - } - - public Attribute get(int index) { - return attrs[index]; - } - - public Attribute get(String name) { - return map.get(name); - } - - public int getIndex(ConstantPool constant_pool, String name) { - for (int i = 0; i < attrs.length; i++) { - Attribute attr = attrs[i]; - try { - if (attr != null && attr.getName(constant_pool).equals(name)) - return i; - } catch (ConstantPoolException e) { - // ignore invalid entries - } - } - return -1; - } - - public int size() { - return attrs.length; - } - - public int byteLength() { - int length = 2; - for (Attribute a: attrs) - length += a.byteLength(); - return length; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS 4.7.21 - * http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.21 - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class BootstrapMethods_attribute extends Attribute { - public final BootstrapMethodSpecifier[] bootstrap_method_specifiers; - - BootstrapMethods_attribute(ClassReader cr, int name_index, int length) - throws IOException, AttributeException { - super(name_index, length); - int bootstrap_method_count = cr.readUnsignedShort(); - bootstrap_method_specifiers = new BootstrapMethodSpecifier[bootstrap_method_count]; - for (int i = 0; i < bootstrap_method_specifiers.length; i++) - bootstrap_method_specifiers[i] = new BootstrapMethodSpecifier(cr); - } - - public BootstrapMethods_attribute(int name_index, BootstrapMethodSpecifier[] bootstrap_method_specifiers) { - super(name_index, length(bootstrap_method_specifiers)); - this.bootstrap_method_specifiers = bootstrap_method_specifiers; - } - - public static int length(BootstrapMethodSpecifier[] bootstrap_method_specifiers) { - int n = 2; - for (BootstrapMethodSpecifier b : bootstrap_method_specifiers) - n += b.length(); - return n; - } - - @Override - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitBootstrapMethods(this, p); - } - - public static class BootstrapMethodSpecifier { - public int bootstrap_method_ref; - public int[] bootstrap_arguments; - - public BootstrapMethodSpecifier(int bootstrap_method_ref, int[] bootstrap_arguments) { - this.bootstrap_method_ref = bootstrap_method_ref; - this.bootstrap_arguments = bootstrap_arguments; - } - BootstrapMethodSpecifier(ClassReader cr) throws IOException { - bootstrap_method_ref = cr.readUnsignedShort(); - int method_count = cr.readUnsignedShort(); - bootstrap_arguments = new int[method_count]; - for (int i = 0; i < bootstrap_arguments.length; i++) { - bootstrap_arguments[i] = cr.readUnsignedShort(); - } - } - - int length() { - // u2 (method_ref) + u2 (argc) + u2 * argc - return 2 + 2 + (bootstrap_arguments.length * 2); - } - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/CharacterRangeTable_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class CharacterRangeTable_attribute extends Attribute { - public static final int CRT_STATEMENT = 0x0001; - public static final int CRT_BLOCK = 0x0002; - public static final int CRT_ASSIGNMENT = 0x0004; - public static final int CRT_FLOW_CONTROLLER = 0x0008; - public static final int CRT_FLOW_TARGET = 0x0010; - public static final int CRT_INVOKE = 0x0020; - public static final int CRT_CREATE = 0x0040; - public static final int CRT_BRANCH_TRUE = 0x0080; - public static final int CRT_BRANCH_FALSE = 0x0100; - - CharacterRangeTable_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - int character_range_table_length = cr.readUnsignedShort(); - character_range_table = new Entry[character_range_table_length]; - for (int i = 0; i < character_range_table_length; i++) - character_range_table[i] = new Entry(cr); - } - - public CharacterRangeTable_attribute(ConstantPool constant_pool, Entry[] character_range_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.CharacterRangeTable), character_range_table); - } - - public CharacterRangeTable_attribute(int name_index, Entry[] character_range_table) { - super(name_index, 2 + character_range_table.length * Entry.length()); - this.character_range_table = character_range_table; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitCharacterRangeTable(this, data); - } - - public final Entry[] character_range_table; - - public static class Entry { - Entry(ClassReader cr) throws IOException { - start_pc = cr.readUnsignedShort(); - end_pc = cr.readUnsignedShort(); - character_range_start = cr.readInt(); - character_range_end = cr.readInt(); - flags = cr.readUnsignedShort(); - } - - public static int length() { - return 14; - } - - public final int start_pc; - public final int end_pc; - public final int character_range_start; - public final int character_range_end; - public final int flags; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassFile.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; - -import static com.sun.tools.classfile.AccessFlags.*; - -/** - * See JVMS, section 4.2. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ClassFile { - public static ClassFile read(File file) - throws IOException, ConstantPoolException { - return read(file.toPath(), new Attribute.Factory()); - } - - public static ClassFile read(Path input) - throws IOException, ConstantPoolException { - return read(input, new Attribute.Factory()); - } - - public static ClassFile read(Path input, Attribute.Factory attributeFactory) - throws IOException, ConstantPoolException { - try (InputStream in = Files.newInputStream(input)) { - return new ClassFile(in, attributeFactory); - } - } - - public static ClassFile read(File file, Attribute.Factory attributeFactory) - throws IOException, ConstantPoolException { - return read(file.toPath(), attributeFactory); - } - - public static ClassFile read(InputStream in) - throws IOException, ConstantPoolException { - return new ClassFile(in, new Attribute.Factory()); - } - - public static ClassFile read(InputStream in, Attribute.Factory attributeFactory) - throws IOException, ConstantPoolException { - return new ClassFile(in, attributeFactory); - } - - ClassFile(InputStream in, Attribute.Factory attributeFactory) throws IOException, ConstantPoolException { - ClassReader cr = new ClassReader(this, in, attributeFactory); - magic = cr.readInt(); - minor_version = cr.readUnsignedShort(); - major_version = cr.readUnsignedShort(); - constant_pool = new ConstantPool(cr); - access_flags = new AccessFlags(cr); - this_class = cr.readUnsignedShort(); - super_class = cr.readUnsignedShort(); - - int interfaces_count = cr.readUnsignedShort(); - interfaces = new int[interfaces_count]; - for (int i = 0; i < interfaces_count; i++) - interfaces[i] = cr.readUnsignedShort(); - - int fields_count = cr.readUnsignedShort(); - fields = new Field[fields_count]; - for (int i = 0; i < fields_count; i++) - fields[i] = new Field(cr); - - int methods_count = cr.readUnsignedShort(); - methods = new Method[methods_count]; - for (int i = 0; i < methods_count; i++) - methods[i] = new Method(cr); - - attributes = new Attributes(cr); - } - - public ClassFile(int magic, int minor_version, int major_version, - ConstantPool constant_pool, AccessFlags access_flags, - int this_class, int super_class, int[] interfaces, - Field[] fields, Method[] methods, Attributes attributes) { - this.magic = magic; - this.minor_version = minor_version; - this.major_version = major_version; - this.constant_pool = constant_pool; - this.access_flags = access_flags; - this.this_class = this_class; - this.super_class = super_class; - this.interfaces = interfaces; - this.fields = fields; - this.methods = methods; - this.attributes = attributes; - } - - public String getName() throws ConstantPoolException { - return constant_pool.getClassInfo(this_class).getName(); - } - - public String getSuperclassName() throws ConstantPoolException { - return constant_pool.getClassInfo(super_class).getName(); - } - - public String getInterfaceName(int i) throws ConstantPoolException { - return constant_pool.getClassInfo(interfaces[i]).getName(); - } - - public Attribute getAttribute(String name) { - return attributes.get(name); - } - - public boolean isClass() { - return !isInterface(); - } - - public boolean isInterface() { - return access_flags.is(ACC_INTERFACE); - } - - public int byteLength() { - return 4 + // magic - 2 + // minor - 2 + // major - constant_pool.byteLength() + - 2 + // access flags - 2 + // this_class - 2 + // super_class - byteLength(interfaces) + - byteLength(fields) + - byteLength(methods) + - attributes.byteLength(); - } - - private int byteLength(int[] indices) { - return 2 + 2 * indices.length; - } - - private int byteLength(Field[] fields) { - int length = 2; - for (Field f: fields) - length += f.byteLength(); - return length; - } - - private int byteLength(Method[] methods) { - int length = 2; - for (Method m: methods) - length += m.byteLength(); - return length; - } - - public final int magic; - public final int minor_version; - public final int major_version; - public final ConstantPool constant_pool; - public final AccessFlags access_flags; - public final int this_class; - public final int super_class; - public final int[] interfaces; - public final Field[] fields; - public final Method[] methods; - public final Attributes attributes; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassReader.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ClassReader { - ClassReader(ClassFile classFile, InputStream in, Attribute.Factory attributeFactory) throws IOException { - this.classFile = Objects.requireNonNull(classFile); - this.attributeFactory = Objects.requireNonNull(attributeFactory); - this.in = new DataInputStream(new BufferedInputStream(in)); - } - - ClassFile getClassFile() { - return classFile; - } - - ConstantPool getConstantPool() { - return classFile.constant_pool; - } - - public Attribute readAttribute() throws IOException { - int name_index = readUnsignedShort(); - int length = readInt(); - byte[] data = new byte[length]; - readFully(data); - - DataInputStream prev = in; - in = new DataInputStream(new ByteArrayInputStream(data)); - try { - return attributeFactory.createAttribute(this, name_index, data); - } finally { - in = prev; - } - } - - public void readFully(byte[] b) throws IOException { - in.readFully(b); - } - - public int readUnsignedByte() throws IOException { - return in.readUnsignedByte(); - } - - public int readUnsignedShort() throws IOException { - return in.readUnsignedShort(); - } - - public int readInt() throws IOException { - return in.readInt(); - } - - public long readLong() throws IOException { - return in.readLong(); - } - - public float readFloat() throws IOException { - return in.readFloat(); - } - - public double readDouble() throws IOException { - return in.readDouble(); - } - - public String readUTF() throws IOException { - return in.readUTF(); - } - - private DataInputStream in; - private ClassFile classFile; - private Attribute.Factory attributeFactory; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassTranslator.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,410 +0,0 @@ -/* - * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.Map; - -import com.sun.tools.classfile.ConstantPool.CONSTANT_Class_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Double_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Fieldref_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Float_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Integer_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_InterfaceMethodref_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_InvokeDynamic_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Long_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_MethodHandle_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_MethodType_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_String_info; -import com.sun.tools.classfile.ConstantPool.CONSTANT_Utf8_info; -import com.sun.tools.classfile.ConstantPool.CPInfo; - -/** - * Rewrites a class file using a map of translations. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ClassTranslator - implements ConstantPool.Visitor<ConstantPool.CPInfo,Map<Object,Object>> { - /** - * Create a new ClassFile from {@code cf}, such that for all entries - * {@code k -\> v} in {@code translations}, - * each occurrence of {@code k} in {@code cf} will be replaced by {@code v}. - * in - * @param cf the class file to be processed - * @param translations the set of translations to be applied - * @return a copy of {@code} with the values in {@code translations} substituted - */ - public ClassFile translate(ClassFile cf, Map<Object,Object> translations) { - ClassFile cf2 = (ClassFile) translations.get(cf); - if (cf2 == null) { - ConstantPool constant_pool2 = translate(cf.constant_pool, translations); - Field[] fields2 = translate(cf.fields, cf.constant_pool, translations); - Method[] methods2 = translateMethods(cf.methods, cf.constant_pool, translations); - Attributes attributes2 = translateAttributes(cf.attributes, cf.constant_pool, - translations); - - if (constant_pool2 == cf.constant_pool && - fields2 == cf.fields && - methods2 == cf.methods && - attributes2 == cf.attributes) - cf2 = cf; - else - cf2 = new ClassFile( - cf.magic, - cf.minor_version, - cf.major_version, - constant_pool2, - cf.access_flags, - cf.this_class, - cf.super_class, - cf.interfaces, - fields2, - methods2, - attributes2); - translations.put(cf, cf2); - } - return cf2; - } - - ConstantPool translate(ConstantPool cp, Map<Object,Object> translations) { - ConstantPool cp2 = (ConstantPool) translations.get(cp); - if (cp2 == null) { - ConstantPool.CPInfo[] pool2 = new ConstantPool.CPInfo[cp.size()]; - boolean eq = true; - for (int i = 0; i < cp.size(); ) { - ConstantPool.CPInfo cpInfo; - try { - cpInfo = cp.get(i); - } catch (ConstantPool.InvalidIndex e) { - throw new IllegalStateException(e); - } - ConstantPool.CPInfo cpInfo2 = translate(cpInfo, translations); - eq &= (cpInfo == cpInfo2); - pool2[i] = cpInfo2; - if (cpInfo.getTag() != cpInfo2.getTag()) - throw new IllegalStateException(); - i += cpInfo.size(); - } - - if (eq) - cp2 = cp; - else - cp2 = new ConstantPool(pool2); - - translations.put(cp, cp2); - } - return cp2; - } - - ConstantPool.CPInfo translate(ConstantPool.CPInfo cpInfo, Map<Object,Object> translations) { - ConstantPool.CPInfo cpInfo2 = (ConstantPool.CPInfo) translations.get(cpInfo); - if (cpInfo2 == null) { - cpInfo2 = cpInfo.accept(this, translations); - translations.put(cpInfo, cpInfo2); - } - return cpInfo2; - } - - Field[] translate(Field[] fields, ConstantPool constant_pool, Map<Object,Object> translations) { - Field[] fields2 = (Field[]) translations.get(fields); - if (fields2 == null) { - fields2 = new Field[fields.length]; - for (int i = 0; i < fields.length; i++) - fields2[i] = translate(fields[i], constant_pool, translations); - if (equal(fields, fields2)) - fields2 = fields; - translations.put(fields, fields2); - } - return fields2; - } - - Field translate(Field field, ConstantPool constant_pool, Map<Object,Object> translations) { - Field field2 = (Field) translations.get(field); - if (field2 == null) { - Attributes attributes2 = translateAttributes(field.attributes, constant_pool, - translations); - - if (attributes2 == field.attributes) - field2 = field; - else - field2 = new Field( - field.access_flags, - field.name_index, - field.descriptor, - attributes2); - translations.put(field, field2); - } - return field2; - } - - Method[] translateMethods(Method[] methods, ConstantPool constant_pool, Map<Object,Object> translations) { - Method[] methods2 = (Method[]) translations.get(methods); - if (methods2 == null) { - methods2 = new Method[methods.length]; - for (int i = 0; i < methods.length; i++) - methods2[i] = translate(methods[i], constant_pool, translations); - if (equal(methods, methods2)) - methods2 = methods; - translations.put(methods, methods2); - } - return methods2; - } - - Method translate(Method method, ConstantPool constant_pool, Map<Object,Object> translations) { - Method method2 = (Method) translations.get(method); - if (method2 == null) { - Attributes attributes2 = translateAttributes(method.attributes, constant_pool, - translations); - - if (attributes2 == method.attributes) - method2 = method; - else - method2 = new Method( - method.access_flags, - method.name_index, - method.descriptor, - attributes2); - translations.put(method, method2); - } - return method2; - } - - Attributes translateAttributes(Attributes attributes, - ConstantPool constant_pool, Map<Object,Object> translations) { - Attributes attributes2 = (Attributes) translations.get(attributes); - if (attributes2 == null) { - Attribute[] attrArray2 = new Attribute[attributes.size()]; - ConstantPool constant_pool2 = translate(constant_pool, translations); - boolean attrsEqual = true; - for (int i = 0; i < attributes.size(); i++) { - Attribute attr = attributes.get(i); - Attribute attr2 = translate(attr, translations); - if (attr2 != attr) - attrsEqual = false; - attrArray2[i] = attr2; - } - if ((constant_pool2 == constant_pool) && attrsEqual) - attributes2 = attributes; - else - attributes2 = new Attributes(constant_pool2, attrArray2); - translations.put(attributes, attributes2); - } - return attributes2; - } - - Attribute translate(Attribute attribute, Map<Object,Object> translations) { - Attribute attribute2 = (Attribute) translations.get(attribute); - if (attribute2 == null) { - attribute2 = attribute; // don't support translation within attributes yet - // (what about Code attribute) - translations.put(attribute, attribute2); - } - return attribute2; - } - - private static <T> boolean equal(T[] a1, T[] a2) { - if (a1 == null || a2 == null) - return (a1 == a2); - if (a1.length != a2.length) - return false; - for (int i = 0; i < a1.length; i++) { - if (a1[i] != a2[i]) - return false; - } - return true; - } - - public CPInfo visitClass(CONSTANT_Class_info info, Map<Object, Object> translations) { - CONSTANT_Class_info info2 = (CONSTANT_Class_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_Class_info(cp2, info.name_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitDouble(CONSTANT_Double_info info, Map<Object, Object> translations) { - CONSTANT_Double_info info2 = (CONSTANT_Double_info) translations.get(info); - if (info2 == null) { - info2 = info; - translations.put(info, info2); - } - return info; - } - - public CPInfo visitFieldref(CONSTANT_Fieldref_info info, Map<Object, Object> translations) { - CONSTANT_Fieldref_info info2 = (CONSTANT_Fieldref_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_Fieldref_info(cp2, info.class_index, info.name_and_type_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitFloat(CONSTANT_Float_info info, Map<Object, Object> translations) { - CONSTANT_Float_info info2 = (CONSTANT_Float_info) translations.get(info); - if (info2 == null) { - info2 = info; - translations.put(info, info2); - } - return info; - } - - public CPInfo visitInteger(CONSTANT_Integer_info info, Map<Object, Object> translations) { - CONSTANT_Integer_info info2 = (CONSTANT_Integer_info) translations.get(info); - if (info2 == null) { - info2 = info; - translations.put(info, info2); - } - return info; - } - - public CPInfo visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Map<Object, Object> translations) { - CONSTANT_InterfaceMethodref_info info2 = (CONSTANT_InterfaceMethodref_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_InterfaceMethodref_info(cp2, info.class_index, info.name_and_type_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Map<Object, Object> translations) { - CONSTANT_InvokeDynamic_info info2 = (CONSTANT_InvokeDynamic_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) { - info2 = info; - } else { - info2 = new CONSTANT_InvokeDynamic_info(cp2, info.bootstrap_method_attr_index, info.name_and_type_index); - } - translations.put(info, info2); - } - return info; - } - - public CPInfo visitLong(CONSTANT_Long_info info, Map<Object, Object> translations) { - CONSTANT_Long_info info2 = (CONSTANT_Long_info) translations.get(info); - if (info2 == null) { - info2 = info; - translations.put(info, info2); - } - return info; - } - - public CPInfo visitNameAndType(CONSTANT_NameAndType_info info, Map<Object, Object> translations) { - CONSTANT_NameAndType_info info2 = (CONSTANT_NameAndType_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_NameAndType_info(cp2, info.name_index, info.type_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitMethodref(CONSTANT_Methodref_info info, Map<Object, Object> translations) { - CONSTANT_Methodref_info info2 = (CONSTANT_Methodref_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_Methodref_info(cp2, info.class_index, info.name_and_type_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitMethodHandle(CONSTANT_MethodHandle_info info, Map<Object, Object> translations) { - CONSTANT_MethodHandle_info info2 = (CONSTANT_MethodHandle_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) { - info2 = info; - } else { - info2 = new CONSTANT_MethodHandle_info(cp2, info.reference_kind, info.reference_index); - } - translations.put(info, info2); - } - return info; - } - - public CPInfo visitMethodType(CONSTANT_MethodType_info info, Map<Object, Object> translations) { - CONSTANT_MethodType_info info2 = (CONSTANT_MethodType_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) { - info2 = info; - } else { - info2 = new CONSTANT_MethodType_info(cp2, info.descriptor_index); - } - translations.put(info, info2); - } - return info; - } - - public CPInfo visitString(CONSTANT_String_info info, Map<Object, Object> translations) { - CONSTANT_String_info info2 = (CONSTANT_String_info) translations.get(info); - if (info2 == null) { - ConstantPool cp2 = translate(info.cp, translations); - if (cp2 == info.cp) - info2 = info; - else - info2 = new CONSTANT_String_info(cp2, info.string_index); - translations.put(info, info2); - } - return info; - } - - public CPInfo visitUtf8(CONSTANT_Utf8_info info, Map<Object, Object> translations) { - CONSTANT_Utf8_info info2 = (CONSTANT_Utf8_info) translations.get(info); - if (info2 == null) { - info2 = info; - translations.put(info, info2); - } - return info; - } - -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,808 +0,0 @@ - -/* - * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -import static com.sun.tools.classfile.Annotation.*; -import static com.sun.tools.classfile.ConstantPool.*; -import static com.sun.tools.classfile.StackMapTable_attribute.*; -import static com.sun.tools.classfile.StackMapTable_attribute.verification_type_info.*; - -/** - * Write a ClassFile data structure to a file or stream. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ClassWriter { - public ClassWriter() { - attributeWriter = new AttributeWriter(); - constantPoolWriter = new ConstantPoolWriter(); - out = new ClassOutputStream(); - } - - /** - * Write a ClassFile data structure to a file. - */ - public void write(ClassFile classFile, File f) throws IOException { - try (FileOutputStream f_out = new FileOutputStream(f)) { - write(classFile, f_out); - } - } - - /** - * Write a ClassFile data structure to a stream. - */ - public void write(ClassFile classFile, OutputStream s) throws IOException { - this.classFile = classFile; - out.reset(); - write(); - out.writeTo(s); - } - - protected void write() throws IOException { - writeHeader(); - writeConstantPool(); - writeAccessFlags(classFile.access_flags); - writeClassInfo(); - writeFields(); - writeMethods(); - writeAttributes(classFile.attributes); - } - - protected void writeHeader() { - out.writeInt(classFile.magic); - out.writeShort(classFile.minor_version); - out.writeShort(classFile.major_version); - } - - protected void writeAccessFlags(AccessFlags flags) { - out.writeShort(flags.flags); - } - - protected void writeAttributes(Attributes attributes) { - int size = attributes.size(); - out.writeShort(size); - for (Attribute attr: attributes) - attributeWriter.write(attr, out); - } - - protected void writeClassInfo() { - out.writeShort(classFile.this_class); - out.writeShort(classFile.super_class); - int[] interfaces = classFile.interfaces; - out.writeShort(interfaces.length); - for (int i: interfaces) - out.writeShort(i); - } - - protected void writeDescriptor(Descriptor d) { - out.writeShort(d.index); - } - - protected void writeConstantPool() { - ConstantPool pool = classFile.constant_pool; - int size = pool.size(); - out.writeShort(size); - for (CPInfo cpInfo: pool.entries()) - constantPoolWriter.write(cpInfo, out); - } - - protected void writeFields() throws IOException { - Field[] fields = classFile.fields; - out.writeShort(fields.length); - for (Field f: fields) - writeField(f); - } - - protected void writeField(Field f) throws IOException { - writeAccessFlags(f.access_flags); - out.writeShort(f.name_index); - writeDescriptor(f.descriptor); - writeAttributes(f.attributes); - } - - protected void writeMethods() throws IOException { - Method[] methods = classFile.methods; - out.writeShort(methods.length); - for (Method m: methods) { - writeMethod(m); - } - } - - protected void writeMethod(Method m) throws IOException { - writeAccessFlags(m.access_flags); - out.writeShort(m.name_index); - writeDescriptor(m.descriptor); - writeAttributes(m.attributes); - } - - protected ClassFile classFile; - protected ClassOutputStream out; - protected AttributeWriter attributeWriter; - protected ConstantPoolWriter constantPoolWriter; - - /** - * Subtype of ByteArrayOutputStream with the convenience methods of - * a DataOutputStream. Since ByteArrayOutputStream does not throw - * IOException, there are no exceptions from the additional - * convenience methods either, - */ - protected static class ClassOutputStream extends ByteArrayOutputStream { - public ClassOutputStream() { - d = new DataOutputStream(this); - } - - public void writeByte(int value) { - try { - d.writeByte(value); - } catch (IOException ignore) { - } - } - - public void writeShort(int value) { - try { - d.writeShort(value); - } catch (IOException ignore) { - } - } - - public void writeInt(int value) { - try { - d.writeInt(value); - } catch (IOException ignore) { - } - } - - public void writeLong(long value) { - try { - d.writeLong(value); - } catch (IOException ignore) { - } - } - - public void writeFloat(float value) { - try { - d.writeFloat(value); - } catch (IOException ignore) { - } - } - - public void writeDouble(double value) { - try { - d.writeDouble(value); - } catch (IOException ignore) { - } - } - - public void writeUTF(String value) { - try { - d.writeUTF(value); - } catch (IOException ignore) { - } - } - - public void writeTo(ClassOutputStream s) { - try { - super.writeTo(s); - } catch (IOException ignore) { - } - } - - private DataOutputStream d; - } - - /** - * Writer for the entries in the constant pool. - */ - protected static class ConstantPoolWriter - implements ConstantPool.Visitor<Integer,ClassOutputStream> { - protected int write(CPInfo info, ClassOutputStream out) { - out.writeByte(info.getTag()); - return info.accept(this, out); - } - - public Integer visitClass(CONSTANT_Class_info info, ClassOutputStream out) { - out.writeShort(info.name_index); - return 1; - } - - public Integer visitDouble(CONSTANT_Double_info info, ClassOutputStream out) { - out.writeDouble(info.value); - return 2; - } - - public Integer visitFieldref(CONSTANT_Fieldref_info info, ClassOutputStream out) { - writeRef(info, out); - return 1; - } - - public Integer visitFloat(CONSTANT_Float_info info, ClassOutputStream out) { - out.writeFloat(info.value); - return 1; - } - - public Integer visitInteger(CONSTANT_Integer_info info, ClassOutputStream out) { - out.writeInt(info.value); - return 1; - } - - public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, ClassOutputStream out) { - writeRef(info, out); - return 1; - } - - public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, ClassOutputStream out) { - out.writeShort(info.bootstrap_method_attr_index); - out.writeShort(info.name_and_type_index); - return 1; - } - - public Integer visitLong(CONSTANT_Long_info info, ClassOutputStream out) { - out.writeLong(info.value); - return 2; - } - - public Integer visitNameAndType(CONSTANT_NameAndType_info info, ClassOutputStream out) { - out.writeShort(info.name_index); - out.writeShort(info.type_index); - return 1; - } - - public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, ClassOutputStream out) { - out.writeByte(info.reference_kind.tag); - out.writeShort(info.reference_index); - return 1; - } - - public Integer visitMethodType(CONSTANT_MethodType_info info, ClassOutputStream out) { - out.writeShort(info.descriptor_index); - return 1; - } - - public Integer visitMethodref(CONSTANT_Methodref_info info, ClassOutputStream out) { - return writeRef(info, out); - } - - public Integer visitString(CONSTANT_String_info info, ClassOutputStream out) { - out.writeShort(info.string_index); - return 1; - } - - public Integer visitUtf8(CONSTANT_Utf8_info info, ClassOutputStream out) { - out.writeUTF(info.value); - return 1; - } - - protected Integer writeRef(CPRefInfo info, ClassOutputStream out) { - out.writeShort(info.class_index); - out.writeShort(info.name_and_type_index); - return 1; - } - } - - /** - * Writer for the different types of attribute. - */ - protected static class AttributeWriter implements Attribute.Visitor<Void,ClassOutputStream> { - public void write(Attributes attributes, ClassOutputStream out) { - int size = attributes.size(); - out.writeShort(size); - for (Attribute a: attributes) - write(a, out); - } - - // Note: due to the use of shared resources, this method is not reentrant. - public void write(Attribute attr, ClassOutputStream out) { - out.writeShort(attr.attribute_name_index); - sharedOut.reset(); - attr.accept(this, sharedOut); - out.writeInt(sharedOut.size()); - sharedOut.writeTo(out); - } - - protected ClassOutputStream sharedOut = new ClassOutputStream(); - protected AnnotationWriter annotationWriter = new AnnotationWriter(); - - public Void visitDefault(DefaultAttribute attr, ClassOutputStream out) { - out.write(attr.info, 0, attr.info.length); - return null; - } - - public Void visitAnnotationDefault(AnnotationDefault_attribute attr, ClassOutputStream out) { - annotationWriter.write(attr.default_value, out); - return null; - } - - public Void visitBootstrapMethods(BootstrapMethods_attribute attr, ClassOutputStream out) { - out.writeShort(attr.bootstrap_method_specifiers.length); - for (BootstrapMethods_attribute.BootstrapMethodSpecifier bsm : attr.bootstrap_method_specifiers) { - out.writeShort(bsm.bootstrap_method_ref); - int bsm_args_count = bsm.bootstrap_arguments.length; - out.writeShort(bsm_args_count); - for (int i : bsm.bootstrap_arguments) { - out.writeShort(i); - } - } - return null; - } - - public Void visitCharacterRangeTable(CharacterRangeTable_attribute attr, ClassOutputStream out) { - out.writeShort(attr.character_range_table.length); - for (CharacterRangeTable_attribute.Entry e: attr.character_range_table) - writeCharacterRangeTableEntry(e, out); - return null; - } - - protected void writeCharacterRangeTableEntry(CharacterRangeTable_attribute.Entry entry, ClassOutputStream out) { - out.writeShort(entry.start_pc); - out.writeShort(entry.end_pc); - out.writeInt(entry.character_range_start); - out.writeInt(entry.character_range_end); - out.writeShort(entry.flags); - } - - public Void visitCode(Code_attribute attr, ClassOutputStream out) { - out.writeShort(attr.max_stack); - out.writeShort(attr.max_locals); - out.writeInt(attr.code.length); - out.write(attr.code, 0, attr.code.length); - out.writeShort(attr.exception_table.length); - for (Code_attribute.Exception_data e: attr.exception_table) - writeExceptionTableEntry(e, out); - new AttributeWriter().write(attr.attributes, out); - return null; - } - - protected void writeExceptionTableEntry(Code_attribute.Exception_data exception_data, ClassOutputStream out) { - out.writeShort(exception_data.start_pc); - out.writeShort(exception_data.end_pc); - out.writeShort(exception_data.handler_pc); - out.writeShort(exception_data.catch_type); - } - - public Void visitCompilationID(CompilationID_attribute attr, ClassOutputStream out) { - out.writeShort(attr.compilationID_index); - return null; - } - - public Void visitConstantValue(ConstantValue_attribute attr, ClassOutputStream out) { - out.writeShort(attr.constantvalue_index); - return null; - } - - public Void visitDeprecated(Deprecated_attribute attr, ClassOutputStream out) { - return null; - } - - public Void visitEnclosingMethod(EnclosingMethod_attribute attr, ClassOutputStream out) { - out.writeShort(attr.class_index); - out.writeShort(attr.method_index); - return null; - } - - public Void visitExceptions(Exceptions_attribute attr, ClassOutputStream out) { - out.writeShort(attr.exception_index_table.length); - for (int i: attr.exception_index_table) - out.writeShort(i); - return null; - } - - public Void visitInnerClasses(InnerClasses_attribute attr, ClassOutputStream out) { - out.writeShort(attr.classes.length); - for (InnerClasses_attribute.Info info: attr.classes) - writeInnerClassesInfo(info, out); - return null; - } - - protected void writeInnerClassesInfo(InnerClasses_attribute.Info info, ClassOutputStream out) { - out.writeShort(info.inner_class_info_index); - out.writeShort(info.outer_class_info_index); - out.writeShort(info.inner_name_index); - writeAccessFlags(info.inner_class_access_flags, out); - } - - public Void visitLineNumberTable(LineNumberTable_attribute attr, ClassOutputStream out) { - out.writeShort(attr.line_number_table.length); - for (LineNumberTable_attribute.Entry e: attr.line_number_table) - writeLineNumberTableEntry(e, out); - return null; - } - - protected void writeLineNumberTableEntry(LineNumberTable_attribute.Entry entry, ClassOutputStream out) { - out.writeShort(entry.start_pc); - out.writeShort(entry.line_number); - } - - public Void visitLocalVariableTable(LocalVariableTable_attribute attr, ClassOutputStream out) { - out.writeShort(attr.local_variable_table.length); - for (LocalVariableTable_attribute.Entry e: attr.local_variable_table) - writeLocalVariableTableEntry(e, out); - return null; - } - - protected void writeLocalVariableTableEntry(LocalVariableTable_attribute.Entry entry, ClassOutputStream out) { - out.writeShort(entry.start_pc); - out.writeShort(entry.length); - out.writeShort(entry.name_index); - out.writeShort(entry.descriptor_index); - out.writeShort(entry.index); - } - - public Void visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, ClassOutputStream out) { - out.writeShort(attr.local_variable_table.length); - for (LocalVariableTypeTable_attribute.Entry e: attr.local_variable_table) - writeLocalVariableTypeTableEntry(e, out); - return null; - } - - protected void writeLocalVariableTypeTableEntry(LocalVariableTypeTable_attribute.Entry entry, ClassOutputStream out) { - out.writeShort(entry.start_pc); - out.writeShort(entry.length); - out.writeShort(entry.name_index); - out.writeShort(entry.signature_index); - out.writeShort(entry.index); - } - - public Void visitMethodParameters(MethodParameters_attribute attr, ClassOutputStream out) { - out.writeByte(attr.method_parameter_table.length); - for (MethodParameters_attribute.Entry e : attr.method_parameter_table) { - out.writeShort(e.name_index); - out.writeShort(e.flags); - } - return null; - } - - public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, ClassOutputStream out) { - annotationWriter.write(attr.annotations, out); - return null; - } - - public Void visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, ClassOutputStream out) { - annotationWriter.write(attr.annotations, out); - return null; - } - - public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, ClassOutputStream out) { - annotationWriter.write(attr.annotations, out); - return null; - } - - public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, ClassOutputStream out) { - annotationWriter.write(attr.annotations, out); - return null; - } - - public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, ClassOutputStream out) { - out.writeByte(attr.parameter_annotations.length); - for (Annotation[] annos: attr.parameter_annotations) - annotationWriter.write(annos, out); - return null; - } - - public Void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, ClassOutputStream out) { - out.writeByte(attr.parameter_annotations.length); - for (Annotation[] annos: attr.parameter_annotations) - annotationWriter.write(annos, out); - return null; - } - - public Void visitSignature(Signature_attribute attr, ClassOutputStream out) { - out.writeShort(attr.signature_index); - return null; - } - - public Void visitSourceDebugExtension(SourceDebugExtension_attribute attr, ClassOutputStream out) { - out.write(attr.debug_extension, 0, attr.debug_extension.length); - return null; - } - - public Void visitSourceFile(SourceFile_attribute attr, ClassOutputStream out) { - out.writeShort(attr.sourcefile_index); - return null; - } - - public Void visitSourceID(SourceID_attribute attr, ClassOutputStream out) { - out.writeShort(attr.sourceID_index); - return null; - } - - public Void visitStackMap(StackMap_attribute attr, ClassOutputStream out) { - if (stackMapWriter == null) - stackMapWriter = new StackMapTableWriter(); - - out.writeShort(attr.entries.length); - for (stack_map_frame f: attr.entries) - stackMapWriter.write(f, out); - return null; - } - - public Void visitStackMapTable(StackMapTable_attribute attr, ClassOutputStream out) { - if (stackMapWriter == null) - stackMapWriter = new StackMapTableWriter(); - - out.writeShort(attr.entries.length); - for (stack_map_frame f: attr.entries) - stackMapWriter.write(f, out); - return null; - } - - public Void visitSynthetic(Synthetic_attribute attr, ClassOutputStream out) { - return null; - } - - protected void writeAccessFlags(AccessFlags flags, ClassOutputStream p) { - sharedOut.writeShort(flags.flags); - } - - protected StackMapTableWriter stackMapWriter; - } - - /** - * Writer for the frames of StackMap and StackMapTable attributes. - */ - protected static class StackMapTableWriter - implements stack_map_frame.Visitor<Void,ClassOutputStream> { - - public void write(stack_map_frame frame, ClassOutputStream out) { - out.write(frame.frame_type); - frame.accept(this, out); - } - - public Void visit_same_frame(same_frame frame, ClassOutputStream p) { - return null; - } - - public Void visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, ClassOutputStream out) { - writeVerificationTypeInfo(frame.stack[0], out); - return null; - } - - public Void visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, ClassOutputStream out) { - out.writeShort(frame.offset_delta); - writeVerificationTypeInfo(frame.stack[0], out); - return null; - } - - public Void visit_chop_frame(chop_frame frame, ClassOutputStream out) { - out.writeShort(frame.offset_delta); - return null; - } - - public Void visit_same_frame_extended(same_frame_extended frame, ClassOutputStream out) { - out.writeShort(frame.offset_delta); - return null; - } - - public Void visit_append_frame(append_frame frame, ClassOutputStream out) { - out.writeShort(frame.offset_delta); - for (verification_type_info l: frame.locals) - writeVerificationTypeInfo(l, out); - return null; - } - - public Void visit_full_frame(full_frame frame, ClassOutputStream out) { - out.writeShort(frame.offset_delta); - out.writeShort(frame.locals.length); - for (verification_type_info l: frame.locals) - writeVerificationTypeInfo(l, out); - out.writeShort(frame.stack.length); - for (verification_type_info s: frame.stack) - writeVerificationTypeInfo(s, out); - return null; - } - - protected void writeVerificationTypeInfo(verification_type_info info, - ClassOutputStream out) { - out.write(info.tag); - switch (info.tag) { - case ITEM_Top: - case ITEM_Integer: - case ITEM_Float: - case ITEM_Long: - case ITEM_Double: - case ITEM_Null: - case ITEM_UninitializedThis: - break; - - case ITEM_Object: - Object_variable_info o = (Object_variable_info) info; - out.writeShort(o.cpool_index); - break; - - case ITEM_Uninitialized: - Uninitialized_variable_info u = (Uninitialized_variable_info) info; - out.writeShort(u.offset); - break; - - default: - throw new Error(); - } - } - } - - /** - * Writer for annotations and the values they contain. - */ - protected static class AnnotationWriter - implements Annotation.element_value.Visitor<Void,ClassOutputStream> { - public void write(Annotation[] annos, ClassOutputStream out) { - out.writeShort(annos.length); - for (Annotation anno: annos) - write(anno, out); - } - - public void write(TypeAnnotation[] annos, ClassOutputStream out) { - out.writeShort(annos.length); - for (TypeAnnotation anno: annos) - write(anno, out); - } - - public void write(Annotation anno, ClassOutputStream out) { - out.writeShort(anno.type_index); - out.writeShort(anno.element_value_pairs.length); - for (element_value_pair p: anno.element_value_pairs) - write(p, out); - } - - public void write(TypeAnnotation anno, ClassOutputStream out) { - write(anno.position, out); - write(anno.annotation, out); - } - - public void write(element_value_pair pair, ClassOutputStream out) { - out.writeShort(pair.element_name_index); - write(pair.value, out); - } - - public void write(element_value ev, ClassOutputStream out) { - out.writeByte(ev.tag); - ev.accept(this, out); - } - - public Void visitPrimitive(Primitive_element_value ev, ClassOutputStream out) { - out.writeShort(ev.const_value_index); - return null; - } - - public Void visitEnum(Enum_element_value ev, ClassOutputStream out) { - out.writeShort(ev.type_name_index); - out.writeShort(ev.const_name_index); - return null; - } - - public Void visitClass(Class_element_value ev, ClassOutputStream out) { - out.writeShort(ev.class_info_index); - return null; - } - - public Void visitAnnotation(Annotation_element_value ev, ClassOutputStream out) { - write(ev.annotation_value, out); - return null; - } - - public Void visitArray(Array_element_value ev, ClassOutputStream out) { - out.writeShort(ev.num_values); - for (element_value v: ev.values) - write(v, out); - return null; - } - - // TODO: Move this to TypeAnnotation to be closer with similar logic? - private void write(TypeAnnotation.Position p, ClassOutputStream out) { - out.writeByte(p.type.targetTypeValue()); - switch (p.type) { - // instanceof - case INSTANCEOF: - // new expression - case NEW: - // constructor/method reference receiver - case CONSTRUCTOR_REFERENCE: - case METHOD_REFERENCE: - out.writeShort(p.offset); - break; - // local variable - case LOCAL_VARIABLE: - // resource variable - case RESOURCE_VARIABLE: - int table_length = p.lvarOffset.length; - out.writeShort(table_length); - for (int i = 0; i < table_length; ++i) { - out.writeShort(1); // for table length - out.writeShort(p.lvarOffset[i]); - out.writeShort(p.lvarLength[i]); - out.writeShort(p.lvarIndex[i]); - } - break; - // exception parameter - case EXCEPTION_PARAMETER: - out.writeShort(p.exception_index); - break; - // method receiver - case METHOD_RECEIVER: - // Do nothing - break; - // type parameters - case CLASS_TYPE_PARAMETER: - case METHOD_TYPE_PARAMETER: - out.writeByte(p.parameter_index); - break; - // type parameters bounds - case CLASS_TYPE_PARAMETER_BOUND: - case METHOD_TYPE_PARAMETER_BOUND: - out.writeByte(p.parameter_index); - out.writeByte(p.bound_index); - break; - // class extends or implements clause - case CLASS_EXTENDS: - out.writeShort(p.type_index); - break; - // throws - case THROWS: - out.writeShort(p.type_index); - break; - // method parameter - case METHOD_FORMAL_PARAMETER: - out.writeByte(p.parameter_index); - break; - // type cast - case CAST: - // method/constructor/reference type argument - case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: - case METHOD_INVOCATION_TYPE_ARGUMENT: - case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: - case METHOD_REFERENCE_TYPE_ARGUMENT: - out.writeShort(p.offset); - out.writeByte(p.type_index); - break; - // We don't need to worry about these - case METHOD_RETURN: - case FIELD: - break; - case UNKNOWN: - throw new AssertionError("ClassWriter: UNKNOWN target type should never occur!"); - default: - throw new AssertionError("ClassWriter: Unknown target type for position: " + p); - } - - { // Append location data for generics/arrays. - // TODO: check for overrun? - out.writeByte((byte)p.location.size()); - for (int i : TypeAnnotation.Position.getBinaryFromTypePath(p.location)) - out.writeByte((byte)i); - } - } - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Code_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * See JVMS, section 4.8.3. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Code_attribute extends Attribute { - public static class InvalidIndex extends AttributeException { - private static final long serialVersionUID = -8904527774589382802L; - InvalidIndex(int index) { - this.index = index; - } - - @Override - public String getMessage() { - // i18n - return "invalid index " + index + " in Code attribute"; - } - - public final int index; - } - - Code_attribute(ClassReader cr, int name_index, int length) - throws IOException, ConstantPoolException { - super(name_index, length); - max_stack = cr.readUnsignedShort(); - max_locals = cr.readUnsignedShort(); - code_length = cr.readInt(); - code = new byte[code_length]; - cr.readFully(code); - exception_table_length = cr.readUnsignedShort(); - exception_table = new Exception_data[exception_table_length]; - for (int i = 0; i < exception_table_length; i++) - exception_table[i] = new Exception_data(cr); - attributes = new Attributes(cr); - } - - public int getByte(int offset) throws InvalidIndex { - if (offset < 0 || offset >= code.length) - throw new InvalidIndex(offset); - return code[offset]; - } - - public int getUnsignedByte(int offset) throws InvalidIndex { - if (offset < 0 || offset >= code.length) - throw new InvalidIndex(offset); - return code[offset] & 0xff; - } - - public int getShort(int offset) throws InvalidIndex { - if (offset < 0 || offset + 1 >= code.length) - throw new InvalidIndex(offset); - return (code[offset] << 8) | (code[offset + 1] & 0xFF); - } - - public int getUnsignedShort(int offset) throws InvalidIndex { - if (offset < 0 || offset + 1 >= code.length) - throw new InvalidIndex(offset); - return ((code[offset] << 8) | (code[offset + 1] & 0xFF)) & 0xFFFF; - } - - public int getInt(int offset) throws InvalidIndex { - if (offset < 0 || offset + 3 >= code.length) - throw new InvalidIndex(offset); - return (getShort(offset) << 16) | (getShort(offset + 2) & 0xFFFF); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitCode(this, data); - } - - public Iterable<Instruction> getInstructions() { - return new Iterable<Instruction>() { - public Iterator<Instruction> iterator() { - return new Iterator<Instruction>() { - - public boolean hasNext() { - return (next != null); - } - - public Instruction next() { - if (next == null) - throw new NoSuchElementException(); - - current = next; - pc += current.length(); - next = (pc < code.length ? new Instruction(code, pc) : null); - return current; - } - - public void remove() { - throw new UnsupportedOperationException("Not supported."); - } - - Instruction current = null; - int pc = 0; - Instruction next = new Instruction(code, pc); - - }; - } - - }; - } - - public final int max_stack; - public final int max_locals; - public final int code_length; - public final byte[] code; - public final int exception_table_length; - public final Exception_data[] exception_table; - public final Attributes attributes; - - public static class Exception_data { - Exception_data(ClassReader cr) throws IOException { - start_pc = cr.readUnsignedShort(); - end_pc = cr.readUnsignedShort(); - handler_pc = cr.readUnsignedShort(); - catch_type = cr.readUnsignedShort(); - } - - public final int start_pc; - public final int end_pc; - public final int handler_pc; - public final int catch_type; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/CompilationID_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class CompilationID_attribute extends Attribute { - - CompilationID_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - compilationID_index = cr.readUnsignedShort(); - } - - public CompilationID_attribute(ConstantPool constant_pool, int compilationID_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.CompilationID), compilationID_index); - } - - public CompilationID_attribute(int name_index, int compilationID_index) { - super(name_index, 2); - this.compilationID_index = compilationID_index; - } - - String getCompilationID(ConstantPool constant_pool) - throws ConstantPoolException { - return constant_pool.getUTF8Value(compilationID_index); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitCompilationID(this, data); - } - - public final int compilationID_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPool.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,914 +0,0 @@ -/* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Iterator; - -/** - * See JVMS, section 4.5. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ConstantPool { - - public static class InvalidIndex extends ConstantPoolException { - private static final long serialVersionUID = -4350294289300939730L; - InvalidIndex(int index) { - super(index); - } - - @Override - public String getMessage() { - // i18n - return "invalid index #" + index; - } - } - - public static class UnexpectedEntry extends ConstantPoolException { - private static final long serialVersionUID = 6986335935377933211L; - UnexpectedEntry(int index, int expected_tag, int found_tag) { - super(index); - this.expected_tag = expected_tag; - this.found_tag = found_tag; - } - - @Override - public String getMessage() { - // i18n? - return "unexpected entry at #" + index + " -- expected tag " + expected_tag + ", found " + found_tag; - } - - public final int expected_tag; - public final int found_tag; - } - - public static class InvalidEntry extends ConstantPoolException { - private static final long serialVersionUID = 1000087545585204447L; - InvalidEntry(int index, int tag) { - super(index); - this.tag = tag; - } - - @Override - public String getMessage() { - // i18n? - return "unexpected tag at #" + index + ": " + tag; - } - - public final int tag; - } - - public static class EntryNotFound extends ConstantPoolException { - private static final long serialVersionUID = 2885537606468581850L; - EntryNotFound(Object value) { - super(-1); - this.value = value; - } - - @Override - public String getMessage() { - // i18n? - return "value not found: " + value; - } - - public final Object value; - } - - public static final int CONSTANT_Utf8 = 1; - public static final int CONSTANT_Integer = 3; - public static final int CONSTANT_Float = 4; - public static final int CONSTANT_Long = 5; - public static final int CONSTANT_Double = 6; - public static final int CONSTANT_Class = 7; - public static final int CONSTANT_String = 8; - public static final int CONSTANT_Fieldref = 9; - public static final int CONSTANT_Methodref = 10; - public static final int CONSTANT_InterfaceMethodref = 11; - public static final int CONSTANT_NameAndType = 12; - public static final int CONSTANT_MethodHandle = 15; - public static final int CONSTANT_MethodType = 16; - public static final int CONSTANT_InvokeDynamic = 18; - - public static enum RefKind { - REF_getField(1, "getfield"), - REF_getStatic(2, "getstatic"), - REF_putField(3, "putfield"), - REF_putStatic(4, "putstatic"), - REF_invokeVirtual(5, "invokevirtual"), - REF_invokeStatic(6, "invokestatic"), - REF_invokeSpecial(7, "invokespecial"), - REF_newInvokeSpecial(8, "newinvokespecial"), - REF_invokeInterface(9, "invokeinterface"); - - public final int tag; - public final String name; - - RefKind(int tag, String name) { - this.tag = tag; - this.name = name; - } - - static RefKind getRefkind(int tag) { - switch(tag) { - case 1: - return REF_getField; - case 2: - return REF_getStatic; - case 3: - return REF_putField; - case 4: - return REF_putStatic; - case 5: - return REF_invokeVirtual; - case 6: - return REF_invokeStatic; - case 7: - return REF_invokeSpecial; - case 8: - return REF_newInvokeSpecial; - case 9: - return REF_invokeInterface; - default: - return null; - } - } - } - - ConstantPool(ClassReader cr) throws IOException, InvalidEntry { - int count = cr.readUnsignedShort(); - pool = new CPInfo[count]; - for (int i = 1; i < count; i++) { - int tag = cr.readUnsignedByte(); - switch (tag) { - case CONSTANT_Class: - pool[i] = new CONSTANT_Class_info(this, cr); - break; - - case CONSTANT_Double: - pool[i] = new CONSTANT_Double_info(cr); - i++; - break; - - case CONSTANT_Fieldref: - pool[i] = new CONSTANT_Fieldref_info(this, cr); - break; - - case CONSTANT_Float: - pool[i] = new CONSTANT_Float_info(cr); - break; - - case CONSTANT_Integer: - pool[i] = new CONSTANT_Integer_info(cr); - break; - - case CONSTANT_InterfaceMethodref: - pool[i] = new CONSTANT_InterfaceMethodref_info(this, cr); - break; - - case CONSTANT_InvokeDynamic: - pool[i] = new CONSTANT_InvokeDynamic_info(this, cr); - break; - - case CONSTANT_Long: - pool[i] = new CONSTANT_Long_info(cr); - i++; - break; - - case CONSTANT_MethodHandle: - pool[i] = new CONSTANT_MethodHandle_info(this, cr); - break; - - case CONSTANT_MethodType: - pool[i] = new CONSTANT_MethodType_info(this, cr); - break; - - case CONSTANT_Methodref: - pool[i] = new CONSTANT_Methodref_info(this, cr); - break; - - case CONSTANT_NameAndType: - pool[i] = new CONSTANT_NameAndType_info(this, cr); - break; - - case CONSTANT_String: - pool[i] = new CONSTANT_String_info(this, cr); - break; - - case CONSTANT_Utf8: - pool[i] = new CONSTANT_Utf8_info(cr); - break; - - default: - throw new InvalidEntry(i, tag); - } - } - } - - public ConstantPool(CPInfo[] pool) { - this.pool = pool; - } - - public int size() { - return pool.length; - } - - public int byteLength() { - int length = 2; - for (int i = 1; i < size(); ) { - CPInfo cpInfo = pool[i]; - length += cpInfo.byteLength(); - i += cpInfo.size(); - } - return length; - } - - public CPInfo get(int index) throws InvalidIndex { - if (index <= 0 || index >= pool.length) - throw new InvalidIndex(index); - CPInfo info = pool[index]; - if (info == null) { - // this occurs for indices referencing the "second half" of an - // 8 byte constant, such as CONSTANT_Double or CONSTANT_Long - throw new InvalidIndex(index); - } - return pool[index]; - } - - private CPInfo get(int index, int expected_type) throws InvalidIndex, UnexpectedEntry { - CPInfo info = get(index); - if (info.getTag() != expected_type) - throw new UnexpectedEntry(index, expected_type, info.getTag()); - return info; - } - - public CONSTANT_Utf8_info getUTF8Info(int index) throws InvalidIndex, UnexpectedEntry { - return ((CONSTANT_Utf8_info) get(index, CONSTANT_Utf8)); - } - - public CONSTANT_Class_info getClassInfo(int index) throws InvalidIndex, UnexpectedEntry { - return ((CONSTANT_Class_info) get(index, CONSTANT_Class)); - } - - public CONSTANT_NameAndType_info getNameAndTypeInfo(int index) throws InvalidIndex, UnexpectedEntry { - return ((CONSTANT_NameAndType_info) get(index, CONSTANT_NameAndType)); - } - - public String getUTF8Value(int index) throws InvalidIndex, UnexpectedEntry { - return getUTF8Info(index).value; - } - - public int getUTF8Index(String value) throws EntryNotFound { - for (int i = 1; i < pool.length; i++) { - CPInfo info = pool[i]; - if (info instanceof CONSTANT_Utf8_info && - ((CONSTANT_Utf8_info) info).value.equals(value)) - return i; - } - throw new EntryNotFound(value); - } - - public Iterable<CPInfo> entries() { - return new Iterable<CPInfo>() { - public Iterator<CPInfo> iterator() { - return new Iterator<CPInfo>() { - - public boolean hasNext() { - return next < pool.length; - } - - public CPInfo next() { - current = pool[next]; - switch (current.getTag()) { - case CONSTANT_Double: - case CONSTANT_Long: - next += 2; - break; - default: - next += 1; - } - return current; - } - - public void remove() { - throw new UnsupportedOperationException(); - } - - private CPInfo current; - private int next = 1; - - }; - } - }; - } - - private CPInfo[] pool; - - public interface Visitor<R,P> { - R visitClass(CONSTANT_Class_info info, P p); - R visitDouble(CONSTANT_Double_info info, P p); - R visitFieldref(CONSTANT_Fieldref_info info, P p); - R visitFloat(CONSTANT_Float_info info, P p); - R visitInteger(CONSTANT_Integer_info info, P p); - R visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, P p); - R visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, P p); - R visitLong(CONSTANT_Long_info info, P p); - R visitNameAndType(CONSTANT_NameAndType_info info, P p); - R visitMethodref(CONSTANT_Methodref_info info, P p); - R visitMethodHandle(CONSTANT_MethodHandle_info info, P p); - R visitMethodType(CONSTANT_MethodType_info info, P p); - R visitString(CONSTANT_String_info info, P p); - R visitUtf8(CONSTANT_Utf8_info info, P p); - } - - public static abstract class CPInfo { - CPInfo() { - this.cp = null; - } - - CPInfo(ConstantPool cp) { - this.cp = cp; - } - - public abstract int getTag(); - - /** The number of slots in the constant pool used by this entry. - * 2 for CONSTANT_Double and CONSTANT_Long; 1 for everything else. */ - public int size() { - return 1; - } - - public abstract int byteLength(); - - public abstract <R,D> R accept(Visitor<R,D> visitor, D data); - - protected final ConstantPool cp; - } - - public static abstract class CPRefInfo extends CPInfo { - protected CPRefInfo(ConstantPool cp, ClassReader cr, int tag) throws IOException { - super(cp); - this.tag = tag; - class_index = cr.readUnsignedShort(); - name_and_type_index = cr.readUnsignedShort(); - } - - protected CPRefInfo(ConstantPool cp, int tag, int class_index, int name_and_type_index) { - super(cp); - this.tag = tag; - this.class_index = class_index; - this.name_and_type_index = name_and_type_index; - } - - public int getTag() { - return tag; - } - - public int byteLength() { - return 5; - } - - public CONSTANT_Class_info getClassInfo() throws ConstantPoolException { - return cp.getClassInfo(class_index); - } - - public String getClassName() throws ConstantPoolException { - return cp.getClassInfo(class_index).getName(); - } - - public CONSTANT_NameAndType_info getNameAndTypeInfo() throws ConstantPoolException { - return cp.getNameAndTypeInfo(name_and_type_index); - } - - public final int tag; - public final int class_index; - public final int name_and_type_index; - } - - public static class CONSTANT_Class_info extends CPInfo { - CONSTANT_Class_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - name_index = cr.readUnsignedShort(); - } - - public CONSTANT_Class_info(ConstantPool cp, int name_index) { - super(cp); - this.name_index = name_index; - } - - public int getTag() { - return CONSTANT_Class; - } - - public int byteLength() { - return 3; - } - - /** - * Get the raw value of the class referenced by this constant pool entry. - * This will either be the name of the class, in internal form, or a - * descriptor for an array class. - * @return the raw value of the class - */ - public String getName() throws ConstantPoolException { - return cp.getUTF8Value(name_index); - } - - /** - * If this constant pool entry identifies either a class or interface type, - * or a possibly multi-dimensional array of a class of interface type, - * return the name of the class or interface in internal form. Otherwise, - * (i.e. if this is a possibly multi-dimensional array of a primitive type), - * return null. - * @return the base class or interface name - */ - public String getBaseName() throws ConstantPoolException { - String name = getName(); - if (name.startsWith("[")) { - int index = name.indexOf("[L"); - if (index == -1) - return null; - return name.substring(index + 2, name.length() - 1); - } else - return name; - } - - public int getDimensionCount() throws ConstantPoolException { - String name = getName(); - int count = 0; - while (name.charAt(count) == '[') - count++; - return count; - } - - @Override - public String toString() { - return "CONSTANT_Class_info[name_index: " + name_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitClass(this, data); - } - - public final int name_index; - } - - public static class CONSTANT_Double_info extends CPInfo { - CONSTANT_Double_info(ClassReader cr) throws IOException { - value = cr.readDouble(); - } - - public CONSTANT_Double_info(double value) { - this.value = value; - } - - public int getTag() { - return CONSTANT_Double; - } - - public int byteLength() { - return 9; - } - - @Override - public int size() { - return 2; - } - - @Override - public String toString() { - return "CONSTANT_Double_info[value: " + value + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitDouble(this, data); - } - - public final double value; - } - - public static class CONSTANT_Fieldref_info extends CPRefInfo { - CONSTANT_Fieldref_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp, cr, CONSTANT_Fieldref); - } - - public CONSTANT_Fieldref_info(ConstantPool cp, int class_index, int name_and_type_index) { - super(cp, CONSTANT_Fieldref, class_index, name_and_type_index); - } - - @Override - public String toString() { - return "CONSTANT_Fieldref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitFieldref(this, data); - } - } - - public static class CONSTANT_Float_info extends CPInfo { - CONSTANT_Float_info(ClassReader cr) throws IOException { - value = cr.readFloat(); - } - - public CONSTANT_Float_info(float value) { - this.value = value; - } - - public int getTag() { - return CONSTANT_Float; - } - - public int byteLength() { - return 5; - } - - @Override - public String toString() { - return "CONSTANT_Float_info[value: " + value + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitFloat(this, data); - } - - public final float value; - } - - public static class CONSTANT_Integer_info extends CPInfo { - CONSTANT_Integer_info(ClassReader cr) throws IOException { - value = cr.readInt(); - } - - public CONSTANT_Integer_info(int value) { - this.value = value; - } - - public int getTag() { - return CONSTANT_Integer; - } - - public int byteLength() { - return 5; - } - - @Override - public String toString() { - return "CONSTANT_Integer_info[value: " + value + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitInteger(this, data); - } - - public final int value; - } - - public static class CONSTANT_InterfaceMethodref_info extends CPRefInfo { - CONSTANT_InterfaceMethodref_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp, cr, CONSTANT_InterfaceMethodref); - } - - public CONSTANT_InterfaceMethodref_info(ConstantPool cp, int class_index, int name_and_type_index) { - super(cp, CONSTANT_InterfaceMethodref, class_index, name_and_type_index); - } - - @Override - public String toString() { - return "CONSTANT_InterfaceMethodref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitInterfaceMethodref(this, data); - } - } - - public static class CONSTANT_InvokeDynamic_info extends CPInfo { - CONSTANT_InvokeDynamic_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - bootstrap_method_attr_index = cr.readUnsignedShort(); - name_and_type_index = cr.readUnsignedShort(); - } - - public CONSTANT_InvokeDynamic_info(ConstantPool cp, int bootstrap_method_index, int name_and_type_index) { - super(cp); - this.bootstrap_method_attr_index = bootstrap_method_index; - this.name_and_type_index = name_and_type_index; - } - - public int getTag() { - return CONSTANT_InvokeDynamic; - } - - public int byteLength() { - return 5; - } - - @Override - public String toString() { - return "CONSTANT_InvokeDynamic_info[bootstrap_method_index: " + bootstrap_method_attr_index + ", name_and_type_index: " + name_and_type_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitInvokeDynamic(this, data); - } - - public CONSTANT_NameAndType_info getNameAndTypeInfo() throws ConstantPoolException { - return cp.getNameAndTypeInfo(name_and_type_index); - } - - public final int bootstrap_method_attr_index; - public final int name_and_type_index; - } - - public static class CONSTANT_Long_info extends CPInfo { - CONSTANT_Long_info(ClassReader cr) throws IOException { - value = cr.readLong(); - } - - public CONSTANT_Long_info(long value) { - this.value = value; - } - - public int getTag() { - return CONSTANT_Long; - } - - @Override - public int size() { - return 2; - } - - public int byteLength() { - return 9; - } - - @Override - public String toString() { - return "CONSTANT_Long_info[value: " + value + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitLong(this, data); - } - - public final long value; - } - - public static class CONSTANT_MethodHandle_info extends CPInfo { - CONSTANT_MethodHandle_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - reference_kind = RefKind.getRefkind(cr.readUnsignedByte()); - reference_index = cr.readUnsignedShort(); - } - - public CONSTANT_MethodHandle_info(ConstantPool cp, RefKind ref_kind, int member_index) { - super(cp); - this.reference_kind = ref_kind; - this.reference_index = member_index; - } - - public int getTag() { - return CONSTANT_MethodHandle; - } - - public int byteLength() { - return 4; - } - - @Override - public String toString() { - return "CONSTANT_MethodHandle_info[ref_kind: " + reference_kind + ", member_index: " + reference_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitMethodHandle(this, data); - } - - public CPRefInfo getCPRefInfo() throws ConstantPoolException { - int expected = CONSTANT_Methodref; - int actual = cp.get(reference_index).getTag(); - // allow these tag types also: - switch (actual) { - case CONSTANT_Fieldref: - case CONSTANT_InterfaceMethodref: - expected = actual; - } - return (CPRefInfo) cp.get(reference_index, expected); - } - - public final RefKind reference_kind; - public final int reference_index; - } - - public static class CONSTANT_MethodType_info extends CPInfo { - CONSTANT_MethodType_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - descriptor_index = cr.readUnsignedShort(); - } - - public CONSTANT_MethodType_info(ConstantPool cp, int signature_index) { - super(cp); - this.descriptor_index = signature_index; - } - - public int getTag() { - return CONSTANT_MethodType; - } - - public int byteLength() { - return 3; - } - - @Override - public String toString() { - return "CONSTANT_MethodType_info[signature_index: " + descriptor_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitMethodType(this, data); - } - - public String getType() throws ConstantPoolException { - return cp.getUTF8Value(descriptor_index); - } - - public final int descriptor_index; - } - - public static class CONSTANT_Methodref_info extends CPRefInfo { - CONSTANT_Methodref_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp, cr, CONSTANT_Methodref); - } - - public CONSTANT_Methodref_info(ConstantPool cp, int class_index, int name_and_type_index) { - super(cp, CONSTANT_Methodref, class_index, name_and_type_index); - } - - @Override - public String toString() { - return "CONSTANT_Methodref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitMethodref(this, data); - } - } - - public static class CONSTANT_NameAndType_info extends CPInfo { - CONSTANT_NameAndType_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - name_index = cr.readUnsignedShort(); - type_index = cr.readUnsignedShort(); - } - - public CONSTANT_NameAndType_info(ConstantPool cp, int name_index, int type_index) { - super(cp); - this.name_index = name_index; - this.type_index = type_index; - } - - public int getTag() { - return CONSTANT_NameAndType; - } - - public int byteLength() { - return 5; - } - - public String getName() throws ConstantPoolException { - return cp.getUTF8Value(name_index); - } - - public String getType() throws ConstantPoolException { - return cp.getUTF8Value(type_index); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitNameAndType(this, data); - } - - @Override - public String toString() { - return "CONSTANT_NameAndType_info[name_index: " + name_index + ", type_index: " + type_index + "]"; - } - - public final int name_index; - public final int type_index; - } - - public static class CONSTANT_String_info extends CPInfo { - CONSTANT_String_info(ConstantPool cp, ClassReader cr) throws IOException { - super(cp); - string_index = cr.readUnsignedShort(); - } - - public CONSTANT_String_info(ConstantPool cp, int string_index) { - super(cp); - this.string_index = string_index; - } - - public int getTag() { - return CONSTANT_String; - } - - public int byteLength() { - return 3; - } - - public String getString() throws ConstantPoolException { - return cp.getUTF8Value(string_index); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitString(this, data); - } - - @Override - public String toString() { - return "CONSTANT_String_info[class_index: " + string_index + "]"; - } - - public final int string_index; - } - - public static class CONSTANT_Utf8_info extends CPInfo { - CONSTANT_Utf8_info(ClassReader cr) throws IOException { - value = cr.readUTF(); - } - - public CONSTANT_Utf8_info(String value) { - this.value = value; - } - - public int getTag() { - return CONSTANT_Utf8; - } - - public int byteLength() { - class SizeOutputStream extends OutputStream { - @Override - public void write(int b) { - size++; - } - int size; - } - SizeOutputStream sizeOut = new SizeOutputStream(); - DataOutputStream out = new DataOutputStream(sizeOut); - try { out.writeUTF(value); } catch (IOException ignore) { } - return 1 + sizeOut.size; - } - - @Override - public String toString() { - if (value.length() < 32 && isPrintableAscii(value)) - return "CONSTANT_Utf8_info[value: \"" + value + "\"]"; - else - return "CONSTANT_Utf8_info[value: (" + value.length() + " chars)]"; - } - - static boolean isPrintableAscii(String s) { - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c < 32 || c >= 127) - return false; - } - return true; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitUtf8(this, data); - } - - public final String value; - } - -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPoolException.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package com.sun.tools.classfile; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ConstantPoolException extends Exception { - private static final long serialVersionUID = -2324397349644754565L; - ConstantPoolException(int index) { - this.index = index; - } - - public final int index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantValue_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.2. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ConstantValue_attribute extends Attribute { - ConstantValue_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - constantvalue_index = cr.readUnsignedShort(); - } - - public ConstantValue_attribute(ConstantPool constant_pool, int constantvalue_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.ConstantValue), constantvalue_index); - } - - public ConstantValue_attribute(int name_index, int constantvalue_index) { - super(name_index, 2); - this.constantvalue_index = constantvalue_index; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitConstantValue(this, data); - } - - public final int constantvalue_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/DefaultAttribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class DefaultAttribute extends Attribute { - DefaultAttribute(ClassReader cr, int name_index, byte[] data) { - this(cr, name_index, data, null); - } - - DefaultAttribute(ClassReader cr, int name_index, byte[] data, String reason) { - super(name_index, data.length); - info = data; - this.reason = reason; - } - - public DefaultAttribute(ConstantPool constant_pool, int name_index, byte[] info) { - this(constant_pool, name_index, info, null); - } - - public DefaultAttribute(ConstantPool constant_pool, int name_index, - byte[] info, String reason) { - super(name_index, info.length); - this.info = info; - this.reason = reason; - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitDefault(this, p); - } - - public final byte[] info; - /** Why did we need to generate a DefaultAttribute - */ - public final String reason; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependencies.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,794 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.classfile; - -import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.regex.Pattern; - -import com.sun.tools.classfile.Dependency.Filter; -import com.sun.tools.classfile.Dependency.Finder; -import com.sun.tools.classfile.Dependency.Location; -import com.sun.tools.classfile.Type.ArrayType; -import com.sun.tools.classfile.Type.ClassSigType; -import com.sun.tools.classfile.Type.ClassType; -import com.sun.tools.classfile.Type.MethodType; -import com.sun.tools.classfile.Type.SimpleType; -import com.sun.tools.classfile.Type.TypeParamType; -import com.sun.tools.classfile.Type.WildcardType; - -import static com.sun.tools.classfile.ConstantPool.*; - -/** - * A framework for determining {@link Dependency dependencies} between class files. - * - * A {@link Dependency.Finder finder} is used to identify the dependencies of - * individual classes. Some finders may return subtypes of {@code Dependency} to - * further characterize the type of dependency, such as a dependency on a - * method within a class. - * - * A {@link Dependency.Filter filter} may be used to restrict the set of - * dependencies found by a finder. - * - * Dependencies that are found may be passed to a {@link Dependencies.Recorder - * recorder} so that the dependencies can be stored in a custom data structure. - */ -public class Dependencies { - /** - * Thrown when a class file cannot be found. - */ - public static class ClassFileNotFoundException extends Exception { - private static final long serialVersionUID = 3632265927794475048L; - - public ClassFileNotFoundException(String className) { - super(className); - this.className = className; - } - - public ClassFileNotFoundException(String className, Throwable cause) { - this(className); - initCause(cause); - } - - public final String className; - } - - /** - * Thrown when an exception is found processing a class file. - */ - public static class ClassFileError extends Error { - private static final long serialVersionUID = 4111110813961313203L; - - public ClassFileError(Throwable cause) { - initCause(cause); - } - } - - /** - * Service provider interface to locate and read class files. - */ - public interface ClassFileReader { - /** - * Get the ClassFile object for a specified class. - * @param className the name of the class to be returned. - * @return the ClassFile for the given class - * @throws Dependencies.ClassFileNotFoundException if the classfile cannot be - * found - */ - public ClassFile getClassFile(String className) - throws ClassFileNotFoundException; - } - - /** - * Service provide interface to handle results. - */ - public interface Recorder { - /** - * Record a dependency that has been found. - * @param d - */ - public void addDependency(Dependency d); - } - - /** - * Get the default finder used to locate the dependencies for a class. - * @return the default finder - */ - public static Finder getDefaultFinder() { - return new APIDependencyFinder(AccessFlags.ACC_PRIVATE); - } - - /** - * Get a finder used to locate the API dependencies for a class. - * These include the superclass, superinterfaces, and classes referenced in - * the declarations of fields and methods. The fields and methods that - * are checked can be limited according to a specified access. - * The access parameter must be one of {@link AccessFlags#ACC_PUBLIC ACC_PUBLIC}, - * {@link AccessFlags#ACC_PRIVATE ACC_PRIVATE}, - * {@link AccessFlags#ACC_PROTECTED ACC_PROTECTED}, or 0 for - * package private access. Members with greater than or equal accessibility - * to that specified will be searched for dependencies. - * @param access the access of members to be checked - * @return an API finder - */ - public static Finder getAPIFinder(int access) { - return new APIDependencyFinder(access); - } - - /** - * Get a finder to do class dependency analysis. - * - * @return a Class dependency finder - */ - public static Finder getClassDependencyFinder() { - return new ClassDependencyFinder(); - } - - /** - * Get the finder used to locate the dependencies for a class. - * @return the finder - */ - public Finder getFinder() { - if (finder == null) - finder = getDefaultFinder(); - return finder; - } - - /** - * Set the finder used to locate the dependencies for a class. - * @param f the finder - */ - public void setFinder(Finder f) { - finder = Objects.requireNonNull(f); - } - - /** - * Get the default filter used to determine included when searching - * the transitive closure of all the dependencies. - * Unless overridden, the default filter accepts all dependencies. - * @return the default filter. - */ - public static Filter getDefaultFilter() { - return DefaultFilter.instance(); - } - - /** - * Get a filter which uses a regular expression on the target's class name - * to determine if a dependency is of interest. - * @param pattern the pattern used to match the target's class name - * @return a filter for matching the target class name with a regular expression - */ - public static Filter getRegexFilter(Pattern pattern) { - return new TargetRegexFilter(pattern); - } - - /** - * Get a filter which checks the package of a target's class name - * to determine if a dependency is of interest. The filter checks if the - * package of the target's class matches any of a set of given package - * names. The match may optionally match subpackages of the given names as well. - * @param packageNames the package names used to match the target's class name - * @param matchSubpackages whether or not to match subpackages as well - * @return a filter for checking the target package name against a list of package names - */ - public static Filter getPackageFilter(Set<String> packageNames, boolean matchSubpackages) { - return new TargetPackageFilter(packageNames, matchSubpackages); - } - - /** - * Get the filter used to determine the dependencies included when searching - * the transitive closure of all the dependencies. - * Unless overridden, the default filter accepts all dependencies. - * @return the filter - */ - public Filter getFilter() { - if (filter == null) - filter = getDefaultFilter(); - return filter; - } - - /** - * Set the filter used to determine the dependencies included when searching - * the transitive closure of all the dependencies. - * @param f the filter - */ - public void setFilter(Filter f) { - filter = Objects.requireNonNull(f); - } - - /** - * Find the dependencies of a class, using the current - * {@link Dependencies#getFinder finder} and - * {@link Dependencies#getFilter filter}. - * The search may optionally include the transitive closure of all the - * filtered dependencies, by also searching in the classes named in those - * dependencies. - * @param classFinder a finder to locate class files - * @param rootClassNames the names of the root classes from which to begin - * searching - * @param transitiveClosure whether or not to also search those classes - * named in any filtered dependencies that are found. - * @return the set of dependencies that were found - * @throws ClassFileNotFoundException if a required class file cannot be found - * @throws ClassFileError if an error occurs while processing a class file, - * such as an error in the internal class file structure. - */ - public Set<Dependency> findAllDependencies( - ClassFileReader classFinder, Set<String> rootClassNames, - boolean transitiveClosure) - throws ClassFileNotFoundException { - final Set<Dependency> results = new HashSet<>(); - Recorder r = new Recorder() { - public void addDependency(Dependency d) { - results.add(d); - } - }; - findAllDependencies(classFinder, rootClassNames, transitiveClosure, r); - return results; - } - - /** - * Find the dependencies of a class, using the current - * {@link Dependencies#getFinder finder} and - * {@link Dependencies#getFilter filter}. - * The search may optionally include the transitive closure of all the - * filtered dependencies, by also searching in the classes named in those - * dependencies. - * @param classFinder a finder to locate class files - * @param rootClassNames the names of the root classes from which to begin - * searching - * @param transitiveClosure whether or not to also search those classes - * named in any filtered dependencies that are found. - * @param recorder a recorder for handling the results - * @throws ClassFileNotFoundException if a required class file cannot be found - * @throws ClassFileError if an error occurs while processing a class file, - * such as an error in the internal class file structure. - */ - public void findAllDependencies( - ClassFileReader classFinder, Set<String> rootClassNames, - boolean transitiveClosure, Recorder recorder) - throws ClassFileNotFoundException { - Set<String> doneClasses = new HashSet<>(); - - getFinder(); // ensure initialized - getFilter(); // ensure initialized - - // Work queue of names of classfiles to be searched. - // Entries will be unique, and for classes that do not yet have - // dependencies in the results map. - Deque<String> deque = new LinkedList<>(rootClassNames); - - String className; - while ((className = deque.poll()) != null) { - assert (!doneClasses.contains(className)); - doneClasses.add(className); - - ClassFile cf = classFinder.getClassFile(className); - - // The following code just applies the filter to the dependencies - // followed for the transitive closure. - for (Dependency d: finder.findDependencies(cf)) { - recorder.addDependency(d); - if (transitiveClosure && filter.accepts(d)) { - String cn = d.getTarget().getClassName(); - if (!doneClasses.contains(cn)) - deque.add(cn); - } - } - } - } - - private Filter filter; - private Finder finder; - - /** - * A location identifying a class. - */ - static class SimpleLocation implements Location { - public SimpleLocation(String name) { - this.name = name; - this.className = name.replace('/', '.'); - } - - public String getName() { - return name; - } - - public String getClassName() { - return className; - } - - public String getPackageName() { - int i = name.lastIndexOf('/'); - return (i > 0) ? name.substring(0, i).replace('/', '.') : ""; - } - - @Override - public boolean equals(Object other) { - if (this == other) - return true; - if (!(other instanceof SimpleLocation)) - return false; - return (name.equals(((SimpleLocation) other).name)); - } - - @Override - public int hashCode() { - return name.hashCode(); - } - - @Override - public String toString() { - return name; - } - - private String name; - private String className; - } - - /** - * A dependency of one class on another. - */ - static class SimpleDependency implements Dependency { - public SimpleDependency(Location origin, Location target) { - this.origin = origin; - this.target = target; - } - - public Location getOrigin() { - return origin; - } - - public Location getTarget() { - return target; - } - - @Override - public boolean equals(Object other) { - if (this == other) - return true; - if (!(other instanceof SimpleDependency)) - return false; - SimpleDependency o = (SimpleDependency) other; - return (origin.equals(o.origin) && target.equals(o.target)); - } - - @Override - public int hashCode() { - return origin.hashCode() * 31 + target.hashCode(); - } - - @Override - public String toString() { - return origin + ":" + target; - } - - private Location origin; - private Location target; - } - - - /** - * This class accepts all dependencies. - */ - static class DefaultFilter implements Filter { - private static DefaultFilter instance; - - static DefaultFilter instance() { - if (instance == null) - instance = new DefaultFilter(); - return instance; - } - - public boolean accepts(Dependency dependency) { - return true; - } - } - - /** - * This class accepts those dependencies whose target's class name matches a - * regular expression. - */ - static class TargetRegexFilter implements Filter { - TargetRegexFilter(Pattern pattern) { - this.pattern = pattern; - } - - public boolean accepts(Dependency dependency) { - return pattern.matcher(dependency.getTarget().getClassName()).matches(); - } - - private final Pattern pattern; - } - - /** - * This class accepts those dependencies whose class name is in a given - * package. - */ - static class TargetPackageFilter implements Filter { - TargetPackageFilter(Set<String> packageNames, boolean matchSubpackages) { - for (String pn: packageNames) { - if (pn.length() == 0) // implies null check as well - throw new IllegalArgumentException(); - } - this.packageNames = packageNames; - this.matchSubpackages = matchSubpackages; - } - - public boolean accepts(Dependency dependency) { - String pn = dependency.getTarget().getPackageName(); - if (packageNames.contains(pn)) - return true; - - if (matchSubpackages) { - for (String n: packageNames) { - if (pn.startsWith(n + ".")) - return true; - } - } - - return false; - } - - private final Set<String> packageNames; - private final boolean matchSubpackages; - } - - /** - * This class identifies class names directly or indirectly in the constant pool. - */ - static class ClassDependencyFinder extends BasicDependencyFinder { - public Iterable<? extends Dependency> findDependencies(ClassFile classfile) { - Visitor v = new Visitor(classfile); - for (CPInfo cpInfo: classfile.constant_pool.entries()) { - v.scan(cpInfo); - } - try { - v.addClass(classfile.super_class); - v.addClasses(classfile.interfaces); - v.scan(classfile.attributes); - - for (Field f : classfile.fields) { - v.scan(f.descriptor, f.attributes); - } - for (Method m : classfile.methods) { - v.scan(m.descriptor, m.attributes); - Exceptions_attribute e = - (Exceptions_attribute)m.attributes.get(Attribute.Exceptions); - if (e != null) { - v.addClasses(e.exception_index_table); - } - } - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - - return v.deps; - } - } - - /** - * This class identifies class names in the signatures of classes, fields, - * and methods in a class. - */ - static class APIDependencyFinder extends BasicDependencyFinder { - APIDependencyFinder(int access) { - switch (access) { - case AccessFlags.ACC_PUBLIC: - case AccessFlags.ACC_PROTECTED: - case AccessFlags.ACC_PRIVATE: - case 0: - showAccess = access; - break; - default: - throw new IllegalArgumentException("invalid access 0x" - + Integer.toHexString(access)); - } - } - - public Iterable<? extends Dependency> findDependencies(ClassFile classfile) { - try { - Visitor v = new Visitor(classfile); - v.addClass(classfile.super_class); - v.addClasses(classfile.interfaces); - // inner classes? - for (Field f : classfile.fields) { - if (checkAccess(f.access_flags)) - v.scan(f.descriptor, f.attributes); - } - for (Method m : classfile.methods) { - if (checkAccess(m.access_flags)) { - v.scan(m.descriptor, m.attributes); - Exceptions_attribute e = - (Exceptions_attribute) m.attributes.get(Attribute.Exceptions); - if (e != null) - v.addClasses(e.exception_index_table); - } - } - return v.deps; - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - boolean checkAccess(AccessFlags flags) { - // code copied from javap.Options.checkAccess - boolean isPublic = flags.is(AccessFlags.ACC_PUBLIC); - boolean isProtected = flags.is(AccessFlags.ACC_PROTECTED); - boolean isPrivate = flags.is(AccessFlags.ACC_PRIVATE); - boolean isPackage = !(isPublic || isProtected || isPrivate); - - if ((showAccess == AccessFlags.ACC_PUBLIC) && (isProtected || isPrivate || isPackage)) - return false; - else if ((showAccess == AccessFlags.ACC_PROTECTED) && (isPrivate || isPackage)) - return false; - else if ((showAccess == 0) && (isPrivate)) - return false; - else - return true; - } - - private int showAccess; - } - - static abstract class BasicDependencyFinder implements Finder { - private Map<String,Location> locations = new HashMap<>(); - - Location getLocation(String className) { - Location l = locations.get(className); - if (l == null) - locations.put(className, l = new SimpleLocation(className)); - return l; - } - - class Visitor implements ConstantPool.Visitor<Void,Void>, Type.Visitor<Void, Void> { - private ConstantPool constant_pool; - private Location origin; - Set<Dependency> deps; - - Visitor(ClassFile classFile) { - try { - constant_pool = classFile.constant_pool; - origin = getLocation(classFile.getName()); - deps = new HashSet<>(); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - void scan(Descriptor d, Attributes attrs) { - try { - scan(new Signature(d.index).getType(constant_pool)); - scan(attrs); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - void scan(CPInfo cpInfo) { - cpInfo.accept(this, null); - } - - void scan(Type t) { - t.accept(this, null); - } - - void scan(Attributes attrs) { - try { - Signature_attribute sa = (Signature_attribute)attrs.get(Attribute.Signature); - if (sa != null) - scan(sa.getParsedSignature().getType(constant_pool)); - - scan((RuntimeVisibleAnnotations_attribute) - attrs.get(Attribute.RuntimeVisibleAnnotations)); - scan((RuntimeVisibleParameterAnnotations_attribute) - attrs.get(Attribute.RuntimeVisibleParameterAnnotations)); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - private void scan(RuntimeAnnotations_attribute attr) throws ConstantPoolException { - if (attr == null) { - return; - } - for (int i = 0; i < attr.annotations.length; i++) { - int index = attr.annotations[i].type_index; - scan(new Signature(index).getType(constant_pool)); - } - } - - private void scan(RuntimeParameterAnnotations_attribute attr) throws ConstantPoolException { - if (attr == null) { - return; - } - for (int param = 0; param < attr.parameter_annotations.length; param++) { - for (int i = 0; i < attr.parameter_annotations[param].length; i++) { - int index = attr.parameter_annotations[param][i].type_index; - scan(new Signature(index).getType(constant_pool)); - } - } - } - - void addClass(int index) throws ConstantPoolException { - if (index != 0) { - String name = constant_pool.getClassInfo(index).getBaseName(); - if (name != null) - addDependency(name); - } - } - - void addClasses(int[] indices) throws ConstantPoolException { - for (int i: indices) - addClass(i); - } - - private void addDependency(String name) { - deps.add(new SimpleDependency(origin, getLocation(name))); - } - - // ConstantPool.Visitor methods - - public Void visitClass(CONSTANT_Class_info info, Void p) { - try { - if (info.getName().startsWith("[")) - new Signature(info.name_index).getType(constant_pool).accept(this, null); - else - addDependency(info.getBaseName()); - return null; - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - public Void visitDouble(CONSTANT_Double_info info, Void p) { - return null; - } - - public Void visitFieldref(CONSTANT_Fieldref_info info, Void p) { - return visitRef(info, p); - } - - public Void visitFloat(CONSTANT_Float_info info, Void p) { - return null; - } - - public Void visitInteger(CONSTANT_Integer_info info, Void p) { - return null; - } - - public Void visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { - return visitRef(info, p); - } - - public Void visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { - return null; - } - - public Void visitLong(CONSTANT_Long_info info, Void p) { - return null; - } - - public Void visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { - return null; - } - - public Void visitMethodType(CONSTANT_MethodType_info info, Void p) { - return null; - } - - public Void visitMethodref(CONSTANT_Methodref_info info, Void p) { - return visitRef(info, p); - } - - public Void visitNameAndType(CONSTANT_NameAndType_info info, Void p) { - try { - new Signature(info.type_index).getType(constant_pool).accept(this, null); - return null; - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - public Void visitString(CONSTANT_String_info info, Void p) { - return null; - } - - public Void visitUtf8(CONSTANT_Utf8_info info, Void p) { - return null; - } - - private Void visitRef(CPRefInfo info, Void p) { - try { - visitClass(info.getClassInfo(), p); - return null; - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - } - - // Type.Visitor methods - - private void findDependencies(Type t) { - if (t != null) - t.accept(this, null); - } - - private void findDependencies(List<? extends Type> ts) { - if (ts != null) { - for (Type t: ts) - t.accept(this, null); - } - } - - public Void visitSimpleType(SimpleType type, Void p) { - return null; - } - - public Void visitArrayType(ArrayType type, Void p) { - findDependencies(type.elemType); - return null; - } - - public Void visitMethodType(MethodType type, Void p) { - findDependencies(type.paramTypes); - findDependencies(type.returnType); - findDependencies(type.throwsTypes); - findDependencies(type.typeParamTypes); - return null; - } - - public Void visitClassSigType(ClassSigType type, Void p) { - findDependencies(type.superclassType); - findDependencies(type.superinterfaceTypes); - return null; - } - - public Void visitClassType(ClassType type, Void p) { - findDependencies(type.outerType); - addDependency(type.getBinaryName()); - findDependencies(type.typeArgs); - return null; - } - - public Void visitTypeParamType(TypeParamType type, Void p) { - findDependencies(type.classBound); - findDependencies(type.interfaceBounds); - return null; - } - - public Void visitWildcardType(WildcardType type, Void p) { - findDependencies(type.boundType); - return null; - } - } - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependency.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - - -/** - * A directed relationship between two {@link Dependency.Location Location}s. - * Subtypes of {@code Dependency} may provide additional detail about the dependency. - * - * @see Dependency.Finder - * @see Dependency.Filter - * @see Dependencies - */ -public interface Dependency { - /** - * A filter used to select dependencies of interest, and to discard others. - */ - public interface Filter { - /** - * Return true if the dependency is of interest. - * @param dependency the dependency to be considered - * @return true if and only if the dependency is of interest. - */ - boolean accepts(Dependency dependency); - } - - /** - * An interface for finding the immediate dependencies of a given class file. - */ - public interface Finder { - /** - * Find the immediate dependencies of a given class file. - * @param classfile the class file to be examined - * @return the dependencies located in the given class file. - */ - public Iterable<? extends Dependency> findDependencies(ClassFile classfile); - } - - - /** - * A location somewhere within a class. Subtypes of {@code Location} - * may be used to provide additional detail about the location. - */ - public interface Location { - /** - * Get the name of the class containing the location. - * This name will be used to locate the class file for transitive - * dependency analysis. - * @return the name of the class containing the location. - */ - String getName(); - - /** - * Get the fully-qualified name of the class containing the location. - * @return the fully-qualified name of the class containing the location. - */ - String getClassName(); - - /** - * Get the package name of the class containing the location. - * @return the package name of the class containing the location. - */ - String getPackageName(); - } - - - /** - * Get the location that has the dependency. - * @return the location that has the dependency. - */ - Location getOrigin(); - - /** - * Get the location that is being depended upon. - * @return the location that is being depended upon. - */ - Location getTarget(); -} -
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Deprecated_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.15. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Deprecated_attribute extends Attribute { - Deprecated_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - } - - public Deprecated_attribute(ConstantPool constant_pool) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.Deprecated)); - } - - public Deprecated_attribute(int name_index) { - super(name_index, 0); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitDeprecated(this, data); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Descriptor.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.4. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Descriptor { - public static class InvalidDescriptor extends DescriptorException { - private static final long serialVersionUID = 1L; - InvalidDescriptor(String desc) { - this.desc = desc; - this.index = -1; - } - - InvalidDescriptor(String desc, int index) { - this.desc = desc; - this.index = index; - } - - @Override - public String getMessage() { - // i18n - if (index == -1) - return "invalid descriptor \"" + desc + "\""; - else - return "descriptor is invalid at offset " + index + " in \"" + desc + "\""; - } - - public final String desc; - public final int index; - - } - - public Descriptor(ClassReader cr) throws IOException { - this(cr.readUnsignedShort()); - } - - public Descriptor(int index) { - this.index = index; - - } - - public String getValue(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(index); - } - - public int getParameterCount(ConstantPool constant_pool) - throws ConstantPoolException, InvalidDescriptor { - String desc = getValue(constant_pool); - int end = desc.indexOf(")"); - if (end == -1) - throw new InvalidDescriptor(desc); - parse(desc, 0, end + 1); - return count; - - } - - public String getParameterTypes(ConstantPool constant_pool) - throws ConstantPoolException, InvalidDescriptor { - String desc = getValue(constant_pool); - int end = desc.indexOf(")"); - if (end == -1) - throw new InvalidDescriptor(desc); - return parse(desc, 0, end + 1); - } - - public String getReturnType(ConstantPool constant_pool) - throws ConstantPoolException, InvalidDescriptor { - String desc = getValue(constant_pool); - int end = desc.indexOf(")"); - if (end == -1) - throw new InvalidDescriptor(desc); - return parse(desc, end + 1, desc.length()); - } - - public String getFieldType(ConstantPool constant_pool) - throws ConstantPoolException, InvalidDescriptor { - String desc = getValue(constant_pool); - return parse(desc, 0, desc.length()); - } - - private String parse(String desc, int start, int end) - throws InvalidDescriptor { - int p = start; - StringBuilder sb = new StringBuilder(); - int dims = 0; - count = 0; - - while (p < end) { - String type; - char ch; - switch (ch = desc.charAt(p++)) { - case '(': - sb.append('('); - continue; - - case ')': - sb.append(')'); - continue; - - case '[': - dims++; - continue; - - case 'B': - type = "byte"; - break; - - case 'C': - type = "char"; - break; - - case 'D': - type = "double"; - break; - - case 'F': - type = "float"; - break; - - case 'I': - type = "int"; - break; - - case 'J': - type = "long"; - break; - - case 'L': - int sep = desc.indexOf(';', p); - if (sep == -1) - throw new InvalidDescriptor(desc, p - 1); - type = desc.substring(p, sep).replace('/', '.'); - p = sep + 1; - break; - - case 'S': - type = "short"; - break; - - case 'Z': - type = "boolean"; - break; - - case 'V': - type = "void"; - break; - - default: - throw new InvalidDescriptor(desc, p - 1); - } - - if (sb.length() > 1 && sb.charAt(0) == '(') - sb.append(", "); - sb.append(type); - for ( ; dims > 0; dims-- ) - sb.append("[]"); - - count++; - } - - return sb.toString(); - } - - public final int index; - private int count; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/DescriptorException.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - - -package com.sun.tools.classfile; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class DescriptorException extends Exception { - private static final long serialVersionUID = 2411890273788901032L; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/EnclosingMethod_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ - -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.7. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class EnclosingMethod_attribute extends Attribute { - EnclosingMethod_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - class_index = cr.readUnsignedShort(); - method_index = cr.readUnsignedShort(); - } - - public EnclosingMethod_attribute(ConstantPool constant_pool, int class_index, int method_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.EnclosingMethod), class_index, method_index); - } - - public EnclosingMethod_attribute(int name_index, int class_index, int method_index) { - super(name_index, 4); - this.class_index = class_index; - this.method_index = method_index; - } - - public String getClassName(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getClassInfo(class_index).getName(); - } - - public String getMethodName(ConstantPool constant_pool) throws ConstantPoolException { - if (method_index == 0) - return ""; - return constant_pool.getNameAndTypeInfo(method_index).getName(); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitEnclosingMethod(this, data); - } - - public final int class_index; - public final int method_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Exceptions_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.5. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Exceptions_attribute extends Attribute { - Exceptions_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - number_of_exceptions = cr.readUnsignedShort(); - exception_index_table = new int[number_of_exceptions]; - for (int i = 0; i < number_of_exceptions; i++) - exception_index_table[i] = cr.readUnsignedShort(); - } - - public Exceptions_attribute(ConstantPool constant_pool, int[] exception_index_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.Exceptions), exception_index_table); - } - - public Exceptions_attribute(int name_index, int[] exception_index_table) { - super(name_index, 2 + 2 * exception_index_table.length); - this.number_of_exceptions = exception_index_table.length; - this.exception_index_table = exception_index_table; - } - - public String getException(int index, ConstantPool constant_pool) throws ConstantPoolException { - int exception_index = exception_index_table[index]; - return constant_pool.getClassInfo(exception_index).getName(); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitExceptions(this, data); - } - - public final int number_of_exceptions; - public final int[] exception_index_table; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Field.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Field { - Field(ClassReader cr) throws IOException { - access_flags = new AccessFlags(cr); - name_index = cr.readUnsignedShort(); - descriptor = new Descriptor(cr); - attributes = new Attributes(cr); - } - - public Field(AccessFlags access_flags, - int name_index, Descriptor descriptor, - Attributes attributes) { - this.access_flags = access_flags; - this.name_index = name_index; - this.descriptor = descriptor; - this.attributes = attributes; - } - - public int byteLength() { - return 6 + attributes.byteLength(); - } - - public String getName(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(name_index); - } - - public final AccessFlags access_flags; - public final int name_index; - public final Descriptor descriptor; - public final Attributes attributes; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/InnerClasses_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -import com.sun.tools.classfile.ConstantPool.*; - -/** - * See JVMS, section 4.8.6. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class InnerClasses_attribute extends Attribute { - InnerClasses_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - number_of_classes = cr.readUnsignedShort(); - classes = new Info[number_of_classes]; - for (int i = 0; i < number_of_classes; i++) - classes[i] = new Info(cr); - } - - public InnerClasses_attribute(ConstantPool constant_pool, Info[] classes) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.InnerClasses), classes); - } - - public InnerClasses_attribute(int name_index, Info[] classes) { - super(name_index, 2 + Info.length() * classes.length); - this.number_of_classes = classes.length; - this.classes = classes; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitInnerClasses(this, data); - } - - public final int number_of_classes; - public final Info[] classes; - - public static class Info { - Info(ClassReader cr) throws IOException { - inner_class_info_index = cr.readUnsignedShort(); - outer_class_info_index = cr.readUnsignedShort(); - inner_name_index = cr.readUnsignedShort(); - inner_class_access_flags = new AccessFlags(cr.readUnsignedShort()); - } - - public CONSTANT_Class_info getInnerClassInfo(ConstantPool constant_pool) throws ConstantPoolException { - if (inner_class_info_index == 0) - return null; - return constant_pool.getClassInfo(inner_class_info_index); - } - - public CONSTANT_Class_info getOuterClassInfo(ConstantPool constant_pool) throws ConstantPoolException { - if (outer_class_info_index == 0) - return null; - return constant_pool.getClassInfo(outer_class_info_index); - } - - public String getInnerName(ConstantPool constant_pool) throws ConstantPoolException { - if (inner_name_index == 0) - return null; - return constant_pool.getUTF8Value(inner_name_index); - } - - public static int length() { - return 8; - } - - public final int inner_class_info_index; - public final int outer_class_info_index; - public final int inner_name_index; - public final AccessFlags inner_class_access_flags; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Instruction.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,353 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.Locale; - -/** - * See JVMS, chapter 6. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - * - * @see Code_attribute#getInstructions - */ -public class Instruction { - /** The kind of an instruction, as determined by the position, size and - * types of its operands. */ - public static enum Kind { - /** Opcode is not followed by any operands. */ - NO_OPERANDS(1), - /** Opcode is followed by a byte indicating a type. */ - ATYPE(2), - /** Opcode is followed by a 2-byte branch offset. */ - BRANCH(3), - /** Opcode is followed by a 4-byte branch offset. */ - BRANCH_W(5), - /** Opcode is followed by a signed byte value. */ - BYTE(2), - /** Opcode is followed by a 1-byte index into the constant pool. */ - CPREF(2), - /** Opcode is followed by a 2-byte index into the constant pool. */ - CPREF_W(3), - /** Opcode is followed by a 2-byte index into the constant pool, - * an unsigned byte value. */ - CPREF_W_UBYTE(4), - /** Opcode is followed by a 2-byte index into the constant pool., - * an unsigned byte value, and a zero byte. */ - CPREF_W_UBYTE_ZERO(5), - /** Opcode is followed by variable number of operands, depending - * on the instruction.*/ - DYNAMIC(-1), - /** Opcode is followed by a 1-byte reference to a local variable. */ - LOCAL(2), - /** Opcode is followed by a 1-byte reference to a local variable, - * and a signed byte value. */ - LOCAL_BYTE(3), - /** Opcode is followed by a signed short value. */ - SHORT(3), - /** Wide opcode is not followed by any operands. */ - WIDE_NO_OPERANDS(2), - /** Wide opcode is followed by a 2-byte index into the local variables array. */ - WIDE_LOCAL(4), - /** Wide opcode is followed by a 2-byte index into the constant pool. */ - WIDE_CPREF_W(4), - /** Wide opcode is followed by a 2-byte index into the constant pool, - * and a signed short value. */ - WIDE_CPREF_W_SHORT(6), - /** Wide opcode is followed by a 2-byte reference to a local variable, - * and a signed short value. */ - WIDE_LOCAL_SHORT(6), - /** Opcode was not recognized. */ - UNKNOWN(1); - - Kind(int length) { - this.length = length; - } - - /** The length, in bytes, of this kind of instruction, or -1 is the - * length depends on the specific instruction. */ - public final int length; - } - - /** A utility visitor to help decode the operands of an instruction. - * @see Instruction#accept */ - public interface KindVisitor<R,P> { - /** See {@link Kind#NO_OPERANDS}, {@link Kind#WIDE_NO_OPERANDS}. */ - R visitNoOperands(Instruction instr, P p); - /** See {@link Kind#ATYPE}. */ - R visitArrayType(Instruction instr, TypeKind kind, P p); - /** See {@link Kind#BRANCH}, {@link Kind#BRANCH_W}. */ - R visitBranch(Instruction instr, int offset, P p); - /** See {@link Kind#CPREF}, {@link Kind#CPREF_W}, {@link Kind#WIDE_CPREF_W}. */ - R visitConstantPoolRef(Instruction instr, int index, P p); - /** See {@link Kind#CPREF_W_UBYTE}, {@link Kind#CPREF_W_UBYTE_ZERO}, {@link Kind#WIDE_CPREF_W_SHORT}. */ - R visitConstantPoolRefAndValue(Instruction instr, int index, int value, P p); - /** See {@link Kind#LOCAL}, {@link Kind#WIDE_LOCAL}. */ - R visitLocal(Instruction instr, int index, P p); - /** See {@link Kind#LOCAL_BYTE}. */ - R visitLocalAndValue(Instruction instr, int index, int value, P p); - /** See {@link Kind#DYNAMIC}. */ - R visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, P p); - /** See {@link Kind#DYNAMIC}. */ - R visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, P p); - /** See {@link Kind#BYTE}, {@link Kind#SHORT}. */ - R visitValue(Instruction instr, int value, P p); - /** Instruction is unrecognized. */ - R visitUnknown(Instruction instr, P p); - - } - - /** The kind of primitive array type to create. - * See JVMS chapter 6, newarray. */ - public static enum TypeKind { - T_BOOLEAN(4, "boolean"), - T_CHAR(5, "char"), - T_FLOAT(6, "float"), - T_DOUBLE(7, "double"), - T_BYTE(8, "byte"), - T_SHORT(9, "short"), - T_INT (10, "int"), - T_LONG (11, "long"); - TypeKind(int value, String name) { - this.value = value; - this.name = name; - } - - public static TypeKind get(int value) { - switch (value) { - case 4: return T_BOOLEAN; - case 5: return T_CHAR; - case 6: return T_FLOAT; - case 7: return T_DOUBLE; - case 8: return T_BYTE; - case 9: return T_SHORT; - case 10: return T_INT; - case 11: return T_LONG; - default: return null; - } - } - - public final int value; - public final String name; - } - - /** An instruction is defined by its position in a bytecode array. */ - public Instruction(byte[] bytes, int pc) { - this.bytes = bytes; - this.pc = pc; - } - - /** Get the position of the instruction within the bytecode array. */ - public int getPC() { - return pc; - } - - /** Get a byte value, relative to the start of this instruction. */ - public int getByte(int offset) { - return bytes[pc + offset]; - } - - /** Get an unsigned byte value, relative to the start of this instruction. */ - public int getUnsignedByte(int offset) { - return getByte(offset) & 0xff; - } - - /** Get a 2-byte value, relative to the start of this instruction. */ - public int getShort(int offset) { - return (getByte(offset) << 8) | getUnsignedByte(offset + 1); - } - - /** Get a unsigned 2-byte value, relative to the start of this instruction. */ - public int getUnsignedShort(int offset) { - return getShort(offset) & 0xFFFF; - } - - /** Get a 4-byte value, relative to the start of this instruction. */ - public int getInt(int offset) { - return (getShort(offset) << 16) | (getUnsignedShort(offset + 2)); - } - - /** Get the Opcode for this instruction, or null if the instruction is - * unrecognized. */ - public Opcode getOpcode() { - int b = getUnsignedByte(0); - switch (b) { - case Opcode.NONPRIV: - case Opcode.PRIV: - case Opcode.WIDE: - return Opcode.get(b, getUnsignedByte(1)); - } - return Opcode.get(b); - } - - /** Get the mnemonic for this instruction, or a default string if the - * instruction is unrecognized. */ - public String getMnemonic() { - Opcode opcode = getOpcode(); - if (opcode == null) - return "bytecode " + getUnsignedByte(0); - else - return opcode.toString().toLowerCase(Locale.US); - } - - /** Get the length, in bytes, of this instruction, including the opcode - * and all its operands. */ - public int length() { - Opcode opcode = getOpcode(); - if (opcode == null) - return 1; - - switch (opcode) { - case TABLESWITCH: { - int pad = align(pc + 1) - pc; - int low = getInt(pad + 4); - int high = getInt(pad + 8); - return pad + 12 + 4 * (high - low + 1); - } - case LOOKUPSWITCH: { - int pad = align(pc + 1) - pc; - int npairs = getInt(pad + 4); - return pad + 8 + 8 * npairs; - - } - default: - return opcode.kind.length; - } - } - - /** Get the {@link Kind} of this instruction. */ - public Kind getKind() { - Opcode opcode = getOpcode(); - return (opcode != null ? opcode.kind : Kind.UNKNOWN); - } - - /** Invoke a method on the visitor according to the kind of this - * instruction, passing in the decoded operands for the instruction. */ - public <R,P> R accept(KindVisitor<R,P> visitor, P p) { - switch (getKind()) { - case NO_OPERANDS: - return visitor.visitNoOperands(this, p); - - case ATYPE: - return visitor.visitArrayType( - this, TypeKind.get(getUnsignedByte(1)), p); - - case BRANCH: - return visitor.visitBranch(this, getShort(1), p); - - case BRANCH_W: - return visitor.visitBranch(this, getInt(1), p); - - case BYTE: - return visitor.visitValue(this, getByte(1), p); - - case CPREF: - return visitor.visitConstantPoolRef(this, getUnsignedByte(1), p); - - case CPREF_W: - return visitor.visitConstantPoolRef(this, getUnsignedShort(1), p); - - case CPREF_W_UBYTE: - case CPREF_W_UBYTE_ZERO: - return visitor.visitConstantPoolRefAndValue( - this, getUnsignedShort(1), getUnsignedByte(3), p); - - case DYNAMIC: { - switch (getOpcode()) { - case TABLESWITCH: { - int pad = align(pc + 1) - pc; - int default_ = getInt(pad); - int low = getInt(pad + 4); - int high = getInt(pad + 8); - int[] values = new int[high - low + 1]; - for (int i = 0; i < values.length; i++) - values[i] = getInt(pad + 12 + 4 * i); - return visitor.visitTableSwitch( - this, default_, low, high, values, p); - } - case LOOKUPSWITCH: { - int pad = align(pc + 1) - pc; - int default_ = getInt(pad); - int npairs = getInt(pad + 4); - int[] matches = new int[npairs]; - int[] offsets = new int[npairs]; - for (int i = 0; i < npairs; i++) { - matches[i] = getInt(pad + 8 + i * 8); - offsets[i] = getInt(pad + 12 + i * 8); - } - return visitor.visitLookupSwitch( - this, default_, npairs, matches, offsets, p); - } - default: - throw new IllegalStateException(); - } - } - - case LOCAL: - return visitor.visitLocal(this, getUnsignedByte(1), p); - - case LOCAL_BYTE: - return visitor.visitLocalAndValue( - this, getUnsignedByte(1), getByte(2), p); - - case SHORT: - return visitor.visitValue(this, getShort(1), p); - - case WIDE_NO_OPERANDS: - return visitor.visitNoOperands(this, p); - - case WIDE_LOCAL: - return visitor.visitLocal(this, getUnsignedShort(2), p); - - case WIDE_CPREF_W: - return visitor.visitConstantPoolRef(this, getUnsignedShort(2), p); - - case WIDE_CPREF_W_SHORT: - return visitor.visitConstantPoolRefAndValue( - this, getUnsignedShort(2), getUnsignedByte(4), p); - - case WIDE_LOCAL_SHORT: - return visitor.visitLocalAndValue( - this, getUnsignedShort(2), getShort(4), p); - - case UNKNOWN: - return visitor.visitUnknown(this, p); - - default: - throw new IllegalStateException(); - } - } - - private static int align(int n) { - return (n + 3) & ~3; - } - - private byte[] bytes; - private int pc; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/LineNumberTable_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.12. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class LineNumberTable_attribute extends Attribute { - LineNumberTable_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - line_number_table_length = cr.readUnsignedShort(); - line_number_table = new Entry[line_number_table_length]; - for (int i = 0; i < line_number_table_length; i++) - line_number_table[i] = new Entry(cr); - } - - public LineNumberTable_attribute(ConstantPool constant_pool, Entry[] line_number_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.LineNumberTable), line_number_table); - } - - public LineNumberTable_attribute(int name_index, Entry[] line_number_table) { - super(name_index, 2 + line_number_table.length * Entry.length()); - this.line_number_table_length = line_number_table.length; - this.line_number_table = line_number_table; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitLineNumberTable(this, data); - } - - public final int line_number_table_length; - public final Entry[] line_number_table; - - public static class Entry { - Entry(ClassReader cr) throws IOException { - start_pc = cr.readUnsignedShort(); - line_number = cr.readUnsignedShort(); - } - - public static int length() { - return 4; - } - - public final int start_pc; - public final int line_number; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTable_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.13. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class LocalVariableTable_attribute extends Attribute { - LocalVariableTable_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - local_variable_table_length = cr.readUnsignedShort(); - local_variable_table = new Entry[local_variable_table_length]; - for (int i = 0; i < local_variable_table_length; i++) - local_variable_table[i] = new Entry(cr); - } - - public LocalVariableTable_attribute(ConstantPool constant_pool, Entry[] local_variable_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.LocalVariableTable), local_variable_table); - } - - public LocalVariableTable_attribute(int name_index, Entry[] local_variable_table) { - super(name_index, 2 + local_variable_table.length * Entry.length()); - this.local_variable_table_length = local_variable_table.length; - this.local_variable_table = local_variable_table; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitLocalVariableTable(this, data); - } - - public final int local_variable_table_length; - public final Entry[] local_variable_table; - - public static class Entry { - Entry(ClassReader cr) throws IOException { - start_pc = cr.readUnsignedShort(); - length = cr.readUnsignedShort(); - name_index = cr.readUnsignedShort(); - descriptor_index = cr.readUnsignedShort(); - index = cr.readUnsignedShort(); - } - - public static int length() { - return 10; - } - - public final int start_pc; - public final int length; - public final int name_index; - public final int descriptor_index; - public final int index; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTypeTable_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.14. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class LocalVariableTypeTable_attribute extends Attribute { - LocalVariableTypeTable_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - local_variable_table_length = cr.readUnsignedShort(); - local_variable_table = new Entry[local_variable_table_length]; - for (int i = 0; i < local_variable_table_length; i++) - local_variable_table[i] = new Entry(cr); - } - - public LocalVariableTypeTable_attribute(ConstantPool constant_pool, Entry[] local_variable_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.LocalVariableTypeTable), local_variable_table); - } - - public LocalVariableTypeTable_attribute(int name_index, Entry[] local_variable_table) { - super(name_index, 2 + local_variable_table.length * Entry.length()); - this.local_variable_table_length = local_variable_table.length; - this.local_variable_table = local_variable_table; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitLocalVariableTypeTable(this, data); - } - - public final int local_variable_table_length; - public final Entry[] local_variable_table; - - public static class Entry { - Entry(ClassReader cr) throws IOException { - start_pc = cr.readUnsignedShort(); - length = cr.readUnsignedShort(); - name_index = cr.readUnsignedShort(); - signature_index = cr.readUnsignedShort(); - index = cr.readUnsignedShort(); - } - - public static int length() { - return 10; - } - - public final int start_pc; - public final int length; - public final int name_index; - public final int signature_index; - public final int index; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Method.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/* - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Method { - Method(ClassReader cr) throws IOException { - access_flags = new AccessFlags(cr); - name_index = cr.readUnsignedShort(); - descriptor = new Descriptor(cr); - attributes = new Attributes(cr); - } - - public Method(AccessFlags access_flags, - int name_index, Descriptor descriptor, - Attributes attributes) { - this.access_flags = access_flags; - this.name_index = name_index; - this.descriptor = descriptor; - this.attributes = attributes; - } - - public int byteLength() { - return 6 + attributes.byteLength(); - } - - public String getName(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(name_index); - } - - public final AccessFlags access_flags; - public final int name_index; - public final Descriptor descriptor; - public final Attributes attributes; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/MethodParameters_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.13. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class MethodParameters_attribute extends Attribute { - - public final int method_parameter_table_length; - public final Entry[] method_parameter_table; - - MethodParameters_attribute(ClassReader cr, - int name_index, - int length) - throws IOException { - super(name_index, length); - - method_parameter_table_length = cr.readUnsignedByte(); - method_parameter_table = new Entry[method_parameter_table_length]; - for (int i = 0; i < method_parameter_table_length; i++) - method_parameter_table[i] = new Entry(cr); - } - - public MethodParameters_attribute(ConstantPool constant_pool, - Entry[] method_parameter_table) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.MethodParameters), - method_parameter_table); - } - - public MethodParameters_attribute(int name_index, - Entry[] method_parameter_table) { - super(name_index, 1 + method_parameter_table.length * Entry.length()); - this.method_parameter_table_length = method_parameter_table.length; - this.method_parameter_table = method_parameter_table; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitMethodParameters(this, data); - } - - public static class Entry { - Entry(ClassReader cr) throws IOException { - name_index = cr.readUnsignedShort(); - flags = cr.readUnsignedShort(); - } - - public static int length() { - return 6; - } - - public final int name_index; - public final int flags; - } - -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Opcode.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,472 +0,0 @@ -/* - * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import static com.sun.tools.classfile.Instruction.Kind.*; -import static com.sun.tools.classfile.Opcode.Set.*; - -/** - * See JVMS, chapter 6. - * - * <p>In addition to providing all the standard opcodes defined in JVMS, - * this class also provides legacy support for the PicoJava extensions. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public enum Opcode { - NOP(0x0), - ACONST_NULL(0x1), - ICONST_M1(0x2), - ICONST_0(0x3), - ICONST_1(0x4), - ICONST_2(0x5), - ICONST_3(0x6), - ICONST_4(0x7), - ICONST_5(0x8), - LCONST_0(0x9), - LCONST_1(0xa), - FCONST_0(0xb), - FCONST_1(0xc), - FCONST_2(0xd), - DCONST_0(0xe), - DCONST_1(0xf), - BIPUSH(0x10, BYTE), - SIPUSH(0x11, SHORT), - LDC(0x12, CPREF), - LDC_W(0x13, CPREF_W), - LDC2_W(0x14, CPREF_W), - ILOAD(0x15, LOCAL), - LLOAD(0x16, LOCAL), - FLOAD(0x17, LOCAL), - DLOAD(0x18, LOCAL), - ALOAD(0x19, LOCAL), - ILOAD_0(0x1a), - ILOAD_1(0x1b), - ILOAD_2(0x1c), - ILOAD_3(0x1d), - LLOAD_0(0x1e), - LLOAD_1(0x1f), - LLOAD_2(0x20), - LLOAD_3(0x21), - FLOAD_0(0x22), - FLOAD_1(0x23), - FLOAD_2(0x24), - FLOAD_3(0x25), - DLOAD_0(0x26), - DLOAD_1(0x27), - DLOAD_2(0x28), - DLOAD_3(0x29), - ALOAD_0(0x2a), - ALOAD_1(0x2b), - ALOAD_2(0x2c), - ALOAD_3(0x2d), - IALOAD(0x2e), - LALOAD(0x2f), - FALOAD(0x30), - DALOAD(0x31), - AALOAD(0x32), - BALOAD(0x33), - CALOAD(0x34), - SALOAD(0x35), - ISTORE(0x36, LOCAL), - LSTORE(0x37, LOCAL), - FSTORE(0x38, LOCAL), - DSTORE(0x39, LOCAL), - ASTORE(0x3a, LOCAL), - ISTORE_0(0x3b), - ISTORE_1(0x3c), - ISTORE_2(0x3d), - ISTORE_3(0x3e), - LSTORE_0(0x3f), - LSTORE_1(0x40), - LSTORE_2(0x41), - LSTORE_3(0x42), - FSTORE_0(0x43), - FSTORE_1(0x44), - FSTORE_2(0x45), - FSTORE_3(0x46), - DSTORE_0(0x47), - DSTORE_1(0x48), - DSTORE_2(0x49), - DSTORE_3(0x4a), - ASTORE_0(0x4b), - ASTORE_1(0x4c), - ASTORE_2(0x4d), - ASTORE_3(0x4e), - IASTORE(0x4f), - LASTORE(0x50), - FASTORE(0x51), - DASTORE(0x52), - AASTORE(0x53), - BASTORE(0x54), - CASTORE(0x55), - SASTORE(0x56), - POP(0x57), - POP2(0x58), - DUP(0x59), - DUP_X1(0x5a), - DUP_X2(0x5b), - DUP2(0x5c), - DUP2_X1(0x5d), - DUP2_X2(0x5e), - SWAP(0x5f), - IADD(0x60), - LADD(0x61), - FADD(0x62), - DADD(0x63), - ISUB(0x64), - LSUB(0x65), - FSUB(0x66), - DSUB(0x67), - IMUL(0x68), - LMUL(0x69), - FMUL(0x6a), - DMUL(0x6b), - IDIV(0x6c), - LDIV(0x6d), - FDIV(0x6e), - DDIV(0x6f), - IREM(0x70), - LREM(0x71), - FREM(0x72), - DREM(0x73), - INEG(0x74), - LNEG(0x75), - FNEG(0x76), - DNEG(0x77), - ISHL(0x78), - LSHL(0x79), - ISHR(0x7a), - LSHR(0x7b), - IUSHR(0x7c), - LUSHR(0x7d), - IAND(0x7e), - LAND(0x7f), - IOR(0x80), - LOR(0x81), - IXOR(0x82), - LXOR(0x83), - IINC(0x84, LOCAL_BYTE), - I2L(0x85), - I2F(0x86), - I2D(0x87), - L2I(0x88), - L2F(0x89), - L2D(0x8a), - F2I(0x8b), - F2L(0x8c), - F2D(0x8d), - D2I(0x8e), - D2L(0x8f), - D2F(0x90), - I2B(0x91), - I2C(0x92), - I2S(0x93), - LCMP(0x94), - FCMPL(0x95), - FCMPG(0x96), - DCMPL(0x97), - DCMPG(0x98), - IFEQ(0x99, BRANCH), - IFNE(0x9a, BRANCH), - IFLT(0x9b, BRANCH), - IFGE(0x9c, BRANCH), - IFGT(0x9d, BRANCH), - IFLE(0x9e, BRANCH), - IF_ICMPEQ(0x9f, BRANCH), - IF_ICMPNE(0xa0, BRANCH), - IF_ICMPLT(0xa1, BRANCH), - IF_ICMPGE(0xa2, BRANCH), - IF_ICMPGT(0xa3, BRANCH), - IF_ICMPLE(0xa4, BRANCH), - IF_ACMPEQ(0xa5, BRANCH), - IF_ACMPNE(0xa6, BRANCH), - GOTO(0xa7, BRANCH), - JSR(0xa8, BRANCH), - RET(0xa9, LOCAL), - TABLESWITCH(0xaa, DYNAMIC), - LOOKUPSWITCH(0xab, DYNAMIC), - IRETURN(0xac), - LRETURN(0xad), - FRETURN(0xae), - DRETURN(0xaf), - ARETURN(0xb0), - RETURN(0xb1), - GETSTATIC(0xb2, CPREF_W), - PUTSTATIC(0xb3, CPREF_W), - GETFIELD(0xb4, CPREF_W), - PUTFIELD(0xb5, CPREF_W), - INVOKEVIRTUAL(0xb6, CPREF_W), - INVOKESPECIAL(0xb7, CPREF_W), - INVOKESTATIC(0xb8, CPREF_W), - INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO), - INVOKEDYNAMIC(0xba, CPREF_W_UBYTE_ZERO), - NEW(0xbb, CPREF_W), - NEWARRAY(0xbc, ATYPE), - ANEWARRAY(0xbd, CPREF_W), - ARRAYLENGTH(0xbe), - ATHROW(0xbf), - CHECKCAST(0xc0, CPREF_W), - INSTANCEOF(0xc1, CPREF_W), - MONITORENTER(0xc2), - MONITOREXIT(0xc3), - // wide 0xc4 - MULTIANEWARRAY(0xc5, CPREF_W_UBYTE), - IFNULL(0xc6, BRANCH), - IFNONNULL(0xc7, BRANCH), - GOTO_W(0xc8, BRANCH_W), - JSR_W(0xc9, BRANCH_W), - // impdep 0xfe: PicoJava nonpriv - // impdep 0xff: Picojava priv - - // wide opcodes - ILOAD_W(0xc415, WIDE_LOCAL), - LLOAD_W(0xc416, WIDE_LOCAL), - FLOAD_W(0xc417, WIDE_LOCAL), - DLOAD_W(0xc418, WIDE_LOCAL), - ALOAD_W(0xc419, WIDE_LOCAL), - ISTORE_W(0xc436, WIDE_LOCAL), - LSTORE_W(0xc437, WIDE_LOCAL), - FSTORE_W(0xc438, WIDE_LOCAL), - DSTORE_W(0xc439, WIDE_LOCAL), - ASTORE_W(0xc43a, WIDE_LOCAL), - IINC_W(0xc484, WIDE_LOCAL_SHORT), - RET_W(0xc4a9, WIDE_LOCAL), - - // PicoJava nonpriv instructions - LOAD_UBYTE(PICOJAVA, 0xfe00), - LOAD_BYTE(PICOJAVA, 0xfe01), - LOAD_CHAR(PICOJAVA, 0xfe02), - LOAD_SHORT(PICOJAVA, 0xfe03), - LOAD_WORD(PICOJAVA, 0xfe04), - RET_FROM_SUB(PICOJAVA, 0xfe05), - LOAD_CHAR_OE(PICOJAVA, 0xfe0a), - LOAD_SHORT_OE(PICOJAVA, 0xfe0b), - LOAD_WORD_OE(PICOJAVA, 0xfe0c), - NCLOAD_UBYTE(PICOJAVA, 0xfe10), - NCLOAD_BYTE(PICOJAVA, 0xfe11), - NCLOAD_CHAR(PICOJAVA, 0xfe12), - NCLOAD_SHORT(PICOJAVA, 0xfe13), - NCLOAD_WORD(PICOJAVA, 0xfe14), - NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a), - NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b), - NCLOAD_WORD_OE(PICOJAVA, 0xfe1c), - CACHE_FLUSH(PICOJAVA, 0xfe1e), - STORE_BYTE(PICOJAVA, 0xfe20), - STORE_SHORT(PICOJAVA, 0xfe22), - STORE_WORD(PICOJAVA, 0xfe24), - STORE_SHORT_OE(PICOJAVA, 0xfe2a), - STORE_WORD_OE(PICOJAVA, 0xfe2c), - NCSTORE_BYTE(PICOJAVA, 0xfe30), - NCSTORE_SHORT(PICOJAVA, 0xfe32), - NCSTORE_WORD(PICOJAVA, 0xfe34), - NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a), - NCSTORE_WORD_OE(PICOJAVA, 0xfe3c), - ZERO_LINE(PICOJAVA, 0xfe3e), - ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f), - - // PicoJava priv instructions - PRIV_LOAD_UBYTE(PICOJAVA, 0xff00), - PRIV_LOAD_BYTE(PICOJAVA, 0xff01), - PRIV_LOAD_CHAR(PICOJAVA, 0xff02), - PRIV_LOAD_SHORT(PICOJAVA, 0xff03), - PRIV_LOAD_WORD(PICOJAVA, 0xff04), - PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05), - PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06), - PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07), - PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a), - PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b), - PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c), - PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e), - PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f), - PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10), - PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11), - PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12), - PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13), - PRIV_NCLOAD_WORD(PICOJAVA, 0xff14), - PRIV_POWERDOWN(PICOJAVA, 0xff16), - PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17), - PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a), - PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b), - PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c), - PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e), - PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f), - PRIV_STORE_BYTE(PICOJAVA, 0xff20), - PRIV_STORE_SHORT(PICOJAVA, 0xff22), - PRIV_STORE_WORD(PICOJAVA, 0xff24), - PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26), - PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27), - PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a), - PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c), - PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e), - PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f), - PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30), - PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32), - PRIV_NCSTORE_WORD(PICOJAVA, 0xff34), - PRIV_RESET(PICOJAVA, 0xff36), - PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37), - PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a), - PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c), - PRIV_ZERO_LINE(PICOJAVA, 0xff3e), - PRIV_READ_REG_0(PICOJAVA, 0xff40), - PRIV_READ_REG_1(PICOJAVA, 0xff41), - PRIV_READ_REG_2(PICOJAVA, 0xff42), - PRIV_READ_REG_3(PICOJAVA, 0xff43), - PRIV_READ_REG_4(PICOJAVA, 0xff44), - PRIV_READ_REG_5(PICOJAVA, 0xff45), - PRIV_READ_REG_6(PICOJAVA, 0xff46), - PRIV_READ_REG_7(PICOJAVA, 0xff47), - PRIV_READ_REG_8(PICOJAVA, 0xff48), - PRIV_READ_REG_9(PICOJAVA, 0xff49), - PRIV_READ_REG_10(PICOJAVA, 0xff4a), - PRIV_READ_REG_11(PICOJAVA, 0xff4b), - PRIV_READ_REG_12(PICOJAVA, 0xff4c), - PRIV_READ_REG_13(PICOJAVA, 0xff4d), - PRIV_READ_REG_14(PICOJAVA, 0xff4e), - PRIV_READ_REG_15(PICOJAVA, 0xff4f), - PRIV_READ_REG_16(PICOJAVA, 0xff50), - PRIV_READ_REG_17(PICOJAVA, 0xff51), - PRIV_READ_REG_18(PICOJAVA, 0xff52), - PRIV_READ_REG_19(PICOJAVA, 0xff53), - PRIV_READ_REG_20(PICOJAVA, 0xff54), - PRIV_READ_REG_21(PICOJAVA, 0xff55), - PRIV_READ_REG_22(PICOJAVA, 0xff56), - PRIV_READ_REG_23(PICOJAVA, 0xff57), - PRIV_READ_REG_24(PICOJAVA, 0xff58), - PRIV_READ_REG_25(PICOJAVA, 0xff59), - PRIV_READ_REG_26(PICOJAVA, 0xff5a), - PRIV_READ_REG_27(PICOJAVA, 0xff5b), - PRIV_READ_REG_28(PICOJAVA, 0xff5c), - PRIV_READ_REG_29(PICOJAVA, 0xff5d), - PRIV_READ_REG_30(PICOJAVA, 0xff5e), - PRIV_READ_REG_31(PICOJAVA, 0xff5f), - PRIV_WRITE_REG_0(PICOJAVA, 0xff60), - PRIV_WRITE_REG_1(PICOJAVA, 0xff61), - PRIV_WRITE_REG_2(PICOJAVA, 0xff62), - PRIV_WRITE_REG_3(PICOJAVA, 0xff63), - PRIV_WRITE_REG_4(PICOJAVA, 0xff64), - PRIV_WRITE_REG_5(PICOJAVA, 0xff65), - PRIV_WRITE_REG_6(PICOJAVA, 0xff66), - PRIV_WRITE_REG_7(PICOJAVA, 0xff67), - PRIV_WRITE_REG_8(PICOJAVA, 0xff68), - PRIV_WRITE_REG_9(PICOJAVA, 0xff69), - PRIV_WRITE_REG_10(PICOJAVA, 0xff6a), - PRIV_WRITE_REG_11(PICOJAVA, 0xff6b), - PRIV_WRITE_REG_12(PICOJAVA, 0xff6c), - PRIV_WRITE_REG_13(PICOJAVA, 0xff6d), - PRIV_WRITE_REG_14(PICOJAVA, 0xff6e), - PRIV_WRITE_REG_15(PICOJAVA, 0xff6f), - PRIV_WRITE_REG_16(PICOJAVA, 0xff70), - PRIV_WRITE_REG_17(PICOJAVA, 0xff71), - PRIV_WRITE_REG_18(PICOJAVA, 0xff72), - PRIV_WRITE_REG_19(PICOJAVA, 0xff73), - PRIV_WRITE_REG_20(PICOJAVA, 0xff74), - PRIV_WRITE_REG_21(PICOJAVA, 0xff75), - PRIV_WRITE_REG_22(PICOJAVA, 0xff76), - PRIV_WRITE_REG_23(PICOJAVA, 0xff77), - PRIV_WRITE_REG_24(PICOJAVA, 0xff78), - PRIV_WRITE_REG_25(PICOJAVA, 0xff79), - PRIV_WRITE_REG_26(PICOJAVA, 0xff7a), - PRIV_WRITE_REG_27(PICOJAVA, 0xff7b), - PRIV_WRITE_REG_28(PICOJAVA, 0xff7c), - PRIV_WRITE_REG_29(PICOJAVA, 0xff7d), - PRIV_WRITE_REG_30(PICOJAVA, 0xff7e), - PRIV_WRITE_REG_31(PICOJAVA, 0xff7f); - - Opcode(int opcode) { - this(STANDARD, opcode, NO_OPERANDS); - } - - Opcode(int opcode, Instruction.Kind kind) { - this(STANDARD, opcode, kind); - } - - Opcode(Set set, int opcode) { - this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS)); - } - - Opcode(Set set, int opcode, Instruction.Kind kind) { - this.set = set; - this.opcode = opcode; - this.kind = kind; - } - - public final Set set; - public final int opcode; - public final Instruction.Kind kind; - - /** Get the Opcode for a simple standard 1-byte opcode. */ - public static Opcode get(int opcode) { - return stdOpcodes[opcode]; - } - - /** Get the Opcode for 1- or 2-byte opcode. */ - public static Opcode get(int opcodePrefix, int opcode) { - Opcode[] block = getOpcodeBlock(opcodePrefix); - return (block == null ? null : block[opcode]); - } - - private static Opcode[] getOpcodeBlock(int opcodePrefix) { - switch (opcodePrefix) { - case 0: - return stdOpcodes; - case WIDE: - return wideOpcodes; - case NONPRIV: - return nonPrivOpcodes; - case PRIV: - return privOpcodes; - default: - return null; - } - - } - - private static final Opcode[] stdOpcodes = new Opcode[256]; - private static final Opcode[] wideOpcodes = new Opcode[256]; - private static final Opcode[] nonPrivOpcodes = new Opcode[256]; - private static final Opcode[] privOpcodes = new Opcode[256]; - static { - for (Opcode o: values()) - getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o; - } - - /** The byte prefix for the wide instructions. */ - public static final int WIDE = 0xc4; - /** The byte prefix for the PicoJava nonpriv instructions. */ - public static final int NONPRIV = 0xfe; - /** The byte prefix for the PicoJava priv instructions. */ - public static final int PRIV = 0xff; - - public enum Set { - /** Standard opcodes. */ - STANDARD, - /** Legacy support for PicoJava opcodes. */ - PICOJAVA } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/ReferenceFinder.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,240 +0,0 @@ -/* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import com.sun.tools.classfile.Instruction.TypeKind; -import static com.sun.tools.classfile.ConstantPool.*; - -/** - * A utility class to find where in a ClassFile references - * a {@link CONSTANT_Methodref_info method}, - * a {@link CONSTANT_InterfaceMethodref_info interface method, - * or a {@link CONSTANT_Fieldref_info field}. - */ -public final class ReferenceFinder { - /** - * Filter for ReferenceFinder of what constant pool entries for reference lookup. - */ - public interface Filter { - /** - * Decides if the given CPRefInfo entry should be accepted or filtered. - * - * @param cpool ConstantPool of the ClassFile being parsed - * @param cpref constant pool entry representing a reference to - * a fields method, and interface method. - * @return {@code true} if accepted; otherwise {@code false} - */ - boolean accept(ConstantPool cpool, CPRefInfo cpref); - } - - /** - * Visitor of individual method of a ClassFile that references the - * accepted field, method, or interface method references. - */ - public interface Visitor { - /** - * Invoked for a method containing one or more accepted CPRefInfo entries - * - * @param cf ClassFile - * @param method Method that does the references the accepted references - * @param refs Accepted constant pool method/field reference - */ - void visit(ClassFile cf, Method method, List<CPRefInfo> refConstantPool); - } - - private final Filter filter; - private final Visitor visitor; - - /** - * Constructor. - */ - public ReferenceFinder(Filter filter, Visitor visitor) { - this.filter = Objects.requireNonNull(filter); - this.visitor = Objects.requireNonNull(visitor); - } - - /** - * Parses a given ClassFile and invoke the visitor if there is any reference - * to the constant pool entries referencing field, method, or - * interface method that are accepted. This method will return - * {@code true} if there is one or more accepted constant pool entries - * to lookup; otherwise, it will return {@code false}. - * - * @param cf ClassFile - * @return {@code true} if the given class file is processed to lookup - * references - * @throws ConstantPoolException if an error of the constant pool - */ - public boolean parse(ClassFile cf) throws ConstantPoolException { - List<Integer> cprefs = new ArrayList<>(); - int index = 1; - for (ConstantPool.CPInfo cpInfo : cf.constant_pool.entries()) { - if (cpInfo.accept(cpVisitor, cf.constant_pool)) { - cprefs.add(index); - } - index += cpInfo.size(); - } - - if (cprefs.isEmpty()) { - return false; - } - - for (Method m : cf.methods) { - Set<Integer> ids = new HashSet<>(); - Code_attribute c_attr = (Code_attribute) m.attributes.get(Attribute.Code); - if (c_attr != null) { - for (Instruction instr : c_attr.getInstructions()) { - int idx = instr.accept(codeVisitor, cprefs); - if (idx > 0) { - ids.add(idx); - } - } - } - if (ids.size() > 0) { - List<CPRefInfo> refInfos = new ArrayList<>(ids.size()); - for (int id : ids) { - refInfos.add(CPRefInfo.class.cast(cf.constant_pool.get(id))); - } - visitor.visit(cf, m, refInfos); - } - } - return true; - } - - private ConstantPool.Visitor<Boolean,ConstantPool> cpVisitor = - new ConstantPool.Visitor<Boolean,ConstantPool>() - { - public Boolean visitClass(CONSTANT_Class_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, ConstantPool cpool) { - return filter.accept(cpool, info); - } - - public Boolean visitMethodref(CONSTANT_Methodref_info info, ConstantPool cpool) { - return filter.accept(cpool, info); - } - - public Boolean visitFieldref(CONSTANT_Fieldref_info info, ConstantPool cpool) { - return filter.accept(cpool, info); - } - - public Boolean visitDouble(CONSTANT_Double_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitFloat(CONSTANT_Float_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitInteger(CONSTANT_Integer_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitLong(CONSTANT_Long_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitNameAndType(CONSTANT_NameAndType_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitMethodHandle(CONSTANT_MethodHandle_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitMethodType(CONSTANT_MethodType_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitString(CONSTANT_String_info info, ConstantPool cpool) { - return false; - } - - public Boolean visitUtf8(CONSTANT_Utf8_info info, ConstantPool cpool) { - return false; - } - }; - - private Instruction.KindVisitor<Integer, List<Integer>> codeVisitor = - new Instruction.KindVisitor<Integer, List<Integer>>() - { - public Integer visitNoOperands(Instruction instr, List<Integer> p) { - return 0; - } - - public Integer visitArrayType(Instruction instr, TypeKind kind, List<Integer> p) { - return 0; - } - - public Integer visitBranch(Instruction instr, int offset, List<Integer> p) { - return 0; - } - - public Integer visitConstantPoolRef(Instruction instr, int index, List<Integer> p) { - return p.contains(index) ? index : 0; - } - - public Integer visitConstantPoolRefAndValue(Instruction instr, int index, int value, List<Integer> p) { - return p.contains(index) ? index : 0; - } - - public Integer visitLocal(Instruction instr, int index, List<Integer> p) { - return 0; - } - - public Integer visitLocalAndValue(Instruction instr, int index, int value, List<Integer> p) { - return 0; - } - - public Integer visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, List<Integer> p) { - return 0; - } - - public Integer visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, List<Integer> p) { - return 0; - } - - public Integer visitValue(Instruction instr, int value, List<Integer> p) { - return 0; - } - - public Integer visitUnknown(Instruction instr, List<Integer> p) { - return 0; - } - }; -} -
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.16 and 4.8.17. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public abstract class RuntimeAnnotations_attribute extends Attribute { - protected RuntimeAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(name_index, length); - int num_annotations = cr.readUnsignedShort(); - annotations = new Annotation[num_annotations]; - for (int i = 0; i < annotations.length; i++) - annotations[i] = new Annotation(cr); - } - - protected RuntimeAnnotations_attribute(int name_index, Annotation[] annotations) { - super(name_index, length(annotations)); - this.annotations = annotations; - } - - private static int length(Annotation[] annos) { - int n = 2; - for (Annotation anno: annos) - n += anno.length(); - return n; - } - - public final Annotation[] annotations; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.17. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeInvisibleAnnotations_attribute extends RuntimeAnnotations_attribute { - RuntimeInvisibleAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, AttributeException { - super(cr, name_index, length); - } - - public RuntimeInvisibleAnnotations_attribute(ConstantPool cp, Annotation[] annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeInvisibleAnnotations), annotations); - } - - public RuntimeInvisibleAnnotations_attribute(int name_index, Annotation[] annotations) { - super(name_index, annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeInvisibleAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleParameterAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.18. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeInvisibleParameterAnnotations_attribute extends RuntimeParameterAnnotations_attribute { - RuntimeInvisibleParameterAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(cr, name_index, length); - } - - public RuntimeInvisibleParameterAnnotations_attribute(ConstantPool cp, Annotation[][] parameter_annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeInvisibleParameterAnnotations), parameter_annotations); - } - - public RuntimeInvisibleParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { - super(name_index, parameter_annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeInvisibleParameterAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleTypeAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JSR 308 specification, Section 3. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeInvisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute { - RuntimeInvisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(cr, name_index, length); - } - - public RuntimeInvisibleTypeAnnotations_attribute(ConstantPool cp, TypeAnnotation[] annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeInvisibleTypeAnnotations), annotations); - } - - public RuntimeInvisibleTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { - super(name_index, annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeInvisibleTypeAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeParameterAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.18 and 4.8.19. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public abstract class RuntimeParameterAnnotations_attribute extends Attribute { - RuntimeParameterAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(name_index, length); - int num_parameters = cr.readUnsignedByte(); - parameter_annotations = new Annotation[num_parameters][]; - for (int p = 0; p < parameter_annotations.length; p++) { - int num_annotations = cr.readUnsignedShort(); - Annotation[] annotations = new Annotation[num_annotations]; - for (int i = 0; i < num_annotations; i++) - annotations[i] = new Annotation(cr); - parameter_annotations[p] = annotations; - } - } - - protected RuntimeParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { - super(name_index, length(parameter_annotations)); - this.parameter_annotations = parameter_annotations; - } - - private static int length(Annotation[][] anno_arrays) { - int n = 1; - for (Annotation[] anno_array: anno_arrays) { - n += 2; - for (Annotation anno: anno_array) - n += anno.length(); - } - return n; - } - - public final Annotation[][] parameter_annotations; -} -
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeTypeAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JSR 308 specification, Section 3. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public abstract class RuntimeTypeAnnotations_attribute extends Attribute { - protected RuntimeTypeAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(name_index, length); - int num_annotations = cr.readUnsignedShort(); - annotations = new TypeAnnotation[num_annotations]; - for (int i = 0; i < annotations.length; i++) - annotations[i] = new TypeAnnotation(cr); - } - - protected RuntimeTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { - super(name_index, length(annotations)); - this.annotations = annotations; - } - - private static int length(TypeAnnotation[] annos) { - int n = 2; - for (TypeAnnotation anno: annos) - n += anno.length(); - return n; - } - - public final TypeAnnotation[] annotations; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.16. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeVisibleAnnotations_attribute extends RuntimeAnnotations_attribute { - RuntimeVisibleAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(cr, name_index, length); - } - - public RuntimeVisibleAnnotations_attribute(ConstantPool cp, Annotation[] annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeVisibleAnnotations), annotations); - } - - public RuntimeVisibleAnnotations_attribute(int name_index, Annotation[] annotations) { - super(name_index, annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeVisibleAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleParameterAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.18. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeVisibleParameterAnnotations_attribute extends RuntimeParameterAnnotations_attribute { - RuntimeVisibleParameterAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(cr, name_index, length); - } - - public RuntimeVisibleParameterAnnotations_attribute(ConstantPool cp, Annotation[][] parameter_annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeVisibleParameterAnnotations), parameter_annotations); - } - - public RuntimeVisibleParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { - super(name_index, parameter_annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeVisibleParameterAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleTypeAnnotations_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JSR 308 specification, Section 3. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class RuntimeVisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute { - RuntimeVisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length) - throws IOException, Annotation.InvalidAnnotation { - super(cr, name_index, length); - } - - public RuntimeVisibleTypeAnnotations_attribute(ConstantPool cp, TypeAnnotation[] annotations) - throws ConstantPoolException { - this(cp.getUTF8Index(Attribute.RuntimeVisibleTypeAnnotations), annotations); - } - - public RuntimeVisibleTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { - super(name_index, annotations); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitRuntimeVisibleTypeAnnotations(this, p); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.ArrayList; -import java.util.List; -import com.sun.tools.classfile.Type.*; - -/** - * See JVMS 4.4.4. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Signature extends Descriptor { - - public Signature(int index) { - super(index); - } - - public Type getType(ConstantPool constant_pool) throws ConstantPoolException { - if (type == null) - type = parse(getValue(constant_pool)); - return type; - } - - @Override - public int getParameterCount(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - return m.paramTypes.size(); - } - - @Override - public String getParameterTypes(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - StringBuilder sb = new StringBuilder(); - sb.append("("); - String sep = ""; - for (Type paramType: m.paramTypes) { - sb.append(sep); - sb.append(paramType); - sep = ", "; - } - sb.append(")"); - return sb.toString(); - } - - @Override - public String getReturnType(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - return m.returnType.toString(); - } - - @Override - public String getFieldType(ConstantPool constant_pool) throws ConstantPoolException { - return getType(constant_pool).toString(); - } - - private Type parse(String sig) { - this.sig = sig; - sigp = 0; - - List<TypeParamType> typeParamTypes = null; - if (sig.charAt(sigp) == '<') - typeParamTypes = parseTypeParamTypes(); - - if (sig.charAt(sigp) == '(') { - List<Type> paramTypes = parseTypeSignatures(')'); - Type returnType = parseTypeSignature(); - List<Type> throwsTypes = null; - while (sigp < sig.length() && sig.charAt(sigp) == '^') { - sigp++; - if (throwsTypes == null) - throwsTypes = new ArrayList<>(); - throwsTypes.add(parseTypeSignature()); - } - return new MethodType(typeParamTypes, paramTypes, returnType, throwsTypes); - } else { - Type t = parseTypeSignature(); - if (typeParamTypes == null && sigp == sig.length()) - return t; - Type superclass = t; - List<Type> superinterfaces = null; - while (sigp < sig.length()) { - if (superinterfaces == null) - superinterfaces = new ArrayList<>(); - superinterfaces.add(parseTypeSignature()); - } - return new ClassSigType(typeParamTypes, superclass, superinterfaces); - - } - } - - private Type parseTypeSignature() { - switch (sig.charAt(sigp)) { - case 'B': - sigp++; - return new SimpleType("byte"); - - case 'C': - sigp++; - return new SimpleType("char"); - - case 'D': - sigp++; - return new SimpleType("double"); - - case 'F': - sigp++; - return new SimpleType("float"); - - case 'I': - sigp++; - return new SimpleType("int"); - - case 'J': - sigp++; - return new SimpleType("long"); - - case 'L': - return parseClassTypeSignature(); - - case 'S': - sigp++; - return new SimpleType("short"); - - case 'T': - return parseTypeVariableSignature(); - - case 'V': - sigp++; - return new SimpleType("void"); - - case 'Z': - sigp++; - return new SimpleType("boolean"); - - case '[': - sigp++; - return new ArrayType(parseTypeSignature()); - - case '*': - sigp++; - return new WildcardType(); - - case '+': - sigp++; - return new WildcardType(WildcardType.Kind.EXTENDS, parseTypeSignature()); - - case '-': - sigp++; - return new WildcardType(WildcardType.Kind.SUPER, parseTypeSignature()); - - default: - throw new IllegalStateException(debugInfo()); - } - } - - private List<Type> parseTypeSignatures(char term) { - sigp++; - List<Type> types = new ArrayList<>(); - while (sig.charAt(sigp) != term) - types.add(parseTypeSignature()); - sigp++; - return types; - } - - private Type parseClassTypeSignature() { - assert sig.charAt(sigp) == 'L'; - sigp++; - return parseClassTypeSignatureRest(); - } - - private Type parseClassTypeSignatureRest() { - StringBuilder sb = new StringBuilder(); - List<Type> argTypes = null; - ClassType t = null; - char sigch ; - - do { - switch (sigch = sig.charAt(sigp)) { - case '<': - argTypes = parseTypeSignatures('>'); - break; - - case '.': - case ';': - sigp++; - t = new ClassType(t, sb.toString(), argTypes); - sb.setLength(0); - argTypes = null; - break; - - default: - sigp++; - sb.append(sigch); - break; - } - } while (sigch != ';'); - - return t; - } - - private List<TypeParamType> parseTypeParamTypes() { - assert sig.charAt(sigp) == '<'; - sigp++; - List<TypeParamType> types = new ArrayList<>(); - while (sig.charAt(sigp) != '>') - types.add(parseTypeParamType()); - sigp++; - return types; - } - - private TypeParamType parseTypeParamType() { - int sep = sig.indexOf(":", sigp); - String name = sig.substring(sigp, sep); - Type classBound = null; - List<Type> interfaceBounds = null; - sigp = sep + 1; - if (sig.charAt(sigp) != ':') - classBound = parseTypeSignature(); - while (sig.charAt(sigp) == ':') { - sigp++; - if (interfaceBounds == null) - interfaceBounds = new ArrayList<>(); - interfaceBounds.add(parseTypeSignature()); - } - return new TypeParamType(name, classBound, interfaceBounds); - } - - private Type parseTypeVariableSignature() { - sigp++; - int sep = sig.indexOf(';', sigp); - Type t = new SimpleType(sig.substring(sigp, sep)); - sigp = sep + 1; - return t; - } - - private String debugInfo() { - return sig.substring(0, sigp) + "!" + sig.charAt(sigp) + "!" + sig.substring(sigp+1); - } - - private String sig; - private int sigp; - - private Type type; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.9. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Signature_attribute extends Attribute { - Signature_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - signature_index = cr.readUnsignedShort(); - } - - public Signature_attribute(ConstantPool constant_pool, int signature_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.Signature), signature_index); - } - - public Signature_attribute(int name_index, int signature_index) { - super(name_index, 2); - this.signature_index = signature_index; - } - - public String getSignature(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(signature_index); - } - - public Signature getParsedSignature() { - return new Signature(signature_index); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitSignature(this, data); - } - - public final int signature_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.nio.charset.Charset; - -/** - * See JVMS, section 4.8.15. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class SourceDebugExtension_attribute extends Attribute { - private static final Charset UTF8 = Charset.forName("UTF-8"); - - SourceDebugExtension_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - debug_extension = new byte[attribute_length]; - cr.readFully(debug_extension); - } - - public SourceDebugExtension_attribute(ConstantPool constant_pool, byte[] debug_extension) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.SourceDebugExtension), debug_extension); - } - - public SourceDebugExtension_attribute(int name_index, byte[] debug_extension) { - super(name_index, debug_extension.length); - this.debug_extension = debug_extension; - } - - public String getValue() { - return new String(debug_extension, UTF8); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitSourceDebugExtension(this, data); - } - - public final byte[] debug_extension; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceFile_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.10. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class SourceFile_attribute extends Attribute { - SourceFile_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - sourcefile_index = cr.readUnsignedShort(); - } - - public SourceFile_attribute(ConstantPool constant_pool, int sourcefile_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.SourceFile), sourcefile_index); - } - - public SourceFile_attribute(int name_index, int sourcefile_index) { - super(name_index, 2); - this.sourcefile_index = sourcefile_index; - } - - public String getSourceFile(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(sourcefile_index); - } - - public <R, P> R accept(Visitor<R, P> visitor, P p) { - return visitor.visitSourceFile(this, p); - } - - public final int sourcefile_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceID_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class SourceID_attribute extends Attribute { - - SourceID_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - sourceID_index = cr.readUnsignedShort(); - } - - public SourceID_attribute(ConstantPool constant_pool, int sourceID_index) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.SourceID), sourceID_index); - } - - public SourceID_attribute(int name_index, int sourceID_index) { - super(name_index, 2); - this.sourceID_index = sourceID_index; - } - - String getSourceID(ConstantPool constant_pool) throws ConstantPoolException { - return constant_pool.getUTF8Value(sourceID_index); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitSourceID(this, data); - } - - public final int sourceID_index; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,380 +0,0 @@ -/* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.4. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class StackMapTable_attribute extends Attribute { - static class InvalidStackMap extends AttributeException { - private static final long serialVersionUID = -5659038410855089780L; - InvalidStackMap(String msg) { - super(msg); - } - } - - StackMapTable_attribute(ClassReader cr, int name_index, int length) - throws IOException, InvalidStackMap { - super(name_index, length); - number_of_entries = cr.readUnsignedShort(); - entries = new stack_map_frame[number_of_entries]; - for (int i = 0; i < number_of_entries; i++) - entries[i] = stack_map_frame.read(cr); - } - - public StackMapTable_attribute(ConstantPool constant_pool, stack_map_frame[] entries) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.StackMapTable), entries); - } - - public StackMapTable_attribute(int name_index, stack_map_frame[] entries) { - super(name_index, length(entries)); - this.number_of_entries = entries.length; - this.entries = entries; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitStackMapTable(this, data); - } - - static int length(stack_map_frame[] entries) { - int n = 2; - for (stack_map_frame entry: entries) - n += entry.length(); - return n; - } - - public final int number_of_entries; - public final stack_map_frame entries[]; - - public static abstract class stack_map_frame { - static stack_map_frame read(ClassReader cr) - throws IOException, InvalidStackMap { - int frame_type = cr.readUnsignedByte(); - if (frame_type <= 63) - return new same_frame(frame_type); - else if (frame_type <= 127) - return new same_locals_1_stack_item_frame(frame_type, cr); - else if (frame_type <= 246) - throw new Error("unknown frame_type " + frame_type); - else if (frame_type == 247) - return new same_locals_1_stack_item_frame_extended(frame_type, cr); - else if (frame_type <= 250) - return new chop_frame(frame_type, cr); - else if (frame_type == 251) - return new same_frame_extended(frame_type, cr); - else if (frame_type <= 254) - return new append_frame(frame_type, cr); - else - return new full_frame(frame_type, cr); - } - - protected stack_map_frame(int frame_type) { - this.frame_type = frame_type; - } - - public int length() { - return 1; - } - - public abstract int getOffsetDelta(); - - public abstract <R,D> R accept(Visitor<R,D> visitor, D data); - - public final int frame_type; - - public static interface Visitor<R,P> { - R visit_same_frame(same_frame frame, P p); - R visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, P p); - R visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, P p); - R visit_chop_frame(chop_frame frame, P p); - R visit_same_frame_extended(same_frame_extended frame, P p); - R visit_append_frame(append_frame frame, P p); - R visit_full_frame(full_frame frame, P p); - } - } - - public static class same_frame extends stack_map_frame { - same_frame(int frame_type) { - super(frame_type); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_same_frame(this, data); - } - - public int getOffsetDelta() { - return frame_type; - } - } - - public static class same_locals_1_stack_item_frame extends stack_map_frame { - same_locals_1_stack_item_frame(int frame_type, ClassReader cr) - throws IOException, InvalidStackMap { - super(frame_type); - stack = new verification_type_info[1]; - stack[0] = verification_type_info.read(cr); - } - - @Override - public int length() { - return super.length() + stack[0].length(); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_same_locals_1_stack_item_frame(this, data); - } - - public int getOffsetDelta() { - return frame_type - 64; - } - - public final verification_type_info[] stack; - } - - public static class same_locals_1_stack_item_frame_extended extends stack_map_frame { - same_locals_1_stack_item_frame_extended(int frame_type, ClassReader cr) - throws IOException, InvalidStackMap { - super(frame_type); - offset_delta = cr.readUnsignedShort(); - stack = new verification_type_info[1]; - stack[0] = verification_type_info.read(cr); - } - - @Override - public int length() { - return super.length() + 2 + stack[0].length(); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_same_locals_1_stack_item_frame_extended(this, data); - } - - public int getOffsetDelta() { - return offset_delta; - } - - public final int offset_delta; - public final verification_type_info[] stack; - } - - public static class chop_frame extends stack_map_frame { - chop_frame(int frame_type, ClassReader cr) throws IOException { - super(frame_type); - offset_delta = cr.readUnsignedShort(); - } - - @Override - public int length() { - return super.length() + 2; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_chop_frame(this, data); - } - - public int getOffsetDelta() { - return offset_delta; - } - - public final int offset_delta; - } - - public static class same_frame_extended extends stack_map_frame { - same_frame_extended(int frame_type, ClassReader cr) throws IOException { - super(frame_type); - offset_delta = cr.readUnsignedShort(); - } - - @Override - public int length() { - return super.length() + 2; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_same_frame_extended(this, data); - } - - public int getOffsetDelta() { - return offset_delta; - } - - public final int offset_delta; - } - - public static class append_frame extends stack_map_frame { - append_frame(int frame_type, ClassReader cr) - throws IOException, InvalidStackMap { - super(frame_type); - offset_delta = cr.readUnsignedShort(); - locals = new verification_type_info[frame_type - 251]; - for (int i = 0; i < locals.length; i++) - locals[i] = verification_type_info.read(cr); - } - - @Override - public int length() { - int n = super.length() + 2; - for (verification_type_info local: locals) - n += local.length(); - return n; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_append_frame(this, data); - } - - public int getOffsetDelta() { - return offset_delta; - } - - public final int offset_delta; - public final verification_type_info[] locals; - } - - public static class full_frame extends stack_map_frame { - full_frame(int frame_type, ClassReader cr) - throws IOException, InvalidStackMap { - super(frame_type); - offset_delta = cr.readUnsignedShort(); - number_of_locals = cr.readUnsignedShort(); - locals = new verification_type_info[number_of_locals]; - for (int i = 0; i < locals.length; i++) - locals[i] = verification_type_info.read(cr); - number_of_stack_items = cr.readUnsignedShort(); - stack = new verification_type_info[number_of_stack_items]; - for (int i = 0; i < stack.length; i++) - stack[i] = verification_type_info.read(cr); - } - - @Override - public int length() { - int n = super.length() + 2; - for (verification_type_info local: locals) - n += local.length(); - n += 2; - for (verification_type_info item: stack) - n += item.length(); - return n; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visit_full_frame(this, data); - } - - public int getOffsetDelta() { - return offset_delta; - } - - public final int offset_delta; - public final int number_of_locals; - public final verification_type_info[] locals; - public final int number_of_stack_items; - public final verification_type_info[] stack; - } - - public static class verification_type_info { - public static final int ITEM_Top = 0; - public static final int ITEM_Integer = 1; - public static final int ITEM_Float = 2; - public static final int ITEM_Long = 4; - public static final int ITEM_Double = 3; - public static final int ITEM_Null = 5; - public static final int ITEM_UninitializedThis = 6; - public static final int ITEM_Object = 7; - public static final int ITEM_Uninitialized = 8; - - static verification_type_info read(ClassReader cr) - throws IOException, InvalidStackMap { - int tag = cr.readUnsignedByte(); - switch (tag) { - case ITEM_Top: - case ITEM_Integer: - case ITEM_Float: - case ITEM_Long: - case ITEM_Double: - case ITEM_Null: - case ITEM_UninitializedThis: - return new verification_type_info(tag); - - case ITEM_Object: - return new Object_variable_info(cr); - - case ITEM_Uninitialized: - return new Uninitialized_variable_info(cr); - - default: - throw new InvalidStackMap("unrecognized verification_type_info tag"); - } - } - - protected verification_type_info(int tag) { - this.tag = tag; - } - - public int length() { - return 1; - } - - public final int tag; - } - - public static class Object_variable_info extends verification_type_info { - Object_variable_info(ClassReader cr) throws IOException { - super(ITEM_Object); - cpool_index = cr.readUnsignedShort(); - } - - @Override - public int length() { - return super.length() + 2; - } - - public final int cpool_index; - } - - public static class Uninitialized_variable_info extends verification_type_info { - Uninitialized_variable_info(ClassReader cr) throws IOException { - super(ITEM_Uninitialized); - offset = cr.readUnsignedShort(); - } - - @Override - public int length() { - return super.length() + 2; - } - - public final int offset; - - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMap_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class StackMap_attribute extends Attribute { - StackMap_attribute(ClassReader cr, int name_index, int length) - throws IOException, StackMapTable_attribute.InvalidStackMap { - super(name_index, length); - number_of_entries = cr.readUnsignedShort(); - entries = new stack_map_frame[number_of_entries]; - for (int i = 0; i < number_of_entries; i++) - entries[i] = new stack_map_frame(cr); - } - - public StackMap_attribute(ConstantPool constant_pool, stack_map_frame[] entries) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.StackMap), entries); - } - - public StackMap_attribute(int name_index, stack_map_frame[] entries) { - super(name_index, StackMapTable_attribute.length(entries)); - this.number_of_entries = entries.length; - this.entries = entries; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitStackMap(this, data); - } - - public final int number_of_entries; - public final stack_map_frame entries[]; - - public static class stack_map_frame extends StackMapTable_attribute.full_frame { - stack_map_frame(ClassReader cr) - throws IOException, StackMapTable_attribute.InvalidStackMap { - super(255, cr); - } - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Synthetic_attribute.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; - -/** - * See JVMS, section 4.8.8. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Synthetic_attribute extends Attribute { - Synthetic_attribute(ClassReader cr, int name_index, int length) throws IOException { - super(name_index, length); - } - - public Synthetic_attribute(ConstantPool constant_pool) - throws ConstantPoolException { - this(constant_pool.getUTF8Index(Attribute.Synthetic)); - } - - public Synthetic_attribute(int name_index) { - super(name_index, 0); - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitSynthetic(this, data); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/Type.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,378 +0,0 @@ -/* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/* - * Family of classes used to represent the parsed form of a {@link Descriptor} - * or {@link Signature}. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public abstract class Type { - protected Type() { } - - public boolean isObject() { - return false; - } - - public abstract <R,D> R accept(Visitor<R,D> visitor, D data); - - protected static void append(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) { - sb.append(prefix); - String sep = ""; - for (Type t: types) { - sb.append(sep); - sb.append(t); - sep = ", "; - } - sb.append(suffix); - } - - protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) { - if (types != null && types.size() > 0) - append(sb, prefix, types, suffix); - } - - public interface Visitor<R,P> { - R visitSimpleType(SimpleType type, P p); - R visitArrayType(ArrayType type, P p); - R visitMethodType(MethodType type, P p); - R visitClassSigType(ClassSigType type, P p); - R visitClassType(ClassType type, P p); - R visitTypeParamType(TypeParamType type, P p); - R visitWildcardType(WildcardType type, P p); - } - - /** - * Represents a type signature with a simple name. The name may be that of a - * primitive type, such "{@code int}, {@code float}, etc - * or that of a type argument, such as {@code T}, {@code K}, {@code V}, etc. - * - * See: - * JVMS 4.3.2 - * BaseType: - * {@code B}, {@code C}, {@code D}, {@code F}, {@code I}, - * {@code J}, {@code S}, {@code Z}; - * VoidDescriptor: - * {@code V}; - * JVMS 4.3.4 - * TypeVariableSignature: - * {@code T} Identifier {@code ;} - */ - public static class SimpleType extends Type { - public SimpleType(String name) { - this.name = name; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitSimpleType(this, data); - } - - public boolean isPrimitiveType() { - return primitiveTypes.contains(name); - } - // where - private static final Set<String> primitiveTypes = new HashSet<>(Arrays.asList( - "boolean", "byte", "char", "double", "float", "int", "long", "short", "void")); - - @Override - public String toString() { - return name; - } - - public final String name; - } - - /** - * Represents an array type signature. - * - * See: - * JVMS 4.3.4 - * ArrayTypeSignature: - * {@code [} TypeSignature {@code ]} - */ - public static class ArrayType extends Type { - public ArrayType(Type elemType) { - this.elemType = elemType; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitArrayType(this, data); - } - - @Override - public String toString() { - return elemType + "[]"; - } - - public final Type elemType; - } - - /** - * Represents a method type signature. - * - * See; - * JVMS 4.3.4 - * MethodTypeSignature: - * FormalTypeParameters_opt {@code (} TypeSignature* {@code)} ReturnType - * ThrowsSignature* - */ - public static class MethodType extends Type { - public MethodType(List<? extends Type> paramTypes, Type resultType) { - this(null, paramTypes, resultType, null); - } - - public MethodType(List<? extends TypeParamType> typeParamTypes, - List<? extends Type> paramTypes, - Type returnType, - List<? extends Type> throwsTypes) { - this.typeParamTypes = typeParamTypes; - this.paramTypes = paramTypes; - this.returnType = returnType; - this.throwsTypes = throwsTypes; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitMethodType(this, data); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - appendIfNotEmpty(sb, "<", typeParamTypes, "> "); - sb.append(returnType); - append(sb, " (", paramTypes, ")"); - appendIfNotEmpty(sb, " throws ", throwsTypes, ""); - return sb.toString(); - } - - public final List<? extends TypeParamType> typeParamTypes; - public final List<? extends Type> paramTypes; - public final Type returnType; - public final List<? extends Type> throwsTypes; - } - - /** - * Represents a class signature. These describe the signature of - * a class that has type arguments. - * - * See: - * JVMS 4.3.4 - * ClassSignature: - * FormalTypeParameters_opt SuperclassSignature SuperinterfaceSignature* - */ - public static class ClassSigType extends Type { - public ClassSigType(List<TypeParamType> typeParamTypes, Type superclassType, - List<Type> superinterfaceTypes) { - this.typeParamTypes = typeParamTypes; - this.superclassType = superclassType; - this.superinterfaceTypes = superinterfaceTypes; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitClassSigType(this, data); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - appendIfNotEmpty(sb, "<", typeParamTypes, ">"); - if (superclassType != null) { - sb.append(" extends "); - sb.append(superclassType); - } - appendIfNotEmpty(sb, " implements ", superinterfaceTypes, ""); - return sb.toString(); - } - - public final List<TypeParamType> typeParamTypes; - public final Type superclassType; - public final List<Type> superinterfaceTypes; - } - - /** - * Represents a class type signature. This is used to represent a - * reference to a class, such as in a field, parameter, return type, etc. - * - * See: - * JVMS 4.3.4 - * ClassTypeSignature: - * {@code L} PackageSpecifier_opt SimpleClassTypeSignature - * ClassTypeSignatureSuffix* {@code ;} - * PackageSpecifier: - * Identifier {@code /} PackageSpecifier* - * SimpleClassTypeSignature: - * Identifier TypeArguments_opt } - * ClassTypeSignatureSuffix: - * {@code .} SimpleClassTypeSignature - */ - public static class ClassType extends Type { - public ClassType(ClassType outerType, String name, List<Type> typeArgs) { - this.outerType = outerType; - this.name = name; - this.typeArgs = typeArgs; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitClassType(this, data); - } - - public String getBinaryName() { - if (outerType == null) - return name; - else - return (outerType.getBinaryName() + "$" + name); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - if (outerType != null) { - sb.append(outerType); - sb.append("."); - } - sb.append(name); - appendIfNotEmpty(sb, "<", typeArgs, ">"); - return sb.toString(); - } - - @Override - public boolean isObject() { - return (outerType == null) - && name.equals("java/lang/Object") - && (typeArgs == null || typeArgs.isEmpty()); - } - - public final ClassType outerType; - public final String name; - public final List<Type> typeArgs; - } - - /** - * Represents a FormalTypeParameter. These are used to declare the type - * parameters for generic classes and methods. - * - * See: - * JVMS 4.3.4 - * FormalTypeParameters: - * {@code <} FormalTypeParameter+ {@code >} - * FormalTypeParameter: - * Identifier ClassBound InterfaceBound* - * ClassBound: - * {@code :} FieldTypeSignature_opt - * InterfaceBound: - * {@code :} FieldTypeSignature - */ - public static class TypeParamType extends Type { - public TypeParamType(String name, Type classBound, List<Type> interfaceBounds) { - this.name = name; - this.classBound = classBound; - this.interfaceBounds = interfaceBounds; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitTypeParamType(this, data); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(name); - String sep = " extends "; - if (classBound != null) { - sb.append(sep); - sb.append(classBound); - sep = " & "; - } - if (interfaceBounds != null) { - for (Type bound: interfaceBounds) { - sb.append(sep); - sb.append(bound); - sep = " & "; - } - } - return sb.toString(); - } - - public final String name; - public final Type classBound; - public final List<Type> interfaceBounds; - } - - /** - * Represents a wildcard type argument. A type argument that is not a - * wildcard type argument will be represented by a ClassType, ArrayType, etc. - * - * See: - * JVMS 4.3.4 - * TypeArgument: - * WildcardIndicator_opt FieldTypeSignature - * {@code *} - * WildcardIndicator: - * {@code +} - * {@code -} - */ - public static class WildcardType extends Type { - public enum Kind { UNBOUNDED, EXTENDS, SUPER } - - public WildcardType() { - this(Kind.UNBOUNDED, null); - } - public WildcardType(Kind kind, Type boundType) { - this.kind = kind; - this.boundType = boundType; - } - - public <R, D> R accept(Visitor<R, D> visitor, D data) { - return visitor.visitWildcardType(this, data); - } - - @Override - public String toString() { - switch (kind) { - case UNBOUNDED: - return "?"; - case EXTENDS: - return "? extends " + boundType; - case SUPER: - return "? super " + boundType; - default: - throw new AssertionError(); - } - } - - public final Kind kind; - public final Type boundType; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/TypeAnnotation.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,657 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import com.sun.tools.classfile.TypeAnnotation.Position.TypePathEntry; - -/** - * See JSR 308 specification, Section 3. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class TypeAnnotation { - TypeAnnotation(ClassReader cr) throws IOException, Annotation.InvalidAnnotation { - constant_pool = cr.getConstantPool(); - position = read_position(cr); - annotation = new Annotation(cr); - } - - public TypeAnnotation(ConstantPool constant_pool, - Annotation annotation, Position position) { - this.constant_pool = constant_pool; - this.position = position; - this.annotation = annotation; - } - - public int length() { - int n = annotation.length(); - n += position_length(position); - return n; - } - - @Override - public String toString() { - try { - return "@" + constant_pool.getUTF8Value(annotation.type_index).toString().substring(1) + - " pos: " + position.toString(); - } catch (Exception e) { - e.printStackTrace(); - return e.toString(); - } - } - - public final ConstantPool constant_pool; - public final Position position; - public final Annotation annotation; - - private static Position read_position(ClassReader cr) throws IOException, Annotation.InvalidAnnotation { - // Copied from ClassReader - int tag = cr.readUnsignedByte(); // TargetType tag is a byte - if (!TargetType.isValidTargetTypeValue(tag)) - throw new Annotation.InvalidAnnotation("TypeAnnotation: Invalid type annotation target type value: " + String.format("0x%02X", tag)); - - TargetType type = TargetType.fromTargetTypeValue(tag); - - Position position = new Position(); - position.type = type; - - switch (type) { - // instanceof - case INSTANCEOF: - // new expression - case NEW: - // constructor/method reference receiver - case CONSTRUCTOR_REFERENCE: - case METHOD_REFERENCE: - position.offset = cr.readUnsignedShort(); - break; - // local variable - case LOCAL_VARIABLE: - // resource variable - case RESOURCE_VARIABLE: - int table_length = cr.readUnsignedShort(); - position.lvarOffset = new int[table_length]; - position.lvarLength = new int[table_length]; - position.lvarIndex = new int[table_length]; - for (int i = 0; i < table_length; ++i) { - position.lvarOffset[i] = cr.readUnsignedShort(); - position.lvarLength[i] = cr.readUnsignedShort(); - position.lvarIndex[i] = cr.readUnsignedShort(); - } - break; - // exception parameter - case EXCEPTION_PARAMETER: - position.exception_index = cr.readUnsignedShort(); - break; - // method receiver - case METHOD_RECEIVER: - // Do nothing - break; - // type parameter - case CLASS_TYPE_PARAMETER: - case METHOD_TYPE_PARAMETER: - position.parameter_index = cr.readUnsignedByte(); - break; - // type parameter bound - case CLASS_TYPE_PARAMETER_BOUND: - case METHOD_TYPE_PARAMETER_BOUND: - position.parameter_index = cr.readUnsignedByte(); - position.bound_index = cr.readUnsignedByte(); - break; - // class extends or implements clause - case CLASS_EXTENDS: - int in = cr.readUnsignedShort(); - if (in == 0xFFFF) - in = -1; - position.type_index = in; - break; - // throws - case THROWS: - position.type_index = cr.readUnsignedShort(); - break; - // method parameter - case METHOD_FORMAL_PARAMETER: - position.parameter_index = cr.readUnsignedByte(); - break; - // type cast - case CAST: - // method/constructor/reference type argument - case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: - case METHOD_INVOCATION_TYPE_ARGUMENT: - case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: - case METHOD_REFERENCE_TYPE_ARGUMENT: - position.offset = cr.readUnsignedShort(); - position.type_index = cr.readUnsignedByte(); - break; - // We don't need to worry about these - case METHOD_RETURN: - case FIELD: - break; - case UNKNOWN: - throw new AssertionError("TypeAnnotation: UNKNOWN target type should never occur!"); - default: - throw new AssertionError("TypeAnnotation: Unknown target type: " + type); - } - - { // Write type path - int len = cr.readUnsignedByte(); - List<Integer> loc = new ArrayList<>(len); - for (int i = 0; i < len * TypePathEntry.bytesPerEntry; ++i) - loc.add(cr.readUnsignedByte()); - position.location = Position.getTypePathFromBinary(loc); - } - return position; - } - - private static int position_length(Position pos) { - int n = 0; - n += 1; // TargetType tag is a byte - switch (pos.type) { - // instanceof - case INSTANCEOF: - // new expression - case NEW: - // constructor/method reference receiver - case CONSTRUCTOR_REFERENCE: - case METHOD_REFERENCE: - n += 2; // offset - break; - // local variable - case LOCAL_VARIABLE: - // resource variable - case RESOURCE_VARIABLE: - n += 2; // table_length; - int table_length = pos.lvarOffset.length; - n += 2 * table_length; // offset - n += 2 * table_length; // length - n += 2 * table_length; // index - break; - // exception parameter - case EXCEPTION_PARAMETER: - n += 2; // exception_index - break; - // method receiver - case METHOD_RECEIVER: - // Do nothing - break; - // type parameter - case CLASS_TYPE_PARAMETER: - case METHOD_TYPE_PARAMETER: - n += 1; // parameter_index - break; - // type parameter bound - case CLASS_TYPE_PARAMETER_BOUND: - case METHOD_TYPE_PARAMETER_BOUND: - n += 1; // parameter_index - n += 1; // bound_index - break; - // class extends or implements clause - case CLASS_EXTENDS: - n += 2; // type_index - break; - // throws - case THROWS: - n += 2; // type_index - break; - // method parameter - case METHOD_FORMAL_PARAMETER: - n += 1; // parameter_index - break; - // type cast - case CAST: - // method/constructor/reference type argument - case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: - case METHOD_INVOCATION_TYPE_ARGUMENT: - case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: - case METHOD_REFERENCE_TYPE_ARGUMENT: - n += 2; // offset - n += 1; // type index - break; - // We don't need to worry about these - case METHOD_RETURN: - case FIELD: - break; - case UNKNOWN: - throw new AssertionError("TypeAnnotation: UNKNOWN target type should never occur!"); - default: - throw new AssertionError("TypeAnnotation: Unknown target type: " + pos.type); - } - - { - n += 1; // length - n += TypePathEntry.bytesPerEntry * pos.location.size(); // bytes for actual array - } - - return n; - } - - // Code duplicated from com.sun.tools.javac.code.TypeAnnotationPosition - public static class Position { - public enum TypePathEntryKind { - ARRAY(0), - INNER_TYPE(1), - WILDCARD(2), - TYPE_ARGUMENT(3); - - public final int tag; - - private TypePathEntryKind(int tag) { - this.tag = tag; - } - } - - public static class TypePathEntry { - /** The fixed number of bytes per TypePathEntry. */ - public static final int bytesPerEntry = 2; - - public final TypePathEntryKind tag; - public final int arg; - - public static final TypePathEntry ARRAY = new TypePathEntry(TypePathEntryKind.ARRAY); - public static final TypePathEntry INNER_TYPE = new TypePathEntry(TypePathEntryKind.INNER_TYPE); - public static final TypePathEntry WILDCARD = new TypePathEntry(TypePathEntryKind.WILDCARD); - - private TypePathEntry(TypePathEntryKind tag) { - if (!(tag == TypePathEntryKind.ARRAY || - tag == TypePathEntryKind.INNER_TYPE || - tag == TypePathEntryKind.WILDCARD)) { - throw new AssertionError("Invalid TypePathEntryKind: " + tag); - } - this.tag = tag; - this.arg = 0; - } - - public TypePathEntry(TypePathEntryKind tag, int arg) { - if (tag != TypePathEntryKind.TYPE_ARGUMENT) { - throw new AssertionError("Invalid TypePathEntryKind: " + tag); - } - this.tag = tag; - this.arg = arg; - } - - public static TypePathEntry fromBinary(int tag, int arg) { - if (arg != 0 && tag != TypePathEntryKind.TYPE_ARGUMENT.tag) { - throw new AssertionError("Invalid TypePathEntry tag/arg: " + tag + "/" + arg); - } - switch (tag) { - case 0: - return ARRAY; - case 1: - return INNER_TYPE; - case 2: - return WILDCARD; - case 3: - return new TypePathEntry(TypePathEntryKind.TYPE_ARGUMENT, arg); - default: - throw new AssertionError("Invalid TypePathEntryKind tag: " + tag); - } - } - - @Override - public String toString() { - return tag.toString() + - (tag == TypePathEntryKind.TYPE_ARGUMENT ? ("(" + arg + ")") : ""); - } - - @Override - public boolean equals(Object other) { - if (! (other instanceof TypePathEntry)) { - return false; - } - TypePathEntry tpe = (TypePathEntry) other; - return this.tag == tpe.tag && this.arg == tpe.arg; - } - - @Override - public int hashCode() { - return this.tag.hashCode() * 17 + this.arg; - } - } - - public TargetType type = TargetType.UNKNOWN; - - // For generic/array types. - // TODO: or should we use null? Noone will use this object. - public List<TypePathEntry> location = new ArrayList<>(0); - - // Tree position. - public int pos = -1; - - // For typecasts, type tests, new (and locals, as start_pc). - public boolean isValidOffset = false; - public int offset = -1; - - // For locals. arrays same length - public int[] lvarOffset = null; - public int[] lvarLength = null; - public int[] lvarIndex = null; - - // For type parameter bound - public int bound_index = Integer.MIN_VALUE; - - // For type parameter and method parameter - public int parameter_index = Integer.MIN_VALUE; - - // For class extends, implements, and throws clauses - public int type_index = Integer.MIN_VALUE; - - // For exception parameters, index into exception table - public int exception_index = Integer.MIN_VALUE; - - public Position() {} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append('['); - sb.append(type); - - switch (type) { - // instanceof - case INSTANCEOF: - // new expression - case NEW: - // constructor/method reference receiver - case CONSTRUCTOR_REFERENCE: - case METHOD_REFERENCE: - sb.append(", offset = "); - sb.append(offset); - break; - // local variable - case LOCAL_VARIABLE: - // resource variable - case RESOURCE_VARIABLE: - if (lvarOffset == null) { - sb.append(", lvarOffset is null!"); - break; - } - sb.append(", {"); - for (int i = 0; i < lvarOffset.length; ++i) { - if (i != 0) sb.append("; "); - sb.append("start_pc = "); - sb.append(lvarOffset[i]); - sb.append(", length = "); - sb.append(lvarLength[i]); - sb.append(", index = "); - sb.append(lvarIndex[i]); - } - sb.append("}"); - break; - // method receiver - case METHOD_RECEIVER: - // Do nothing - break; - // type parameter - case CLASS_TYPE_PARAMETER: - case METHOD_TYPE_PARAMETER: - sb.append(", param_index = "); - sb.append(parameter_index); - break; - // type parameter bound - case CLASS_TYPE_PARAMETER_BOUND: - case METHOD_TYPE_PARAMETER_BOUND: - sb.append(", param_index = "); - sb.append(parameter_index); - sb.append(", bound_index = "); - sb.append(bound_index); - break; - // class extends or implements clause - case CLASS_EXTENDS: - sb.append(", type_index = "); - sb.append(type_index); - break; - // throws - case THROWS: - sb.append(", type_index = "); - sb.append(type_index); - break; - // exception parameter - case EXCEPTION_PARAMETER: - sb.append(", exception_index = "); - sb.append(exception_index); - break; - // method parameter - case METHOD_FORMAL_PARAMETER: - sb.append(", param_index = "); - sb.append(parameter_index); - break; - // type cast - case CAST: - // method/constructor/reference type argument - case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: - case METHOD_INVOCATION_TYPE_ARGUMENT: - case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: - case METHOD_REFERENCE_TYPE_ARGUMENT: - sb.append(", offset = "); - sb.append(offset); - sb.append(", type_index = "); - sb.append(type_index); - break; - // We don't need to worry about these - case METHOD_RETURN: - case FIELD: - break; - case UNKNOWN: - sb.append(", position UNKNOWN!"); - break; - default: - throw new AssertionError("Unknown target type: " + type); - } - - // Append location data for generics/arrays. - if (!location.isEmpty()) { - sb.append(", location = ("); - sb.append(location); - sb.append(")"); - } - - sb.append(", pos = "); - sb.append(pos); - - sb.append(']'); - return sb.toString(); - } - - /** - * Indicates whether the target tree of the annotation has been optimized - * away from classfile or not. - * @return true if the target has not been optimized away - */ - public boolean emitToClassfile() { - return !type.isLocal() || isValidOffset; - } - - /** - * Decode the binary representation for a type path and set - * the {@code location} field. - * - * @param list The bytecode representation of the type path. - */ - public static List<TypePathEntry> getTypePathFromBinary(List<Integer> list) { - List<TypePathEntry> loc = new ArrayList<>(list.size() / TypePathEntry.bytesPerEntry); - int idx = 0; - while (idx < list.size()) { - if (idx + 1 == list.size()) { - throw new AssertionError("Could not decode type path: " + list); - } - loc.add(TypePathEntry.fromBinary(list.get(idx), list.get(idx + 1))); - idx += 2; - } - return loc; - } - - public static List<Integer> getBinaryFromTypePath(List<TypePathEntry> locs) { - List<Integer> loc = new ArrayList<>(locs.size() * TypePathEntry.bytesPerEntry); - for (TypePathEntry tpe : locs) { - loc.add(tpe.tag.tag); - loc.add(tpe.arg); - } - return loc; - } - } - - // Code duplicated from com.sun.tools.javac.code.TargetType - // The IsLocal flag could be removed here. - public enum TargetType { - /** For annotations on a class type parameter declaration. */ - CLASS_TYPE_PARAMETER(0x00), - - /** For annotations on a method type parameter declaration. */ - METHOD_TYPE_PARAMETER(0x01), - - /** For annotations on the type of an "extends" or "implements" clause. */ - CLASS_EXTENDS(0x10), - - /** For annotations on a bound of a type parameter of a class. */ - CLASS_TYPE_PARAMETER_BOUND(0x11), - - /** For annotations on a bound of a type parameter of a method. */ - METHOD_TYPE_PARAMETER_BOUND(0x12), - - /** For annotations on a field. */ - FIELD(0x13), - - /** For annotations on a method return type. */ - METHOD_RETURN(0x14), - - /** For annotations on the method receiver. */ - METHOD_RECEIVER(0x15), - - /** For annotations on a method parameter. */ - METHOD_FORMAL_PARAMETER(0x16), - - /** For annotations on a throws clause in a method declaration. */ - THROWS(0x17), - - /** For annotations on a local variable. */ - LOCAL_VARIABLE(0x40, true), - - /** For annotations on a resource variable. */ - RESOURCE_VARIABLE(0x41, true), - - /** For annotations on an exception parameter. */ - EXCEPTION_PARAMETER(0x42, true), - - /** For annotations on a type test. */ - INSTANCEOF(0x43, true), - - /** For annotations on an object creation expression. */ - NEW(0x44, true), - - /** For annotations on a constructor reference receiver. */ - CONSTRUCTOR_REFERENCE(0x45, true), - - /** For annotations on a method reference receiver. */ - METHOD_REFERENCE(0x46, true), - - /** For annotations on a typecast. */ - CAST(0x47, true), - - /** For annotations on a type argument of an object creation expression. */ - CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT(0x48, true), - - /** For annotations on a type argument of a method call. */ - METHOD_INVOCATION_TYPE_ARGUMENT(0x49, true), - - /** For annotations on a type argument of a constructor reference. */ - CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT(0x4A, true), - - /** For annotations on a type argument of a method reference. */ - METHOD_REFERENCE_TYPE_ARGUMENT(0x4B, true), - - /** For annotations with an unknown target. */ - UNKNOWN(0xFF); - - private static final int MAXIMUM_TARGET_TYPE_VALUE = 0x4B; - - private final int targetTypeValue; - private final boolean isLocal; - - private TargetType(int targetTypeValue) { - this(targetTypeValue, false); - } - - private TargetType(int targetTypeValue, boolean isLocal) { - if (targetTypeValue < 0 - || targetTypeValue > 255) - throw new AssertionError("Attribute type value needs to be an unsigned byte: " + String.format("0x%02X", targetTypeValue)); - this.targetTypeValue = targetTypeValue; - this.isLocal = isLocal; - } - - /** - * Returns whether or not this TargetType represents an annotation whose - * target is exclusively a tree in a method body - * - * Note: wildcard bound targets could target a local tree and a class - * member declaration signature tree - */ - public boolean isLocal() { - return isLocal; - } - - public int targetTypeValue() { - return this.targetTypeValue; - } - - private static final TargetType[] targets; - - static { - targets = new TargetType[MAXIMUM_TARGET_TYPE_VALUE + 1]; - TargetType[] alltargets = values(); - for (TargetType target : alltargets) { - if (target.targetTypeValue != UNKNOWN.targetTypeValue) - targets[target.targetTypeValue] = target; - } - for (int i = 0; i <= MAXIMUM_TARGET_TYPE_VALUE; ++i) { - if (targets[i] == null) - targets[i] = UNKNOWN; - } - } - - public static boolean isValidTargetTypeValue(int tag) { - if (tag == UNKNOWN.targetTypeValue) - return true; - return (tag >= 0 && tag < targets.length); - } - - public static TargetType fromTargetTypeValue(int tag) { - if (tag == UNKNOWN.targetTypeValue) - return UNKNOWN; - - if (tag < 0 || tag >= targets.length) - throw new AssertionError("Unknown TargetType: " + tag); - return targets[tag]; - } - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/classfile/package-info.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - A minimalist library to read and write class files into objects closely - based on the corresponding definitions in - <cite>The Java™ Virtual Machine Specification</cite> (JVMS). - - <p><b>This is NOT part of any supported API. - If you write code that depends on this, you do so at your own risk. - This code and its internal interfaces are subject to change or - deletion without notice.</b> -*/ -@jdk.Exported(false) -package com.sun.tools.classfile;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Thu May 28 16:13:55 2015 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Thu May 28 16:54:56 2015 -0700 @@ -2749,7 +2749,7 @@ Scope s = c.members(); for (Symbol sym : s.getSymbols(NON_RECURSIVE)) { if (sym.kind == MTH && - (sym.flags() & (ABSTRACT|IPROXY|DEFAULT)) == ABSTRACT) { + (sym.flags() & (ABSTRACT|IPROXY|DEFAULT|PRIVATE)) == ABSTRACT) { MethodSymbol absmeth = (MethodSymbol)sym; MethodSymbol implmeth = absmeth.implementation(impl, this, true); if (implmeth == null || implmeth == absmeth) {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu May 28 16:13:55 2015 -0700 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu May 28 16:54:56 2015 -0700 @@ -985,7 +985,7 @@ if (isDefaultMethod || (tree.sym.flags() & (ABSTRACT | NATIVE)) == 0 && !relax) log.error(tree.pos(), "missing.meth.body.or.decl.abstract"); - } else if ((tree.sym.flags() & ABSTRACT) != 0 && !isDefaultMethod) { + } else if ((tree.sym.flags() & (ABSTRACT|DEFAULT|PRIVATE)) == ABSTRACT) { if ((owner.flags() & INTERFACE) != 0) { log.error(tree.body.pos(), "intf.meth.cant.have.body"); } else {
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/AnnotationWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,291 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.Annotation; -import com.sun.tools.classfile.TypeAnnotation; -import com.sun.tools.classfile.Annotation.Annotation_element_value; -import com.sun.tools.classfile.Annotation.Array_element_value; -import com.sun.tools.classfile.Annotation.Class_element_value; -import com.sun.tools.classfile.Annotation.Enum_element_value; -import com.sun.tools.classfile.Annotation.Primitive_element_value; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Descriptor; -import com.sun.tools.classfile.Descriptor.InvalidDescriptor; - -/** - * A writer for writing annotations as text. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class AnnotationWriter extends BasicWriter { - static AnnotationWriter instance(Context context) { - AnnotationWriter instance = context.get(AnnotationWriter.class); - if (instance == null) - instance = new AnnotationWriter(context); - return instance; - } - - protected AnnotationWriter(Context context) { - super(context); - classWriter = ClassWriter.instance(context); - constantWriter = ConstantWriter.instance(context); - } - - public void write(Annotation annot) { - write(annot, false); - } - - public void write(Annotation annot, boolean resolveIndices) { - writeDescriptor(annot.type_index, resolveIndices); - boolean showParens = annot.num_element_value_pairs > 0 || !resolveIndices; - if (showParens) - print("("); - for (int i = 0; i < annot.num_element_value_pairs; i++) { - if (i > 0) - print(","); - write(annot.element_value_pairs[i], resolveIndices); - } - if (showParens) - print(")"); - } - - public void write(TypeAnnotation annot) { - write(annot, true, false); - } - - public void write(TypeAnnotation annot, boolean showOffsets, boolean resolveIndices) { - write(annot.annotation, resolveIndices); - print(": "); - write(annot.position, showOffsets); - } - - public void write(TypeAnnotation.Position pos, boolean showOffsets) { - print(pos.type); - - switch (pos.type) { - // instanceof - case INSTANCEOF: - // new expression - case NEW: - // constructor/method reference receiver - case CONSTRUCTOR_REFERENCE: - case METHOD_REFERENCE: - if (showOffsets) { - print(", offset="); - print(pos.offset); - } - break; - // local variable - case LOCAL_VARIABLE: - // resource variable - case RESOURCE_VARIABLE: - if (pos.lvarOffset == null) { - print(", lvarOffset is Null!"); - break; - } - print(", {"); - for (int i = 0; i < pos.lvarOffset.length; ++i) { - if (i != 0) print("; "); - if (showOffsets) { - print("start_pc="); - print(pos.lvarOffset[i]); - } - print(", length="); - print(pos.lvarLength[i]); - print(", index="); - print(pos.lvarIndex[i]); - } - print("}"); - break; - // exception parameter - case EXCEPTION_PARAMETER: - print(", exception_index="); - print(pos.exception_index); - break; - // method receiver - case METHOD_RECEIVER: - // Do nothing - break; - // type parameter - case CLASS_TYPE_PARAMETER: - case METHOD_TYPE_PARAMETER: - print(", param_index="); - print(pos.parameter_index); - break; - // type parameter bound - case CLASS_TYPE_PARAMETER_BOUND: - case METHOD_TYPE_PARAMETER_BOUND: - print(", param_index="); - print(pos.parameter_index); - print(", bound_index="); - print(pos.bound_index); - break; - // class extends or implements clause - case CLASS_EXTENDS: - print(", type_index="); - print(pos.type_index); - break; - // throws - case THROWS: - print(", type_index="); - print(pos.type_index); - break; - // method parameter - case METHOD_FORMAL_PARAMETER: - print(", param_index="); - print(pos.parameter_index); - break; - // type cast - case CAST: - // method/constructor/reference type argument - case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: - case METHOD_INVOCATION_TYPE_ARGUMENT: - case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: - case METHOD_REFERENCE_TYPE_ARGUMENT: - if (showOffsets) { - print(", offset="); - print(pos.offset); - } - print(", type_index="); - print(pos.type_index); - break; - // We don't need to worry about these - case METHOD_RETURN: - case FIELD: - break; - case UNKNOWN: - throw new AssertionError("AnnotationWriter: UNKNOWN target type should never occur!"); - default: - throw new AssertionError("AnnotationWriter: Unknown target type for position: " + pos); - } - - // Append location data for generics/arrays. - if (!pos.location.isEmpty()) { - print(", location="); - print(pos.location); - } - } - - public void write(Annotation.element_value_pair pair) { - write(pair, false); - } - - public void write(Annotation.element_value_pair pair, boolean resolveIndices) { - writeIndex(pair.element_name_index, resolveIndices); - print("="); - write(pair.value, resolveIndices); - } - - public void write(Annotation.element_value value) { - write(value, false); - } - - public void write(Annotation.element_value value, boolean resolveIndices) { - ev_writer.write(value, resolveIndices); - } - - private void writeDescriptor(int index, boolean resolveIndices) { - if (resolveIndices) { - try { - ConstantPool constant_pool = classWriter.getClassFile().constant_pool; - Descriptor d = new Descriptor(index); - print(d.getFieldType(constant_pool)); - return; - } catch (ConstantPoolException | InvalidDescriptor ignore) { - } - } - - print("#" + index); - } - - private void writeIndex(int index, boolean resolveIndices) { - if (resolveIndices) { - print(constantWriter.stringValue(index)); - } else - print("#" + index); - } - - element_value_Writer ev_writer = new element_value_Writer(); - - class element_value_Writer implements Annotation.element_value.Visitor<Void,Boolean> { - public void write(Annotation.element_value value, boolean resolveIndices) { - value.accept(this, resolveIndices); - } - - public Void visitPrimitive(Primitive_element_value ev, Boolean resolveIndices) { - if (resolveIndices) - writeIndex(ev.const_value_index, resolveIndices); - else - print(((char) ev.tag) + "#" + ev.const_value_index); - return null; - } - - public Void visitEnum(Enum_element_value ev, Boolean resolveIndices) { - if (resolveIndices) { - writeIndex(ev.type_name_index, resolveIndices); - print("."); - writeIndex(ev.const_name_index, resolveIndices); - } else - print(((char) ev.tag) + "#" + ev.type_name_index + ".#" + ev.const_name_index); - return null; - } - - public Void visitClass(Class_element_value ev, Boolean resolveIndices) { - if (resolveIndices) { - writeIndex(ev.class_info_index, resolveIndices); - print(".class"); - } else - print(((char) ev.tag) + "#" + ev.class_info_index); - return null; - } - - public Void visitAnnotation(Annotation_element_value ev, Boolean resolveIndices) { - print((char) ev.tag); - AnnotationWriter.this.write(ev.annotation_value, resolveIndices); - return null; - } - - public Void visitArray(Array_element_value ev, Boolean resolveIndices) { - print("["); - for (int i = 0; i < ev.num_values; i++) { - if (i > 0) - print(","); - write(ev.values[i], resolveIndices); - } - print("]"); - return null; - } - - } - - private ClassWriter classWriter; - private ConstantWriter constantWriter; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/AttributeWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,712 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.Formatter; - -import com.sun.tools.classfile.AccessFlags; -import com.sun.tools.classfile.AnnotationDefault_attribute; -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Attributes; -import com.sun.tools.classfile.BootstrapMethods_attribute; -import com.sun.tools.classfile.CharacterRangeTable_attribute; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.CompilationID_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.ConstantValue_attribute; -import com.sun.tools.classfile.DefaultAttribute; -import com.sun.tools.classfile.Deprecated_attribute; -import com.sun.tools.classfile.EnclosingMethod_attribute; -import com.sun.tools.classfile.Exceptions_attribute; -import com.sun.tools.classfile.InnerClasses_attribute; -import com.sun.tools.classfile.LineNumberTable_attribute; -import com.sun.tools.classfile.LocalVariableTable_attribute; -import com.sun.tools.classfile.LocalVariableTypeTable_attribute; -import com.sun.tools.classfile.MethodParameters_attribute; -import com.sun.tools.classfile.RuntimeInvisibleAnnotations_attribute; -import com.sun.tools.classfile.RuntimeInvisibleParameterAnnotations_attribute; -import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute; -import com.sun.tools.classfile.RuntimeVisibleAnnotations_attribute; -import com.sun.tools.classfile.RuntimeVisibleParameterAnnotations_attribute; -import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute; -import com.sun.tools.classfile.Signature_attribute; -import com.sun.tools.classfile.SourceDebugExtension_attribute; -import com.sun.tools.classfile.SourceFile_attribute; -import com.sun.tools.classfile.SourceID_attribute; -import com.sun.tools.classfile.StackMapTable_attribute; -import com.sun.tools.classfile.StackMap_attribute; -import com.sun.tools.classfile.Synthetic_attribute; - -import static com.sun.tools.classfile.AccessFlags.*; - -import com.sun.tools.javac.util.Assert; -import com.sun.tools.javac.util.StringUtils; - -/* - * A writer for writing Attributes as text. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class AttributeWriter extends BasicWriter - implements Attribute.Visitor<Void,Void> -{ - public static AttributeWriter instance(Context context) { - AttributeWriter instance = context.get(AttributeWriter.class); - if (instance == null) - instance = new AttributeWriter(context); - return instance; - } - - protected AttributeWriter(Context context) { - super(context); - context.put(AttributeWriter.class, this); - annotationWriter = AnnotationWriter.instance(context); - codeWriter = CodeWriter.instance(context); - constantWriter = ConstantWriter.instance(context); - options = Options.instance(context); - } - - public void write(Object owner, Attribute attr, ConstantPool constant_pool) { - if (attr != null) { - Assert.checkNonNull(constant_pool); - Assert.checkNonNull(owner); - this.constant_pool = constant_pool; - this.owner = owner; - attr.accept(this, null); - } - } - - public void write(Object owner, Attributes attrs, ConstantPool constant_pool) { - if (attrs != null) { - Assert.checkNonNull(constant_pool); - Assert.checkNonNull(owner); - this.constant_pool = constant_pool; - this.owner = owner; - for (Attribute attr: attrs) - attr.accept(this, null); - } - } - - public Void visitDefault(DefaultAttribute attr, Void ignore) { - if (attr.reason != null) { - report(attr.reason); - } - byte[] data = attr.info; - int i = 0; - int j = 0; - print(" "); - try { - print(attr.getName(constant_pool)); - } catch (ConstantPoolException e) { - report(e); - print("attribute name = #" + attr.attribute_name_index); - } - print(": "); - println("length = 0x" + toHex(attr.info.length)); - - print(" "); - - while (i < data.length) { - print(toHex(data[i], 2)); - - j++; - if (j == 16) { - println(); - print(" "); - j = 0; - } else { - print(" "); - } - i++; - } - println(); - return null; - } - - public Void visitAnnotationDefault(AnnotationDefault_attribute attr, Void ignore) { - println("AnnotationDefault:"); - indent(+1); - print("default_value: "); - annotationWriter.write(attr.default_value); - indent(-1); - return null; - } - - public Void visitBootstrapMethods(BootstrapMethods_attribute attr, Void p) { - println(Attribute.BootstrapMethods + ":"); - for (int i = 0; i < attr.bootstrap_method_specifiers.length ; i++) { - BootstrapMethods_attribute.BootstrapMethodSpecifier bsm = attr.bootstrap_method_specifiers[i]; - indent(+1); - print(i + ": #" + bsm.bootstrap_method_ref + " "); - println(constantWriter.stringValue(bsm.bootstrap_method_ref)); - indent(+1); - println("Method arguments:"); - indent(+1); - for (int j = 0; j < bsm.bootstrap_arguments.length; j++) { - print("#" + bsm.bootstrap_arguments[j] + " "); - println(constantWriter.stringValue(bsm.bootstrap_arguments[j])); - } - indent(-3); - } - return null; - } - - public Void visitCharacterRangeTable(CharacterRangeTable_attribute attr, Void ignore) { - println("CharacterRangeTable:"); - indent(+1); - for (int i = 0; i < attr.character_range_table.length; i++) { - CharacterRangeTable_attribute.Entry e = attr.character_range_table[i]; - print(String.format(" %2d, %2d, %6x, %6x, %4x", - e.start_pc, e.end_pc, - e.character_range_start, e.character_range_end, - e.flags)); - tab(); - print(String.format("// %2d, %2d, %4d:%02d, %4d:%02d", - e.start_pc, e.end_pc, - (e.character_range_start >> 10), (e.character_range_start & 0x3ff), - (e.character_range_end >> 10), (e.character_range_end & 0x3ff))); - if ((e.flags & CharacterRangeTable_attribute.CRT_STATEMENT) != 0) - print(", statement"); - if ((e.flags & CharacterRangeTable_attribute.CRT_BLOCK) != 0) - print(", block"); - if ((e.flags & CharacterRangeTable_attribute.CRT_ASSIGNMENT) != 0) - print(", assignment"); - if ((e.flags & CharacterRangeTable_attribute.CRT_FLOW_CONTROLLER) != 0) - print(", flow-controller"); - if ((e.flags & CharacterRangeTable_attribute.CRT_FLOW_TARGET) != 0) - print(", flow-target"); - if ((e.flags & CharacterRangeTable_attribute.CRT_INVOKE) != 0) - print(", invoke"); - if ((e.flags & CharacterRangeTable_attribute.CRT_CREATE) != 0) - print(", create"); - if ((e.flags & CharacterRangeTable_attribute.CRT_BRANCH_TRUE) != 0) - print(", branch-true"); - if ((e.flags & CharacterRangeTable_attribute.CRT_BRANCH_FALSE) != 0) - print(", branch-false"); - println(); - } - indent(-1); - return null; - } - - public Void visitCode(Code_attribute attr, Void ignore) { - codeWriter.write(attr, constant_pool); - return null; - } - - public Void visitCompilationID(CompilationID_attribute attr, Void ignore) { - constantWriter.write(attr.compilationID_index); - return null; - } - - public Void visitConstantValue(ConstantValue_attribute attr, Void ignore) { - print("ConstantValue: "); - constantWriter.write(attr.constantvalue_index); - println(); - return null; - } - - public Void visitDeprecated(Deprecated_attribute attr, Void ignore) { - println("Deprecated: true"); - return null; - } - - public Void visitEnclosingMethod(EnclosingMethod_attribute attr, Void ignore) { - print("EnclosingMethod: #" + attr.class_index + ".#" + attr.method_index); - tab(); - print("// " + getJavaClassName(attr)); - if (attr.method_index != 0) - print("." + getMethodName(attr)); - println(); - return null; - } - - private String getJavaClassName(EnclosingMethod_attribute a) { - try { - return getJavaName(a.getClassName(constant_pool)); - } catch (ConstantPoolException e) { - return report(e); - } - } - - private String getMethodName(EnclosingMethod_attribute a) { - try { - return a.getMethodName(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public Void visitExceptions(Exceptions_attribute attr, Void ignore) { - println("Exceptions:"); - indent(+1); - print("throws "); - for (int i = 0; i < attr.number_of_exceptions; i++) { - if (i > 0) - print(", "); - print(getJavaException(attr, i)); - } - println(); - indent(-1); - return null; - } - - private String getJavaException(Exceptions_attribute attr, int index) { - try { - return getJavaName(attr.getException(index, constant_pool)); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public Void visitInnerClasses(InnerClasses_attribute attr, Void ignore) { - boolean first = true; - for (int i = 0 ; i < attr.classes.length; i++) { - InnerClasses_attribute.Info info = attr.classes[i]; - //access - AccessFlags access_flags = info.inner_class_access_flags; - if (options.checkAccess(access_flags)) { - if (first) { - writeInnerClassHeader(); - first = false; - } - for (String name: access_flags.getInnerClassModifiers()) - print(name + " "); - if (info.inner_name_index != 0) { - print("#" + info.inner_name_index + "= "); - } - print("#" + info.inner_class_info_index); - if (info.outer_class_info_index != 0) { - print(" of #" + info.outer_class_info_index); - } - print(";"); - tab(); - print("// "); - if (info.inner_name_index != 0) { - print(getInnerName(constant_pool, info) + "="); - } - constantWriter.write(info.inner_class_info_index); - if (info.outer_class_info_index != 0) { - print(" of "); - constantWriter.write(info.outer_class_info_index); - } - println(); - } - } - if (!first) - indent(-1); - return null; - } - - String getInnerName(ConstantPool constant_pool, InnerClasses_attribute.Info info) { - try { - return info.getInnerName(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - private void writeInnerClassHeader() { - println("InnerClasses:"); - indent(+1); - } - - public Void visitLineNumberTable(LineNumberTable_attribute attr, Void ignore) { - println("LineNumberTable:"); - indent(+1); - for (LineNumberTable_attribute.Entry entry: attr.line_number_table) { - println("line " + entry.line_number + ": " + entry.start_pc); - } - indent(-1); - return null; - } - - public Void visitLocalVariableTable(LocalVariableTable_attribute attr, Void ignore) { - println("LocalVariableTable:"); - indent(+1); - println("Start Length Slot Name Signature"); - for (LocalVariableTable_attribute.Entry entry : attr.local_variable_table) { - println(String.format("%5d %7d %5d %5s %s", - entry.start_pc, entry.length, entry.index, - constantWriter.stringValue(entry.name_index), - constantWriter.stringValue(entry.descriptor_index))); - } - indent(-1); - return null; - } - - public Void visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, Void ignore) { - println("LocalVariableTypeTable:"); - indent(+1); - println("Start Length Slot Name Signature"); - for (LocalVariableTypeTable_attribute.Entry entry : attr.local_variable_table) { - println(String.format("%5d %7d %5d %5s %s", - entry.start_pc, entry.length, entry.index, - constantWriter.stringValue(entry.name_index), - constantWriter.stringValue(entry.signature_index))); - } - indent(-1); - return null; - } - - private static final String format = "%-31s%s"; - - public Void visitMethodParameters(MethodParameters_attribute attr, - Void ignore) { - - final String header = String.format(format, "Name", "Flags"); - println("MethodParameters:"); - indent(+1); - println(header); - for (MethodParameters_attribute.Entry entry : - attr.method_parameter_table) { - String namestr = - entry.name_index != 0 ? - constantWriter.stringValue(entry.name_index) : "<no name>"; - String flagstr = - (0 != (entry.flags & ACC_FINAL) ? "final " : "") + - (0 != (entry.flags & ACC_MANDATED) ? "mandated " : "") + - (0 != (entry.flags & ACC_SYNTHETIC) ? "synthetic" : ""); - println(String.format(format, namestr, flagstr)); - } - indent(-1); - return null; - } - - public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, Void ignore) { - println("RuntimeVisibleAnnotations:"); - indent(+1); - for (int i = 0; i < attr.annotations.length; i++) { - print(i + ": "); - annotationWriter.write(attr.annotations[i]); - println(); - } - indent(-1); - return null; - } - - public Void visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, Void ignore) { - println("RuntimeInvisibleAnnotations:"); - indent(+1); - for (int i = 0; i < attr.annotations.length; i++) { - print(i + ": "); - annotationWriter.write(attr.annotations[i]); - println(); - } - indent(-1); - return null; - } - - public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, Void ignore) { - println("RuntimeVisibleTypeAnnotations:"); - indent(+1); - for (int i = 0; i < attr.annotations.length; i++) { - print(i + ": "); - annotationWriter.write(attr.annotations[i]); - println(); - } - indent(-1); - return null; - } - - public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, Void ignore) { - println("RuntimeInvisibleTypeAnnotations:"); - indent(+1); - for (int i = 0; i < attr.annotations.length; i++) { - print(i + ": "); - annotationWriter.write(attr.annotations[i]); - println(); - } - indent(-1); - return null; - } - - public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, Void ignore) { - println("RuntimeVisibleParameterAnnotations:"); - indent(+1); - for (int param = 0; param < attr.parameter_annotations.length; param++) { - println("parameter " + param + ": "); - indent(+1); - for (int i = 0; i < attr.parameter_annotations[param].length; i++) { - print(i + ": "); - annotationWriter.write(attr.parameter_annotations[param][i]); - println(); - } - indent(-1); - } - indent(-1); - return null; - } - - public Void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, Void ignore) { - println("RuntimeInvisibleParameterAnnotations:"); - indent(+1); - for (int param = 0; param < attr.parameter_annotations.length; param++) { - println(param + ": "); - indent(+1); - for (int i = 0; i < attr.parameter_annotations[param].length; i++) { - print(i + ": "); - annotationWriter.write(attr.parameter_annotations[param][i]); - println(); - } - indent(-1); - } - indent(-1); - return null; - } - - public Void visitSignature(Signature_attribute attr, Void ignore) { - print("Signature: #" + attr.signature_index); - tab(); - println("// " + getSignature(attr)); - return null; - } - - String getSignature(Signature_attribute info) { - try { - return info.getSignature(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public Void visitSourceDebugExtension(SourceDebugExtension_attribute attr, Void ignore) { - println("SourceDebugExtension:"); - indent(+1); - for (String s: attr.getValue().split("[\r\n]+")) { - println(s); - } - indent(-1); - return null; - } - - public Void visitSourceFile(SourceFile_attribute attr, Void ignore) { - println("SourceFile: \"" + getSourceFile(attr) + "\""); - return null; - } - - private String getSourceFile(SourceFile_attribute attr) { - try { - return attr.getSourceFile(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public Void visitSourceID(SourceID_attribute attr, Void ignore) { - constantWriter.write(attr.sourceID_index); - return null; - } - - public Void visitStackMap(StackMap_attribute attr, Void ignore) { - println("StackMap: number_of_entries = " + attr.number_of_entries); - indent(+1); - StackMapTableWriter w = new StackMapTableWriter(); - for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { - w.write(entry); - } - indent(-1); - return null; - } - - public Void visitStackMapTable(StackMapTable_attribute attr, Void ignore) { - println("StackMapTable: number_of_entries = " + attr.number_of_entries); - indent(+1); - StackMapTableWriter w = new StackMapTableWriter(); - for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { - w.write(entry); - } - indent(-1); - return null; - } - - class StackMapTableWriter // also handles CLDC StackMap attributes - implements StackMapTable_attribute.stack_map_frame.Visitor<Void,Void> { - public void write(StackMapTable_attribute.stack_map_frame frame) { - frame.accept(this, null); - } - - public Void visit_same_frame(StackMapTable_attribute.same_frame frame, Void p) { - printHeader(frame, "/* same */"); - return null; - } - - public Void visit_same_locals_1_stack_item_frame(StackMapTable_attribute.same_locals_1_stack_item_frame frame, Void p) { - printHeader(frame, "/* same_locals_1_stack_item */"); - indent(+1); - printMap("stack", frame.stack); - indent(-1); - return null; - } - - public Void visit_same_locals_1_stack_item_frame_extended(StackMapTable_attribute.same_locals_1_stack_item_frame_extended frame, Void p) { - printHeader(frame, "/* same_locals_1_stack_item_frame_extended */"); - indent(+1); - println("offset_delta = " + frame.offset_delta); - printMap("stack", frame.stack); - indent(-1); - return null; - } - - public Void visit_chop_frame(StackMapTable_attribute.chop_frame frame, Void p) { - printHeader(frame, "/* chop */"); - indent(+1); - println("offset_delta = " + frame.offset_delta); - indent(-1); - return null; - } - - public Void visit_same_frame_extended(StackMapTable_attribute.same_frame_extended frame, Void p) { - printHeader(frame, "/* same_frame_extended */"); - indent(+1); - println("offset_delta = " + frame.offset_delta); - indent(-1); - return null; - } - - public Void visit_append_frame(StackMapTable_attribute.append_frame frame, Void p) { - printHeader(frame, "/* append */"); - indent(+1); - println("offset_delta = " + frame.offset_delta); - printMap("locals", frame.locals); - indent(-1); - return null; - } - - public Void visit_full_frame(StackMapTable_attribute.full_frame frame, Void p) { - if (frame instanceof StackMap_attribute.stack_map_frame) { - printHeader(frame, "offset = " + frame.offset_delta); - indent(+1); - } else { - printHeader(frame, "/* full_frame */"); - indent(+1); - println("offset_delta = " + frame.offset_delta); - } - printMap("locals", frame.locals); - printMap("stack", frame.stack); - indent(-1); - return null; - } - - void printHeader(StackMapTable_attribute.stack_map_frame frame, String extra) { - print("frame_type = " + frame.frame_type + " "); - println(extra); - } - - void printMap(String name, StackMapTable_attribute.verification_type_info[] map) { - print(name + " = ["); - for (int i = 0; i < map.length; i++) { - StackMapTable_attribute.verification_type_info info = map[i]; - int tag = info.tag; - switch (tag) { - case StackMapTable_attribute.verification_type_info.ITEM_Object: - print(" "); - constantWriter.write(((StackMapTable_attribute.Object_variable_info) info).cpool_index); - break; - case StackMapTable_attribute.verification_type_info.ITEM_Uninitialized: - print(" " + mapTypeName(tag)); - print(" " + ((StackMapTable_attribute.Uninitialized_variable_info) info).offset); - break; - default: - print(" " + mapTypeName(tag)); - } - print(i == (map.length - 1) ? " " : ","); - } - println("]"); - } - - String mapTypeName(int tag) { - switch (tag) { - case StackMapTable_attribute.verification_type_info.ITEM_Top: - return "top"; - - case StackMapTable_attribute.verification_type_info.ITEM_Integer: - return "int"; - - case StackMapTable_attribute.verification_type_info.ITEM_Float: - return "float"; - - case StackMapTable_attribute.verification_type_info.ITEM_Long: - return "long"; - - case StackMapTable_attribute.verification_type_info.ITEM_Double: - return "double"; - - case StackMapTable_attribute.verification_type_info.ITEM_Null: - return "null"; - - case StackMapTable_attribute.verification_type_info.ITEM_UninitializedThis: - return "this"; - - case StackMapTable_attribute.verification_type_info.ITEM_Object: - return "CP"; - - case StackMapTable_attribute.verification_type_info.ITEM_Uninitialized: - return "uninitialized"; - - default: - report("unrecognized verification_type_info tag: " + tag); - return "[tag:" + tag + "]"; - } - } - } - - public Void visitSynthetic(Synthetic_attribute attr, Void ignore) { - println("Synthetic: true"); - return null; - } - - static String getJavaName(String name) { - return name.replace('/', '.'); - } - - String toHex(byte b, int w) { - return toHex(b & 0xff, w); - } - - static String toHex(int i) { - return StringUtils.toUpperCase(Integer.toString(i, 16)); - } - - static String toHex(int i, int w) { - String s = StringUtils.toUpperCase(Integer.toHexString(i)); - while (s.length() < w) - s = "0" + s; - return StringUtils.toUpperCase(s); - } - - private AnnotationWriter annotationWriter; - private CodeWriter codeWriter; - private ConstantWriter constantWriter; - private Options options; - - private ConstantPool constant_pool; - private Object owner; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/BasicWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,205 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.io.PrintWriter; - -import com.sun.tools.classfile.AttributeException; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.DescriptorException; - -/* - * A writer similar to a PrintWriter but which does not hide exceptions. - * The standard print calls are line-buffered; report calls write messages directly. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class BasicWriter { - protected BasicWriter(Context context) { - lineWriter = LineWriter.instance(context); - out = context.get(PrintWriter.class); - messages = context.get(Messages.class); - if (messages == null) - throw new AssertionError(); - } - - protected void print(String s) { - lineWriter.print(s); - } - - protected void print(Object o) { - lineWriter.print(o == null ? null : o.toString()); - } - - protected void println() { - lineWriter.println(); - } - - protected void println(String s) { - lineWriter.print(s); - lineWriter.println(); - } - - protected void println(Object o) { - lineWriter.print(o == null ? null : o.toString()); - lineWriter.println(); - } - - protected void indent(int delta) { - lineWriter.indent(delta); - } - - protected void tab() { - lineWriter.tab(); - } - - protected void setPendingNewline(boolean b) { - lineWriter.pendingNewline = b; - } - - protected String report(AttributeException e) { - out.println("Error: " + e.getMessage()); // i18n? - return "???"; - } - - protected String report(ConstantPoolException e) { - out.println("Error: " + e.getMessage()); // i18n? - return "???"; - } - - protected String report(DescriptorException e) { - out.println("Error: " + e.getMessage()); // i18n? - return "???"; - } - - protected String report(String msg) { - out.println("Error: " + msg); // i18n? - return "???"; - } - - protected String space(int w) { - if (w < spaces.length && spaces[w] != null) - return spaces[w]; - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < w; i++) - sb.append(" "); - - String s = sb.toString(); - if (w < spaces.length) - spaces[w] = s; - - return s; - } - - private String[] spaces = new String[80]; - - private LineWriter lineWriter; - private PrintWriter out; - protected Messages messages; - - private static class LineWriter { - static LineWriter instance(Context context) { - LineWriter instance = context.get(LineWriter.class); - if (instance == null) - instance = new LineWriter(context); - return instance; - } - - protected LineWriter(Context context) { - context.put(LineWriter.class, this); - Options options = Options.instance(context); - indentWidth = options.indentWidth; - tabColumn = options.tabColumn; - out = context.get(PrintWriter.class); - buffer = new StringBuilder(); - } - - protected void print(String s) { - if (pendingNewline) { - println(); - pendingNewline = false; - } - if (s == null) - s = "null"; - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - switch (c) { - case ' ': - pendingSpaces++; - break; - - case '\n': - println(); - break; - - default: - if (buffer.length() == 0) - indent(); - if (pendingSpaces > 0) { - for (int sp = 0; sp < pendingSpaces; sp++) - buffer.append(' '); - pendingSpaces = 0; - } - buffer.append(c); - } - } - - } - - protected void println() { - // ignore/discard pending spaces - pendingSpaces = 0; - out.println(buffer); - buffer.setLength(0); - } - - protected void indent(int delta) { - indentCount += delta; - } - - protected void tab() { - int col = indentCount * indentWidth + tabColumn; - pendingSpaces += (col <= buffer.length() ? 1 : col - buffer.length()); - } - - private void indent() { - pendingSpaces += (indentCount * indentWidth); - } - - private final PrintWriter out; - private final StringBuilder buffer; - private int indentCount; - private final int indentWidth; - private final int tabColumn; - private boolean pendingNewline; - private int pendingSpaces; - } -} -
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/ClassWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,756 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.net.URI; -import java.text.DateFormat; -import java.util.Collection; -import java.util.Date; -import java.util.List; - -import com.sun.tools.classfile.AccessFlags; -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Attributes; -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.ConstantValue_attribute; -import com.sun.tools.classfile.Descriptor; -import com.sun.tools.classfile.DescriptorException; -import com.sun.tools.classfile.Exceptions_attribute; -import com.sun.tools.classfile.Field; -import com.sun.tools.classfile.Method; -import com.sun.tools.classfile.Signature; -import com.sun.tools.classfile.Signature_attribute; -import com.sun.tools.classfile.SourceFile_attribute; -import com.sun.tools.classfile.Type; -import com.sun.tools.classfile.Type.ArrayType; -import com.sun.tools.classfile.Type.ClassSigType; -import com.sun.tools.classfile.Type.ClassType; -import com.sun.tools.classfile.Type.MethodType; -import com.sun.tools.classfile.Type.SimpleType; -import com.sun.tools.classfile.Type.TypeParamType; -import com.sun.tools.classfile.Type.WildcardType; - -import static com.sun.tools.classfile.AccessFlags.*; - -/* - * The main javap class to write the contents of a class file as text. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ClassWriter extends BasicWriter { - static ClassWriter instance(Context context) { - ClassWriter instance = context.get(ClassWriter.class); - if (instance == null) - instance = new ClassWriter(context); - return instance; - } - - protected ClassWriter(Context context) { - super(context); - context.put(ClassWriter.class, this); - options = Options.instance(context); - attrWriter = AttributeWriter.instance(context); - codeWriter = CodeWriter.instance(context); - constantWriter = ConstantWriter.instance(context); - } - - void setDigest(String name, byte[] digest) { - this.digestName = name; - this.digest = digest; - } - - void setFile(URI uri) { - this.uri = uri; - } - - void setFileSize(int size) { - this.size = size; - } - - void setLastModified(long lastModified) { - this.lastModified = lastModified; - } - - protected ClassFile getClassFile() { - return classFile; - } - - protected void setClassFile(ClassFile cf) { - classFile = cf; - constant_pool = classFile.constant_pool; - } - - protected Method getMethod() { - return method; - } - - protected void setMethod(Method m) { - method = m; - } - - public void write(ClassFile cf) { - setClassFile(cf); - - if (options.sysInfo || options.verbose) { - if (uri != null) { - if (uri.getScheme().equals("file")) - println("Classfile " + uri.getPath()); - else - println("Classfile " + uri); - } - indent(+1); - if (lastModified != -1) { - Date lm = new Date(lastModified); - DateFormat df = DateFormat.getDateInstance(); - if (size > 0) { - println("Last modified " + df.format(lm) + "; size " + size + " bytes"); - } else { - println("Last modified " + df.format(lm)); - } - } else if (size > 0) { - println("Size " + size + " bytes"); - } - if (digestName != null && digest != null) { - StringBuilder sb = new StringBuilder(); - for (byte b: digest) - sb.append(String.format("%02x", b)); - println(digestName + " checksum " + sb); - } - } - - Attribute sfa = cf.getAttribute(Attribute.SourceFile); - if (sfa instanceof SourceFile_attribute) { - println("Compiled from \"" + getSourceFile((SourceFile_attribute) sfa) + "\""); - } - - if (options.sysInfo || options.verbose) { - indent(-1); - } - - String name = getJavaName(classFile); - AccessFlags flags = cf.access_flags; - - writeModifiers(flags.getClassModifiers()); - - if (classFile.isClass()) - print("class "); - else if (classFile.isInterface()) - print("interface "); - - print(name); - - Signature_attribute sigAttr = getSignature(cf.attributes); - if (sigAttr == null) { - // use info from class file header - if (classFile.isClass() && classFile.super_class != 0 ) { - String sn = getJavaSuperclassName(cf); - if (!sn.equals("java.lang.Object")) { - print(" extends "); - print(sn); - } - } - for (int i = 0; i < classFile.interfaces.length; i++) { - print(i == 0 ? (classFile.isClass() ? " implements " : " extends ") : ","); - print(getJavaInterfaceName(classFile, i)); - } - } else { - try { - Type t = sigAttr.getParsedSignature().getType(constant_pool); - JavaTypePrinter p = new JavaTypePrinter(classFile.isInterface()); - // The signature parser cannot disambiguate between a - // FieldType and a ClassSignatureType that only contains a superclass type. - if (t instanceof Type.ClassSigType) { - print(p.print(t)); - } else if (options.verbose || !t.isObject()) { - print(" extends "); - print(p.print(t)); - } - } catch (ConstantPoolException e) { - print(report(e)); - } - } - - if (options.verbose) { - println(); - indent(+1); - println("minor version: " + cf.minor_version); - println("major version: " + cf.major_version); - writeList("flags: ", flags.getClassFlags(), "\n"); - indent(-1); - constantWriter.writeConstantPool(); - } else { - print(" "); - } - - println("{"); - indent(+1); - writeFields(); - writeMethods(); - indent(-1); - println("}"); - - if (options.verbose) { - attrWriter.write(cf, cf.attributes, constant_pool); - } - } - // where - class JavaTypePrinter implements Type.Visitor<StringBuilder,StringBuilder> { - boolean isInterface; - - JavaTypePrinter(boolean isInterface) { - this.isInterface = isInterface; - } - - String print(Type t) { - return t.accept(this, new StringBuilder()).toString(); - } - - String printTypeArgs(List<? extends TypeParamType> typeParamTypes) { - StringBuilder builder = new StringBuilder(); - appendIfNotEmpty(builder, "<", typeParamTypes, "> "); - return builder.toString(); - } - - public StringBuilder visitSimpleType(SimpleType type, StringBuilder sb) { - sb.append(getJavaName(type.name)); - return sb; - } - - public StringBuilder visitArrayType(ArrayType type, StringBuilder sb) { - append(sb, type.elemType); - sb.append("[]"); - return sb; - } - - public StringBuilder visitMethodType(MethodType type, StringBuilder sb) { - appendIfNotEmpty(sb, "<", type.typeParamTypes, "> "); - append(sb, type.returnType); - append(sb, " (", type.paramTypes, ")"); - appendIfNotEmpty(sb, " throws ", type.throwsTypes, ""); - return sb; - } - - public StringBuilder visitClassSigType(ClassSigType type, StringBuilder sb) { - appendIfNotEmpty(sb, "<", type.typeParamTypes, ">"); - if (isInterface) { - appendIfNotEmpty(sb, " extends ", type.superinterfaceTypes, ""); - } else { - if (type.superclassType != null - && (options.verbose || !type.superclassType.isObject())) { - sb.append(" extends "); - append(sb, type.superclassType); - } - appendIfNotEmpty(sb, " implements ", type.superinterfaceTypes, ""); - } - return sb; - } - - public StringBuilder visitClassType(ClassType type, StringBuilder sb) { - if (type.outerType != null) { - append(sb, type.outerType); - sb.append("."); - } - sb.append(getJavaName(type.name)); - appendIfNotEmpty(sb, "<", type.typeArgs, ">"); - return sb; - } - - public StringBuilder visitTypeParamType(TypeParamType type, StringBuilder sb) { - sb.append(type.name); - String sep = " extends "; - if (type.classBound != null - && (options.verbose || !type.classBound.isObject())) { - sb.append(sep); - append(sb, type.classBound); - sep = " & "; - } - if (type.interfaceBounds != null) { - for (Type bound: type.interfaceBounds) { - sb.append(sep); - append(sb, bound); - sep = " & "; - } - } - return sb; - } - - public StringBuilder visitWildcardType(WildcardType type, StringBuilder sb) { - switch (type.kind) { - case UNBOUNDED: - sb.append("?"); - break; - case EXTENDS: - sb.append("? extends "); - append(sb, type.boundType); - break; - case SUPER: - sb.append("? super "); - append(sb, type.boundType); - break; - default: - throw new AssertionError(); - } - return sb; - } - - private void append(StringBuilder sb, Type t) { - t.accept(this, sb); - } - - private void append(StringBuilder sb, String prefix, List<? extends Type> list, String suffix) { - sb.append(prefix); - String sep = ""; - for (Type t: list) { - sb.append(sep); - append(sb, t); - sep = ", "; - } - sb.append(suffix); - } - - private void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> list, String suffix) { - if (!isEmpty(list)) - append(sb, prefix, list, suffix); - } - - private boolean isEmpty(List<? extends Type> list) { - return (list == null || list.isEmpty()); - } - } - - protected void writeFields() { - for (Field f: classFile.fields) { - writeField(f); - } - } - - protected void writeField(Field f) { - if (!options.checkAccess(f.access_flags)) - return; - - AccessFlags flags = f.access_flags; - writeModifiers(flags.getFieldModifiers()); - Signature_attribute sigAttr = getSignature(f.attributes); - if (sigAttr == null) - print(getJavaFieldType(f.descriptor)); - else { - try { - Type t = sigAttr.getParsedSignature().getType(constant_pool); - print(getJavaName(t.toString())); - } catch (ConstantPoolException e) { - // report error? - // fall back on non-generic descriptor - print(getJavaFieldType(f.descriptor)); - } - } - print(" "); - print(getFieldName(f)); - if (options.showConstants) { - Attribute a = f.attributes.get(Attribute.ConstantValue); - if (a instanceof ConstantValue_attribute) { - print(" = "); - ConstantValue_attribute cv = (ConstantValue_attribute) a; - print(getConstantValue(f.descriptor, cv.constantvalue_index)); - } - } - print(";"); - println(); - - indent(+1); - - boolean showBlank = false; - - if (options.showDescriptors) - println("descriptor: " + getValue(f.descriptor)); - - if (options.verbose) - writeList("flags: ", flags.getFieldFlags(), "\n"); - - if (options.showAllAttrs) { - for (Attribute attr: f.attributes) - attrWriter.write(f, attr, constant_pool); - showBlank = true; - } - - indent(-1); - - if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables) - println(); - } - - protected void writeMethods() { - for (Method m: classFile.methods) - writeMethod(m); - setPendingNewline(false); - } - - protected void writeMethod(Method m) { - if (!options.checkAccess(m.access_flags)) - return; - - method = m; - - AccessFlags flags = m.access_flags; - - Descriptor d; - Type.MethodType methodType; - List<? extends Type> methodExceptions; - - Signature_attribute sigAttr = getSignature(m.attributes); - if (sigAttr == null) { - d = m.descriptor; - methodType = null; - methodExceptions = null; - } else { - Signature methodSig = sigAttr.getParsedSignature(); - d = methodSig; - try { - methodType = (Type.MethodType) methodSig.getType(constant_pool); - methodExceptions = methodType.throwsTypes; - if (methodExceptions != null && methodExceptions.isEmpty()) - methodExceptions = null; - } catch (ConstantPoolException e) { - // report error? - // fall back on standard descriptor - methodType = null; - methodExceptions = null; - } - } - - writeModifiers(flags.getMethodModifiers()); - if (methodType != null) { - print(new JavaTypePrinter(false).printTypeArgs(methodType.typeParamTypes)); - } - if (getName(m).equals("<init>")) { - print(getJavaName(classFile)); - print(getJavaParameterTypes(d, flags)); - } else if (getName(m).equals("<clinit>")) { - print("{}"); - } else { - print(getJavaReturnType(d)); - print(" "); - print(getName(m)); - print(getJavaParameterTypes(d, flags)); - } - - Attribute e_attr = m.attributes.get(Attribute.Exceptions); - if (e_attr != null) { // if there are generic exceptions, there must be erased exceptions - if (e_attr instanceof Exceptions_attribute) { - Exceptions_attribute exceptions = (Exceptions_attribute) e_attr; - print(" throws "); - if (methodExceptions != null) { // use generic list if available - writeList("", methodExceptions, ""); - } else { - for (int i = 0; i < exceptions.number_of_exceptions; i++) { - if (i > 0) - print(", "); - print(getJavaException(exceptions, i)); - } - } - } else { - report("Unexpected or invalid value for Exceptions attribute"); - } - } - - println(";"); - - indent(+1); - - if (options.showDescriptors) { - println("descriptor: " + getValue(m.descriptor)); - } - - if (options.verbose) { - writeList("flags: ", flags.getMethodFlags(), "\n"); - } - - Code_attribute code = null; - Attribute c_attr = m.attributes.get(Attribute.Code); - if (c_attr != null) { - if (c_attr instanceof Code_attribute) - code = (Code_attribute) c_attr; - else - report("Unexpected or invalid value for Code attribute"); - } - - if (options.showAllAttrs) { - Attribute[] attrs = m.attributes.attrs; - for (Attribute attr: attrs) - attrWriter.write(m, attr, constant_pool); - } else if (code != null) { - if (options.showDisassembled) { - println("Code:"); - codeWriter.writeInstrs(code); - codeWriter.writeExceptionTable(code); - } - - if (options.showLineAndLocalVariableTables) { - attrWriter.write(code, code.attributes.get(Attribute.LineNumberTable), constant_pool); - attrWriter.write(code, code.attributes.get(Attribute.LocalVariableTable), constant_pool); - } - } - - indent(-1); - - // set pendingNewline to write a newline before the next method (if any) - // if a separator is desired - setPendingNewline( - options.showDisassembled || - options.showAllAttrs || - options.showDescriptors || - options.showLineAndLocalVariableTables || - options.verbose); - } - - void writeModifiers(Collection<String> items) { - for (Object item: items) { - print(item); - print(" "); - } - } - - void writeList(String prefix, Collection<?> items, String suffix) { - print(prefix); - String sep = ""; - for (Object item: items) { - print(sep); - print(item); - sep = ", "; - } - print(suffix); - } - - void writeListIfNotEmpty(String prefix, List<?> items, String suffix) { - if (items != null && items.size() > 0) - writeList(prefix, items, suffix); - } - - Signature_attribute getSignature(Attributes attributes) { - return (Signature_attribute) attributes.get(Attribute.Signature); - } - - String adjustVarargs(AccessFlags flags, String params) { - if (flags.is(ACC_VARARGS)) { - int i = params.lastIndexOf("[]"); - if (i > 0) - return params.substring(0, i) + "..." + params.substring(i+2); - } - - return params; - } - - String getJavaName(ClassFile cf) { - try { - return getJavaName(cf.getName()); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getJavaSuperclassName(ClassFile cf) { - try { - return getJavaName(cf.getSuperclassName()); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getJavaInterfaceName(ClassFile cf, int index) { - try { - return getJavaName(cf.getInterfaceName(index)); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getJavaFieldType(Descriptor d) { - try { - return getJavaName(d.getFieldType(constant_pool)); - } catch (ConstantPoolException e) { - return report(e); - } catch (DescriptorException e) { - return report(e); - } - } - - String getJavaReturnType(Descriptor d) { - try { - return getJavaName(d.getReturnType(constant_pool)); - } catch (ConstantPoolException e) { - return report(e); - } catch (DescriptorException e) { - return report(e); - } - } - - String getJavaParameterTypes(Descriptor d, AccessFlags flags) { - try { - return getJavaName(adjustVarargs(flags, d.getParameterTypes(constant_pool))); - } catch (ConstantPoolException e) { - return report(e); - } catch (DescriptorException e) { - return report(e); - } - } - - String getJavaException(Exceptions_attribute attr, int index) { - try { - return getJavaName(attr.getException(index, constant_pool)); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getValue(Descriptor d) { - try { - return d.getValue(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getFieldName(Field f) { - try { - return f.getName(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getName(Method m) { - try { - return m.getName(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - static String getJavaName(String name) { - return name.replace('/', '.'); - } - - String getSourceFile(SourceFile_attribute attr) { - try { - return attr.getSourceFile(constant_pool); - } catch (ConstantPoolException e) { - return report(e); - } - } - - /** - * Get the value of an entry in the constant pool as a Java constant. - * Characters and booleans are represented by CONSTANT_Intgere entries. - * Character and string values are processed to escape characters outside - * the basic printable ASCII set. - * @param d the descriptor, giving the expected type of the constant - * @param index the index of the value in the constant pool - * @return a printable string containing the value of the constant. - */ - String getConstantValue(Descriptor d, int index) { - try { - ConstantPool.CPInfo cpInfo = constant_pool.get(index); - - switch (cpInfo.getTag()) { - case ConstantPool.CONSTANT_Integer: { - ConstantPool.CONSTANT_Integer_info info = - (ConstantPool.CONSTANT_Integer_info) cpInfo; - String t = d.getValue(constant_pool); - if (t.equals("C")) { // character - return getConstantCharValue((char) info.value); - } else if (t.equals("Z")) { // boolean - return String.valueOf(info.value == 1); - } else { // other: assume integer - return String.valueOf(info.value); - } - } - - case ConstantPool.CONSTANT_String: { - ConstantPool.CONSTANT_String_info info = - (ConstantPool.CONSTANT_String_info) cpInfo; - return getConstantStringValue(info.getString()); - } - - default: - return constantWriter.stringValue(cpInfo); - } - } catch (ConstantPoolException e) { - return "#" + index; - } - } - - private String getConstantCharValue(char c) { - StringBuilder sb = new StringBuilder(); - sb.append('\''); - sb.append(esc(c, '\'')); - sb.append('\''); - return sb.toString(); - } - - private String getConstantStringValue(String s) { - StringBuilder sb = new StringBuilder(); - sb.append("\""); - for (int i = 0; i < s.length(); i++) { - sb.append(esc(s.charAt(i), '"')); - } - sb.append("\""); - return sb.toString(); - } - - private String esc(char c, char quote) { - if (32 <= c && c <= 126 && c != quote) - return String.valueOf(c); - else switch (c) { - case '\b': return "\\b"; - case '\n': return "\\n"; - case '\t': return "\\t"; - case '\f': return "\\f"; - case '\r': return "\\r"; - case '\\': return "\\\\"; - case '\'': return "\\'"; - case '\"': return "\\\""; - default: return String.format("\\u%04x", (int) c); - } - } - - private Options options; - private AttributeWriter attrWriter; - private CodeWriter codeWriter; - private ConstantWriter constantWriter; - private ClassFile classFile; - private URI uri; - private long lastModified; - private String digestName; - private byte[] digest; - private int size; - private ConstantPool constant_pool; - private Method method; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/CodeWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,286 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.ArrayList; -import java.util.List; - -import com.sun.tools.classfile.AccessFlags; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.DescriptorException; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.Instruction.TypeKind; -import com.sun.tools.classfile.Method; - -/* - * Write the contents of a Code attribute. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class CodeWriter extends BasicWriter { - public static CodeWriter instance(Context context) { - CodeWriter instance = context.get(CodeWriter.class); - if (instance == null) - instance = new CodeWriter(context); - return instance; - } - - protected CodeWriter(Context context) { - super(context); - context.put(CodeWriter.class, this); - attrWriter = AttributeWriter.instance(context); - classWriter = ClassWriter.instance(context); - constantWriter = ConstantWriter.instance(context); - sourceWriter = SourceWriter.instance(context); - tryBlockWriter = TryBlockWriter.instance(context); - stackMapWriter = StackMapWriter.instance(context); - localVariableTableWriter = LocalVariableTableWriter.instance(context); - localVariableTypeTableWriter = LocalVariableTypeTableWriter.instance(context); - typeAnnotationWriter = TypeAnnotationWriter.instance(context); - options = Options.instance(context); - } - - void write(Code_attribute attr, ConstantPool constant_pool) { - println("Code:"); - indent(+1); - writeVerboseHeader(attr, constant_pool); - writeInstrs(attr); - writeExceptionTable(attr); - attrWriter.write(attr, attr.attributes, constant_pool); - indent(-1); - } - - public void writeVerboseHeader(Code_attribute attr, ConstantPool constant_pool) { - Method method = classWriter.getMethod(); - String argCount; - try { - int n = method.descriptor.getParameterCount(constant_pool); - if (!method.access_flags.is(AccessFlags.ACC_STATIC)) - ++n; // for 'this' - argCount = Integer.toString(n); - } catch (ConstantPoolException e) { - argCount = report(e); - } catch (DescriptorException e) { - argCount = report(e); - } - - println("stack=" + attr.max_stack + - ", locals=" + attr.max_locals + - ", args_size=" + argCount); - - } - - public void writeInstrs(Code_attribute attr) { - List<InstructionDetailWriter> detailWriters = getDetailWriters(attr); - - for (Instruction instr: attr.getInstructions()) { - try { - for (InstructionDetailWriter w: detailWriters) - w.writeDetails(instr); - writeInstr(instr); - } catch (ArrayIndexOutOfBoundsException e) { - println(report("error at or after byte " + instr.getPC())); - break; - } - } - - for (InstructionDetailWriter w: detailWriters) - w.flush(); - } - - public void writeInstr(Instruction instr) { - print(String.format("%4d: %-13s ", instr.getPC(), instr.getMnemonic())); - // compute the number of indentations for the body of multi-line instructions - // This is 6 (the width of "%4d: "), divided by the width of each indentation level, - // and rounded up to the next integer. - int indentWidth = options.indentWidth; - int indent = (6 + indentWidth - 1) / indentWidth; - instr.accept(instructionPrinter, indent); - println(); - } - // where - Instruction.KindVisitor<Void,Integer> instructionPrinter = - new Instruction.KindVisitor<Void,Integer>() { - - public Void visitNoOperands(Instruction instr, Integer indent) { - return null; - } - - public Void visitArrayType(Instruction instr, TypeKind kind, Integer indent) { - print(" " + kind.name); - return null; - } - - public Void visitBranch(Instruction instr, int offset, Integer indent) { - print((instr.getPC() + offset)); - return null; - } - - public Void visitConstantPoolRef(Instruction instr, int index, Integer indent) { - print("#" + index); - tab(); - print("// "); - printConstant(index); - return null; - } - - public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Integer indent) { - print("#" + index + ", " + value); - tab(); - print("// "); - printConstant(index); - return null; - } - - public Void visitLocal(Instruction instr, int index, Integer indent) { - print(index); - return null; - } - - public Void visitLocalAndValue(Instruction instr, int index, int value, Integer indent) { - print(index + ", " + value); - return null; - } - - public Void visitLookupSwitch(Instruction instr, - int default_, int npairs, int[] matches, int[] offsets, Integer indent) { - int pc = instr.getPC(); - print("{ // " + npairs); - indent(indent); - for (int i = 0; i < npairs; i++) { - print(String.format("%n%12d: %d", matches[i], (pc + offsets[i]))); - } - print("\n default: " + (pc + default_) + "\n}"); - indent(-indent); - return null; - } - - public Void visitTableSwitch(Instruction instr, - int default_, int low, int high, int[] offsets, Integer indent) { - int pc = instr.getPC(); - print("{ // " + low + " to " + high); - indent(indent); - for (int i = 0; i < offsets.length; i++) { - print(String.format("%n%12d: %d", (low + i), (pc + offsets[i]))); - } - print("\n default: " + (pc + default_) + "\n}"); - indent(-indent); - return null; - } - - public Void visitValue(Instruction instr, int value, Integer indent) { - print(value); - return null; - } - - public Void visitUnknown(Instruction instr, Integer indent) { - return null; - } - }; - - - public void writeExceptionTable(Code_attribute attr) { - if (attr.exception_table_length > 0) { - println("Exception table:"); - indent(+1); - println(" from to target type"); - for (int i = 0; i < attr.exception_table.length; i++) { - Code_attribute.Exception_data handler = attr.exception_table[i]; - print(String.format(" %5d %5d %5d", - handler.start_pc, handler.end_pc, handler.handler_pc)); - print(" "); - int catch_type = handler.catch_type; - if (catch_type == 0) { - println("any"); - } else { - print("Class "); - println(constantWriter.stringValue(catch_type)); - } - } - indent(-1); - } - - } - - private void printConstant(int index) { - constantWriter.write(index); - } - - private List<InstructionDetailWriter> getDetailWriters(Code_attribute attr) { - List<InstructionDetailWriter> detailWriters = new ArrayList<>(); - if (options.details.contains(InstructionDetailWriter.Kind.SOURCE)) { - sourceWriter.reset(classWriter.getClassFile(), attr); - if (sourceWriter.hasSource()) - detailWriters.add(sourceWriter); - else - println("(Source code not available)"); - } - - if (options.details.contains(InstructionDetailWriter.Kind.LOCAL_VARS)) { - localVariableTableWriter.reset(attr); - detailWriters.add(localVariableTableWriter); - } - - if (options.details.contains(InstructionDetailWriter.Kind.LOCAL_VAR_TYPES)) { - localVariableTypeTableWriter.reset(attr); - detailWriters.add(localVariableTypeTableWriter); - } - - if (options.details.contains(InstructionDetailWriter.Kind.STACKMAPS)) { - stackMapWriter.reset(attr); - stackMapWriter.writeInitialDetails(); - detailWriters.add(stackMapWriter); - } - - if (options.details.contains(InstructionDetailWriter.Kind.TRY_BLOCKS)) { - tryBlockWriter.reset(attr); - detailWriters.add(tryBlockWriter); - } - - if (options.details.contains(InstructionDetailWriter.Kind.TYPE_ANNOS)) { - typeAnnotationWriter.reset(attr); - detailWriters.add(typeAnnotationWriter); - } - - return detailWriters; - } - - private AttributeWriter attrWriter; - private ClassWriter classWriter; - private ConstantWriter constantWriter; - private LocalVariableTableWriter localVariableTableWriter; - private LocalVariableTypeTableWriter localVariableTypeTableWriter; - private TypeAnnotationWriter typeAnnotationWriter; - private SourceWriter sourceWriter; - private StackMapWriter stackMapWriter; - private TryBlockWriter tryBlockWriter; - private Options options; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/ConstantWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,466 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; - -import static com.sun.tools.classfile.ConstantPool.*; - -/* - * Write a constant pool entry. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class ConstantWriter extends BasicWriter { - public static ConstantWriter instance(Context context) { - ConstantWriter instance = context.get(ConstantWriter.class); - if (instance == null) - instance = new ConstantWriter(context); - return instance; - } - - protected ConstantWriter(Context context) { - super(context); - context.put(ConstantWriter.class, this); - classWriter = ClassWriter.instance(context); - options = Options.instance(context); - } - - protected void writeConstantPool() { - ConstantPool constant_pool = classWriter.getClassFile().constant_pool; - writeConstantPool(constant_pool); - } - - protected void writeConstantPool(ConstantPool constant_pool) { - ConstantPool.Visitor<Integer, Void> v = new ConstantPool.Visitor<Integer,Void>() { - public Integer visitClass(CONSTANT_Class_info info, Void p) { - print("#" + info.name_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitDouble(CONSTANT_Double_info info, Void p) { - println(stringValue(info)); - return 2; - } - - public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) { - print("#" + info.class_index + ".#" + info.name_and_type_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitFloat(CONSTANT_Float_info info, Void p) { - println(stringValue(info)); - return 1; - } - - public Integer visitInteger(CONSTANT_Integer_info info, Void p) { - println(stringValue(info)); - return 1; - } - - public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { - print("#" + info.class_index + ".#" + info.name_and_type_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { - print("#" + info.bootstrap_method_attr_index + ":#" + info.name_and_type_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitLong(CONSTANT_Long_info info, Void p) { - println(stringValue(info)); - return 2; - } - - public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) { - print("#" + info.name_index + ":#" + info.type_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) { - print("#" + info.class_index + ".#" + info.name_and_type_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { - print("#" + info.reference_kind.tag + ":#" + info.reference_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitMethodType(CONSTANT_MethodType_info info, Void p) { - print("#" + info.descriptor_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitString(CONSTANT_String_info info, Void p) { - print("#" + info.string_index); - tab(); - println("// " + stringValue(info)); - return 1; - } - - public Integer visitUtf8(CONSTANT_Utf8_info info, Void p) { - println(stringValue(info)); - return 1; - } - - }; - println("Constant pool:"); - indent(+1); - int width = String.valueOf(constant_pool.size()).length() + 1; - int cpx = 1; - while (cpx < constant_pool.size()) { - print(String.format("%" + width + "s", ("#" + cpx))); - try { - CPInfo cpInfo = constant_pool.get(cpx); - print(String.format(" = %-18s ", cpTagName(cpInfo))); - cpx += cpInfo.accept(v, null); - } catch (ConstantPool.InvalidIndex ex) { - // should not happen - } - } - indent(-1); - } - - protected void write(int cpx) { - ClassFile classFile = classWriter.getClassFile(); - if (cpx == 0) { - print("#0"); - return; - } - - CPInfo cpInfo; - try { - cpInfo = classFile.constant_pool.get(cpx); - } catch (ConstantPoolException e) { - print("#" + cpx); - return; - } - - int tag = cpInfo.getTag(); - switch (tag) { - case CONSTANT_Methodref: - case CONSTANT_InterfaceMethodref: - case CONSTANT_Fieldref: - // simplify references within this class - CPRefInfo ref = (CPRefInfo) cpInfo; - try { - if (ref.class_index == classFile.this_class) - cpInfo = classFile.constant_pool.get(ref.name_and_type_index); - } catch (ConstantPool.InvalidIndex e) { - // ignore, for now - } - } - print(tagName(tag) + " " + stringValue(cpInfo)); - } - - String cpTagName(CPInfo cpInfo) { - String n = cpInfo.getClass().getSimpleName(); - return n.replace("CONSTANT_", "").replace("_info", ""); - } - - String tagName(int tag) { - switch (tag) { - case CONSTANT_Utf8: - return "Utf8"; - case CONSTANT_Integer: - return "int"; - case CONSTANT_Float: - return "float"; - case CONSTANT_Long: - return "long"; - case CONSTANT_Double: - return "double"; - case CONSTANT_Class: - return "class"; - case CONSTANT_String: - return "String"; - case CONSTANT_Fieldref: - return "Field"; - case CONSTANT_MethodHandle: - return "MethodHandle"; - case CONSTANT_MethodType: - return "MethodType"; - case CONSTANT_Methodref: - return "Method"; - case CONSTANT_InterfaceMethodref: - return "InterfaceMethod"; - case CONSTANT_InvokeDynamic: - return "InvokeDynamic"; - case CONSTANT_NameAndType: - return "NameAndType"; - default: - return "(unknown tag " + tag + ")"; - } - } - - String stringValue(int constant_pool_index) { - ClassFile classFile = classWriter.getClassFile(); - try { - return stringValue(classFile.constant_pool.get(constant_pool_index)); - } catch (ConstantPool.InvalidIndex e) { - return report(e); - } - } - - String stringValue(CPInfo cpInfo) { - return stringValueVisitor.visit(cpInfo); - } - - StringValueVisitor stringValueVisitor = new StringValueVisitor(); - - private class StringValueVisitor implements ConstantPool.Visitor<String, Void> { - public String visit(CPInfo info) { - return info.accept(this, null); - } - - public String visitClass(CONSTANT_Class_info info, Void p) { - return getCheckedName(info); - } - - String getCheckedName(CONSTANT_Class_info info) { - try { - return checkName(info.getName()); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitDouble(CONSTANT_Double_info info, Void p) { - return info.value + "d"; - } - - public String visitFieldref(CONSTANT_Fieldref_info info, Void p) { - return visitRef(info, p); - } - - public String visitFloat(CONSTANT_Float_info info, Void p) { - return info.value + "f"; - } - - public String visitInteger(CONSTANT_Integer_info info, Void p) { - return String.valueOf(info.value); - } - - public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { - return visitRef(info, p); - } - - public String visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { - try { - String callee = stringValue(info.getNameAndTypeInfo()); - return "#" + info.bootstrap_method_attr_index + ":" + callee; - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitLong(CONSTANT_Long_info info, Void p) { - return info.value + "l"; - } - - public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) { - return getCheckedName(info) + ":" + getType(info); - } - - String getCheckedName(CONSTANT_NameAndType_info info) { - try { - return checkName(info.getName()); - } catch (ConstantPoolException e) { - return report(e); - } - } - - String getType(CONSTANT_NameAndType_info info) { - try { - return info.getType(); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { - try { - return info.reference_kind.name + " " + stringValue(info.getCPRefInfo()); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitMethodType(CONSTANT_MethodType_info info, Void p) { - try { - return info.getType(); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitMethodref(CONSTANT_Methodref_info info, Void p) { - return visitRef(info, p); - } - - public String visitString(CONSTANT_String_info info, Void p) { - try { - ClassFile classFile = classWriter.getClassFile(); - int string_index = info.string_index; - return stringValue(classFile.constant_pool.getUTF8Info(string_index)); - } catch (ConstantPoolException e) { - return report(e); - } - } - - public String visitUtf8(CONSTANT_Utf8_info info, Void p) { - String s = info.value; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - switch (c) { - case '\t': - sb.append('\\').append('t'); - break; - case '\n': - sb.append('\\').append('n'); - break; - case '\r': - sb.append('\\').append('r'); - break; - case '\b': - sb.append('\\').append('b'); - break; - case '\f': - sb.append('\\').append('f'); - break; - case '\"': - sb.append('\\').append('\"'); - break; - case '\'': - sb.append('\\').append('\''); - break; - case '\\': - sb.append('\\').append('\\'); - break; - default: - sb.append(c); - } - } - return sb.toString(); - } - - String visitRef(CPRefInfo info, Void p) { - String cn = getCheckedClassName(info); - String nat; - try { - nat = stringValue(info.getNameAndTypeInfo()); - } catch (ConstantPoolException e) { - nat = report(e); - } - return cn + "." + nat; - } - - String getCheckedClassName(CPRefInfo info) { - try { - return checkName(info.getClassName()); - } catch (ConstantPoolException e) { - return report(e); - } - } - } - - /* If name is a valid binary name, return it; otherwise quote it. */ - private static String checkName(String name) { - if (name == null) - return "null"; - - int len = name.length(); - if (len == 0) - return "\"\""; - - int cc = '/'; - int cp; - for (int k = 0; k < len; k += Character.charCount(cp)) { - cp = name.codePointAt(k); - if ((cc == '/' && !Character.isJavaIdentifierStart(cp)) - || (cp != '/' && !Character.isJavaIdentifierPart(cp))) { - return "\"" + addEscapes(name) + "\""; - } - cc = cp; - } - - return name; - } - - /* If name requires escapes, put them in, so it can be a string body. */ - private static String addEscapes(String name) { - String esc = "\\\"\n\t"; - String rep = "\\\"nt"; - StringBuilder buf = null; - int nextk = 0; - int len = name.length(); - for (int k = 0; k < len; k++) { - char cp = name.charAt(k); - int n = esc.indexOf(cp); - if (n >= 0) { - if (buf == null) - buf = new StringBuilder(len * 2); - if (nextk < k) - buf.append(name, nextk, k); - buf.append('\\'); - buf.append(rep.charAt(n)); - nextk = k+1; - } - } - if (buf == null) - return name; - if (nextk < len) - buf.append(name, nextk, len); - return buf.toString(); - } - - private ClassWriter classWriter; - private Options options; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/Context.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.HashMap; -import java.util.Map; - -/* - * Class from which to put/get shared resources. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Context { - - Map<Class<?>, Object> map; - - public Context() { - map = new HashMap<>(); - } - - @SuppressWarnings("unchecked") - public <T> T get(Class<T> key) { - return (T) map.get(key); - } - - @SuppressWarnings("unchecked") - public <T> T put(Class<T> key, T value) { - return (T) map.put(key, value); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/DisassemblerTool.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; //javax.tools; - -import java.io.Writer; -import java.nio.charset.Charset; -import java.util.Locale; -import java.util.concurrent.Callable; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; -import javax.tools.OptionChecker; -import javax.tools.StandardJavaFileManager; -import javax.tools.StandardLocation; -import javax.tools.Tool; - -/** - * This class is intended to be put in javax.tools. - * - * @see DiagnosticListener - * @see Diagnostic - * @see JavaFileManager - * @since 1.7 - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public interface DisassemblerTool extends Tool, OptionChecker { - - /** - * Creates a future for a disassembly task with the given - * components and arguments. The task might not have - * completed as described in the DissemblerTask interface. - * - * <p>If a file manager is provided, it must be able to handle all - * locations defined in {@link StandardLocation}. - * - * @param out a Writer for additional output from the compiler; - * use {@code System.err} if {@code null} - * @param fileManager a file manager; if {@code null} use the - * compiler's standard filemanager - * @param diagnosticListener a diagnostic listener; if {@code - * null} use the compiler's default method for reporting - * diagnostics - * @param options compiler options, {@code null} means no options - * @param classes class names (for annotation processing), {@code - * null} means no class names - * @return a task to perform the disassembly - * @throws RuntimeException if an unrecoverable error - * occurred in a user supplied component. The - * {@linkplain Throwable#getCause() cause} will be the error in - * user code. - * @throws IllegalArgumentException if any of the given - * compilation units are of other kind than - * {@linkplain JavaFileObject.Kind#SOURCE source} - */ - DisassemblerTask getTask(Writer out, - JavaFileManager fileManager, - DiagnosticListener<? super JavaFileObject> diagnosticListener, - Iterable<String> options, - Iterable<String> classes); - - /** - * Returns a new instance of the standard file manager implementation - * for this tool. The file manager will use the given diagnostic - * listener for producing any non-fatal diagnostics. Fatal errors - * will be signalled with the appropriate exceptions. - * - * <p>The standard file manager will be automatically reopened if - * it is accessed after calls to {@code flush} or {@code close}. - * The standard file manager must be usable with other tools. - * - * @param diagnosticListener a diagnostic listener for non-fatal - * diagnostics; if {@code null} use the compiler's default method - * for reporting diagnostics - * @param locale the locale to apply when formatting diagnostics; - * {@code null} means the {@linkplain Locale#getDefault() default locale}. - * @param charset the character set used for decoding bytes; if - * {@code null} use the platform default - * @return the standard file manager - */ - StandardJavaFileManager getStandardFileManager( - DiagnosticListener<? super JavaFileObject> diagnosticListener, - Locale locale, - Charset charset); - - /** - * Interface representing a future for a disassembly task. The - * task has not yet started. To start the task, call - * the {@linkplain #call call} method. - * - * <p>Before calling the call method, additional aspects of the - * task can be configured, for example, by calling the - * {@linkplain #setLocale setLocale} method. - */ - interface DisassemblerTask extends Callable<Boolean> { - - /** - * Set the locale to be applied when formatting diagnostics and - * other localized data. - * - * @param locale the locale to apply; {@code null} means apply no - * locale - * @throws IllegalStateException if the task has started - */ - void setLocale(Locale locale); - - /** - * Performs this compilation task. The compilation may only - * be performed once. Subsequent calls to this method throw - * IllegalStateException. - * - * @return true if and only all the files compiled without errors; - * false otherwise - * - * @throws RuntimeException if an unrecoverable error occurred - * in a user-supplied component. The - * {@linkplain Throwable#getCause() cause} will be the error - * in user code. - * @throws IllegalStateException if called more than once - */ - Boolean call(); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/InstructionDetailWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.Instruction; - - -/* - * Write additional details for an instruction. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public abstract class InstructionDetailWriter extends BasicWriter { - public enum Kind { - LOCAL_VARS("localVariables"), - LOCAL_VAR_TYPES("localVariableTypes"), - SOURCE("source"), - STACKMAPS("stackMaps"), - TRY_BLOCKS("tryBlocks"), - TYPE_ANNOS("typeAnnotations"); - - Kind(String option) { - this.option = option; - } - - final String option; - } - - InstructionDetailWriter(Context context) { - super(context); - } - - abstract void writeDetails(Instruction instr); - void flush() { } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/InternalError.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -/** - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class InternalError extends Error { - private static final long serialVersionUID = 8114054446416187030L; - InternalError(Throwable t, Object... args) { - super("Internal error", t); - this.args = args; - } - - InternalError(Object... args) { - super("Internal error"); - this.args = args; - } - - public final Object[] args; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/JavapFileManager.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.io.PrintWriter; -import java.nio.charset.Charset; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileObject; - -import com.sun.tools.javac.file.JavacFileManager; -import com.sun.tools.javac.util.Context; - -/** - * javap's implementation of JavaFileManager. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class JavapFileManager extends JavacFileManager { - private JavapFileManager(Context context, Charset charset) { - super(context, true, charset); - setSymbolFileEnabled(false); - } - - public static JavapFileManager create(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log) { - Context javac_context = new Context(); - - if (dl != null) - javac_context.put(DiagnosticListener.class, dl); - javac_context.put(com.sun.tools.javac.util.Log.outKey, log); - - return new JavapFileManager(javac_context, null); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/JavapTask.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1068 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.io.EOFException; -import java.io.FileNotFoundException; -import java.io.FilterInputStream; -import java.io.InputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.Reader; -import java.io.StringWriter; -import java.io.Writer; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.file.NoSuchFileException; -import java.security.DigestInputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.Objects; -import java.util.ResourceBundle; - -import javax.lang.model.element.Modifier; -import javax.lang.model.element.NestingKind; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; -import javax.tools.StandardLocation; - -import com.sun.tools.classfile.*; -import com.sun.tools.javac.util.DefinedBy; -import com.sun.tools.javac.util.DefinedBy.Api; - -/** - * "Main" class for javap, normally accessed from the command line - * via Main, or from JSR199 via DisassemblerTool. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class JavapTask implements DisassemblerTool.DisassemblerTask, Messages { - public class BadArgs extends Exception { - static final long serialVersionUID = 8765093759964640721L; - BadArgs(String key, Object... args) { - super(JavapTask.this.getMessage(key, args)); - this.key = key; - this.args = args; - } - - BadArgs showUsage(boolean b) { - showUsage = b; - return this; - } - - final String key; - final Object[] args; - boolean showUsage; - } - - static abstract class Option { - Option(boolean hasArg, String... aliases) { - this.hasArg = hasArg; - this.aliases = aliases; - } - - boolean matches(String opt) { - for (String a: aliases) { - if (a.equals(opt)) - return true; - } - return false; - } - - boolean ignoreRest() { - return false; - } - - abstract void process(JavapTask task, String opt, String arg) throws BadArgs; - - final boolean hasArg; - final String[] aliases; - } - - static final Option[] recognizedOptions = { - - new Option(false, "-help", "--help", "-?") { - void process(JavapTask task, String opt, String arg) { - task.options.help = true; - } - }, - - new Option(false, "-version") { - void process(JavapTask task, String opt, String arg) { - task.options.version = true; - } - }, - - new Option(false, "-fullversion") { - void process(JavapTask task, String opt, String arg) { - task.options.fullVersion = true; - } - }, - - new Option(false, "-v", "-verbose", "-all") { - void process(JavapTask task, String opt, String arg) { - task.options.verbose = true; - task.options.showDescriptors = true; - task.options.showFlags = true; - task.options.showAllAttrs = true; - } - }, - - new Option(false, "-l") { - void process(JavapTask task, String opt, String arg) { - task.options.showLineAndLocalVariableTables = true; - } - }, - - new Option(false, "-public") { - void process(JavapTask task, String opt, String arg) { - task.options.accessOptions.add(opt); - task.options.showAccess = AccessFlags.ACC_PUBLIC; - } - }, - - new Option(false, "-protected") { - void process(JavapTask task, String opt, String arg) { - task.options.accessOptions.add(opt); - task.options.showAccess = AccessFlags.ACC_PROTECTED; - } - }, - - new Option(false, "-package") { - void process(JavapTask task, String opt, String arg) { - task.options.accessOptions.add(opt); - task.options.showAccess = 0; - } - }, - - new Option(false, "-p", "-private") { - void process(JavapTask task, String opt, String arg) { - if (!task.options.accessOptions.contains("-p") && - !task.options.accessOptions.contains("-private")) { - task.options.accessOptions.add(opt); - } - task.options.showAccess = AccessFlags.ACC_PRIVATE; - } - }, - - new Option(false, "-c") { - void process(JavapTask task, String opt, String arg) { - task.options.showDisassembled = true; - } - }, - - new Option(false, "-s") { - void process(JavapTask task, String opt, String arg) { - task.options.showDescriptors = true; - } - }, - - new Option(false, "-sysinfo") { - void process(JavapTask task, String opt, String arg) { - task.options.sysInfo = true; - } - }, - - new Option(false, "-XDdetails") { - void process(JavapTask task, String opt, String arg) { - task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class); - } - - }, - - new Option(false, "-XDdetails:") { - @Override - boolean matches(String opt) { - int sep = opt.indexOf(":"); - return sep != -1 && super.matches(opt.substring(0, sep + 1)); - } - - void process(JavapTask task, String opt, String arg) throws BadArgs { - int sep = opt.indexOf(":"); - for (String v: opt.substring(sep + 1).split("[,: ]+")) { - if (!handleArg(task, v)) - throw task.new BadArgs("err.invalid.arg.for.option", v); - } - } - - boolean handleArg(JavapTask task, String arg) { - if (arg.length() == 0) - return true; - - if (arg.equals("all")) { - task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class); - return true; - } - - boolean on = true; - if (arg.startsWith("-")) { - on = false; - arg = arg.substring(1); - } - - for (InstructionDetailWriter.Kind k: InstructionDetailWriter.Kind.values()) { - if (arg.equalsIgnoreCase(k.option)) { - if (on) - task.options.details.add(k); - else - task.options.details.remove(k); - return true; - } - } - return false; - } - }, - - new Option(false, "-constants") { - void process(JavapTask task, String opt, String arg) { - task.options.showConstants = true; - } - }, - - new Option(false, "-XDinner") { - void process(JavapTask task, String opt, String arg) { - task.options.showInnerClasses = true; - } - }, - - new Option(false, "-XDindent:") { - @Override - boolean matches(String opt) { - int sep = opt.indexOf(":"); - return sep != -1 && super.matches(opt.substring(0, sep + 1)); - } - - void process(JavapTask task, String opt, String arg) throws BadArgs { - int sep = opt.indexOf(":"); - try { - int i = Integer.valueOf(opt.substring(sep + 1)); - if (i > 0) // silently ignore invalid values - task.options.indentWidth = i; - } catch (NumberFormatException e) { - } - } - }, - - new Option(false, "-XDtab:") { - @Override - boolean matches(String opt) { - int sep = opt.indexOf(":"); - return sep != -1 && super.matches(opt.substring(0, sep + 1)); - } - - void process(JavapTask task, String opt, String arg) throws BadArgs { - int sep = opt.indexOf(":"); - try { - int i = Integer.valueOf(opt.substring(sep + 1)); - if (i > 0) // silently ignore invalid values - task.options.tabColumn = i; - } catch (NumberFormatException e) { - } - } - } - - }; - - public JavapTask() { - context = new Context(); - context.put(Messages.class, this); - options = Options.instance(context); - attributeFactory = new Attribute.Factory(); - } - - public JavapTask(Writer out, - JavaFileManager fileManager, - DiagnosticListener<? super JavaFileObject> diagnosticListener) { - this(); - this.log = getPrintWriterForWriter(out); - this.fileManager = fileManager; - this.diagnosticListener = diagnosticListener; - } - - public JavapTask(Writer out, - JavaFileManager fileManager, - DiagnosticListener<? super JavaFileObject> diagnosticListener, - Iterable<String> options, - Iterable<String> classes) { - this(out, fileManager, diagnosticListener); - - this.classes = new ArrayList<>(); - for (String classname: classes) { - Objects.requireNonNull(classname); - this.classes.add(classname); - } - - try { - if (options != null) - handleOptions(options, false); - } catch (BadArgs e) { - throw new IllegalArgumentException(e.getMessage()); - } - } - - public void setLocale(Locale locale) { - if (locale == null) - locale = Locale.getDefault(); - task_locale = locale; - } - - public void setLog(Writer log) { - this.log = getPrintWriterForWriter(log); - } - - public void setLog(OutputStream s) { - setLog(getPrintWriterForStream(s)); - } - - private static PrintWriter getPrintWriterForStream(OutputStream s) { - return new PrintWriter(s == null ? System.err : s, true); - } - - private static PrintWriter getPrintWriterForWriter(Writer w) { - if (w == null) - return getPrintWriterForStream(null); - else if (w instanceof PrintWriter) - return (PrintWriter) w; - else - return new PrintWriter(w, true); - } - - public void setDiagnosticListener(DiagnosticListener<? super JavaFileObject> dl) { - diagnosticListener = dl; - } - - public void setDiagnosticListener(OutputStream s) { - setDiagnosticListener(getDiagnosticListenerForStream(s)); - } - - private DiagnosticListener<JavaFileObject> getDiagnosticListenerForStream(OutputStream s) { - return getDiagnosticListenerForWriter(getPrintWriterForStream(s)); - } - - private DiagnosticListener<JavaFileObject> getDiagnosticListenerForWriter(Writer w) { - final PrintWriter pw = getPrintWriterForWriter(w); - return new DiagnosticListener<JavaFileObject> () { - @DefinedBy(Api.COMPILER) - public void report(Diagnostic<? extends JavaFileObject> diagnostic) { - switch (diagnostic.getKind()) { - case ERROR: - pw.print(getMessage("err.prefix")); - break; - case WARNING: - pw.print(getMessage("warn.prefix")); - break; - case NOTE: - pw.print(getMessage("note.prefix")); - break; - } - pw.print(" "); - pw.println(diagnostic.getMessage(null)); - } - }; - } - - /** Result codes. - */ - static final int - EXIT_OK = 0, // Compilation completed with no errors. - EXIT_ERROR = 1, // Completed but reported errors. - EXIT_CMDERR = 2, // Bad command-line arguments - EXIT_SYSERR = 3, // System error or resource exhaustion. - EXIT_ABNORMAL = 4; // Compiler terminated abnormally - - int run(String[] args) { - try { - try { - handleOptions(args); - - // the following gives consistent behavior with javac - if (classes == null || classes.size() == 0) { - if (options.help || options.version || options.fullVersion) - return EXIT_OK; - else - return EXIT_CMDERR; - } - - return run(); - } finally { - if (defaultFileManager != null) { - try { - defaultFileManager.close(); - defaultFileManager = null; - } catch (IOException e) { - throw new InternalError(e); - } - } - } - } catch (BadArgs e) { - reportError(e.key, e.args); - if (e.showUsage) { - printLines(getMessage("main.usage.summary", progname)); - } - return EXIT_CMDERR; - } catch (InternalError e) { - Object[] e_args; - if (e.getCause() == null) - e_args = e.args; - else { - e_args = new Object[e.args.length + 1]; - e_args[0] = e.getCause(); - System.arraycopy(e.args, 0, e_args, 1, e.args.length); - } - reportError("err.internal.error", e_args); - return EXIT_ABNORMAL; - } finally { - log.flush(); - } - } - - public void handleOptions(String[] args) throws BadArgs { - handleOptions(Arrays.asList(args), true); - } - - private void handleOptions(Iterable<String> args, boolean allowClasses) throws BadArgs { - if (log == null) { - log = getPrintWriterForStream(System.out); - if (diagnosticListener == null) - diagnosticListener = getDiagnosticListenerForStream(System.err); - } else { - if (diagnosticListener == null) - diagnosticListener = getDiagnosticListenerForWriter(log); - } - - - if (fileManager == null) - fileManager = getDefaultFileManager(diagnosticListener, log); - - Iterator<String> iter = args.iterator(); - boolean noArgs = !iter.hasNext(); - - while (iter.hasNext()) { - String arg = iter.next(); - if (arg.startsWith("-")) - handleOption(arg, iter); - else if (allowClasses) { - if (classes == null) - classes = new ArrayList<>(); - classes.add(arg); - while (iter.hasNext()) - classes.add(iter.next()); - } else - throw new BadArgs("err.unknown.option", arg).showUsage(true); - } - - if (options.accessOptions.size() > 1) { - StringBuilder sb = new StringBuilder(); - for (String opt: options.accessOptions) { - if (sb.length() > 0) - sb.append(" "); - sb.append(opt); - } - throw new BadArgs("err.incompatible.options", sb); - } - - if ((classes == null || classes.size() == 0) && - !(noArgs || options.help || options.version || options.fullVersion)) { - throw new BadArgs("err.no.classes.specified"); - } - - if (noArgs || options.help) - showHelp(); - - if (options.version || options.fullVersion) - showVersion(options.fullVersion); - } - - private void handleOption(String name, Iterator<String> rest) throws BadArgs { - for (Option o: recognizedOptions) { - if (o.matches(name)) { - if (o.hasArg) { - if (rest.hasNext()) - o.process(this, name, rest.next()); - else - throw new BadArgs("err.missing.arg", name).showUsage(true); - } else - o.process(this, name, null); - - if (o.ignoreRest()) { - while (rest.hasNext()) - rest.next(); - } - return; - } - } - - try { - if (fileManager.handleOption(name, rest)) - return; - } catch (IllegalArgumentException e) { - throw new BadArgs("err.invalid.use.of.option", name).showUsage(true); - } - - throw new BadArgs("err.unknown.option", name).showUsage(true); - } - - public Boolean call() { - return run() == 0; - } - - public int run() { - if (classes == null || classes.isEmpty()) { - return EXIT_ERROR; - } - - context.put(PrintWriter.class, log); - ClassWriter classWriter = ClassWriter.instance(context); - SourceWriter sourceWriter = SourceWriter.instance(context); - sourceWriter.setFileManager(fileManager); - - int result = EXIT_OK; - - for (String className: classes) { - try { - result = writeClass(classWriter, className); - } catch (ConstantPoolException e) { - reportError("err.bad.constant.pool", className, e.getLocalizedMessage()); - result = EXIT_ERROR; - } catch (EOFException e) { - reportError("err.end.of.file", className); - result = EXIT_ERROR; - } catch (FileNotFoundException | NoSuchFileException e) { - reportError("err.file.not.found", e.getLocalizedMessage()); - result = EXIT_ERROR; - } catch (IOException e) { - //e.printStackTrace(); - Object msg = e.getLocalizedMessage(); - if (msg == null) { - msg = e; - } - reportError("err.ioerror", className, msg); - result = EXIT_ERROR; - } catch (OutOfMemoryError e) { - reportError("err.nomem"); - result = EXIT_ERROR; - } catch (Throwable t) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - t.printStackTrace(pw); - pw.close(); - reportError("err.crash", t.toString(), sw.toString()); - result = EXIT_ABNORMAL; - } - } - - return result; - } - - protected int writeClass(ClassWriter classWriter, String className) - throws IOException, ConstantPoolException { - JavaFileObject fo = open(className); - if (fo == null) { - reportError("err.class.not.found", className); - return EXIT_ERROR; - } - - ClassFileInfo cfInfo = read(fo); - if (!className.endsWith(".class")) { - String cfName = cfInfo.cf.getName(); - if (!cfName.replaceAll("[/$]", ".").equals(className.replaceAll("[/$]", "."))) { - reportWarning("warn.unexpected.class", className, cfName.replace('/', '.')); - } - } - write(cfInfo); - - if (options.showInnerClasses) { - ClassFile cf = cfInfo.cf; - Attribute a = cf.getAttribute(Attribute.InnerClasses); - if (a instanceof InnerClasses_attribute) { - InnerClasses_attribute inners = (InnerClasses_attribute) a; - try { - int result = EXIT_OK; - for (int i = 0; i < inners.classes.length; i++) { - int outerIndex = inners.classes[i].outer_class_info_index; - ConstantPool.CONSTANT_Class_info outerClassInfo = cf.constant_pool.getClassInfo(outerIndex); - String outerClassName = outerClassInfo.getName(); - if (outerClassName.equals(cf.getName())) { - int innerIndex = inners.classes[i].inner_class_info_index; - ConstantPool.CONSTANT_Class_info innerClassInfo = cf.constant_pool.getClassInfo(innerIndex); - String innerClassName = innerClassInfo.getName(); - classWriter.println("// inner class " + innerClassName.replaceAll("[/$]", ".")); - classWriter.println(); - result = writeClass(classWriter, innerClassName); - if (result != EXIT_OK) return result; - } - } - return result; - } catch (ConstantPoolException e) { - reportError("err.bad.innerclasses.attribute", className); - return EXIT_ERROR; - } - } else if (a != null) { - reportError("err.bad.innerclasses.attribute", className); - return EXIT_ERROR; - } - } - - return EXIT_OK; - } - - protected JavaFileObject open(String className) throws IOException { - // for compatibility, first see if it is a class name - JavaFileObject fo = getClassFileObject(className); - if (fo != null) - return fo; - - // see if it is an inner class, by replacing dots to $, starting from the right - String cn = className; - int lastDot; - while ((lastDot = cn.lastIndexOf(".")) != -1) { - cn = cn.substring(0, lastDot) + "$" + cn.substring(lastDot + 1); - fo = getClassFileObject(cn); - if (fo != null) - return fo; - } - - if (!className.endsWith(".class")) - return null; - - if (fileManager instanceof StandardJavaFileManager) { - StandardJavaFileManager sfm = (StandardJavaFileManager) fileManager; - try { - fo = sfm.getJavaFileObjects(className).iterator().next(); - if (fo != null && fo.getLastModified() != 0) { - return fo; - } - } catch (IllegalArgumentException ignore) { - } - } - - // see if it is a URL, and if so, wrap it in just enough of a JavaFileObject - // to suit javap's needs - if (className.matches("^[A-Za-z]+:.*")) { - try { - final URI uri = new URI(className); - final URL url = uri.toURL(); - final URLConnection conn = url.openConnection(); - conn.setUseCaches(false); - return new JavaFileObject() { - @DefinedBy(Api.COMPILER) - public Kind getKind() { - return JavaFileObject.Kind.CLASS; - } - - @DefinedBy(Api.COMPILER) - public boolean isNameCompatible(String simpleName, Kind kind) { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public NestingKind getNestingKind() { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public Modifier getAccessLevel() { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public URI toUri() { - return uri; - } - - @DefinedBy(Api.COMPILER) - public String getName() { - return uri.toString(); - } - - @DefinedBy(Api.COMPILER) - public InputStream openInputStream() throws IOException { - return conn.getInputStream(); - } - - @DefinedBy(Api.COMPILER) - public OutputStream openOutputStream() throws IOException { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public Reader openReader(boolean ignoreEncodingErrors) throws IOException { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public Writer openWriter() throws IOException { - throw new UnsupportedOperationException(); - } - - @DefinedBy(Api.COMPILER) - public long getLastModified() { - return conn.getLastModified(); - } - - @DefinedBy(Api.COMPILER) - public boolean delete() { - throw new UnsupportedOperationException(); - } - - }; - } catch (URISyntaxException | IOException ignore) { - } - } - - return null; - } - - public static class ClassFileInfo { - ClassFileInfo(JavaFileObject fo, ClassFile cf, byte[] digest, int size) { - this.fo = fo; - this.cf = cf; - this.digest = digest; - this.size = size; - } - public final JavaFileObject fo; - public final ClassFile cf; - public final byte[] digest; - public final int size; - } - - public ClassFileInfo read(JavaFileObject fo) throws IOException, ConstantPoolException { - InputStream in = fo.openInputStream(); - try { - SizeInputStream sizeIn = null; - MessageDigest md = null; - if (options.sysInfo || options.verbose) { - try { - md = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException ignore) { - } - in = new DigestInputStream(in, md); - in = sizeIn = new SizeInputStream(in); - } - - ClassFile cf = ClassFile.read(in, attributeFactory); - byte[] digest = (md == null) ? null : md.digest(); - int size = (sizeIn == null) ? -1 : sizeIn.size(); - return new ClassFileInfo(fo, cf, digest, size); - } finally { - in.close(); - } - } - - public void write(ClassFileInfo info) { - ClassWriter classWriter = ClassWriter.instance(context); - if (options.sysInfo || options.verbose) { - classWriter.setFile(info.fo.toUri()); - classWriter.setLastModified(info.fo.getLastModified()); - classWriter.setDigest("MD5", info.digest); - classWriter.setFileSize(info.size); - } - - classWriter.write(info.cf); - } - - protected void setClassFile(ClassFile classFile) { - ClassWriter classWriter = ClassWriter.instance(context); - classWriter.setClassFile(classFile); - } - - protected void setMethod(Method enclosingMethod) { - ClassWriter classWriter = ClassWriter.instance(context); - classWriter.setMethod(enclosingMethod); - } - - protected void write(Attribute value) { - AttributeWriter attrWriter = AttributeWriter.instance(context); - ClassWriter classWriter = ClassWriter.instance(context); - ClassFile cf = classWriter.getClassFile(); - attrWriter.write(cf, value, cf.constant_pool); - } - - protected void write(Attributes attrs) { - AttributeWriter attrWriter = AttributeWriter.instance(context); - ClassWriter classWriter = ClassWriter.instance(context); - ClassFile cf = classWriter.getClassFile(); - attrWriter.write(cf, attrs, cf.constant_pool); - } - - protected void write(ConstantPool constant_pool) { - ConstantWriter constantWriter = ConstantWriter.instance(context); - constantWriter.writeConstantPool(constant_pool); - } - - protected void write(ConstantPool constant_pool, int value) { - ConstantWriter constantWriter = ConstantWriter.instance(context); - constantWriter.write(value); - } - - protected void write(ConstantPool.CPInfo value) { - ConstantWriter constantWriter = ConstantWriter.instance(context); - constantWriter.println(value); - } - - protected void write(Field value) { - ClassWriter classWriter = ClassWriter.instance(context); - classWriter.writeField(value); - } - - protected void write(Method value) { - ClassWriter classWriter = ClassWriter.instance(context); - classWriter.writeMethod(value); - } - - private JavaFileManager getDefaultFileManager(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log) { - if (defaultFileManager == null) - defaultFileManager = JavapFileManager.create(dl, log); - return defaultFileManager; - } - - private JavaFileObject getClassFileObject(String className) throws IOException { - try { - JavaFileObject fo; - fo = fileManager.getJavaFileForInput(StandardLocation.PLATFORM_CLASS_PATH, className, JavaFileObject.Kind.CLASS); - if (fo == null) - fo = fileManager.getJavaFileForInput(StandardLocation.CLASS_PATH, className, JavaFileObject.Kind.CLASS); - return fo; - } catch (IllegalArgumentException e) { - return null; - } - } - - private void showHelp() { - printLines(getMessage("main.usage", progname)); - for (Option o: recognizedOptions) { - String name = o.aliases[0].substring(1); // there must always be at least one name - if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify")) - continue; - printLines(getMessage("main.opt." + name)); - } - String[] fmOptions = { "-classpath", "-cp", "-bootclasspath" }; - for (String o: fmOptions) { - if (fileManager.isSupportedOption(o) == -1) - continue; - String name = o.substring(1); - printLines(getMessage("main.opt." + name)); - } - - } - - private void showVersion(boolean full) { - printLines(version(full ? "full" : "release")); - } - - private void printLines(String msg) { - log.println(msg.replace("\n", nl)); - } - - private static final String nl = System.getProperty("line.separator"); - - private static final String versionRBName = "com.sun.tools.javap.resources.version"; - private static ResourceBundle versionRB; - - private String version(String key) { - // key=version: mm.nn.oo[-milestone] - // key=full: mm.mm.oo[-milestone]-build - if (versionRB == null) { - try { - versionRB = ResourceBundle.getBundle(versionRBName); - } catch (MissingResourceException e) { - return getMessage("version.resource.missing", System.getProperty("java.version")); - } - } - try { - return versionRB.getString(key); - } - catch (MissingResourceException e) { - return getMessage("version.unknown", System.getProperty("java.version")); - } - } - - private void reportError(String key, Object... args) { - diagnosticListener.report(createDiagnostic(Diagnostic.Kind.ERROR, key, args)); - } - - private void reportNote(String key, Object... args) { - diagnosticListener.report(createDiagnostic(Diagnostic.Kind.NOTE, key, args)); - } - - private void reportWarning(String key, Object... args) { - diagnosticListener.report(createDiagnostic(Diagnostic.Kind.WARNING, key, args)); - } - - private Diagnostic<JavaFileObject> createDiagnostic( - final Diagnostic.Kind kind, final String key, final Object... args) { - return new Diagnostic<JavaFileObject>() { - @DefinedBy(Api.COMPILER) - public Kind getKind() { - return kind; - } - - @DefinedBy(Api.COMPILER) - public JavaFileObject getSource() { - return null; - } - - @DefinedBy(Api.COMPILER) - public long getPosition() { - return Diagnostic.NOPOS; - } - - @DefinedBy(Api.COMPILER) - public long getStartPosition() { - return Diagnostic.NOPOS; - } - - @DefinedBy(Api.COMPILER) - public long getEndPosition() { - return Diagnostic.NOPOS; - } - - @DefinedBy(Api.COMPILER) - public long getLineNumber() { - return Diagnostic.NOPOS; - } - - @DefinedBy(Api.COMPILER) - public long getColumnNumber() { - return Diagnostic.NOPOS; - } - - @DefinedBy(Api.COMPILER) - public String getCode() { - return key; - } - - @DefinedBy(Api.COMPILER) - public String getMessage(Locale locale) { - return JavapTask.this.getMessage(locale, key, args); - } - - @Override - public String toString() { - return getClass().getName() + "[key=" + key + ",args=" + Arrays.asList(args) + "]"; - } - - }; - - } - - public String getMessage(String key, Object... args) { - return getMessage(task_locale, key, args); - } - - public String getMessage(Locale locale, String key, Object... args) { - if (bundles == null) { - // could make this a HashMap<Locale,SoftReference<ResourceBundle>> - // and for efficiency, keep a hard reference to the bundle for the task - // locale - bundles = new HashMap<>(); - } - - if (locale == null) - locale = Locale.getDefault(); - - ResourceBundle b = bundles.get(locale); - if (b == null) { - try { - b = ResourceBundle.getBundle("com.sun.tools.javap.resources.javap", locale); - bundles.put(locale, b); - } catch (MissingResourceException e) { - throw new InternalError("Cannot find javap resource bundle for locale " + locale); - } - } - - try { - return MessageFormat.format(b.getString(key), args); - } catch (MissingResourceException e) { - throw new InternalError(e, key); - } - } - - protected Context context; - JavaFileManager fileManager; - JavaFileManager defaultFileManager; - PrintWriter log; - DiagnosticListener<? super JavaFileObject> diagnosticListener; - List<String> classes; - Options options; - //ResourceBundle bundle; - Locale task_locale; - Map<Locale, ResourceBundle> bundles; - protected Attribute.Factory attributeFactory; - - private static final String progname = "javap"; - - private static class SizeInputStream extends FilterInputStream { - SizeInputStream(InputStream in) { - super(in); - } - - int size() { - return size; - } - - @Override - public int read(byte[] buf, int offset, int length) throws IOException { - int n = super.read(buf, offset, length); - if (n > 0) - size += n; - return n; - } - - @Override - public int read() throws IOException { - int b = super.read(); - size += 1; - return b; - } - - private int size; - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTableWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Descriptor; -import com.sun.tools.classfile.Descriptor.InvalidDescriptor; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.LocalVariableTable_attribute; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -/** - * Annotate instructions with details about local variables. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class LocalVariableTableWriter extends InstructionDetailWriter { - public enum NoteKind { - START("start") { - public boolean match(LocalVariableTable_attribute.Entry entry, int pc) { - return (pc == entry.start_pc); - } - }, - END("end") { - public boolean match(LocalVariableTable_attribute.Entry entry, int pc) { - return (pc == entry.start_pc + entry.length); - } - }; - NoteKind(String text) { - this.text = text; - } - public abstract boolean match(LocalVariableTable_attribute.Entry entry, int pc); - public final String text; - } - - static LocalVariableTableWriter instance(Context context) { - LocalVariableTableWriter instance = context.get(LocalVariableTableWriter.class); - if (instance == null) - instance = new LocalVariableTableWriter(context); - return instance; - } - - protected LocalVariableTableWriter(Context context) { - super(context); - context.put(LocalVariableTableWriter.class, this); - classWriter = ClassWriter.instance(context); - } - - public void reset(Code_attribute attr) { - codeAttr = attr; - pcMap = new HashMap<>(); - LocalVariableTable_attribute lvt = - (LocalVariableTable_attribute) (attr.attributes.get(Attribute.LocalVariableTable)); - if (lvt == null) - return; - - for (int i = 0; i < lvt.local_variable_table.length; i++) { - LocalVariableTable_attribute.Entry entry = lvt.local_variable_table[i]; - put(entry.start_pc, entry); - put(entry.start_pc + entry.length, entry); - } - } - - public void writeDetails(Instruction instr) { - int pc = instr.getPC(); - writeLocalVariables(pc, NoteKind.END); - writeLocalVariables(pc, NoteKind.START); - } - - @Override - public void flush() { - int pc = codeAttr.code_length; - writeLocalVariables(pc, NoteKind.END); - } - - public void writeLocalVariables(int pc, NoteKind kind) { - ConstantPool constant_pool = classWriter.getClassFile().constant_pool; - String indent = space(2); // get from Options? - List<LocalVariableTable_attribute.Entry> entries = pcMap.get(pc); - if (entries != null) { - for (ListIterator<LocalVariableTable_attribute.Entry> iter = - entries.listIterator(kind == NoteKind.END ? entries.size() : 0); - kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { - LocalVariableTable_attribute.Entry entry = - kind == NoteKind.END ? iter.previous() : iter.next(); - if (kind.match(entry, pc)) { - print(indent); - print(kind.text); - print(" local "); - print(entry.index); - print(" // "); - Descriptor d = new Descriptor(entry.descriptor_index); - try { - print(d.getFieldType(constant_pool)); - } catch (InvalidDescriptor e) { - print(report(e)); - } catch (ConstantPoolException e) { - print(report(e)); - } - print(" "); - try { - print(constant_pool.getUTF8Value(entry.name_index)); - } catch (ConstantPoolException e) { - print(report(e)); - } - println(); - } - } - } - } - - private void put(int pc, LocalVariableTable_attribute.Entry entry) { - List<LocalVariableTable_attribute.Entry> list = pcMap.get(pc); - if (list == null) { - list = new ArrayList<>(); - pcMap.put(pc, list); - } - if (!list.contains(entry)) - list.add(entry); - } - - private ClassWriter classWriter; - private Code_attribute codeAttr; - private Map<Integer, List<LocalVariableTable_attribute.Entry>> pcMap; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTypeTableWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Descriptor; -import com.sun.tools.classfile.Descriptor.InvalidDescriptor; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.LocalVariableTypeTable_attribute; -import com.sun.tools.classfile.Signature; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -/** - * Annotate instructions with details about local variables. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class LocalVariableTypeTableWriter extends InstructionDetailWriter { - public enum NoteKind { - START("start") { - public boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc) { - return (pc == entry.start_pc); - } - }, - END("end") { - public boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc) { - return (pc == entry.start_pc + entry.length); - } - }; - NoteKind(String text) { - this.text = text; - } - public abstract boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc); - public final String text; - } - - static LocalVariableTypeTableWriter instance(Context context) { - LocalVariableTypeTableWriter instance = context.get(LocalVariableTypeTableWriter.class); - if (instance == null) - instance = new LocalVariableTypeTableWriter(context); - return instance; - } - - protected LocalVariableTypeTableWriter(Context context) { - super(context); - context.put(LocalVariableTypeTableWriter.class, this); - classWriter = ClassWriter.instance(context); - } - - public void reset(Code_attribute attr) { - codeAttr = attr; - pcMap = new HashMap<>(); - LocalVariableTypeTable_attribute lvt = - (LocalVariableTypeTable_attribute) (attr.attributes.get(Attribute.LocalVariableTypeTable)); - if (lvt == null) - return; - - for (int i = 0; i < lvt.local_variable_table.length; i++) { - LocalVariableTypeTable_attribute.Entry entry = lvt.local_variable_table[i]; - put(entry.start_pc, entry); - put(entry.start_pc + entry.length, entry); - } - } - - public void writeDetails(Instruction instr) { - int pc = instr.getPC(); - writeLocalVariables(pc, NoteKind.END); - writeLocalVariables(pc, NoteKind.START); - } - - @Override - public void flush() { - int pc = codeAttr.code_length; - writeLocalVariables(pc, NoteKind.END); - } - - public void writeLocalVariables(int pc, NoteKind kind) { - ConstantPool constant_pool = classWriter.getClassFile().constant_pool; - String indent = space(2); // get from Options? - List<LocalVariableTypeTable_attribute.Entry> entries = pcMap.get(pc); - if (entries != null) { - for (ListIterator<LocalVariableTypeTable_attribute.Entry> iter = - entries.listIterator(kind == NoteKind.END ? entries.size() : 0); - kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { - LocalVariableTypeTable_attribute.Entry entry = - kind == NoteKind.END ? iter.previous() : iter.next(); - if (kind.match(entry, pc)) { - print(indent); - print(kind.text); - print(" generic local "); - print(entry.index); - print(" // "); - Descriptor d = new Signature(entry.signature_index); - try { - print(d.getFieldType(constant_pool).toString().replace("/", ".")); - } catch (InvalidDescriptor e) { - print(report(e)); - } catch (ConstantPoolException e) { - print(report(e)); - } - print(" "); - try { - print(constant_pool.getUTF8Value(entry.name_index)); - } catch (ConstantPoolException e) { - print(report(e)); - } - println(); - } - } - } - } - - private void put(int pc, LocalVariableTypeTable_attribute.Entry entry) { - List<LocalVariableTypeTable_attribute.Entry> list = pcMap.get(pc); - if (list == null) { - list = new ArrayList<>(); - pcMap.put(pc, list); - } - if (!list.contains(entry)) - list.add(entry); - } - - private ClassWriter classWriter; - private Code_attribute codeAttr; - private Map<Integer, List<LocalVariableTypeTable_attribute.Entry>> pcMap; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/Main.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.io.PrintWriter; - -/** - * Main entry point. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Main { - /** - * Main entry point for the launcher. - * Note: This method calls System.exit. - * @param args command line arguments - */ - public static void main(String[] args) { - JavapTask t = new JavapTask(); - int rc = t.run(args); - System.exit(rc); - } - - /** - * Entry point that does <i>not</i> call System.exit. - * @param args command line arguments - * @param out output stream - * @return an exit code. 0 means success, non-zero means an error occurred. - */ - public static int run(String[] args, PrintWriter out) { - JavapTask t = new JavapTask(); - t.setLog(out); - return t.run(args); - } -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/Messages.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.Locale; - -/** - * Access to javap messages. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public interface Messages { - String getMessage(String key, Object... args); - - String getMessage(Locale locale, String key, Object... args); -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/Options.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.EnumSet; -import java.util.HashSet; -import java.util.Set; - -import com.sun.tools.classfile.AccessFlags; - -/* - * Provides access to javap's options, set via the command line - * or JSR 199 API. - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class Options { - public static Options instance(Context context) { - Options instance = context.get(Options.class); - if (instance == null) - instance = new Options(context); - return instance; - } - - protected Options(Context context) { - context.put(Options.class, this); - } - - /** - * Checks access of class, field or method. - */ - public boolean checkAccess(AccessFlags flags){ - - boolean isPublic = flags.is(AccessFlags.ACC_PUBLIC); - boolean isProtected = flags.is(AccessFlags.ACC_PROTECTED); - boolean isPrivate = flags.is(AccessFlags.ACC_PRIVATE); - boolean isPackage = !(isPublic || isProtected || isPrivate); - - if ((showAccess == AccessFlags.ACC_PUBLIC) && (isProtected || isPrivate || isPackage)) - return false; - else if ((showAccess == AccessFlags.ACC_PROTECTED) && (isPrivate || isPackage)) - return false; - else if ((showAccess == 0) && (isPrivate)) - return false; - else - return true; - } - - public boolean help; - public boolean verbose; - public boolean version; - public boolean fullVersion; - public boolean showFlags; - public boolean showLineAndLocalVariableTables; - public int showAccess; - public Set<String> accessOptions = new HashSet<>(); - public Set<InstructionDetailWriter.Kind> details = EnumSet.noneOf(InstructionDetailWriter.Kind.class); - public boolean showDisassembled; - public boolean showDescriptors; - public boolean showAllAttrs; - public boolean showConstants; - public boolean sysInfo; - public boolean showInnerClasses; - public int indentWidth = 2; // #spaces per indentWidth level; must be > 0 - public int tabColumn = 40; // column number for comments; must be > 0 -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/SourceWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; -import javax.tools.JavaFileManager; -import javax.tools.JavaFileManager.Location; -import javax.tools.JavaFileObject; -import javax.tools.StandardLocation; - -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.LineNumberTable_attribute; -import com.sun.tools.classfile.SourceFile_attribute; - - -/** - * Annotate instructions with source code. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class SourceWriter extends InstructionDetailWriter { - static SourceWriter instance(Context context) { - SourceWriter instance = context.get(SourceWriter.class); - if (instance == null) - instance = new SourceWriter(context); - return instance; - } - - protected SourceWriter(Context context) { - super(context); - context.put(SourceWriter.class, this); - } - - void setFileManager(JavaFileManager fileManager) { - this.fileManager = fileManager; - } - - public void reset(ClassFile cf, Code_attribute attr) { - setSource(cf); - setLineMap(attr); - } - - public void writeDetails(Instruction instr) { - String indent = space(40); // could get from Options? - Set<Integer> lines = lineMap.get(instr.getPC()); - if (lines != null) { - for (int line: lines) { - print(indent); - print(String.format(" %4d ", line)); - if (line < sourceLines.length) - print(sourceLines[line]); - println(); - int nextLine = nextLine(line); - for (int i = line + 1; i < nextLine; i++) { - print(indent); - print(String.format("(%4d)", i)); - if (i < sourceLines.length) - print(sourceLines[i]); - println(); - } - } - } - } - - public boolean hasSource() { - return (sourceLines.length > 0); - } - - private void setLineMap(Code_attribute attr) { - SortedMap<Integer, SortedSet<Integer>> map = new TreeMap<>(); - SortedSet<Integer> allLines = new TreeSet<>(); - for (Attribute a: attr.attributes) { - if (a instanceof LineNumberTable_attribute) { - LineNumberTable_attribute t = (LineNumberTable_attribute) a; - for (LineNumberTable_attribute.Entry e: t.line_number_table) { - int start_pc = e.start_pc; - int line = e.line_number; - SortedSet<Integer> pcLines = map.get(start_pc); - if (pcLines == null) { - pcLines = new TreeSet<>(); - map.put(start_pc, pcLines); - } - pcLines.add(line); - allLines.add(line); - } - } - } - lineMap = map; - lineList = new ArrayList<>(allLines); - } - - private void setSource(ClassFile cf) { - if (cf != classFile) { - classFile = cf; - sourceLines = splitLines(readSource(cf)); - } - } - - private String readSource(ClassFile cf) { - if (fileManager == null) - return null; - - Location location; - if (fileManager.hasLocation((StandardLocation.SOURCE_PATH))) - location = StandardLocation.SOURCE_PATH; - else - location = StandardLocation.CLASS_PATH; - - // Guess the source file for a class from the package name for this - // class and the base of the source file. This avoids having to read - // additional classes to determine the outmost class from any - // InnerClasses and EnclosingMethod attributes. - try { - String className = cf.getName(); - SourceFile_attribute sf = - (SourceFile_attribute) cf.attributes.get(Attribute.SourceFile); - if (sf == null) { - report(messages.getMessage("err.no.SourceFile.attribute")); - return null; - } - String sourceFile = sf.getSourceFile(cf.constant_pool); - String fileBase = sourceFile.endsWith(".java") - ? sourceFile.substring(0, sourceFile.length() - 5) : sourceFile; - int sep = className.lastIndexOf("/"); - String pkgName = (sep == -1 ? "" : className.substring(0, sep+1)); - String topClassName = (pkgName + fileBase).replace('/', '.'); - JavaFileObject fo = - fileManager.getJavaFileForInput(location, - topClassName, - JavaFileObject.Kind.SOURCE); - if (fo == null) { - report(messages.getMessage("err.source.file.not.found")); - return null; - } - return fo.getCharContent(true).toString(); - } catch (ConstantPoolException e) { - report(e); - return null; - } catch (IOException e) { - report(e.getLocalizedMessage()); - return null; - } - } - - private static String[] splitLines(String text) { - if (text == null) - return new String[0]; - - List<String> lines = new ArrayList<>(); - lines.add(""); // dummy line 0 - try { - BufferedReader r = new BufferedReader(new StringReader(text)); - String line; - while ((line = r.readLine()) != null) - lines.add(line); - } catch (IOException ignore) { - } - return lines.toArray(new String[lines.size()]); - } - - private int nextLine(int line) { - int i = lineList.indexOf(line); - if (i == -1 || i == lineList.size() - 1) - return - 1; - return lineList.get(i + 1); - } - - private JavaFileManager fileManager; - private ClassFile classFile; - private SortedMap<Integer, SortedSet<Integer>> lineMap; - private List<Integer> lineList; - private String[] sourceLines; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/StackMapWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,289 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import com.sun.tools.classfile.AccessFlags; -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.ConstantPool; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Descriptor; -import com.sun.tools.classfile.Descriptor.InvalidDescriptor; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.Method; -import com.sun.tools.classfile.StackMapTable_attribute; -import com.sun.tools.classfile.StackMapTable_attribute.*; - -import static com.sun.tools.classfile.StackMapTable_attribute.verification_type_info.*; - -/** - * Annotate instructions with stack map. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class StackMapWriter extends InstructionDetailWriter { - static StackMapWriter instance(Context context) { - StackMapWriter instance = context.get(StackMapWriter.class); - if (instance == null) - instance = new StackMapWriter(context); - return instance; - } - - protected StackMapWriter(Context context) { - super(context); - context.put(StackMapWriter.class, this); - classWriter = ClassWriter.instance(context); - } - - public void reset(Code_attribute attr) { - setStackMap((StackMapTable_attribute) attr.attributes.get(Attribute.StackMapTable)); - } - - void setStackMap(StackMapTable_attribute attr) { - if (attr == null) { - map = null; - return; - } - - Method m = classWriter.getMethod(); - Descriptor d = m.descriptor; - String[] args; - try { - ConstantPool cp = classWriter.getClassFile().constant_pool; - String argString = d.getParameterTypes(cp); - args = argString.substring(1, argString.length() - 1).split("[, ]+"); - } catch (ConstantPoolException | InvalidDescriptor e) { - return; - } - boolean isStatic = m.access_flags.is(AccessFlags.ACC_STATIC); - - verification_type_info[] initialLocals = new verification_type_info[(isStatic ? 0 : 1) + args.length]; - if (!isStatic) - initialLocals[0] = new CustomVerificationTypeInfo("this"); - for (int i = 0; i < args.length; i++) { - initialLocals[(isStatic ? 0 : 1) + i] = - new CustomVerificationTypeInfo(args[i].replace(".", "/")); - } - - map = new HashMap<>(); - StackMapBuilder builder = new StackMapBuilder(); - - // using -1 as the pc for the initial frame effectively compensates for - // the difference in behavior for the first stack map frame (where the - // pc offset is just offset_delta) compared to subsequent frames (where - // the pc offset is always offset_delta+1). - int pc = -1; - - map.put(pc, new StackMap(initialLocals, empty)); - - for (int i = 0; i < attr.entries.length; i++) - pc = attr.entries[i].accept(builder, pc); - } - - public void writeInitialDetails() { - writeDetails(-1); - } - - public void writeDetails(Instruction instr) { - writeDetails(instr.getPC()); - } - - private void writeDetails(int pc) { - if (map == null) - return; - - StackMap m = map.get(pc); - if (m != null) { - print("StackMap locals: ", m.locals); - print("StackMap stack: ", m.stack); - } - - } - - void print(String label, verification_type_info[] entries) { - print(label); - for (int i = 0; i < entries.length; i++) { - print(" "); - print(entries[i]); - } - println(); - } - - void print(verification_type_info entry) { - if (entry == null) { - print("ERROR"); - return; - } - - switch (entry.tag) { - case -1: - print(((CustomVerificationTypeInfo) entry).text); - break; - - case ITEM_Top: - print("top"); - break; - - case ITEM_Integer: - print("int"); - break; - - case ITEM_Float: - print("float"); - break; - - case ITEM_Long: - print("long"); - break; - - case ITEM_Double: - print("double"); - break; - - case ITEM_Null: - print("null"); - break; - - case ITEM_UninitializedThis: - print("uninit_this"); - break; - - case ITEM_Object: - try { - ConstantPool cp = classWriter.getClassFile().constant_pool; - ConstantPool.CONSTANT_Class_info class_info = cp.getClassInfo(((Object_variable_info) entry).cpool_index); - print(cp.getUTF8Value(class_info.name_index)); - } catch (ConstantPoolException e) { - print("??"); - } - break; - - case ITEM_Uninitialized: - print(((Uninitialized_variable_info) entry).offset); - break; - } - - } - - private Map<Integer, StackMap> map; - private ClassWriter classWriter; - - class StackMapBuilder - implements StackMapTable_attribute.stack_map_frame.Visitor<Integer, Integer> { - - public Integer visit_same_frame(same_frame frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap m = map.get(pc); - assert (m != null); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap prev = map.get(pc); - assert (prev != null); - StackMap m = new StackMap(prev.locals, frame.stack); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap prev = map.get(pc); - assert (prev != null); - StackMap m = new StackMap(prev.locals, frame.stack); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_chop_frame(chop_frame frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap prev = map.get(pc); - assert (prev != null); - int k = 251 - frame.frame_type; - verification_type_info[] new_locals = Arrays.copyOf(prev.locals, prev.locals.length - k); - StackMap m = new StackMap(new_locals, empty); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_same_frame_extended(same_frame_extended frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta(); - StackMap m = map.get(pc); - assert (m != null); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_append_frame(append_frame frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap prev = map.get(pc); - assert (prev != null); - verification_type_info[] new_locals = new verification_type_info[prev.locals.length + frame.locals.length]; - System.arraycopy(prev.locals, 0, new_locals, 0, prev.locals.length); - System.arraycopy(frame.locals, 0, new_locals, prev.locals.length, frame.locals.length); - StackMap m = new StackMap(new_locals, empty); - map.put(new_pc, m); - return new_pc; - } - - public Integer visit_full_frame(full_frame frame, Integer pc) { - int new_pc = pc + frame.getOffsetDelta() + 1; - StackMap m = new StackMap(frame.locals, frame.stack); - map.put(new_pc, m); - return new_pc; - } - - } - - static class StackMap { - StackMap(verification_type_info[] locals, verification_type_info[] stack) { - this.locals = locals; - this.stack = stack; - } - - private final verification_type_info[] locals; - private final verification_type_info[] stack; - } - - static class CustomVerificationTypeInfo extends verification_type_info { - public CustomVerificationTypeInfo(String text) { - super(-1); - this.text = text; - } - private String text; - } - - private final verification_type_info[] empty = { }; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/TryBlockWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javap; - -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.Code_attribute.Exception_data; -import com.sun.tools.classfile.Instruction; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -/** - * Annotate instructions with details about try blocks. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class TryBlockWriter extends InstructionDetailWriter { - public enum NoteKind { - START("try") { - public boolean match(Exception_data entry, int pc) { - return (pc == entry.start_pc); - } - }, - END("end try") { - public boolean match(Exception_data entry, int pc) { - return (pc == entry.end_pc); - } - }, - HANDLER("catch") { - public boolean match(Exception_data entry, int pc) { - return (pc == entry.handler_pc); - } - }; - NoteKind(String text) { - this.text = text; - } - public abstract boolean match(Exception_data entry, int pc); - public final String text; - } - - static TryBlockWriter instance(Context context) { - TryBlockWriter instance = context.get(TryBlockWriter.class); - if (instance == null) - instance = new TryBlockWriter(context); - return instance; - } - - protected TryBlockWriter(Context context) { - super(context); - context.put(TryBlockWriter.class, this); - constantWriter = ConstantWriter.instance(context); - } - - public void reset(Code_attribute attr) { - indexMap = new HashMap<>(); - pcMap = new HashMap<>(); - for (int i = 0; i < attr.exception_table.length; i++) { - Exception_data entry = attr.exception_table[i]; - indexMap.put(entry, i); - put(entry.start_pc, entry); - put(entry.end_pc, entry); - put(entry.handler_pc, entry); - } - } - - public void writeDetails(Instruction instr) { - writeTrys(instr, NoteKind.END); - writeTrys(instr, NoteKind.START); - writeTrys(instr, NoteKind.HANDLER); - } - - public void writeTrys(Instruction instr, NoteKind kind) { - String indent = space(2); // get from Options? - int pc = instr.getPC(); - List<Exception_data> entries = pcMap.get(pc); - if (entries != null) { - for (ListIterator<Exception_data> iter = - entries.listIterator(kind == NoteKind.END ? entries.size() : 0); - kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { - Exception_data entry = - kind == NoteKind.END ? iter.previous() : iter.next(); - if (kind.match(entry, pc)) { - print(indent); - print(kind.text); - print("["); - print(indexMap.get(entry)); - print("] "); - if (entry.catch_type == 0) - print("finally"); - else { - print("#" + entry.catch_type); - print(" // "); - constantWriter.write(entry.catch_type); - } - println(); - } - } - } - } - - private void put(int pc, Exception_data entry) { - List<Exception_data> list = pcMap.get(pc); - if (list == null) { - list = new ArrayList<>(); - pcMap.put(pc, list); - } - if (!list.contains(entry)) - list.add(entry); - } - - private Map<Integer, List<Exception_data>> pcMap; - private Map<Exception_data, Integer> indexMap; - private ConstantWriter constantWriter; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.javap; - -import com.sun.tools.classfile.Attribute; -import com.sun.tools.classfile.Code_attribute; -import com.sun.tools.classfile.TypeAnnotation; -import com.sun.tools.classfile.TypeAnnotation.Position; -import com.sun.tools.classfile.Instruction; -import com.sun.tools.classfile.Method; -import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute; -import com.sun.tools.classfile.RuntimeTypeAnnotations_attribute; -import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import com.sun.tools.javac.util.StringUtils; - -/** - * Annotate instructions with details about type annotations. - * - * <p><b>This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice.</b> - */ -public class TypeAnnotationWriter extends InstructionDetailWriter { - public enum NoteKind { VISIBLE, INVISIBLE } - - public static class Note { - Note(NoteKind kind, TypeAnnotation anno) { - this.kind = kind; - this.anno = anno; - } - public final NoteKind kind; - public final TypeAnnotation anno; - } - - static TypeAnnotationWriter instance(Context context) { - TypeAnnotationWriter instance = context.get(TypeAnnotationWriter.class); - if (instance == null) - instance = new TypeAnnotationWriter(context); - return instance; - } - - protected TypeAnnotationWriter(Context context) { - super(context); - context.put(TypeAnnotationWriter.class, this); - annotationWriter = AnnotationWriter.instance(context); - classWriter = ClassWriter.instance(context); - } - - public void reset(Code_attribute attr) { - Method m = classWriter.getMethod(); - pcMap = new HashMap<>(); - check(NoteKind.VISIBLE, (RuntimeVisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeVisibleTypeAnnotations)); - check(NoteKind.INVISIBLE, (RuntimeInvisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeInvisibleTypeAnnotations)); - } - - private void check(NoteKind kind, RuntimeTypeAnnotations_attribute attr) { - if (attr == null) - return; - - for (TypeAnnotation anno: attr.annotations) { - Position p = anno.position; - Note note = null; - if (p.offset != -1) - addNote(p.offset, note = new Note(kind, anno)); - if (p.lvarOffset != null) { - for (int i = 0; i < p.lvarOffset.length; i++) { - if (note == null) - note = new Note(kind, anno); - addNote(p.lvarOffset[i], note); - } - } - } - } - - private void addNote(int pc, Note note) { - List<Note> list = pcMap.get(pc); - if (list == null) - pcMap.put(pc, list = new ArrayList<>()); - list.add(note); - } - - @Override - void writeDetails(Instruction instr) { - String indent = space(2); // get from Options? - int pc = instr.getPC(); - List<Note> notes = pcMap.get(pc); - if (notes != null) { - for (Note n: notes) { - print(indent); - print("@"); - annotationWriter.write(n.anno, false, true); - print(", "); - println(StringUtils.toLowerCase(n.kind.toString())); - } - } - } - - private AnnotationWriter annotationWriter; - private ClassWriter classWriter; - private Map<Integer, List<Note>> pcMap; -}
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/overview.html Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - <head> - <title>javap: class file disassembler</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> - </head> - <body> - Javap is a class file disassembler. - </body> -</html>
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/package-info.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - Classes to dump class files in text format. - - <p><b>This is NOT part of any supported API. - If you write code that depends on this, you do so at your own risk. - This code and its internal interfaces are subject to change or - deletion without notice.</b> -*/ -@jdk.Exported(false) -package com.sun.tools.javap;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ - -err.prefix=Error: - -err.bad.constant.pool=error while reading constant pool for {0}: {1} -err.class.not.found=class not found: {0} -err.crash=A serious internal error has occurred: {0}\nPlease file a bug report, and include the following information:\n{1} -err.end.of.file=unexpected end of file while reading {0} -err.file.not.found=file not found: {0} -err.incompatible.options=bad combination of options: {0} -err.internal.error=internal error: {0} {1} {2} -err.invalid.arg.for.option=invalid argument for option: {0} -err.ioerror=IO error reading {0}: {1} -err.missing.arg=no value given for {0} -err.no.classes.specified=no classes specified -err.not.standard.file.manager=can only specify class files when using a standard file manager -err.invalid.use.of.option=invalid use of option: {0} -err.unknown.option=unknown option: {0} -err.no.SourceFile.attribute=no SourceFile attribute -err.source.file.not.found=source file not found -err.bad.innerclasses.attribute=bad InnerClasses attribute for {0} -err.nomem=Insufficient memory. To increase memory use -J-Xmx option. - -main.usage.summary=\ -Usage: {0} <options> <classes>\n\ -use -help for a list of possible options - -warn.prefix=Warning: -warn.unexpected.class=Binary file {0} contains {1} - -note.prefix=Note: - -main.usage.summary=\ -Usage: {0} <options> <classes>\n\ -use -help for a list of possible options - -main.usage=\ -Usage: {0} <options> <classes>\n\ -where possible options include: - - -main.opt.help=\ -\ -help --help -? Print this usage message - -main.opt.version=\ -\ -version Version information - -main.opt.v=\ -\ -v -verbose Print additional information - -main.opt.l=\ -\ -l Print line number and local variable tables - -main.opt.public=\ -\ -public Show only public classes and members - -main.opt.protected=\ -\ -protected Show protected/public classes and members - -main.opt.package=\ -\ -package Show package/protected/public classes\n\ -\ and members (default) - -main.opt.p=\ -\ -p -private Show all classes and members - -main.opt.c=\ -\ -c Disassemble the code - -main.opt.s=\ -\ -s Print internal type signatures - -main.opt.classpath=\ -\ -classpath <path> Specify where to find user class files - -main.opt.cp=\ -\ -cp <path> Specify where to find user class files - -main.opt.bootclasspath=\ -\ -bootclasspath <path> Override location of bootstrap class files - -main.opt.constants=\ -\ -constants Show final constants - - -main.opt.sysinfo=\ -\ -sysinfo Show system info (path, size, date, MD5 hash)\n\ -\ of class being processed
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_ja.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ - -err.prefix=\u30A8\u30E9\u30FC: - -err.bad.constant.pool={0}\u306E\u5B9A\u6570\u30D7\u30FC\u30EB\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1} -err.class.not.found=\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} -err.crash=\u91CD\u5927\u306A\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\n\u6B21\u306E\u60C5\u5831\u3092\u542B\u3080\u30D0\u30B0\u30FB\u30EC\u30DD\u30FC\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u3057\u3066\u304F\u3060\u3055\u3044:\n{1} -err.end.of.file={0}\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u4E88\u671F\u3057\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u306E\u7D42\u308F\u308A\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F -err.file.not.found=\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} -err.h.not.supported=-h\u306F\u4F7F\u7528\u53EF\u80FD\u3067\u306A\u304F\u306A\u308A\u307E\u3057\u305F - 'javah'\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044 -err.incompatible.options=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u7D44\u5408\u305B\u304C\u4E0D\u6B63\u3067\u3059: {0} -err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2} -err.invalid.arg.for.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0} -err.ioerror={0}\u306E\u8AAD\u53D6\u308A\u4E2D\u306BIO\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1} -err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -err.no.classes.specified=\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -err.not.standard.file.manager=\u6A19\u6E96\u30D5\u30A1\u30A4\u30EB\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u307F\u6307\u5B9A\u3067\u304D\u307E\u3059 -err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0} -err.verify.not.supported=-verify\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -err.no.SourceFile.attribute=SourceFile\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093 -err.source.file.not.found=\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 -err.bad.innerclasses.attribute={0}\u306EInnerClasses\u5C5E\u6027\u304C\u4E0D\u6B63\u3067\u3059 -warn.Xold.not.supported=-Xold\u306F\u4F7F\u7528\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3057\u305F - -main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-help\u3092\u4F7F\u7528\u3057\u307E\u3059 - -warn.prefix=\u8B66\u544A: -warn.unexpected.class=\u30D0\u30A4\u30CA\u30EA\u30FB\u30D5\u30A1\u30A4\u30EB{0}\u306B{1}\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059 - -note.prefix=\u6CE8: - -main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-help\u3092\u4F7F\u7528\u3057\u307E\u3059 - -main.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059: - - -main.opt.help=\ -help --help -? \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B - -main.opt.version=\ -version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831 - -main.opt.v=\ -v -verbose \u8FFD\u52A0\u60C5\u5831\u3092\u51FA\u529B\u3059\u308B - -main.opt.l=\ -l \u884C\u756A\u53F7\u3068\u30ED\u30FC\u30AB\u30EB\u5909\u6570\u8868\u3092\u51FA\u529B\u3059\u308B - -main.opt.public=\ -public public\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B - -main.opt.protected=\ -protected protected/public\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B - -main.opt.package=\ -package package/protected/public\u30AF\u30E9\u30B9\u304A\u3088\u3073\n \u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8) - -main.opt.p=\ -p -private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B - -main.opt.c=\ -c \u30B3\u30FC\u30C9\u3092\u9006\u30A2\u30BB\u30F3\u30D6\u30EB\u3059\u308B - -main.opt.s=\ -s \u5185\u90E8\u30BF\u30A4\u30D7\u7F72\u540D\u3092\u51FA\u529B\u3059\u308B - -main.opt.classpath=\ -classpath <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B - -main.opt.cp=\ -cp <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B - -main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B - -main.opt.constants=\ -constants \u9759\u7684final\u5B9A\u6570\u3092\u8868\u793A\u3059\u308B - - -main.opt.sysinfo=\ -sysinfo \u51E6\u7406\u3057\u3066\u3044\u308B\u30AF\u30E9\u30B9\u306E\u30B7\u30B9\u30C6\u30E0\u60C5\u5831(\u30D1\u30B9\u3001\u30B5\u30A4\u30BA\u3001\u65E5\u4ED8\u3001MD5\u30CF\u30C3\u30B7\u30E5)\n \u3092\u8868\u793A\u3059\u308B
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ - -err.prefix=\u9519\u8BEF: - -err.bad.constant.pool=\u8BFB\u53D6{0}\u7684\u5E38\u91CF\u6C60\u65F6\u51FA\u9519: {1} -err.class.not.found=\u627E\u4E0D\u5230\u7C7B: {0} -err.crash=\u51FA\u73B0\u4E25\u91CD\u7684\u5185\u90E8\u9519\u8BEF: {0}\n\u8BF7\u5EFA\u7ACB Bug \u62A5\u544A, \u5E76\u5305\u62EC\u4EE5\u4E0B\u4FE1\u606F:\n{1} -err.end.of.file=\u8BFB\u53D6{0}\u65F6\u51FA\u73B0\u610F\u5916\u7684\u6587\u4EF6\u7ED3\u5C3E -err.file.not.found=\u627E\u4E0D\u5230\u6587\u4EF6: {0} -err.h.not.supported=-h \u4E0D\u518D\u53EF\u7528 - \u8BF7\u4F7F\u7528 'javah' \u7A0B\u5E8F -err.incompatible.options=\u9009\u9879\u7EC4\u5408\u9519\u8BEF: {0} -err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2} -err.invalid.arg.for.option=\u9009\u9879\u7684\u53C2\u6570\u65E0\u6548: {0} -err.ioerror=\u8BFB\u53D6{0}\u65F6\u51FA\u73B0 IO \u9519\u8BEF: {1} -err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C -err.no.classes.specified=\u672A\u6307\u5B9A\u7C7B -err.not.standard.file.manager=\u4F7F\u7528\u6807\u51C6\u6587\u4EF6\u7BA1\u7406\u5668\u65F6\u53EA\u80FD\u6307\u5B9A\u7C7B\u6587\u4EF6 -err.unknown.option=\u672A\u77E5\u9009\u9879: {0} -err.verify.not.supported=\u4E0D\u652F\u6301 -verify -err.no.SourceFile.attribute=\u6CA1\u6709 SourceFile \u5C5E\u6027 -err.source.file.not.found=\u627E\u4E0D\u5230\u6E90\u6587\u4EF6 -err.bad.innerclasses.attribute={0}\u7684 InnerClasses \u5C5E\u6027\u9519\u8BEF -warn.Xold.not.supported=-Xold \u4E0D\u518D\u53EF\u7528 - -main.usage.summary=\u7528\u6CD5: {0} <options> <classes>\n\u4F7F\u7528 -help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 - -warn.prefix=\u8B66\u544A: -warn.unexpected.class=\u4E8C\u8FDB\u5236\u6587\u4EF6{0}\u5305\u542B{1} - -note.prefix=\u6CE8: - -main.usage.summary=\u7528\u6CD5: {0} <options> <classes>\n\u4F7F\u7528 -help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 - -main.usage=\u7528\u6CD5: {0} <options> <classes>\n\u5176\u4E2D, \u53EF\u80FD\u7684\u9009\u9879\u5305\u62EC: - - -main.opt.help=\ -help --help -? \u8F93\u51FA\u6B64\u7528\u6CD5\u6D88\u606F - -main.opt.version=\ -version \u7248\u672C\u4FE1\u606F - -main.opt.v=\ -v -verbose \u8F93\u51FA\u9644\u52A0\u4FE1\u606F - -main.opt.l=\ -l \u8F93\u51FA\u884C\u53F7\u548C\u672C\u5730\u53D8\u91CF\u8868 - -main.opt.public=\ -public \u4EC5\u663E\u793A\u516C\u5171\u7C7B\u548C\u6210\u5458 - -main.opt.protected=\ -protected \u663E\u793A\u53D7\u4FDD\u62A4\u7684/\u516C\u5171\u7C7B\u548C\u6210\u5458 - -main.opt.package=\ -package \u663E\u793A\u7A0B\u5E8F\u5305/\u53D7\u4FDD\u62A4\u7684/\u516C\u5171\u7C7B\n \u548C\u6210\u5458 (\u9ED8\u8BA4) - -main.opt.p=\ -p -private \u663E\u793A\u6240\u6709\u7C7B\u548C\u6210\u5458 - -main.opt.c=\ -c \u5BF9\u4EE3\u7801\u8FDB\u884C\u53CD\u6C47\u7F16 - -main.opt.s=\ -s \u8F93\u51FA\u5185\u90E8\u7C7B\u578B\u7B7E\u540D - -main.opt.classpath=\ -classpath <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E - -main.opt.cp=\ -cp <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E - -main.opt.bootclasspath=\ -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E - -main.opt.constants=\ -constants \u663E\u793A\u9759\u6001\u6700\u7EC8\u5E38\u91CF - - -main.opt.sysinfo=\ -sysinfo \u663E\u793A\u6B63\u5728\u5904\u7406\u7684\u7C7B\u7684\n \u7CFB\u7EDF\u4FE1\u606F (\u8DEF\u5F84, \u5927\u5C0F, \u65E5\u671F, MD5 \u6563\u5217)
--- a/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/version.properties-template Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -# -# Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -jdk=$(JDK_VERSION) -full=$(FULL_VERSION) -release=$(RELEASE)
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/Analyzer.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,442 +0,0 @@ -/* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import java.io.PrintStream; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import com.sun.tools.classfile.Dependency.Location; - -/** - * Dependency Analyzer. - */ -public class Analyzer { - /** - * Type of the dependency analysis. Appropriate level of data - * will be stored. - */ - public enum Type { - SUMMARY, - PACKAGE, - CLASS, - VERBOSE - } - - /** - * Filter to be applied when analyzing the dependencies from the given archives. - * Only the accepted dependencies are recorded. - */ - interface Filter { - boolean accepts(Location origin, Archive originArchive, Location target, Archive targetArchive); - } - - protected final Type type; - protected final Filter filter; - protected final Map<Archive, ArchiveDeps> results = new HashMap<>(); - protected final Map<Location, Archive> map = new HashMap<>(); - private static final Archive NOT_FOUND - = new Archive(JdepsTask.getMessage("artifact.not.found")); - - /** - * Constructs an Analyzer instance. - * - * @param type Type of the dependency analysis - * @param filter - */ - public Analyzer(Type type, Filter filter) { - this.type = type; - this.filter = filter; - } - - /** - * Performs the dependency analysis on the given archives. - */ - public boolean run(List<Archive> archives) { - // build a map from Location to Archive - buildLocationArchiveMap(archives); - - // traverse and analyze all dependencies - for (Archive archive : archives) { - ArchiveDeps deps = new ArchiveDeps(archive, type); - archive.visitDependences(deps); - results.put(archive, deps); - } - return true; - } - - protected void buildLocationArchiveMap(List<Archive> archives) { - // build a map from Location to Archive - for (Archive archive: archives) { - for (Location l: archive.getClasses()) { - if (!map.containsKey(l)) { - map.put(l, archive); - } else { - // duplicated class warning? - } - } - } - } - - public boolean hasDependences(Archive archive) { - if (results.containsKey(archive)) { - return results.get(archive).dependencies().size() > 0; - } - return false; - } - - public Set<String> dependences(Archive source) { - ArchiveDeps result = results.get(source); - return result.dependencies().stream() - .map(Dep::target) - .collect(Collectors.toSet()); - } - - public interface Visitor { - /** - * Visits a recorded dependency from origin to target which can be - * a fully-qualified classname, a package name, a module or - * archive name depending on the Analyzer's type. - */ - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive); - } - - /** - * Visit the dependencies of the given source. - * If the requested level is SUMMARY, it will visit the required archives list. - */ - public void visitDependences(Archive source, Visitor v, Type level) { - if (level == Type.SUMMARY) { - final ArchiveDeps result = results.get(source); - result.requires().stream() - .sorted(Comparator.comparing(Archive::getName)) - .forEach(archive -> { - Profile profile = result.getTargetProfile(archive); - v.visitDependence(source.getName(), source, - profile != null ? profile.profileName() : archive.getName(), archive); - }); - } else { - ArchiveDeps result = results.get(source); - if (level != type) { - // requesting different level of analysis - result = new ArchiveDeps(source, level); - source.visitDependences(result); - } - result.dependencies().stream() - .sorted(Comparator.comparing(Dep::origin) - .thenComparing(Dep::target)) - .forEach(d -> v.visitDependence(d.origin(), d.originArchive(), d.target(), d.targetArchive())); - } - } - - public void visitDependences(Archive source, Visitor v) { - visitDependences(source, v, type); - } - - /** - * ArchiveDeps contains the dependencies for an Archive that can have one or - * more classes. - */ - class ArchiveDeps implements Archive.Visitor { - protected final Archive archive; - protected final Set<Archive> requires; - protected final Set<Dep> deps; - protected final Type level; - private Profile profile; - ArchiveDeps(Archive archive, Type level) { - this.archive = archive; - this.deps = new HashSet<>(); - this.requires = new HashSet<>(); - this.level = level; - } - - Set<Dep> dependencies() { - return deps; - } - - Set<Archive> requires() { - return requires; - } - - Profile getTargetProfile(Archive target) { - if (target instanceof Module) { - return Profile.getProfile((Module) target); - } else { - return null; - } - } - - Archive findArchive(Location t) { - Archive target = archive.getClasses().contains(t) ? archive : map.get(t); - if (target == null) { - map.put(t, target = NOT_FOUND); - } - return target; - } - - // return classname or package name depedning on the level - private String getLocationName(Location o) { - if (level == Type.CLASS || level == Type.VERBOSE) { - return o.getClassName(); - } else { - String pkg = o.getPackageName(); - return pkg.isEmpty() ? "<unnamed>" : pkg; - } - } - - @Override - public void visit(Location o, Location t) { - Archive targetArchive = findArchive(t); - if (filter.accepts(o, archive, t, targetArchive)) { - addDep(o, t); - if (archive != targetArchive && !requires.contains(targetArchive)) { - requires.add(targetArchive); - } - } - if (targetArchive instanceof Module) { - Profile p = Profile.getProfile(t.getPackageName()); - if (profile == null || (p != null && p.compareTo(profile) > 0)) { - profile = p; - } - } - } - - private Dep curDep; - protected Dep addDep(Location o, Location t) { - String origin = getLocationName(o); - String target = getLocationName(t); - Archive targetArchive = findArchive(t); - if (curDep != null && - curDep.origin().equals(origin) && - curDep.originArchive() == archive && - curDep.target().equals(target) && - curDep.targetArchive() == targetArchive) { - return curDep; - } - - Dep e = new Dep(origin, archive, target, targetArchive); - if (deps.contains(e)) { - for (Dep e1 : deps) { - if (e.equals(e1)) { - curDep = e1; - } - } - } else { - deps.add(e); - curDep = e; - } - return curDep; - } - } - - /* - * Class-level or package-level dependency - */ - class Dep { - final String origin; - final Archive originArchive; - final String target; - final Archive targetArchive; - - Dep(String origin, Archive originArchive, String target, Archive targetArchive) { - this.origin = origin; - this.originArchive = originArchive; - this.target = target; - this.targetArchive = targetArchive; - } - - String origin() { - return origin; - } - - Archive originArchive() { - return originArchive; - } - - String target() { - return target; - } - - Archive targetArchive() { - return targetArchive; - } - - @Override - @SuppressWarnings("unchecked") - public boolean equals(Object o) { - if (o instanceof Dep) { - Dep d = (Dep) o; - return this.origin.equals(d.origin) && - this.originArchive == d.originArchive && - this.target.equals(d.target) && - this.targetArchive == d.targetArchive; - } - return false; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 67*hash + Objects.hashCode(this.origin) - + Objects.hashCode(this.originArchive) - + Objects.hashCode(this.target) - + Objects.hashCode(this.targetArchive); - return hash; - } - - public String toString() { - return String.format("%s (%s) -> %s (%s)%n", - origin, originArchive.getName(), - target, targetArchive.getName()); - } - } - - static Analyzer getExportedAPIsAnalyzer() { - return new ModuleAccessAnalyzer(ModuleAccessAnalyzer.reexportsFilter, true); - } - - static Analyzer getModuleAccessAnalyzer() { - return new ModuleAccessAnalyzer(ModuleAccessAnalyzer.accessCheckFilter, false); - } - - private static class ModuleAccessAnalyzer extends Analyzer { - private final boolean apionly; - ModuleAccessAnalyzer(Filter filter, boolean apionly) { - super(Type.VERBOSE, filter); - this.apionly = apionly; - } - /** - * Verify module access - */ - public boolean run(List<Archive> archives) { - // build a map from Location to Archive - buildLocationArchiveMap(archives); - - // traverse and analyze all dependencies - int count = 0; - for (Archive archive : archives) { - ArchiveDeps checker = new ArchiveDeps(archive, type); - archive.visitDependences(checker); - count += checker.dependencies().size(); - // output if any error - Module m = (Module)archive; - printDependences(System.err, m, checker.dependencies()); - results.put(archive, checker); - } - return count == 0; - } - - private void printDependences(PrintStream out, Module m, Set<Dep> deps) { - if (deps.isEmpty()) - return; - - String msg = apionly ? "API reference:" : "inaccessible reference:"; - deps.stream().sorted(Comparator.comparing(Dep::origin) - .thenComparing(Dep::target)) - .forEach(d -> out.format("%s %s (%s) -> %s (%s)%n", msg, - d.origin(), d.originArchive().getName(), - d.target(), d.targetArchive().getName())); - if (apionly) { - out.format("Dependences missing re-exports=\"true\" attribute:%n"); - deps.stream() - .map(Dep::targetArchive) - .map(Archive::getName) - .distinct() - .sorted() - .forEach(d -> out.format(" %s -> %s%n", m.name(), d)); - } - } - - private static Module findModule(Archive archive) { - if (Module.class.isInstance(archive)) { - return (Module) archive; - } else { - return null; - } - } - - // returns true if target is accessible by origin - private static boolean canAccess(Location o, Archive originArchive, Location t, Archive targetArchive) { - Module origin = findModule(originArchive); - Module target = findModule(targetArchive); - - if (targetArchive == Analyzer.NOT_FOUND) { - return false; - } - - // unnamed module - // ## should check public type? - if (target == null) - return true; - - // module-private - if (origin == target) - return true; - - return target.isAccessibleTo(t.getClassName(), origin); - } - - static final Filter accessCheckFilter = new Filter() { - @Override - public boolean accepts(Location o, Archive originArchive, Location t, Archive targetArchive) { - return !canAccess(o, originArchive, t, targetArchive); - } - }; - - static final Filter reexportsFilter = new Filter() { - @Override - public boolean accepts(Location o, Archive originArchive, Location t, Archive targetArchive) { - Module origin = findModule(originArchive); - Module target = findModule(targetArchive); - if (!origin.isExportedPackage(o.getPackageName())) { - // filter non-exported classes - return false; - } - - boolean accessible = canAccess(o, originArchive, t, targetArchive); - if (!accessible) - return true; - - String mn = target.name(); - // skip checking re-exports for java.base - if (origin == target || "java.base".equals(mn)) - return false; - - assert origin.requires().containsKey(mn); // otherwise, should not be accessible - if (origin.requires().get(mn)) { - return false; - } - return true; - } - }; - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/Archive.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.Dependency.Location; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.Path; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Represents the source of the class files. - */ -public class Archive { - public static Archive getInstance(Path p) { - try { - return new Archive(p, ClassFileReader.newInstance(p)); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - private final Path path; - private final String filename; - private final ClassFileReader reader; - protected Map<Location, Set<Location>> deps = new ConcurrentHashMap<>(); - - protected Archive(String name) { - this(name, null); - } - protected Archive(String name, ClassFileReader reader) { - this.path = null; - this.filename = name; - this.reader = reader; - } - protected Archive(Path p, ClassFileReader reader) { - this.path = p; - this.filename = path.getFileName().toString(); - this.reader = reader; - } - - public ClassFileReader reader() { - return reader; - } - - public String getName() { - return filename; - } - - public void addClass(Location origin) { - deps.computeIfAbsent(origin, _k -> new HashSet<>()); - } - - public void addClass(Location origin, Location target) { - deps.computeIfAbsent(origin, _k -> new HashSet<>()).add(target); - } - - public Set<Location> getClasses() { - return deps.keySet(); - } - - public void visitDependences(Visitor v) { - for (Map.Entry<Location,Set<Location>> e: deps.entrySet()) { - for (Location target : e.getValue()) { - v.visit(e.getKey(), target); - } - } - } - - public boolean isEmpty() { - return getClasses().isEmpty(); - } - - public String getPathName() { - return path != null ? path.toString() : filename; - } - - public String toString() { - return filename; - } - - public Path path() { - return path; - } - - interface Visitor { - void visit(Location origin, Location target); - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/ClassFileReader.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,398 +0,0 @@ -/* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Dependencies.ClassFileError; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * ClassFileReader reads ClassFile(s) of a given path that can be - * a .class file, a directory, or a JAR file. - */ -public class ClassFileReader { - /** - * Returns a ClassFileReader instance of a given path. - */ - public static ClassFileReader newInstance(Path path) throws IOException { - if (!Files.exists(path)) { - throw new FileNotFoundException(path.toString()); - } - - if (Files.isDirectory(path)) { - return new DirectoryReader(path); - } else if (path.getFileName().toString().endsWith(".jar")) { - return new JarFileReader(path); - } else { - return new ClassFileReader(path); - } - } - - /** - * Returns a ClassFileReader instance of a given JarFile. - */ - public static ClassFileReader newInstance(Path path, JarFile jf) throws IOException { - return new JarFileReader(path, jf); - } - - protected final Path path; - protected final String baseFileName; - protected final List<String> skippedEntries = new ArrayList<>(); - protected ClassFileReader(Path path) { - this.path = path; - this.baseFileName = path.getFileName() != null - ? path.getFileName().toString() - : path.toString(); - } - - public String getFileName() { - return baseFileName; - } - - public List<String> skippedEntries() { - return skippedEntries; - } - - /** - * Returns the ClassFile matching the given binary name - * or a fully-qualified class name. - */ - public ClassFile getClassFile(String name) throws IOException { - if (name.indexOf('.') > 0) { - int i = name.lastIndexOf('.'); - String pathname = name.replace('.', File.separatorChar) + ".class"; - if (baseFileName.equals(pathname) || - baseFileName.equals(pathname.substring(0, i) + "$" + - pathname.substring(i+1, pathname.length()))) { - return readClassFile(path); - } - } else { - if (baseFileName.equals(name.replace('/', File.separatorChar) + ".class")) { - return readClassFile(path); - } - } - return null; - } - - public Iterable<ClassFile> getClassFiles() throws IOException { - return new Iterable<ClassFile>() { - public Iterator<ClassFile> iterator() { - return new FileIterator(); - } - }; - } - - protected ClassFile readClassFile(Path p) throws IOException { - InputStream is = null; - try { - is = Files.newInputStream(p); - return ClassFile.read(is); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } finally { - if (is != null) { - is.close(); - } - } - } - - class FileIterator implements Iterator<ClassFile> { - int count; - FileIterator() { - this.count = 0; - } - public boolean hasNext() { - return count == 0 && baseFileName.endsWith(".class"); - } - - public ClassFile next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - try { - ClassFile cf = readClassFile(path); - count++; - return cf; - } catch (IOException e) { - throw new ClassFileError(e); - } - } - - public void remove() { - throw new UnsupportedOperationException("Not supported yet."); - } - } - - public String toString() { - return path.toString(); - } - - private static class DirectoryReader extends ClassFileReader { - protected final String fsSep; - DirectoryReader(Path path) throws IOException { - this(FileSystems.getDefault(), path); - } - DirectoryReader(FileSystem fs, Path path) throws IOException { - super(path); - this.fsSep = fs.getSeparator(); - } - - public ClassFile getClassFile(String name) throws IOException { - if (name.indexOf('.') > 0) { - int i = name.lastIndexOf('.'); - String pathname = name.replace(".", fsSep) + ".class"; - Path p = path.resolve(pathname); - if (!Files.exists(p)) { - p = path.resolve(pathname.substring(0, i) + "$" + - pathname.substring(i+1, pathname.length())); - } - if (Files.exists(p)) { - return readClassFile(p); - } - } else { - Path p = path.resolve(name + ".class"); - if (Files.exists(p)) { - return readClassFile(p); - } - } - return null; - } - - public Iterable<ClassFile> getClassFiles() throws IOException { - final Iterator<ClassFile> iter = new DirectoryIterator(); - return new Iterable<ClassFile>() { - public Iterator<ClassFile> iterator() { - return iter; - } - }; - } - - private List<Path> entries; - protected synchronized List<Path> walkTree() throws IOException { - if (entries == null) { - entries = new ArrayList<>(); - Files.walkFileTree(path, new SimpleFileVisitor<Path>() { - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - if (file.getFileName().toString().endsWith(".class")) { - entries.add(file); - } - return FileVisitResult.CONTINUE; - } - }); - } - return entries; - } - - class DirectoryIterator implements Iterator<ClassFile> { - private List<Path> entries; - private int index = 0; - DirectoryIterator() throws IOException { - entries = walkTree(); - index = 0; - } - - public boolean hasNext() { - return index != entries.size(); - } - - public ClassFile next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - Path path = entries.get(index++); - try { - return readClassFile(path); - } catch (IOException e) { - throw new ClassFileError(e); - } - } - - public void remove() { - throw new UnsupportedOperationException("Not supported yet."); - } - } - } - - static class JarFileReader extends ClassFileReader { - private final JarFile jarfile; - JarFileReader(Path path) throws IOException { - this(path, new JarFile(path.toFile(), false)); - } - - JarFileReader(Path path, JarFile jf) throws IOException { - super(path); - this.jarfile = jf; - } - - public ClassFile getClassFile(String name) throws IOException { - if (name.indexOf('.') > 0) { - int i = name.lastIndexOf('.'); - String entryName = name.replace('.', '/') + ".class"; - JarEntry e = jarfile.getJarEntry(entryName); - if (e == null) { - e = jarfile.getJarEntry(entryName.substring(0, i) + "$" - + entryName.substring(i + 1, entryName.length())); - } - if (e != null) { - return readClassFile(jarfile, e); - } - } else { - JarEntry e = jarfile.getJarEntry(name + ".class"); - if (e != null) { - return readClassFile(jarfile, e); - } - } - return null; - } - - protected ClassFile readClassFile(JarFile jarfile, JarEntry e) throws IOException { - InputStream is = null; - try { - is = jarfile.getInputStream(e); - return ClassFile.read(is); - } catch (ConstantPoolException ex) { - throw new ClassFileError(ex); - } finally { - if (is != null) - is.close(); - } - } - - public Iterable<ClassFile> getClassFiles() throws IOException { - final Iterator<ClassFile> iter = new JarFileIterator(this, jarfile); - return new Iterable<ClassFile>() { - public Iterator<ClassFile> iterator() { - return iter; - } - }; - } - } - - class JarFileIterator implements Iterator<ClassFile> { - protected final JarFileReader reader; - protected Enumeration<JarEntry> entries; - protected JarFile jf; - protected JarEntry nextEntry; - protected ClassFile cf; - JarFileIterator(JarFileReader reader) { - this(reader, null); - } - JarFileIterator(JarFileReader reader, JarFile jarfile) { - this.reader = reader; - setJarFile(jarfile); - } - - void setJarFile(JarFile jarfile) { - if (jarfile == null) return; - - this.jf = jarfile; - this.entries = jf.entries(); - this.nextEntry = nextEntry(); - } - - public boolean hasNext() { - if (nextEntry != null && cf != null) { - return true; - } - while (nextEntry != null) { - try { - cf = reader.readClassFile(jf, nextEntry); - return true; - } catch (ClassFileError | IOException ex) { - skippedEntries.add(nextEntry.getName()); - } - nextEntry = nextEntry(); - } - return false; - } - - public ClassFile next() { - if (!hasNext()) { - throw new NoSuchElementException(); - } - ClassFile classFile = cf; - cf = null; - nextEntry = nextEntry(); - return classFile; - } - - protected JarEntry nextEntry() { - while (entries.hasMoreElements()) { - JarEntry e = entries.nextElement(); - String name = e.getName(); - if (name.endsWith(".class")) { - return e; - } - } - return null; - } - - public void remove() { - throw new UnsupportedOperationException("Not supported yet."); - } - } - - /** - * ClassFileReader for modules. - */ - static class ModuleClassReader extends DirectoryReader { - final String modulename; - ModuleClassReader(FileSystem fs, String mn, Path root) throws IOException { - super(fs, root); - this.modulename = mn; - } - - public Set<String> packages() throws IOException { - return walkTree().stream() - .map(this::toPackageName) - .sorted() - .collect(Collectors.toSet()); - } - - String toPackageName(Path p) { - if (p.getParent() == null) { - return ""; - } - return path.relativize(p.getParent()).toString().replace(fsSep, "."); - } - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/JdepsTask.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1099 +0,0 @@ -/* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import com.sun.tools.classfile.AccessFlags; -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.classfile.ConstantPoolException; -import com.sun.tools.classfile.Dependencies; -import com.sun.tools.classfile.Dependencies.ClassFileError; -import com.sun.tools.classfile.Dependency; -import com.sun.tools.classfile.Dependency.Location; -import static com.sun.tools.jdeps.Analyzer.Type.*; -import java.io.*; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.text.MessageFormat; -import java.util.*; -import java.util.regex.Pattern; - -/** - * Implementation for the jdeps tool for static class dependency analysis. - */ -class JdepsTask { - static class BadArgs extends Exception { - static final long serialVersionUID = 8765093759964640721L; - BadArgs(String key, Object... args) { - super(JdepsTask.getMessage(key, args)); - this.key = key; - this.args = args; - } - - BadArgs showUsage(boolean b) { - showUsage = b; - return this; - } - final String key; - final Object[] args; - boolean showUsage; - } - - static abstract class Option { - Option(boolean hasArg, String... aliases) { - this.hasArg = hasArg; - this.aliases = aliases; - } - - boolean isHidden() { - return false; - } - - boolean matches(String opt) { - for (String a : aliases) { - if (a.equals(opt)) - return true; - if (hasArg && opt.startsWith(a + "=")) - return true; - } - return false; - } - - boolean ignoreRest() { - return false; - } - - abstract void process(JdepsTask task, String opt, String arg) throws BadArgs; - final boolean hasArg; - final String[] aliases; - } - - static abstract class HiddenOption extends Option { - HiddenOption(boolean hasArg, String... aliases) { - super(hasArg, aliases); - } - - boolean isHidden() { - return true; - } - } - - static Option[] recognizedOptions = { - new Option(false, "-h", "-?", "-help") { - void process(JdepsTask task, String opt, String arg) { - task.options.help = true; - } - }, - new Option(true, "-dotoutput") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - Path p = Paths.get(arg); - if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) { - throw new BadArgs("err.invalid.path", arg); - } - task.options.dotOutputDir = arg; - } - }, - new Option(false, "-s", "-summary") { - void process(JdepsTask task, String opt, String arg) { - task.options.showSummary = true; - task.options.verbose = SUMMARY; - } - }, - new Option(false, "-v", "-verbose", - "-verbose:package", - "-verbose:class") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - switch (opt) { - case "-v": - case "-verbose": - task.options.verbose = VERBOSE; - task.options.filterSameArchive = false; - task.options.filterSamePackage = false; - break; - case "-verbose:package": - task.options.verbose = PACKAGE; - break; - case "-verbose:class": - task.options.verbose = CLASS; - break; - default: - throw new BadArgs("err.invalid.arg.for.option", opt); - } - } - }, - new Option(true, "-cp", "-classpath") { - void process(JdepsTask task, String opt, String arg) { - task.options.classpath = arg; - } - }, - new Option(true, "-p", "-package") { - void process(JdepsTask task, String opt, String arg) { - task.options.packageNames.add(arg); - } - }, - new Option(true, "-e", "-regex") { - void process(JdepsTask task, String opt, String arg) { - task.options.regex = arg; - } - }, - - new Option(true, "-f", "-filter") { - void process(JdepsTask task, String opt, String arg) { - task.options.filterRegex = arg; - } - }, - new Option(false, "-filter:package", - "-filter:archive", - "-filter:none") { - void process(JdepsTask task, String opt, String arg) { - switch (opt) { - case "-filter:package": - task.options.filterSamePackage = true; - task.options.filterSameArchive = false; - break; - case "-filter:archive": - task.options.filterSameArchive = true; - task.options.filterSamePackage = false; - break; - case "-filter:none": - task.options.filterSameArchive = false; - task.options.filterSamePackage = false; - break; - } - } - }, - new Option(true, "-include") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.includePattern = Pattern.compile(arg); - } - }, - new Option(false, "-P", "-profile") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.showProfile = true; - task.options.showModule = false; - } - }, - new Option(false, "-M", "-module") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.showModule = true; - task.options.showProfile = false; - } - }, - new Option(false, "-apionly") { - void process(JdepsTask task, String opt, String arg) { - task.options.apiOnly = true; - } - }, - new Option(false, "-R", "-recursive") { - void process(JdepsTask task, String opt, String arg) { - task.options.depth = 0; - // turn off filtering - task.options.filterSameArchive = false; - task.options.filterSamePackage = false; - } - }, - new Option(false, "-jdkinternals") { - void process(JdepsTask task, String opt, String arg) { - task.options.findJDKInternals = true; - task.options.verbose = CLASS; - if (task.options.includePattern == null) { - task.options.includePattern = Pattern.compile(".*"); - } - } - }, - new HiddenOption(false, "-verify:access") { - void process(JdepsTask task, String opt, String arg) { - task.options.verifyAccess = true; - task.options.verbose = VERBOSE; - task.options.filterSameArchive = false; - task.options.filterSamePackage = false; - } - }, - new HiddenOption(true, "-mp") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - task.options.mpath = Paths.get(arg); - if (!Files.isDirectory(task.options.mpath)) { - throw new BadArgs("err.invalid.path", arg); - } - if (task.options.includePattern == null) { - task.options.includePattern = Pattern.compile(".*"); - } - } - }, - new Option(false, "-version") { - void process(JdepsTask task, String opt, String arg) { - task.options.version = true; - } - }, - new HiddenOption(false, "-fullversion") { - void process(JdepsTask task, String opt, String arg) { - task.options.fullVersion = true; - } - }, - new HiddenOption(false, "-showlabel") { - void process(JdepsTask task, String opt, String arg) { - task.options.showLabel = true; - } - }, - new HiddenOption(false, "-q", "-quiet") { - void process(JdepsTask task, String opt, String arg) { - task.options.nowarning = true; - } - }, - new HiddenOption(true, "-depth") { - void process(JdepsTask task, String opt, String arg) throws BadArgs { - try { - task.options.depth = Integer.parseInt(arg); - } catch (NumberFormatException e) { - throw new BadArgs("err.invalid.arg.for.option", opt); - } - } - }, - }; - - private static final String PROGNAME = "jdeps"; - private final Options options = new Options(); - private final List<String> classes = new ArrayList<>(); - - private PrintWriter log; - void setLog(PrintWriter out) { - log = out; - } - - /** - * Result codes. - */ - static final int EXIT_OK = 0, // Completed with no errors. - EXIT_ERROR = 1, // Completed but reported errors. - EXIT_CMDERR = 2, // Bad command-line arguments - EXIT_SYSERR = 3, // System error or resource exhaustion. - EXIT_ABNORMAL = 4;// terminated abnormally - - int run(String[] args) { - if (log == null) { - log = new PrintWriter(System.out); - } - try { - handleOptions(args); - if (options.help) { - showHelp(); - } - if (options.version || options.fullVersion) { - showVersion(options.fullVersion); - } - if (classes.isEmpty() && options.includePattern == null) { - if (options.help || options.version || options.fullVersion) { - return EXIT_OK; - } else { - showHelp(); - return EXIT_CMDERR; - } - } - if (options.regex != null && options.packageNames.size() > 0) { - showHelp(); - return EXIT_CMDERR; - } - if ((options.findJDKInternals || options.verifyAccess) && - (options.regex != null || options.packageNames.size() > 0 || options.showSummary)) { - showHelp(); - return EXIT_CMDERR; - } - if (options.showSummary && options.verbose != SUMMARY) { - showHelp(); - return EXIT_CMDERR; - } - - boolean ok = run(); - return ok ? EXIT_OK : EXIT_ERROR; - } catch (BadArgs e) { - reportError(e.key, e.args); - if (e.showUsage) { - log.println(getMessage("main.usage.summary", PROGNAME)); - } - return EXIT_CMDERR; - } catch (IOException e) { - return EXIT_ABNORMAL; - } finally { - log.flush(); - } - } - - private final List<Archive> sourceLocations = new ArrayList<>(); - private final List<Archive> classpaths = new ArrayList<>(); - private final List<Archive> initialArchives = new ArrayList<>(); - private boolean run() throws IOException { - buildArchives(); - - if (options.verifyAccess) { - return verifyModuleAccess(); - } else { - return analyzeDeps(); - } - } - - private boolean analyzeDeps() throws IOException { - Analyzer analyzer = new Analyzer(options.verbose, new Analyzer.Filter() { - @Override - public boolean accepts(Location origin, Archive originArchive, - Location target, Archive targetArchive) - { - if (options.findJDKInternals) { - // accepts target that is JDK class but not exported - return isJDKModule(targetArchive) && - !((Module) targetArchive).isExported(target.getClassName()); - } else if (options.filterSameArchive) { - // accepts origin and target that from different archive - return originArchive != targetArchive; - } - return true; - } - }); - - // parse classfiles and find all dependencies - findDependencies(options.apiOnly); - - // analyze the dependencies - analyzer.run(sourceLocations); - - // output result - if (options.dotOutputDir != null) { - Path dir = Paths.get(options.dotOutputDir); - Files.createDirectories(dir); - generateDotFiles(dir, analyzer); - } else { - printRawOutput(log, analyzer); - } - - if (options.findJDKInternals && !options.nowarning) { - showReplacements(analyzer); - } - return true; - } - - private boolean verifyModuleAccess() throws IOException { - // two passes - // 1. check API dependences where the types of dependences must be re-exported - // 2. check all dependences where types must be accessible - - // pass 1 - findDependencies(true /* api only */); - Analyzer analyzer = Analyzer.getExportedAPIsAnalyzer(); - boolean pass1 = analyzer.run(sourceLocations); - if (!pass1) { - System.out.println("ERROR: Failed API access verification"); - } - // pass 2 - findDependencies(false); - analyzer = Analyzer.getModuleAccessAnalyzer(); - boolean pass2 = analyzer.run(sourceLocations); - if (!pass2) { - System.out.println("ERROR: Failed module access verification"); - } - if (pass1 & pass2) { - System.out.println("Access verification succeeded."); - } - return pass1 & pass2; - } - - private void generateSummaryDotFile(Path dir, Analyzer analyzer) throws IOException { - // If verbose mode (-v or -verbose option), - // the summary.dot file shows package-level dependencies. - Analyzer.Type summaryType = - (options.verbose == PACKAGE || options.verbose == SUMMARY) ? SUMMARY : PACKAGE; - Path summary = dir.resolve("summary.dot"); - try (PrintWriter sw = new PrintWriter(Files.newOutputStream(summary)); - SummaryDotFile dotfile = new SummaryDotFile(sw, summaryType)) { - for (Archive archive : sourceLocations) { - if (!archive.isEmpty()) { - if (options.verbose == PACKAGE || options.verbose == SUMMARY) { - if (options.showLabel) { - // build labels listing package-level dependencies - analyzer.visitDependences(archive, dotfile.labelBuilder(), PACKAGE); - } - } - analyzer.visitDependences(archive, dotfile, summaryType); - } - } - } - } - - private void generateDotFiles(Path dir, Analyzer analyzer) throws IOException { - // output individual .dot file for each archive - if (options.verbose != SUMMARY) { - for (Archive archive : sourceLocations) { - if (analyzer.hasDependences(archive)) { - Path dotfile = dir.resolve(archive.getName() + ".dot"); - try (PrintWriter pw = new PrintWriter(Files.newOutputStream(dotfile)); - DotFileFormatter formatter = new DotFileFormatter(pw, archive)) { - analyzer.visitDependences(archive, formatter); - } - } - } - } - // generate summary dot file - generateSummaryDotFile(dir, analyzer); - } - - private void printRawOutput(PrintWriter writer, Analyzer analyzer) { - RawOutputFormatter depFormatter = new RawOutputFormatter(writer); - RawSummaryFormatter summaryFormatter = new RawSummaryFormatter(writer); - for (Archive archive : sourceLocations) { - if (!archive.isEmpty()) { - analyzer.visitDependences(archive, summaryFormatter, SUMMARY); - if (analyzer.hasDependences(archive) && options.verbose != SUMMARY) { - analyzer.visitDependences(archive, depFormatter); - } - } - } - } - - private boolean isValidClassName(String name) { - if (!Character.isJavaIdentifierStart(name.charAt(0))) { - return false; - } - for (int i=1; i < name.length(); i++) { - char c = name.charAt(i); - if (c != '.' && !Character.isJavaIdentifierPart(c)) { - return false; - } - } - return true; - } - - /* - * Dep Filter configured based on the input jdeps option - * 1. -p and -regex to match target dependencies - * 2. -filter:package to filter out same-package dependencies - * - * This filter is applied when jdeps parses the class files - * and filtered dependencies are not stored in the Analyzer. - * - * -filter:archive is applied later in the Analyzer as the - * containing archive of a target class may not be known until - * the entire archive - */ - class DependencyFilter implements Dependency.Filter { - final Dependency.Filter filter; - final Pattern filterPattern; - DependencyFilter() { - if (options.regex != null) { - this.filter = Dependencies.getRegexFilter(Pattern.compile(options.regex)); - } else if (options.packageNames.size() > 0) { - this.filter = Dependencies.getPackageFilter(options.packageNames, false); - } else { - this.filter = null; - } - - this.filterPattern = - options.filterRegex != null ? Pattern.compile(options.filterRegex) : null; - } - @Override - public boolean accepts(Dependency d) { - if (d.getOrigin().equals(d.getTarget())) { - return false; - } - String pn = d.getTarget().getPackageName(); - if (options.filterSamePackage && d.getOrigin().getPackageName().equals(pn)) { - return false; - } - - if (filterPattern != null && filterPattern.matcher(pn).matches()) { - return false; - } - return filter != null ? filter.accepts(d) : true; - } - } - - /** - * Tests if the given class matches the pattern given in the -include option - */ - private boolean matches(String classname) { - if (options.includePattern != null) { - return options.includePattern.matcher(classname.replace('/', '.')).matches(); - } else { - return true; - } - } - - private void buildArchives() throws IOException { - for (String s : classes) { - Path p = Paths.get(s); - if (Files.exists(p)) { - initialArchives.add(Archive.getInstance(p)); - } - } - sourceLocations.addAll(initialArchives); - - classpaths.addAll(getClassPathArchives(options.classpath)); - if (options.includePattern != null) { - initialArchives.addAll(classpaths); - } - classpaths.addAll(PlatformClassPath.getModules(options.mpath)); - if (options.mpath != null) { - initialArchives.addAll(PlatformClassPath.getModules(options.mpath)); - } else { - classpaths.addAll(PlatformClassPath.getJarFiles()); - } - // add all classpath archives to the source locations for reporting - sourceLocations.addAll(classpaths); - } - - private void findDependencies(boolean apiOnly) throws IOException { - Dependency.Finder finder = - apiOnly ? Dependencies.getAPIFinder(AccessFlags.ACC_PROTECTED) - : Dependencies.getClassDependencyFinder(); - Dependency.Filter filter = new DependencyFilter(); - - Deque<String> roots = new LinkedList<>(); - for (String s : classes) { - Path p = Paths.get(s); - if (!Files.exists(p)) { - if (isValidClassName(s)) { - roots.add(s); - } else { - warning("warn.invalid.arg", s); - } - } - } - - // Work queue of names of classfiles to be searched. - // Entries will be unique, and for classes that do not yet have - // dependencies in the results map. - Deque<String> deque = new LinkedList<>(); - Set<String> doneClasses = new HashSet<>(); - - // get the immediate dependencies of the input files - for (Archive a : initialArchives) { - for (ClassFile cf : a.reader().getClassFiles()) { - String classFileName; - try { - classFileName = cf.getName(); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - - // tests if this class matches the -include or -apiOnly option if specified - if (!matches(classFileName) || (apiOnly && !cf.access_flags.is(AccessFlags.ACC_PUBLIC))) { - continue; - } - - if (!doneClasses.contains(classFileName)) { - doneClasses.add(classFileName); - } - - for (Dependency d : finder.findDependencies(cf)) { - if (filter.accepts(d)) { - String cn = d.getTarget().getName(); - if (!doneClasses.contains(cn) && !deque.contains(cn)) { - deque.add(cn); - } - a.addClass(d.getOrigin(), d.getTarget()); - } else { - // ensure that the parsed class is added the archive - a.addClass(d.getOrigin()); - } - } - for (String name : a.reader().skippedEntries()) { - warning("warn.skipped.entry", name, a.getPathName()); - } - } - } - - // add Archive for looking up classes from the classpath - // for transitive dependency analysis - Deque<String> unresolved = roots; - int depth = options.depth > 0 ? options.depth : Integer.MAX_VALUE; - do { - String name; - while ((name = unresolved.poll()) != null) { - if (doneClasses.contains(name)) { - continue; - } - ClassFile cf = null; - for (Archive a : classpaths) { - cf = a.reader().getClassFile(name); - if (cf != null) { - String classFileName; - try { - classFileName = cf.getName(); - } catch (ConstantPoolException e) { - throw new ClassFileError(e); - } - if (!doneClasses.contains(classFileName)) { - // if name is a fully-qualified class name specified - // from command-line, this class might already be parsed - doneClasses.add(classFileName); - - for (Dependency d : finder.findDependencies(cf)) { - if (depth == 0) { - // ignore the dependency - a.addClass(d.getOrigin()); - break; - } else if (filter.accepts(d)) { - a.addClass(d.getOrigin(), d.getTarget()); - String cn = d.getTarget().getName(); - if (!doneClasses.contains(cn) && !deque.contains(cn)) { - deque.add(cn); - } - } else { - // ensure that the parsed class is added the archive - a.addClass(d.getOrigin()); - } - } - } - break; - } - } - if (cf == null) { - doneClasses.add(name); - } - } - unresolved = deque; - deque = new LinkedList<>(); - } while (!unresolved.isEmpty() && depth-- > 0); - } - - public void handleOptions(String[] args) throws BadArgs { - // process options - for (int i=0; i < args.length; i++) { - if (args[i].charAt(0) == '-') { - String name = args[i]; - Option option = getOption(name); - String param = null; - if (option.hasArg) { - if (name.startsWith("-") && name.indexOf('=') > 0) { - param = name.substring(name.indexOf('=') + 1, name.length()); - } else if (i + 1 < args.length) { - param = args[++i]; - } - if (param == null || param.isEmpty() || param.charAt(0) == '-') { - throw new BadArgs("err.missing.arg", name).showUsage(true); - } - } - option.process(this, name, param); - if (option.ignoreRest()) { - i = args.length; - } - } else { - // process rest of the input arguments - for (; i < args.length; i++) { - String name = args[i]; - if (name.charAt(0) == '-') { - throw new BadArgs("err.option.after.class", name).showUsage(true); - } - classes.add(name); - } - } - } - } - - private Option getOption(String name) throws BadArgs { - for (Option o : recognizedOptions) { - if (o.matches(name)) { - return o; - } - } - throw new BadArgs("err.unknown.option", name).showUsage(true); - } - - private void reportError(String key, Object... args) { - log.println(getMessage("error.prefix") + " " + getMessage(key, args)); - } - - private void warning(String key, Object... args) { - log.println(getMessage("warn.prefix") + " " + getMessage(key, args)); - } - - private void showHelp() { - log.println(getMessage("main.usage", PROGNAME)); - for (Option o : recognizedOptions) { - String name = o.aliases[0].substring(1); // there must always be at least one name - name = name.charAt(0) == '-' ? name.substring(1) : name; - if (o.isHidden() || name.equals("h") || name.startsWith("filter:")) { - continue; - } - log.println(getMessage("main.opt." + name)); - } - } - - private void showVersion(boolean full) { - log.println(version(full ? "full" : "release")); - } - - private String version(String key) { - // key=version: mm.nn.oo[-milestone] - // key=full: mm.mm.oo[-milestone]-build - if (ResourceBundleHelper.versionRB == null) { - return System.getProperty("java.version"); - } - try { - return ResourceBundleHelper.versionRB.getString(key); - } catch (MissingResourceException e) { - return getMessage("version.unknown", System.getProperty("java.version")); - } - } - - static String getMessage(String key, Object... args) { - try { - return MessageFormat.format(ResourceBundleHelper.bundle.getString(key), args); - } catch (MissingResourceException e) { - throw new InternalError("Missing message: " + key); - } - } - - private static class Options { - boolean help; - boolean version; - boolean fullVersion; - boolean showProfile; - boolean showModule; - boolean showSummary; - boolean apiOnly; - boolean showLabel; - boolean findJDKInternals; - boolean nowarning; - // default is to show package-level dependencies - // and filter references from same package - Analyzer.Type verbose = PACKAGE; - boolean filterSamePackage = true; - boolean filterSameArchive = false; - String filterRegex; - String dotOutputDir; - String classpath = ""; - int depth = 1; - Set<String> packageNames = new HashSet<>(); - String regex; // apply to the dependences - Pattern includePattern; // apply to classes - // module boundary access check - boolean verifyAccess; - Path mpath; - } - private static class ResourceBundleHelper { - static final ResourceBundle versionRB; - static final ResourceBundle bundle; - static final ResourceBundle jdkinternals; - - static { - Locale locale = Locale.getDefault(); - try { - bundle = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.jdeps", locale); - } catch (MissingResourceException e) { - throw new InternalError("Cannot find jdeps resource bundle for locale " + locale); - } - try { - versionRB = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.version"); - } catch (MissingResourceException e) { - throw new InternalError("version.resource.missing"); - } - try { - jdkinternals = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.jdkinternals"); - } catch (MissingResourceException e) { - throw new InternalError("Cannot find jdkinternals resource bundle"); - } - } - } - - /* - * Returns the list of Archive specified in cpaths and not included - * initialArchives - */ - private List<Archive> getClassPathArchives(String cpaths) - throws IOException - { - List<Archive> result = new ArrayList<>(); - if (cpaths.isEmpty()) { - return result; - } - List<Path> paths = new ArrayList<>(); - for (String p : cpaths.split(File.pathSeparator)) { - if (p.length() > 0) { - // wildcard to parse all JAR files e.g. -classpath dir/* - int i = p.lastIndexOf(".*"); - if (i > 0) { - Path dir = Paths.get(p.substring(0, i)); - try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.jar")) { - for (Path entry : stream) { - paths.add(entry); - } - } - } else { - paths.add(Paths.get(p)); - } - } - } - for (Path path : paths) { - boolean found = initialArchives.stream() - .map(Archive::path) - .anyMatch(p -> isSameFile(path, p)); - if (!found && Files.exists(path)) { - result.add(Archive.getInstance(path)); - } - } - return result; - } - - private boolean isSameFile(Path p1, Path p2) { - try { - return Files.isSameFile(p1, p2); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - class RawOutputFormatter implements Analyzer.Visitor { - private final PrintWriter writer; - private String pkg = ""; - RawOutputFormatter(PrintWriter writer) { - this.writer = writer; - } - @Override - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive) { - String tag = toTag(target, targetArchive); - if (options.verbose == VERBOSE) { - writer.format(" %-50s -> %-50s %s%n", origin, target, tag); - } else { - if (!origin.equals(pkg)) { - pkg = origin; - writer.format(" %s (%s)%n", origin, originArchive.getName()); - } - writer.format(" -> %-50s %s%n", target, tag); - } - } - } - - class RawSummaryFormatter implements Analyzer.Visitor { - private final PrintWriter writer; - RawSummaryFormatter(PrintWriter writer) { - this.writer = writer; - } - @Override - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive) { - String targetName = targetArchive.getPathName(); - if (options.showModule && isJDKModule(targetArchive)) { - targetName = ((Module)targetArchive).name(); - } - writer.format("%s -> %s", originArchive.getName(), targetName); - if (options.showProfile && isJDKModule(targetArchive)) { - writer.format(" (%s)", target); - } - writer.format("%n"); - } - } - - class DotFileFormatter implements Analyzer.Visitor, AutoCloseable { - private final PrintWriter writer; - private final String name; - DotFileFormatter(PrintWriter writer, Archive archive) { - this.writer = writer; - this.name = archive.getName(); - writer.format("digraph \"%s\" {%n", name); - writer.format(" // Path: %s%n", archive.getPathName()); - } - - @Override - public void close() { - writer.println("}"); - } - - @Override - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive) { - String tag = toTag(target, targetArchive); - writer.format(" %-50s -> \"%s\";%n", - String.format("\"%s\"", origin), - tag.isEmpty() ? target - : String.format("%s (%s)", target, tag)); - } - } - - class SummaryDotFile implements Analyzer.Visitor, AutoCloseable { - private final PrintWriter writer; - private final Analyzer.Type type; - private final Map<Archive, Map<Archive,StringBuilder>> edges = new HashMap<>(); - SummaryDotFile(PrintWriter writer, Analyzer.Type type) { - this.writer = writer; - this.type = type; - writer.format("digraph \"summary\" {%n"); - } - - @Override - public void close() { - writer.println("}"); - } - - @Override - public void visitDependence(String origin, Archive originArchive, - String target, Archive targetArchive) { - String targetName = type == PACKAGE ? target : targetArchive.getName(); - if (isJDKModule(targetArchive)) { - Module m = (Module)targetArchive; - String n = showProfileOrModule(m); - if (!n.isEmpty()) { - targetName += " (" + n + ")"; - } - } else if (type == PACKAGE) { - targetName += " (" + targetArchive.getName() + ")"; - } - String label = getLabel(originArchive, targetArchive); - writer.format(" %-50s -> \"%s\"%s;%n", - String.format("\"%s\"", origin), targetName, label); - } - - String getLabel(Archive origin, Archive target) { - if (edges.isEmpty()) - return ""; - - StringBuilder label = edges.get(origin).get(target); - return label == null ? "" : String.format(" [label=\"%s\",fontsize=9]", label.toString()); - } - - Analyzer.Visitor labelBuilder() { - // show the package-level dependencies as labels in the dot graph - return new Analyzer.Visitor() { - @Override - public void visitDependence(String origin, Archive originArchive, String target, Archive targetArchive) { - edges.putIfAbsent(originArchive, new HashMap<>()); - edges.get(originArchive).putIfAbsent(targetArchive, new StringBuilder()); - StringBuilder sb = edges.get(originArchive).get(targetArchive); - String tag = toTag(target, targetArchive); - addLabel(sb, origin, target, tag); - } - - void addLabel(StringBuilder label, String origin, String target, String tag) { - label.append(origin).append(" -> ").append(target); - if (!tag.isEmpty()) { - label.append(" (" + tag + ")"); - } - label.append("\\n"); - } - }; - } - } - - /** - * Test if the given archive is part of the JDK - */ - private boolean isJDKModule(Archive archive) { - return Module.class.isInstance(archive); - } - - /** - * If the given archive is JDK archive, this method returns the profile name - * only if -profile option is specified; it accesses a private JDK API and - * the returned value will have "JDK internal API" prefix - * - * For non-JDK archives, this method returns the file name of the archive. - */ - private String toTag(String name, Archive source) { - if (!isJDKModule(source)) { - return source.getName(); - } - - Module module = (Module)source; - boolean isExported = false; - if (options.verbose == CLASS || options.verbose == VERBOSE) { - isExported = module.isExported(name); - } else { - isExported = module.isExportedPackage(name); - } - if (isExported) { - // exported API - return showProfileOrModule(module); - } else { - return "JDK internal API (" + source.getName() + ")"; - } - } - - private String showProfileOrModule(Module m) { - String tag = ""; - if (options.showProfile) { - Profile p = Profile.getProfile(m); - if (p != null) { - tag = p.profileName(); - } - } else if (options.showModule) { - tag = m.name(); - } - return tag; - } - - private Profile getProfile(String name) { - String pn = name; - if (options.verbose == CLASS || options.verbose == VERBOSE) { - int i = name.lastIndexOf('.'); - pn = i > 0 ? name.substring(0, i) : ""; - } - return Profile.getProfile(pn); - } - - /** - * Returns the recommended replacement API for the given classname; - * or return null if replacement API is not known. - */ - private String replacementFor(String cn) { - String name = cn; - String value = null; - while (value == null && name != null) { - try { - value = ResourceBundleHelper.jdkinternals.getString(name); - } catch (MissingResourceException e) { - // go up one subpackage level - int i = name.lastIndexOf('.'); - name = i > 0 ? name.substring(0, i) : null; - } - } - return value; - }; - - private void showReplacements(Analyzer analyzer) { - Map<String,String> jdkinternals = new TreeMap<>(); - boolean useInternals = false; - for (Archive source : sourceLocations) { - useInternals = useInternals || analyzer.hasDependences(source); - for (String cn : analyzer.dependences(source)) { - String repl = replacementFor(cn); - if (repl != null) { - jdkinternals.putIfAbsent(cn, repl); - } - } - } - if (useInternals) { - log.println(); - warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url")); - } - if (!jdkinternals.isEmpty()) { - log.println(); - log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement"); - log.format("%-40s %s%n", "----------------", "---------------------"); - for (Map.Entry<String,String> e : jdkinternals.entrySet()) { - log.format("%-40s %s%n", e.getKey(), e.getValue()); - } - } - - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/Main.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.jdeps; - -import java.io.*; - -/** - * - * Usage: - * jdeps [options] files ... - * where options include: - * -p package-name restrict analysis to classes in this package - * (may be given multiple times) - * -e regex restrict analysis to packages matching pattern - * (-p and -e are exclusive) - * -v show class-level dependencies - * default: package-level dependencies - * -r --recursive transitive dependencies analysis - * -classpath paths Classpath to locate class files - * -all process all class files in the given classpath - */ -public class Main { - public static void main(String... args) throws Exception { - JdepsTask t = new JdepsTask(); - int rc = t.run(args); - System.exit(rc); - } - - - /** - * Entry point that does <i>not</i> call System.exit. - * - * @param args command line arguments - * @param out output stream - * @return an exit code. 0 means success, non-zero means an error occurred. - */ - public static int run(String[] args, PrintWriter out) { - JdepsTask t = new JdepsTask(); - t.setLog(out); - return t.run(args); - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/Module.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -/** - * JDeps internal representation of module for dependency analysis. - */ -final class Module extends Archive { - private final String moduleName; - private final Map<String, Boolean> requires; - private final Map<String, Set<String>> exports; - private final Set<String> packages; - - private Module(ClassFileReader reader, String name, - Map<String, Boolean> requires, - Map<String, Set<String>> exports, - Set<String> packages) { - super(name, reader); - this.moduleName = name; - this.requires = Collections.unmodifiableMap(requires); - this.exports = Collections.unmodifiableMap(exports); - this.packages = Collections.unmodifiableSet(packages); - } - - public String name() { - return moduleName; - } - - public Map<String, Boolean> requires() { - return requires; - } - - public Map<String, Set<String>> exports() { - return exports; - } - - public Set<String> packages() { - return packages; - } - - /** - * Tests if this module can read m - */ - public boolean canRead(Module m) { - // ## TODO: handle "re-exported=true" - // all JDK modules require all modules containing its direct dependences - // should not be an issue - return requires.containsKey(m.name()); - } - - /** - * Tests if a given fully-qualified name is an exported type. - */ - public boolean isExported(String cn) { - int i = cn.lastIndexOf('.'); - String pn = i > 0 ? cn.substring(0, i) : ""; - - return isExportedPackage(pn); - } - - /** - * Tests if a given package name is exported. - */ - public boolean isExportedPackage(String pn) { - return exports.containsKey(pn) ? exports.get(pn).isEmpty() : false; - } - - /** - * Tests if the given classname is accessible to module m - */ - public boolean isAccessibleTo(String classname, Module m) { - int i = classname.lastIndexOf('.'); - String pn = i > 0 ? classname.substring(0, i) : ""; - if (!packages.contains(pn)) { - throw new IllegalArgumentException(classname + " is not a member of module " + name()); - } - - if (m != null && !m.canRead(this)) { - trace("%s not readable by %s%n", this.name(), m.name()); - return false; - } - - // exported API - Set<String> ms = exports().get(pn); - String mname = m != null ? m.name() : "unnamed"; - if (ms == null) { - trace("%s not exported in %s%n", classname, this.name()); - } else if (!(ms.isEmpty() || ms.contains(mname))) { - trace("%s not permit to %s %s%n", classname, mname, ms); - } - return ms != null && (ms.isEmpty() || ms.contains(mname)); - } - - private static final boolean traceOn = Boolean.getBoolean("jdeps.debug"); - private void trace(String fmt, Object... args) { - if (traceOn) { - System.err.format(fmt, args); - } - } - - @Override - public boolean equals(Object ob) { - if (!(ob instanceof Module)) - return false; - Module that = (Module)ob; - return (moduleName.equals(that.moduleName) - && requires.equals(that.requires) - && exports.equals(that.exports) - && packages.equals(that.packages)); - } - - @Override - public int hashCode() { - int hc = moduleName.hashCode(); - hc = hc * 43 + requires.hashCode(); - hc = hc * 43 + exports.hashCode(); - hc = hc * 43 + packages.hashCode(); - return hc; - } - - @Override - public String toString() { - return name(); - } - - public final static class Builder { - String name; - ClassFileReader reader; - final Map<String, Boolean> requires = new HashMap<>(); - final Map<String, Set<String>> exports = new HashMap<>(); - final Set<String> packages = new HashSet<>(); - - public Builder() { - } - - public Builder name(String n) { - name = n; - return this; - } - - public Builder require(String d, boolean reexport) { - // System.err.format("%s depend %s reexports %s%n", name, d, reexport); - requires.put(d, reexport); - return this; - } - - public Builder packages(Set<String> pkgs) { - packages.addAll(pkgs); - return this; - } - - public Builder export(String p, Set<String> ms) { - Objects.requireNonNull(p); - Objects.requireNonNull(ms); - exports.put(p, new HashSet<>(ms)); - return this; - } - public Builder classes(ClassFileReader.ModuleClassReader reader) { - this.reader = reader; - return this; - } - - public Module build() { - Module m = new Module(reader, name, requires, exports, packages); - return m; - } - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/ModulesXmlReader.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import java.io.IOException; -import java.io.InputStream; -import java.util.HashSet; -import java.util.Set; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.XMLEvent; -import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader; -import com.sun.tools.jdeps.PlatformClassPath.ImageHelper; - -final class ModulesXmlReader { - public static Set<Module> load(ImageHelper helper,InputStream in) - throws IOException - { - try { - ModulesXmlReader reader = new ModulesXmlReader(helper); - return reader.load(in); - } catch (XMLStreamException e) { - throw new RuntimeException(e); - } - } - - private static final String MODULES = "modules"; - private static final String MODULE = "module"; - private static final String NAME = "name"; - private static final String DEPEND = "depend"; - private static final String EXPORT = "export"; - private static final String TO = "to"; - private static final QName REEXPORTS = new QName("re-exports"); - private final ImageHelper helper; - ModulesXmlReader(ImageHelper helper) { - this.helper = helper; - } - - public Set<Module> load(InputStream in) throws XMLStreamException, IOException { - Set<Module> modules = new HashSet<>(); - if (in == null) { - throw new RuntimeException("jdeps-modules.xml doesn't exist"); - } - XMLInputFactory factory = XMLInputFactory.newInstance(); - XMLEventReader reader = factory.createXMLEventReader(in, "UTF-8"); - Module.Builder mb = null; - String modulename = null; - String exportedPackage = null; - Set<String> permits = new HashSet<>(); - while (reader.hasNext()) { - XMLEvent event = reader.nextEvent(); - if (event.isStartElement()) { - String startTag = event.asStartElement().getName().getLocalPart(); - switch (startTag) { - case MODULES: - break; - case MODULE: - if (mb != null) { - throw new RuntimeException("end tag for module is missing"); - } - modulename = getNextTag(reader, NAME); - mb = new Module.Builder(); - mb.name(modulename); - break; - case NAME: - throw new RuntimeException(event.toString()); - case DEPEND: - boolean reexports = false; - Attribute attr = event.asStartElement().getAttributeByName(REEXPORTS); - if (attr != null) { - String value = attr.getValue(); - if (value.equals("true") || value.equals("false")) { - reexports = Boolean.parseBoolean(value); - } else { - throw new RuntimeException("unexpected attribute " + attr.toString()); - } - } - mb.require(getData(reader), reexports); - break; - case EXPORT: - exportedPackage = getNextTag(reader, NAME); - break; - case TO: - permits.add(getData(reader)); - break; - default: - throw new RuntimeException("invalid element: " + event); - } - } else if (event.isEndElement()) { - String endTag = event.asEndElement().getName().getLocalPart(); - switch (endTag) { - case MODULE: - ModuleClassReader cfr = helper.getModuleClassReader(modulename); - mb.classes(cfr); - mb.packages(cfr.packages()); - modules.add(mb.build()); - mb = null; - break; - case EXPORT: - if (exportedPackage == null) { - throw new RuntimeException("export's name is missing"); - } - mb.export(exportedPackage, permits); - exportedPackage = null; - permits.clear(); - break; - default: - } - } else if (event.isCharacters()) { - String s = event.asCharacters().getData(); - if (!s.trim().isEmpty()) { - throw new RuntimeException("export-to is malformed"); - } - } - } - return modules; - } - private String getData(XMLEventReader reader) throws XMLStreamException { - XMLEvent e = reader.nextEvent(); - if (e.isCharacters()) { - return e.asCharacters().getData(); - } - throw new RuntimeException(e.toString()); - } - - private String getNextTag(XMLEventReader reader, String tag) throws XMLStreamException { - XMLEvent e = reader.nextTag(); - if (e.isStartElement()) { - String t = e.asStartElement().getName().getLocalPart(); - if (!tag.equals(t)) { - throw new RuntimeException(e + " expected: " + tag); - } - return getData(reader); - } - throw new RuntimeException("export-to name is missing:" + e); - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import com.sun.tools.classfile.ClassFile; -import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.BufferedInputStream; -import java.net.URI; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; -import java.util.stream.Collectors; - -/** - * ClassPath for Java SE and JDK - */ -class PlatformClassPath { - private static List<Archive> modules; - static synchronized List<Archive> getModules(Path mpath) throws IOException { - if (modules == null) { - initPlatformModules(mpath); - } - return modules; - } - - private static void initPlatformModules(Path mpath) throws IOException { - ImageHelper helper = ImageHelper.getInstance(mpath); - String fn = System.getProperty("jdeps.modules.xml"); - if (fn != null) { - Path p = Paths.get(fn); - try (InputStream in = new BufferedInputStream(Files.newInputStream(p))) { - modules = new ArrayList<>(ModulesXmlReader.load(helper, in)); - } - } else { - try (InputStream in = PlatformClassPath.class - .getResourceAsStream("resources/jdeps-modules.xml")) { - modules = new ArrayList<>(ModulesXmlReader.load(helper, in)); - } - } - if (findModule("java.base") != null) { - Profile.initProfiles(modules); - } - } - - /** - * Finds the module with the given name. Returns null - * if such module doesn't exist. - * - * @param mn module name - */ - static Module findModule(String mn) { - for (Archive a : modules) { - if (Module.class.isInstance(a)) { - Module m = (Module)a; - if (mn.equals(m.name())) { - return m; - } - } - } - return null; - } - - /** - * Returns JAR files in $java.home/lib. This is for transition until - * all components are linked into jimage. - */ - static List<Archive> getJarFiles() throws IOException { - Path home = Paths.get(System.getProperty("java.home"), "lib"); - return Files.find(home, 1, (Path p, BasicFileAttributes attr) - -> p.getFileName().toString().endsWith(".jar")) - .map(Archive::getInstance) - .collect(Collectors.toList()); - } - - static class ImageHelper { - static ImageHelper getInstance(Path mpath) throws IOException { - if (mpath != null) { - return new ImageHelper(mpath); - } - Path home = Paths.get(System.getProperty("java.home")); - Path mlib = home.resolve("lib").resolve("modules"); - if (Files.isDirectory(mlib)) { - // jimage - FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); - return new ImageHelper(fs, fs.getPath("/")); - } else { - // exploded modules - mlib = home.resolve("modules"); - if (!Files.isDirectory(mlib)) { - throw new InternalError(home + " not a modular image"); - } - return new ImageHelper(mlib); - } - } - - private final FileSystem fs; - private final Path mpath; - - ImageHelper(Path path) throws IOException { - this(FileSystems.getDefault(), path); - } - - ImageHelper(FileSystem fs, Path path) throws IOException { - this.fs = fs; - this.mpath = path; - } - - /** - * Returns a ModuleClassReader that only reads classes for the given modulename. - */ - public ModuleClassReader getModuleClassReader(String modulename) - throws IOException - { - Path mp = mpath.resolve(modulename); - if (Files.exists(mp) && Files.isDirectory(mp)) { - return new ModuleClassReader(fs, modulename, mp); - } else { - // aggregator module or os-specific module in jdeps-modules.xml - // mdir not exist - return new NonExistModuleReader(fs, modulename, mp); - } - } - - static class NonExistModuleReader extends ModuleClassReader { - private final List<ClassFile> classes = Collections.emptyList(); - - private NonExistModuleReader(FileSystem fs, String mn, Path mpath) - throws IOException - { - super(fs, mn, mpath); - } - - public ClassFile getClassFile(String name) throws IOException { - return null; - } - - public Iterable<ClassFile> getClassFiles() throws IOException { - return classes; - } - - public Set<String> packages() { - return Collections.emptySet(); - } - } - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/Profile.java Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.sun.tools.jdeps; - -import java.io.IOException; -import java.util.*; - -/** - * Build the profile information. - */ -enum Profile { - COMPACT1("compact1", 1, "java.compact1"), - COMPACT2("compact2", 2, "java.compact2"), - COMPACT3("compact3", 3, "java.compact3", "java.smartcardio", "jdk.sctp", - "jdk.httpserver", "jdk.security.auth", - "jdk.naming.dns", "jdk.naming.rmi", - "jdk.management"), - FULL_JRE("Full JRE", 4, "java.se", "jdk.deploy.osx", "jdk.charsets", - "jdk.crypto.ec", "jdk.crypto.pkcs11", - "jdk.crypto.mscapi", "jdk.crypto.ucrypto", "jdk.jvmstat", - "jdk.localedata", "jdk.scripting.nashorn", "jdk.zipfs"); - - final String name; - final int profile; - final String[] mnames; - final Set<Module> modules = new HashSet<>(); - - Profile(String name, int profile, String... mnames) { - this.name = name; - this.profile = profile; - this.mnames = mnames; - } - - public String profileName() { - return name; - } - - @Override - public String toString() { - return mnames[0]; - } - - public static int getProfileCount() { - return JDK.isEmpty() ? 0 : Profile.values().length; - } - - /** - * Returns the Profile for the given package name; null if not found. - */ - public static Profile getProfile(String pn) { - for (Profile p : Profile.values()) { - for (Module m : p.modules) { - if (m.packages().contains(pn)) { - return p; - } - } - } - return null; - } - - /* - * Returns the Profile for a given Module; null if not found. - */ - public static Profile getProfile(Module m) { - for (Profile p : Profile.values()) { - if (p.modules.contains(m)) { - return p; - } - } - return null; - } - - private final static Set<Module> JDK = new HashSet<>(); - static void initProfiles(List<Archive> modules) { - // add all modules into JDK - modules.forEach(m -> JDK.add((Module)m)); - - for (Profile p : Profile.values()) { - for (String mn : p.mnames) { - // this includes platform-dependent module that may not exist - Module m = PlatformClassPath.findModule(mn); - if (m != null) { - p.addModule(m); - } - } - } - } - - private void addModule(Module m) { - modules.add(m); - for (String n : m.requires().keySet()) { - Module d = PlatformClassPath.findModule(n); - if (d == null) { - throw new InternalError("module " + n + " required by " + - m.name() + " doesn't exist"); - } - modules.add(d); - } - } - // for debugging - public static void main(String[] args) throws IOException { - // find platform modules - PlatformClassPath.getModules(null); - if (Profile.getProfileCount() == 0) { - System.err.println("No profile is present in this JDK"); - } - for (Profile p : Profile.values()) { - String profileName = p.name; - System.out.format("%2d: %-10s %s%n", p.profile, profileName, p.modules); - for (Module m: p.modules) { - System.out.format("module %s%n", m.name()); - System.out.format(" requires %s%n", m.requires()); - for (Map.Entry<String,Set<String>> e: m.exports().entrySet()) { - System.out.format(" exports %s %s%n", e.getKey(), - e.getValue().isEmpty() ? "" : "to " + e.getValue()); - } - } - } - System.out.println("All JDK modules:-"); - JDK.stream().sorted(Comparator.comparing(Module::name)) - .forEach(m -> System.out.println(m)); - } -}
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -main.usage.summary=\ -Usage: {0} <options> <classes...>\n\ -use -h, -? or -help for a list of possible options - -main.usage=\ -Usage: {0} <options> <classes...>\n\ -where <classes> can be a pathname to a .class file, a directory, a JAR file,\n\ -or a fully-qualified class name. Possible options include: - -error.prefix=Error: -warn.prefix=Warning: - -main.opt.h=\ -\ -h -? -help Print this usage message - -main.opt.version=\ -\ -version Version information - -main.opt.v=\ -\ -v -verbose Print all class level dependencies\n\ -\ Equivalent to -verbose:class -filter:none.\n\ -\ -verbose:package Print package-level dependencies excluding\n\ -\ dependencies within the same package by default\n\ -\ -verbose:class Print class-level dependencies excluding\n\ -\ dependencies within the same package by default - -main.opt.f=\ -\ -f <regex> -filter <regex> Filter dependences matching the given pattern\n\ -\ If given multiple times, the last one will be used.\n\ -\ -filter:package Filter dependences within the same package (default)\n\ -\ -filter:archive Filter dependences within the same archive\n\ -\ -filter:none No -filter:package and -filter:archive filtering\n\ -\ Filtering specified via the -filter option still applies. - -main.opt.s=\ -\ -s -summary Print dependency summary only - -main.opt.p=\ -\ -p <pkgname> -package <pkgname> Finds dependences matching the given package name\n\ -\ (may be given multiple times) - -main.opt.e=\ -\ -e <regex> -regex <regex> Finds dependences matching the given pattern\n\ -\ (-p and -e are exclusive) - -main.opt.include=\ -\ -include <regex> Restrict analysis to classes matching pattern\n\ -\ This option filters the list of classes to\n\ -\ be analyzed. It can be used together with\n\ -\ -p and -e which apply pattern to the dependences - -main.opt.P=\ -\ -P -profile Show profile or the file containing a package - -main.opt.M=\ -\ -M -module Show module containing the package - -main.opt.cp=\ -\ -cp <path> -classpath <path> Specify where to find class files - -main.opt.R=\ -\ -R -recursive Recursively traverse all dependencies.\n\ -\ The -R option implies -filter:none. If -p, -e, -f\n\ -\ option is specified, only the matching dependences\n\ -\ are analyzed. - -main.opt.apionly=\ -\ -apionly Restrict analysis to APIs i.e. dependences\n\ -\ from the signature of public and protected\n\ -\ members of public classes including field\n\ -\ type, method parameter types, returned type,\n\ -\ checked exception types etc - -main.opt.dotoutput=\ -\ -dotoutput <dir> Destination directory for DOT file output - -main.opt.jdkinternals=\ -\ -jdkinternals Finds class-level dependences on JDK internal APIs.\n\ -\ By default, it analyzes all classes on -classpath\n\ -\ and input files unless -include option is specified.\n\ -\ This option cannot be used with -p, -e and -s options.\n\ -\ WARNING: JDK internal APIs may not be accessible in\n\ -\ the next release. - -main.opt.depth=\ -\ -depth=<depth> Specify the depth of the transitive\n\ -\ dependency analysis - - -err.unknown.option=unknown option: {0} -err.missing.arg=no value given for {0} -err.invalid.arg.for.option=invalid argument for option: {0} -err.option.after.class=option must be specified before classes: {0} -err.option.unsupported={0} not supported: {1} -err.profiles.msg=No profile information -err.invalid.path=invalid path: {0} -warn.invalid.arg=Invalid classname or pathname not exist: {0} -warn.split.package=package {0} defined in {1} {2} -warn.replace.useJDKInternals=\ -JDK internal APIs are unsupported and private to JDK implementation that are\n\ -subject to be removed or changed incompatibly and could break your application.\n\ -Please modify your code to eliminate dependency on any JDK internal APIs.\n\ -For the most recent update on JDK internal API replacements, please check:\n\ -{0} - -artifact.not.found=not found -jdeps.wiki.url=https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes...>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-h\u3001-?\u307E\u305F\u306F--help\u3092\u4F7F\u7528\u3057\u307E\u3059 - -main.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes...>\n<classes>\u306B\u306F\u3001.class\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u540D\u3001\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3001JAR\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u5B8C\u5168\u4FEE\u98FE\n\u30AF\u30E9\u30B9\u540D\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002\u4F7F\u7528\u3067\u304D\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059: - -error.prefix=\u30A8\u30E9\u30FC: -warn.prefix=\u8B66\u544A: - -main.opt.h=\ -h -? -help \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3057\u307E\u3059 - -main.opt.version=\ -version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831 - -main.opt.v=\ -v -verbose \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u3059\u3079\u3066\u51FA\u529B\u3057\u307E\u3059\n -verbose:package \u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F)\n -verbose:class \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F) - -main.opt.s=\ -s -summary \u4F9D\u5B58\u6027\u306E\u8981\u7D04\u306E\u307F\u51FA\u529B\u3057\u307E\u3059 - -main.opt.p=\ -p <pkgname> -package <pkgname> \u6307\u5B9A\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u5185\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\n (\u8907\u6570\u56DE\u6307\u5B9A\u53EF\u80FD) - -main.opt.e=\ -e <regex> -regex <regex> \u30D1\u30BF\u30FC\u30F3\u306B\u4E00\u81F4\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u5185\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\n (-p\u3068-e\u306F\u6392\u4ED6\u7684) - -main.opt.include=\ -include <regex> \u30D1\u30BF\u30FC\u30F3\u306B\u4E00\u81F4\u3059\u308B\u30AF\u30E9\u30B9\u306B\u5206\u6790\u3092\u5236\u9650\u3057\u307E\u3059\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u5206\u6790\u5BFE\u8C61\u30AF\u30E9\u30B9\u306E\n \u30EA\u30B9\u30C8\u304C\u30D5\u30A3\u30EB\u30BF\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u30D1\u30BF\u30FC\u30F3\u3092\u4F9D\u5B58\u6027\u306B\n \u9069\u7528\u3059\u308B-p\u304A\u3088\u3073-e\u3068\u4E00\u7DD2\u306B\u4F7F\u7528\u3067\u304D\u307E\u3059 - -main.opt.P=\ -P -profile \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3001\u307E\u305F\u306F\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u542B\u3080\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A\u3057\u307E\u3059 - -main.opt.cp=\ -cp <path> -classpath <path> \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3057\u307E\u3059 - -main.opt.R=\ -R -recursive \u3059\u3079\u3066\u306E\u4F9D\u5B58\u6027\u3092\u53CD\u5FA9\u7684\u306B\u8D70\u67FB\u3057\u307E\u3059 - -main.opt.apionly=\ -apionly \u5206\u6790\u3092API\u3001\u3064\u307E\u308A\u3001\u30D1\u30D6\u30EA\u30C3\u30AF\u30FB\u30AF\u30E9\u30B9\u306E\n \u30D1\u30D6\u30EA\u30C3\u30AF\u30FB\u30E1\u30F3\u30D0\u30FC\u304A\u3088\u3073\u4FDD\u8B77\u3055\u308C\u305F\u30E1\u30F3\u30D0\u30FC\u306E\n \u7F72\u540D\u306B\u304A\u3051\u308B\u4F9D\u5B58\u6027(\u30D5\u30A3\u30FC\u30EB\u30C9\u30FB\u30BF\u30A4\u30D7\u3001\u30E1\u30BD\u30C3\u30C9\u30FB\n \u30D1\u30E9\u30E1\u30FC\u30BF\u30FB\u30BF\u30A4\u30D7\u3001\u623B\u3055\u308C\u305F\u30BF\u30A4\u30D7\u3001\u30C1\u30A7\u30C3\u30AF\u3055\u308C\u305F\n \u4F8B\u5916\u30BF\u30A4\u30D7\u306A\u3069)\u306B\u5236\u9650\u3057\u307E\u3059 - -main.opt.dotoutput=\ -dotoutput <dir> DOT\u30D5\u30A1\u30A4\u30EB\u51FA\u529B\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA - -main.opt.depth=\ -depth=<depth> \u63A8\u79FB\u7684\u306A\u4F9D\u5B58\u6027\u5206\u6790\u306E\u6DF1\u3055\u3092\n \u6307\u5B9A\u3057\u307E\u3059 - -err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0} -err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 -err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2} -err.invalid.arg.for.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0} -err.option.after.class=\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u30AF\u30E9\u30B9\u306E\u524D\u306B\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059: {0} -err.option.unsupported={0}\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {1} -err.profiles.msg=\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u60C5\u5831\u304C\u3042\u308A\u307E\u305B\u3093 -err.dot.output.path=\u7121\u52B9\u306A\u30D1\u30B9: {0} -warn.invalid.arg=\u7121\u52B9\u306A\u30AF\u30E9\u30B9\u540D\u307E\u305F\u306F\u30D1\u30B9\u540D\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {0} -warn.split.package=\u30D1\u30C3\u30B1\u30FC\u30B8{0}\u306F{1} {2}\u3067\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u3059 - -artifact.not.found=\u898B\u3064\u304B\u308A\u307E\u305B\u3093
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -main.usage.summary=\u7528\u6CD5: {0} <options> <classes...>\n\u4F7F\u7528 -h, -? \u6216 --help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 - -main.usage=\u7528\u6CD5: {0} <options> <classes...>\n\u5176\u4E2D <classes> \u53EF\u4EE5\u662F .class \u6587\u4EF6, \u76EE\u5F55, JAR \u6587\u4EF6\u7684\u8DEF\u5F84\u540D,\n\u4E5F\u53EF\u4EE5\u662F\u5168\u9650\u5B9A\u7C7B\u540D\u3002\u53EF\u80FD\u7684\u9009\u9879\u5305\u62EC: - -error.prefix=\u9519\u8BEF: -warn.prefix=\u8B66\u544A: - -main.opt.h=\ -h -? -help \u8F93\u51FA\u6B64\u7528\u6CD5\u6D88\u606F - -main.opt.version=\ -version \u7248\u672C\u4FE1\u606F - -main.opt.v=\ -v -verbose \u8F93\u51FA\u6240\u6709\u7C7B\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61\n -verbose:package \u8F93\u51FA\u7A0B\u5E8F\u5305\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61, \u4E0D\u5305\u62EC\n \u540C\u4E00\u6863\u6848\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n -verbose:class \u8F93\u51FA\u7C7B\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61, \u4E0D\u5305\u62EC\n \u540C\u4E00\u6863\u6848\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61 - -main.opt.s=\ -s -summary \u4EC5\u8F93\u51FA\u88AB\u4F9D\u8D56\u5BF9\u8C61\u6982\u8981 - -main.opt.p=\ -p <pkgname> -package <pkgname> \u67E5\u627E\u7ED9\u5B9A\u7A0B\u5E8F\u5305\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n (\u53EF\u80FD\u591A\u6B21\u6307\u5B9A) - -main.opt.e=\ -e <regex> -regex <regex> \u67E5\u627E\u4E0E\u6A21\u5F0F\u5339\u914D\u7684\u7A0B\u5E8F\u5305\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n (-p \u548C -e \u4E92\u76F8\u6392\u65A5) - -main.opt.include=\ -include <regex> \u5C06\u5206\u6790\u9650\u5236\u4E3A\u4E0E\u6A21\u5F0F\u5339\u914D\u7684\u7C7B\n \u6B64\u9009\u9879\u7B5B\u9009\u8981\u5206\u6790\u7684\u7C7B\u7684\u5217\u8868\u3002\n \u5B83\u53EF\u4EE5\u4E0E\u5411\u88AB\u4F9D\u8D56\u5BF9\u8C61\u5E94\u7528\u6A21\u5F0F\u7684\n -p \u548C -e \u7ED3\u5408\u4F7F\u7528 - -main.opt.P=\ -P -profile \u663E\u793A\u914D\u7F6E\u6587\u4EF6\u6216\u5305\u542B\u7A0B\u5E8F\u5305\u7684\u6587\u4EF6 - -main.opt.cp=\ -cp <path> -classpath <path> \u6307\u5B9A\u67E5\u627E\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E - -main.opt.R=\ -R -recursive \u9012\u5F52\u904D\u5386\u6240\u6709\u88AB\u4F9D\u8D56\u5BF9\u8C61 - -main.opt.apionly=\ -apionly \u901A\u8FC7\u516C\u5171\u7C7B (\u5305\u62EC\u5B57\u6BB5\u7C7B\u578B, \u65B9\u6CD5\u53C2\u6570\n \u7C7B\u578B, \u8FD4\u56DE\u7C7B\u578B, \u53D7\u63A7\u5F02\u5E38\u9519\u8BEF\u7C7B\u578B\n \u7B49) \u7684\u516C\u5171\u548C\u53D7\u4FDD\u62A4\u6210\u5458\u7684\u7B7E\u540D\n \u9650\u5236\u5BF9 API (\u5373\u88AB\u4F9D\u8D56\u5BF9\u8C61)\n \u8FDB\u884C\u5206\u6790 - -main.opt.dotoutput=\ -dotoutput <dir> DOT \u6587\u4EF6\u8F93\u51FA\u7684\u76EE\u6807\u76EE\u5F55 - -main.opt.depth=\ -depth=<depth> \u6307\u5B9A\u8FC7\u6E21\u88AB\u4F9D\u8D56\u5BF9\u8C61\u5206\u6790\n \u7684\u6DF1\u5EA6 - -err.unknown.option=\u672A\u77E5\u9009\u9879: {0} -err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C -err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2} -err.invalid.arg.for.option=\u9009\u9879\u7684\u53C2\u6570\u65E0\u6548: {0} -err.option.after.class=\u5FC5\u987B\u5728\u7C7B\u4E4B\u524D\u6307\u5B9A\u9009\u9879: {0} -err.option.unsupported=\u4E0D\u652F\u6301{0}: {1} -err.profiles.msg=\u6CA1\u6709\u914D\u7F6E\u6587\u4EF6\u4FE1\u606F -err.dot.output.path=\u65E0\u6548\u8DEF\u5F84: {0} -warn.invalid.arg=\u7C7B\u540D\u65E0\u6548\u6216\u8DEF\u5F84\u540D\u4E0D\u5B58\u5728: {0} -warn.split.package=\u5DF2\u5728{1} {2}\u4E2D\u5B9A\u4E49\u7A0B\u5E8F\u5305{0} - -artifact.not.found=\u627E\u4E0D\u5230
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdkinternals.properties Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -// No translation needed -com.sun.crypto.provider.SunJCE=Use java.security.Security.getProvider(provider-name) @since 1.3 -com.sun.image.codec=Use javax.imageio @since 1.4 -com.sun.org.apache.xml.internal.security=Use java.xml.crypto @since 1.6 -com.sun.org.apache.xml.internal.security.utils.Base64=Use java.util.Base64 @since 1.8 -com.sun.net.ssl=Use javax.net.ssl @since 1.4 -com.sun.net.ssl.internal.ssl.Provider=Use java.security.Security.getProvider(provider-name) @since 1.3 -com.sun.rowset=Use javax.sql.rowset.RowSetProvider @since 1.7 -com.sun.tools.javac.tree=Use com.sun.source @since 1.6 -com.sun.tools.javac=Use javax.tools and javax.lang.model @since 1.6 -sun.awt.image.codec=Use javax.imageio @since 1.4 -sun.misc.BASE64Encoder=Use java.util.Base64 @since 1.8 -sun.misc.BASE64Decoder=Use java.util.Base64 @since 1.8 -sun.misc.Cleaner=Use java.lang.ref.PhantomReference @since 1.2 -sun.misc.Service=Use java.util.ServiceLoader @since 1.6 -sun.security.action=Use java.security.PrivilegedAction @since 1.1 -sun.security.krb5=Use com.sun.security.jgss -sun.security.provider.PolicyFile=Use java.security.Policy.getInstance("JavaPolicy", new URIParameter(uri)) @since 1.6 -sun.security.provider.Sun=Use java.security.Security.getProvider(provider-name) @since 1.3 -sun.security.util.SecurityConstants=Use appropriate java.security.Permission subclass @since 1.1 -sun.security.x509.X500Name=Use javax.security.auth.x500.X500Principal @since 1.4 -sun.tools.jar=Use java.util.jar or jar tool @since 1.2
--- a/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/version.properties-template Thu May 28 16:13:55 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -jdk=$(JDK_VERSION) -full=$(FULL_VERSION) -release=$(RELEASE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/AccessFlags.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * See JVMS, sections 4.2, 4.6, 4.7. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class AccessFlags { + public static final int ACC_PUBLIC = 0x0001; // class, inner, field, method + public static final int ACC_PRIVATE = 0x0002; // inner, field, method + public static final int ACC_PROTECTED = 0x0004; // inner, field, method + public static final int ACC_STATIC = 0x0008; // inner, field, method + public static final int ACC_FINAL = 0x0010; // class, inner, field, method + public static final int ACC_SUPER = 0x0020; // class + public static final int ACC_SYNCHRONIZED = 0x0020; // method + public static final int ACC_VOLATILE = 0x0040; // field + public static final int ACC_BRIDGE = 0x0040; // method + public static final int ACC_TRANSIENT = 0x0080; // field + public static final int ACC_VARARGS = 0x0080; // method + public static final int ACC_NATIVE = 0x0100; // method + public static final int ACC_INTERFACE = 0x0200; // class, inner + public static final int ACC_ABSTRACT = 0x0400; // class, inner, method + public static final int ACC_STRICT = 0x0800; // method + public static final int ACC_SYNTHETIC = 0x1000; // class, inner, field, method + public static final int ACC_ANNOTATION = 0x2000; // class, inner + public static final int ACC_ENUM = 0x4000; // class, inner, field + public static final int ACC_MANDATED = 0x8000; // class, inner, field, method + + public static enum Kind { Class, InnerClass, Field, Method} + + AccessFlags(ClassReader cr) throws IOException { + this(cr.readUnsignedShort()); + } + + public AccessFlags(int flags) { + this.flags = flags; + } + + public AccessFlags ignore(int mask) { + return new AccessFlags(flags & ~mask); + } + + public boolean is(int mask) { + return (flags & mask) != 0; + } + + public int byteLength() { + return 2; + } + + private static final int[] classModifiers = { + ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT + }; + + private static final int[] classFlags = { + ACC_PUBLIC, ACC_FINAL, ACC_SUPER, ACC_INTERFACE, ACC_ABSTRACT, + ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM + }; + + public Set<String> getClassModifiers() { + int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); + return getModifiers(f, classModifiers, Kind.Class); + } + + public Set<String> getClassFlags() { + return getFlags(classFlags, Kind.Class); + } + + private static final int[] innerClassModifiers = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, + ACC_ABSTRACT + }; + + private static final int[] innerClassFlags = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SUPER, + ACC_INTERFACE, ACC_ABSTRACT, ACC_SYNTHETIC, ACC_ANNOTATION, ACC_ENUM + }; + + public Set<String> getInnerClassModifiers() { + int f = ((flags & ACC_INTERFACE) != 0 ? flags & ~ACC_ABSTRACT : flags); + return getModifiers(f, innerClassModifiers, Kind.InnerClass); + } + + public Set<String> getInnerClassFlags() { + return getFlags(innerClassFlags, Kind.InnerClass); + } + + private static final int[] fieldModifiers = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, + ACC_VOLATILE, ACC_TRANSIENT + }; + + private static final int[] fieldFlags = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, + ACC_VOLATILE, ACC_TRANSIENT, ACC_SYNTHETIC, ACC_ENUM + }; + + public Set<String> getFieldModifiers() { + return getModifiers(fieldModifiers, Kind.Field); + } + + public Set<String> getFieldFlags() { + return getFlags(fieldFlags, Kind.Field); + } + + private static final int[] methodModifiers = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, + ACC_SYNCHRONIZED, ACC_NATIVE, ACC_ABSTRACT, ACC_STRICT + }; + + private static final int[] methodFlags = { + ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, + ACC_SYNCHRONIZED, ACC_BRIDGE, ACC_VARARGS, ACC_NATIVE, ACC_ABSTRACT, + ACC_STRICT, ACC_SYNTHETIC + }; + + public Set<String> getMethodModifiers() { + return getModifiers(methodModifiers, Kind.Method); + } + + public Set<String> getMethodFlags() { + return getFlags(methodFlags, Kind.Method); + } + + private Set<String> getModifiers(int[] modifierFlags, Kind t) { + return getModifiers(flags, modifierFlags, t); + } + + private static Set<String> getModifiers(int flags, int[] modifierFlags, Kind t) { + Set<String> s = new LinkedHashSet<>(); + for (int m: modifierFlags) { + if ((flags & m) != 0) + s.add(flagToModifier(m, t)); + } + return s; + } + + private Set<String> getFlags(int[] expectedFlags, Kind t) { + Set<String> s = new LinkedHashSet<>(); + int f = flags; + for (int e: expectedFlags) { + if ((f & e) != 0) { + s.add(flagToName(e, t)); + f = f & ~e; + } + } + while (f != 0) { + int bit = Integer.highestOneBit(f); + s.add("0x" + Integer.toHexString(bit)); + f = f & ~bit; + } + return s; + } + + private static String flagToModifier(int flag, Kind t) { + switch (flag) { + case ACC_PUBLIC: + return "public"; + case ACC_PRIVATE: + return "private"; + case ACC_PROTECTED: + return "protected"; + case ACC_STATIC: + return "static"; + case ACC_FINAL: + return "final"; + case ACC_SYNCHRONIZED: + return "synchronized"; + case 0x80: + return (t == Kind.Field ? "transient" : null); + case ACC_VOLATILE: + return "volatile"; + case ACC_NATIVE: + return "native"; + case ACC_ABSTRACT: + return "abstract"; + case ACC_STRICT: + return "strictfp"; + case ACC_MANDATED: + return "mandated"; + default: + return null; + } + } + + private static String flagToName(int flag, Kind t) { + switch (flag) { + case ACC_PUBLIC: + return "ACC_PUBLIC"; + case ACC_PRIVATE: + return "ACC_PRIVATE"; + case ACC_PROTECTED: + return "ACC_PROTECTED"; + case ACC_STATIC: + return "ACC_STATIC"; + case ACC_FINAL: + return "ACC_FINAL"; + case 0x20: + return (t == Kind.Class ? "ACC_SUPER" : "ACC_SYNCHRONIZED"); + case 0x40: + return (t == Kind.Field ? "ACC_VOLATILE" : "ACC_BRIDGE"); + case 0x80: + return (t == Kind.Field ? "ACC_TRANSIENT" : "ACC_VARARGS"); + case ACC_NATIVE: + return "ACC_NATIVE"; + case ACC_INTERFACE: + return "ACC_INTERFACE"; + case ACC_ABSTRACT: + return "ACC_ABSTRACT"; + case ACC_STRICT: + return "ACC_STRICT"; + case ACC_SYNTHETIC: + return "ACC_SYNTHETIC"; + case ACC_ANNOTATION: + return "ACC_ANNOTATION"; + case ACC_ENUM: + return "ACC_ENUM"; + case ACC_MANDATED: + return "ACC_MANDATED"; + default: + return null; + } + } + + public final int flags; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Annotation.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.16. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Annotation { + static class InvalidAnnotation extends AttributeException { + private static final long serialVersionUID = -4620480740735772708L; + InvalidAnnotation(String msg) { + super(msg); + } + } + + Annotation(ClassReader cr) throws IOException, InvalidAnnotation { + type_index = cr.readUnsignedShort(); + num_element_value_pairs = cr.readUnsignedShort(); + element_value_pairs = new element_value_pair[num_element_value_pairs]; + for (int i = 0; i < element_value_pairs.length; i++) + element_value_pairs[i] = new element_value_pair(cr); + } + + public Annotation(ConstantPool constant_pool, + int type_index, + element_value_pair[] element_value_pairs) { + this.type_index = type_index; + num_element_value_pairs = element_value_pairs.length; + this.element_value_pairs = element_value_pairs; + } + + public int length() { + int n = 2 /*type_index*/ + 2 /*num_element_value_pairs*/; + for (element_value_pair pair: element_value_pairs) + n += pair.length(); + return n; + } + + public final int type_index; + public final int num_element_value_pairs; + public final element_value_pair element_value_pairs[]; + + /** + * See JVMS, section 4.8.16.1. + */ + public static abstract class element_value { + public static element_value read(ClassReader cr) + throws IOException, InvalidAnnotation { + int tag = cr.readUnsignedByte(); + switch (tag) { + case 'B': + case 'C': + case 'D': + case 'F': + case 'I': + case 'J': + case 'S': + case 'Z': + case 's': + return new Primitive_element_value(cr, tag); + + case 'e': + return new Enum_element_value(cr, tag); + + case 'c': + return new Class_element_value(cr, tag); + + case '@': + return new Annotation_element_value(cr, tag); + + case '[': + return new Array_element_value(cr, tag); + + default: + throw new InvalidAnnotation("unrecognized tag: " + tag); + } + } + + protected element_value(int tag) { + this.tag = tag; + } + + public abstract int length(); + + public abstract <R,P> R accept(Visitor<R,P> visitor, P p); + + public interface Visitor<R,P> { + R visitPrimitive(Primitive_element_value ev, P p); + R visitEnum(Enum_element_value ev, P p); + R visitClass(Class_element_value ev, P p); + R visitAnnotation(Annotation_element_value ev, P p); + R visitArray(Array_element_value ev, P p); + } + + public final int tag; + } + + public static class Primitive_element_value extends element_value { + Primitive_element_value(ClassReader cr, int tag) throws IOException { + super(tag); + const_value_index = cr.readUnsignedShort(); + } + + @Override + public int length() { + return 2; + } + + public <R,P> R accept(Visitor<R,P> visitor, P p) { + return visitor.visitPrimitive(this, p); + } + + public final int const_value_index; + + } + + public static class Enum_element_value extends element_value { + Enum_element_value(ClassReader cr, int tag) throws IOException { + super(tag); + type_name_index = cr.readUnsignedShort(); + const_name_index = cr.readUnsignedShort(); + } + + @Override + public int length() { + return 4; + } + + public <R,P> R accept(Visitor<R,P> visitor, P p) { + return visitor.visitEnum(this, p); + } + + public final int type_name_index; + public final int const_name_index; + } + + public static class Class_element_value extends element_value { + Class_element_value(ClassReader cr, int tag) throws IOException { + super(tag); + class_info_index = cr.readUnsignedShort(); + } + + @Override + public int length() { + return 2; + } + + public <R,P> R accept(Visitor<R,P> visitor, P p) { + return visitor.visitClass(this, p); + } + + public final int class_info_index; + } + + public static class Annotation_element_value extends element_value { + Annotation_element_value(ClassReader cr, int tag) + throws IOException, InvalidAnnotation { + super(tag); + annotation_value = new Annotation(cr); + } + + @Override + public int length() { + return annotation_value.length(); + } + + public <R,P> R accept(Visitor<R,P> visitor, P p) { + return visitor.visitAnnotation(this, p); + } + + public final Annotation annotation_value; + } + + public static class Array_element_value extends element_value { + Array_element_value(ClassReader cr, int tag) + throws IOException, InvalidAnnotation { + super(tag); + num_values = cr.readUnsignedShort(); + values = new element_value[num_values]; + for (int i = 0; i < values.length; i++) + values[i] = element_value.read(cr); + } + + @Override + public int length() { + int n = 2; + for (int i = 0; i < values.length; i++) + n += values[i].length(); + return n; + } + + public <R,P> R accept(Visitor<R,P> visitor, P p) { + return visitor.visitArray(this, p); + } + + public final int num_values; + public final element_value[] values; + } + + public static class element_value_pair { + element_value_pair(ClassReader cr) + throws IOException, InvalidAnnotation { + element_name_index = cr.readUnsignedShort(); + value = element_value.read(cr); + } + + public int length() { + return 2 + value.length(); + } + + public final int element_name_index; + public final element_value value; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/AnnotationDefault_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.15. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class AnnotationDefault_attribute extends Attribute { + AnnotationDefault_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(name_index, length); + default_value = Annotation.element_value.read(cr); + } + + public AnnotationDefault_attribute(ConstantPool constant_pool, Annotation.element_value default_value) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.AnnotationDefault), default_value); + } + + public AnnotationDefault_attribute(int name_index, Annotation.element_value default_value) { + super(name_index, default_value.length()); + this.default_value = default_value; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitAnnotationDefault(this, data); + } + + public final Annotation.element_value default_value; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ + +public abstract class Attribute { + public static final String AnnotationDefault = "AnnotationDefault"; + public static final String BootstrapMethods = "BootstrapMethods"; + public static final String CharacterRangeTable = "CharacterRangeTable"; + public static final String Code = "Code"; + public static final String ConstantValue = "ConstantValue"; + public static final String CompilationID = "CompilationID"; + public static final String Deprecated = "Deprecated"; + public static final String EnclosingMethod = "EnclosingMethod"; + public static final String Exceptions = "Exceptions"; + public static final String InnerClasses = "InnerClasses"; + public static final String LineNumberTable = "LineNumberTable"; + public static final String LocalVariableTable = "LocalVariableTable"; + public static final String LocalVariableTypeTable = "LocalVariableTypeTable"; + public static final String MethodParameters = "MethodParameters"; + public static final String RuntimeVisibleAnnotations = "RuntimeVisibleAnnotations"; + public static final String RuntimeInvisibleAnnotations = "RuntimeInvisibleAnnotations"; + public static final String RuntimeVisibleParameterAnnotations = "RuntimeVisibleParameterAnnotations"; + public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations"; + public static final String RuntimeVisibleTypeAnnotations = "RuntimeVisibleTypeAnnotations"; + public static final String RuntimeInvisibleTypeAnnotations = "RuntimeInvisibleTypeAnnotations"; + public static final String Signature = "Signature"; + public static final String SourceDebugExtension = "SourceDebugExtension"; + public static final String SourceFile = "SourceFile"; + public static final String SourceID = "SourceID"; + public static final String StackMap = "StackMap"; + public static final String StackMapTable = "StackMapTable"; + public static final String Synthetic = "Synthetic"; + + public static class Factory { + public Factory() { + // defer init of standardAttributeClasses until after options set up + } + + public Attribute createAttribute(ClassReader cr, int name_index, byte[] data) + throws IOException { + if (standardAttributes == null) { + init(); + } + + ConstantPool cp = cr.getConstantPool(); + String reasonForDefaultAttr; + try { + String name = cp.getUTF8Value(name_index); + Class<? extends Attribute> attrClass = standardAttributes.get(name); + if (attrClass != null) { + try { + Class<?>[] constrArgTypes = {ClassReader.class, int.class, int.class}; + Constructor<? extends Attribute> constr = attrClass.getDeclaredConstructor(constrArgTypes); + return constr.newInstance(cr, name_index, data.length); + } catch (Throwable t) { + reasonForDefaultAttr = t.toString(); + // fall through and use DefaultAttribute + // t.printStackTrace(); + } + } else { + reasonForDefaultAttr = "unknown attribute"; + } + } catch (ConstantPoolException e) { + reasonForDefaultAttr = e.toString(); + // fall through and use DefaultAttribute + } + return new DefaultAttribute(cr, name_index, data, reasonForDefaultAttr); + } + + protected void init() { + standardAttributes = new HashMap<>(); + standardAttributes.put(AnnotationDefault, AnnotationDefault_attribute.class); + standardAttributes.put(BootstrapMethods, BootstrapMethods_attribute.class); + standardAttributes.put(CharacterRangeTable, CharacterRangeTable_attribute.class); + standardAttributes.put(Code, Code_attribute.class); + standardAttributes.put(CompilationID, CompilationID_attribute.class); + standardAttributes.put(ConstantValue, ConstantValue_attribute.class); + standardAttributes.put(Deprecated, Deprecated_attribute.class); + standardAttributes.put(EnclosingMethod, EnclosingMethod_attribute.class); + standardAttributes.put(Exceptions, Exceptions_attribute.class); + standardAttributes.put(InnerClasses, InnerClasses_attribute.class); + standardAttributes.put(LineNumberTable, LineNumberTable_attribute.class); + standardAttributes.put(LocalVariableTable, LocalVariableTable_attribute.class); + standardAttributes.put(LocalVariableTypeTable, LocalVariableTypeTable_attribute.class); + standardAttributes.put(MethodParameters, MethodParameters_attribute.class); + standardAttributes.put(RuntimeInvisibleAnnotations, RuntimeInvisibleAnnotations_attribute.class); + standardAttributes.put(RuntimeInvisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations_attribute.class); + standardAttributes.put(RuntimeVisibleAnnotations, RuntimeVisibleAnnotations_attribute.class); + standardAttributes.put(RuntimeVisibleParameterAnnotations, RuntimeVisibleParameterAnnotations_attribute.class); + standardAttributes.put(RuntimeVisibleTypeAnnotations, RuntimeVisibleTypeAnnotations_attribute.class); + standardAttributes.put(RuntimeInvisibleTypeAnnotations, RuntimeInvisibleTypeAnnotations_attribute.class); + standardAttributes.put(Signature, Signature_attribute.class); + standardAttributes.put(SourceDebugExtension, SourceDebugExtension_attribute.class); + standardAttributes.put(SourceFile, SourceFile_attribute.class); + standardAttributes.put(SourceID, SourceID_attribute.class); + standardAttributes.put(StackMap, StackMap_attribute.class); + standardAttributes.put(StackMapTable, StackMapTable_attribute.class); + standardAttributes.put(Synthetic, Synthetic_attribute.class); + } + + private Map<String,Class<? extends Attribute>> standardAttributes; + } + + public static Attribute read(ClassReader cr) throws IOException { + return cr.readAttribute(); + } + + protected Attribute(int name_index, int length) { + attribute_name_index = name_index; + attribute_length = length; + } + + public String getName(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(attribute_name_index); + } + + public abstract <R,D> R accept(Attribute.Visitor<R,D> visitor, D data); + + public int byteLength() { + return 6 + attribute_length; + } + + public final int attribute_name_index; + public final int attribute_length; + + + public interface Visitor<R,P> { + R visitBootstrapMethods(BootstrapMethods_attribute attr, P p); + R visitDefault(DefaultAttribute attr, P p); + R visitAnnotationDefault(AnnotationDefault_attribute attr, P p); + R visitCharacterRangeTable(CharacterRangeTable_attribute attr, P p); + R visitCode(Code_attribute attr, P p); + R visitCompilationID(CompilationID_attribute attr, P p); + R visitConstantValue(ConstantValue_attribute attr, P p); + R visitDeprecated(Deprecated_attribute attr, P p); + R visitEnclosingMethod(EnclosingMethod_attribute attr, P p); + R visitExceptions(Exceptions_attribute attr, P p); + R visitInnerClasses(InnerClasses_attribute attr, P p); + R visitLineNumberTable(LineNumberTable_attribute attr, P p); + R visitLocalVariableTable(LocalVariableTable_attribute attr, P p); + R visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, P p); + R visitMethodParameters(MethodParameters_attribute attr, P p); + R visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, P p); + R visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, P p); + R visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, P p); + R visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, P p); + R visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, P p); + R visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, P p); + R visitSignature(Signature_attribute attr, P p); + R visitSourceDebugExtension(SourceDebugExtension_attribute attr, P p); + R visitSourceFile(SourceFile_attribute attr, P p); + R visitSourceID(SourceID_attribute attr, P p); + R visitStackMap(StackMap_attribute attr, P p); + R visitStackMapTable(StackMapTable_attribute attr, P p); + R visitSynthetic(Synthetic_attribute attr, P p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/AttributeException.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class AttributeException extends Exception { + private static final long serialVersionUID = -4231486387714867770L; + AttributeException() { } + + AttributeException(String msg) { + super(msg); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Attributes.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Attributes implements Iterable<Attribute> { + + public final Attribute[] attrs; + public final Map<String, Attribute> map; + + Attributes(ClassReader cr) throws IOException { + map = new HashMap<>(); + int attrs_count = cr.readUnsignedShort(); + attrs = new Attribute[attrs_count]; + for (int i = 0; i < attrs_count; i++) { + Attribute attr = Attribute.read(cr); + attrs[i] = attr; + try { + map.put(attr.getName(cr.getConstantPool()), attr); + } catch (ConstantPoolException e) { + // don't enter invalid names in map + } + } + } + + public Attributes(ConstantPool constant_pool, Attribute[] attrs) { + this.attrs = attrs; + map = new HashMap<>(); + for (Attribute attr : attrs) { + try { + map.put(attr.getName(constant_pool), attr); + } catch (ConstantPoolException e) { + // don't enter invalid names in map + } + } + } + + public Iterator<Attribute> iterator() { + return Arrays.asList(attrs).iterator(); + } + + public Attribute get(int index) { + return attrs[index]; + } + + public Attribute get(String name) { + return map.get(name); + } + + public int getIndex(ConstantPool constant_pool, String name) { + for (int i = 0; i < attrs.length; i++) { + Attribute attr = attrs[i]; + try { + if (attr != null && attr.getName(constant_pool).equals(name)) + return i; + } catch (ConstantPoolException e) { + // ignore invalid entries + } + } + return -1; + } + + public int size() { + return attrs.length; + } + + public int byteLength() { + int length = 2; + for (Attribute a: attrs) + length += a.byteLength(); + return length; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS 4.7.21 + * http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.21 + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class BootstrapMethods_attribute extends Attribute { + public final BootstrapMethodSpecifier[] bootstrap_method_specifiers; + + BootstrapMethods_attribute(ClassReader cr, int name_index, int length) + throws IOException, AttributeException { + super(name_index, length); + int bootstrap_method_count = cr.readUnsignedShort(); + bootstrap_method_specifiers = new BootstrapMethodSpecifier[bootstrap_method_count]; + for (int i = 0; i < bootstrap_method_specifiers.length; i++) + bootstrap_method_specifiers[i] = new BootstrapMethodSpecifier(cr); + } + + public BootstrapMethods_attribute(int name_index, BootstrapMethodSpecifier[] bootstrap_method_specifiers) { + super(name_index, length(bootstrap_method_specifiers)); + this.bootstrap_method_specifiers = bootstrap_method_specifiers; + } + + public static int length(BootstrapMethodSpecifier[] bootstrap_method_specifiers) { + int n = 2; + for (BootstrapMethodSpecifier b : bootstrap_method_specifiers) + n += b.length(); + return n; + } + + @Override + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitBootstrapMethods(this, p); + } + + public static class BootstrapMethodSpecifier { + public int bootstrap_method_ref; + public int[] bootstrap_arguments; + + public BootstrapMethodSpecifier(int bootstrap_method_ref, int[] bootstrap_arguments) { + this.bootstrap_method_ref = bootstrap_method_ref; + this.bootstrap_arguments = bootstrap_arguments; + } + BootstrapMethodSpecifier(ClassReader cr) throws IOException { + bootstrap_method_ref = cr.readUnsignedShort(); + int method_count = cr.readUnsignedShort(); + bootstrap_arguments = new int[method_count]; + for (int i = 0; i < bootstrap_arguments.length; i++) { + bootstrap_arguments[i] = cr.readUnsignedShort(); + } + } + + int length() { + // u2 (method_ref) + u2 (argc) + u2 * argc + return 2 + 2 + (bootstrap_arguments.length * 2); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/CharacterRangeTable_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class CharacterRangeTable_attribute extends Attribute { + public static final int CRT_STATEMENT = 0x0001; + public static final int CRT_BLOCK = 0x0002; + public static final int CRT_ASSIGNMENT = 0x0004; + public static final int CRT_FLOW_CONTROLLER = 0x0008; + public static final int CRT_FLOW_TARGET = 0x0010; + public static final int CRT_INVOKE = 0x0020; + public static final int CRT_CREATE = 0x0040; + public static final int CRT_BRANCH_TRUE = 0x0080; + public static final int CRT_BRANCH_FALSE = 0x0100; + + CharacterRangeTable_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + int character_range_table_length = cr.readUnsignedShort(); + character_range_table = new Entry[character_range_table_length]; + for (int i = 0; i < character_range_table_length; i++) + character_range_table[i] = new Entry(cr); + } + + public CharacterRangeTable_attribute(ConstantPool constant_pool, Entry[] character_range_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.CharacterRangeTable), character_range_table); + } + + public CharacterRangeTable_attribute(int name_index, Entry[] character_range_table) { + super(name_index, 2 + character_range_table.length * Entry.length()); + this.character_range_table = character_range_table; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitCharacterRangeTable(this, data); + } + + public final Entry[] character_range_table; + + public static class Entry { + Entry(ClassReader cr) throws IOException { + start_pc = cr.readUnsignedShort(); + end_pc = cr.readUnsignedShort(); + character_range_start = cr.readInt(); + character_range_end = cr.readInt(); + flags = cr.readUnsignedShort(); + } + + public static int length() { + return 14; + } + + public final int start_pc; + public final int end_pc; + public final int character_range_start; + public final int character_range_end; + public final int flags; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ClassFile.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import static com.sun.tools.classfile.AccessFlags.*; + +/** + * See JVMS, section 4.2. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ClassFile { + public static ClassFile read(File file) + throws IOException, ConstantPoolException { + return read(file.toPath(), new Attribute.Factory()); + } + + public static ClassFile read(Path input) + throws IOException, ConstantPoolException { + return read(input, new Attribute.Factory()); + } + + public static ClassFile read(Path input, Attribute.Factory attributeFactory) + throws IOException, ConstantPoolException { + try (InputStream in = Files.newInputStream(input)) { + return new ClassFile(in, attributeFactory); + } + } + + public static ClassFile read(File file, Attribute.Factory attributeFactory) + throws IOException, ConstantPoolException { + return read(file.toPath(), attributeFactory); + } + + public static ClassFile read(InputStream in) + throws IOException, ConstantPoolException { + return new ClassFile(in, new Attribute.Factory()); + } + + public static ClassFile read(InputStream in, Attribute.Factory attributeFactory) + throws IOException, ConstantPoolException { + return new ClassFile(in, attributeFactory); + } + + ClassFile(InputStream in, Attribute.Factory attributeFactory) throws IOException, ConstantPoolException { + ClassReader cr = new ClassReader(this, in, attributeFactory); + magic = cr.readInt(); + minor_version = cr.readUnsignedShort(); + major_version = cr.readUnsignedShort(); + constant_pool = new ConstantPool(cr); + access_flags = new AccessFlags(cr); + this_class = cr.readUnsignedShort(); + super_class = cr.readUnsignedShort(); + + int interfaces_count = cr.readUnsignedShort(); + interfaces = new int[interfaces_count]; + for (int i = 0; i < interfaces_count; i++) + interfaces[i] = cr.readUnsignedShort(); + + int fields_count = cr.readUnsignedShort(); + fields = new Field[fields_count]; + for (int i = 0; i < fields_count; i++) + fields[i] = new Field(cr); + + int methods_count = cr.readUnsignedShort(); + methods = new Method[methods_count]; + for (int i = 0; i < methods_count; i++) + methods[i] = new Method(cr); + + attributes = new Attributes(cr); + } + + public ClassFile(int magic, int minor_version, int major_version, + ConstantPool constant_pool, AccessFlags access_flags, + int this_class, int super_class, int[] interfaces, + Field[] fields, Method[] methods, Attributes attributes) { + this.magic = magic; + this.minor_version = minor_version; + this.major_version = major_version; + this.constant_pool = constant_pool; + this.access_flags = access_flags; + this.this_class = this_class; + this.super_class = super_class; + this.interfaces = interfaces; + this.fields = fields; + this.methods = methods; + this.attributes = attributes; + } + + public String getName() throws ConstantPoolException { + return constant_pool.getClassInfo(this_class).getName(); + } + + public String getSuperclassName() throws ConstantPoolException { + return constant_pool.getClassInfo(super_class).getName(); + } + + public String getInterfaceName(int i) throws ConstantPoolException { + return constant_pool.getClassInfo(interfaces[i]).getName(); + } + + public Attribute getAttribute(String name) { + return attributes.get(name); + } + + public boolean isClass() { + return !isInterface(); + } + + public boolean isInterface() { + return access_flags.is(ACC_INTERFACE); + } + + public int byteLength() { + return 4 + // magic + 2 + // minor + 2 + // major + constant_pool.byteLength() + + 2 + // access flags + 2 + // this_class + 2 + // super_class + byteLength(interfaces) + + byteLength(fields) + + byteLength(methods) + + attributes.byteLength(); + } + + private int byteLength(int[] indices) { + return 2 + 2 * indices.length; + } + + private int byteLength(Field[] fields) { + int length = 2; + for (Field f: fields) + length += f.byteLength(); + return length; + } + + private int byteLength(Method[] methods) { + int length = 2; + for (Method m: methods) + length += m.byteLength(); + return length; + } + + public final int magic; + public final int minor_version; + public final int major_version; + public final ConstantPool constant_pool; + public final AccessFlags access_flags; + public final int this_class; + public final int super_class; + public final int[] interfaces; + public final Field[] fields; + public final Method[] methods; + public final Attributes attributes; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ClassReader.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ClassReader { + ClassReader(ClassFile classFile, InputStream in, Attribute.Factory attributeFactory) throws IOException { + this.classFile = Objects.requireNonNull(classFile); + this.attributeFactory = Objects.requireNonNull(attributeFactory); + this.in = new DataInputStream(new BufferedInputStream(in)); + } + + ClassFile getClassFile() { + return classFile; + } + + ConstantPool getConstantPool() { + return classFile.constant_pool; + } + + public Attribute readAttribute() throws IOException { + int name_index = readUnsignedShort(); + int length = readInt(); + byte[] data = new byte[length]; + readFully(data); + + DataInputStream prev = in; + in = new DataInputStream(new ByteArrayInputStream(data)); + try { + return attributeFactory.createAttribute(this, name_index, data); + } finally { + in = prev; + } + } + + public void readFully(byte[] b) throws IOException { + in.readFully(b); + } + + public int readUnsignedByte() throws IOException { + return in.readUnsignedByte(); + } + + public int readUnsignedShort() throws IOException { + return in.readUnsignedShort(); + } + + public int readInt() throws IOException { + return in.readInt(); + } + + public long readLong() throws IOException { + return in.readLong(); + } + + public float readFloat() throws IOException { + return in.readFloat(); + } + + public double readDouble() throws IOException { + return in.readDouble(); + } + + public String readUTF() throws IOException { + return in.readUTF(); + } + + private DataInputStream in; + private ClassFile classFile; + private Attribute.Factory attributeFactory; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ClassTranslator.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,410 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.Map; + +import com.sun.tools.classfile.ConstantPool.CONSTANT_Class_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Double_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Fieldref_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Float_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Integer_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_InterfaceMethodref_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_InvokeDynamic_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Long_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_MethodHandle_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_MethodType_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Methodref_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_String_info; +import com.sun.tools.classfile.ConstantPool.CONSTANT_Utf8_info; +import com.sun.tools.classfile.ConstantPool.CPInfo; + +/** + * Rewrites a class file using a map of translations. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ClassTranslator + implements ConstantPool.Visitor<ConstantPool.CPInfo,Map<Object,Object>> { + /** + * Create a new ClassFile from {@code cf}, such that for all entries + * {@code k -\> v} in {@code translations}, + * each occurrence of {@code k} in {@code cf} will be replaced by {@code v}. + * in + * @param cf the class file to be processed + * @param translations the set of translations to be applied + * @return a copy of {@code} with the values in {@code translations} substituted + */ + public ClassFile translate(ClassFile cf, Map<Object,Object> translations) { + ClassFile cf2 = (ClassFile) translations.get(cf); + if (cf2 == null) { + ConstantPool constant_pool2 = translate(cf.constant_pool, translations); + Field[] fields2 = translate(cf.fields, cf.constant_pool, translations); + Method[] methods2 = translateMethods(cf.methods, cf.constant_pool, translations); + Attributes attributes2 = translateAttributes(cf.attributes, cf.constant_pool, + translations); + + if (constant_pool2 == cf.constant_pool && + fields2 == cf.fields && + methods2 == cf.methods && + attributes2 == cf.attributes) + cf2 = cf; + else + cf2 = new ClassFile( + cf.magic, + cf.minor_version, + cf.major_version, + constant_pool2, + cf.access_flags, + cf.this_class, + cf.super_class, + cf.interfaces, + fields2, + methods2, + attributes2); + translations.put(cf, cf2); + } + return cf2; + } + + ConstantPool translate(ConstantPool cp, Map<Object,Object> translations) { + ConstantPool cp2 = (ConstantPool) translations.get(cp); + if (cp2 == null) { + ConstantPool.CPInfo[] pool2 = new ConstantPool.CPInfo[cp.size()]; + boolean eq = true; + for (int i = 0; i < cp.size(); ) { + ConstantPool.CPInfo cpInfo; + try { + cpInfo = cp.get(i); + } catch (ConstantPool.InvalidIndex e) { + throw new IllegalStateException(e); + } + ConstantPool.CPInfo cpInfo2 = translate(cpInfo, translations); + eq &= (cpInfo == cpInfo2); + pool2[i] = cpInfo2; + if (cpInfo.getTag() != cpInfo2.getTag()) + throw new IllegalStateException(); + i += cpInfo.size(); + } + + if (eq) + cp2 = cp; + else + cp2 = new ConstantPool(pool2); + + translations.put(cp, cp2); + } + return cp2; + } + + ConstantPool.CPInfo translate(ConstantPool.CPInfo cpInfo, Map<Object,Object> translations) { + ConstantPool.CPInfo cpInfo2 = (ConstantPool.CPInfo) translations.get(cpInfo); + if (cpInfo2 == null) { + cpInfo2 = cpInfo.accept(this, translations); + translations.put(cpInfo, cpInfo2); + } + return cpInfo2; + } + + Field[] translate(Field[] fields, ConstantPool constant_pool, Map<Object,Object> translations) { + Field[] fields2 = (Field[]) translations.get(fields); + if (fields2 == null) { + fields2 = new Field[fields.length]; + for (int i = 0; i < fields.length; i++) + fields2[i] = translate(fields[i], constant_pool, translations); + if (equal(fields, fields2)) + fields2 = fields; + translations.put(fields, fields2); + } + return fields2; + } + + Field translate(Field field, ConstantPool constant_pool, Map<Object,Object> translations) { + Field field2 = (Field) translations.get(field); + if (field2 == null) { + Attributes attributes2 = translateAttributes(field.attributes, constant_pool, + translations); + + if (attributes2 == field.attributes) + field2 = field; + else + field2 = new Field( + field.access_flags, + field.name_index, + field.descriptor, + attributes2); + translations.put(field, field2); + } + return field2; + } + + Method[] translateMethods(Method[] methods, ConstantPool constant_pool, Map<Object,Object> translations) { + Method[] methods2 = (Method[]) translations.get(methods); + if (methods2 == null) { + methods2 = new Method[methods.length]; + for (int i = 0; i < methods.length; i++) + methods2[i] = translate(methods[i], constant_pool, translations); + if (equal(methods, methods2)) + methods2 = methods; + translations.put(methods, methods2); + } + return methods2; + } + + Method translate(Method method, ConstantPool constant_pool, Map<Object,Object> translations) { + Method method2 = (Method) translations.get(method); + if (method2 == null) { + Attributes attributes2 = translateAttributes(method.attributes, constant_pool, + translations); + + if (attributes2 == method.attributes) + method2 = method; + else + method2 = new Method( + method.access_flags, + method.name_index, + method.descriptor, + attributes2); + translations.put(method, method2); + } + return method2; + } + + Attributes translateAttributes(Attributes attributes, + ConstantPool constant_pool, Map<Object,Object> translations) { + Attributes attributes2 = (Attributes) translations.get(attributes); + if (attributes2 == null) { + Attribute[] attrArray2 = new Attribute[attributes.size()]; + ConstantPool constant_pool2 = translate(constant_pool, translations); + boolean attrsEqual = true; + for (int i = 0; i < attributes.size(); i++) { + Attribute attr = attributes.get(i); + Attribute attr2 = translate(attr, translations); + if (attr2 != attr) + attrsEqual = false; + attrArray2[i] = attr2; + } + if ((constant_pool2 == constant_pool) && attrsEqual) + attributes2 = attributes; + else + attributes2 = new Attributes(constant_pool2, attrArray2); + translations.put(attributes, attributes2); + } + return attributes2; + } + + Attribute translate(Attribute attribute, Map<Object,Object> translations) { + Attribute attribute2 = (Attribute) translations.get(attribute); + if (attribute2 == null) { + attribute2 = attribute; // don't support translation within attributes yet + // (what about Code attribute) + translations.put(attribute, attribute2); + } + return attribute2; + } + + private static <T> boolean equal(T[] a1, T[] a2) { + if (a1 == null || a2 == null) + return (a1 == a2); + if (a1.length != a2.length) + return false; + for (int i = 0; i < a1.length; i++) { + if (a1[i] != a2[i]) + return false; + } + return true; + } + + public CPInfo visitClass(CONSTANT_Class_info info, Map<Object, Object> translations) { + CONSTANT_Class_info info2 = (CONSTANT_Class_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_Class_info(cp2, info.name_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitDouble(CONSTANT_Double_info info, Map<Object, Object> translations) { + CONSTANT_Double_info info2 = (CONSTANT_Double_info) translations.get(info); + if (info2 == null) { + info2 = info; + translations.put(info, info2); + } + return info; + } + + public CPInfo visitFieldref(CONSTANT_Fieldref_info info, Map<Object, Object> translations) { + CONSTANT_Fieldref_info info2 = (CONSTANT_Fieldref_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_Fieldref_info(cp2, info.class_index, info.name_and_type_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitFloat(CONSTANT_Float_info info, Map<Object, Object> translations) { + CONSTANT_Float_info info2 = (CONSTANT_Float_info) translations.get(info); + if (info2 == null) { + info2 = info; + translations.put(info, info2); + } + return info; + } + + public CPInfo visitInteger(CONSTANT_Integer_info info, Map<Object, Object> translations) { + CONSTANT_Integer_info info2 = (CONSTANT_Integer_info) translations.get(info); + if (info2 == null) { + info2 = info; + translations.put(info, info2); + } + return info; + } + + public CPInfo visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Map<Object, Object> translations) { + CONSTANT_InterfaceMethodref_info info2 = (CONSTANT_InterfaceMethodref_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_InterfaceMethodref_info(cp2, info.class_index, info.name_and_type_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Map<Object, Object> translations) { + CONSTANT_InvokeDynamic_info info2 = (CONSTANT_InvokeDynamic_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) { + info2 = info; + } else { + info2 = new CONSTANT_InvokeDynamic_info(cp2, info.bootstrap_method_attr_index, info.name_and_type_index); + } + translations.put(info, info2); + } + return info; + } + + public CPInfo visitLong(CONSTANT_Long_info info, Map<Object, Object> translations) { + CONSTANT_Long_info info2 = (CONSTANT_Long_info) translations.get(info); + if (info2 == null) { + info2 = info; + translations.put(info, info2); + } + return info; + } + + public CPInfo visitNameAndType(CONSTANT_NameAndType_info info, Map<Object, Object> translations) { + CONSTANT_NameAndType_info info2 = (CONSTANT_NameAndType_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_NameAndType_info(cp2, info.name_index, info.type_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitMethodref(CONSTANT_Methodref_info info, Map<Object, Object> translations) { + CONSTANT_Methodref_info info2 = (CONSTANT_Methodref_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_Methodref_info(cp2, info.class_index, info.name_and_type_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitMethodHandle(CONSTANT_MethodHandle_info info, Map<Object, Object> translations) { + CONSTANT_MethodHandle_info info2 = (CONSTANT_MethodHandle_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) { + info2 = info; + } else { + info2 = new CONSTANT_MethodHandle_info(cp2, info.reference_kind, info.reference_index); + } + translations.put(info, info2); + } + return info; + } + + public CPInfo visitMethodType(CONSTANT_MethodType_info info, Map<Object, Object> translations) { + CONSTANT_MethodType_info info2 = (CONSTANT_MethodType_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) { + info2 = info; + } else { + info2 = new CONSTANT_MethodType_info(cp2, info.descriptor_index); + } + translations.put(info, info2); + } + return info; + } + + public CPInfo visitString(CONSTANT_String_info info, Map<Object, Object> translations) { + CONSTANT_String_info info2 = (CONSTANT_String_info) translations.get(info); + if (info2 == null) { + ConstantPool cp2 = translate(info.cp, translations); + if (cp2 == info.cp) + info2 = info; + else + info2 = new CONSTANT_String_info(cp2, info.string_index); + translations.put(info, info2); + } + return info; + } + + public CPInfo visitUtf8(CONSTANT_Utf8_info info, Map<Object, Object> translations) { + CONSTANT_Utf8_info info2 = (CONSTANT_Utf8_info) translations.get(info); + if (info2 == null) { + info2 = info; + translations.put(info, info2); + } + return info; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ClassWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,808 @@ + +/* + * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import static com.sun.tools.classfile.Annotation.*; +import static com.sun.tools.classfile.ConstantPool.*; +import static com.sun.tools.classfile.StackMapTable_attribute.*; +import static com.sun.tools.classfile.StackMapTable_attribute.verification_type_info.*; + +/** + * Write a ClassFile data structure to a file or stream. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ClassWriter { + public ClassWriter() { + attributeWriter = new AttributeWriter(); + constantPoolWriter = new ConstantPoolWriter(); + out = new ClassOutputStream(); + } + + /** + * Write a ClassFile data structure to a file. + */ + public void write(ClassFile classFile, File f) throws IOException { + try (FileOutputStream f_out = new FileOutputStream(f)) { + write(classFile, f_out); + } + } + + /** + * Write a ClassFile data structure to a stream. + */ + public void write(ClassFile classFile, OutputStream s) throws IOException { + this.classFile = classFile; + out.reset(); + write(); + out.writeTo(s); + } + + protected void write() throws IOException { + writeHeader(); + writeConstantPool(); + writeAccessFlags(classFile.access_flags); + writeClassInfo(); + writeFields(); + writeMethods(); + writeAttributes(classFile.attributes); + } + + protected void writeHeader() { + out.writeInt(classFile.magic); + out.writeShort(classFile.minor_version); + out.writeShort(classFile.major_version); + } + + protected void writeAccessFlags(AccessFlags flags) { + out.writeShort(flags.flags); + } + + protected void writeAttributes(Attributes attributes) { + int size = attributes.size(); + out.writeShort(size); + for (Attribute attr: attributes) + attributeWriter.write(attr, out); + } + + protected void writeClassInfo() { + out.writeShort(classFile.this_class); + out.writeShort(classFile.super_class); + int[] interfaces = classFile.interfaces; + out.writeShort(interfaces.length); + for (int i: interfaces) + out.writeShort(i); + } + + protected void writeDescriptor(Descriptor d) { + out.writeShort(d.index); + } + + protected void writeConstantPool() { + ConstantPool pool = classFile.constant_pool; + int size = pool.size(); + out.writeShort(size); + for (CPInfo cpInfo: pool.entries()) + constantPoolWriter.write(cpInfo, out); + } + + protected void writeFields() throws IOException { + Field[] fields = classFile.fields; + out.writeShort(fields.length); + for (Field f: fields) + writeField(f); + } + + protected void writeField(Field f) throws IOException { + writeAccessFlags(f.access_flags); + out.writeShort(f.name_index); + writeDescriptor(f.descriptor); + writeAttributes(f.attributes); + } + + protected void writeMethods() throws IOException { + Method[] methods = classFile.methods; + out.writeShort(methods.length); + for (Method m: methods) { + writeMethod(m); + } + } + + protected void writeMethod(Method m) throws IOException { + writeAccessFlags(m.access_flags); + out.writeShort(m.name_index); + writeDescriptor(m.descriptor); + writeAttributes(m.attributes); + } + + protected ClassFile classFile; + protected ClassOutputStream out; + protected AttributeWriter attributeWriter; + protected ConstantPoolWriter constantPoolWriter; + + /** + * Subtype of ByteArrayOutputStream with the convenience methods of + * a DataOutputStream. Since ByteArrayOutputStream does not throw + * IOException, there are no exceptions from the additional + * convenience methods either, + */ + protected static class ClassOutputStream extends ByteArrayOutputStream { + public ClassOutputStream() { + d = new DataOutputStream(this); + } + + public void writeByte(int value) { + try { + d.writeByte(value); + } catch (IOException ignore) { + } + } + + public void writeShort(int value) { + try { + d.writeShort(value); + } catch (IOException ignore) { + } + } + + public void writeInt(int value) { + try { + d.writeInt(value); + } catch (IOException ignore) { + } + } + + public void writeLong(long value) { + try { + d.writeLong(value); + } catch (IOException ignore) { + } + } + + public void writeFloat(float value) { + try { + d.writeFloat(value); + } catch (IOException ignore) { + } + } + + public void writeDouble(double value) { + try { + d.writeDouble(value); + } catch (IOException ignore) { + } + } + + public void writeUTF(String value) { + try { + d.writeUTF(value); + } catch (IOException ignore) { + } + } + + public void writeTo(ClassOutputStream s) { + try { + super.writeTo(s); + } catch (IOException ignore) { + } + } + + private DataOutputStream d; + } + + /** + * Writer for the entries in the constant pool. + */ + protected static class ConstantPoolWriter + implements ConstantPool.Visitor<Integer,ClassOutputStream> { + protected int write(CPInfo info, ClassOutputStream out) { + out.writeByte(info.getTag()); + return info.accept(this, out); + } + + public Integer visitClass(CONSTANT_Class_info info, ClassOutputStream out) { + out.writeShort(info.name_index); + return 1; + } + + public Integer visitDouble(CONSTANT_Double_info info, ClassOutputStream out) { + out.writeDouble(info.value); + return 2; + } + + public Integer visitFieldref(CONSTANT_Fieldref_info info, ClassOutputStream out) { + writeRef(info, out); + return 1; + } + + public Integer visitFloat(CONSTANT_Float_info info, ClassOutputStream out) { + out.writeFloat(info.value); + return 1; + } + + public Integer visitInteger(CONSTANT_Integer_info info, ClassOutputStream out) { + out.writeInt(info.value); + return 1; + } + + public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, ClassOutputStream out) { + writeRef(info, out); + return 1; + } + + public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, ClassOutputStream out) { + out.writeShort(info.bootstrap_method_attr_index); + out.writeShort(info.name_and_type_index); + return 1; + } + + public Integer visitLong(CONSTANT_Long_info info, ClassOutputStream out) { + out.writeLong(info.value); + return 2; + } + + public Integer visitNameAndType(CONSTANT_NameAndType_info info, ClassOutputStream out) { + out.writeShort(info.name_index); + out.writeShort(info.type_index); + return 1; + } + + public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, ClassOutputStream out) { + out.writeByte(info.reference_kind.tag); + out.writeShort(info.reference_index); + return 1; + } + + public Integer visitMethodType(CONSTANT_MethodType_info info, ClassOutputStream out) { + out.writeShort(info.descriptor_index); + return 1; + } + + public Integer visitMethodref(CONSTANT_Methodref_info info, ClassOutputStream out) { + return writeRef(info, out); + } + + public Integer visitString(CONSTANT_String_info info, ClassOutputStream out) { + out.writeShort(info.string_index); + return 1; + } + + public Integer visitUtf8(CONSTANT_Utf8_info info, ClassOutputStream out) { + out.writeUTF(info.value); + return 1; + } + + protected Integer writeRef(CPRefInfo info, ClassOutputStream out) { + out.writeShort(info.class_index); + out.writeShort(info.name_and_type_index); + return 1; + } + } + + /** + * Writer for the different types of attribute. + */ + protected static class AttributeWriter implements Attribute.Visitor<Void,ClassOutputStream> { + public void write(Attributes attributes, ClassOutputStream out) { + int size = attributes.size(); + out.writeShort(size); + for (Attribute a: attributes) + write(a, out); + } + + // Note: due to the use of shared resources, this method is not reentrant. + public void write(Attribute attr, ClassOutputStream out) { + out.writeShort(attr.attribute_name_index); + sharedOut.reset(); + attr.accept(this, sharedOut); + out.writeInt(sharedOut.size()); + sharedOut.writeTo(out); + } + + protected ClassOutputStream sharedOut = new ClassOutputStream(); + protected AnnotationWriter annotationWriter = new AnnotationWriter(); + + public Void visitDefault(DefaultAttribute attr, ClassOutputStream out) { + out.write(attr.info, 0, attr.info.length); + return null; + } + + public Void visitAnnotationDefault(AnnotationDefault_attribute attr, ClassOutputStream out) { + annotationWriter.write(attr.default_value, out); + return null; + } + + public Void visitBootstrapMethods(BootstrapMethods_attribute attr, ClassOutputStream out) { + out.writeShort(attr.bootstrap_method_specifiers.length); + for (BootstrapMethods_attribute.BootstrapMethodSpecifier bsm : attr.bootstrap_method_specifiers) { + out.writeShort(bsm.bootstrap_method_ref); + int bsm_args_count = bsm.bootstrap_arguments.length; + out.writeShort(bsm_args_count); + for (int i : bsm.bootstrap_arguments) { + out.writeShort(i); + } + } + return null; + } + + public Void visitCharacterRangeTable(CharacterRangeTable_attribute attr, ClassOutputStream out) { + out.writeShort(attr.character_range_table.length); + for (CharacterRangeTable_attribute.Entry e: attr.character_range_table) + writeCharacterRangeTableEntry(e, out); + return null; + } + + protected void writeCharacterRangeTableEntry(CharacterRangeTable_attribute.Entry entry, ClassOutputStream out) { + out.writeShort(entry.start_pc); + out.writeShort(entry.end_pc); + out.writeInt(entry.character_range_start); + out.writeInt(entry.character_range_end); + out.writeShort(entry.flags); + } + + public Void visitCode(Code_attribute attr, ClassOutputStream out) { + out.writeShort(attr.max_stack); + out.writeShort(attr.max_locals); + out.writeInt(attr.code.length); + out.write(attr.code, 0, attr.code.length); + out.writeShort(attr.exception_table.length); + for (Code_attribute.Exception_data e: attr.exception_table) + writeExceptionTableEntry(e, out); + new AttributeWriter().write(attr.attributes, out); + return null; + } + + protected void writeExceptionTableEntry(Code_attribute.Exception_data exception_data, ClassOutputStream out) { + out.writeShort(exception_data.start_pc); + out.writeShort(exception_data.end_pc); + out.writeShort(exception_data.handler_pc); + out.writeShort(exception_data.catch_type); + } + + public Void visitCompilationID(CompilationID_attribute attr, ClassOutputStream out) { + out.writeShort(attr.compilationID_index); + return null; + } + + public Void visitConstantValue(ConstantValue_attribute attr, ClassOutputStream out) { + out.writeShort(attr.constantvalue_index); + return null; + } + + public Void visitDeprecated(Deprecated_attribute attr, ClassOutputStream out) { + return null; + } + + public Void visitEnclosingMethod(EnclosingMethod_attribute attr, ClassOutputStream out) { + out.writeShort(attr.class_index); + out.writeShort(attr.method_index); + return null; + } + + public Void visitExceptions(Exceptions_attribute attr, ClassOutputStream out) { + out.writeShort(attr.exception_index_table.length); + for (int i: attr.exception_index_table) + out.writeShort(i); + return null; + } + + public Void visitInnerClasses(InnerClasses_attribute attr, ClassOutputStream out) { + out.writeShort(attr.classes.length); + for (InnerClasses_attribute.Info info: attr.classes) + writeInnerClassesInfo(info, out); + return null; + } + + protected void writeInnerClassesInfo(InnerClasses_attribute.Info info, ClassOutputStream out) { + out.writeShort(info.inner_class_info_index); + out.writeShort(info.outer_class_info_index); + out.writeShort(info.inner_name_index); + writeAccessFlags(info.inner_class_access_flags, out); + } + + public Void visitLineNumberTable(LineNumberTable_attribute attr, ClassOutputStream out) { + out.writeShort(attr.line_number_table.length); + for (LineNumberTable_attribute.Entry e: attr.line_number_table) + writeLineNumberTableEntry(e, out); + return null; + } + + protected void writeLineNumberTableEntry(LineNumberTable_attribute.Entry entry, ClassOutputStream out) { + out.writeShort(entry.start_pc); + out.writeShort(entry.line_number); + } + + public Void visitLocalVariableTable(LocalVariableTable_attribute attr, ClassOutputStream out) { + out.writeShort(attr.local_variable_table.length); + for (LocalVariableTable_attribute.Entry e: attr.local_variable_table) + writeLocalVariableTableEntry(e, out); + return null; + } + + protected void writeLocalVariableTableEntry(LocalVariableTable_attribute.Entry entry, ClassOutputStream out) { + out.writeShort(entry.start_pc); + out.writeShort(entry.length); + out.writeShort(entry.name_index); + out.writeShort(entry.descriptor_index); + out.writeShort(entry.index); + } + + public Void visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, ClassOutputStream out) { + out.writeShort(attr.local_variable_table.length); + for (LocalVariableTypeTable_attribute.Entry e: attr.local_variable_table) + writeLocalVariableTypeTableEntry(e, out); + return null; + } + + protected void writeLocalVariableTypeTableEntry(LocalVariableTypeTable_attribute.Entry entry, ClassOutputStream out) { + out.writeShort(entry.start_pc); + out.writeShort(entry.length); + out.writeShort(entry.name_index); + out.writeShort(entry.signature_index); + out.writeShort(entry.index); + } + + public Void visitMethodParameters(MethodParameters_attribute attr, ClassOutputStream out) { + out.writeByte(attr.method_parameter_table.length); + for (MethodParameters_attribute.Entry e : attr.method_parameter_table) { + out.writeShort(e.name_index); + out.writeShort(e.flags); + } + return null; + } + + public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, ClassOutputStream out) { + annotationWriter.write(attr.annotations, out); + return null; + } + + public Void visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, ClassOutputStream out) { + annotationWriter.write(attr.annotations, out); + return null; + } + + public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, ClassOutputStream out) { + annotationWriter.write(attr.annotations, out); + return null; + } + + public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, ClassOutputStream out) { + annotationWriter.write(attr.annotations, out); + return null; + } + + public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, ClassOutputStream out) { + out.writeByte(attr.parameter_annotations.length); + for (Annotation[] annos: attr.parameter_annotations) + annotationWriter.write(annos, out); + return null; + } + + public Void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, ClassOutputStream out) { + out.writeByte(attr.parameter_annotations.length); + for (Annotation[] annos: attr.parameter_annotations) + annotationWriter.write(annos, out); + return null; + } + + public Void visitSignature(Signature_attribute attr, ClassOutputStream out) { + out.writeShort(attr.signature_index); + return null; + } + + public Void visitSourceDebugExtension(SourceDebugExtension_attribute attr, ClassOutputStream out) { + out.write(attr.debug_extension, 0, attr.debug_extension.length); + return null; + } + + public Void visitSourceFile(SourceFile_attribute attr, ClassOutputStream out) { + out.writeShort(attr.sourcefile_index); + return null; + } + + public Void visitSourceID(SourceID_attribute attr, ClassOutputStream out) { + out.writeShort(attr.sourceID_index); + return null; + } + + public Void visitStackMap(StackMap_attribute attr, ClassOutputStream out) { + if (stackMapWriter == null) + stackMapWriter = new StackMapTableWriter(); + + out.writeShort(attr.entries.length); + for (stack_map_frame f: attr.entries) + stackMapWriter.write(f, out); + return null; + } + + public Void visitStackMapTable(StackMapTable_attribute attr, ClassOutputStream out) { + if (stackMapWriter == null) + stackMapWriter = new StackMapTableWriter(); + + out.writeShort(attr.entries.length); + for (stack_map_frame f: attr.entries) + stackMapWriter.write(f, out); + return null; + } + + public Void visitSynthetic(Synthetic_attribute attr, ClassOutputStream out) { + return null; + } + + protected void writeAccessFlags(AccessFlags flags, ClassOutputStream p) { + sharedOut.writeShort(flags.flags); + } + + protected StackMapTableWriter stackMapWriter; + } + + /** + * Writer for the frames of StackMap and StackMapTable attributes. + */ + protected static class StackMapTableWriter + implements stack_map_frame.Visitor<Void,ClassOutputStream> { + + public void write(stack_map_frame frame, ClassOutputStream out) { + out.write(frame.frame_type); + frame.accept(this, out); + } + + public Void visit_same_frame(same_frame frame, ClassOutputStream p) { + return null; + } + + public Void visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, ClassOutputStream out) { + writeVerificationTypeInfo(frame.stack[0], out); + return null; + } + + public Void visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, ClassOutputStream out) { + out.writeShort(frame.offset_delta); + writeVerificationTypeInfo(frame.stack[0], out); + return null; + } + + public Void visit_chop_frame(chop_frame frame, ClassOutputStream out) { + out.writeShort(frame.offset_delta); + return null; + } + + public Void visit_same_frame_extended(same_frame_extended frame, ClassOutputStream out) { + out.writeShort(frame.offset_delta); + return null; + } + + public Void visit_append_frame(append_frame frame, ClassOutputStream out) { + out.writeShort(frame.offset_delta); + for (verification_type_info l: frame.locals) + writeVerificationTypeInfo(l, out); + return null; + } + + public Void visit_full_frame(full_frame frame, ClassOutputStream out) { + out.writeShort(frame.offset_delta); + out.writeShort(frame.locals.length); + for (verification_type_info l: frame.locals) + writeVerificationTypeInfo(l, out); + out.writeShort(frame.stack.length); + for (verification_type_info s: frame.stack) + writeVerificationTypeInfo(s, out); + return null; + } + + protected void writeVerificationTypeInfo(verification_type_info info, + ClassOutputStream out) { + out.write(info.tag); + switch (info.tag) { + case ITEM_Top: + case ITEM_Integer: + case ITEM_Float: + case ITEM_Long: + case ITEM_Double: + case ITEM_Null: + case ITEM_UninitializedThis: + break; + + case ITEM_Object: + Object_variable_info o = (Object_variable_info) info; + out.writeShort(o.cpool_index); + break; + + case ITEM_Uninitialized: + Uninitialized_variable_info u = (Uninitialized_variable_info) info; + out.writeShort(u.offset); + break; + + default: + throw new Error(); + } + } + } + + /** + * Writer for annotations and the values they contain. + */ + protected static class AnnotationWriter + implements Annotation.element_value.Visitor<Void,ClassOutputStream> { + public void write(Annotation[] annos, ClassOutputStream out) { + out.writeShort(annos.length); + for (Annotation anno: annos) + write(anno, out); + } + + public void write(TypeAnnotation[] annos, ClassOutputStream out) { + out.writeShort(annos.length); + for (TypeAnnotation anno: annos) + write(anno, out); + } + + public void write(Annotation anno, ClassOutputStream out) { + out.writeShort(anno.type_index); + out.writeShort(anno.element_value_pairs.length); + for (element_value_pair p: anno.element_value_pairs) + write(p, out); + } + + public void write(TypeAnnotation anno, ClassOutputStream out) { + write(anno.position, out); + write(anno.annotation, out); + } + + public void write(element_value_pair pair, ClassOutputStream out) { + out.writeShort(pair.element_name_index); + write(pair.value, out); + } + + public void write(element_value ev, ClassOutputStream out) { + out.writeByte(ev.tag); + ev.accept(this, out); + } + + public Void visitPrimitive(Primitive_element_value ev, ClassOutputStream out) { + out.writeShort(ev.const_value_index); + return null; + } + + public Void visitEnum(Enum_element_value ev, ClassOutputStream out) { + out.writeShort(ev.type_name_index); + out.writeShort(ev.const_name_index); + return null; + } + + public Void visitClass(Class_element_value ev, ClassOutputStream out) { + out.writeShort(ev.class_info_index); + return null; + } + + public Void visitAnnotation(Annotation_element_value ev, ClassOutputStream out) { + write(ev.annotation_value, out); + return null; + } + + public Void visitArray(Array_element_value ev, ClassOutputStream out) { + out.writeShort(ev.num_values); + for (element_value v: ev.values) + write(v, out); + return null; + } + + // TODO: Move this to TypeAnnotation to be closer with similar logic? + private void write(TypeAnnotation.Position p, ClassOutputStream out) { + out.writeByte(p.type.targetTypeValue()); + switch (p.type) { + // instanceof + case INSTANCEOF: + // new expression + case NEW: + // constructor/method reference receiver + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: + out.writeShort(p.offset); + break; + // local variable + case LOCAL_VARIABLE: + // resource variable + case RESOURCE_VARIABLE: + int table_length = p.lvarOffset.length; + out.writeShort(table_length); + for (int i = 0; i < table_length; ++i) { + out.writeShort(1); // for table length + out.writeShort(p.lvarOffset[i]); + out.writeShort(p.lvarLength[i]); + out.writeShort(p.lvarIndex[i]); + } + break; + // exception parameter + case EXCEPTION_PARAMETER: + out.writeShort(p.exception_index); + break; + // method receiver + case METHOD_RECEIVER: + // Do nothing + break; + // type parameters + case CLASS_TYPE_PARAMETER: + case METHOD_TYPE_PARAMETER: + out.writeByte(p.parameter_index); + break; + // type parameters bounds + case CLASS_TYPE_PARAMETER_BOUND: + case METHOD_TYPE_PARAMETER_BOUND: + out.writeByte(p.parameter_index); + out.writeByte(p.bound_index); + break; + // class extends or implements clause + case CLASS_EXTENDS: + out.writeShort(p.type_index); + break; + // throws + case THROWS: + out.writeShort(p.type_index); + break; + // method parameter + case METHOD_FORMAL_PARAMETER: + out.writeByte(p.parameter_index); + break; + // type cast + case CAST: + // method/constructor/reference type argument + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: + case METHOD_REFERENCE_TYPE_ARGUMENT: + out.writeShort(p.offset); + out.writeByte(p.type_index); + break; + // We don't need to worry about these + case METHOD_RETURN: + case FIELD: + break; + case UNKNOWN: + throw new AssertionError("ClassWriter: UNKNOWN target type should never occur!"); + default: + throw new AssertionError("ClassWriter: Unknown target type for position: " + p); + } + + { // Append location data for generics/arrays. + // TODO: check for overrun? + out.writeByte((byte)p.location.size()); + for (int i : TypeAnnotation.Position.getBinaryFromTypePath(p.location)) + out.writeByte((byte)i); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Code_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; +import java.util.Iterator; +import java.util.NoSuchElementException; + +/** + * See JVMS, section 4.8.3. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Code_attribute extends Attribute { + public static class InvalidIndex extends AttributeException { + private static final long serialVersionUID = -8904527774589382802L; + InvalidIndex(int index) { + this.index = index; + } + + @Override + public String getMessage() { + // i18n + return "invalid index " + index + " in Code attribute"; + } + + public final int index; + } + + Code_attribute(ClassReader cr, int name_index, int length) + throws IOException, ConstantPoolException { + super(name_index, length); + max_stack = cr.readUnsignedShort(); + max_locals = cr.readUnsignedShort(); + code_length = cr.readInt(); + code = new byte[code_length]; + cr.readFully(code); + exception_table_length = cr.readUnsignedShort(); + exception_table = new Exception_data[exception_table_length]; + for (int i = 0; i < exception_table_length; i++) + exception_table[i] = new Exception_data(cr); + attributes = new Attributes(cr); + } + + public int getByte(int offset) throws InvalidIndex { + if (offset < 0 || offset >= code.length) + throw new InvalidIndex(offset); + return code[offset]; + } + + public int getUnsignedByte(int offset) throws InvalidIndex { + if (offset < 0 || offset >= code.length) + throw new InvalidIndex(offset); + return code[offset] & 0xff; + } + + public int getShort(int offset) throws InvalidIndex { + if (offset < 0 || offset + 1 >= code.length) + throw new InvalidIndex(offset); + return (code[offset] << 8) | (code[offset + 1] & 0xFF); + } + + public int getUnsignedShort(int offset) throws InvalidIndex { + if (offset < 0 || offset + 1 >= code.length) + throw new InvalidIndex(offset); + return ((code[offset] << 8) | (code[offset + 1] & 0xFF)) & 0xFFFF; + } + + public int getInt(int offset) throws InvalidIndex { + if (offset < 0 || offset + 3 >= code.length) + throw new InvalidIndex(offset); + return (getShort(offset) << 16) | (getShort(offset + 2) & 0xFFFF); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitCode(this, data); + } + + public Iterable<Instruction> getInstructions() { + return new Iterable<Instruction>() { + public Iterator<Instruction> iterator() { + return new Iterator<Instruction>() { + + public boolean hasNext() { + return (next != null); + } + + public Instruction next() { + if (next == null) + throw new NoSuchElementException(); + + current = next; + pc += current.length(); + next = (pc < code.length ? new Instruction(code, pc) : null); + return current; + } + + public void remove() { + throw new UnsupportedOperationException("Not supported."); + } + + Instruction current = null; + int pc = 0; + Instruction next = new Instruction(code, pc); + + }; + } + + }; + } + + public final int max_stack; + public final int max_locals; + public final int code_length; + public final byte[] code; + public final int exception_table_length; + public final Exception_data[] exception_table; + public final Attributes attributes; + + public static class Exception_data { + Exception_data(ClassReader cr) throws IOException { + start_pc = cr.readUnsignedShort(); + end_pc = cr.readUnsignedShort(); + handler_pc = cr.readUnsignedShort(); + catch_type = cr.readUnsignedShort(); + } + + public final int start_pc; + public final int end_pc; + public final int handler_pc; + public final int catch_type; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/CompilationID_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class CompilationID_attribute extends Attribute { + + CompilationID_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + compilationID_index = cr.readUnsignedShort(); + } + + public CompilationID_attribute(ConstantPool constant_pool, int compilationID_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.CompilationID), compilationID_index); + } + + public CompilationID_attribute(int name_index, int compilationID_index) { + super(name_index, 2); + this.compilationID_index = compilationID_index; + } + + String getCompilationID(ConstantPool constant_pool) + throws ConstantPoolException { + return constant_pool.getUTF8Value(compilationID_index); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitCompilationID(this, data); + } + + public final int compilationID_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ConstantPool.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,914 @@ +/* + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Iterator; + +/** + * See JVMS, section 4.5. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ConstantPool { + + public static class InvalidIndex extends ConstantPoolException { + private static final long serialVersionUID = -4350294289300939730L; + InvalidIndex(int index) { + super(index); + } + + @Override + public String getMessage() { + // i18n + return "invalid index #" + index; + } + } + + public static class UnexpectedEntry extends ConstantPoolException { + private static final long serialVersionUID = 6986335935377933211L; + UnexpectedEntry(int index, int expected_tag, int found_tag) { + super(index); + this.expected_tag = expected_tag; + this.found_tag = found_tag; + } + + @Override + public String getMessage() { + // i18n? + return "unexpected entry at #" + index + " -- expected tag " + expected_tag + ", found " + found_tag; + } + + public final int expected_tag; + public final int found_tag; + } + + public static class InvalidEntry extends ConstantPoolException { + private static final long serialVersionUID = 1000087545585204447L; + InvalidEntry(int index, int tag) { + super(index); + this.tag = tag; + } + + @Override + public String getMessage() { + // i18n? + return "unexpected tag at #" + index + ": " + tag; + } + + public final int tag; + } + + public static class EntryNotFound extends ConstantPoolException { + private static final long serialVersionUID = 2885537606468581850L; + EntryNotFound(Object value) { + super(-1); + this.value = value; + } + + @Override + public String getMessage() { + // i18n? + return "value not found: " + value; + } + + public final Object value; + } + + public static final int CONSTANT_Utf8 = 1; + public static final int CONSTANT_Integer = 3; + public static final int CONSTANT_Float = 4; + public static final int CONSTANT_Long = 5; + public static final int CONSTANT_Double = 6; + public static final int CONSTANT_Class = 7; + public static final int CONSTANT_String = 8; + public static final int CONSTANT_Fieldref = 9; + public static final int CONSTANT_Methodref = 10; + public static final int CONSTANT_InterfaceMethodref = 11; + public static final int CONSTANT_NameAndType = 12; + public static final int CONSTANT_MethodHandle = 15; + public static final int CONSTANT_MethodType = 16; + public static final int CONSTANT_InvokeDynamic = 18; + + public static enum RefKind { + REF_getField(1, "getfield"), + REF_getStatic(2, "getstatic"), + REF_putField(3, "putfield"), + REF_putStatic(4, "putstatic"), + REF_invokeVirtual(5, "invokevirtual"), + REF_invokeStatic(6, "invokestatic"), + REF_invokeSpecial(7, "invokespecial"), + REF_newInvokeSpecial(8, "newinvokespecial"), + REF_invokeInterface(9, "invokeinterface"); + + public final int tag; + public final String name; + + RefKind(int tag, String name) { + this.tag = tag; + this.name = name; + } + + static RefKind getRefkind(int tag) { + switch(tag) { + case 1: + return REF_getField; + case 2: + return REF_getStatic; + case 3: + return REF_putField; + case 4: + return REF_putStatic; + case 5: + return REF_invokeVirtual; + case 6: + return REF_invokeStatic; + case 7: + return REF_invokeSpecial; + case 8: + return REF_newInvokeSpecial; + case 9: + return REF_invokeInterface; + default: + return null; + } + } + } + + ConstantPool(ClassReader cr) throws IOException, InvalidEntry { + int count = cr.readUnsignedShort(); + pool = new CPInfo[count]; + for (int i = 1; i < count; i++) { + int tag = cr.readUnsignedByte(); + switch (tag) { + case CONSTANT_Class: + pool[i] = new CONSTANT_Class_info(this, cr); + break; + + case CONSTANT_Double: + pool[i] = new CONSTANT_Double_info(cr); + i++; + break; + + case CONSTANT_Fieldref: + pool[i] = new CONSTANT_Fieldref_info(this, cr); + break; + + case CONSTANT_Float: + pool[i] = new CONSTANT_Float_info(cr); + break; + + case CONSTANT_Integer: + pool[i] = new CONSTANT_Integer_info(cr); + break; + + case CONSTANT_InterfaceMethodref: + pool[i] = new CONSTANT_InterfaceMethodref_info(this, cr); + break; + + case CONSTANT_InvokeDynamic: + pool[i] = new CONSTANT_InvokeDynamic_info(this, cr); + break; + + case CONSTANT_Long: + pool[i] = new CONSTANT_Long_info(cr); + i++; + break; + + case CONSTANT_MethodHandle: + pool[i] = new CONSTANT_MethodHandle_info(this, cr); + break; + + case CONSTANT_MethodType: + pool[i] = new CONSTANT_MethodType_info(this, cr); + break; + + case CONSTANT_Methodref: + pool[i] = new CONSTANT_Methodref_info(this, cr); + break; + + case CONSTANT_NameAndType: + pool[i] = new CONSTANT_NameAndType_info(this, cr); + break; + + case CONSTANT_String: + pool[i] = new CONSTANT_String_info(this, cr); + break; + + case CONSTANT_Utf8: + pool[i] = new CONSTANT_Utf8_info(cr); + break; + + default: + throw new InvalidEntry(i, tag); + } + } + } + + public ConstantPool(CPInfo[] pool) { + this.pool = pool; + } + + public int size() { + return pool.length; + } + + public int byteLength() { + int length = 2; + for (int i = 1; i < size(); ) { + CPInfo cpInfo = pool[i]; + length += cpInfo.byteLength(); + i += cpInfo.size(); + } + return length; + } + + public CPInfo get(int index) throws InvalidIndex { + if (index <= 0 || index >= pool.length) + throw new InvalidIndex(index); + CPInfo info = pool[index]; + if (info == null) { + // this occurs for indices referencing the "second half" of an + // 8 byte constant, such as CONSTANT_Double or CONSTANT_Long + throw new InvalidIndex(index); + } + return pool[index]; + } + + private CPInfo get(int index, int expected_type) throws InvalidIndex, UnexpectedEntry { + CPInfo info = get(index); + if (info.getTag() != expected_type) + throw new UnexpectedEntry(index, expected_type, info.getTag()); + return info; + } + + public CONSTANT_Utf8_info getUTF8Info(int index) throws InvalidIndex, UnexpectedEntry { + return ((CONSTANT_Utf8_info) get(index, CONSTANT_Utf8)); + } + + public CONSTANT_Class_info getClassInfo(int index) throws InvalidIndex, UnexpectedEntry { + return ((CONSTANT_Class_info) get(index, CONSTANT_Class)); + } + + public CONSTANT_NameAndType_info getNameAndTypeInfo(int index) throws InvalidIndex, UnexpectedEntry { + return ((CONSTANT_NameAndType_info) get(index, CONSTANT_NameAndType)); + } + + public String getUTF8Value(int index) throws InvalidIndex, UnexpectedEntry { + return getUTF8Info(index).value; + } + + public int getUTF8Index(String value) throws EntryNotFound { + for (int i = 1; i < pool.length; i++) { + CPInfo info = pool[i]; + if (info instanceof CONSTANT_Utf8_info && + ((CONSTANT_Utf8_info) info).value.equals(value)) + return i; + } + throw new EntryNotFound(value); + } + + public Iterable<CPInfo> entries() { + return new Iterable<CPInfo>() { + public Iterator<CPInfo> iterator() { + return new Iterator<CPInfo>() { + + public boolean hasNext() { + return next < pool.length; + } + + public CPInfo next() { + current = pool[next]; + switch (current.getTag()) { + case CONSTANT_Double: + case CONSTANT_Long: + next += 2; + break; + default: + next += 1; + } + return current; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + + private CPInfo current; + private int next = 1; + + }; + } + }; + } + + private CPInfo[] pool; + + public interface Visitor<R,P> { + R visitClass(CONSTANT_Class_info info, P p); + R visitDouble(CONSTANT_Double_info info, P p); + R visitFieldref(CONSTANT_Fieldref_info info, P p); + R visitFloat(CONSTANT_Float_info info, P p); + R visitInteger(CONSTANT_Integer_info info, P p); + R visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, P p); + R visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, P p); + R visitLong(CONSTANT_Long_info info, P p); + R visitNameAndType(CONSTANT_NameAndType_info info, P p); + R visitMethodref(CONSTANT_Methodref_info info, P p); + R visitMethodHandle(CONSTANT_MethodHandle_info info, P p); + R visitMethodType(CONSTANT_MethodType_info info, P p); + R visitString(CONSTANT_String_info info, P p); + R visitUtf8(CONSTANT_Utf8_info info, P p); + } + + public static abstract class CPInfo { + CPInfo() { + this.cp = null; + } + + CPInfo(ConstantPool cp) { + this.cp = cp; + } + + public abstract int getTag(); + + /** The number of slots in the constant pool used by this entry. + * 2 for CONSTANT_Double and CONSTANT_Long; 1 for everything else. */ + public int size() { + return 1; + } + + public abstract int byteLength(); + + public abstract <R,D> R accept(Visitor<R,D> visitor, D data); + + protected final ConstantPool cp; + } + + public static abstract class CPRefInfo extends CPInfo { + protected CPRefInfo(ConstantPool cp, ClassReader cr, int tag) throws IOException { + super(cp); + this.tag = tag; + class_index = cr.readUnsignedShort(); + name_and_type_index = cr.readUnsignedShort(); + } + + protected CPRefInfo(ConstantPool cp, int tag, int class_index, int name_and_type_index) { + super(cp); + this.tag = tag; + this.class_index = class_index; + this.name_and_type_index = name_and_type_index; + } + + public int getTag() { + return tag; + } + + public int byteLength() { + return 5; + } + + public CONSTANT_Class_info getClassInfo() throws ConstantPoolException { + return cp.getClassInfo(class_index); + } + + public String getClassName() throws ConstantPoolException { + return cp.getClassInfo(class_index).getName(); + } + + public CONSTANT_NameAndType_info getNameAndTypeInfo() throws ConstantPoolException { + return cp.getNameAndTypeInfo(name_and_type_index); + } + + public final int tag; + public final int class_index; + public final int name_and_type_index; + } + + public static class CONSTANT_Class_info extends CPInfo { + CONSTANT_Class_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + name_index = cr.readUnsignedShort(); + } + + public CONSTANT_Class_info(ConstantPool cp, int name_index) { + super(cp); + this.name_index = name_index; + } + + public int getTag() { + return CONSTANT_Class; + } + + public int byteLength() { + return 3; + } + + /** + * Get the raw value of the class referenced by this constant pool entry. + * This will either be the name of the class, in internal form, or a + * descriptor for an array class. + * @return the raw value of the class + */ + public String getName() throws ConstantPoolException { + return cp.getUTF8Value(name_index); + } + + /** + * If this constant pool entry identifies either a class or interface type, + * or a possibly multi-dimensional array of a class of interface type, + * return the name of the class or interface in internal form. Otherwise, + * (i.e. if this is a possibly multi-dimensional array of a primitive type), + * return null. + * @return the base class or interface name + */ + public String getBaseName() throws ConstantPoolException { + String name = getName(); + if (name.startsWith("[")) { + int index = name.indexOf("[L"); + if (index == -1) + return null; + return name.substring(index + 2, name.length() - 1); + } else + return name; + } + + public int getDimensionCount() throws ConstantPoolException { + String name = getName(); + int count = 0; + while (name.charAt(count) == '[') + count++; + return count; + } + + @Override + public String toString() { + return "CONSTANT_Class_info[name_index: " + name_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitClass(this, data); + } + + public final int name_index; + } + + public static class CONSTANT_Double_info extends CPInfo { + CONSTANT_Double_info(ClassReader cr) throws IOException { + value = cr.readDouble(); + } + + public CONSTANT_Double_info(double value) { + this.value = value; + } + + public int getTag() { + return CONSTANT_Double; + } + + public int byteLength() { + return 9; + } + + @Override + public int size() { + return 2; + } + + @Override + public String toString() { + return "CONSTANT_Double_info[value: " + value + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitDouble(this, data); + } + + public final double value; + } + + public static class CONSTANT_Fieldref_info extends CPRefInfo { + CONSTANT_Fieldref_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp, cr, CONSTANT_Fieldref); + } + + public CONSTANT_Fieldref_info(ConstantPool cp, int class_index, int name_and_type_index) { + super(cp, CONSTANT_Fieldref, class_index, name_and_type_index); + } + + @Override + public String toString() { + return "CONSTANT_Fieldref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitFieldref(this, data); + } + } + + public static class CONSTANT_Float_info extends CPInfo { + CONSTANT_Float_info(ClassReader cr) throws IOException { + value = cr.readFloat(); + } + + public CONSTANT_Float_info(float value) { + this.value = value; + } + + public int getTag() { + return CONSTANT_Float; + } + + public int byteLength() { + return 5; + } + + @Override + public String toString() { + return "CONSTANT_Float_info[value: " + value + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitFloat(this, data); + } + + public final float value; + } + + public static class CONSTANT_Integer_info extends CPInfo { + CONSTANT_Integer_info(ClassReader cr) throws IOException { + value = cr.readInt(); + } + + public CONSTANT_Integer_info(int value) { + this.value = value; + } + + public int getTag() { + return CONSTANT_Integer; + } + + public int byteLength() { + return 5; + } + + @Override + public String toString() { + return "CONSTANT_Integer_info[value: " + value + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitInteger(this, data); + } + + public final int value; + } + + public static class CONSTANT_InterfaceMethodref_info extends CPRefInfo { + CONSTANT_InterfaceMethodref_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp, cr, CONSTANT_InterfaceMethodref); + } + + public CONSTANT_InterfaceMethodref_info(ConstantPool cp, int class_index, int name_and_type_index) { + super(cp, CONSTANT_InterfaceMethodref, class_index, name_and_type_index); + } + + @Override + public String toString() { + return "CONSTANT_InterfaceMethodref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitInterfaceMethodref(this, data); + } + } + + public static class CONSTANT_InvokeDynamic_info extends CPInfo { + CONSTANT_InvokeDynamic_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + bootstrap_method_attr_index = cr.readUnsignedShort(); + name_and_type_index = cr.readUnsignedShort(); + } + + public CONSTANT_InvokeDynamic_info(ConstantPool cp, int bootstrap_method_index, int name_and_type_index) { + super(cp); + this.bootstrap_method_attr_index = bootstrap_method_index; + this.name_and_type_index = name_and_type_index; + } + + public int getTag() { + return CONSTANT_InvokeDynamic; + } + + public int byteLength() { + return 5; + } + + @Override + public String toString() { + return "CONSTANT_InvokeDynamic_info[bootstrap_method_index: " + bootstrap_method_attr_index + ", name_and_type_index: " + name_and_type_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitInvokeDynamic(this, data); + } + + public CONSTANT_NameAndType_info getNameAndTypeInfo() throws ConstantPoolException { + return cp.getNameAndTypeInfo(name_and_type_index); + } + + public final int bootstrap_method_attr_index; + public final int name_and_type_index; + } + + public static class CONSTANT_Long_info extends CPInfo { + CONSTANT_Long_info(ClassReader cr) throws IOException { + value = cr.readLong(); + } + + public CONSTANT_Long_info(long value) { + this.value = value; + } + + public int getTag() { + return CONSTANT_Long; + } + + @Override + public int size() { + return 2; + } + + public int byteLength() { + return 9; + } + + @Override + public String toString() { + return "CONSTANT_Long_info[value: " + value + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitLong(this, data); + } + + public final long value; + } + + public static class CONSTANT_MethodHandle_info extends CPInfo { + CONSTANT_MethodHandle_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + reference_kind = RefKind.getRefkind(cr.readUnsignedByte()); + reference_index = cr.readUnsignedShort(); + } + + public CONSTANT_MethodHandle_info(ConstantPool cp, RefKind ref_kind, int member_index) { + super(cp); + this.reference_kind = ref_kind; + this.reference_index = member_index; + } + + public int getTag() { + return CONSTANT_MethodHandle; + } + + public int byteLength() { + return 4; + } + + @Override + public String toString() { + return "CONSTANT_MethodHandle_info[ref_kind: " + reference_kind + ", member_index: " + reference_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitMethodHandle(this, data); + } + + public CPRefInfo getCPRefInfo() throws ConstantPoolException { + int expected = CONSTANT_Methodref; + int actual = cp.get(reference_index).getTag(); + // allow these tag types also: + switch (actual) { + case CONSTANT_Fieldref: + case CONSTANT_InterfaceMethodref: + expected = actual; + } + return (CPRefInfo) cp.get(reference_index, expected); + } + + public final RefKind reference_kind; + public final int reference_index; + } + + public static class CONSTANT_MethodType_info extends CPInfo { + CONSTANT_MethodType_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + descriptor_index = cr.readUnsignedShort(); + } + + public CONSTANT_MethodType_info(ConstantPool cp, int signature_index) { + super(cp); + this.descriptor_index = signature_index; + } + + public int getTag() { + return CONSTANT_MethodType; + } + + public int byteLength() { + return 3; + } + + @Override + public String toString() { + return "CONSTANT_MethodType_info[signature_index: " + descriptor_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitMethodType(this, data); + } + + public String getType() throws ConstantPoolException { + return cp.getUTF8Value(descriptor_index); + } + + public final int descriptor_index; + } + + public static class CONSTANT_Methodref_info extends CPRefInfo { + CONSTANT_Methodref_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp, cr, CONSTANT_Methodref); + } + + public CONSTANT_Methodref_info(ConstantPool cp, int class_index, int name_and_type_index) { + super(cp, CONSTANT_Methodref, class_index, name_and_type_index); + } + + @Override + public String toString() { + return "CONSTANT_Methodref_info[class_index: " + class_index + ", name_and_type_index: " + name_and_type_index + "]"; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitMethodref(this, data); + } + } + + public static class CONSTANT_NameAndType_info extends CPInfo { + CONSTANT_NameAndType_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + name_index = cr.readUnsignedShort(); + type_index = cr.readUnsignedShort(); + } + + public CONSTANT_NameAndType_info(ConstantPool cp, int name_index, int type_index) { + super(cp); + this.name_index = name_index; + this.type_index = type_index; + } + + public int getTag() { + return CONSTANT_NameAndType; + } + + public int byteLength() { + return 5; + } + + public String getName() throws ConstantPoolException { + return cp.getUTF8Value(name_index); + } + + public String getType() throws ConstantPoolException { + return cp.getUTF8Value(type_index); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitNameAndType(this, data); + } + + @Override + public String toString() { + return "CONSTANT_NameAndType_info[name_index: " + name_index + ", type_index: " + type_index + "]"; + } + + public final int name_index; + public final int type_index; + } + + public static class CONSTANT_String_info extends CPInfo { + CONSTANT_String_info(ConstantPool cp, ClassReader cr) throws IOException { + super(cp); + string_index = cr.readUnsignedShort(); + } + + public CONSTANT_String_info(ConstantPool cp, int string_index) { + super(cp); + this.string_index = string_index; + } + + public int getTag() { + return CONSTANT_String; + } + + public int byteLength() { + return 3; + } + + public String getString() throws ConstantPoolException { + return cp.getUTF8Value(string_index); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitString(this, data); + } + + @Override + public String toString() { + return "CONSTANT_String_info[class_index: " + string_index + "]"; + } + + public final int string_index; + } + + public static class CONSTANT_Utf8_info extends CPInfo { + CONSTANT_Utf8_info(ClassReader cr) throws IOException { + value = cr.readUTF(); + } + + public CONSTANT_Utf8_info(String value) { + this.value = value; + } + + public int getTag() { + return CONSTANT_Utf8; + } + + public int byteLength() { + class SizeOutputStream extends OutputStream { + @Override + public void write(int b) { + size++; + } + int size; + } + SizeOutputStream sizeOut = new SizeOutputStream(); + DataOutputStream out = new DataOutputStream(sizeOut); + try { out.writeUTF(value); } catch (IOException ignore) { } + return 1 + sizeOut.size; + } + + @Override + public String toString() { + if (value.length() < 32 && isPrintableAscii(value)) + return "CONSTANT_Utf8_info[value: \"" + value + "\"]"; + else + return "CONSTANT_Utf8_info[value: (" + value.length() + " chars)]"; + } + + static boolean isPrintableAscii(String s) { + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c < 32 || c >= 127) + return false; + } + return true; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitUtf8(this, data); + } + + public final String value; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ConstantPoolException.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package com.sun.tools.classfile; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ConstantPoolException extends Exception { + private static final long serialVersionUID = -2324397349644754565L; + ConstantPoolException(int index) { + this.index = index; + } + + public final int index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ConstantValue_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.2. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ConstantValue_attribute extends Attribute { + ConstantValue_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + constantvalue_index = cr.readUnsignedShort(); + } + + public ConstantValue_attribute(ConstantPool constant_pool, int constantvalue_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.ConstantValue), constantvalue_index); + } + + public ConstantValue_attribute(int name_index, int constantvalue_index) { + super(name_index, 2); + this.constantvalue_index = constantvalue_index; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitConstantValue(this, data); + } + + public final int constantvalue_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/DefaultAttribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class DefaultAttribute extends Attribute { + DefaultAttribute(ClassReader cr, int name_index, byte[] data) { + this(cr, name_index, data, null); + } + + DefaultAttribute(ClassReader cr, int name_index, byte[] data, String reason) { + super(name_index, data.length); + info = data; + this.reason = reason; + } + + public DefaultAttribute(ConstantPool constant_pool, int name_index, byte[] info) { + this(constant_pool, name_index, info, null); + } + + public DefaultAttribute(ConstantPool constant_pool, int name_index, + byte[] info, String reason) { + super(name_index, info.length); + this.info = info; + this.reason = reason; + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitDefault(this, p); + } + + public final byte[] info; + /** Why did we need to generate a DefaultAttribute + */ + public final String reason; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Dependencies.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,794 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.classfile; + +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.regex.Pattern; + +import com.sun.tools.classfile.Dependency.Filter; +import com.sun.tools.classfile.Dependency.Finder; +import com.sun.tools.classfile.Dependency.Location; +import com.sun.tools.classfile.Type.ArrayType; +import com.sun.tools.classfile.Type.ClassSigType; +import com.sun.tools.classfile.Type.ClassType; +import com.sun.tools.classfile.Type.MethodType; +import com.sun.tools.classfile.Type.SimpleType; +import com.sun.tools.classfile.Type.TypeParamType; +import com.sun.tools.classfile.Type.WildcardType; + +import static com.sun.tools.classfile.ConstantPool.*; + +/** + * A framework for determining {@link Dependency dependencies} between class files. + * + * A {@link Dependency.Finder finder} is used to identify the dependencies of + * individual classes. Some finders may return subtypes of {@code Dependency} to + * further characterize the type of dependency, such as a dependency on a + * method within a class. + * + * A {@link Dependency.Filter filter} may be used to restrict the set of + * dependencies found by a finder. + * + * Dependencies that are found may be passed to a {@link Dependencies.Recorder + * recorder} so that the dependencies can be stored in a custom data structure. + */ +public class Dependencies { + /** + * Thrown when a class file cannot be found. + */ + public static class ClassFileNotFoundException extends Exception { + private static final long serialVersionUID = 3632265927794475048L; + + public ClassFileNotFoundException(String className) { + super(className); + this.className = className; + } + + public ClassFileNotFoundException(String className, Throwable cause) { + this(className); + initCause(cause); + } + + public final String className; + } + + /** + * Thrown when an exception is found processing a class file. + */ + public static class ClassFileError extends Error { + private static final long serialVersionUID = 4111110813961313203L; + + public ClassFileError(Throwable cause) { + initCause(cause); + } + } + + /** + * Service provider interface to locate and read class files. + */ + public interface ClassFileReader { + /** + * Get the ClassFile object for a specified class. + * @param className the name of the class to be returned. + * @return the ClassFile for the given class + * @throws Dependencies.ClassFileNotFoundException if the classfile cannot be + * found + */ + public ClassFile getClassFile(String className) + throws ClassFileNotFoundException; + } + + /** + * Service provide interface to handle results. + */ + public interface Recorder { + /** + * Record a dependency that has been found. + * @param d + */ + public void addDependency(Dependency d); + } + + /** + * Get the default finder used to locate the dependencies for a class. + * @return the default finder + */ + public static Finder getDefaultFinder() { + return new APIDependencyFinder(AccessFlags.ACC_PRIVATE); + } + + /** + * Get a finder used to locate the API dependencies for a class. + * These include the superclass, superinterfaces, and classes referenced in + * the declarations of fields and methods. The fields and methods that + * are checked can be limited according to a specified access. + * The access parameter must be one of {@link AccessFlags#ACC_PUBLIC ACC_PUBLIC}, + * {@link AccessFlags#ACC_PRIVATE ACC_PRIVATE}, + * {@link AccessFlags#ACC_PROTECTED ACC_PROTECTED}, or 0 for + * package private access. Members with greater than or equal accessibility + * to that specified will be searched for dependencies. + * @param access the access of members to be checked + * @return an API finder + */ + public static Finder getAPIFinder(int access) { + return new APIDependencyFinder(access); + } + + /** + * Get a finder to do class dependency analysis. + * + * @return a Class dependency finder + */ + public static Finder getClassDependencyFinder() { + return new ClassDependencyFinder(); + } + + /** + * Get the finder used to locate the dependencies for a class. + * @return the finder + */ + public Finder getFinder() { + if (finder == null) + finder = getDefaultFinder(); + return finder; + } + + /** + * Set the finder used to locate the dependencies for a class. + * @param f the finder + */ + public void setFinder(Finder f) { + finder = Objects.requireNonNull(f); + } + + /** + * Get the default filter used to determine included when searching + * the transitive closure of all the dependencies. + * Unless overridden, the default filter accepts all dependencies. + * @return the default filter. + */ + public static Filter getDefaultFilter() { + return DefaultFilter.instance(); + } + + /** + * Get a filter which uses a regular expression on the target's class name + * to determine if a dependency is of interest. + * @param pattern the pattern used to match the target's class name + * @return a filter for matching the target class name with a regular expression + */ + public static Filter getRegexFilter(Pattern pattern) { + return new TargetRegexFilter(pattern); + } + + /** + * Get a filter which checks the package of a target's class name + * to determine if a dependency is of interest. The filter checks if the + * package of the target's class matches any of a set of given package + * names. The match may optionally match subpackages of the given names as well. + * @param packageNames the package names used to match the target's class name + * @param matchSubpackages whether or not to match subpackages as well + * @return a filter for checking the target package name against a list of package names + */ + public static Filter getPackageFilter(Set<String> packageNames, boolean matchSubpackages) { + return new TargetPackageFilter(packageNames, matchSubpackages); + } + + /** + * Get the filter used to determine the dependencies included when searching + * the transitive closure of all the dependencies. + * Unless overridden, the default filter accepts all dependencies. + * @return the filter + */ + public Filter getFilter() { + if (filter == null) + filter = getDefaultFilter(); + return filter; + } + + /** + * Set the filter used to determine the dependencies included when searching + * the transitive closure of all the dependencies. + * @param f the filter + */ + public void setFilter(Filter f) { + filter = Objects.requireNonNull(f); + } + + /** + * Find the dependencies of a class, using the current + * {@link Dependencies#getFinder finder} and + * {@link Dependencies#getFilter filter}. + * The search may optionally include the transitive closure of all the + * filtered dependencies, by also searching in the classes named in those + * dependencies. + * @param classFinder a finder to locate class files + * @param rootClassNames the names of the root classes from which to begin + * searching + * @param transitiveClosure whether or not to also search those classes + * named in any filtered dependencies that are found. + * @return the set of dependencies that were found + * @throws ClassFileNotFoundException if a required class file cannot be found + * @throws ClassFileError if an error occurs while processing a class file, + * such as an error in the internal class file structure. + */ + public Set<Dependency> findAllDependencies( + ClassFileReader classFinder, Set<String> rootClassNames, + boolean transitiveClosure) + throws ClassFileNotFoundException { + final Set<Dependency> results = new HashSet<>(); + Recorder r = new Recorder() { + public void addDependency(Dependency d) { + results.add(d); + } + }; + findAllDependencies(classFinder, rootClassNames, transitiveClosure, r); + return results; + } + + /** + * Find the dependencies of a class, using the current + * {@link Dependencies#getFinder finder} and + * {@link Dependencies#getFilter filter}. + * The search may optionally include the transitive closure of all the + * filtered dependencies, by also searching in the classes named in those + * dependencies. + * @param classFinder a finder to locate class files + * @param rootClassNames the names of the root classes from which to begin + * searching + * @param transitiveClosure whether or not to also search those classes + * named in any filtered dependencies that are found. + * @param recorder a recorder for handling the results + * @throws ClassFileNotFoundException if a required class file cannot be found + * @throws ClassFileError if an error occurs while processing a class file, + * such as an error in the internal class file structure. + */ + public void findAllDependencies( + ClassFileReader classFinder, Set<String> rootClassNames, + boolean transitiveClosure, Recorder recorder) + throws ClassFileNotFoundException { + Set<String> doneClasses = new HashSet<>(); + + getFinder(); // ensure initialized + getFilter(); // ensure initialized + + // Work queue of names of classfiles to be searched. + // Entries will be unique, and for classes that do not yet have + // dependencies in the results map. + Deque<String> deque = new LinkedList<>(rootClassNames); + + String className; + while ((className = deque.poll()) != null) { + assert (!doneClasses.contains(className)); + doneClasses.add(className); + + ClassFile cf = classFinder.getClassFile(className); + + // The following code just applies the filter to the dependencies + // followed for the transitive closure. + for (Dependency d: finder.findDependencies(cf)) { + recorder.addDependency(d); + if (transitiveClosure && filter.accepts(d)) { + String cn = d.getTarget().getClassName(); + if (!doneClasses.contains(cn)) + deque.add(cn); + } + } + } + } + + private Filter filter; + private Finder finder; + + /** + * A location identifying a class. + */ + static class SimpleLocation implements Location { + public SimpleLocation(String name) { + this.name = name; + this.className = name.replace('/', '.'); + } + + public String getName() { + return name; + } + + public String getClassName() { + return className; + } + + public String getPackageName() { + int i = name.lastIndexOf('/'); + return (i > 0) ? name.substring(0, i).replace('/', '.') : ""; + } + + @Override + public boolean equals(Object other) { + if (this == other) + return true; + if (!(other instanceof SimpleLocation)) + return false; + return (name.equals(((SimpleLocation) other).name)); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + @Override + public String toString() { + return name; + } + + private String name; + private String className; + } + + /** + * A dependency of one class on another. + */ + static class SimpleDependency implements Dependency { + public SimpleDependency(Location origin, Location target) { + this.origin = origin; + this.target = target; + } + + public Location getOrigin() { + return origin; + } + + public Location getTarget() { + return target; + } + + @Override + public boolean equals(Object other) { + if (this == other) + return true; + if (!(other instanceof SimpleDependency)) + return false; + SimpleDependency o = (SimpleDependency) other; + return (origin.equals(o.origin) && target.equals(o.target)); + } + + @Override + public int hashCode() { + return origin.hashCode() * 31 + target.hashCode(); + } + + @Override + public String toString() { + return origin + ":" + target; + } + + private Location origin; + private Location target; + } + + + /** + * This class accepts all dependencies. + */ + static class DefaultFilter implements Filter { + private static DefaultFilter instance; + + static DefaultFilter instance() { + if (instance == null) + instance = new DefaultFilter(); + return instance; + } + + public boolean accepts(Dependency dependency) { + return true; + } + } + + /** + * This class accepts those dependencies whose target's class name matches a + * regular expression. + */ + static class TargetRegexFilter implements Filter { + TargetRegexFilter(Pattern pattern) { + this.pattern = pattern; + } + + public boolean accepts(Dependency dependency) { + return pattern.matcher(dependency.getTarget().getClassName()).matches(); + } + + private final Pattern pattern; + } + + /** + * This class accepts those dependencies whose class name is in a given + * package. + */ + static class TargetPackageFilter implements Filter { + TargetPackageFilter(Set<String> packageNames, boolean matchSubpackages) { + for (String pn: packageNames) { + if (pn.length() == 0) // implies null check as well + throw new IllegalArgumentException(); + } + this.packageNames = packageNames; + this.matchSubpackages = matchSubpackages; + } + + public boolean accepts(Dependency dependency) { + String pn = dependency.getTarget().getPackageName(); + if (packageNames.contains(pn)) + return true; + + if (matchSubpackages) { + for (String n: packageNames) { + if (pn.startsWith(n + ".")) + return true; + } + } + + return false; + } + + private final Set<String> packageNames; + private final boolean matchSubpackages; + } + + /** + * This class identifies class names directly or indirectly in the constant pool. + */ + static class ClassDependencyFinder extends BasicDependencyFinder { + public Iterable<? extends Dependency> findDependencies(ClassFile classfile) { + Visitor v = new Visitor(classfile); + for (CPInfo cpInfo: classfile.constant_pool.entries()) { + v.scan(cpInfo); + } + try { + v.addClass(classfile.super_class); + v.addClasses(classfile.interfaces); + v.scan(classfile.attributes); + + for (Field f : classfile.fields) { + v.scan(f.descriptor, f.attributes); + } + for (Method m : classfile.methods) { + v.scan(m.descriptor, m.attributes); + Exceptions_attribute e = + (Exceptions_attribute)m.attributes.get(Attribute.Exceptions); + if (e != null) { + v.addClasses(e.exception_index_table); + } + } + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + + return v.deps; + } + } + + /** + * This class identifies class names in the signatures of classes, fields, + * and methods in a class. + */ + static class APIDependencyFinder extends BasicDependencyFinder { + APIDependencyFinder(int access) { + switch (access) { + case AccessFlags.ACC_PUBLIC: + case AccessFlags.ACC_PROTECTED: + case AccessFlags.ACC_PRIVATE: + case 0: + showAccess = access; + break; + default: + throw new IllegalArgumentException("invalid access 0x" + + Integer.toHexString(access)); + } + } + + public Iterable<? extends Dependency> findDependencies(ClassFile classfile) { + try { + Visitor v = new Visitor(classfile); + v.addClass(classfile.super_class); + v.addClasses(classfile.interfaces); + // inner classes? + for (Field f : classfile.fields) { + if (checkAccess(f.access_flags)) + v.scan(f.descriptor, f.attributes); + } + for (Method m : classfile.methods) { + if (checkAccess(m.access_flags)) { + v.scan(m.descriptor, m.attributes); + Exceptions_attribute e = + (Exceptions_attribute) m.attributes.get(Attribute.Exceptions); + if (e != null) + v.addClasses(e.exception_index_table); + } + } + return v.deps; + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + boolean checkAccess(AccessFlags flags) { + // code copied from javap.Options.checkAccess + boolean isPublic = flags.is(AccessFlags.ACC_PUBLIC); + boolean isProtected = flags.is(AccessFlags.ACC_PROTECTED); + boolean isPrivate = flags.is(AccessFlags.ACC_PRIVATE); + boolean isPackage = !(isPublic || isProtected || isPrivate); + + if ((showAccess == AccessFlags.ACC_PUBLIC) && (isProtected || isPrivate || isPackage)) + return false; + else if ((showAccess == AccessFlags.ACC_PROTECTED) && (isPrivate || isPackage)) + return false; + else if ((showAccess == 0) && (isPrivate)) + return false; + else + return true; + } + + private int showAccess; + } + + static abstract class BasicDependencyFinder implements Finder { + private Map<String,Location> locations = new HashMap<>(); + + Location getLocation(String className) { + Location l = locations.get(className); + if (l == null) + locations.put(className, l = new SimpleLocation(className)); + return l; + } + + class Visitor implements ConstantPool.Visitor<Void,Void>, Type.Visitor<Void, Void> { + private ConstantPool constant_pool; + private Location origin; + Set<Dependency> deps; + + Visitor(ClassFile classFile) { + try { + constant_pool = classFile.constant_pool; + origin = getLocation(classFile.getName()); + deps = new HashSet<>(); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + void scan(Descriptor d, Attributes attrs) { + try { + scan(new Signature(d.index).getType(constant_pool)); + scan(attrs); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + void scan(CPInfo cpInfo) { + cpInfo.accept(this, null); + } + + void scan(Type t) { + t.accept(this, null); + } + + void scan(Attributes attrs) { + try { + Signature_attribute sa = (Signature_attribute)attrs.get(Attribute.Signature); + if (sa != null) + scan(sa.getParsedSignature().getType(constant_pool)); + + scan((RuntimeVisibleAnnotations_attribute) + attrs.get(Attribute.RuntimeVisibleAnnotations)); + scan((RuntimeVisibleParameterAnnotations_attribute) + attrs.get(Attribute.RuntimeVisibleParameterAnnotations)); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + private void scan(RuntimeAnnotations_attribute attr) throws ConstantPoolException { + if (attr == null) { + return; + } + for (int i = 0; i < attr.annotations.length; i++) { + int index = attr.annotations[i].type_index; + scan(new Signature(index).getType(constant_pool)); + } + } + + private void scan(RuntimeParameterAnnotations_attribute attr) throws ConstantPoolException { + if (attr == null) { + return; + } + for (int param = 0; param < attr.parameter_annotations.length; param++) { + for (int i = 0; i < attr.parameter_annotations[param].length; i++) { + int index = attr.parameter_annotations[param][i].type_index; + scan(new Signature(index).getType(constant_pool)); + } + } + } + + void addClass(int index) throws ConstantPoolException { + if (index != 0) { + String name = constant_pool.getClassInfo(index).getBaseName(); + if (name != null) + addDependency(name); + } + } + + void addClasses(int[] indices) throws ConstantPoolException { + for (int i: indices) + addClass(i); + } + + private void addDependency(String name) { + deps.add(new SimpleDependency(origin, getLocation(name))); + } + + // ConstantPool.Visitor methods + + public Void visitClass(CONSTANT_Class_info info, Void p) { + try { + if (info.getName().startsWith("[")) + new Signature(info.name_index).getType(constant_pool).accept(this, null); + else + addDependency(info.getBaseName()); + return null; + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + public Void visitDouble(CONSTANT_Double_info info, Void p) { + return null; + } + + public Void visitFieldref(CONSTANT_Fieldref_info info, Void p) { + return visitRef(info, p); + } + + public Void visitFloat(CONSTANT_Float_info info, Void p) { + return null; + } + + public Void visitInteger(CONSTANT_Integer_info info, Void p) { + return null; + } + + public Void visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { + return visitRef(info, p); + } + + public Void visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { + return null; + } + + public Void visitLong(CONSTANT_Long_info info, Void p) { + return null; + } + + public Void visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { + return null; + } + + public Void visitMethodType(CONSTANT_MethodType_info info, Void p) { + return null; + } + + public Void visitMethodref(CONSTANT_Methodref_info info, Void p) { + return visitRef(info, p); + } + + public Void visitNameAndType(CONSTANT_NameAndType_info info, Void p) { + try { + new Signature(info.type_index).getType(constant_pool).accept(this, null); + return null; + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + public Void visitString(CONSTANT_String_info info, Void p) { + return null; + } + + public Void visitUtf8(CONSTANT_Utf8_info info, Void p) { + return null; + } + + private Void visitRef(CPRefInfo info, Void p) { + try { + visitClass(info.getClassInfo(), p); + return null; + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + } + + // Type.Visitor methods + + private void findDependencies(Type t) { + if (t != null) + t.accept(this, null); + } + + private void findDependencies(List<? extends Type> ts) { + if (ts != null) { + for (Type t: ts) + t.accept(this, null); + } + } + + public Void visitSimpleType(SimpleType type, Void p) { + return null; + } + + public Void visitArrayType(ArrayType type, Void p) { + findDependencies(type.elemType); + return null; + } + + public Void visitMethodType(MethodType type, Void p) { + findDependencies(type.paramTypes); + findDependencies(type.returnType); + findDependencies(type.throwsTypes); + findDependencies(type.typeParamTypes); + return null; + } + + public Void visitClassSigType(ClassSigType type, Void p) { + findDependencies(type.superclassType); + findDependencies(type.superinterfaceTypes); + return null; + } + + public Void visitClassType(ClassType type, Void p) { + findDependencies(type.outerType); + addDependency(type.getBinaryName()); + findDependencies(type.typeArgs); + return null; + } + + public Void visitTypeParamType(TypeParamType type, Void p) { + findDependencies(type.classBound); + findDependencies(type.interfaceBounds); + return null; + } + + public Void visitWildcardType(WildcardType type, Void p) { + findDependencies(type.boundType); + return null; + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Dependency.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + + +/** + * A directed relationship between two {@link Dependency.Location Location}s. + * Subtypes of {@code Dependency} may provide additional detail about the dependency. + * + * @see Dependency.Finder + * @see Dependency.Filter + * @see Dependencies + */ +public interface Dependency { + /** + * A filter used to select dependencies of interest, and to discard others. + */ + public interface Filter { + /** + * Return true if the dependency is of interest. + * @param dependency the dependency to be considered + * @return true if and only if the dependency is of interest. + */ + boolean accepts(Dependency dependency); + } + + /** + * An interface for finding the immediate dependencies of a given class file. + */ + public interface Finder { + /** + * Find the immediate dependencies of a given class file. + * @param classfile the class file to be examined + * @return the dependencies located in the given class file. + */ + public Iterable<? extends Dependency> findDependencies(ClassFile classfile); + } + + + /** + * A location somewhere within a class. Subtypes of {@code Location} + * may be used to provide additional detail about the location. + */ + public interface Location { + /** + * Get the name of the class containing the location. + * This name will be used to locate the class file for transitive + * dependency analysis. + * @return the name of the class containing the location. + */ + String getName(); + + /** + * Get the fully-qualified name of the class containing the location. + * @return the fully-qualified name of the class containing the location. + */ + String getClassName(); + + /** + * Get the package name of the class containing the location. + * @return the package name of the class containing the location. + */ + String getPackageName(); + } + + + /** + * Get the location that has the dependency. + * @return the location that has the dependency. + */ + Location getOrigin(); + + /** + * Get the location that is being depended upon. + * @return the location that is being depended upon. + */ + Location getTarget(); +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Deprecated_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.15. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Deprecated_attribute extends Attribute { + Deprecated_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + } + + public Deprecated_attribute(ConstantPool constant_pool) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.Deprecated)); + } + + public Deprecated_attribute(int name_index) { + super(name_index, 0); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitDeprecated(this, data); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Descriptor.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.4. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Descriptor { + public static class InvalidDescriptor extends DescriptorException { + private static final long serialVersionUID = 1L; + InvalidDescriptor(String desc) { + this.desc = desc; + this.index = -1; + } + + InvalidDescriptor(String desc, int index) { + this.desc = desc; + this.index = index; + } + + @Override + public String getMessage() { + // i18n + if (index == -1) + return "invalid descriptor \"" + desc + "\""; + else + return "descriptor is invalid at offset " + index + " in \"" + desc + "\""; + } + + public final String desc; + public final int index; + + } + + public Descriptor(ClassReader cr) throws IOException { + this(cr.readUnsignedShort()); + } + + public Descriptor(int index) { + this.index = index; + + } + + public String getValue(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(index); + } + + public int getParameterCount(ConstantPool constant_pool) + throws ConstantPoolException, InvalidDescriptor { + String desc = getValue(constant_pool); + int end = desc.indexOf(")"); + if (end == -1) + throw new InvalidDescriptor(desc); + parse(desc, 0, end + 1); + return count; + + } + + public String getParameterTypes(ConstantPool constant_pool) + throws ConstantPoolException, InvalidDescriptor { + String desc = getValue(constant_pool); + int end = desc.indexOf(")"); + if (end == -1) + throw new InvalidDescriptor(desc); + return parse(desc, 0, end + 1); + } + + public String getReturnType(ConstantPool constant_pool) + throws ConstantPoolException, InvalidDescriptor { + String desc = getValue(constant_pool); + int end = desc.indexOf(")"); + if (end == -1) + throw new InvalidDescriptor(desc); + return parse(desc, end + 1, desc.length()); + } + + public String getFieldType(ConstantPool constant_pool) + throws ConstantPoolException, InvalidDescriptor { + String desc = getValue(constant_pool); + return parse(desc, 0, desc.length()); + } + + private String parse(String desc, int start, int end) + throws InvalidDescriptor { + int p = start; + StringBuilder sb = new StringBuilder(); + int dims = 0; + count = 0; + + while (p < end) { + String type; + char ch; + switch (ch = desc.charAt(p++)) { + case '(': + sb.append('('); + continue; + + case ')': + sb.append(')'); + continue; + + case '[': + dims++; + continue; + + case 'B': + type = "byte"; + break; + + case 'C': + type = "char"; + break; + + case 'D': + type = "double"; + break; + + case 'F': + type = "float"; + break; + + case 'I': + type = "int"; + break; + + case 'J': + type = "long"; + break; + + case 'L': + int sep = desc.indexOf(';', p); + if (sep == -1) + throw new InvalidDescriptor(desc, p - 1); + type = desc.substring(p, sep).replace('/', '.'); + p = sep + 1; + break; + + case 'S': + type = "short"; + break; + + case 'Z': + type = "boolean"; + break; + + case 'V': + type = "void"; + break; + + default: + throw new InvalidDescriptor(desc, p - 1); + } + + if (sb.length() > 1 && sb.charAt(0) == '(') + sb.append(", "); + sb.append(type); + for ( ; dims > 0; dims-- ) + sb.append("[]"); + + count++; + } + + return sb.toString(); + } + + public final int index; + private int count; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/DescriptorException.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +package com.sun.tools.classfile; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class DescriptorException extends Exception { + private static final long serialVersionUID = 2411890273788901032L; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/EnclosingMethod_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,73 @@ + +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.7. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class EnclosingMethod_attribute extends Attribute { + EnclosingMethod_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + class_index = cr.readUnsignedShort(); + method_index = cr.readUnsignedShort(); + } + + public EnclosingMethod_attribute(ConstantPool constant_pool, int class_index, int method_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.EnclosingMethod), class_index, method_index); + } + + public EnclosingMethod_attribute(int name_index, int class_index, int method_index) { + super(name_index, 4); + this.class_index = class_index; + this.method_index = method_index; + } + + public String getClassName(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getClassInfo(class_index).getName(); + } + + public String getMethodName(ConstantPool constant_pool) throws ConstantPoolException { + if (method_index == 0) + return ""; + return constant_pool.getNameAndTypeInfo(method_index).getName(); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitEnclosingMethod(this, data); + } + + public final int class_index; + public final int method_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Exceptions_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.5. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Exceptions_attribute extends Attribute { + Exceptions_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + number_of_exceptions = cr.readUnsignedShort(); + exception_index_table = new int[number_of_exceptions]; + for (int i = 0; i < number_of_exceptions; i++) + exception_index_table[i] = cr.readUnsignedShort(); + } + + public Exceptions_attribute(ConstantPool constant_pool, int[] exception_index_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.Exceptions), exception_index_table); + } + + public Exceptions_attribute(int name_index, int[] exception_index_table) { + super(name_index, 2 + 2 * exception_index_table.length); + this.number_of_exceptions = exception_index_table.length; + this.exception_index_table = exception_index_table; + } + + public String getException(int index, ConstantPool constant_pool) throws ConstantPoolException { + int exception_index = exception_index_table[index]; + return constant_pool.getClassInfo(exception_index).getName(); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitExceptions(this, data); + } + + public final int number_of_exceptions; + public final int[] exception_index_table; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Field.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Field { + Field(ClassReader cr) throws IOException { + access_flags = new AccessFlags(cr); + name_index = cr.readUnsignedShort(); + descriptor = new Descriptor(cr); + attributes = new Attributes(cr); + } + + public Field(AccessFlags access_flags, + int name_index, Descriptor descriptor, + Attributes attributes) { + this.access_flags = access_flags; + this.name_index = name_index; + this.descriptor = descriptor; + this.attributes = attributes; + } + + public int byteLength() { + return 6 + attributes.byteLength(); + } + + public String getName(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(name_index); + } + + public final AccessFlags access_flags; + public final int name_index; + public final Descriptor descriptor; + public final Attributes attributes; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/InnerClasses_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +import com.sun.tools.classfile.ConstantPool.*; + +/** + * See JVMS, section 4.8.6. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class InnerClasses_attribute extends Attribute { + InnerClasses_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + number_of_classes = cr.readUnsignedShort(); + classes = new Info[number_of_classes]; + for (int i = 0; i < number_of_classes; i++) + classes[i] = new Info(cr); + } + + public InnerClasses_attribute(ConstantPool constant_pool, Info[] classes) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.InnerClasses), classes); + } + + public InnerClasses_attribute(int name_index, Info[] classes) { + super(name_index, 2 + Info.length() * classes.length); + this.number_of_classes = classes.length; + this.classes = classes; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitInnerClasses(this, data); + } + + public final int number_of_classes; + public final Info[] classes; + + public static class Info { + Info(ClassReader cr) throws IOException { + inner_class_info_index = cr.readUnsignedShort(); + outer_class_info_index = cr.readUnsignedShort(); + inner_name_index = cr.readUnsignedShort(); + inner_class_access_flags = new AccessFlags(cr.readUnsignedShort()); + } + + public CONSTANT_Class_info getInnerClassInfo(ConstantPool constant_pool) throws ConstantPoolException { + if (inner_class_info_index == 0) + return null; + return constant_pool.getClassInfo(inner_class_info_index); + } + + public CONSTANT_Class_info getOuterClassInfo(ConstantPool constant_pool) throws ConstantPoolException { + if (outer_class_info_index == 0) + return null; + return constant_pool.getClassInfo(outer_class_info_index); + } + + public String getInnerName(ConstantPool constant_pool) throws ConstantPoolException { + if (inner_name_index == 0) + return null; + return constant_pool.getUTF8Value(inner_name_index); + } + + public static int length() { + return 8; + } + + public final int inner_class_info_index; + public final int outer_class_info_index; + public final int inner_name_index; + public final AccessFlags inner_class_access_flags; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Instruction.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.Locale; + +/** + * See JVMS, chapter 6. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + * + * @see Code_attribute#getInstructions + */ +public class Instruction { + /** The kind of an instruction, as determined by the position, size and + * types of its operands. */ + public static enum Kind { + /** Opcode is not followed by any operands. */ + NO_OPERANDS(1), + /** Opcode is followed by a byte indicating a type. */ + ATYPE(2), + /** Opcode is followed by a 2-byte branch offset. */ + BRANCH(3), + /** Opcode is followed by a 4-byte branch offset. */ + BRANCH_W(5), + /** Opcode is followed by a signed byte value. */ + BYTE(2), + /** Opcode is followed by a 1-byte index into the constant pool. */ + CPREF(2), + /** Opcode is followed by a 2-byte index into the constant pool. */ + CPREF_W(3), + /** Opcode is followed by a 2-byte index into the constant pool, + * an unsigned byte value. */ + CPREF_W_UBYTE(4), + /** Opcode is followed by a 2-byte index into the constant pool., + * an unsigned byte value, and a zero byte. */ + CPREF_W_UBYTE_ZERO(5), + /** Opcode is followed by variable number of operands, depending + * on the instruction.*/ + DYNAMIC(-1), + /** Opcode is followed by a 1-byte reference to a local variable. */ + LOCAL(2), + /** Opcode is followed by a 1-byte reference to a local variable, + * and a signed byte value. */ + LOCAL_BYTE(3), + /** Opcode is followed by a signed short value. */ + SHORT(3), + /** Wide opcode is not followed by any operands. */ + WIDE_NO_OPERANDS(2), + /** Wide opcode is followed by a 2-byte index into the local variables array. */ + WIDE_LOCAL(4), + /** Wide opcode is followed by a 2-byte index into the constant pool. */ + WIDE_CPREF_W(4), + /** Wide opcode is followed by a 2-byte index into the constant pool, + * and a signed short value. */ + WIDE_CPREF_W_SHORT(6), + /** Wide opcode is followed by a 2-byte reference to a local variable, + * and a signed short value. */ + WIDE_LOCAL_SHORT(6), + /** Opcode was not recognized. */ + UNKNOWN(1); + + Kind(int length) { + this.length = length; + } + + /** The length, in bytes, of this kind of instruction, or -1 is the + * length depends on the specific instruction. */ + public final int length; + } + + /** A utility visitor to help decode the operands of an instruction. + * @see Instruction#accept */ + public interface KindVisitor<R,P> { + /** See {@link Kind#NO_OPERANDS}, {@link Kind#WIDE_NO_OPERANDS}. */ + R visitNoOperands(Instruction instr, P p); + /** See {@link Kind#ATYPE}. */ + R visitArrayType(Instruction instr, TypeKind kind, P p); + /** See {@link Kind#BRANCH}, {@link Kind#BRANCH_W}. */ + R visitBranch(Instruction instr, int offset, P p); + /** See {@link Kind#CPREF}, {@link Kind#CPREF_W}, {@link Kind#WIDE_CPREF_W}. */ + R visitConstantPoolRef(Instruction instr, int index, P p); + /** See {@link Kind#CPREF_W_UBYTE}, {@link Kind#CPREF_W_UBYTE_ZERO}, {@link Kind#WIDE_CPREF_W_SHORT}. */ + R visitConstantPoolRefAndValue(Instruction instr, int index, int value, P p); + /** See {@link Kind#LOCAL}, {@link Kind#WIDE_LOCAL}. */ + R visitLocal(Instruction instr, int index, P p); + /** See {@link Kind#LOCAL_BYTE}. */ + R visitLocalAndValue(Instruction instr, int index, int value, P p); + /** See {@link Kind#DYNAMIC}. */ + R visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, P p); + /** See {@link Kind#DYNAMIC}. */ + R visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, P p); + /** See {@link Kind#BYTE}, {@link Kind#SHORT}. */ + R visitValue(Instruction instr, int value, P p); + /** Instruction is unrecognized. */ + R visitUnknown(Instruction instr, P p); + + } + + /** The kind of primitive array type to create. + * See JVMS chapter 6, newarray. */ + public static enum TypeKind { + T_BOOLEAN(4, "boolean"), + T_CHAR(5, "char"), + T_FLOAT(6, "float"), + T_DOUBLE(7, "double"), + T_BYTE(8, "byte"), + T_SHORT(9, "short"), + T_INT (10, "int"), + T_LONG (11, "long"); + TypeKind(int value, String name) { + this.value = value; + this.name = name; + } + + public static TypeKind get(int value) { + switch (value) { + case 4: return T_BOOLEAN; + case 5: return T_CHAR; + case 6: return T_FLOAT; + case 7: return T_DOUBLE; + case 8: return T_BYTE; + case 9: return T_SHORT; + case 10: return T_INT; + case 11: return T_LONG; + default: return null; + } + } + + public final int value; + public final String name; + } + + /** An instruction is defined by its position in a bytecode array. */ + public Instruction(byte[] bytes, int pc) { + this.bytes = bytes; + this.pc = pc; + } + + /** Get the position of the instruction within the bytecode array. */ + public int getPC() { + return pc; + } + + /** Get a byte value, relative to the start of this instruction. */ + public int getByte(int offset) { + return bytes[pc + offset]; + } + + /** Get an unsigned byte value, relative to the start of this instruction. */ + public int getUnsignedByte(int offset) { + return getByte(offset) & 0xff; + } + + /** Get a 2-byte value, relative to the start of this instruction. */ + public int getShort(int offset) { + return (getByte(offset) << 8) | getUnsignedByte(offset + 1); + } + + /** Get a unsigned 2-byte value, relative to the start of this instruction. */ + public int getUnsignedShort(int offset) { + return getShort(offset) & 0xFFFF; + } + + /** Get a 4-byte value, relative to the start of this instruction. */ + public int getInt(int offset) { + return (getShort(offset) << 16) | (getUnsignedShort(offset + 2)); + } + + /** Get the Opcode for this instruction, or null if the instruction is + * unrecognized. */ + public Opcode getOpcode() { + int b = getUnsignedByte(0); + switch (b) { + case Opcode.NONPRIV: + case Opcode.PRIV: + case Opcode.WIDE: + return Opcode.get(b, getUnsignedByte(1)); + } + return Opcode.get(b); + } + + /** Get the mnemonic for this instruction, or a default string if the + * instruction is unrecognized. */ + public String getMnemonic() { + Opcode opcode = getOpcode(); + if (opcode == null) + return "bytecode " + getUnsignedByte(0); + else + return opcode.toString().toLowerCase(Locale.US); + } + + /** Get the length, in bytes, of this instruction, including the opcode + * and all its operands. */ + public int length() { + Opcode opcode = getOpcode(); + if (opcode == null) + return 1; + + switch (opcode) { + case TABLESWITCH: { + int pad = align(pc + 1) - pc; + int low = getInt(pad + 4); + int high = getInt(pad + 8); + return pad + 12 + 4 * (high - low + 1); + } + case LOOKUPSWITCH: { + int pad = align(pc + 1) - pc; + int npairs = getInt(pad + 4); + return pad + 8 + 8 * npairs; + + } + default: + return opcode.kind.length; + } + } + + /** Get the {@link Kind} of this instruction. */ + public Kind getKind() { + Opcode opcode = getOpcode(); + return (opcode != null ? opcode.kind : Kind.UNKNOWN); + } + + /** Invoke a method on the visitor according to the kind of this + * instruction, passing in the decoded operands for the instruction. */ + public <R,P> R accept(KindVisitor<R,P> visitor, P p) { + switch (getKind()) { + case NO_OPERANDS: + return visitor.visitNoOperands(this, p); + + case ATYPE: + return visitor.visitArrayType( + this, TypeKind.get(getUnsignedByte(1)), p); + + case BRANCH: + return visitor.visitBranch(this, getShort(1), p); + + case BRANCH_W: + return visitor.visitBranch(this, getInt(1), p); + + case BYTE: + return visitor.visitValue(this, getByte(1), p); + + case CPREF: + return visitor.visitConstantPoolRef(this, getUnsignedByte(1), p); + + case CPREF_W: + return visitor.visitConstantPoolRef(this, getUnsignedShort(1), p); + + case CPREF_W_UBYTE: + case CPREF_W_UBYTE_ZERO: + return visitor.visitConstantPoolRefAndValue( + this, getUnsignedShort(1), getUnsignedByte(3), p); + + case DYNAMIC: { + switch (getOpcode()) { + case TABLESWITCH: { + int pad = align(pc + 1) - pc; + int default_ = getInt(pad); + int low = getInt(pad + 4); + int high = getInt(pad + 8); + int[] values = new int[high - low + 1]; + for (int i = 0; i < values.length; i++) + values[i] = getInt(pad + 12 + 4 * i); + return visitor.visitTableSwitch( + this, default_, low, high, values, p); + } + case LOOKUPSWITCH: { + int pad = align(pc + 1) - pc; + int default_ = getInt(pad); + int npairs = getInt(pad + 4); + int[] matches = new int[npairs]; + int[] offsets = new int[npairs]; + for (int i = 0; i < npairs; i++) { + matches[i] = getInt(pad + 8 + i * 8); + offsets[i] = getInt(pad + 12 + i * 8); + } + return visitor.visitLookupSwitch( + this, default_, npairs, matches, offsets, p); + } + default: + throw new IllegalStateException(); + } + } + + case LOCAL: + return visitor.visitLocal(this, getUnsignedByte(1), p); + + case LOCAL_BYTE: + return visitor.visitLocalAndValue( + this, getUnsignedByte(1), getByte(2), p); + + case SHORT: + return visitor.visitValue(this, getShort(1), p); + + case WIDE_NO_OPERANDS: + return visitor.visitNoOperands(this, p); + + case WIDE_LOCAL: + return visitor.visitLocal(this, getUnsignedShort(2), p); + + case WIDE_CPREF_W: + return visitor.visitConstantPoolRef(this, getUnsignedShort(2), p); + + case WIDE_CPREF_W_SHORT: + return visitor.visitConstantPoolRefAndValue( + this, getUnsignedShort(2), getUnsignedByte(4), p); + + case WIDE_LOCAL_SHORT: + return visitor.visitLocalAndValue( + this, getUnsignedShort(2), getShort(4), p); + + case UNKNOWN: + return visitor.visitUnknown(this, p); + + default: + throw new IllegalStateException(); + } + } + + private static int align(int n) { + return (n + 3) & ~3; + } + + private byte[] bytes; + private int pc; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/LineNumberTable_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.12. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class LineNumberTable_attribute extends Attribute { + LineNumberTable_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + line_number_table_length = cr.readUnsignedShort(); + line_number_table = new Entry[line_number_table_length]; + for (int i = 0; i < line_number_table_length; i++) + line_number_table[i] = new Entry(cr); + } + + public LineNumberTable_attribute(ConstantPool constant_pool, Entry[] line_number_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.LineNumberTable), line_number_table); + } + + public LineNumberTable_attribute(int name_index, Entry[] line_number_table) { + super(name_index, 2 + line_number_table.length * Entry.length()); + this.line_number_table_length = line_number_table.length; + this.line_number_table = line_number_table; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitLineNumberTable(this, data); + } + + public final int line_number_table_length; + public final Entry[] line_number_table; + + public static class Entry { + Entry(ClassReader cr) throws IOException { + start_pc = cr.readUnsignedShort(); + line_number = cr.readUnsignedShort(); + } + + public static int length() { + return 4; + } + + public final int start_pc; + public final int line_number; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/LocalVariableTable_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.13. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class LocalVariableTable_attribute extends Attribute { + LocalVariableTable_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + local_variable_table_length = cr.readUnsignedShort(); + local_variable_table = new Entry[local_variable_table_length]; + for (int i = 0; i < local_variable_table_length; i++) + local_variable_table[i] = new Entry(cr); + } + + public LocalVariableTable_attribute(ConstantPool constant_pool, Entry[] local_variable_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.LocalVariableTable), local_variable_table); + } + + public LocalVariableTable_attribute(int name_index, Entry[] local_variable_table) { + super(name_index, 2 + local_variable_table.length * Entry.length()); + this.local_variable_table_length = local_variable_table.length; + this.local_variable_table = local_variable_table; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitLocalVariableTable(this, data); + } + + public final int local_variable_table_length; + public final Entry[] local_variable_table; + + public static class Entry { + Entry(ClassReader cr) throws IOException { + start_pc = cr.readUnsignedShort(); + length = cr.readUnsignedShort(); + name_index = cr.readUnsignedShort(); + descriptor_index = cr.readUnsignedShort(); + index = cr.readUnsignedShort(); + } + + public static int length() { + return 10; + } + + public final int start_pc; + public final int length; + public final int name_index; + public final int descriptor_index; + public final int index; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/LocalVariableTypeTable_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.14. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class LocalVariableTypeTable_attribute extends Attribute { + LocalVariableTypeTable_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + local_variable_table_length = cr.readUnsignedShort(); + local_variable_table = new Entry[local_variable_table_length]; + for (int i = 0; i < local_variable_table_length; i++) + local_variable_table[i] = new Entry(cr); + } + + public LocalVariableTypeTable_attribute(ConstantPool constant_pool, Entry[] local_variable_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.LocalVariableTypeTable), local_variable_table); + } + + public LocalVariableTypeTable_attribute(int name_index, Entry[] local_variable_table) { + super(name_index, 2 + local_variable_table.length * Entry.length()); + this.local_variable_table_length = local_variable_table.length; + this.local_variable_table = local_variable_table; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitLocalVariableTypeTable(this, data); + } + + public final int local_variable_table_length; + public final Entry[] local_variable_table; + + public static class Entry { + Entry(ClassReader cr) throws IOException { + start_pc = cr.readUnsignedShort(); + length = cr.readUnsignedShort(); + name_index = cr.readUnsignedShort(); + signature_index = cr.readUnsignedShort(); + index = cr.readUnsignedShort(); + } + + public static int length() { + return 10; + } + + public final int start_pc; + public final int length; + public final int name_index; + public final int signature_index; + public final int index; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Method.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/* + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Method { + Method(ClassReader cr) throws IOException { + access_flags = new AccessFlags(cr); + name_index = cr.readUnsignedShort(); + descriptor = new Descriptor(cr); + attributes = new Attributes(cr); + } + + public Method(AccessFlags access_flags, + int name_index, Descriptor descriptor, + Attributes attributes) { + this.access_flags = access_flags; + this.name_index = name_index; + this.descriptor = descriptor; + this.attributes = attributes; + } + + public int byteLength() { + return 6 + attributes.byteLength(); + } + + public String getName(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(name_index); + } + + public final AccessFlags access_flags; + public final int name_index; + public final Descriptor descriptor; + public final Attributes attributes; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/MethodParameters_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.13. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class MethodParameters_attribute extends Attribute { + + public final int method_parameter_table_length; + public final Entry[] method_parameter_table; + + MethodParameters_attribute(ClassReader cr, + int name_index, + int length) + throws IOException { + super(name_index, length); + + method_parameter_table_length = cr.readUnsignedByte(); + method_parameter_table = new Entry[method_parameter_table_length]; + for (int i = 0; i < method_parameter_table_length; i++) + method_parameter_table[i] = new Entry(cr); + } + + public MethodParameters_attribute(ConstantPool constant_pool, + Entry[] method_parameter_table) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.MethodParameters), + method_parameter_table); + } + + public MethodParameters_attribute(int name_index, + Entry[] method_parameter_table) { + super(name_index, 1 + method_parameter_table.length * Entry.length()); + this.method_parameter_table_length = method_parameter_table.length; + this.method_parameter_table = method_parameter_table; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitMethodParameters(this, data); + } + + public static class Entry { + Entry(ClassReader cr) throws IOException { + name_index = cr.readUnsignedShort(); + flags = cr.readUnsignedShort(); + } + + public static int length() { + return 6; + } + + public final int name_index; + public final int flags; + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Opcode.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,472 @@ +/* + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import static com.sun.tools.classfile.Instruction.Kind.*; +import static com.sun.tools.classfile.Opcode.Set.*; + +/** + * See JVMS, chapter 6. + * + * <p>In addition to providing all the standard opcodes defined in JVMS, + * this class also provides legacy support for the PicoJava extensions. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public enum Opcode { + NOP(0x0), + ACONST_NULL(0x1), + ICONST_M1(0x2), + ICONST_0(0x3), + ICONST_1(0x4), + ICONST_2(0x5), + ICONST_3(0x6), + ICONST_4(0x7), + ICONST_5(0x8), + LCONST_0(0x9), + LCONST_1(0xa), + FCONST_0(0xb), + FCONST_1(0xc), + FCONST_2(0xd), + DCONST_0(0xe), + DCONST_1(0xf), + BIPUSH(0x10, BYTE), + SIPUSH(0x11, SHORT), + LDC(0x12, CPREF), + LDC_W(0x13, CPREF_W), + LDC2_W(0x14, CPREF_W), + ILOAD(0x15, LOCAL), + LLOAD(0x16, LOCAL), + FLOAD(0x17, LOCAL), + DLOAD(0x18, LOCAL), + ALOAD(0x19, LOCAL), + ILOAD_0(0x1a), + ILOAD_1(0x1b), + ILOAD_2(0x1c), + ILOAD_3(0x1d), + LLOAD_0(0x1e), + LLOAD_1(0x1f), + LLOAD_2(0x20), + LLOAD_3(0x21), + FLOAD_0(0x22), + FLOAD_1(0x23), + FLOAD_2(0x24), + FLOAD_3(0x25), + DLOAD_0(0x26), + DLOAD_1(0x27), + DLOAD_2(0x28), + DLOAD_3(0x29), + ALOAD_0(0x2a), + ALOAD_1(0x2b), + ALOAD_2(0x2c), + ALOAD_3(0x2d), + IALOAD(0x2e), + LALOAD(0x2f), + FALOAD(0x30), + DALOAD(0x31), + AALOAD(0x32), + BALOAD(0x33), + CALOAD(0x34), + SALOAD(0x35), + ISTORE(0x36, LOCAL), + LSTORE(0x37, LOCAL), + FSTORE(0x38, LOCAL), + DSTORE(0x39, LOCAL), + ASTORE(0x3a, LOCAL), + ISTORE_0(0x3b), + ISTORE_1(0x3c), + ISTORE_2(0x3d), + ISTORE_3(0x3e), + LSTORE_0(0x3f), + LSTORE_1(0x40), + LSTORE_2(0x41), + LSTORE_3(0x42), + FSTORE_0(0x43), + FSTORE_1(0x44), + FSTORE_2(0x45), + FSTORE_3(0x46), + DSTORE_0(0x47), + DSTORE_1(0x48), + DSTORE_2(0x49), + DSTORE_3(0x4a), + ASTORE_0(0x4b), + ASTORE_1(0x4c), + ASTORE_2(0x4d), + ASTORE_3(0x4e), + IASTORE(0x4f), + LASTORE(0x50), + FASTORE(0x51), + DASTORE(0x52), + AASTORE(0x53), + BASTORE(0x54), + CASTORE(0x55), + SASTORE(0x56), + POP(0x57), + POP2(0x58), + DUP(0x59), + DUP_X1(0x5a), + DUP_X2(0x5b), + DUP2(0x5c), + DUP2_X1(0x5d), + DUP2_X2(0x5e), + SWAP(0x5f), + IADD(0x60), + LADD(0x61), + FADD(0x62), + DADD(0x63), + ISUB(0x64), + LSUB(0x65), + FSUB(0x66), + DSUB(0x67), + IMUL(0x68), + LMUL(0x69), + FMUL(0x6a), + DMUL(0x6b), + IDIV(0x6c), + LDIV(0x6d), + FDIV(0x6e), + DDIV(0x6f), + IREM(0x70), + LREM(0x71), + FREM(0x72), + DREM(0x73), + INEG(0x74), + LNEG(0x75), + FNEG(0x76), + DNEG(0x77), + ISHL(0x78), + LSHL(0x79), + ISHR(0x7a), + LSHR(0x7b), + IUSHR(0x7c), + LUSHR(0x7d), + IAND(0x7e), + LAND(0x7f), + IOR(0x80), + LOR(0x81), + IXOR(0x82), + LXOR(0x83), + IINC(0x84, LOCAL_BYTE), + I2L(0x85), + I2F(0x86), + I2D(0x87), + L2I(0x88), + L2F(0x89), + L2D(0x8a), + F2I(0x8b), + F2L(0x8c), + F2D(0x8d), + D2I(0x8e), + D2L(0x8f), + D2F(0x90), + I2B(0x91), + I2C(0x92), + I2S(0x93), + LCMP(0x94), + FCMPL(0x95), + FCMPG(0x96), + DCMPL(0x97), + DCMPG(0x98), + IFEQ(0x99, BRANCH), + IFNE(0x9a, BRANCH), + IFLT(0x9b, BRANCH), + IFGE(0x9c, BRANCH), + IFGT(0x9d, BRANCH), + IFLE(0x9e, BRANCH), + IF_ICMPEQ(0x9f, BRANCH), + IF_ICMPNE(0xa0, BRANCH), + IF_ICMPLT(0xa1, BRANCH), + IF_ICMPGE(0xa2, BRANCH), + IF_ICMPGT(0xa3, BRANCH), + IF_ICMPLE(0xa4, BRANCH), + IF_ACMPEQ(0xa5, BRANCH), + IF_ACMPNE(0xa6, BRANCH), + GOTO(0xa7, BRANCH), + JSR(0xa8, BRANCH), + RET(0xa9, LOCAL), + TABLESWITCH(0xaa, DYNAMIC), + LOOKUPSWITCH(0xab, DYNAMIC), + IRETURN(0xac), + LRETURN(0xad), + FRETURN(0xae), + DRETURN(0xaf), + ARETURN(0xb0), + RETURN(0xb1), + GETSTATIC(0xb2, CPREF_W), + PUTSTATIC(0xb3, CPREF_W), + GETFIELD(0xb4, CPREF_W), + PUTFIELD(0xb5, CPREF_W), + INVOKEVIRTUAL(0xb6, CPREF_W), + INVOKESPECIAL(0xb7, CPREF_W), + INVOKESTATIC(0xb8, CPREF_W), + INVOKEINTERFACE(0xb9, CPREF_W_UBYTE_ZERO), + INVOKEDYNAMIC(0xba, CPREF_W_UBYTE_ZERO), + NEW(0xbb, CPREF_W), + NEWARRAY(0xbc, ATYPE), + ANEWARRAY(0xbd, CPREF_W), + ARRAYLENGTH(0xbe), + ATHROW(0xbf), + CHECKCAST(0xc0, CPREF_W), + INSTANCEOF(0xc1, CPREF_W), + MONITORENTER(0xc2), + MONITOREXIT(0xc3), + // wide 0xc4 + MULTIANEWARRAY(0xc5, CPREF_W_UBYTE), + IFNULL(0xc6, BRANCH), + IFNONNULL(0xc7, BRANCH), + GOTO_W(0xc8, BRANCH_W), + JSR_W(0xc9, BRANCH_W), + // impdep 0xfe: PicoJava nonpriv + // impdep 0xff: Picojava priv + + // wide opcodes + ILOAD_W(0xc415, WIDE_LOCAL), + LLOAD_W(0xc416, WIDE_LOCAL), + FLOAD_W(0xc417, WIDE_LOCAL), + DLOAD_W(0xc418, WIDE_LOCAL), + ALOAD_W(0xc419, WIDE_LOCAL), + ISTORE_W(0xc436, WIDE_LOCAL), + LSTORE_W(0xc437, WIDE_LOCAL), + FSTORE_W(0xc438, WIDE_LOCAL), + DSTORE_W(0xc439, WIDE_LOCAL), + ASTORE_W(0xc43a, WIDE_LOCAL), + IINC_W(0xc484, WIDE_LOCAL_SHORT), + RET_W(0xc4a9, WIDE_LOCAL), + + // PicoJava nonpriv instructions + LOAD_UBYTE(PICOJAVA, 0xfe00), + LOAD_BYTE(PICOJAVA, 0xfe01), + LOAD_CHAR(PICOJAVA, 0xfe02), + LOAD_SHORT(PICOJAVA, 0xfe03), + LOAD_WORD(PICOJAVA, 0xfe04), + RET_FROM_SUB(PICOJAVA, 0xfe05), + LOAD_CHAR_OE(PICOJAVA, 0xfe0a), + LOAD_SHORT_OE(PICOJAVA, 0xfe0b), + LOAD_WORD_OE(PICOJAVA, 0xfe0c), + NCLOAD_UBYTE(PICOJAVA, 0xfe10), + NCLOAD_BYTE(PICOJAVA, 0xfe11), + NCLOAD_CHAR(PICOJAVA, 0xfe12), + NCLOAD_SHORT(PICOJAVA, 0xfe13), + NCLOAD_WORD(PICOJAVA, 0xfe14), + NCLOAD_CHAR_OE(PICOJAVA, 0xfe1a), + NCLOAD_SHORT_OE(PICOJAVA, 0xfe1b), + NCLOAD_WORD_OE(PICOJAVA, 0xfe1c), + CACHE_FLUSH(PICOJAVA, 0xfe1e), + STORE_BYTE(PICOJAVA, 0xfe20), + STORE_SHORT(PICOJAVA, 0xfe22), + STORE_WORD(PICOJAVA, 0xfe24), + STORE_SHORT_OE(PICOJAVA, 0xfe2a), + STORE_WORD_OE(PICOJAVA, 0xfe2c), + NCSTORE_BYTE(PICOJAVA, 0xfe30), + NCSTORE_SHORT(PICOJAVA, 0xfe32), + NCSTORE_WORD(PICOJAVA, 0xfe34), + NCSTORE_SHORT_OE(PICOJAVA, 0xfe3a), + NCSTORE_WORD_OE(PICOJAVA, 0xfe3c), + ZERO_LINE(PICOJAVA, 0xfe3e), + ENTER_SYNC_METHOD(PICOJAVA, 0xfe3f), + + // PicoJava priv instructions + PRIV_LOAD_UBYTE(PICOJAVA, 0xff00), + PRIV_LOAD_BYTE(PICOJAVA, 0xff01), + PRIV_LOAD_CHAR(PICOJAVA, 0xff02), + PRIV_LOAD_SHORT(PICOJAVA, 0xff03), + PRIV_LOAD_WORD(PICOJAVA, 0xff04), + PRIV_RET_FROM_TRAP(PICOJAVA, 0xff05), + PRIV_READ_DCACHE_TAG(PICOJAVA, 0xff06), + PRIV_READ_DCACHE_DATA(PICOJAVA, 0xff07), + PRIV_LOAD_CHAR_OE(PICOJAVA, 0xff0a), + PRIV_LOAD_SHORT_OE(PICOJAVA, 0xff0b), + PRIV_LOAD_WORD_OE(PICOJAVA, 0xff0c), + PRIV_READ_ICACHE_TAG(PICOJAVA, 0xff0e), + PRIV_READ_ICACHE_DATA(PICOJAVA, 0xff0f), + PRIV_NCLOAD_UBYTE(PICOJAVA, 0xff10), + PRIV_NCLOAD_BYTE(PICOJAVA, 0xff11), + PRIV_NCLOAD_CHAR(PICOJAVA, 0xff12), + PRIV_NCLOAD_SHORT(PICOJAVA, 0xff13), + PRIV_NCLOAD_WORD(PICOJAVA, 0xff14), + PRIV_POWERDOWN(PICOJAVA, 0xff16), + PRIV_READ_SCACHE_DATA(PICOJAVA, 0xff17), + PRIV_NCLOAD_CHAR_OE(PICOJAVA, 0xff1a), + PRIV_NCLOAD_SHORT_OE(PICOJAVA, 0xff1b), + PRIV_NCLOAD_WORD_OE(PICOJAVA, 0xff1c), + PRIV_CACHE_FLUSH(PICOJAVA, 0xff1e), + PRIV_CACHE_INDEX_FLUSH(PICOJAVA, 0xff1f), + PRIV_STORE_BYTE(PICOJAVA, 0xff20), + PRIV_STORE_SHORT(PICOJAVA, 0xff22), + PRIV_STORE_WORD(PICOJAVA, 0xff24), + PRIV_WRITE_DCACHE_TAG(PICOJAVA, 0xff26), + PRIV_WRITE_DCACHE_DATA(PICOJAVA, 0xff27), + PRIV_STORE_SHORT_OE(PICOJAVA, 0xff2a), + PRIV_STORE_WORD_OE(PICOJAVA, 0xff2c), + PRIV_WRITE_ICACHE_TAG(PICOJAVA, 0xff2e), + PRIV_WRITE_ICACHE_DATA(PICOJAVA, 0xff2f), + PRIV_NCSTORE_BYTE(PICOJAVA, 0xff30), + PRIV_NCSTORE_SHORT(PICOJAVA, 0xff32), + PRIV_NCSTORE_WORD(PICOJAVA, 0xff34), + PRIV_RESET(PICOJAVA, 0xff36), + PRIV_WRITE_SCACHE_DATA(PICOJAVA, 0xff37), + PRIV_NCSTORE_SHORT_OE(PICOJAVA, 0xff3a), + PRIV_NCSTORE_WORD_OE(PICOJAVA, 0xff3c), + PRIV_ZERO_LINE(PICOJAVA, 0xff3e), + PRIV_READ_REG_0(PICOJAVA, 0xff40), + PRIV_READ_REG_1(PICOJAVA, 0xff41), + PRIV_READ_REG_2(PICOJAVA, 0xff42), + PRIV_READ_REG_3(PICOJAVA, 0xff43), + PRIV_READ_REG_4(PICOJAVA, 0xff44), + PRIV_READ_REG_5(PICOJAVA, 0xff45), + PRIV_READ_REG_6(PICOJAVA, 0xff46), + PRIV_READ_REG_7(PICOJAVA, 0xff47), + PRIV_READ_REG_8(PICOJAVA, 0xff48), + PRIV_READ_REG_9(PICOJAVA, 0xff49), + PRIV_READ_REG_10(PICOJAVA, 0xff4a), + PRIV_READ_REG_11(PICOJAVA, 0xff4b), + PRIV_READ_REG_12(PICOJAVA, 0xff4c), + PRIV_READ_REG_13(PICOJAVA, 0xff4d), + PRIV_READ_REG_14(PICOJAVA, 0xff4e), + PRIV_READ_REG_15(PICOJAVA, 0xff4f), + PRIV_READ_REG_16(PICOJAVA, 0xff50), + PRIV_READ_REG_17(PICOJAVA, 0xff51), + PRIV_READ_REG_18(PICOJAVA, 0xff52), + PRIV_READ_REG_19(PICOJAVA, 0xff53), + PRIV_READ_REG_20(PICOJAVA, 0xff54), + PRIV_READ_REG_21(PICOJAVA, 0xff55), + PRIV_READ_REG_22(PICOJAVA, 0xff56), + PRIV_READ_REG_23(PICOJAVA, 0xff57), + PRIV_READ_REG_24(PICOJAVA, 0xff58), + PRIV_READ_REG_25(PICOJAVA, 0xff59), + PRIV_READ_REG_26(PICOJAVA, 0xff5a), + PRIV_READ_REG_27(PICOJAVA, 0xff5b), + PRIV_READ_REG_28(PICOJAVA, 0xff5c), + PRIV_READ_REG_29(PICOJAVA, 0xff5d), + PRIV_READ_REG_30(PICOJAVA, 0xff5e), + PRIV_READ_REG_31(PICOJAVA, 0xff5f), + PRIV_WRITE_REG_0(PICOJAVA, 0xff60), + PRIV_WRITE_REG_1(PICOJAVA, 0xff61), + PRIV_WRITE_REG_2(PICOJAVA, 0xff62), + PRIV_WRITE_REG_3(PICOJAVA, 0xff63), + PRIV_WRITE_REG_4(PICOJAVA, 0xff64), + PRIV_WRITE_REG_5(PICOJAVA, 0xff65), + PRIV_WRITE_REG_6(PICOJAVA, 0xff66), + PRIV_WRITE_REG_7(PICOJAVA, 0xff67), + PRIV_WRITE_REG_8(PICOJAVA, 0xff68), + PRIV_WRITE_REG_9(PICOJAVA, 0xff69), + PRIV_WRITE_REG_10(PICOJAVA, 0xff6a), + PRIV_WRITE_REG_11(PICOJAVA, 0xff6b), + PRIV_WRITE_REG_12(PICOJAVA, 0xff6c), + PRIV_WRITE_REG_13(PICOJAVA, 0xff6d), + PRIV_WRITE_REG_14(PICOJAVA, 0xff6e), + PRIV_WRITE_REG_15(PICOJAVA, 0xff6f), + PRIV_WRITE_REG_16(PICOJAVA, 0xff70), + PRIV_WRITE_REG_17(PICOJAVA, 0xff71), + PRIV_WRITE_REG_18(PICOJAVA, 0xff72), + PRIV_WRITE_REG_19(PICOJAVA, 0xff73), + PRIV_WRITE_REG_20(PICOJAVA, 0xff74), + PRIV_WRITE_REG_21(PICOJAVA, 0xff75), + PRIV_WRITE_REG_22(PICOJAVA, 0xff76), + PRIV_WRITE_REG_23(PICOJAVA, 0xff77), + PRIV_WRITE_REG_24(PICOJAVA, 0xff78), + PRIV_WRITE_REG_25(PICOJAVA, 0xff79), + PRIV_WRITE_REG_26(PICOJAVA, 0xff7a), + PRIV_WRITE_REG_27(PICOJAVA, 0xff7b), + PRIV_WRITE_REG_28(PICOJAVA, 0xff7c), + PRIV_WRITE_REG_29(PICOJAVA, 0xff7d), + PRIV_WRITE_REG_30(PICOJAVA, 0xff7e), + PRIV_WRITE_REG_31(PICOJAVA, 0xff7f); + + Opcode(int opcode) { + this(STANDARD, opcode, NO_OPERANDS); + } + + Opcode(int opcode, Instruction.Kind kind) { + this(STANDARD, opcode, kind); + } + + Opcode(Set set, int opcode) { + this(set, opcode, (set == STANDARD ? NO_OPERANDS : WIDE_NO_OPERANDS)); + } + + Opcode(Set set, int opcode, Instruction.Kind kind) { + this.set = set; + this.opcode = opcode; + this.kind = kind; + } + + public final Set set; + public final int opcode; + public final Instruction.Kind kind; + + /** Get the Opcode for a simple standard 1-byte opcode. */ + public static Opcode get(int opcode) { + return stdOpcodes[opcode]; + } + + /** Get the Opcode for 1- or 2-byte opcode. */ + public static Opcode get(int opcodePrefix, int opcode) { + Opcode[] block = getOpcodeBlock(opcodePrefix); + return (block == null ? null : block[opcode]); + } + + private static Opcode[] getOpcodeBlock(int opcodePrefix) { + switch (opcodePrefix) { + case 0: + return stdOpcodes; + case WIDE: + return wideOpcodes; + case NONPRIV: + return nonPrivOpcodes; + case PRIV: + return privOpcodes; + default: + return null; + } + + } + + private static final Opcode[] stdOpcodes = new Opcode[256]; + private static final Opcode[] wideOpcodes = new Opcode[256]; + private static final Opcode[] nonPrivOpcodes = new Opcode[256]; + private static final Opcode[] privOpcodes = new Opcode[256]; + static { + for (Opcode o: values()) + getOpcodeBlock(o.opcode >> 8)[o.opcode & 0xff] = o; + } + + /** The byte prefix for the wide instructions. */ + public static final int WIDE = 0xc4; + /** The byte prefix for the PicoJava nonpriv instructions. */ + public static final int NONPRIV = 0xfe; + /** The byte prefix for the PicoJava priv instructions. */ + public static final int PRIV = 0xff; + + public enum Set { + /** Standard opcodes. */ + STANDARD, + /** Legacy support for PicoJava opcodes. */ + PICOJAVA } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/ReferenceFinder.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import com.sun.tools.classfile.Instruction.TypeKind; +import static com.sun.tools.classfile.ConstantPool.*; + +/** + * A utility class to find where in a ClassFile references + * a {@link CONSTANT_Methodref_info method}, + * a {@link CONSTANT_InterfaceMethodref_info interface method, + * or a {@link CONSTANT_Fieldref_info field}. + */ +public final class ReferenceFinder { + /** + * Filter for ReferenceFinder of what constant pool entries for reference lookup. + */ + public interface Filter { + /** + * Decides if the given CPRefInfo entry should be accepted or filtered. + * + * @param cpool ConstantPool of the ClassFile being parsed + * @param cpref constant pool entry representing a reference to + * a fields method, and interface method. + * @return {@code true} if accepted; otherwise {@code false} + */ + boolean accept(ConstantPool cpool, CPRefInfo cpref); + } + + /** + * Visitor of individual method of a ClassFile that references the + * accepted field, method, or interface method references. + */ + public interface Visitor { + /** + * Invoked for a method containing one or more accepted CPRefInfo entries + * + * @param cf ClassFile + * @param method Method that does the references the accepted references + * @param refs Accepted constant pool method/field reference + */ + void visit(ClassFile cf, Method method, List<CPRefInfo> refConstantPool); + } + + private final Filter filter; + private final Visitor visitor; + + /** + * Constructor. + */ + public ReferenceFinder(Filter filter, Visitor visitor) { + this.filter = Objects.requireNonNull(filter); + this.visitor = Objects.requireNonNull(visitor); + } + + /** + * Parses a given ClassFile and invoke the visitor if there is any reference + * to the constant pool entries referencing field, method, or + * interface method that are accepted. This method will return + * {@code true} if there is one or more accepted constant pool entries + * to lookup; otherwise, it will return {@code false}. + * + * @param cf ClassFile + * @return {@code true} if the given class file is processed to lookup + * references + * @throws ConstantPoolException if an error of the constant pool + */ + public boolean parse(ClassFile cf) throws ConstantPoolException { + List<Integer> cprefs = new ArrayList<>(); + int index = 1; + for (ConstantPool.CPInfo cpInfo : cf.constant_pool.entries()) { + if (cpInfo.accept(cpVisitor, cf.constant_pool)) { + cprefs.add(index); + } + index += cpInfo.size(); + } + + if (cprefs.isEmpty()) { + return false; + } + + for (Method m : cf.methods) { + Set<Integer> ids = new HashSet<>(); + Code_attribute c_attr = (Code_attribute) m.attributes.get(Attribute.Code); + if (c_attr != null) { + for (Instruction instr : c_attr.getInstructions()) { + int idx = instr.accept(codeVisitor, cprefs); + if (idx > 0) { + ids.add(idx); + } + } + } + if (ids.size() > 0) { + List<CPRefInfo> refInfos = new ArrayList<>(ids.size()); + for (int id : ids) { + refInfos.add(CPRefInfo.class.cast(cf.constant_pool.get(id))); + } + visitor.visit(cf, m, refInfos); + } + } + return true; + } + + private ConstantPool.Visitor<Boolean,ConstantPool> cpVisitor = + new ConstantPool.Visitor<Boolean,ConstantPool>() + { + public Boolean visitClass(CONSTANT_Class_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, ConstantPool cpool) { + return filter.accept(cpool, info); + } + + public Boolean visitMethodref(CONSTANT_Methodref_info info, ConstantPool cpool) { + return filter.accept(cpool, info); + } + + public Boolean visitFieldref(CONSTANT_Fieldref_info info, ConstantPool cpool) { + return filter.accept(cpool, info); + } + + public Boolean visitDouble(CONSTANT_Double_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitFloat(CONSTANT_Float_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitInteger(CONSTANT_Integer_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitLong(CONSTANT_Long_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitNameAndType(CONSTANT_NameAndType_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitMethodHandle(CONSTANT_MethodHandle_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitMethodType(CONSTANT_MethodType_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitString(CONSTANT_String_info info, ConstantPool cpool) { + return false; + } + + public Boolean visitUtf8(CONSTANT_Utf8_info info, ConstantPool cpool) { + return false; + } + }; + + private Instruction.KindVisitor<Integer, List<Integer>> codeVisitor = + new Instruction.KindVisitor<Integer, List<Integer>>() + { + public Integer visitNoOperands(Instruction instr, List<Integer> p) { + return 0; + } + + public Integer visitArrayType(Instruction instr, TypeKind kind, List<Integer> p) { + return 0; + } + + public Integer visitBranch(Instruction instr, int offset, List<Integer> p) { + return 0; + } + + public Integer visitConstantPoolRef(Instruction instr, int index, List<Integer> p) { + return p.contains(index) ? index : 0; + } + + public Integer visitConstantPoolRefAndValue(Instruction instr, int index, int value, List<Integer> p) { + return p.contains(index) ? index : 0; + } + + public Integer visitLocal(Instruction instr, int index, List<Integer> p) { + return 0; + } + + public Integer visitLocalAndValue(Instruction instr, int index, int value, List<Integer> p) { + return 0; + } + + public Integer visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, List<Integer> p) { + return 0; + } + + public Integer visitTableSwitch(Instruction instr, int default_, int low, int high, int[] offsets, List<Integer> p) { + return 0; + } + + public Integer visitValue(Instruction instr, int value, List<Integer> p) { + return 0; + } + + public Integer visitUnknown(Instruction instr, List<Integer> p) { + return 0; + } + }; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.16 and 4.8.17. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public abstract class RuntimeAnnotations_attribute extends Attribute { + protected RuntimeAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(name_index, length); + int num_annotations = cr.readUnsignedShort(); + annotations = new Annotation[num_annotations]; + for (int i = 0; i < annotations.length; i++) + annotations[i] = new Annotation(cr); + } + + protected RuntimeAnnotations_attribute(int name_index, Annotation[] annotations) { + super(name_index, length(annotations)); + this.annotations = annotations; + } + + private static int length(Annotation[] annos) { + int n = 2; + for (Annotation anno: annos) + n += anno.length(); + return n; + } + + public final Annotation[] annotations; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeInvisibleAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.17. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeInvisibleAnnotations_attribute extends RuntimeAnnotations_attribute { + RuntimeInvisibleAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, AttributeException { + super(cr, name_index, length); + } + + public RuntimeInvisibleAnnotations_attribute(ConstantPool cp, Annotation[] annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeInvisibleAnnotations), annotations); + } + + public RuntimeInvisibleAnnotations_attribute(int name_index, Annotation[] annotations) { + super(name_index, annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeInvisibleAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeInvisibleParameterAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.18. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeInvisibleParameterAnnotations_attribute extends RuntimeParameterAnnotations_attribute { + RuntimeInvisibleParameterAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(cr, name_index, length); + } + + public RuntimeInvisibleParameterAnnotations_attribute(ConstantPool cp, Annotation[][] parameter_annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeInvisibleParameterAnnotations), parameter_annotations); + } + + public RuntimeInvisibleParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { + super(name_index, parameter_annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeInvisibleParameterAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeInvisibleTypeAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JSR 308 specification, Section 3. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeInvisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute { + RuntimeInvisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(cr, name_index, length); + } + + public RuntimeInvisibleTypeAnnotations_attribute(ConstantPool cp, TypeAnnotation[] annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeInvisibleTypeAnnotations), annotations); + } + + public RuntimeInvisibleTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { + super(name_index, annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeInvisibleTypeAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeParameterAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.18 and 4.8.19. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public abstract class RuntimeParameterAnnotations_attribute extends Attribute { + RuntimeParameterAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(name_index, length); + int num_parameters = cr.readUnsignedByte(); + parameter_annotations = new Annotation[num_parameters][]; + for (int p = 0; p < parameter_annotations.length; p++) { + int num_annotations = cr.readUnsignedShort(); + Annotation[] annotations = new Annotation[num_annotations]; + for (int i = 0; i < num_annotations; i++) + annotations[i] = new Annotation(cr); + parameter_annotations[p] = annotations; + } + } + + protected RuntimeParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { + super(name_index, length(parameter_annotations)); + this.parameter_annotations = parameter_annotations; + } + + private static int length(Annotation[][] anno_arrays) { + int n = 1; + for (Annotation[] anno_array: anno_arrays) { + n += 2; + for (Annotation anno: anno_array) + n += anno.length(); + } + return n; + } + + public final Annotation[][] parameter_annotations; +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeTypeAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JSR 308 specification, Section 3. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public abstract class RuntimeTypeAnnotations_attribute extends Attribute { + protected RuntimeTypeAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(name_index, length); + int num_annotations = cr.readUnsignedShort(); + annotations = new TypeAnnotation[num_annotations]; + for (int i = 0; i < annotations.length; i++) + annotations[i] = new TypeAnnotation(cr); + } + + protected RuntimeTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { + super(name_index, length(annotations)); + this.annotations = annotations; + } + + private static int length(TypeAnnotation[] annos) { + int n = 2; + for (TypeAnnotation anno: annos) + n += anno.length(); + return n; + } + + public final TypeAnnotation[] annotations; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeVisibleAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.16. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeVisibleAnnotations_attribute extends RuntimeAnnotations_attribute { + RuntimeVisibleAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(cr, name_index, length); + } + + public RuntimeVisibleAnnotations_attribute(ConstantPool cp, Annotation[] annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeVisibleAnnotations), annotations); + } + + public RuntimeVisibleAnnotations_attribute(int name_index, Annotation[] annotations) { + super(name_index, annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeVisibleAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeVisibleParameterAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.18. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeVisibleParameterAnnotations_attribute extends RuntimeParameterAnnotations_attribute { + RuntimeVisibleParameterAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(cr, name_index, length); + } + + public RuntimeVisibleParameterAnnotations_attribute(ConstantPool cp, Annotation[][] parameter_annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeVisibleParameterAnnotations), parameter_annotations); + } + + public RuntimeVisibleParameterAnnotations_attribute(int name_index, Annotation[][] parameter_annotations) { + super(name_index, parameter_annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeVisibleParameterAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/RuntimeVisibleTypeAnnotations_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JSR 308 specification, Section 3. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class RuntimeVisibleTypeAnnotations_attribute extends RuntimeTypeAnnotations_attribute { + RuntimeVisibleTypeAnnotations_attribute(ClassReader cr, int name_index, int length) + throws IOException, Annotation.InvalidAnnotation { + super(cr, name_index, length); + } + + public RuntimeVisibleTypeAnnotations_attribute(ConstantPool cp, TypeAnnotation[] annotations) + throws ConstantPoolException { + this(cp.getUTF8Index(Attribute.RuntimeVisibleTypeAnnotations), annotations); + } + + public RuntimeVisibleTypeAnnotations_attribute(int name_index, TypeAnnotation[] annotations) { + super(name_index, annotations); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitRuntimeVisibleTypeAnnotations(this, p); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Signature.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.ArrayList; +import java.util.List; +import com.sun.tools.classfile.Type.*; + +/** + * See JVMS 4.4.4. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Signature extends Descriptor { + + public Signature(int index) { + super(index); + } + + public Type getType(ConstantPool constant_pool) throws ConstantPoolException { + if (type == null) + type = parse(getValue(constant_pool)); + return type; + } + + @Override + public int getParameterCount(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + return m.paramTypes.size(); + } + + @Override + public String getParameterTypes(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + StringBuilder sb = new StringBuilder(); + sb.append("("); + String sep = ""; + for (Type paramType: m.paramTypes) { + sb.append(sep); + sb.append(paramType); + sep = ", "; + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getReturnType(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + return m.returnType.toString(); + } + + @Override + public String getFieldType(ConstantPool constant_pool) throws ConstantPoolException { + return getType(constant_pool).toString(); + } + + private Type parse(String sig) { + this.sig = sig; + sigp = 0; + + List<TypeParamType> typeParamTypes = null; + if (sig.charAt(sigp) == '<') + typeParamTypes = parseTypeParamTypes(); + + if (sig.charAt(sigp) == '(') { + List<Type> paramTypes = parseTypeSignatures(')'); + Type returnType = parseTypeSignature(); + List<Type> throwsTypes = null; + while (sigp < sig.length() && sig.charAt(sigp) == '^') { + sigp++; + if (throwsTypes == null) + throwsTypes = new ArrayList<>(); + throwsTypes.add(parseTypeSignature()); + } + return new MethodType(typeParamTypes, paramTypes, returnType, throwsTypes); + } else { + Type t = parseTypeSignature(); + if (typeParamTypes == null && sigp == sig.length()) + return t; + Type superclass = t; + List<Type> superinterfaces = null; + while (sigp < sig.length()) { + if (superinterfaces == null) + superinterfaces = new ArrayList<>(); + superinterfaces.add(parseTypeSignature()); + } + return new ClassSigType(typeParamTypes, superclass, superinterfaces); + + } + } + + private Type parseTypeSignature() { + switch (sig.charAt(sigp)) { + case 'B': + sigp++; + return new SimpleType("byte"); + + case 'C': + sigp++; + return new SimpleType("char"); + + case 'D': + sigp++; + return new SimpleType("double"); + + case 'F': + sigp++; + return new SimpleType("float"); + + case 'I': + sigp++; + return new SimpleType("int"); + + case 'J': + sigp++; + return new SimpleType("long"); + + case 'L': + return parseClassTypeSignature(); + + case 'S': + sigp++; + return new SimpleType("short"); + + case 'T': + return parseTypeVariableSignature(); + + case 'V': + sigp++; + return new SimpleType("void"); + + case 'Z': + sigp++; + return new SimpleType("boolean"); + + case '[': + sigp++; + return new ArrayType(parseTypeSignature()); + + case '*': + sigp++; + return new WildcardType(); + + case '+': + sigp++; + return new WildcardType(WildcardType.Kind.EXTENDS, parseTypeSignature()); + + case '-': + sigp++; + return new WildcardType(WildcardType.Kind.SUPER, parseTypeSignature()); + + default: + throw new IllegalStateException(debugInfo()); + } + } + + private List<Type> parseTypeSignatures(char term) { + sigp++; + List<Type> types = new ArrayList<>(); + while (sig.charAt(sigp) != term) + types.add(parseTypeSignature()); + sigp++; + return types; + } + + private Type parseClassTypeSignature() { + assert sig.charAt(sigp) == 'L'; + sigp++; + return parseClassTypeSignatureRest(); + } + + private Type parseClassTypeSignatureRest() { + StringBuilder sb = new StringBuilder(); + List<Type> argTypes = null; + ClassType t = null; + char sigch ; + + do { + switch (sigch = sig.charAt(sigp)) { + case '<': + argTypes = parseTypeSignatures('>'); + break; + + case '.': + case ';': + sigp++; + t = new ClassType(t, sb.toString(), argTypes); + sb.setLength(0); + argTypes = null; + break; + + default: + sigp++; + sb.append(sigch); + break; + } + } while (sigch != ';'); + + return t; + } + + private List<TypeParamType> parseTypeParamTypes() { + assert sig.charAt(sigp) == '<'; + sigp++; + List<TypeParamType> types = new ArrayList<>(); + while (sig.charAt(sigp) != '>') + types.add(parseTypeParamType()); + sigp++; + return types; + } + + private TypeParamType parseTypeParamType() { + int sep = sig.indexOf(":", sigp); + String name = sig.substring(sigp, sep); + Type classBound = null; + List<Type> interfaceBounds = null; + sigp = sep + 1; + if (sig.charAt(sigp) != ':') + classBound = parseTypeSignature(); + while (sig.charAt(sigp) == ':') { + sigp++; + if (interfaceBounds == null) + interfaceBounds = new ArrayList<>(); + interfaceBounds.add(parseTypeSignature()); + } + return new TypeParamType(name, classBound, interfaceBounds); + } + + private Type parseTypeVariableSignature() { + sigp++; + int sep = sig.indexOf(';', sigp); + Type t = new SimpleType(sig.substring(sigp, sep)); + sigp = sep + 1; + return t; + } + + private String debugInfo() { + return sig.substring(0, sigp) + "!" + sig.charAt(sigp) + "!" + sig.substring(sigp+1); + } + + private String sig; + private int sigp; + + private Type type; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Signature_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.9. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Signature_attribute extends Attribute { + Signature_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + signature_index = cr.readUnsignedShort(); + } + + public Signature_attribute(ConstantPool constant_pool, int signature_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.Signature), signature_index); + } + + public Signature_attribute(int name_index, int signature_index) { + super(name_index, 2); + this.signature_index = signature_index; + } + + public String getSignature(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(signature_index); + } + + public Signature getParsedSignature() { + return new Signature(signature_index); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitSignature(this, data); + } + + public final int signature_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.charset.Charset; + +/** + * See JVMS, section 4.8.15. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class SourceDebugExtension_attribute extends Attribute { + private static final Charset UTF8 = Charset.forName("UTF-8"); + + SourceDebugExtension_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + debug_extension = new byte[attribute_length]; + cr.readFully(debug_extension); + } + + public SourceDebugExtension_attribute(ConstantPool constant_pool, byte[] debug_extension) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.SourceDebugExtension), debug_extension); + } + + public SourceDebugExtension_attribute(int name_index, byte[] debug_extension) { + super(name_index, debug_extension.length); + this.debug_extension = debug_extension; + } + + public String getValue() { + return new String(debug_extension, UTF8); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitSourceDebugExtension(this, data); + } + + public final byte[] debug_extension; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/SourceFile_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.10. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class SourceFile_attribute extends Attribute { + SourceFile_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + sourcefile_index = cr.readUnsignedShort(); + } + + public SourceFile_attribute(ConstantPool constant_pool, int sourcefile_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.SourceFile), sourcefile_index); + } + + public SourceFile_attribute(int name_index, int sourcefile_index) { + super(name_index, 2); + this.sourcefile_index = sourcefile_index; + } + + public String getSourceFile(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(sourcefile_index); + } + + public <R, P> R accept(Visitor<R, P> visitor, P p) { + return visitor.visitSourceFile(this, p); + } + + public final int sourcefile_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/SourceID_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class SourceID_attribute extends Attribute { + + SourceID_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + sourceID_index = cr.readUnsignedShort(); + } + + public SourceID_attribute(ConstantPool constant_pool, int sourceID_index) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.SourceID), sourceID_index); + } + + public SourceID_attribute(int name_index, int sourceID_index) { + super(name_index, 2); + this.sourceID_index = sourceID_index; + } + + String getSourceID(ConstantPool constant_pool) throws ConstantPoolException { + return constant_pool.getUTF8Value(sourceID_index); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitSourceID(this, data); + } + + public final int sourceID_index; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.4. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class StackMapTable_attribute extends Attribute { + static class InvalidStackMap extends AttributeException { + private static final long serialVersionUID = -5659038410855089780L; + InvalidStackMap(String msg) { + super(msg); + } + } + + StackMapTable_attribute(ClassReader cr, int name_index, int length) + throws IOException, InvalidStackMap { + super(name_index, length); + number_of_entries = cr.readUnsignedShort(); + entries = new stack_map_frame[number_of_entries]; + for (int i = 0; i < number_of_entries; i++) + entries[i] = stack_map_frame.read(cr); + } + + public StackMapTable_attribute(ConstantPool constant_pool, stack_map_frame[] entries) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.StackMapTable), entries); + } + + public StackMapTable_attribute(int name_index, stack_map_frame[] entries) { + super(name_index, length(entries)); + this.number_of_entries = entries.length; + this.entries = entries; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitStackMapTable(this, data); + } + + static int length(stack_map_frame[] entries) { + int n = 2; + for (stack_map_frame entry: entries) + n += entry.length(); + return n; + } + + public final int number_of_entries; + public final stack_map_frame entries[]; + + public static abstract class stack_map_frame { + static stack_map_frame read(ClassReader cr) + throws IOException, InvalidStackMap { + int frame_type = cr.readUnsignedByte(); + if (frame_type <= 63) + return new same_frame(frame_type); + else if (frame_type <= 127) + return new same_locals_1_stack_item_frame(frame_type, cr); + else if (frame_type <= 246) + throw new Error("unknown frame_type " + frame_type); + else if (frame_type == 247) + return new same_locals_1_stack_item_frame_extended(frame_type, cr); + else if (frame_type <= 250) + return new chop_frame(frame_type, cr); + else if (frame_type == 251) + return new same_frame_extended(frame_type, cr); + else if (frame_type <= 254) + return new append_frame(frame_type, cr); + else + return new full_frame(frame_type, cr); + } + + protected stack_map_frame(int frame_type) { + this.frame_type = frame_type; + } + + public int length() { + return 1; + } + + public abstract int getOffsetDelta(); + + public abstract <R,D> R accept(Visitor<R,D> visitor, D data); + + public final int frame_type; + + public static interface Visitor<R,P> { + R visit_same_frame(same_frame frame, P p); + R visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, P p); + R visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, P p); + R visit_chop_frame(chop_frame frame, P p); + R visit_same_frame_extended(same_frame_extended frame, P p); + R visit_append_frame(append_frame frame, P p); + R visit_full_frame(full_frame frame, P p); + } + } + + public static class same_frame extends stack_map_frame { + same_frame(int frame_type) { + super(frame_type); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_same_frame(this, data); + } + + public int getOffsetDelta() { + return frame_type; + } + } + + public static class same_locals_1_stack_item_frame extends stack_map_frame { + same_locals_1_stack_item_frame(int frame_type, ClassReader cr) + throws IOException, InvalidStackMap { + super(frame_type); + stack = new verification_type_info[1]; + stack[0] = verification_type_info.read(cr); + } + + @Override + public int length() { + return super.length() + stack[0].length(); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_same_locals_1_stack_item_frame(this, data); + } + + public int getOffsetDelta() { + return frame_type - 64; + } + + public final verification_type_info[] stack; + } + + public static class same_locals_1_stack_item_frame_extended extends stack_map_frame { + same_locals_1_stack_item_frame_extended(int frame_type, ClassReader cr) + throws IOException, InvalidStackMap { + super(frame_type); + offset_delta = cr.readUnsignedShort(); + stack = new verification_type_info[1]; + stack[0] = verification_type_info.read(cr); + } + + @Override + public int length() { + return super.length() + 2 + stack[0].length(); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_same_locals_1_stack_item_frame_extended(this, data); + } + + public int getOffsetDelta() { + return offset_delta; + } + + public final int offset_delta; + public final verification_type_info[] stack; + } + + public static class chop_frame extends stack_map_frame { + chop_frame(int frame_type, ClassReader cr) throws IOException { + super(frame_type); + offset_delta = cr.readUnsignedShort(); + } + + @Override + public int length() { + return super.length() + 2; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_chop_frame(this, data); + } + + public int getOffsetDelta() { + return offset_delta; + } + + public final int offset_delta; + } + + public static class same_frame_extended extends stack_map_frame { + same_frame_extended(int frame_type, ClassReader cr) throws IOException { + super(frame_type); + offset_delta = cr.readUnsignedShort(); + } + + @Override + public int length() { + return super.length() + 2; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_same_frame_extended(this, data); + } + + public int getOffsetDelta() { + return offset_delta; + } + + public final int offset_delta; + } + + public static class append_frame extends stack_map_frame { + append_frame(int frame_type, ClassReader cr) + throws IOException, InvalidStackMap { + super(frame_type); + offset_delta = cr.readUnsignedShort(); + locals = new verification_type_info[frame_type - 251]; + for (int i = 0; i < locals.length; i++) + locals[i] = verification_type_info.read(cr); + } + + @Override + public int length() { + int n = super.length() + 2; + for (verification_type_info local: locals) + n += local.length(); + return n; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_append_frame(this, data); + } + + public int getOffsetDelta() { + return offset_delta; + } + + public final int offset_delta; + public final verification_type_info[] locals; + } + + public static class full_frame extends stack_map_frame { + full_frame(int frame_type, ClassReader cr) + throws IOException, InvalidStackMap { + super(frame_type); + offset_delta = cr.readUnsignedShort(); + number_of_locals = cr.readUnsignedShort(); + locals = new verification_type_info[number_of_locals]; + for (int i = 0; i < locals.length; i++) + locals[i] = verification_type_info.read(cr); + number_of_stack_items = cr.readUnsignedShort(); + stack = new verification_type_info[number_of_stack_items]; + for (int i = 0; i < stack.length; i++) + stack[i] = verification_type_info.read(cr); + } + + @Override + public int length() { + int n = super.length() + 2; + for (verification_type_info local: locals) + n += local.length(); + n += 2; + for (verification_type_info item: stack) + n += item.length(); + return n; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visit_full_frame(this, data); + } + + public int getOffsetDelta() { + return offset_delta; + } + + public final int offset_delta; + public final int number_of_locals; + public final verification_type_info[] locals; + public final int number_of_stack_items; + public final verification_type_info[] stack; + } + + public static class verification_type_info { + public static final int ITEM_Top = 0; + public static final int ITEM_Integer = 1; + public static final int ITEM_Float = 2; + public static final int ITEM_Long = 4; + public static final int ITEM_Double = 3; + public static final int ITEM_Null = 5; + public static final int ITEM_UninitializedThis = 6; + public static final int ITEM_Object = 7; + public static final int ITEM_Uninitialized = 8; + + static verification_type_info read(ClassReader cr) + throws IOException, InvalidStackMap { + int tag = cr.readUnsignedByte(); + switch (tag) { + case ITEM_Top: + case ITEM_Integer: + case ITEM_Float: + case ITEM_Long: + case ITEM_Double: + case ITEM_Null: + case ITEM_UninitializedThis: + return new verification_type_info(tag); + + case ITEM_Object: + return new Object_variable_info(cr); + + case ITEM_Uninitialized: + return new Uninitialized_variable_info(cr); + + default: + throw new InvalidStackMap("unrecognized verification_type_info tag"); + } + } + + protected verification_type_info(int tag) { + this.tag = tag; + } + + public int length() { + return 1; + } + + public final int tag; + } + + public static class Object_variable_info extends verification_type_info { + Object_variable_info(ClassReader cr) throws IOException { + super(ITEM_Object); + cpool_index = cr.readUnsignedShort(); + } + + @Override + public int length() { + return super.length() + 2; + } + + public final int cpool_index; + } + + public static class Uninitialized_variable_info extends verification_type_info { + Uninitialized_variable_info(ClassReader cr) throws IOException { + super(ITEM_Uninitialized); + offset = cr.readUnsignedShort(); + } + + @Override + public int length() { + return super.length() + 2; + } + + public final int offset; + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/StackMap_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class StackMap_attribute extends Attribute { + StackMap_attribute(ClassReader cr, int name_index, int length) + throws IOException, StackMapTable_attribute.InvalidStackMap { + super(name_index, length); + number_of_entries = cr.readUnsignedShort(); + entries = new stack_map_frame[number_of_entries]; + for (int i = 0; i < number_of_entries; i++) + entries[i] = new stack_map_frame(cr); + } + + public StackMap_attribute(ConstantPool constant_pool, stack_map_frame[] entries) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.StackMap), entries); + } + + public StackMap_attribute(int name_index, stack_map_frame[] entries) { + super(name_index, StackMapTable_attribute.length(entries)); + this.number_of_entries = entries.length; + this.entries = entries; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitStackMap(this, data); + } + + public final int number_of_entries; + public final stack_map_frame entries[]; + + public static class stack_map_frame extends StackMapTable_attribute.full_frame { + stack_map_frame(ClassReader cr) + throws IOException, StackMapTable_attribute.InvalidStackMap { + super(255, cr); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Synthetic_attribute.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; + +/** + * See JVMS, section 4.8.8. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Synthetic_attribute extends Attribute { + Synthetic_attribute(ClassReader cr, int name_index, int length) throws IOException { + super(name_index, length); + } + + public Synthetic_attribute(ConstantPool constant_pool) + throws ConstantPoolException { + this(constant_pool.getUTF8Index(Attribute.Synthetic)); + } + + public Synthetic_attribute(int name_index) { + super(name_index, 0); + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitSynthetic(this, data); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Type.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/* + * Family of classes used to represent the parsed form of a {@link Descriptor} + * or {@link Signature}. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public abstract class Type { + protected Type() { } + + public boolean isObject() { + return false; + } + + public abstract <R,D> R accept(Visitor<R,D> visitor, D data); + + protected static void append(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) { + sb.append(prefix); + String sep = ""; + for (Type t: types) { + sb.append(sep); + sb.append(t); + sep = ", "; + } + sb.append(suffix); + } + + protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) { + if (types != null && types.size() > 0) + append(sb, prefix, types, suffix); + } + + public interface Visitor<R,P> { + R visitSimpleType(SimpleType type, P p); + R visitArrayType(ArrayType type, P p); + R visitMethodType(MethodType type, P p); + R visitClassSigType(ClassSigType type, P p); + R visitClassType(ClassType type, P p); + R visitTypeParamType(TypeParamType type, P p); + R visitWildcardType(WildcardType type, P p); + } + + /** + * Represents a type signature with a simple name. The name may be that of a + * primitive type, such "{@code int}, {@code float}, etc + * or that of a type argument, such as {@code T}, {@code K}, {@code V}, etc. + * + * See: + * JVMS 4.3.2 + * BaseType: + * {@code B}, {@code C}, {@code D}, {@code F}, {@code I}, + * {@code J}, {@code S}, {@code Z}; + * VoidDescriptor: + * {@code V}; + * JVMS 4.3.4 + * TypeVariableSignature: + * {@code T} Identifier {@code ;} + */ + public static class SimpleType extends Type { + public SimpleType(String name) { + this.name = name; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitSimpleType(this, data); + } + + public boolean isPrimitiveType() { + return primitiveTypes.contains(name); + } + // where + private static final Set<String> primitiveTypes = new HashSet<>(Arrays.asList( + "boolean", "byte", "char", "double", "float", "int", "long", "short", "void")); + + @Override + public String toString() { + return name; + } + + public final String name; + } + + /** + * Represents an array type signature. + * + * See: + * JVMS 4.3.4 + * ArrayTypeSignature: + * {@code [} TypeSignature {@code ]} + */ + public static class ArrayType extends Type { + public ArrayType(Type elemType) { + this.elemType = elemType; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitArrayType(this, data); + } + + @Override + public String toString() { + return elemType + "[]"; + } + + public final Type elemType; + } + + /** + * Represents a method type signature. + * + * See; + * JVMS 4.3.4 + * MethodTypeSignature: + * FormalTypeParameters_opt {@code (} TypeSignature* {@code)} ReturnType + * ThrowsSignature* + */ + public static class MethodType extends Type { + public MethodType(List<? extends Type> paramTypes, Type resultType) { + this(null, paramTypes, resultType, null); + } + + public MethodType(List<? extends TypeParamType> typeParamTypes, + List<? extends Type> paramTypes, + Type returnType, + List<? extends Type> throwsTypes) { + this.typeParamTypes = typeParamTypes; + this.paramTypes = paramTypes; + this.returnType = returnType; + this.throwsTypes = throwsTypes; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitMethodType(this, data); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + appendIfNotEmpty(sb, "<", typeParamTypes, "> "); + sb.append(returnType); + append(sb, " (", paramTypes, ")"); + appendIfNotEmpty(sb, " throws ", throwsTypes, ""); + return sb.toString(); + } + + public final List<? extends TypeParamType> typeParamTypes; + public final List<? extends Type> paramTypes; + public final Type returnType; + public final List<? extends Type> throwsTypes; + } + + /** + * Represents a class signature. These describe the signature of + * a class that has type arguments. + * + * See: + * JVMS 4.3.4 + * ClassSignature: + * FormalTypeParameters_opt SuperclassSignature SuperinterfaceSignature* + */ + public static class ClassSigType extends Type { + public ClassSigType(List<TypeParamType> typeParamTypes, Type superclassType, + List<Type> superinterfaceTypes) { + this.typeParamTypes = typeParamTypes; + this.superclassType = superclassType; + this.superinterfaceTypes = superinterfaceTypes; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitClassSigType(this, data); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + appendIfNotEmpty(sb, "<", typeParamTypes, ">"); + if (superclassType != null) { + sb.append(" extends "); + sb.append(superclassType); + } + appendIfNotEmpty(sb, " implements ", superinterfaceTypes, ""); + return sb.toString(); + } + + public final List<TypeParamType> typeParamTypes; + public final Type superclassType; + public final List<Type> superinterfaceTypes; + } + + /** + * Represents a class type signature. This is used to represent a + * reference to a class, such as in a field, parameter, return type, etc. + * + * See: + * JVMS 4.3.4 + * ClassTypeSignature: + * {@code L} PackageSpecifier_opt SimpleClassTypeSignature + * ClassTypeSignatureSuffix* {@code ;} + * PackageSpecifier: + * Identifier {@code /} PackageSpecifier* + * SimpleClassTypeSignature: + * Identifier TypeArguments_opt } + * ClassTypeSignatureSuffix: + * {@code .} SimpleClassTypeSignature + */ + public static class ClassType extends Type { + public ClassType(ClassType outerType, String name, List<Type> typeArgs) { + this.outerType = outerType; + this.name = name; + this.typeArgs = typeArgs; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitClassType(this, data); + } + + public String getBinaryName() { + if (outerType == null) + return name; + else + return (outerType.getBinaryName() + "$" + name); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (outerType != null) { + sb.append(outerType); + sb.append("."); + } + sb.append(name); + appendIfNotEmpty(sb, "<", typeArgs, ">"); + return sb.toString(); + } + + @Override + public boolean isObject() { + return (outerType == null) + && name.equals("java/lang/Object") + && (typeArgs == null || typeArgs.isEmpty()); + } + + public final ClassType outerType; + public final String name; + public final List<Type> typeArgs; + } + + /** + * Represents a FormalTypeParameter. These are used to declare the type + * parameters for generic classes and methods. + * + * See: + * JVMS 4.3.4 + * FormalTypeParameters: + * {@code <} FormalTypeParameter+ {@code >} + * FormalTypeParameter: + * Identifier ClassBound InterfaceBound* + * ClassBound: + * {@code :} FieldTypeSignature_opt + * InterfaceBound: + * {@code :} FieldTypeSignature + */ + public static class TypeParamType extends Type { + public TypeParamType(String name, Type classBound, List<Type> interfaceBounds) { + this.name = name; + this.classBound = classBound; + this.interfaceBounds = interfaceBounds; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitTypeParamType(this, data); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(name); + String sep = " extends "; + if (classBound != null) { + sb.append(sep); + sb.append(classBound); + sep = " & "; + } + if (interfaceBounds != null) { + for (Type bound: interfaceBounds) { + sb.append(sep); + sb.append(bound); + sep = " & "; + } + } + return sb.toString(); + } + + public final String name; + public final Type classBound; + public final List<Type> interfaceBounds; + } + + /** + * Represents a wildcard type argument. A type argument that is not a + * wildcard type argument will be represented by a ClassType, ArrayType, etc. + * + * See: + * JVMS 4.3.4 + * TypeArgument: + * WildcardIndicator_opt FieldTypeSignature + * {@code *} + * WildcardIndicator: + * {@code +} + * {@code -} + */ + public static class WildcardType extends Type { + public enum Kind { UNBOUNDED, EXTENDS, SUPER } + + public WildcardType() { + this(Kind.UNBOUNDED, null); + } + public WildcardType(Kind kind, Type boundType) { + this.kind = kind; + this.boundType = boundType; + } + + public <R, D> R accept(Visitor<R, D> visitor, D data) { + return visitor.visitWildcardType(this, data); + } + + @Override + public String toString() { + switch (kind) { + case UNBOUNDED: + return "?"; + case EXTENDS: + return "? extends " + boundType; + case SUPER: + return "? super " + boundType; + default: + throw new AssertionError(); + } + } + + public final Kind kind; + public final Type boundType; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/TypeAnnotation.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,657 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import com.sun.tools.classfile.TypeAnnotation.Position.TypePathEntry; + +/** + * See JSR 308 specification, Section 3. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class TypeAnnotation { + TypeAnnotation(ClassReader cr) throws IOException, Annotation.InvalidAnnotation { + constant_pool = cr.getConstantPool(); + position = read_position(cr); + annotation = new Annotation(cr); + } + + public TypeAnnotation(ConstantPool constant_pool, + Annotation annotation, Position position) { + this.constant_pool = constant_pool; + this.position = position; + this.annotation = annotation; + } + + public int length() { + int n = annotation.length(); + n += position_length(position); + return n; + } + + @Override + public String toString() { + try { + return "@" + constant_pool.getUTF8Value(annotation.type_index).toString().substring(1) + + " pos: " + position.toString(); + } catch (Exception e) { + e.printStackTrace(); + return e.toString(); + } + } + + public final ConstantPool constant_pool; + public final Position position; + public final Annotation annotation; + + private static Position read_position(ClassReader cr) throws IOException, Annotation.InvalidAnnotation { + // Copied from ClassReader + int tag = cr.readUnsignedByte(); // TargetType tag is a byte + if (!TargetType.isValidTargetTypeValue(tag)) + throw new Annotation.InvalidAnnotation("TypeAnnotation: Invalid type annotation target type value: " + String.format("0x%02X", tag)); + + TargetType type = TargetType.fromTargetTypeValue(tag); + + Position position = new Position(); + position.type = type; + + switch (type) { + // instanceof + case INSTANCEOF: + // new expression + case NEW: + // constructor/method reference receiver + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: + position.offset = cr.readUnsignedShort(); + break; + // local variable + case LOCAL_VARIABLE: + // resource variable + case RESOURCE_VARIABLE: + int table_length = cr.readUnsignedShort(); + position.lvarOffset = new int[table_length]; + position.lvarLength = new int[table_length]; + position.lvarIndex = new int[table_length]; + for (int i = 0; i < table_length; ++i) { + position.lvarOffset[i] = cr.readUnsignedShort(); + position.lvarLength[i] = cr.readUnsignedShort(); + position.lvarIndex[i] = cr.readUnsignedShort(); + } + break; + // exception parameter + case EXCEPTION_PARAMETER: + position.exception_index = cr.readUnsignedShort(); + break; + // method receiver + case METHOD_RECEIVER: + // Do nothing + break; + // type parameter + case CLASS_TYPE_PARAMETER: + case METHOD_TYPE_PARAMETER: + position.parameter_index = cr.readUnsignedByte(); + break; + // type parameter bound + case CLASS_TYPE_PARAMETER_BOUND: + case METHOD_TYPE_PARAMETER_BOUND: + position.parameter_index = cr.readUnsignedByte(); + position.bound_index = cr.readUnsignedByte(); + break; + // class extends or implements clause + case CLASS_EXTENDS: + int in = cr.readUnsignedShort(); + if (in == 0xFFFF) + in = -1; + position.type_index = in; + break; + // throws + case THROWS: + position.type_index = cr.readUnsignedShort(); + break; + // method parameter + case METHOD_FORMAL_PARAMETER: + position.parameter_index = cr.readUnsignedByte(); + break; + // type cast + case CAST: + // method/constructor/reference type argument + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: + case METHOD_REFERENCE_TYPE_ARGUMENT: + position.offset = cr.readUnsignedShort(); + position.type_index = cr.readUnsignedByte(); + break; + // We don't need to worry about these + case METHOD_RETURN: + case FIELD: + break; + case UNKNOWN: + throw new AssertionError("TypeAnnotation: UNKNOWN target type should never occur!"); + default: + throw new AssertionError("TypeAnnotation: Unknown target type: " + type); + } + + { // Write type path + int len = cr.readUnsignedByte(); + List<Integer> loc = new ArrayList<>(len); + for (int i = 0; i < len * TypePathEntry.bytesPerEntry; ++i) + loc.add(cr.readUnsignedByte()); + position.location = Position.getTypePathFromBinary(loc); + } + return position; + } + + private static int position_length(Position pos) { + int n = 0; + n += 1; // TargetType tag is a byte + switch (pos.type) { + // instanceof + case INSTANCEOF: + // new expression + case NEW: + // constructor/method reference receiver + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: + n += 2; // offset + break; + // local variable + case LOCAL_VARIABLE: + // resource variable + case RESOURCE_VARIABLE: + n += 2; // table_length; + int table_length = pos.lvarOffset.length; + n += 2 * table_length; // offset + n += 2 * table_length; // length + n += 2 * table_length; // index + break; + // exception parameter + case EXCEPTION_PARAMETER: + n += 2; // exception_index + break; + // method receiver + case METHOD_RECEIVER: + // Do nothing + break; + // type parameter + case CLASS_TYPE_PARAMETER: + case METHOD_TYPE_PARAMETER: + n += 1; // parameter_index + break; + // type parameter bound + case CLASS_TYPE_PARAMETER_BOUND: + case METHOD_TYPE_PARAMETER_BOUND: + n += 1; // parameter_index + n += 1; // bound_index + break; + // class extends or implements clause + case CLASS_EXTENDS: + n += 2; // type_index + break; + // throws + case THROWS: + n += 2; // type_index + break; + // method parameter + case METHOD_FORMAL_PARAMETER: + n += 1; // parameter_index + break; + // type cast + case CAST: + // method/constructor/reference type argument + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: + case METHOD_REFERENCE_TYPE_ARGUMENT: + n += 2; // offset + n += 1; // type index + break; + // We don't need to worry about these + case METHOD_RETURN: + case FIELD: + break; + case UNKNOWN: + throw new AssertionError("TypeAnnotation: UNKNOWN target type should never occur!"); + default: + throw new AssertionError("TypeAnnotation: Unknown target type: " + pos.type); + } + + { + n += 1; // length + n += TypePathEntry.bytesPerEntry * pos.location.size(); // bytes for actual array + } + + return n; + } + + // Code duplicated from com.sun.tools.javac.code.TypeAnnotationPosition + public static class Position { + public enum TypePathEntryKind { + ARRAY(0), + INNER_TYPE(1), + WILDCARD(2), + TYPE_ARGUMENT(3); + + public final int tag; + + private TypePathEntryKind(int tag) { + this.tag = tag; + } + } + + public static class TypePathEntry { + /** The fixed number of bytes per TypePathEntry. */ + public static final int bytesPerEntry = 2; + + public final TypePathEntryKind tag; + public final int arg; + + public static final TypePathEntry ARRAY = new TypePathEntry(TypePathEntryKind.ARRAY); + public static final TypePathEntry INNER_TYPE = new TypePathEntry(TypePathEntryKind.INNER_TYPE); + public static final TypePathEntry WILDCARD = new TypePathEntry(TypePathEntryKind.WILDCARD); + + private TypePathEntry(TypePathEntryKind tag) { + if (!(tag == TypePathEntryKind.ARRAY || + tag == TypePathEntryKind.INNER_TYPE || + tag == TypePathEntryKind.WILDCARD)) { + throw new AssertionError("Invalid TypePathEntryKind: " + tag); + } + this.tag = tag; + this.arg = 0; + } + + public TypePathEntry(TypePathEntryKind tag, int arg) { + if (tag != TypePathEntryKind.TYPE_ARGUMENT) { + throw new AssertionError("Invalid TypePathEntryKind: " + tag); + } + this.tag = tag; + this.arg = arg; + } + + public static TypePathEntry fromBinary(int tag, int arg) { + if (arg != 0 && tag != TypePathEntryKind.TYPE_ARGUMENT.tag) { + throw new AssertionError("Invalid TypePathEntry tag/arg: " + tag + "/" + arg); + } + switch (tag) { + case 0: + return ARRAY; + case 1: + return INNER_TYPE; + case 2: + return WILDCARD; + case 3: + return new TypePathEntry(TypePathEntryKind.TYPE_ARGUMENT, arg); + default: + throw new AssertionError("Invalid TypePathEntryKind tag: " + tag); + } + } + + @Override + public String toString() { + return tag.toString() + + (tag == TypePathEntryKind.TYPE_ARGUMENT ? ("(" + arg + ")") : ""); + } + + @Override + public boolean equals(Object other) { + if (! (other instanceof TypePathEntry)) { + return false; + } + TypePathEntry tpe = (TypePathEntry) other; + return this.tag == tpe.tag && this.arg == tpe.arg; + } + + @Override + public int hashCode() { + return this.tag.hashCode() * 17 + this.arg; + } + } + + public TargetType type = TargetType.UNKNOWN; + + // For generic/array types. + // TODO: or should we use null? Noone will use this object. + public List<TypePathEntry> location = new ArrayList<>(0); + + // Tree position. + public int pos = -1; + + // For typecasts, type tests, new (and locals, as start_pc). + public boolean isValidOffset = false; + public int offset = -1; + + // For locals. arrays same length + public int[] lvarOffset = null; + public int[] lvarLength = null; + public int[] lvarIndex = null; + + // For type parameter bound + public int bound_index = Integer.MIN_VALUE; + + // For type parameter and method parameter + public int parameter_index = Integer.MIN_VALUE; + + // For class extends, implements, and throws clauses + public int type_index = Integer.MIN_VALUE; + + // For exception parameters, index into exception table + public int exception_index = Integer.MIN_VALUE; + + public Position() {} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append('['); + sb.append(type); + + switch (type) { + // instanceof + case INSTANCEOF: + // new expression + case NEW: + // constructor/method reference receiver + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: + sb.append(", offset = "); + sb.append(offset); + break; + // local variable + case LOCAL_VARIABLE: + // resource variable + case RESOURCE_VARIABLE: + if (lvarOffset == null) { + sb.append(", lvarOffset is null!"); + break; + } + sb.append(", {"); + for (int i = 0; i < lvarOffset.length; ++i) { + if (i != 0) sb.append("; "); + sb.append("start_pc = "); + sb.append(lvarOffset[i]); + sb.append(", length = "); + sb.append(lvarLength[i]); + sb.append(", index = "); + sb.append(lvarIndex[i]); + } + sb.append("}"); + break; + // method receiver + case METHOD_RECEIVER: + // Do nothing + break; + // type parameter + case CLASS_TYPE_PARAMETER: + case METHOD_TYPE_PARAMETER: + sb.append(", param_index = "); + sb.append(parameter_index); + break; + // type parameter bound + case CLASS_TYPE_PARAMETER_BOUND: + case METHOD_TYPE_PARAMETER_BOUND: + sb.append(", param_index = "); + sb.append(parameter_index); + sb.append(", bound_index = "); + sb.append(bound_index); + break; + // class extends or implements clause + case CLASS_EXTENDS: + sb.append(", type_index = "); + sb.append(type_index); + break; + // throws + case THROWS: + sb.append(", type_index = "); + sb.append(type_index); + break; + // exception parameter + case EXCEPTION_PARAMETER: + sb.append(", exception_index = "); + sb.append(exception_index); + break; + // method parameter + case METHOD_FORMAL_PARAMETER: + sb.append(", param_index = "); + sb.append(parameter_index); + break; + // type cast + case CAST: + // method/constructor/reference type argument + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: + case METHOD_REFERENCE_TYPE_ARGUMENT: + sb.append(", offset = "); + sb.append(offset); + sb.append(", type_index = "); + sb.append(type_index); + break; + // We don't need to worry about these + case METHOD_RETURN: + case FIELD: + break; + case UNKNOWN: + sb.append(", position UNKNOWN!"); + break; + default: + throw new AssertionError("Unknown target type: " + type); + } + + // Append location data for generics/arrays. + if (!location.isEmpty()) { + sb.append(", location = ("); + sb.append(location); + sb.append(")"); + } + + sb.append(", pos = "); + sb.append(pos); + + sb.append(']'); + return sb.toString(); + } + + /** + * Indicates whether the target tree of the annotation has been optimized + * away from classfile or not. + * @return true if the target has not been optimized away + */ + public boolean emitToClassfile() { + return !type.isLocal() || isValidOffset; + } + + /** + * Decode the binary representation for a type path and set + * the {@code location} field. + * + * @param list The bytecode representation of the type path. + */ + public static List<TypePathEntry> getTypePathFromBinary(List<Integer> list) { + List<TypePathEntry> loc = new ArrayList<>(list.size() / TypePathEntry.bytesPerEntry); + int idx = 0; + while (idx < list.size()) { + if (idx + 1 == list.size()) { + throw new AssertionError("Could not decode type path: " + list); + } + loc.add(TypePathEntry.fromBinary(list.get(idx), list.get(idx + 1))); + idx += 2; + } + return loc; + } + + public static List<Integer> getBinaryFromTypePath(List<TypePathEntry> locs) { + List<Integer> loc = new ArrayList<>(locs.size() * TypePathEntry.bytesPerEntry); + for (TypePathEntry tpe : locs) { + loc.add(tpe.tag.tag); + loc.add(tpe.arg); + } + return loc; + } + } + + // Code duplicated from com.sun.tools.javac.code.TargetType + // The IsLocal flag could be removed here. + public enum TargetType { + /** For annotations on a class type parameter declaration. */ + CLASS_TYPE_PARAMETER(0x00), + + /** For annotations on a method type parameter declaration. */ + METHOD_TYPE_PARAMETER(0x01), + + /** For annotations on the type of an "extends" or "implements" clause. */ + CLASS_EXTENDS(0x10), + + /** For annotations on a bound of a type parameter of a class. */ + CLASS_TYPE_PARAMETER_BOUND(0x11), + + /** For annotations on a bound of a type parameter of a method. */ + METHOD_TYPE_PARAMETER_BOUND(0x12), + + /** For annotations on a field. */ + FIELD(0x13), + + /** For annotations on a method return type. */ + METHOD_RETURN(0x14), + + /** For annotations on the method receiver. */ + METHOD_RECEIVER(0x15), + + /** For annotations on a method parameter. */ + METHOD_FORMAL_PARAMETER(0x16), + + /** For annotations on a throws clause in a method declaration. */ + THROWS(0x17), + + /** For annotations on a local variable. */ + LOCAL_VARIABLE(0x40, true), + + /** For annotations on a resource variable. */ + RESOURCE_VARIABLE(0x41, true), + + /** For annotations on an exception parameter. */ + EXCEPTION_PARAMETER(0x42, true), + + /** For annotations on a type test. */ + INSTANCEOF(0x43, true), + + /** For annotations on an object creation expression. */ + NEW(0x44, true), + + /** For annotations on a constructor reference receiver. */ + CONSTRUCTOR_REFERENCE(0x45, true), + + /** For annotations on a method reference receiver. */ + METHOD_REFERENCE(0x46, true), + + /** For annotations on a typecast. */ + CAST(0x47, true), + + /** For annotations on a type argument of an object creation expression. */ + CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT(0x48, true), + + /** For annotations on a type argument of a method call. */ + METHOD_INVOCATION_TYPE_ARGUMENT(0x49, true), + + /** For annotations on a type argument of a constructor reference. */ + CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT(0x4A, true), + + /** For annotations on a type argument of a method reference. */ + METHOD_REFERENCE_TYPE_ARGUMENT(0x4B, true), + + /** For annotations with an unknown target. */ + UNKNOWN(0xFF); + + private static final int MAXIMUM_TARGET_TYPE_VALUE = 0x4B; + + private final int targetTypeValue; + private final boolean isLocal; + + private TargetType(int targetTypeValue) { + this(targetTypeValue, false); + } + + private TargetType(int targetTypeValue, boolean isLocal) { + if (targetTypeValue < 0 + || targetTypeValue > 255) + throw new AssertionError("Attribute type value needs to be an unsigned byte: " + String.format("0x%02X", targetTypeValue)); + this.targetTypeValue = targetTypeValue; + this.isLocal = isLocal; + } + + /** + * Returns whether or not this TargetType represents an annotation whose + * target is exclusively a tree in a method body + * + * Note: wildcard bound targets could target a local tree and a class + * member declaration signature tree + */ + public boolean isLocal() { + return isLocal; + } + + public int targetTypeValue() { + return this.targetTypeValue; + } + + private static final TargetType[] targets; + + static { + targets = new TargetType[MAXIMUM_TARGET_TYPE_VALUE + 1]; + TargetType[] alltargets = values(); + for (TargetType target : alltargets) { + if (target.targetTypeValue != UNKNOWN.targetTypeValue) + targets[target.targetTypeValue] = target; + } + for (int i = 0; i <= MAXIMUM_TARGET_TYPE_VALUE; ++i) { + if (targets[i] == null) + targets[i] = UNKNOWN; + } + } + + public static boolean isValidTargetTypeValue(int tag) { + if (tag == UNKNOWN.targetTypeValue) + return true; + return (tag >= 0 && tag < targets.length); + } + + public static TargetType fromTargetTypeValue(int tag) { + if (tag == UNKNOWN.targetTypeValue) + return UNKNOWN; + + if (tag < 0 || tag >= targets.length) + throw new AssertionError("Unknown TargetType: " + tag); + return targets[tag]; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/classfile/package-info.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + A minimalist library to read and write class files into objects closely + based on the corresponding definitions in + <cite>The Java™ Virtual Machine Specification</cite> (JVMS). + + <p><b>This is NOT part of any supported API. + If you write code that depends on this, you do so at your own risk. + This code and its internal interfaces are subject to change or + deletion without notice.</b> +*/ +@jdk.Exported(false) +package com.sun.tools.classfile;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AnnotationWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,291 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.Annotation; +import com.sun.tools.classfile.TypeAnnotation; +import com.sun.tools.classfile.Annotation.Annotation_element_value; +import com.sun.tools.classfile.Annotation.Array_element_value; +import com.sun.tools.classfile.Annotation.Class_element_value; +import com.sun.tools.classfile.Annotation.Enum_element_value; +import com.sun.tools.classfile.Annotation.Primitive_element_value; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Descriptor; +import com.sun.tools.classfile.Descriptor.InvalidDescriptor; + +/** + * A writer for writing annotations as text. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class AnnotationWriter extends BasicWriter { + static AnnotationWriter instance(Context context) { + AnnotationWriter instance = context.get(AnnotationWriter.class); + if (instance == null) + instance = new AnnotationWriter(context); + return instance; + } + + protected AnnotationWriter(Context context) { + super(context); + classWriter = ClassWriter.instance(context); + constantWriter = ConstantWriter.instance(context); + } + + public void write(Annotation annot) { + write(annot, false); + } + + public void write(Annotation annot, boolean resolveIndices) { + writeDescriptor(annot.type_index, resolveIndices); + boolean showParens = annot.num_element_value_pairs > 0 || !resolveIndices; + if (showParens) + print("("); + for (int i = 0; i < annot.num_element_value_pairs; i++) { + if (i > 0) + print(","); + write(annot.element_value_pairs[i], resolveIndices); + } + if (showParens) + print(")"); + } + + public void write(TypeAnnotation annot) { + write(annot, true, false); + } + + public void write(TypeAnnotation annot, boolean showOffsets, boolean resolveIndices) { + write(annot.annotation, resolveIndices); + print(": "); + write(annot.position, showOffsets); + } + + public void write(TypeAnnotation.Position pos, boolean showOffsets) { + print(pos.type); + + switch (pos.type) { + // instanceof + case INSTANCEOF: + // new expression + case NEW: + // constructor/method reference receiver + case CONSTRUCTOR_REFERENCE: + case METHOD_REFERENCE: + if (showOffsets) { + print(", offset="); + print(pos.offset); + } + break; + // local variable + case LOCAL_VARIABLE: + // resource variable + case RESOURCE_VARIABLE: + if (pos.lvarOffset == null) { + print(", lvarOffset is Null!"); + break; + } + print(", {"); + for (int i = 0; i < pos.lvarOffset.length; ++i) { + if (i != 0) print("; "); + if (showOffsets) { + print("start_pc="); + print(pos.lvarOffset[i]); + } + print(", length="); + print(pos.lvarLength[i]); + print(", index="); + print(pos.lvarIndex[i]); + } + print("}"); + break; + // exception parameter + case EXCEPTION_PARAMETER: + print(", exception_index="); + print(pos.exception_index); + break; + // method receiver + case METHOD_RECEIVER: + // Do nothing + break; + // type parameter + case CLASS_TYPE_PARAMETER: + case METHOD_TYPE_PARAMETER: + print(", param_index="); + print(pos.parameter_index); + break; + // type parameter bound + case CLASS_TYPE_PARAMETER_BOUND: + case METHOD_TYPE_PARAMETER_BOUND: + print(", param_index="); + print(pos.parameter_index); + print(", bound_index="); + print(pos.bound_index); + break; + // class extends or implements clause + case CLASS_EXTENDS: + print(", type_index="); + print(pos.type_index); + break; + // throws + case THROWS: + print(", type_index="); + print(pos.type_index); + break; + // method parameter + case METHOD_FORMAL_PARAMETER: + print(", param_index="); + print(pos.parameter_index); + break; + // type cast + case CAST: + // method/constructor/reference type argument + case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT: + case METHOD_INVOCATION_TYPE_ARGUMENT: + case CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT: + case METHOD_REFERENCE_TYPE_ARGUMENT: + if (showOffsets) { + print(", offset="); + print(pos.offset); + } + print(", type_index="); + print(pos.type_index); + break; + // We don't need to worry about these + case METHOD_RETURN: + case FIELD: + break; + case UNKNOWN: + throw new AssertionError("AnnotationWriter: UNKNOWN target type should never occur!"); + default: + throw new AssertionError("AnnotationWriter: Unknown target type for position: " + pos); + } + + // Append location data for generics/arrays. + if (!pos.location.isEmpty()) { + print(", location="); + print(pos.location); + } + } + + public void write(Annotation.element_value_pair pair) { + write(pair, false); + } + + public void write(Annotation.element_value_pair pair, boolean resolveIndices) { + writeIndex(pair.element_name_index, resolveIndices); + print("="); + write(pair.value, resolveIndices); + } + + public void write(Annotation.element_value value) { + write(value, false); + } + + public void write(Annotation.element_value value, boolean resolveIndices) { + ev_writer.write(value, resolveIndices); + } + + private void writeDescriptor(int index, boolean resolveIndices) { + if (resolveIndices) { + try { + ConstantPool constant_pool = classWriter.getClassFile().constant_pool; + Descriptor d = new Descriptor(index); + print(d.getFieldType(constant_pool)); + return; + } catch (ConstantPoolException | InvalidDescriptor ignore) { + } + } + + print("#" + index); + } + + private void writeIndex(int index, boolean resolveIndices) { + if (resolveIndices) { + print(constantWriter.stringValue(index)); + } else + print("#" + index); + } + + element_value_Writer ev_writer = new element_value_Writer(); + + class element_value_Writer implements Annotation.element_value.Visitor<Void,Boolean> { + public void write(Annotation.element_value value, boolean resolveIndices) { + value.accept(this, resolveIndices); + } + + public Void visitPrimitive(Primitive_element_value ev, Boolean resolveIndices) { + if (resolveIndices) + writeIndex(ev.const_value_index, resolveIndices); + else + print(((char) ev.tag) + "#" + ev.const_value_index); + return null; + } + + public Void visitEnum(Enum_element_value ev, Boolean resolveIndices) { + if (resolveIndices) { + writeIndex(ev.type_name_index, resolveIndices); + print("."); + writeIndex(ev.const_name_index, resolveIndices); + } else + print(((char) ev.tag) + "#" + ev.type_name_index + ".#" + ev.const_name_index); + return null; + } + + public Void visitClass(Class_element_value ev, Boolean resolveIndices) { + if (resolveIndices) { + writeIndex(ev.class_info_index, resolveIndices); + print(".class"); + } else + print(((char) ev.tag) + "#" + ev.class_info_index); + return null; + } + + public Void visitAnnotation(Annotation_element_value ev, Boolean resolveIndices) { + print((char) ev.tag); + AnnotationWriter.this.write(ev.annotation_value, resolveIndices); + return null; + } + + public Void visitArray(Array_element_value ev, Boolean resolveIndices) { + print("["); + for (int i = 0; i < ev.num_values; i++) { + if (i > 0) + print(","); + write(ev.values[i], resolveIndices); + } + print("]"); + return null; + } + + } + + private ClassWriter classWriter; + private ConstantWriter constantWriter; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/AttributeWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,712 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.Formatter; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.AnnotationDefault_attribute; +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Attributes; +import com.sun.tools.classfile.BootstrapMethods_attribute; +import com.sun.tools.classfile.CharacterRangeTable_attribute; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.CompilationID_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.ConstantValue_attribute; +import com.sun.tools.classfile.DefaultAttribute; +import com.sun.tools.classfile.Deprecated_attribute; +import com.sun.tools.classfile.EnclosingMethod_attribute; +import com.sun.tools.classfile.Exceptions_attribute; +import com.sun.tools.classfile.InnerClasses_attribute; +import com.sun.tools.classfile.LineNumberTable_attribute; +import com.sun.tools.classfile.LocalVariableTable_attribute; +import com.sun.tools.classfile.LocalVariableTypeTable_attribute; +import com.sun.tools.classfile.MethodParameters_attribute; +import com.sun.tools.classfile.RuntimeInvisibleAnnotations_attribute; +import com.sun.tools.classfile.RuntimeInvisibleParameterAnnotations_attribute; +import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute; +import com.sun.tools.classfile.RuntimeVisibleAnnotations_attribute; +import com.sun.tools.classfile.RuntimeVisibleParameterAnnotations_attribute; +import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute; +import com.sun.tools.classfile.Signature_attribute; +import com.sun.tools.classfile.SourceDebugExtension_attribute; +import com.sun.tools.classfile.SourceFile_attribute; +import com.sun.tools.classfile.SourceID_attribute; +import com.sun.tools.classfile.StackMapTable_attribute; +import com.sun.tools.classfile.StackMap_attribute; +import com.sun.tools.classfile.Synthetic_attribute; + +import static com.sun.tools.classfile.AccessFlags.*; + +import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.util.StringUtils; + +/* + * A writer for writing Attributes as text. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class AttributeWriter extends BasicWriter + implements Attribute.Visitor<Void,Void> +{ + public static AttributeWriter instance(Context context) { + AttributeWriter instance = context.get(AttributeWriter.class); + if (instance == null) + instance = new AttributeWriter(context); + return instance; + } + + protected AttributeWriter(Context context) { + super(context); + context.put(AttributeWriter.class, this); + annotationWriter = AnnotationWriter.instance(context); + codeWriter = CodeWriter.instance(context); + constantWriter = ConstantWriter.instance(context); + options = Options.instance(context); + } + + public void write(Object owner, Attribute attr, ConstantPool constant_pool) { + if (attr != null) { + Assert.checkNonNull(constant_pool); + Assert.checkNonNull(owner); + this.constant_pool = constant_pool; + this.owner = owner; + attr.accept(this, null); + } + } + + public void write(Object owner, Attributes attrs, ConstantPool constant_pool) { + if (attrs != null) { + Assert.checkNonNull(constant_pool); + Assert.checkNonNull(owner); + this.constant_pool = constant_pool; + this.owner = owner; + for (Attribute attr: attrs) + attr.accept(this, null); + } + } + + public Void visitDefault(DefaultAttribute attr, Void ignore) { + if (attr.reason != null) { + report(attr.reason); + } + byte[] data = attr.info; + int i = 0; + int j = 0; + print(" "); + try { + print(attr.getName(constant_pool)); + } catch (ConstantPoolException e) { + report(e); + print("attribute name = #" + attr.attribute_name_index); + } + print(": "); + println("length = 0x" + toHex(attr.info.length)); + + print(" "); + + while (i < data.length) { + print(toHex(data[i], 2)); + + j++; + if (j == 16) { + println(); + print(" "); + j = 0; + } else { + print(" "); + } + i++; + } + println(); + return null; + } + + public Void visitAnnotationDefault(AnnotationDefault_attribute attr, Void ignore) { + println("AnnotationDefault:"); + indent(+1); + print("default_value: "); + annotationWriter.write(attr.default_value); + indent(-1); + return null; + } + + public Void visitBootstrapMethods(BootstrapMethods_attribute attr, Void p) { + println(Attribute.BootstrapMethods + ":"); + for (int i = 0; i < attr.bootstrap_method_specifiers.length ; i++) { + BootstrapMethods_attribute.BootstrapMethodSpecifier bsm = attr.bootstrap_method_specifiers[i]; + indent(+1); + print(i + ": #" + bsm.bootstrap_method_ref + " "); + println(constantWriter.stringValue(bsm.bootstrap_method_ref)); + indent(+1); + println("Method arguments:"); + indent(+1); + for (int j = 0; j < bsm.bootstrap_arguments.length; j++) { + print("#" + bsm.bootstrap_arguments[j] + " "); + println(constantWriter.stringValue(bsm.bootstrap_arguments[j])); + } + indent(-3); + } + return null; + } + + public Void visitCharacterRangeTable(CharacterRangeTable_attribute attr, Void ignore) { + println("CharacterRangeTable:"); + indent(+1); + for (int i = 0; i < attr.character_range_table.length; i++) { + CharacterRangeTable_attribute.Entry e = attr.character_range_table[i]; + print(String.format(" %2d, %2d, %6x, %6x, %4x", + e.start_pc, e.end_pc, + e.character_range_start, e.character_range_end, + e.flags)); + tab(); + print(String.format("// %2d, %2d, %4d:%02d, %4d:%02d", + e.start_pc, e.end_pc, + (e.character_range_start >> 10), (e.character_range_start & 0x3ff), + (e.character_range_end >> 10), (e.character_range_end & 0x3ff))); + if ((e.flags & CharacterRangeTable_attribute.CRT_STATEMENT) != 0) + print(", statement"); + if ((e.flags & CharacterRangeTable_attribute.CRT_BLOCK) != 0) + print(", block"); + if ((e.flags & CharacterRangeTable_attribute.CRT_ASSIGNMENT) != 0) + print(", assignment"); + if ((e.flags & CharacterRangeTable_attribute.CRT_FLOW_CONTROLLER) != 0) + print(", flow-controller"); + if ((e.flags & CharacterRangeTable_attribute.CRT_FLOW_TARGET) != 0) + print(", flow-target"); + if ((e.flags & CharacterRangeTable_attribute.CRT_INVOKE) != 0) + print(", invoke"); + if ((e.flags & CharacterRangeTable_attribute.CRT_CREATE) != 0) + print(", create"); + if ((e.flags & CharacterRangeTable_attribute.CRT_BRANCH_TRUE) != 0) + print(", branch-true"); + if ((e.flags & CharacterRangeTable_attribute.CRT_BRANCH_FALSE) != 0) + print(", branch-false"); + println(); + } + indent(-1); + return null; + } + + public Void visitCode(Code_attribute attr, Void ignore) { + codeWriter.write(attr, constant_pool); + return null; + } + + public Void visitCompilationID(CompilationID_attribute attr, Void ignore) { + constantWriter.write(attr.compilationID_index); + return null; + } + + public Void visitConstantValue(ConstantValue_attribute attr, Void ignore) { + print("ConstantValue: "); + constantWriter.write(attr.constantvalue_index); + println(); + return null; + } + + public Void visitDeprecated(Deprecated_attribute attr, Void ignore) { + println("Deprecated: true"); + return null; + } + + public Void visitEnclosingMethod(EnclosingMethod_attribute attr, Void ignore) { + print("EnclosingMethod: #" + attr.class_index + ".#" + attr.method_index); + tab(); + print("// " + getJavaClassName(attr)); + if (attr.method_index != 0) + print("." + getMethodName(attr)); + println(); + return null; + } + + private String getJavaClassName(EnclosingMethod_attribute a) { + try { + return getJavaName(a.getClassName(constant_pool)); + } catch (ConstantPoolException e) { + return report(e); + } + } + + private String getMethodName(EnclosingMethod_attribute a) { + try { + return a.getMethodName(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public Void visitExceptions(Exceptions_attribute attr, Void ignore) { + println("Exceptions:"); + indent(+1); + print("throws "); + for (int i = 0; i < attr.number_of_exceptions; i++) { + if (i > 0) + print(", "); + print(getJavaException(attr, i)); + } + println(); + indent(-1); + return null; + } + + private String getJavaException(Exceptions_attribute attr, int index) { + try { + return getJavaName(attr.getException(index, constant_pool)); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public Void visitInnerClasses(InnerClasses_attribute attr, Void ignore) { + boolean first = true; + for (int i = 0 ; i < attr.classes.length; i++) { + InnerClasses_attribute.Info info = attr.classes[i]; + //access + AccessFlags access_flags = info.inner_class_access_flags; + if (options.checkAccess(access_flags)) { + if (first) { + writeInnerClassHeader(); + first = false; + } + for (String name: access_flags.getInnerClassModifiers()) + print(name + " "); + if (info.inner_name_index != 0) { + print("#" + info.inner_name_index + "= "); + } + print("#" + info.inner_class_info_index); + if (info.outer_class_info_index != 0) { + print(" of #" + info.outer_class_info_index); + } + print(";"); + tab(); + print("// "); + if (info.inner_name_index != 0) { + print(getInnerName(constant_pool, info) + "="); + } + constantWriter.write(info.inner_class_info_index); + if (info.outer_class_info_index != 0) { + print(" of "); + constantWriter.write(info.outer_class_info_index); + } + println(); + } + } + if (!first) + indent(-1); + return null; + } + + String getInnerName(ConstantPool constant_pool, InnerClasses_attribute.Info info) { + try { + return info.getInnerName(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + private void writeInnerClassHeader() { + println("InnerClasses:"); + indent(+1); + } + + public Void visitLineNumberTable(LineNumberTable_attribute attr, Void ignore) { + println("LineNumberTable:"); + indent(+1); + for (LineNumberTable_attribute.Entry entry: attr.line_number_table) { + println("line " + entry.line_number + ": " + entry.start_pc); + } + indent(-1); + return null; + } + + public Void visitLocalVariableTable(LocalVariableTable_attribute attr, Void ignore) { + println("LocalVariableTable:"); + indent(+1); + println("Start Length Slot Name Signature"); + for (LocalVariableTable_attribute.Entry entry : attr.local_variable_table) { + println(String.format("%5d %7d %5d %5s %s", + entry.start_pc, entry.length, entry.index, + constantWriter.stringValue(entry.name_index), + constantWriter.stringValue(entry.descriptor_index))); + } + indent(-1); + return null; + } + + public Void visitLocalVariableTypeTable(LocalVariableTypeTable_attribute attr, Void ignore) { + println("LocalVariableTypeTable:"); + indent(+1); + println("Start Length Slot Name Signature"); + for (LocalVariableTypeTable_attribute.Entry entry : attr.local_variable_table) { + println(String.format("%5d %7d %5d %5s %s", + entry.start_pc, entry.length, entry.index, + constantWriter.stringValue(entry.name_index), + constantWriter.stringValue(entry.signature_index))); + } + indent(-1); + return null; + } + + private static final String format = "%-31s%s"; + + public Void visitMethodParameters(MethodParameters_attribute attr, + Void ignore) { + + final String header = String.format(format, "Name", "Flags"); + println("MethodParameters:"); + indent(+1); + println(header); + for (MethodParameters_attribute.Entry entry : + attr.method_parameter_table) { + String namestr = + entry.name_index != 0 ? + constantWriter.stringValue(entry.name_index) : "<no name>"; + String flagstr = + (0 != (entry.flags & ACC_FINAL) ? "final " : "") + + (0 != (entry.flags & ACC_MANDATED) ? "mandated " : "") + + (0 != (entry.flags & ACC_SYNTHETIC) ? "synthetic" : ""); + println(String.format(format, namestr, flagstr)); + } + indent(-1); + return null; + } + + public Void visitRuntimeVisibleAnnotations(RuntimeVisibleAnnotations_attribute attr, Void ignore) { + println("RuntimeVisibleAnnotations:"); + indent(+1); + for (int i = 0; i < attr.annotations.length; i++) { + print(i + ": "); + annotationWriter.write(attr.annotations[i]); + println(); + } + indent(-1); + return null; + } + + public Void visitRuntimeInvisibleAnnotations(RuntimeInvisibleAnnotations_attribute attr, Void ignore) { + println("RuntimeInvisibleAnnotations:"); + indent(+1); + for (int i = 0; i < attr.annotations.length; i++) { + print(i + ": "); + annotationWriter.write(attr.annotations[i]); + println(); + } + indent(-1); + return null; + } + + public Void visitRuntimeVisibleTypeAnnotations(RuntimeVisibleTypeAnnotations_attribute attr, Void ignore) { + println("RuntimeVisibleTypeAnnotations:"); + indent(+1); + for (int i = 0; i < attr.annotations.length; i++) { + print(i + ": "); + annotationWriter.write(attr.annotations[i]); + println(); + } + indent(-1); + return null; + } + + public Void visitRuntimeInvisibleTypeAnnotations(RuntimeInvisibleTypeAnnotations_attribute attr, Void ignore) { + println("RuntimeInvisibleTypeAnnotations:"); + indent(+1); + for (int i = 0; i < attr.annotations.length; i++) { + print(i + ": "); + annotationWriter.write(attr.annotations[i]); + println(); + } + indent(-1); + return null; + } + + public Void visitRuntimeVisibleParameterAnnotations(RuntimeVisibleParameterAnnotations_attribute attr, Void ignore) { + println("RuntimeVisibleParameterAnnotations:"); + indent(+1); + for (int param = 0; param < attr.parameter_annotations.length; param++) { + println("parameter " + param + ": "); + indent(+1); + for (int i = 0; i < attr.parameter_annotations[param].length; i++) { + print(i + ": "); + annotationWriter.write(attr.parameter_annotations[param][i]); + println(); + } + indent(-1); + } + indent(-1); + return null; + } + + public Void visitRuntimeInvisibleParameterAnnotations(RuntimeInvisibleParameterAnnotations_attribute attr, Void ignore) { + println("RuntimeInvisibleParameterAnnotations:"); + indent(+1); + for (int param = 0; param < attr.parameter_annotations.length; param++) { + println(param + ": "); + indent(+1); + for (int i = 0; i < attr.parameter_annotations[param].length; i++) { + print(i + ": "); + annotationWriter.write(attr.parameter_annotations[param][i]); + println(); + } + indent(-1); + } + indent(-1); + return null; + } + + public Void visitSignature(Signature_attribute attr, Void ignore) { + print("Signature: #" + attr.signature_index); + tab(); + println("// " + getSignature(attr)); + return null; + } + + String getSignature(Signature_attribute info) { + try { + return info.getSignature(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public Void visitSourceDebugExtension(SourceDebugExtension_attribute attr, Void ignore) { + println("SourceDebugExtension:"); + indent(+1); + for (String s: attr.getValue().split("[\r\n]+")) { + println(s); + } + indent(-1); + return null; + } + + public Void visitSourceFile(SourceFile_attribute attr, Void ignore) { + println("SourceFile: \"" + getSourceFile(attr) + "\""); + return null; + } + + private String getSourceFile(SourceFile_attribute attr) { + try { + return attr.getSourceFile(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public Void visitSourceID(SourceID_attribute attr, Void ignore) { + constantWriter.write(attr.sourceID_index); + return null; + } + + public Void visitStackMap(StackMap_attribute attr, Void ignore) { + println("StackMap: number_of_entries = " + attr.number_of_entries); + indent(+1); + StackMapTableWriter w = new StackMapTableWriter(); + for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { + w.write(entry); + } + indent(-1); + return null; + } + + public Void visitStackMapTable(StackMapTable_attribute attr, Void ignore) { + println("StackMapTable: number_of_entries = " + attr.number_of_entries); + indent(+1); + StackMapTableWriter w = new StackMapTableWriter(); + for (StackMapTable_attribute.stack_map_frame entry : attr.entries) { + w.write(entry); + } + indent(-1); + return null; + } + + class StackMapTableWriter // also handles CLDC StackMap attributes + implements StackMapTable_attribute.stack_map_frame.Visitor<Void,Void> { + public void write(StackMapTable_attribute.stack_map_frame frame) { + frame.accept(this, null); + } + + public Void visit_same_frame(StackMapTable_attribute.same_frame frame, Void p) { + printHeader(frame, "/* same */"); + return null; + } + + public Void visit_same_locals_1_stack_item_frame(StackMapTable_attribute.same_locals_1_stack_item_frame frame, Void p) { + printHeader(frame, "/* same_locals_1_stack_item */"); + indent(+1); + printMap("stack", frame.stack); + indent(-1); + return null; + } + + public Void visit_same_locals_1_stack_item_frame_extended(StackMapTable_attribute.same_locals_1_stack_item_frame_extended frame, Void p) { + printHeader(frame, "/* same_locals_1_stack_item_frame_extended */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + printMap("stack", frame.stack); + indent(-1); + return null; + } + + public Void visit_chop_frame(StackMapTable_attribute.chop_frame frame, Void p) { + printHeader(frame, "/* chop */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + indent(-1); + return null; + } + + public Void visit_same_frame_extended(StackMapTable_attribute.same_frame_extended frame, Void p) { + printHeader(frame, "/* same_frame_extended */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + indent(-1); + return null; + } + + public Void visit_append_frame(StackMapTable_attribute.append_frame frame, Void p) { + printHeader(frame, "/* append */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + printMap("locals", frame.locals); + indent(-1); + return null; + } + + public Void visit_full_frame(StackMapTable_attribute.full_frame frame, Void p) { + if (frame instanceof StackMap_attribute.stack_map_frame) { + printHeader(frame, "offset = " + frame.offset_delta); + indent(+1); + } else { + printHeader(frame, "/* full_frame */"); + indent(+1); + println("offset_delta = " + frame.offset_delta); + } + printMap("locals", frame.locals); + printMap("stack", frame.stack); + indent(-1); + return null; + } + + void printHeader(StackMapTable_attribute.stack_map_frame frame, String extra) { + print("frame_type = " + frame.frame_type + " "); + println(extra); + } + + void printMap(String name, StackMapTable_attribute.verification_type_info[] map) { + print(name + " = ["); + for (int i = 0; i < map.length; i++) { + StackMapTable_attribute.verification_type_info info = map[i]; + int tag = info.tag; + switch (tag) { + case StackMapTable_attribute.verification_type_info.ITEM_Object: + print(" "); + constantWriter.write(((StackMapTable_attribute.Object_variable_info) info).cpool_index); + break; + case StackMapTable_attribute.verification_type_info.ITEM_Uninitialized: + print(" " + mapTypeName(tag)); + print(" " + ((StackMapTable_attribute.Uninitialized_variable_info) info).offset); + break; + default: + print(" " + mapTypeName(tag)); + } + print(i == (map.length - 1) ? " " : ","); + } + println("]"); + } + + String mapTypeName(int tag) { + switch (tag) { + case StackMapTable_attribute.verification_type_info.ITEM_Top: + return "top"; + + case StackMapTable_attribute.verification_type_info.ITEM_Integer: + return "int"; + + case StackMapTable_attribute.verification_type_info.ITEM_Float: + return "float"; + + case StackMapTable_attribute.verification_type_info.ITEM_Long: + return "long"; + + case StackMapTable_attribute.verification_type_info.ITEM_Double: + return "double"; + + case StackMapTable_attribute.verification_type_info.ITEM_Null: + return "null"; + + case StackMapTable_attribute.verification_type_info.ITEM_UninitializedThis: + return "this"; + + case StackMapTable_attribute.verification_type_info.ITEM_Object: + return "CP"; + + case StackMapTable_attribute.verification_type_info.ITEM_Uninitialized: + return "uninitialized"; + + default: + report("unrecognized verification_type_info tag: " + tag); + return "[tag:" + tag + "]"; + } + } + } + + public Void visitSynthetic(Synthetic_attribute attr, Void ignore) { + println("Synthetic: true"); + return null; + } + + static String getJavaName(String name) { + return name.replace('/', '.'); + } + + String toHex(byte b, int w) { + return toHex(b & 0xff, w); + } + + static String toHex(int i) { + return StringUtils.toUpperCase(Integer.toString(i, 16)); + } + + static String toHex(int i, int w) { + String s = StringUtils.toUpperCase(Integer.toHexString(i)); + while (s.length() < w) + s = "0" + s; + return StringUtils.toUpperCase(s); + } + + private AnnotationWriter annotationWriter; + private CodeWriter codeWriter; + private ConstantWriter constantWriter; + private Options options; + + private ConstantPool constant_pool; + private Object owner; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/BasicWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.io.PrintWriter; + +import com.sun.tools.classfile.AttributeException; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.DescriptorException; + +/* + * A writer similar to a PrintWriter but which does not hide exceptions. + * The standard print calls are line-buffered; report calls write messages directly. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class BasicWriter { + protected BasicWriter(Context context) { + lineWriter = LineWriter.instance(context); + out = context.get(PrintWriter.class); + messages = context.get(Messages.class); + if (messages == null) + throw new AssertionError(); + } + + protected void print(String s) { + lineWriter.print(s); + } + + protected void print(Object o) { + lineWriter.print(o == null ? null : o.toString()); + } + + protected void println() { + lineWriter.println(); + } + + protected void println(String s) { + lineWriter.print(s); + lineWriter.println(); + } + + protected void println(Object o) { + lineWriter.print(o == null ? null : o.toString()); + lineWriter.println(); + } + + protected void indent(int delta) { + lineWriter.indent(delta); + } + + protected void tab() { + lineWriter.tab(); + } + + protected void setPendingNewline(boolean b) { + lineWriter.pendingNewline = b; + } + + protected String report(AttributeException e) { + out.println("Error: " + e.getMessage()); // i18n? + return "???"; + } + + protected String report(ConstantPoolException e) { + out.println("Error: " + e.getMessage()); // i18n? + return "???"; + } + + protected String report(DescriptorException e) { + out.println("Error: " + e.getMessage()); // i18n? + return "???"; + } + + protected String report(String msg) { + out.println("Error: " + msg); // i18n? + return "???"; + } + + protected String space(int w) { + if (w < spaces.length && spaces[w] != null) + return spaces[w]; + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < w; i++) + sb.append(" "); + + String s = sb.toString(); + if (w < spaces.length) + spaces[w] = s; + + return s; + } + + private String[] spaces = new String[80]; + + private LineWriter lineWriter; + private PrintWriter out; + protected Messages messages; + + private static class LineWriter { + static LineWriter instance(Context context) { + LineWriter instance = context.get(LineWriter.class); + if (instance == null) + instance = new LineWriter(context); + return instance; + } + + protected LineWriter(Context context) { + context.put(LineWriter.class, this); + Options options = Options.instance(context); + indentWidth = options.indentWidth; + tabColumn = options.tabColumn; + out = context.get(PrintWriter.class); + buffer = new StringBuilder(); + } + + protected void print(String s) { + if (pendingNewline) { + println(); + pendingNewline = false; + } + if (s == null) + s = "null"; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case ' ': + pendingSpaces++; + break; + + case '\n': + println(); + break; + + default: + if (buffer.length() == 0) + indent(); + if (pendingSpaces > 0) { + for (int sp = 0; sp < pendingSpaces; sp++) + buffer.append(' '); + pendingSpaces = 0; + } + buffer.append(c); + } + } + + } + + protected void println() { + // ignore/discard pending spaces + pendingSpaces = 0; + out.println(buffer); + buffer.setLength(0); + } + + protected void indent(int delta) { + indentCount += delta; + } + + protected void tab() { + int col = indentCount * indentWidth + tabColumn; + pendingSpaces += (col <= buffer.length() ? 1 : col - buffer.length()); + } + + private void indent() { + pendingSpaces += (indentCount * indentWidth); + } + + private final PrintWriter out; + private final StringBuilder buffer; + private int indentCount; + private final int indentWidth; + private final int tabColumn; + private boolean pendingNewline; + private int pendingSpaces; + } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ClassWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,756 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.net.URI; +import java.text.DateFormat; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Attributes; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.ConstantValue_attribute; +import com.sun.tools.classfile.Descriptor; +import com.sun.tools.classfile.DescriptorException; +import com.sun.tools.classfile.Exceptions_attribute; +import com.sun.tools.classfile.Field; +import com.sun.tools.classfile.Method; +import com.sun.tools.classfile.Signature; +import com.sun.tools.classfile.Signature_attribute; +import com.sun.tools.classfile.SourceFile_attribute; +import com.sun.tools.classfile.Type; +import com.sun.tools.classfile.Type.ArrayType; +import com.sun.tools.classfile.Type.ClassSigType; +import com.sun.tools.classfile.Type.ClassType; +import com.sun.tools.classfile.Type.MethodType; +import com.sun.tools.classfile.Type.SimpleType; +import com.sun.tools.classfile.Type.TypeParamType; +import com.sun.tools.classfile.Type.WildcardType; + +import static com.sun.tools.classfile.AccessFlags.*; + +/* + * The main javap class to write the contents of a class file as text. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ClassWriter extends BasicWriter { + static ClassWriter instance(Context context) { + ClassWriter instance = context.get(ClassWriter.class); + if (instance == null) + instance = new ClassWriter(context); + return instance; + } + + protected ClassWriter(Context context) { + super(context); + context.put(ClassWriter.class, this); + options = Options.instance(context); + attrWriter = AttributeWriter.instance(context); + codeWriter = CodeWriter.instance(context); + constantWriter = ConstantWriter.instance(context); + } + + void setDigest(String name, byte[] digest) { + this.digestName = name; + this.digest = digest; + } + + void setFile(URI uri) { + this.uri = uri; + } + + void setFileSize(int size) { + this.size = size; + } + + void setLastModified(long lastModified) { + this.lastModified = lastModified; + } + + protected ClassFile getClassFile() { + return classFile; + } + + protected void setClassFile(ClassFile cf) { + classFile = cf; + constant_pool = classFile.constant_pool; + } + + protected Method getMethod() { + return method; + } + + protected void setMethod(Method m) { + method = m; + } + + public void write(ClassFile cf) { + setClassFile(cf); + + if (options.sysInfo || options.verbose) { + if (uri != null) { + if (uri.getScheme().equals("file")) + println("Classfile " + uri.getPath()); + else + println("Classfile " + uri); + } + indent(+1); + if (lastModified != -1) { + Date lm = new Date(lastModified); + DateFormat df = DateFormat.getDateInstance(); + if (size > 0) { + println("Last modified " + df.format(lm) + "; size " + size + " bytes"); + } else { + println("Last modified " + df.format(lm)); + } + } else if (size > 0) { + println("Size " + size + " bytes"); + } + if (digestName != null && digest != null) { + StringBuilder sb = new StringBuilder(); + for (byte b: digest) + sb.append(String.format("%02x", b)); + println(digestName + " checksum " + sb); + } + } + + Attribute sfa = cf.getAttribute(Attribute.SourceFile); + if (sfa instanceof SourceFile_attribute) { + println("Compiled from \"" + getSourceFile((SourceFile_attribute) sfa) + "\""); + } + + if (options.sysInfo || options.verbose) { + indent(-1); + } + + String name = getJavaName(classFile); + AccessFlags flags = cf.access_flags; + + writeModifiers(flags.getClassModifiers()); + + if (classFile.isClass()) + print("class "); + else if (classFile.isInterface()) + print("interface "); + + print(name); + + Signature_attribute sigAttr = getSignature(cf.attributes); + if (sigAttr == null) { + // use info from class file header + if (classFile.isClass() && classFile.super_class != 0 ) { + String sn = getJavaSuperclassName(cf); + if (!sn.equals("java.lang.Object")) { + print(" extends "); + print(sn); + } + } + for (int i = 0; i < classFile.interfaces.length; i++) { + print(i == 0 ? (classFile.isClass() ? " implements " : " extends ") : ","); + print(getJavaInterfaceName(classFile, i)); + } + } else { + try { + Type t = sigAttr.getParsedSignature().getType(constant_pool); + JavaTypePrinter p = new JavaTypePrinter(classFile.isInterface()); + // The signature parser cannot disambiguate between a + // FieldType and a ClassSignatureType that only contains a superclass type. + if (t instanceof Type.ClassSigType) { + print(p.print(t)); + } else if (options.verbose || !t.isObject()) { + print(" extends "); + print(p.print(t)); + } + } catch (ConstantPoolException e) { + print(report(e)); + } + } + + if (options.verbose) { + println(); + indent(+1); + println("minor version: " + cf.minor_version); + println("major version: " + cf.major_version); + writeList("flags: ", flags.getClassFlags(), "\n"); + indent(-1); + constantWriter.writeConstantPool(); + } else { + print(" "); + } + + println("{"); + indent(+1); + writeFields(); + writeMethods(); + indent(-1); + println("}"); + + if (options.verbose) { + attrWriter.write(cf, cf.attributes, constant_pool); + } + } + // where + class JavaTypePrinter implements Type.Visitor<StringBuilder,StringBuilder> { + boolean isInterface; + + JavaTypePrinter(boolean isInterface) { + this.isInterface = isInterface; + } + + String print(Type t) { + return t.accept(this, new StringBuilder()).toString(); + } + + String printTypeArgs(List<? extends TypeParamType> typeParamTypes) { + StringBuilder builder = new StringBuilder(); + appendIfNotEmpty(builder, "<", typeParamTypes, "> "); + return builder.toString(); + } + + public StringBuilder visitSimpleType(SimpleType type, StringBuilder sb) { + sb.append(getJavaName(type.name)); + return sb; + } + + public StringBuilder visitArrayType(ArrayType type, StringBuilder sb) { + append(sb, type.elemType); + sb.append("[]"); + return sb; + } + + public StringBuilder visitMethodType(MethodType type, StringBuilder sb) { + appendIfNotEmpty(sb, "<", type.typeParamTypes, "> "); + append(sb, type.returnType); + append(sb, " (", type.paramTypes, ")"); + appendIfNotEmpty(sb, " throws ", type.throwsTypes, ""); + return sb; + } + + public StringBuilder visitClassSigType(ClassSigType type, StringBuilder sb) { + appendIfNotEmpty(sb, "<", type.typeParamTypes, ">"); + if (isInterface) { + appendIfNotEmpty(sb, " extends ", type.superinterfaceTypes, ""); + } else { + if (type.superclassType != null + && (options.verbose || !type.superclassType.isObject())) { + sb.append(" extends "); + append(sb, type.superclassType); + } + appendIfNotEmpty(sb, " implements ", type.superinterfaceTypes, ""); + } + return sb; + } + + public StringBuilder visitClassType(ClassType type, StringBuilder sb) { + if (type.outerType != null) { + append(sb, type.outerType); + sb.append("."); + } + sb.append(getJavaName(type.name)); + appendIfNotEmpty(sb, "<", type.typeArgs, ">"); + return sb; + } + + public StringBuilder visitTypeParamType(TypeParamType type, StringBuilder sb) { + sb.append(type.name); + String sep = " extends "; + if (type.classBound != null + && (options.verbose || !type.classBound.isObject())) { + sb.append(sep); + append(sb, type.classBound); + sep = " & "; + } + if (type.interfaceBounds != null) { + for (Type bound: type.interfaceBounds) { + sb.append(sep); + append(sb, bound); + sep = " & "; + } + } + return sb; + } + + public StringBuilder visitWildcardType(WildcardType type, StringBuilder sb) { + switch (type.kind) { + case UNBOUNDED: + sb.append("?"); + break; + case EXTENDS: + sb.append("? extends "); + append(sb, type.boundType); + break; + case SUPER: + sb.append("? super "); + append(sb, type.boundType); + break; + default: + throw new AssertionError(); + } + return sb; + } + + private void append(StringBuilder sb, Type t) { + t.accept(this, sb); + } + + private void append(StringBuilder sb, String prefix, List<? extends Type> list, String suffix) { + sb.append(prefix); + String sep = ""; + for (Type t: list) { + sb.append(sep); + append(sb, t); + sep = ", "; + } + sb.append(suffix); + } + + private void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> list, String suffix) { + if (!isEmpty(list)) + append(sb, prefix, list, suffix); + } + + private boolean isEmpty(List<? extends Type> list) { + return (list == null || list.isEmpty()); + } + } + + protected void writeFields() { + for (Field f: classFile.fields) { + writeField(f); + } + } + + protected void writeField(Field f) { + if (!options.checkAccess(f.access_flags)) + return; + + AccessFlags flags = f.access_flags; + writeModifiers(flags.getFieldModifiers()); + Signature_attribute sigAttr = getSignature(f.attributes); + if (sigAttr == null) + print(getJavaFieldType(f.descriptor)); + else { + try { + Type t = sigAttr.getParsedSignature().getType(constant_pool); + print(getJavaName(t.toString())); + } catch (ConstantPoolException e) { + // report error? + // fall back on non-generic descriptor + print(getJavaFieldType(f.descriptor)); + } + } + print(" "); + print(getFieldName(f)); + if (options.showConstants) { + Attribute a = f.attributes.get(Attribute.ConstantValue); + if (a instanceof ConstantValue_attribute) { + print(" = "); + ConstantValue_attribute cv = (ConstantValue_attribute) a; + print(getConstantValue(f.descriptor, cv.constantvalue_index)); + } + } + print(";"); + println(); + + indent(+1); + + boolean showBlank = false; + + if (options.showDescriptors) + println("descriptor: " + getValue(f.descriptor)); + + if (options.verbose) + writeList("flags: ", flags.getFieldFlags(), "\n"); + + if (options.showAllAttrs) { + for (Attribute attr: f.attributes) + attrWriter.write(f, attr, constant_pool); + showBlank = true; + } + + indent(-1); + + if (showBlank || options.showDisassembled || options.showLineAndLocalVariableTables) + println(); + } + + protected void writeMethods() { + for (Method m: classFile.methods) + writeMethod(m); + setPendingNewline(false); + } + + protected void writeMethod(Method m) { + if (!options.checkAccess(m.access_flags)) + return; + + method = m; + + AccessFlags flags = m.access_flags; + + Descriptor d; + Type.MethodType methodType; + List<? extends Type> methodExceptions; + + Signature_attribute sigAttr = getSignature(m.attributes); + if (sigAttr == null) { + d = m.descriptor; + methodType = null; + methodExceptions = null; + } else { + Signature methodSig = sigAttr.getParsedSignature(); + d = methodSig; + try { + methodType = (Type.MethodType) methodSig.getType(constant_pool); + methodExceptions = methodType.throwsTypes; + if (methodExceptions != null && methodExceptions.isEmpty()) + methodExceptions = null; + } catch (ConstantPoolException e) { + // report error? + // fall back on standard descriptor + methodType = null; + methodExceptions = null; + } + } + + writeModifiers(flags.getMethodModifiers()); + if (methodType != null) { + print(new JavaTypePrinter(false).printTypeArgs(methodType.typeParamTypes)); + } + if (getName(m).equals("<init>")) { + print(getJavaName(classFile)); + print(getJavaParameterTypes(d, flags)); + } else if (getName(m).equals("<clinit>")) { + print("{}"); + } else { + print(getJavaReturnType(d)); + print(" "); + print(getName(m)); + print(getJavaParameterTypes(d, flags)); + } + + Attribute e_attr = m.attributes.get(Attribute.Exceptions); + if (e_attr != null) { // if there are generic exceptions, there must be erased exceptions + if (e_attr instanceof Exceptions_attribute) { + Exceptions_attribute exceptions = (Exceptions_attribute) e_attr; + print(" throws "); + if (methodExceptions != null) { // use generic list if available + writeList("", methodExceptions, ""); + } else { + for (int i = 0; i < exceptions.number_of_exceptions; i++) { + if (i > 0) + print(", "); + print(getJavaException(exceptions, i)); + } + } + } else { + report("Unexpected or invalid value for Exceptions attribute"); + } + } + + println(";"); + + indent(+1); + + if (options.showDescriptors) { + println("descriptor: " + getValue(m.descriptor)); + } + + if (options.verbose) { + writeList("flags: ", flags.getMethodFlags(), "\n"); + } + + Code_attribute code = null; + Attribute c_attr = m.attributes.get(Attribute.Code); + if (c_attr != null) { + if (c_attr instanceof Code_attribute) + code = (Code_attribute) c_attr; + else + report("Unexpected or invalid value for Code attribute"); + } + + if (options.showAllAttrs) { + Attribute[] attrs = m.attributes.attrs; + for (Attribute attr: attrs) + attrWriter.write(m, attr, constant_pool); + } else if (code != null) { + if (options.showDisassembled) { + println("Code:"); + codeWriter.writeInstrs(code); + codeWriter.writeExceptionTable(code); + } + + if (options.showLineAndLocalVariableTables) { + attrWriter.write(code, code.attributes.get(Attribute.LineNumberTable), constant_pool); + attrWriter.write(code, code.attributes.get(Attribute.LocalVariableTable), constant_pool); + } + } + + indent(-1); + + // set pendingNewline to write a newline before the next method (if any) + // if a separator is desired + setPendingNewline( + options.showDisassembled || + options.showAllAttrs || + options.showDescriptors || + options.showLineAndLocalVariableTables || + options.verbose); + } + + void writeModifiers(Collection<String> items) { + for (Object item: items) { + print(item); + print(" "); + } + } + + void writeList(String prefix, Collection<?> items, String suffix) { + print(prefix); + String sep = ""; + for (Object item: items) { + print(sep); + print(item); + sep = ", "; + } + print(suffix); + } + + void writeListIfNotEmpty(String prefix, List<?> items, String suffix) { + if (items != null && items.size() > 0) + writeList(prefix, items, suffix); + } + + Signature_attribute getSignature(Attributes attributes) { + return (Signature_attribute) attributes.get(Attribute.Signature); + } + + String adjustVarargs(AccessFlags flags, String params) { + if (flags.is(ACC_VARARGS)) { + int i = params.lastIndexOf("[]"); + if (i > 0) + return params.substring(0, i) + "..." + params.substring(i+2); + } + + return params; + } + + String getJavaName(ClassFile cf) { + try { + return getJavaName(cf.getName()); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getJavaSuperclassName(ClassFile cf) { + try { + return getJavaName(cf.getSuperclassName()); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getJavaInterfaceName(ClassFile cf, int index) { + try { + return getJavaName(cf.getInterfaceName(index)); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getJavaFieldType(Descriptor d) { + try { + return getJavaName(d.getFieldType(constant_pool)); + } catch (ConstantPoolException e) { + return report(e); + } catch (DescriptorException e) { + return report(e); + } + } + + String getJavaReturnType(Descriptor d) { + try { + return getJavaName(d.getReturnType(constant_pool)); + } catch (ConstantPoolException e) { + return report(e); + } catch (DescriptorException e) { + return report(e); + } + } + + String getJavaParameterTypes(Descriptor d, AccessFlags flags) { + try { + return getJavaName(adjustVarargs(flags, d.getParameterTypes(constant_pool))); + } catch (ConstantPoolException e) { + return report(e); + } catch (DescriptorException e) { + return report(e); + } + } + + String getJavaException(Exceptions_attribute attr, int index) { + try { + return getJavaName(attr.getException(index, constant_pool)); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getValue(Descriptor d) { + try { + return d.getValue(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getFieldName(Field f) { + try { + return f.getName(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getName(Method m) { + try { + return m.getName(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + static String getJavaName(String name) { + return name.replace('/', '.'); + } + + String getSourceFile(SourceFile_attribute attr) { + try { + return attr.getSourceFile(constant_pool); + } catch (ConstantPoolException e) { + return report(e); + } + } + + /** + * Get the value of an entry in the constant pool as a Java constant. + * Characters and booleans are represented by CONSTANT_Intgere entries. + * Character and string values are processed to escape characters outside + * the basic printable ASCII set. + * @param d the descriptor, giving the expected type of the constant + * @param index the index of the value in the constant pool + * @return a printable string containing the value of the constant. + */ + String getConstantValue(Descriptor d, int index) { + try { + ConstantPool.CPInfo cpInfo = constant_pool.get(index); + + switch (cpInfo.getTag()) { + case ConstantPool.CONSTANT_Integer: { + ConstantPool.CONSTANT_Integer_info info = + (ConstantPool.CONSTANT_Integer_info) cpInfo; + String t = d.getValue(constant_pool); + if (t.equals("C")) { // character + return getConstantCharValue((char) info.value); + } else if (t.equals("Z")) { // boolean + return String.valueOf(info.value == 1); + } else { // other: assume integer + return String.valueOf(info.value); + } + } + + case ConstantPool.CONSTANT_String: { + ConstantPool.CONSTANT_String_info info = + (ConstantPool.CONSTANT_String_info) cpInfo; + return getConstantStringValue(info.getString()); + } + + default: + return constantWriter.stringValue(cpInfo); + } + } catch (ConstantPoolException e) { + return "#" + index; + } + } + + private String getConstantCharValue(char c) { + StringBuilder sb = new StringBuilder(); + sb.append('\''); + sb.append(esc(c, '\'')); + sb.append('\''); + return sb.toString(); + } + + private String getConstantStringValue(String s) { + StringBuilder sb = new StringBuilder(); + sb.append("\""); + for (int i = 0; i < s.length(); i++) { + sb.append(esc(s.charAt(i), '"')); + } + sb.append("\""); + return sb.toString(); + } + + private String esc(char c, char quote) { + if (32 <= c && c <= 126 && c != quote) + return String.valueOf(c); + else switch (c) { + case '\b': return "\\b"; + case '\n': return "\\n"; + case '\t': return "\\t"; + case '\f': return "\\f"; + case '\r': return "\\r"; + case '\\': return "\\\\"; + case '\'': return "\\'"; + case '\"': return "\\\""; + default: return String.format("\\u%04x", (int) c); + } + } + + private Options options; + private AttributeWriter attrWriter; + private CodeWriter codeWriter; + private ConstantWriter constantWriter; + private ClassFile classFile; + private URI uri; + private long lastModified; + private String digestName; + private byte[] digest; + private int size; + private ConstantPool constant_pool; + private Method method; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/CodeWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.ArrayList; +import java.util.List; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.DescriptorException; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.Instruction.TypeKind; +import com.sun.tools.classfile.Method; + +/* + * Write the contents of a Code attribute. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class CodeWriter extends BasicWriter { + public static CodeWriter instance(Context context) { + CodeWriter instance = context.get(CodeWriter.class); + if (instance == null) + instance = new CodeWriter(context); + return instance; + } + + protected CodeWriter(Context context) { + super(context); + context.put(CodeWriter.class, this); + attrWriter = AttributeWriter.instance(context); + classWriter = ClassWriter.instance(context); + constantWriter = ConstantWriter.instance(context); + sourceWriter = SourceWriter.instance(context); + tryBlockWriter = TryBlockWriter.instance(context); + stackMapWriter = StackMapWriter.instance(context); + localVariableTableWriter = LocalVariableTableWriter.instance(context); + localVariableTypeTableWriter = LocalVariableTypeTableWriter.instance(context); + typeAnnotationWriter = TypeAnnotationWriter.instance(context); + options = Options.instance(context); + } + + void write(Code_attribute attr, ConstantPool constant_pool) { + println("Code:"); + indent(+1); + writeVerboseHeader(attr, constant_pool); + writeInstrs(attr); + writeExceptionTable(attr); + attrWriter.write(attr, attr.attributes, constant_pool); + indent(-1); + } + + public void writeVerboseHeader(Code_attribute attr, ConstantPool constant_pool) { + Method method = classWriter.getMethod(); + String argCount; + try { + int n = method.descriptor.getParameterCount(constant_pool); + if (!method.access_flags.is(AccessFlags.ACC_STATIC)) + ++n; // for 'this' + argCount = Integer.toString(n); + } catch (ConstantPoolException e) { + argCount = report(e); + } catch (DescriptorException e) { + argCount = report(e); + } + + println("stack=" + attr.max_stack + + ", locals=" + attr.max_locals + + ", args_size=" + argCount); + + } + + public void writeInstrs(Code_attribute attr) { + List<InstructionDetailWriter> detailWriters = getDetailWriters(attr); + + for (Instruction instr: attr.getInstructions()) { + try { + for (InstructionDetailWriter w: detailWriters) + w.writeDetails(instr); + writeInstr(instr); + } catch (ArrayIndexOutOfBoundsException e) { + println(report("error at or after byte " + instr.getPC())); + break; + } + } + + for (InstructionDetailWriter w: detailWriters) + w.flush(); + } + + public void writeInstr(Instruction instr) { + print(String.format("%4d: %-13s ", instr.getPC(), instr.getMnemonic())); + // compute the number of indentations for the body of multi-line instructions + // This is 6 (the width of "%4d: "), divided by the width of each indentation level, + // and rounded up to the next integer. + int indentWidth = options.indentWidth; + int indent = (6 + indentWidth - 1) / indentWidth; + instr.accept(instructionPrinter, indent); + println(); + } + // where + Instruction.KindVisitor<Void,Integer> instructionPrinter = + new Instruction.KindVisitor<Void,Integer>() { + + public Void visitNoOperands(Instruction instr, Integer indent) { + return null; + } + + public Void visitArrayType(Instruction instr, TypeKind kind, Integer indent) { + print(" " + kind.name); + return null; + } + + public Void visitBranch(Instruction instr, int offset, Integer indent) { + print((instr.getPC() + offset)); + return null; + } + + public Void visitConstantPoolRef(Instruction instr, int index, Integer indent) { + print("#" + index); + tab(); + print("// "); + printConstant(index); + return null; + } + + public Void visitConstantPoolRefAndValue(Instruction instr, int index, int value, Integer indent) { + print("#" + index + ", " + value); + tab(); + print("// "); + printConstant(index); + return null; + } + + public Void visitLocal(Instruction instr, int index, Integer indent) { + print(index); + return null; + } + + public Void visitLocalAndValue(Instruction instr, int index, int value, Integer indent) { + print(index + ", " + value); + return null; + } + + public Void visitLookupSwitch(Instruction instr, + int default_, int npairs, int[] matches, int[] offsets, Integer indent) { + int pc = instr.getPC(); + print("{ // " + npairs); + indent(indent); + for (int i = 0; i < npairs; i++) { + print(String.format("%n%12d: %d", matches[i], (pc + offsets[i]))); + } + print("\n default: " + (pc + default_) + "\n}"); + indent(-indent); + return null; + } + + public Void visitTableSwitch(Instruction instr, + int default_, int low, int high, int[] offsets, Integer indent) { + int pc = instr.getPC(); + print("{ // " + low + " to " + high); + indent(indent); + for (int i = 0; i < offsets.length; i++) { + print(String.format("%n%12d: %d", (low + i), (pc + offsets[i]))); + } + print("\n default: " + (pc + default_) + "\n}"); + indent(-indent); + return null; + } + + public Void visitValue(Instruction instr, int value, Integer indent) { + print(value); + return null; + } + + public Void visitUnknown(Instruction instr, Integer indent) { + return null; + } + }; + + + public void writeExceptionTable(Code_attribute attr) { + if (attr.exception_table_length > 0) { + println("Exception table:"); + indent(+1); + println(" from to target type"); + for (int i = 0; i < attr.exception_table.length; i++) { + Code_attribute.Exception_data handler = attr.exception_table[i]; + print(String.format(" %5d %5d %5d", + handler.start_pc, handler.end_pc, handler.handler_pc)); + print(" "); + int catch_type = handler.catch_type; + if (catch_type == 0) { + println("any"); + } else { + print("Class "); + println(constantWriter.stringValue(catch_type)); + } + } + indent(-1); + } + + } + + private void printConstant(int index) { + constantWriter.write(index); + } + + private List<InstructionDetailWriter> getDetailWriters(Code_attribute attr) { + List<InstructionDetailWriter> detailWriters = new ArrayList<>(); + if (options.details.contains(InstructionDetailWriter.Kind.SOURCE)) { + sourceWriter.reset(classWriter.getClassFile(), attr); + if (sourceWriter.hasSource()) + detailWriters.add(sourceWriter); + else + println("(Source code not available)"); + } + + if (options.details.contains(InstructionDetailWriter.Kind.LOCAL_VARS)) { + localVariableTableWriter.reset(attr); + detailWriters.add(localVariableTableWriter); + } + + if (options.details.contains(InstructionDetailWriter.Kind.LOCAL_VAR_TYPES)) { + localVariableTypeTableWriter.reset(attr); + detailWriters.add(localVariableTypeTableWriter); + } + + if (options.details.contains(InstructionDetailWriter.Kind.STACKMAPS)) { + stackMapWriter.reset(attr); + stackMapWriter.writeInitialDetails(); + detailWriters.add(stackMapWriter); + } + + if (options.details.contains(InstructionDetailWriter.Kind.TRY_BLOCKS)) { + tryBlockWriter.reset(attr); + detailWriters.add(tryBlockWriter); + } + + if (options.details.contains(InstructionDetailWriter.Kind.TYPE_ANNOS)) { + typeAnnotationWriter.reset(attr); + detailWriters.add(typeAnnotationWriter); + } + + return detailWriters; + } + + private AttributeWriter attrWriter; + private ClassWriter classWriter; + private ConstantWriter constantWriter; + private LocalVariableTableWriter localVariableTableWriter; + private LocalVariableTypeTableWriter localVariableTypeTableWriter; + private TypeAnnotationWriter typeAnnotationWriter; + private SourceWriter sourceWriter; + private StackMapWriter stackMapWriter; + private TryBlockWriter tryBlockWriter; + private Options options; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/ConstantWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,466 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; + +import static com.sun.tools.classfile.ConstantPool.*; + +/* + * Write a constant pool entry. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class ConstantWriter extends BasicWriter { + public static ConstantWriter instance(Context context) { + ConstantWriter instance = context.get(ConstantWriter.class); + if (instance == null) + instance = new ConstantWriter(context); + return instance; + } + + protected ConstantWriter(Context context) { + super(context); + context.put(ConstantWriter.class, this); + classWriter = ClassWriter.instance(context); + options = Options.instance(context); + } + + protected void writeConstantPool() { + ConstantPool constant_pool = classWriter.getClassFile().constant_pool; + writeConstantPool(constant_pool); + } + + protected void writeConstantPool(ConstantPool constant_pool) { + ConstantPool.Visitor<Integer, Void> v = new ConstantPool.Visitor<Integer,Void>() { + public Integer visitClass(CONSTANT_Class_info info, Void p) { + print("#" + info.name_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitDouble(CONSTANT_Double_info info, Void p) { + println(stringValue(info)); + return 2; + } + + public Integer visitFieldref(CONSTANT_Fieldref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitFloat(CONSTANT_Float_info info, Void p) { + println(stringValue(info)); + return 1; + } + + public Integer visitInteger(CONSTANT_Integer_info info, Void p) { + println(stringValue(info)); + return 1; + } + + public Integer visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { + print("#" + info.bootstrap_method_attr_index + ":#" + info.name_and_type_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitLong(CONSTANT_Long_info info, Void p) { + println(stringValue(info)); + return 2; + } + + public Integer visitNameAndType(CONSTANT_NameAndType_info info, Void p) { + print("#" + info.name_index + ":#" + info.type_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitMethodref(CONSTANT_Methodref_info info, Void p) { + print("#" + info.class_index + ".#" + info.name_and_type_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { + print("#" + info.reference_kind.tag + ":#" + info.reference_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitMethodType(CONSTANT_MethodType_info info, Void p) { + print("#" + info.descriptor_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitString(CONSTANT_String_info info, Void p) { + print("#" + info.string_index); + tab(); + println("// " + stringValue(info)); + return 1; + } + + public Integer visitUtf8(CONSTANT_Utf8_info info, Void p) { + println(stringValue(info)); + return 1; + } + + }; + println("Constant pool:"); + indent(+1); + int width = String.valueOf(constant_pool.size()).length() + 1; + int cpx = 1; + while (cpx < constant_pool.size()) { + print(String.format("%" + width + "s", ("#" + cpx))); + try { + CPInfo cpInfo = constant_pool.get(cpx); + print(String.format(" = %-18s ", cpTagName(cpInfo))); + cpx += cpInfo.accept(v, null); + } catch (ConstantPool.InvalidIndex ex) { + // should not happen + } + } + indent(-1); + } + + protected void write(int cpx) { + ClassFile classFile = classWriter.getClassFile(); + if (cpx == 0) { + print("#0"); + return; + } + + CPInfo cpInfo; + try { + cpInfo = classFile.constant_pool.get(cpx); + } catch (ConstantPoolException e) { + print("#" + cpx); + return; + } + + int tag = cpInfo.getTag(); + switch (tag) { + case CONSTANT_Methodref: + case CONSTANT_InterfaceMethodref: + case CONSTANT_Fieldref: + // simplify references within this class + CPRefInfo ref = (CPRefInfo) cpInfo; + try { + if (ref.class_index == classFile.this_class) + cpInfo = classFile.constant_pool.get(ref.name_and_type_index); + } catch (ConstantPool.InvalidIndex e) { + // ignore, for now + } + } + print(tagName(tag) + " " + stringValue(cpInfo)); + } + + String cpTagName(CPInfo cpInfo) { + String n = cpInfo.getClass().getSimpleName(); + return n.replace("CONSTANT_", "").replace("_info", ""); + } + + String tagName(int tag) { + switch (tag) { + case CONSTANT_Utf8: + return "Utf8"; + case CONSTANT_Integer: + return "int"; + case CONSTANT_Float: + return "float"; + case CONSTANT_Long: + return "long"; + case CONSTANT_Double: + return "double"; + case CONSTANT_Class: + return "class"; + case CONSTANT_String: + return "String"; + case CONSTANT_Fieldref: + return "Field"; + case CONSTANT_MethodHandle: + return "MethodHandle"; + case CONSTANT_MethodType: + return "MethodType"; + case CONSTANT_Methodref: + return "Method"; + case CONSTANT_InterfaceMethodref: + return "InterfaceMethod"; + case CONSTANT_InvokeDynamic: + return "InvokeDynamic"; + case CONSTANT_NameAndType: + return "NameAndType"; + default: + return "(unknown tag " + tag + ")"; + } + } + + String stringValue(int constant_pool_index) { + ClassFile classFile = classWriter.getClassFile(); + try { + return stringValue(classFile.constant_pool.get(constant_pool_index)); + } catch (ConstantPool.InvalidIndex e) { + return report(e); + } + } + + String stringValue(CPInfo cpInfo) { + return stringValueVisitor.visit(cpInfo); + } + + StringValueVisitor stringValueVisitor = new StringValueVisitor(); + + private class StringValueVisitor implements ConstantPool.Visitor<String, Void> { + public String visit(CPInfo info) { + return info.accept(this, null); + } + + public String visitClass(CONSTANT_Class_info info, Void p) { + return getCheckedName(info); + } + + String getCheckedName(CONSTANT_Class_info info) { + try { + return checkName(info.getName()); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitDouble(CONSTANT_Double_info info, Void p) { + return info.value + "d"; + } + + public String visitFieldref(CONSTANT_Fieldref_info info, Void p) { + return visitRef(info, p); + } + + public String visitFloat(CONSTANT_Float_info info, Void p) { + return info.value + "f"; + } + + public String visitInteger(CONSTANT_Integer_info info, Void p) { + return String.valueOf(info.value); + } + + public String visitInterfaceMethodref(CONSTANT_InterfaceMethodref_info info, Void p) { + return visitRef(info, p); + } + + public String visitInvokeDynamic(CONSTANT_InvokeDynamic_info info, Void p) { + try { + String callee = stringValue(info.getNameAndTypeInfo()); + return "#" + info.bootstrap_method_attr_index + ":" + callee; + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitLong(CONSTANT_Long_info info, Void p) { + return info.value + "l"; + } + + public String visitNameAndType(CONSTANT_NameAndType_info info, Void p) { + return getCheckedName(info) + ":" + getType(info); + } + + String getCheckedName(CONSTANT_NameAndType_info info) { + try { + return checkName(info.getName()); + } catch (ConstantPoolException e) { + return report(e); + } + } + + String getType(CONSTANT_NameAndType_info info) { + try { + return info.getType(); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitMethodHandle(CONSTANT_MethodHandle_info info, Void p) { + try { + return info.reference_kind.name + " " + stringValue(info.getCPRefInfo()); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitMethodType(CONSTANT_MethodType_info info, Void p) { + try { + return info.getType(); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitMethodref(CONSTANT_Methodref_info info, Void p) { + return visitRef(info, p); + } + + public String visitString(CONSTANT_String_info info, Void p) { + try { + ClassFile classFile = classWriter.getClassFile(); + int string_index = info.string_index; + return stringValue(classFile.constant_pool.getUTF8Info(string_index)); + } catch (ConstantPoolException e) { + return report(e); + } + } + + public String visitUtf8(CONSTANT_Utf8_info info, Void p) { + String s = info.value; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '\t': + sb.append('\\').append('t'); + break; + case '\n': + sb.append('\\').append('n'); + break; + case '\r': + sb.append('\\').append('r'); + break; + case '\b': + sb.append('\\').append('b'); + break; + case '\f': + sb.append('\\').append('f'); + break; + case '\"': + sb.append('\\').append('\"'); + break; + case '\'': + sb.append('\\').append('\''); + break; + case '\\': + sb.append('\\').append('\\'); + break; + default: + sb.append(c); + } + } + return sb.toString(); + } + + String visitRef(CPRefInfo info, Void p) { + String cn = getCheckedClassName(info); + String nat; + try { + nat = stringValue(info.getNameAndTypeInfo()); + } catch (ConstantPoolException e) { + nat = report(e); + } + return cn + "." + nat; + } + + String getCheckedClassName(CPRefInfo info) { + try { + return checkName(info.getClassName()); + } catch (ConstantPoolException e) { + return report(e); + } + } + } + + /* If name is a valid binary name, return it; otherwise quote it. */ + private static String checkName(String name) { + if (name == null) + return "null"; + + int len = name.length(); + if (len == 0) + return "\"\""; + + int cc = '/'; + int cp; + for (int k = 0; k < len; k += Character.charCount(cp)) { + cp = name.codePointAt(k); + if ((cc == '/' && !Character.isJavaIdentifierStart(cp)) + || (cp != '/' && !Character.isJavaIdentifierPart(cp))) { + return "\"" + addEscapes(name) + "\""; + } + cc = cp; + } + + return name; + } + + /* If name requires escapes, put them in, so it can be a string body. */ + private static String addEscapes(String name) { + String esc = "\\\"\n\t"; + String rep = "\\\"nt"; + StringBuilder buf = null; + int nextk = 0; + int len = name.length(); + for (int k = 0; k < len; k++) { + char cp = name.charAt(k); + int n = esc.indexOf(cp); + if (n >= 0) { + if (buf == null) + buf = new StringBuilder(len * 2); + if (nextk < k) + buf.append(name, nextk, k); + buf.append('\\'); + buf.append(rep.charAt(n)); + nextk = k+1; + } + } + if (buf == null) + return name; + if (nextk < len) + buf.append(name, nextk, len); + return buf.toString(); + } + + private ClassWriter classWriter; + private Options options; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/Context.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.HashMap; +import java.util.Map; + +/* + * Class from which to put/get shared resources. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Context { + + Map<Class<?>, Object> map; + + public Context() { + map = new HashMap<>(); + } + + @SuppressWarnings("unchecked") + public <T> T get(Class<T> key) { + return (T) map.get(key); + } + + @SuppressWarnings("unchecked") + public <T> T put(Class<T> key, T value) { + return (T) map.put(key, value); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/DisassemblerTool.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; //javax.tools; + +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.concurrent.Callable; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.OptionChecker; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.Tool; + +/** + * This class is intended to be put in javax.tools. + * + * @see DiagnosticListener + * @see Diagnostic + * @see JavaFileManager + * @since 1.7 + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public interface DisassemblerTool extends Tool, OptionChecker { + + /** + * Creates a future for a disassembly task with the given + * components and arguments. The task might not have + * completed as described in the DissemblerTask interface. + * + * <p>If a file manager is provided, it must be able to handle all + * locations defined in {@link StandardLocation}. + * + * @param out a Writer for additional output from the compiler; + * use {@code System.err} if {@code null} + * @param fileManager a file manager; if {@code null} use the + * compiler's standard filemanager + * @param diagnosticListener a diagnostic listener; if {@code + * null} use the compiler's default method for reporting + * diagnostics + * @param options compiler options, {@code null} means no options + * @param classes class names (for annotation processing), {@code + * null} means no class names + * @return a task to perform the disassembly + * @throws RuntimeException if an unrecoverable error + * occurred in a user supplied component. The + * {@linkplain Throwable#getCause() cause} will be the error in + * user code. + * @throws IllegalArgumentException if any of the given + * compilation units are of other kind than + * {@linkplain JavaFileObject.Kind#SOURCE source} + */ + DisassemblerTask getTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener<? super JavaFileObject> diagnosticListener, + Iterable<String> options, + Iterable<String> classes); + + /** + * Returns a new instance of the standard file manager implementation + * for this tool. The file manager will use the given diagnostic + * listener for producing any non-fatal diagnostics. Fatal errors + * will be signalled with the appropriate exceptions. + * + * <p>The standard file manager will be automatically reopened if + * it is accessed after calls to {@code flush} or {@code close}. + * The standard file manager must be usable with other tools. + * + * @param diagnosticListener a diagnostic listener for non-fatal + * diagnostics; if {@code null} use the compiler's default method + * for reporting diagnostics + * @param locale the locale to apply when formatting diagnostics; + * {@code null} means the {@linkplain Locale#getDefault() default locale}. + * @param charset the character set used for decoding bytes; if + * {@code null} use the platform default + * @return the standard file manager + */ + StandardJavaFileManager getStandardFileManager( + DiagnosticListener<? super JavaFileObject> diagnosticListener, + Locale locale, + Charset charset); + + /** + * Interface representing a future for a disassembly task. The + * task has not yet started. To start the task, call + * the {@linkplain #call call} method. + * + * <p>Before calling the call method, additional aspects of the + * task can be configured, for example, by calling the + * {@linkplain #setLocale setLocale} method. + */ + interface DisassemblerTask extends Callable<Boolean> { + + /** + * Set the locale to be applied when formatting diagnostics and + * other localized data. + * + * @param locale the locale to apply; {@code null} means apply no + * locale + * @throws IllegalStateException if the task has started + */ + void setLocale(Locale locale); + + /** + * Performs this compilation task. The compilation may only + * be performed once. Subsequent calls to this method throw + * IllegalStateException. + * + * @return true if and only all the files compiled without errors; + * false otherwise + * + * @throws RuntimeException if an unrecoverable error occurred + * in a user-supplied component. The + * {@linkplain Throwable#getCause() cause} will be the error + * in user code. + * @throws IllegalStateException if called more than once + */ + Boolean call(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/InstructionDetailWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.Instruction; + + +/* + * Write additional details for an instruction. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public abstract class InstructionDetailWriter extends BasicWriter { + public enum Kind { + LOCAL_VARS("localVariables"), + LOCAL_VAR_TYPES("localVariableTypes"), + SOURCE("source"), + STACKMAPS("stackMaps"), + TRY_BLOCKS("tryBlocks"), + TYPE_ANNOS("typeAnnotations"); + + Kind(String option) { + this.option = option; + } + + final String option; + } + + InstructionDetailWriter(Context context) { + super(context); + } + + abstract void writeDetails(Instruction instr); + void flush() { } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/InternalError.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +/** + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class InternalError extends Error { + private static final long serialVersionUID = 8114054446416187030L; + InternalError(Throwable t, Object... args) { + super("Internal error", t); + this.args = args; + } + + InternalError(Object... args) { + super("Internal error"); + this.args = args; + } + + public final Object[] args; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapFileManager.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.io.PrintWriter; +import java.nio.charset.Charset; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileObject; + +import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.util.Context; + +/** + * javap's implementation of JavaFileManager. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class JavapFileManager extends JavacFileManager { + private JavapFileManager(Context context, Charset charset) { + super(context, true, charset); + setSymbolFileEnabled(false); + } + + public static JavapFileManager create(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log) { + Context javac_context = new Context(); + + if (dl != null) + javac_context.put(DiagnosticListener.class, dl); + javac_context.put(com.sun.tools.javac.util.Log.outKey, log); + + return new JavapFileManager(javac_context, null); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/JavapTask.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,1068 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.io.EOFException; +import java.io.FileNotFoundException; +import java.io.FilterInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.Reader; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.NoSuchFileException; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.Objects; +import java.util.ResourceBundle; + +import javax.lang.model.element.Modifier; +import javax.lang.model.element.NestingKind; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; + +import com.sun.tools.classfile.*; +import com.sun.tools.javac.util.DefinedBy; +import com.sun.tools.javac.util.DefinedBy.Api; + +/** + * "Main" class for javap, normally accessed from the command line + * via Main, or from JSR199 via DisassemblerTool. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class JavapTask implements DisassemblerTool.DisassemblerTask, Messages { + public class BadArgs extends Exception { + static final long serialVersionUID = 8765093759964640721L; + BadArgs(String key, Object... args) { + super(JavapTask.this.getMessage(key, args)); + this.key = key; + this.args = args; + } + + BadArgs showUsage(boolean b) { + showUsage = b; + return this; + } + + final String key; + final Object[] args; + boolean showUsage; + } + + static abstract class Option { + Option(boolean hasArg, String... aliases) { + this.hasArg = hasArg; + this.aliases = aliases; + } + + boolean matches(String opt) { + for (String a: aliases) { + if (a.equals(opt)) + return true; + } + return false; + } + + boolean ignoreRest() { + return false; + } + + abstract void process(JavapTask task, String opt, String arg) throws BadArgs; + + final boolean hasArg; + final String[] aliases; + } + + static final Option[] recognizedOptions = { + + new Option(false, "-help", "--help", "-?") { + void process(JavapTask task, String opt, String arg) { + task.options.help = true; + } + }, + + new Option(false, "-version") { + void process(JavapTask task, String opt, String arg) { + task.options.version = true; + } + }, + + new Option(false, "-fullversion") { + void process(JavapTask task, String opt, String arg) { + task.options.fullVersion = true; + } + }, + + new Option(false, "-v", "-verbose", "-all") { + void process(JavapTask task, String opt, String arg) { + task.options.verbose = true; + task.options.showDescriptors = true; + task.options.showFlags = true; + task.options.showAllAttrs = true; + } + }, + + new Option(false, "-l") { + void process(JavapTask task, String opt, String arg) { + task.options.showLineAndLocalVariableTables = true; + } + }, + + new Option(false, "-public") { + void process(JavapTask task, String opt, String arg) { + task.options.accessOptions.add(opt); + task.options.showAccess = AccessFlags.ACC_PUBLIC; + } + }, + + new Option(false, "-protected") { + void process(JavapTask task, String opt, String arg) { + task.options.accessOptions.add(opt); + task.options.showAccess = AccessFlags.ACC_PROTECTED; + } + }, + + new Option(false, "-package") { + void process(JavapTask task, String opt, String arg) { + task.options.accessOptions.add(opt); + task.options.showAccess = 0; + } + }, + + new Option(false, "-p", "-private") { + void process(JavapTask task, String opt, String arg) { + if (!task.options.accessOptions.contains("-p") && + !task.options.accessOptions.contains("-private")) { + task.options.accessOptions.add(opt); + } + task.options.showAccess = AccessFlags.ACC_PRIVATE; + } + }, + + new Option(false, "-c") { + void process(JavapTask task, String opt, String arg) { + task.options.showDisassembled = true; + } + }, + + new Option(false, "-s") { + void process(JavapTask task, String opt, String arg) { + task.options.showDescriptors = true; + } + }, + + new Option(false, "-sysinfo") { + void process(JavapTask task, String opt, String arg) { + task.options.sysInfo = true; + } + }, + + new Option(false, "-XDdetails") { + void process(JavapTask task, String opt, String arg) { + task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class); + } + + }, + + new Option(false, "-XDdetails:") { + @Override + boolean matches(String opt) { + int sep = opt.indexOf(":"); + return sep != -1 && super.matches(opt.substring(0, sep + 1)); + } + + void process(JavapTask task, String opt, String arg) throws BadArgs { + int sep = opt.indexOf(":"); + for (String v: opt.substring(sep + 1).split("[,: ]+")) { + if (!handleArg(task, v)) + throw task.new BadArgs("err.invalid.arg.for.option", v); + } + } + + boolean handleArg(JavapTask task, String arg) { + if (arg.length() == 0) + return true; + + if (arg.equals("all")) { + task.options.details = EnumSet.allOf(InstructionDetailWriter.Kind.class); + return true; + } + + boolean on = true; + if (arg.startsWith("-")) { + on = false; + arg = arg.substring(1); + } + + for (InstructionDetailWriter.Kind k: InstructionDetailWriter.Kind.values()) { + if (arg.equalsIgnoreCase(k.option)) { + if (on) + task.options.details.add(k); + else + task.options.details.remove(k); + return true; + } + } + return false; + } + }, + + new Option(false, "-constants") { + void process(JavapTask task, String opt, String arg) { + task.options.showConstants = true; + } + }, + + new Option(false, "-XDinner") { + void process(JavapTask task, String opt, String arg) { + task.options.showInnerClasses = true; + } + }, + + new Option(false, "-XDindent:") { + @Override + boolean matches(String opt) { + int sep = opt.indexOf(":"); + return sep != -1 && super.matches(opt.substring(0, sep + 1)); + } + + void process(JavapTask task, String opt, String arg) throws BadArgs { + int sep = opt.indexOf(":"); + try { + int i = Integer.valueOf(opt.substring(sep + 1)); + if (i > 0) // silently ignore invalid values + task.options.indentWidth = i; + } catch (NumberFormatException e) { + } + } + }, + + new Option(false, "-XDtab:") { + @Override + boolean matches(String opt) { + int sep = opt.indexOf(":"); + return sep != -1 && super.matches(opt.substring(0, sep + 1)); + } + + void process(JavapTask task, String opt, String arg) throws BadArgs { + int sep = opt.indexOf(":"); + try { + int i = Integer.valueOf(opt.substring(sep + 1)); + if (i > 0) // silently ignore invalid values + task.options.tabColumn = i; + } catch (NumberFormatException e) { + } + } + } + + }; + + public JavapTask() { + context = new Context(); + context.put(Messages.class, this); + options = Options.instance(context); + attributeFactory = new Attribute.Factory(); + } + + public JavapTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener<? super JavaFileObject> diagnosticListener) { + this(); + this.log = getPrintWriterForWriter(out); + this.fileManager = fileManager; + this.diagnosticListener = diagnosticListener; + } + + public JavapTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener<? super JavaFileObject> diagnosticListener, + Iterable<String> options, + Iterable<String> classes) { + this(out, fileManager, diagnosticListener); + + this.classes = new ArrayList<>(); + for (String classname: classes) { + Objects.requireNonNull(classname); + this.classes.add(classname); + } + + try { + if (options != null) + handleOptions(options, false); + } catch (BadArgs e) { + throw new IllegalArgumentException(e.getMessage()); + } + } + + public void setLocale(Locale locale) { + if (locale == null) + locale = Locale.getDefault(); + task_locale = locale; + } + + public void setLog(Writer log) { + this.log = getPrintWriterForWriter(log); + } + + public void setLog(OutputStream s) { + setLog(getPrintWriterForStream(s)); + } + + private static PrintWriter getPrintWriterForStream(OutputStream s) { + return new PrintWriter(s == null ? System.err : s, true); + } + + private static PrintWriter getPrintWriterForWriter(Writer w) { + if (w == null) + return getPrintWriterForStream(null); + else if (w instanceof PrintWriter) + return (PrintWriter) w; + else + return new PrintWriter(w, true); + } + + public void setDiagnosticListener(DiagnosticListener<? super JavaFileObject> dl) { + diagnosticListener = dl; + } + + public void setDiagnosticListener(OutputStream s) { + setDiagnosticListener(getDiagnosticListenerForStream(s)); + } + + private DiagnosticListener<JavaFileObject> getDiagnosticListenerForStream(OutputStream s) { + return getDiagnosticListenerForWriter(getPrintWriterForStream(s)); + } + + private DiagnosticListener<JavaFileObject> getDiagnosticListenerForWriter(Writer w) { + final PrintWriter pw = getPrintWriterForWriter(w); + return new DiagnosticListener<JavaFileObject> () { + @DefinedBy(Api.COMPILER) + public void report(Diagnostic<? extends JavaFileObject> diagnostic) { + switch (diagnostic.getKind()) { + case ERROR: + pw.print(getMessage("err.prefix")); + break; + case WARNING: + pw.print(getMessage("warn.prefix")); + break; + case NOTE: + pw.print(getMessage("note.prefix")); + break; + } + pw.print(" "); + pw.println(diagnostic.getMessage(null)); + } + }; + } + + /** Result codes. + */ + static final int + EXIT_OK = 0, // Compilation completed with no errors. + EXIT_ERROR = 1, // Completed but reported errors. + EXIT_CMDERR = 2, // Bad command-line arguments + EXIT_SYSERR = 3, // System error or resource exhaustion. + EXIT_ABNORMAL = 4; // Compiler terminated abnormally + + int run(String[] args) { + try { + try { + handleOptions(args); + + // the following gives consistent behavior with javac + if (classes == null || classes.size() == 0) { + if (options.help || options.version || options.fullVersion) + return EXIT_OK; + else + return EXIT_CMDERR; + } + + return run(); + } finally { + if (defaultFileManager != null) { + try { + defaultFileManager.close(); + defaultFileManager = null; + } catch (IOException e) { + throw new InternalError(e); + } + } + } + } catch (BadArgs e) { + reportError(e.key, e.args); + if (e.showUsage) { + printLines(getMessage("main.usage.summary", progname)); + } + return EXIT_CMDERR; + } catch (InternalError e) { + Object[] e_args; + if (e.getCause() == null) + e_args = e.args; + else { + e_args = new Object[e.args.length + 1]; + e_args[0] = e.getCause(); + System.arraycopy(e.args, 0, e_args, 1, e.args.length); + } + reportError("err.internal.error", e_args); + return EXIT_ABNORMAL; + } finally { + log.flush(); + } + } + + public void handleOptions(String[] args) throws BadArgs { + handleOptions(Arrays.asList(args), true); + } + + private void handleOptions(Iterable<String> args, boolean allowClasses) throws BadArgs { + if (log == null) { + log = getPrintWriterForStream(System.out); + if (diagnosticListener == null) + diagnosticListener = getDiagnosticListenerForStream(System.err); + } else { + if (diagnosticListener == null) + diagnosticListener = getDiagnosticListenerForWriter(log); + } + + + if (fileManager == null) + fileManager = getDefaultFileManager(diagnosticListener, log); + + Iterator<String> iter = args.iterator(); + boolean noArgs = !iter.hasNext(); + + while (iter.hasNext()) { + String arg = iter.next(); + if (arg.startsWith("-")) + handleOption(arg, iter); + else if (allowClasses) { + if (classes == null) + classes = new ArrayList<>(); + classes.add(arg); + while (iter.hasNext()) + classes.add(iter.next()); + } else + throw new BadArgs("err.unknown.option", arg).showUsage(true); + } + + if (options.accessOptions.size() > 1) { + StringBuilder sb = new StringBuilder(); + for (String opt: options.accessOptions) { + if (sb.length() > 0) + sb.append(" "); + sb.append(opt); + } + throw new BadArgs("err.incompatible.options", sb); + } + + if ((classes == null || classes.size() == 0) && + !(noArgs || options.help || options.version || options.fullVersion)) { + throw new BadArgs("err.no.classes.specified"); + } + + if (noArgs || options.help) + showHelp(); + + if (options.version || options.fullVersion) + showVersion(options.fullVersion); + } + + private void handleOption(String name, Iterator<String> rest) throws BadArgs { + for (Option o: recognizedOptions) { + if (o.matches(name)) { + if (o.hasArg) { + if (rest.hasNext()) + o.process(this, name, rest.next()); + else + throw new BadArgs("err.missing.arg", name).showUsage(true); + } else + o.process(this, name, null); + + if (o.ignoreRest()) { + while (rest.hasNext()) + rest.next(); + } + return; + } + } + + try { + if (fileManager.handleOption(name, rest)) + return; + } catch (IllegalArgumentException e) { + throw new BadArgs("err.invalid.use.of.option", name).showUsage(true); + } + + throw new BadArgs("err.unknown.option", name).showUsage(true); + } + + public Boolean call() { + return run() == 0; + } + + public int run() { + if (classes == null || classes.isEmpty()) { + return EXIT_ERROR; + } + + context.put(PrintWriter.class, log); + ClassWriter classWriter = ClassWriter.instance(context); + SourceWriter sourceWriter = SourceWriter.instance(context); + sourceWriter.setFileManager(fileManager); + + int result = EXIT_OK; + + for (String className: classes) { + try { + result = writeClass(classWriter, className); + } catch (ConstantPoolException e) { + reportError("err.bad.constant.pool", className, e.getLocalizedMessage()); + result = EXIT_ERROR; + } catch (EOFException e) { + reportError("err.end.of.file", className); + result = EXIT_ERROR; + } catch (FileNotFoundException | NoSuchFileException e) { + reportError("err.file.not.found", e.getLocalizedMessage()); + result = EXIT_ERROR; + } catch (IOException e) { + //e.printStackTrace(); + Object msg = e.getLocalizedMessage(); + if (msg == null) { + msg = e; + } + reportError("err.ioerror", className, msg); + result = EXIT_ERROR; + } catch (OutOfMemoryError e) { + reportError("err.nomem"); + result = EXIT_ERROR; + } catch (Throwable t) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + t.printStackTrace(pw); + pw.close(); + reportError("err.crash", t.toString(), sw.toString()); + result = EXIT_ABNORMAL; + } + } + + return result; + } + + protected int writeClass(ClassWriter classWriter, String className) + throws IOException, ConstantPoolException { + JavaFileObject fo = open(className); + if (fo == null) { + reportError("err.class.not.found", className); + return EXIT_ERROR; + } + + ClassFileInfo cfInfo = read(fo); + if (!className.endsWith(".class")) { + String cfName = cfInfo.cf.getName(); + if (!cfName.replaceAll("[/$]", ".").equals(className.replaceAll("[/$]", "."))) { + reportWarning("warn.unexpected.class", className, cfName.replace('/', '.')); + } + } + write(cfInfo); + + if (options.showInnerClasses) { + ClassFile cf = cfInfo.cf; + Attribute a = cf.getAttribute(Attribute.InnerClasses); + if (a instanceof InnerClasses_attribute) { + InnerClasses_attribute inners = (InnerClasses_attribute) a; + try { + int result = EXIT_OK; + for (int i = 0; i < inners.classes.length; i++) { + int outerIndex = inners.classes[i].outer_class_info_index; + ConstantPool.CONSTANT_Class_info outerClassInfo = cf.constant_pool.getClassInfo(outerIndex); + String outerClassName = outerClassInfo.getName(); + if (outerClassName.equals(cf.getName())) { + int innerIndex = inners.classes[i].inner_class_info_index; + ConstantPool.CONSTANT_Class_info innerClassInfo = cf.constant_pool.getClassInfo(innerIndex); + String innerClassName = innerClassInfo.getName(); + classWriter.println("// inner class " + innerClassName.replaceAll("[/$]", ".")); + classWriter.println(); + result = writeClass(classWriter, innerClassName); + if (result != EXIT_OK) return result; + } + } + return result; + } catch (ConstantPoolException e) { + reportError("err.bad.innerclasses.attribute", className); + return EXIT_ERROR; + } + } else if (a != null) { + reportError("err.bad.innerclasses.attribute", className); + return EXIT_ERROR; + } + } + + return EXIT_OK; + } + + protected JavaFileObject open(String className) throws IOException { + // for compatibility, first see if it is a class name + JavaFileObject fo = getClassFileObject(className); + if (fo != null) + return fo; + + // see if it is an inner class, by replacing dots to $, starting from the right + String cn = className; + int lastDot; + while ((lastDot = cn.lastIndexOf(".")) != -1) { + cn = cn.substring(0, lastDot) + "$" + cn.substring(lastDot + 1); + fo = getClassFileObject(cn); + if (fo != null) + return fo; + } + + if (!className.endsWith(".class")) + return null; + + if (fileManager instanceof StandardJavaFileManager) { + StandardJavaFileManager sfm = (StandardJavaFileManager) fileManager; + try { + fo = sfm.getJavaFileObjects(className).iterator().next(); + if (fo != null && fo.getLastModified() != 0) { + return fo; + } + } catch (IllegalArgumentException ignore) { + } + } + + // see if it is a URL, and if so, wrap it in just enough of a JavaFileObject + // to suit javap's needs + if (className.matches("^[A-Za-z]+:.*")) { + try { + final URI uri = new URI(className); + final URL url = uri.toURL(); + final URLConnection conn = url.openConnection(); + conn.setUseCaches(false); + return new JavaFileObject() { + @DefinedBy(Api.COMPILER) + public Kind getKind() { + return JavaFileObject.Kind.CLASS; + } + + @DefinedBy(Api.COMPILER) + public boolean isNameCompatible(String simpleName, Kind kind) { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public NestingKind getNestingKind() { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public Modifier getAccessLevel() { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public URI toUri() { + return uri; + } + + @DefinedBy(Api.COMPILER) + public String getName() { + return uri.toString(); + } + + @DefinedBy(Api.COMPILER) + public InputStream openInputStream() throws IOException { + return conn.getInputStream(); + } + + @DefinedBy(Api.COMPILER) + public OutputStream openOutputStream() throws IOException { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public Reader openReader(boolean ignoreEncodingErrors) throws IOException { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public Writer openWriter() throws IOException { + throw new UnsupportedOperationException(); + } + + @DefinedBy(Api.COMPILER) + public long getLastModified() { + return conn.getLastModified(); + } + + @DefinedBy(Api.COMPILER) + public boolean delete() { + throw new UnsupportedOperationException(); + } + + }; + } catch (URISyntaxException | IOException ignore) { + } + } + + return null; + } + + public static class ClassFileInfo { + ClassFileInfo(JavaFileObject fo, ClassFile cf, byte[] digest, int size) { + this.fo = fo; + this.cf = cf; + this.digest = digest; + this.size = size; + } + public final JavaFileObject fo; + public final ClassFile cf; + public final byte[] digest; + public final int size; + } + + public ClassFileInfo read(JavaFileObject fo) throws IOException, ConstantPoolException { + InputStream in = fo.openInputStream(); + try { + SizeInputStream sizeIn = null; + MessageDigest md = null; + if (options.sysInfo || options.verbose) { + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException ignore) { + } + in = new DigestInputStream(in, md); + in = sizeIn = new SizeInputStream(in); + } + + ClassFile cf = ClassFile.read(in, attributeFactory); + byte[] digest = (md == null) ? null : md.digest(); + int size = (sizeIn == null) ? -1 : sizeIn.size(); + return new ClassFileInfo(fo, cf, digest, size); + } finally { + in.close(); + } + } + + public void write(ClassFileInfo info) { + ClassWriter classWriter = ClassWriter.instance(context); + if (options.sysInfo || options.verbose) { + classWriter.setFile(info.fo.toUri()); + classWriter.setLastModified(info.fo.getLastModified()); + classWriter.setDigest("MD5", info.digest); + classWriter.setFileSize(info.size); + } + + classWriter.write(info.cf); + } + + protected void setClassFile(ClassFile classFile) { + ClassWriter classWriter = ClassWriter.instance(context); + classWriter.setClassFile(classFile); + } + + protected void setMethod(Method enclosingMethod) { + ClassWriter classWriter = ClassWriter.instance(context); + classWriter.setMethod(enclosingMethod); + } + + protected void write(Attribute value) { + AttributeWriter attrWriter = AttributeWriter.instance(context); + ClassWriter classWriter = ClassWriter.instance(context); + ClassFile cf = classWriter.getClassFile(); + attrWriter.write(cf, value, cf.constant_pool); + } + + protected void write(Attributes attrs) { + AttributeWriter attrWriter = AttributeWriter.instance(context); + ClassWriter classWriter = ClassWriter.instance(context); + ClassFile cf = classWriter.getClassFile(); + attrWriter.write(cf, attrs, cf.constant_pool); + } + + protected void write(ConstantPool constant_pool) { + ConstantWriter constantWriter = ConstantWriter.instance(context); + constantWriter.writeConstantPool(constant_pool); + } + + protected void write(ConstantPool constant_pool, int value) { + ConstantWriter constantWriter = ConstantWriter.instance(context); + constantWriter.write(value); + } + + protected void write(ConstantPool.CPInfo value) { + ConstantWriter constantWriter = ConstantWriter.instance(context); + constantWriter.println(value); + } + + protected void write(Field value) { + ClassWriter classWriter = ClassWriter.instance(context); + classWriter.writeField(value); + } + + protected void write(Method value) { + ClassWriter classWriter = ClassWriter.instance(context); + classWriter.writeMethod(value); + } + + private JavaFileManager getDefaultFileManager(final DiagnosticListener<? super JavaFileObject> dl, PrintWriter log) { + if (defaultFileManager == null) + defaultFileManager = JavapFileManager.create(dl, log); + return defaultFileManager; + } + + private JavaFileObject getClassFileObject(String className) throws IOException { + try { + JavaFileObject fo; + fo = fileManager.getJavaFileForInput(StandardLocation.PLATFORM_CLASS_PATH, className, JavaFileObject.Kind.CLASS); + if (fo == null) + fo = fileManager.getJavaFileForInput(StandardLocation.CLASS_PATH, className, JavaFileObject.Kind.CLASS); + return fo; + } catch (IllegalArgumentException e) { + return null; + } + } + + private void showHelp() { + printLines(getMessage("main.usage", progname)); + for (Option o: recognizedOptions) { + String name = o.aliases[0].substring(1); // there must always be at least one name + if (name.startsWith("X") || name.equals("fullversion") || name.equals("h") || name.equals("verify")) + continue; + printLines(getMessage("main.opt." + name)); + } + String[] fmOptions = { "-classpath", "-cp", "-bootclasspath" }; + for (String o: fmOptions) { + if (fileManager.isSupportedOption(o) == -1) + continue; + String name = o.substring(1); + printLines(getMessage("main.opt." + name)); + } + + } + + private void showVersion(boolean full) { + printLines(version(full ? "full" : "release")); + } + + private void printLines(String msg) { + log.println(msg.replace("\n", nl)); + } + + private static final String nl = System.getProperty("line.separator"); + + private static final String versionRBName = "com.sun.tools.javap.resources.version"; + private static ResourceBundle versionRB; + + private String version(String key) { + // key=version: mm.nn.oo[-milestone] + // key=full: mm.mm.oo[-milestone]-build + if (versionRB == null) { + try { + versionRB = ResourceBundle.getBundle(versionRBName); + } catch (MissingResourceException e) { + return getMessage("version.resource.missing", System.getProperty("java.version")); + } + } + try { + return versionRB.getString(key); + } + catch (MissingResourceException e) { + return getMessage("version.unknown", System.getProperty("java.version")); + } + } + + private void reportError(String key, Object... args) { + diagnosticListener.report(createDiagnostic(Diagnostic.Kind.ERROR, key, args)); + } + + private void reportNote(String key, Object... args) { + diagnosticListener.report(createDiagnostic(Diagnostic.Kind.NOTE, key, args)); + } + + private void reportWarning(String key, Object... args) { + diagnosticListener.report(createDiagnostic(Diagnostic.Kind.WARNING, key, args)); + } + + private Diagnostic<JavaFileObject> createDiagnostic( + final Diagnostic.Kind kind, final String key, final Object... args) { + return new Diagnostic<JavaFileObject>() { + @DefinedBy(Api.COMPILER) + public Kind getKind() { + return kind; + } + + @DefinedBy(Api.COMPILER) + public JavaFileObject getSource() { + return null; + } + + @DefinedBy(Api.COMPILER) + public long getPosition() { + return Diagnostic.NOPOS; + } + + @DefinedBy(Api.COMPILER) + public long getStartPosition() { + return Diagnostic.NOPOS; + } + + @DefinedBy(Api.COMPILER) + public long getEndPosition() { + return Diagnostic.NOPOS; + } + + @DefinedBy(Api.COMPILER) + public long getLineNumber() { + return Diagnostic.NOPOS; + } + + @DefinedBy(Api.COMPILER) + public long getColumnNumber() { + return Diagnostic.NOPOS; + } + + @DefinedBy(Api.COMPILER) + public String getCode() { + return key; + } + + @DefinedBy(Api.COMPILER) + public String getMessage(Locale locale) { + return JavapTask.this.getMessage(locale, key, args); + } + + @Override + public String toString() { + return getClass().getName() + "[key=" + key + ",args=" + Arrays.asList(args) + "]"; + } + + }; + + } + + public String getMessage(String key, Object... args) { + return getMessage(task_locale, key, args); + } + + public String getMessage(Locale locale, String key, Object... args) { + if (bundles == null) { + // could make this a HashMap<Locale,SoftReference<ResourceBundle>> + // and for efficiency, keep a hard reference to the bundle for the task + // locale + bundles = new HashMap<>(); + } + + if (locale == null) + locale = Locale.getDefault(); + + ResourceBundle b = bundles.get(locale); + if (b == null) { + try { + b = ResourceBundle.getBundle("com.sun.tools.javap.resources.javap", locale); + bundles.put(locale, b); + } catch (MissingResourceException e) { + throw new InternalError("Cannot find javap resource bundle for locale " + locale); + } + } + + try { + return MessageFormat.format(b.getString(key), args); + } catch (MissingResourceException e) { + throw new InternalError(e, key); + } + } + + protected Context context; + JavaFileManager fileManager; + JavaFileManager defaultFileManager; + PrintWriter log; + DiagnosticListener<? super JavaFileObject> diagnosticListener; + List<String> classes; + Options options; + //ResourceBundle bundle; + Locale task_locale; + Map<Locale, ResourceBundle> bundles; + protected Attribute.Factory attributeFactory; + + private static final String progname = "javap"; + + private static class SizeInputStream extends FilterInputStream { + SizeInputStream(InputStream in) { + super(in); + } + + int size() { + return size; + } + + @Override + public int read(byte[] buf, int offset, int length) throws IOException { + int n = super.read(buf, offset, length); + if (n > 0) + size += n; + return n; + } + + @Override + public int read() throws IOException { + int b = super.read(); + size += 1; + return b; + } + + private int size; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/LocalVariableTableWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Descriptor; +import com.sun.tools.classfile.Descriptor.InvalidDescriptor; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.LocalVariableTable_attribute; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +/** + * Annotate instructions with details about local variables. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class LocalVariableTableWriter extends InstructionDetailWriter { + public enum NoteKind { + START("start") { + public boolean match(LocalVariableTable_attribute.Entry entry, int pc) { + return (pc == entry.start_pc); + } + }, + END("end") { + public boolean match(LocalVariableTable_attribute.Entry entry, int pc) { + return (pc == entry.start_pc + entry.length); + } + }; + NoteKind(String text) { + this.text = text; + } + public abstract boolean match(LocalVariableTable_attribute.Entry entry, int pc); + public final String text; + } + + static LocalVariableTableWriter instance(Context context) { + LocalVariableTableWriter instance = context.get(LocalVariableTableWriter.class); + if (instance == null) + instance = new LocalVariableTableWriter(context); + return instance; + } + + protected LocalVariableTableWriter(Context context) { + super(context); + context.put(LocalVariableTableWriter.class, this); + classWriter = ClassWriter.instance(context); + } + + public void reset(Code_attribute attr) { + codeAttr = attr; + pcMap = new HashMap<>(); + LocalVariableTable_attribute lvt = + (LocalVariableTable_attribute) (attr.attributes.get(Attribute.LocalVariableTable)); + if (lvt == null) + return; + + for (int i = 0; i < lvt.local_variable_table.length; i++) { + LocalVariableTable_attribute.Entry entry = lvt.local_variable_table[i]; + put(entry.start_pc, entry); + put(entry.start_pc + entry.length, entry); + } + } + + public void writeDetails(Instruction instr) { + int pc = instr.getPC(); + writeLocalVariables(pc, NoteKind.END); + writeLocalVariables(pc, NoteKind.START); + } + + @Override + public void flush() { + int pc = codeAttr.code_length; + writeLocalVariables(pc, NoteKind.END); + } + + public void writeLocalVariables(int pc, NoteKind kind) { + ConstantPool constant_pool = classWriter.getClassFile().constant_pool; + String indent = space(2); // get from Options? + List<LocalVariableTable_attribute.Entry> entries = pcMap.get(pc); + if (entries != null) { + for (ListIterator<LocalVariableTable_attribute.Entry> iter = + entries.listIterator(kind == NoteKind.END ? entries.size() : 0); + kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { + LocalVariableTable_attribute.Entry entry = + kind == NoteKind.END ? iter.previous() : iter.next(); + if (kind.match(entry, pc)) { + print(indent); + print(kind.text); + print(" local "); + print(entry.index); + print(" // "); + Descriptor d = new Descriptor(entry.descriptor_index); + try { + print(d.getFieldType(constant_pool)); + } catch (InvalidDescriptor e) { + print(report(e)); + } catch (ConstantPoolException e) { + print(report(e)); + } + print(" "); + try { + print(constant_pool.getUTF8Value(entry.name_index)); + } catch (ConstantPoolException e) { + print(report(e)); + } + println(); + } + } + } + } + + private void put(int pc, LocalVariableTable_attribute.Entry entry) { + List<LocalVariableTable_attribute.Entry> list = pcMap.get(pc); + if (list == null) { + list = new ArrayList<>(); + pcMap.put(pc, list); + } + if (!list.contains(entry)) + list.add(entry); + } + + private ClassWriter classWriter; + private Code_attribute codeAttr; + private Map<Integer, List<LocalVariableTable_attribute.Entry>> pcMap; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/LocalVariableTypeTableWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Descriptor; +import com.sun.tools.classfile.Descriptor.InvalidDescriptor; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.LocalVariableTypeTable_attribute; +import com.sun.tools.classfile.Signature; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +/** + * Annotate instructions with details about local variables. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class LocalVariableTypeTableWriter extends InstructionDetailWriter { + public enum NoteKind { + START("start") { + public boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc) { + return (pc == entry.start_pc); + } + }, + END("end") { + public boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc) { + return (pc == entry.start_pc + entry.length); + } + }; + NoteKind(String text) { + this.text = text; + } + public abstract boolean match(LocalVariableTypeTable_attribute.Entry entry, int pc); + public final String text; + } + + static LocalVariableTypeTableWriter instance(Context context) { + LocalVariableTypeTableWriter instance = context.get(LocalVariableTypeTableWriter.class); + if (instance == null) + instance = new LocalVariableTypeTableWriter(context); + return instance; + } + + protected LocalVariableTypeTableWriter(Context context) { + super(context); + context.put(LocalVariableTypeTableWriter.class, this); + classWriter = ClassWriter.instance(context); + } + + public void reset(Code_attribute attr) { + codeAttr = attr; + pcMap = new HashMap<>(); + LocalVariableTypeTable_attribute lvt = + (LocalVariableTypeTable_attribute) (attr.attributes.get(Attribute.LocalVariableTypeTable)); + if (lvt == null) + return; + + for (int i = 0; i < lvt.local_variable_table.length; i++) { + LocalVariableTypeTable_attribute.Entry entry = lvt.local_variable_table[i]; + put(entry.start_pc, entry); + put(entry.start_pc + entry.length, entry); + } + } + + public void writeDetails(Instruction instr) { + int pc = instr.getPC(); + writeLocalVariables(pc, NoteKind.END); + writeLocalVariables(pc, NoteKind.START); + } + + @Override + public void flush() { + int pc = codeAttr.code_length; + writeLocalVariables(pc, NoteKind.END); + } + + public void writeLocalVariables(int pc, NoteKind kind) { + ConstantPool constant_pool = classWriter.getClassFile().constant_pool; + String indent = space(2); // get from Options? + List<LocalVariableTypeTable_attribute.Entry> entries = pcMap.get(pc); + if (entries != null) { + for (ListIterator<LocalVariableTypeTable_attribute.Entry> iter = + entries.listIterator(kind == NoteKind.END ? entries.size() : 0); + kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { + LocalVariableTypeTable_attribute.Entry entry = + kind == NoteKind.END ? iter.previous() : iter.next(); + if (kind.match(entry, pc)) { + print(indent); + print(kind.text); + print(" generic local "); + print(entry.index); + print(" // "); + Descriptor d = new Signature(entry.signature_index); + try { + print(d.getFieldType(constant_pool).toString().replace("/", ".")); + } catch (InvalidDescriptor e) { + print(report(e)); + } catch (ConstantPoolException e) { + print(report(e)); + } + print(" "); + try { + print(constant_pool.getUTF8Value(entry.name_index)); + } catch (ConstantPoolException e) { + print(report(e)); + } + println(); + } + } + } + } + + private void put(int pc, LocalVariableTypeTable_attribute.Entry entry) { + List<LocalVariableTypeTable_attribute.Entry> list = pcMap.get(pc); + if (list == null) { + list = new ArrayList<>(); + pcMap.put(pc, list); + } + if (!list.contains(entry)) + list.add(entry); + } + + private ClassWriter classWriter; + private Code_attribute codeAttr; + private Map<Integer, List<LocalVariableTypeTable_attribute.Entry>> pcMap; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/Main.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.io.PrintWriter; + +/** + * Main entry point. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Main { + /** + * Main entry point for the launcher. + * Note: This method calls System.exit. + * @param args command line arguments + */ + public static void main(String[] args) { + JavapTask t = new JavapTask(); + int rc = t.run(args); + System.exit(rc); + } + + /** + * Entry point that does <i>not</i> call System.exit. + * @param args command line arguments + * @param out output stream + * @return an exit code. 0 means success, non-zero means an error occurred. + */ + public static int run(String[] args, PrintWriter out) { + JavapTask t = new JavapTask(); + t.setLog(out); + return t.run(args); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/Messages.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.Locale; + +/** + * Access to javap messages. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public interface Messages { + String getMessage(String key, Object... args); + + String getMessage(Locale locale, String key, Object... args); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/Options.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; + +import com.sun.tools.classfile.AccessFlags; + +/* + * Provides access to javap's options, set via the command line + * or JSR 199 API. + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class Options { + public static Options instance(Context context) { + Options instance = context.get(Options.class); + if (instance == null) + instance = new Options(context); + return instance; + } + + protected Options(Context context) { + context.put(Options.class, this); + } + + /** + * Checks access of class, field or method. + */ + public boolean checkAccess(AccessFlags flags){ + + boolean isPublic = flags.is(AccessFlags.ACC_PUBLIC); + boolean isProtected = flags.is(AccessFlags.ACC_PROTECTED); + boolean isPrivate = flags.is(AccessFlags.ACC_PRIVATE); + boolean isPackage = !(isPublic || isProtected || isPrivate); + + if ((showAccess == AccessFlags.ACC_PUBLIC) && (isProtected || isPrivate || isPackage)) + return false; + else if ((showAccess == AccessFlags.ACC_PROTECTED) && (isPrivate || isPackage)) + return false; + else if ((showAccess == 0) && (isPrivate)) + return false; + else + return true; + } + + public boolean help; + public boolean verbose; + public boolean version; + public boolean fullVersion; + public boolean showFlags; + public boolean showLineAndLocalVariableTables; + public int showAccess; + public Set<String> accessOptions = new HashSet<>(); + public Set<InstructionDetailWriter.Kind> details = EnumSet.noneOf(InstructionDetailWriter.Kind.class); + public boolean showDisassembled; + public boolean showDescriptors; + public boolean showAllAttrs; + public boolean showConstants; + public boolean sysInfo; + public boolean showInnerClasses; + public int indentWidth = 2; // #spaces per indentWidth level; must be > 0 + public int tabColumn = 40; // column number for comments; must be > 0 +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/SourceWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileManager.Location; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.LineNumberTable_attribute; +import com.sun.tools.classfile.SourceFile_attribute; + + +/** + * Annotate instructions with source code. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class SourceWriter extends InstructionDetailWriter { + static SourceWriter instance(Context context) { + SourceWriter instance = context.get(SourceWriter.class); + if (instance == null) + instance = new SourceWriter(context); + return instance; + } + + protected SourceWriter(Context context) { + super(context); + context.put(SourceWriter.class, this); + } + + void setFileManager(JavaFileManager fileManager) { + this.fileManager = fileManager; + } + + public void reset(ClassFile cf, Code_attribute attr) { + setSource(cf); + setLineMap(attr); + } + + public void writeDetails(Instruction instr) { + String indent = space(40); // could get from Options? + Set<Integer> lines = lineMap.get(instr.getPC()); + if (lines != null) { + for (int line: lines) { + print(indent); + print(String.format(" %4d ", line)); + if (line < sourceLines.length) + print(sourceLines[line]); + println(); + int nextLine = nextLine(line); + for (int i = line + 1; i < nextLine; i++) { + print(indent); + print(String.format("(%4d)", i)); + if (i < sourceLines.length) + print(sourceLines[i]); + println(); + } + } + } + } + + public boolean hasSource() { + return (sourceLines.length > 0); + } + + private void setLineMap(Code_attribute attr) { + SortedMap<Integer, SortedSet<Integer>> map = new TreeMap<>(); + SortedSet<Integer> allLines = new TreeSet<>(); + for (Attribute a: attr.attributes) { + if (a instanceof LineNumberTable_attribute) { + LineNumberTable_attribute t = (LineNumberTable_attribute) a; + for (LineNumberTable_attribute.Entry e: t.line_number_table) { + int start_pc = e.start_pc; + int line = e.line_number; + SortedSet<Integer> pcLines = map.get(start_pc); + if (pcLines == null) { + pcLines = new TreeSet<>(); + map.put(start_pc, pcLines); + } + pcLines.add(line); + allLines.add(line); + } + } + } + lineMap = map; + lineList = new ArrayList<>(allLines); + } + + private void setSource(ClassFile cf) { + if (cf != classFile) { + classFile = cf; + sourceLines = splitLines(readSource(cf)); + } + } + + private String readSource(ClassFile cf) { + if (fileManager == null) + return null; + + Location location; + if (fileManager.hasLocation((StandardLocation.SOURCE_PATH))) + location = StandardLocation.SOURCE_PATH; + else + location = StandardLocation.CLASS_PATH; + + // Guess the source file for a class from the package name for this + // class and the base of the source file. This avoids having to read + // additional classes to determine the outmost class from any + // InnerClasses and EnclosingMethod attributes. + try { + String className = cf.getName(); + SourceFile_attribute sf = + (SourceFile_attribute) cf.attributes.get(Attribute.SourceFile); + if (sf == null) { + report(messages.getMessage("err.no.SourceFile.attribute")); + return null; + } + String sourceFile = sf.getSourceFile(cf.constant_pool); + String fileBase = sourceFile.endsWith(".java") + ? sourceFile.substring(0, sourceFile.length() - 5) : sourceFile; + int sep = className.lastIndexOf("/"); + String pkgName = (sep == -1 ? "" : className.substring(0, sep+1)); + String topClassName = (pkgName + fileBase).replace('/', '.'); + JavaFileObject fo = + fileManager.getJavaFileForInput(location, + topClassName, + JavaFileObject.Kind.SOURCE); + if (fo == null) { + report(messages.getMessage("err.source.file.not.found")); + return null; + } + return fo.getCharContent(true).toString(); + } catch (ConstantPoolException e) { + report(e); + return null; + } catch (IOException e) { + report(e.getLocalizedMessage()); + return null; + } + } + + private static String[] splitLines(String text) { + if (text == null) + return new String[0]; + + List<String> lines = new ArrayList<>(); + lines.add(""); // dummy line 0 + try { + BufferedReader r = new BufferedReader(new StringReader(text)); + String line; + while ((line = r.readLine()) != null) + lines.add(line); + } catch (IOException ignore) { + } + return lines.toArray(new String[lines.size()]); + } + + private int nextLine(int line) { + int i = lineList.indexOf(line); + if (i == -1 || i == lineList.size() - 1) + return - 1; + return lineList.get(i + 1); + } + + private JavaFileManager fileManager; + private ClassFile classFile; + private SortedMap<Integer, SortedSet<Integer>> lineMap; + private List<Integer> lineList; + private String[] sourceLines; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/StackMapWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.ConstantPool; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Descriptor; +import com.sun.tools.classfile.Descriptor.InvalidDescriptor; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.Method; +import com.sun.tools.classfile.StackMapTable_attribute; +import com.sun.tools.classfile.StackMapTable_attribute.*; + +import static com.sun.tools.classfile.StackMapTable_attribute.verification_type_info.*; + +/** + * Annotate instructions with stack map. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class StackMapWriter extends InstructionDetailWriter { + static StackMapWriter instance(Context context) { + StackMapWriter instance = context.get(StackMapWriter.class); + if (instance == null) + instance = new StackMapWriter(context); + return instance; + } + + protected StackMapWriter(Context context) { + super(context); + context.put(StackMapWriter.class, this); + classWriter = ClassWriter.instance(context); + } + + public void reset(Code_attribute attr) { + setStackMap((StackMapTable_attribute) attr.attributes.get(Attribute.StackMapTable)); + } + + void setStackMap(StackMapTable_attribute attr) { + if (attr == null) { + map = null; + return; + } + + Method m = classWriter.getMethod(); + Descriptor d = m.descriptor; + String[] args; + try { + ConstantPool cp = classWriter.getClassFile().constant_pool; + String argString = d.getParameterTypes(cp); + args = argString.substring(1, argString.length() - 1).split("[, ]+"); + } catch (ConstantPoolException | InvalidDescriptor e) { + return; + } + boolean isStatic = m.access_flags.is(AccessFlags.ACC_STATIC); + + verification_type_info[] initialLocals = new verification_type_info[(isStatic ? 0 : 1) + args.length]; + if (!isStatic) + initialLocals[0] = new CustomVerificationTypeInfo("this"); + for (int i = 0; i < args.length; i++) { + initialLocals[(isStatic ? 0 : 1) + i] = + new CustomVerificationTypeInfo(args[i].replace(".", "/")); + } + + map = new HashMap<>(); + StackMapBuilder builder = new StackMapBuilder(); + + // using -1 as the pc for the initial frame effectively compensates for + // the difference in behavior for the first stack map frame (where the + // pc offset is just offset_delta) compared to subsequent frames (where + // the pc offset is always offset_delta+1). + int pc = -1; + + map.put(pc, new StackMap(initialLocals, empty)); + + for (int i = 0; i < attr.entries.length; i++) + pc = attr.entries[i].accept(builder, pc); + } + + public void writeInitialDetails() { + writeDetails(-1); + } + + public void writeDetails(Instruction instr) { + writeDetails(instr.getPC()); + } + + private void writeDetails(int pc) { + if (map == null) + return; + + StackMap m = map.get(pc); + if (m != null) { + print("StackMap locals: ", m.locals); + print("StackMap stack: ", m.stack); + } + + } + + void print(String label, verification_type_info[] entries) { + print(label); + for (int i = 0; i < entries.length; i++) { + print(" "); + print(entries[i]); + } + println(); + } + + void print(verification_type_info entry) { + if (entry == null) { + print("ERROR"); + return; + } + + switch (entry.tag) { + case -1: + print(((CustomVerificationTypeInfo) entry).text); + break; + + case ITEM_Top: + print("top"); + break; + + case ITEM_Integer: + print("int"); + break; + + case ITEM_Float: + print("float"); + break; + + case ITEM_Long: + print("long"); + break; + + case ITEM_Double: + print("double"); + break; + + case ITEM_Null: + print("null"); + break; + + case ITEM_UninitializedThis: + print("uninit_this"); + break; + + case ITEM_Object: + try { + ConstantPool cp = classWriter.getClassFile().constant_pool; + ConstantPool.CONSTANT_Class_info class_info = cp.getClassInfo(((Object_variable_info) entry).cpool_index); + print(cp.getUTF8Value(class_info.name_index)); + } catch (ConstantPoolException e) { + print("??"); + } + break; + + case ITEM_Uninitialized: + print(((Uninitialized_variable_info) entry).offset); + break; + } + + } + + private Map<Integer, StackMap> map; + private ClassWriter classWriter; + + class StackMapBuilder + implements StackMapTable_attribute.stack_map_frame.Visitor<Integer, Integer> { + + public Integer visit_same_frame(same_frame frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap m = map.get(pc); + assert (m != null); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_same_locals_1_stack_item_frame(same_locals_1_stack_item_frame frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap prev = map.get(pc); + assert (prev != null); + StackMap m = new StackMap(prev.locals, frame.stack); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_same_locals_1_stack_item_frame_extended(same_locals_1_stack_item_frame_extended frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap prev = map.get(pc); + assert (prev != null); + StackMap m = new StackMap(prev.locals, frame.stack); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_chop_frame(chop_frame frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap prev = map.get(pc); + assert (prev != null); + int k = 251 - frame.frame_type; + verification_type_info[] new_locals = Arrays.copyOf(prev.locals, prev.locals.length - k); + StackMap m = new StackMap(new_locals, empty); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_same_frame_extended(same_frame_extended frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta(); + StackMap m = map.get(pc); + assert (m != null); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_append_frame(append_frame frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap prev = map.get(pc); + assert (prev != null); + verification_type_info[] new_locals = new verification_type_info[prev.locals.length + frame.locals.length]; + System.arraycopy(prev.locals, 0, new_locals, 0, prev.locals.length); + System.arraycopy(frame.locals, 0, new_locals, prev.locals.length, frame.locals.length); + StackMap m = new StackMap(new_locals, empty); + map.put(new_pc, m); + return new_pc; + } + + public Integer visit_full_frame(full_frame frame, Integer pc) { + int new_pc = pc + frame.getOffsetDelta() + 1; + StackMap m = new StackMap(frame.locals, frame.stack); + map.put(new_pc, m); + return new_pc; + } + + } + + static class StackMap { + StackMap(verification_type_info[] locals, verification_type_info[] stack) { + this.locals = locals; + this.stack = stack; + } + + private final verification_type_info[] locals; + private final verification_type_info[] stack; + } + + static class CustomVerificationTypeInfo extends verification_type_info { + public CustomVerificationTypeInfo(String text) { + super(-1); + this.text = text; + } + private String text; + } + + private final verification_type_info[] empty = { }; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/TryBlockWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javap; + +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.Code_attribute.Exception_data; +import com.sun.tools.classfile.Instruction; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +/** + * Annotate instructions with details about try blocks. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class TryBlockWriter extends InstructionDetailWriter { + public enum NoteKind { + START("try") { + public boolean match(Exception_data entry, int pc) { + return (pc == entry.start_pc); + } + }, + END("end try") { + public boolean match(Exception_data entry, int pc) { + return (pc == entry.end_pc); + } + }, + HANDLER("catch") { + public boolean match(Exception_data entry, int pc) { + return (pc == entry.handler_pc); + } + }; + NoteKind(String text) { + this.text = text; + } + public abstract boolean match(Exception_data entry, int pc); + public final String text; + } + + static TryBlockWriter instance(Context context) { + TryBlockWriter instance = context.get(TryBlockWriter.class); + if (instance == null) + instance = new TryBlockWriter(context); + return instance; + } + + protected TryBlockWriter(Context context) { + super(context); + context.put(TryBlockWriter.class, this); + constantWriter = ConstantWriter.instance(context); + } + + public void reset(Code_attribute attr) { + indexMap = new HashMap<>(); + pcMap = new HashMap<>(); + for (int i = 0; i < attr.exception_table.length; i++) { + Exception_data entry = attr.exception_table[i]; + indexMap.put(entry, i); + put(entry.start_pc, entry); + put(entry.end_pc, entry); + put(entry.handler_pc, entry); + } + } + + public void writeDetails(Instruction instr) { + writeTrys(instr, NoteKind.END); + writeTrys(instr, NoteKind.START); + writeTrys(instr, NoteKind.HANDLER); + } + + public void writeTrys(Instruction instr, NoteKind kind) { + String indent = space(2); // get from Options? + int pc = instr.getPC(); + List<Exception_data> entries = pcMap.get(pc); + if (entries != null) { + for (ListIterator<Exception_data> iter = + entries.listIterator(kind == NoteKind.END ? entries.size() : 0); + kind == NoteKind.END ? iter.hasPrevious() : iter.hasNext() ; ) { + Exception_data entry = + kind == NoteKind.END ? iter.previous() : iter.next(); + if (kind.match(entry, pc)) { + print(indent); + print(kind.text); + print("["); + print(indexMap.get(entry)); + print("] "); + if (entry.catch_type == 0) + print("finally"); + else { + print("#" + entry.catch_type); + print(" // "); + constantWriter.write(entry.catch_type); + } + println(); + } + } + } + } + + private void put(int pc, Exception_data entry) { + List<Exception_data> list = pcMap.get(pc); + if (list == null) { + list = new ArrayList<>(); + pcMap.put(pc, list); + } + if (!list.contains(entry)) + list.add(entry); + } + + private Map<Integer, List<Exception_data>> pcMap; + private Map<Exception_data, Integer> indexMap; + private ConstantWriter constantWriter; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.javap; + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.Code_attribute; +import com.sun.tools.classfile.TypeAnnotation; +import com.sun.tools.classfile.TypeAnnotation.Position; +import com.sun.tools.classfile.Instruction; +import com.sun.tools.classfile.Method; +import com.sun.tools.classfile.RuntimeInvisibleTypeAnnotations_attribute; +import com.sun.tools.classfile.RuntimeTypeAnnotations_attribute; +import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.sun.tools.javac.util.StringUtils; + +/** + * Annotate instructions with details about type annotations. + * + * <p><b>This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice.</b> + */ +public class TypeAnnotationWriter extends InstructionDetailWriter { + public enum NoteKind { VISIBLE, INVISIBLE } + + public static class Note { + Note(NoteKind kind, TypeAnnotation anno) { + this.kind = kind; + this.anno = anno; + } + public final NoteKind kind; + public final TypeAnnotation anno; + } + + static TypeAnnotationWriter instance(Context context) { + TypeAnnotationWriter instance = context.get(TypeAnnotationWriter.class); + if (instance == null) + instance = new TypeAnnotationWriter(context); + return instance; + } + + protected TypeAnnotationWriter(Context context) { + super(context); + context.put(TypeAnnotationWriter.class, this); + annotationWriter = AnnotationWriter.instance(context); + classWriter = ClassWriter.instance(context); + } + + public void reset(Code_attribute attr) { + Method m = classWriter.getMethod(); + pcMap = new HashMap<>(); + check(NoteKind.VISIBLE, (RuntimeVisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeVisibleTypeAnnotations)); + check(NoteKind.INVISIBLE, (RuntimeInvisibleTypeAnnotations_attribute) m.attributes.get(Attribute.RuntimeInvisibleTypeAnnotations)); + } + + private void check(NoteKind kind, RuntimeTypeAnnotations_attribute attr) { + if (attr == null) + return; + + for (TypeAnnotation anno: attr.annotations) { + Position p = anno.position; + Note note = null; + if (p.offset != -1) + addNote(p.offset, note = new Note(kind, anno)); + if (p.lvarOffset != null) { + for (int i = 0; i < p.lvarOffset.length; i++) { + if (note == null) + note = new Note(kind, anno); + addNote(p.lvarOffset[i], note); + } + } + } + } + + private void addNote(int pc, Note note) { + List<Note> list = pcMap.get(pc); + if (list == null) + pcMap.put(pc, list = new ArrayList<>()); + list.add(note); + } + + @Override + void writeDetails(Instruction instr) { + String indent = space(2); // get from Options? + int pc = instr.getPC(); + List<Note> notes = pcMap.get(pc); + if (notes != null) { + for (Note n: notes) { + print(indent); + print("@"); + annotationWriter.write(n.anno, false, true); + print(", "); + println(StringUtils.toLowerCase(n.kind.toString())); + } + } + } + + private AnnotationWriter annotationWriter; + private ClassWriter classWriter; + private Map<Integer, List<Note>> pcMap; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/overview.html Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,10 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> + <head> + <title>javap: class file disassembler</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + </head> + <body> + Javap is a class file disassembler. + </body> +</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/package-info.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + Classes to dump class files in text format. + + <p><b>This is NOT part of any supported API. + If you write code that depends on this, you do so at your own risk. + This code and its internal interfaces are subject to change or + deletion without notice.</b> +*/ +@jdk.Exported(false) +package com.sun.tools.javap;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,87 @@ + +err.prefix=Error: + +err.bad.constant.pool=error while reading constant pool for {0}: {1} +err.class.not.found=class not found: {0} +err.crash=A serious internal error has occurred: {0}\nPlease file a bug report, and include the following information:\n{1} +err.end.of.file=unexpected end of file while reading {0} +err.file.not.found=file not found: {0} +err.incompatible.options=bad combination of options: {0} +err.internal.error=internal error: {0} {1} {2} +err.invalid.arg.for.option=invalid argument for option: {0} +err.ioerror=IO error reading {0}: {1} +err.missing.arg=no value given for {0} +err.no.classes.specified=no classes specified +err.not.standard.file.manager=can only specify class files when using a standard file manager +err.invalid.use.of.option=invalid use of option: {0} +err.unknown.option=unknown option: {0} +err.no.SourceFile.attribute=no SourceFile attribute +err.source.file.not.found=source file not found +err.bad.innerclasses.attribute=bad InnerClasses attribute for {0} +err.nomem=Insufficient memory. To increase memory use -J-Xmx option. + +main.usage.summary=\ +Usage: {0} <options> <classes>\n\ +use -help for a list of possible options + +warn.prefix=Warning: +warn.unexpected.class=Binary file {0} contains {1} + +note.prefix=Note: + +main.usage.summary=\ +Usage: {0} <options> <classes>\n\ +use -help for a list of possible options + +main.usage=\ +Usage: {0} <options> <classes>\n\ +where possible options include: + + +main.opt.help=\ +\ -help --help -? Print this usage message + +main.opt.version=\ +\ -version Version information + +main.opt.v=\ +\ -v -verbose Print additional information + +main.opt.l=\ +\ -l Print line number and local variable tables + +main.opt.public=\ +\ -public Show only public classes and members + +main.opt.protected=\ +\ -protected Show protected/public classes and members + +main.opt.package=\ +\ -package Show package/protected/public classes\n\ +\ and members (default) + +main.opt.p=\ +\ -p -private Show all classes and members + +main.opt.c=\ +\ -c Disassemble the code + +main.opt.s=\ +\ -s Print internal type signatures + +main.opt.classpath=\ +\ -classpath <path> Specify where to find user class files + +main.opt.cp=\ +\ -cp <path> Specify where to find user class files + +main.opt.bootclasspath=\ +\ -bootclasspath <path> Override location of bootstrap class files + +main.opt.constants=\ +\ -constants Show final constants + + +main.opt.sysinfo=\ +\ -sysinfo Show system info (path, size, date, MD5 hash)\n\ +\ of class being processed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_ja.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,65 @@ + +err.prefix=\u30A8\u30E9\u30FC: + +err.bad.constant.pool={0}\u306E\u5B9A\u6570\u30D7\u30FC\u30EB\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1} +err.class.not.found=\u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} +err.crash=\u91CD\u5927\u306A\u5185\u90E8\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {0}\n\u6B21\u306E\u60C5\u5831\u3092\u542B\u3080\u30D0\u30B0\u30FB\u30EC\u30DD\u30FC\u30C8\u3092\u30D5\u30A1\u30A4\u30EB\u3057\u3066\u304F\u3060\u3055\u3044:\n{1} +err.end.of.file={0}\u306E\u8AAD\u53D6\u308A\u4E2D\u306B\u4E88\u671F\u3057\u306A\u3044\u30D5\u30A1\u30A4\u30EB\u306E\u7D42\u308F\u308A\u304C\u691C\u51FA\u3055\u308C\u307E\u3057\u305F +err.file.not.found=\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0} +err.h.not.supported=-h\u306F\u4F7F\u7528\u53EF\u80FD\u3067\u306A\u304F\u306A\u308A\u307E\u3057\u305F - 'javah'\u30D7\u30ED\u30B0\u30E9\u30E0\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044 +err.incompatible.options=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u7D44\u5408\u305B\u304C\u4E0D\u6B63\u3067\u3059: {0} +err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2} +err.invalid.arg.for.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0} +err.ioerror={0}\u306E\u8AAD\u53D6\u308A\u4E2D\u306BIO\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1} +err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 +err.no.classes.specified=\u30AF\u30E9\u30B9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 +err.not.standard.file.manager=\u6A19\u6E96\u30D5\u30A1\u30A4\u30EB\u30FB\u30DE\u30CD\u30FC\u30B8\u30E3\u3092\u4F7F\u7528\u3057\u3066\u3044\u308B\u5834\u5408\u306F\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u307F\u6307\u5B9A\u3067\u304D\u307E\u3059 +err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0} +err.verify.not.supported=-verify\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093 +err.no.SourceFile.attribute=SourceFile\u5C5E\u6027\u304C\u3042\u308A\u307E\u305B\u3093 +err.source.file.not.found=\u30BD\u30FC\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093 +err.bad.innerclasses.attribute={0}\u306EInnerClasses\u5C5E\u6027\u304C\u4E0D\u6B63\u3067\u3059 +warn.Xold.not.supported=-Xold\u306F\u4F7F\u7528\u3067\u304D\u306A\u304F\u306A\u308A\u307E\u3057\u305F + +main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-help\u3092\u4F7F\u7528\u3057\u307E\u3059 + +warn.prefix=\u8B66\u544A: +warn.unexpected.class=\u30D0\u30A4\u30CA\u30EA\u30FB\u30D5\u30A1\u30A4\u30EB{0}\u306B{1}\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059 + +note.prefix=\u6CE8: + +main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-help\u3092\u4F7F\u7528\u3057\u307E\u3059 + +main.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306B\u306F\u6B21\u306E\u3082\u306E\u304C\u3042\u308A\u307E\u3059: + + +main.opt.help=\ -help --help -? \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3059\u308B + +main.opt.version=\ -version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831 + +main.opt.v=\ -v -verbose \u8FFD\u52A0\u60C5\u5831\u3092\u51FA\u529B\u3059\u308B + +main.opt.l=\ -l \u884C\u756A\u53F7\u3068\u30ED\u30FC\u30AB\u30EB\u5909\u6570\u8868\u3092\u51FA\u529B\u3059\u308B + +main.opt.public=\ -public public\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B + +main.opt.protected=\ -protected protected/public\u30AF\u30E9\u30B9\u304A\u3088\u3073\u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B + +main.opt.package=\ -package package/protected/public\u30AF\u30E9\u30B9\u304A\u3088\u3073\n \u30E1\u30F3\u30D0\u30FC\u306E\u307F\u3092\u8868\u793A\u3059\u308B(\u30C7\u30D5\u30A9\u30EB\u30C8) + +main.opt.p=\ -p -private \u3059\u3079\u3066\u306E\u30AF\u30E9\u30B9\u3068\u30E1\u30F3\u30D0\u30FC\u3092\u8868\u793A\u3059\u308B + +main.opt.c=\ -c \u30B3\u30FC\u30C9\u3092\u9006\u30A2\u30BB\u30F3\u30D6\u30EB\u3059\u308B + +main.opt.s=\ -s \u5185\u90E8\u30BF\u30A4\u30D7\u7F72\u540D\u3092\u51FA\u529B\u3059\u308B + +main.opt.classpath=\ -classpath <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B + +main.opt.cp=\ -cp <path> \u30E6\u30FC\u30B6\u30FC\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3059\u308B + +main.opt.bootclasspath=\ -bootclasspath <path> \u30D6\u30FC\u30C8\u30B9\u30C8\u30E9\u30C3\u30D7\u30FB\u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u4F4D\u7F6E\u3092\u30AA\u30FC\u30D0\u30FC\u30E9\u30A4\u30C9\u3059\u308B + +main.opt.constants=\ -constants \u9759\u7684final\u5B9A\u6570\u3092\u8868\u793A\u3059\u308B + + +main.opt.sysinfo=\ -sysinfo \u51E6\u7406\u3057\u3066\u3044\u308B\u30AF\u30E9\u30B9\u306E\u30B7\u30B9\u30C6\u30E0\u60C5\u5831(\u30D1\u30B9\u3001\u30B5\u30A4\u30BA\u3001\u65E5\u4ED8\u3001MD5\u30CF\u30C3\u30B7\u30E5)\n \u3092\u8868\u793A\u3059\u308B
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,65 @@ + +err.prefix=\u9519\u8BEF: + +err.bad.constant.pool=\u8BFB\u53D6{0}\u7684\u5E38\u91CF\u6C60\u65F6\u51FA\u9519: {1} +err.class.not.found=\u627E\u4E0D\u5230\u7C7B: {0} +err.crash=\u51FA\u73B0\u4E25\u91CD\u7684\u5185\u90E8\u9519\u8BEF: {0}\n\u8BF7\u5EFA\u7ACB Bug \u62A5\u544A, \u5E76\u5305\u62EC\u4EE5\u4E0B\u4FE1\u606F:\n{1} +err.end.of.file=\u8BFB\u53D6{0}\u65F6\u51FA\u73B0\u610F\u5916\u7684\u6587\u4EF6\u7ED3\u5C3E +err.file.not.found=\u627E\u4E0D\u5230\u6587\u4EF6: {0} +err.h.not.supported=-h \u4E0D\u518D\u53EF\u7528 - \u8BF7\u4F7F\u7528 'javah' \u7A0B\u5E8F +err.incompatible.options=\u9009\u9879\u7EC4\u5408\u9519\u8BEF: {0} +err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2} +err.invalid.arg.for.option=\u9009\u9879\u7684\u53C2\u6570\u65E0\u6548: {0} +err.ioerror=\u8BFB\u53D6{0}\u65F6\u51FA\u73B0 IO \u9519\u8BEF: {1} +err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C +err.no.classes.specified=\u672A\u6307\u5B9A\u7C7B +err.not.standard.file.manager=\u4F7F\u7528\u6807\u51C6\u6587\u4EF6\u7BA1\u7406\u5668\u65F6\u53EA\u80FD\u6307\u5B9A\u7C7B\u6587\u4EF6 +err.unknown.option=\u672A\u77E5\u9009\u9879: {0} +err.verify.not.supported=\u4E0D\u652F\u6301 -verify +err.no.SourceFile.attribute=\u6CA1\u6709 SourceFile \u5C5E\u6027 +err.source.file.not.found=\u627E\u4E0D\u5230\u6E90\u6587\u4EF6 +err.bad.innerclasses.attribute={0}\u7684 InnerClasses \u5C5E\u6027\u9519\u8BEF +warn.Xold.not.supported=-Xold \u4E0D\u518D\u53EF\u7528 + +main.usage.summary=\u7528\u6CD5: {0} <options> <classes>\n\u4F7F\u7528 -help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 + +warn.prefix=\u8B66\u544A: +warn.unexpected.class=\u4E8C\u8FDB\u5236\u6587\u4EF6{0}\u5305\u542B{1} + +note.prefix=\u6CE8: + +main.usage.summary=\u7528\u6CD5: {0} <options> <classes>\n\u4F7F\u7528 -help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 + +main.usage=\u7528\u6CD5: {0} <options> <classes>\n\u5176\u4E2D, \u53EF\u80FD\u7684\u9009\u9879\u5305\u62EC: + + +main.opt.help=\ -help --help -? \u8F93\u51FA\u6B64\u7528\u6CD5\u6D88\u606F + +main.opt.version=\ -version \u7248\u672C\u4FE1\u606F + +main.opt.v=\ -v -verbose \u8F93\u51FA\u9644\u52A0\u4FE1\u606F + +main.opt.l=\ -l \u8F93\u51FA\u884C\u53F7\u548C\u672C\u5730\u53D8\u91CF\u8868 + +main.opt.public=\ -public \u4EC5\u663E\u793A\u516C\u5171\u7C7B\u548C\u6210\u5458 + +main.opt.protected=\ -protected \u663E\u793A\u53D7\u4FDD\u62A4\u7684/\u516C\u5171\u7C7B\u548C\u6210\u5458 + +main.opt.package=\ -package \u663E\u793A\u7A0B\u5E8F\u5305/\u53D7\u4FDD\u62A4\u7684/\u516C\u5171\u7C7B\n \u548C\u6210\u5458 (\u9ED8\u8BA4) + +main.opt.p=\ -p -private \u663E\u793A\u6240\u6709\u7C7B\u548C\u6210\u5458 + +main.opt.c=\ -c \u5BF9\u4EE3\u7801\u8FDB\u884C\u53CD\u6C47\u7F16 + +main.opt.s=\ -s \u8F93\u51FA\u5185\u90E8\u7C7B\u578B\u7B7E\u540D + +main.opt.classpath=\ -classpath <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E + +main.opt.cp=\ -cp <path> \u6307\u5B9A\u67E5\u627E\u7528\u6237\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E + +main.opt.bootclasspath=\ -bootclasspath <path> \u8986\u76D6\u5F15\u5BFC\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E + +main.opt.constants=\ -constants \u663E\u793A\u9759\u6001\u6700\u7EC8\u5E38\u91CF + + +main.opt.sysinfo=\ -sysinfo \u663E\u793A\u6B63\u5728\u5904\u7406\u7684\u7C7B\u7684\n \u7CFB\u7EDF\u4FE1\u606F (\u8DEF\u5F84, \u5927\u5C0F, \u65E5\u671F, MD5 \u6563\u5217)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/javap/resources/version.properties-template Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,28 @@ +# +# Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +jdk=$(JDK_VERSION) +full=$(FULL_VERSION) +release=$(RELEASE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Analyzer.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import java.io.PrintStream; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.sun.tools.classfile.Dependency.Location; + +/** + * Dependency Analyzer. + */ +public class Analyzer { + /** + * Type of the dependency analysis. Appropriate level of data + * will be stored. + */ + public enum Type { + SUMMARY, + PACKAGE, + CLASS, + VERBOSE + } + + /** + * Filter to be applied when analyzing the dependencies from the given archives. + * Only the accepted dependencies are recorded. + */ + interface Filter { + boolean accepts(Location origin, Archive originArchive, Location target, Archive targetArchive); + } + + protected final Type type; + protected final Filter filter; + protected final Map<Archive, ArchiveDeps> results = new HashMap<>(); + protected final Map<Location, Archive> map = new HashMap<>(); + private static final Archive NOT_FOUND + = new Archive(JdepsTask.getMessage("artifact.not.found")); + + /** + * Constructs an Analyzer instance. + * + * @param type Type of the dependency analysis + * @param filter + */ + public Analyzer(Type type, Filter filter) { + this.type = type; + this.filter = filter; + } + + /** + * Performs the dependency analysis on the given archives. + */ + public boolean run(List<Archive> archives) { + // build a map from Location to Archive + buildLocationArchiveMap(archives); + + // traverse and analyze all dependencies + for (Archive archive : archives) { + ArchiveDeps deps = new ArchiveDeps(archive, type); + archive.visitDependences(deps); + results.put(archive, deps); + } + return true; + } + + protected void buildLocationArchiveMap(List<Archive> archives) { + // build a map from Location to Archive + for (Archive archive: archives) { + for (Location l: archive.getClasses()) { + if (!map.containsKey(l)) { + map.put(l, archive); + } else { + // duplicated class warning? + } + } + } + } + + public boolean hasDependences(Archive archive) { + if (results.containsKey(archive)) { + return results.get(archive).dependencies().size() > 0; + } + return false; + } + + public Set<String> dependences(Archive source) { + ArchiveDeps result = results.get(source); + return result.dependencies().stream() + .map(Dep::target) + .collect(Collectors.toSet()); + } + + public interface Visitor { + /** + * Visits a recorded dependency from origin to target which can be + * a fully-qualified classname, a package name, a module or + * archive name depending on the Analyzer's type. + */ + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive); + } + + /** + * Visit the dependencies of the given source. + * If the requested level is SUMMARY, it will visit the required archives list. + */ + public void visitDependences(Archive source, Visitor v, Type level) { + if (level == Type.SUMMARY) { + final ArchiveDeps result = results.get(source); + final Set<Archive> reqs = result.requires(); + Stream<Archive> stream = reqs.stream(); + if (reqs.isEmpty()) { + if (hasDependences(source)) { + // If reqs.isEmpty() and we have dependences, then it means + // that the dependences are from 'source' onto itself. + stream = Stream.of(source); + } + } + stream.sorted(Comparator.comparing(Archive::getName)) + .forEach(archive -> { + Profile profile = result.getTargetProfile(archive); + v.visitDependence(source.getName(), source, + profile != null ? profile.profileName() : archive.getName(), archive); + }); + } else { + ArchiveDeps result = results.get(source); + if (level != type) { + // requesting different level of analysis + result = new ArchiveDeps(source, level); + source.visitDependences(result); + } + result.dependencies().stream() + .sorted(Comparator.comparing(Dep::origin) + .thenComparing(Dep::target)) + .forEach(d -> v.visitDependence(d.origin(), d.originArchive(), d.target(), d.targetArchive())); + } + } + + public void visitDependences(Archive source, Visitor v) { + visitDependences(source, v, type); + } + + /** + * ArchiveDeps contains the dependencies for an Archive that can have one or + * more classes. + */ + class ArchiveDeps implements Archive.Visitor { + protected final Archive archive; + protected final Set<Archive> requires; + protected final Set<Dep> deps; + protected final Type level; + private Profile profile; + ArchiveDeps(Archive archive, Type level) { + this.archive = archive; + this.deps = new HashSet<>(); + this.requires = new HashSet<>(); + this.level = level; + } + + Set<Dep> dependencies() { + return deps; + } + + Set<Archive> requires() { + return requires; + } + + Profile getTargetProfile(Archive target) { + if (target instanceof Module) { + return Profile.getProfile((Module) target); + } else { + return null; + } + } + + Archive findArchive(Location t) { + Archive target = archive.getClasses().contains(t) ? archive : map.get(t); + if (target == null) { + map.put(t, target = NOT_FOUND); + } + return target; + } + + // return classname or package name depedning on the level + private String getLocationName(Location o) { + if (level == Type.CLASS || level == Type.VERBOSE) { + return o.getClassName(); + } else { + String pkg = o.getPackageName(); + return pkg.isEmpty() ? "<unnamed>" : pkg; + } + } + + @Override + public void visit(Location o, Location t) { + Archive targetArchive = findArchive(t); + if (filter.accepts(o, archive, t, targetArchive)) { + addDep(o, t); + if (archive != targetArchive && !requires.contains(targetArchive)) { + requires.add(targetArchive); + } + } + if (targetArchive instanceof Module) { + Profile p = Profile.getProfile(t.getPackageName()); + if (profile == null || (p != null && p.compareTo(profile) > 0)) { + profile = p; + } + } + } + + private Dep curDep; + protected Dep addDep(Location o, Location t) { + String origin = getLocationName(o); + String target = getLocationName(t); + Archive targetArchive = findArchive(t); + if (curDep != null && + curDep.origin().equals(origin) && + curDep.originArchive() == archive && + curDep.target().equals(target) && + curDep.targetArchive() == targetArchive) { + return curDep; + } + + Dep e = new Dep(origin, archive, target, targetArchive); + if (deps.contains(e)) { + for (Dep e1 : deps) { + if (e.equals(e1)) { + curDep = e1; + } + } + } else { + deps.add(e); + curDep = e; + } + return curDep; + } + } + + /* + * Class-level or package-level dependency + */ + class Dep { + final String origin; + final Archive originArchive; + final String target; + final Archive targetArchive; + + Dep(String origin, Archive originArchive, String target, Archive targetArchive) { + this.origin = origin; + this.originArchive = originArchive; + this.target = target; + this.targetArchive = targetArchive; + } + + String origin() { + return origin; + } + + Archive originArchive() { + return originArchive; + } + + String target() { + return target; + } + + Archive targetArchive() { + return targetArchive; + } + + @Override + @SuppressWarnings("unchecked") + public boolean equals(Object o) { + if (o instanceof Dep) { + Dep d = (Dep) o; + return this.origin.equals(d.origin) && + this.originArchive == d.originArchive && + this.target.equals(d.target) && + this.targetArchive == d.targetArchive; + } + return false; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 67*hash + Objects.hashCode(this.origin) + + Objects.hashCode(this.originArchive) + + Objects.hashCode(this.target) + + Objects.hashCode(this.targetArchive); + return hash; + } + + public String toString() { + return String.format("%s (%s) -> %s (%s)%n", + origin, originArchive.getName(), + target, targetArchive.getName()); + } + } + + static Analyzer getExportedAPIsAnalyzer() { + return new ModuleAccessAnalyzer(ModuleAccessAnalyzer.reexportsFilter, true); + } + + static Analyzer getModuleAccessAnalyzer() { + return new ModuleAccessAnalyzer(ModuleAccessAnalyzer.accessCheckFilter, false); + } + + private static class ModuleAccessAnalyzer extends Analyzer { + private final boolean apionly; + ModuleAccessAnalyzer(Filter filter, boolean apionly) { + super(Type.VERBOSE, filter); + this.apionly = apionly; + } + /** + * Verify module access + */ + public boolean run(List<Archive> archives) { + // build a map from Location to Archive + buildLocationArchiveMap(archives); + + // traverse and analyze all dependencies + int count = 0; + for (Archive archive : archives) { + ArchiveDeps checker = new ArchiveDeps(archive, type); + archive.visitDependences(checker); + count += checker.dependencies().size(); + // output if any error + Module m = (Module)archive; + printDependences(System.err, m, checker.dependencies()); + results.put(archive, checker); + } + return count == 0; + } + + private void printDependences(PrintStream out, Module m, Set<Dep> deps) { + if (deps.isEmpty()) + return; + + String msg = apionly ? "API reference:" : "inaccessible reference:"; + deps.stream().sorted(Comparator.comparing(Dep::origin) + .thenComparing(Dep::target)) + .forEach(d -> out.format("%s %s (%s) -> %s (%s)%n", msg, + d.origin(), d.originArchive().getName(), + d.target(), d.targetArchive().getName())); + if (apionly) { + out.format("Dependences missing re-exports=\"true\" attribute:%n"); + deps.stream() + .map(Dep::targetArchive) + .map(Archive::getName) + .distinct() + .sorted() + .forEach(d -> out.format(" %s -> %s%n", m.name(), d)); + } + } + + private static Module findModule(Archive archive) { + if (Module.class.isInstance(archive)) { + return (Module) archive; + } else { + return null; + } + } + + // returns true if target is accessible by origin + private static boolean canAccess(Location o, Archive originArchive, Location t, Archive targetArchive) { + Module origin = findModule(originArchive); + Module target = findModule(targetArchive); + + if (targetArchive == Analyzer.NOT_FOUND) { + return false; + } + + // unnamed module + // ## should check public type? + if (target == null) + return true; + + // module-private + if (origin == target) + return true; + + return target.isAccessibleTo(t.getClassName(), origin); + } + + static final Filter accessCheckFilter = new Filter() { + @Override + public boolean accepts(Location o, Archive originArchive, Location t, Archive targetArchive) { + return !canAccess(o, originArchive, t, targetArchive); + } + }; + + static final Filter reexportsFilter = new Filter() { + @Override + public boolean accepts(Location o, Archive originArchive, Location t, Archive targetArchive) { + Module origin = findModule(originArchive); + Module target = findModule(targetArchive); + if (!origin.isExportedPackage(o.getPackageName())) { + // filter non-exported classes + return false; + } + + boolean accessible = canAccess(o, originArchive, t, targetArchive); + if (!accessible) + return true; + + String mn = target.name(); + // skip checking re-exports for java.base + if (origin == target || "java.base".equals(mn)) + return false; + + assert origin.requires().containsKey(mn); // otherwise, should not be accessible + if (origin.requires().get(mn)) { + return false; + } + return true; + } + }; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Archive.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.Dependency.Location; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Represents the source of the class files. + */ +public class Archive { + public static Archive getInstance(Path p) { + try { + return new Archive(p, ClassFileReader.newInstance(p)); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private final Path path; + private final String filename; + private final ClassFileReader reader; + protected Map<Location, Set<Location>> deps = new ConcurrentHashMap<>(); + + protected Archive(String name) { + this(name, null); + } + protected Archive(String name, ClassFileReader reader) { + this.path = null; + this.filename = name; + this.reader = reader; + } + protected Archive(Path p, ClassFileReader reader) { + this.path = p; + this.filename = path.getFileName().toString(); + this.reader = reader; + } + + public ClassFileReader reader() { + return reader; + } + + public String getName() { + return filename; + } + + public void addClass(Location origin) { + deps.computeIfAbsent(origin, _k -> new HashSet<>()); + } + + public void addClass(Location origin, Location target) { + deps.computeIfAbsent(origin, _k -> new HashSet<>()).add(target); + } + + public Set<Location> getClasses() { + return deps.keySet(); + } + + public void visitDependences(Visitor v) { + for (Map.Entry<Location,Set<Location>> e: deps.entrySet()) { + for (Location target : e.getValue()) { + v.visit(e.getKey(), target); + } + } + } + + public boolean isEmpty() { + return getClasses().isEmpty(); + } + + public String getPathName() { + return path != null ? path.toString() : filename; + } + + public String toString() { + return filename; + } + + public Path path() { + return path; + } + + interface Visitor { + void visit(Location origin, Location target); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ClassFileReader.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,398 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Dependencies.ClassFileError; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * ClassFileReader reads ClassFile(s) of a given path that can be + * a .class file, a directory, or a JAR file. + */ +public class ClassFileReader { + /** + * Returns a ClassFileReader instance of a given path. + */ + public static ClassFileReader newInstance(Path path) throws IOException { + if (!Files.exists(path)) { + throw new FileNotFoundException(path.toString()); + } + + if (Files.isDirectory(path)) { + return new DirectoryReader(path); + } else if (path.getFileName().toString().endsWith(".jar")) { + return new JarFileReader(path); + } else { + return new ClassFileReader(path); + } + } + + /** + * Returns a ClassFileReader instance of a given JarFile. + */ + public static ClassFileReader newInstance(Path path, JarFile jf) throws IOException { + return new JarFileReader(path, jf); + } + + protected final Path path; + protected final String baseFileName; + protected final List<String> skippedEntries = new ArrayList<>(); + protected ClassFileReader(Path path) { + this.path = path; + this.baseFileName = path.getFileName() != null + ? path.getFileName().toString() + : path.toString(); + } + + public String getFileName() { + return baseFileName; + } + + public List<String> skippedEntries() { + return skippedEntries; + } + + /** + * Returns the ClassFile matching the given binary name + * or a fully-qualified class name. + */ + public ClassFile getClassFile(String name) throws IOException { + if (name.indexOf('.') > 0) { + int i = name.lastIndexOf('.'); + String pathname = name.replace('.', File.separatorChar) + ".class"; + if (baseFileName.equals(pathname) || + baseFileName.equals(pathname.substring(0, i) + "$" + + pathname.substring(i+1, pathname.length()))) { + return readClassFile(path); + } + } else { + if (baseFileName.equals(name.replace('/', File.separatorChar) + ".class")) { + return readClassFile(path); + } + } + return null; + } + + public Iterable<ClassFile> getClassFiles() throws IOException { + return new Iterable<ClassFile>() { + public Iterator<ClassFile> iterator() { + return new FileIterator(); + } + }; + } + + protected ClassFile readClassFile(Path p) throws IOException { + InputStream is = null; + try { + is = Files.newInputStream(p); + return ClassFile.read(is); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } finally { + if (is != null) { + is.close(); + } + } + } + + class FileIterator implements Iterator<ClassFile> { + int count; + FileIterator() { + this.count = 0; + } + public boolean hasNext() { + return count == 0 && baseFileName.endsWith(".class"); + } + + public ClassFile next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + try { + ClassFile cf = readClassFile(path); + count++; + return cf; + } catch (IOException e) { + throw new ClassFileError(e); + } + } + + public void remove() { + throw new UnsupportedOperationException("Not supported yet."); + } + } + + public String toString() { + return path.toString(); + } + + private static class DirectoryReader extends ClassFileReader { + protected final String fsSep; + DirectoryReader(Path path) throws IOException { + this(FileSystems.getDefault(), path); + } + DirectoryReader(FileSystem fs, Path path) throws IOException { + super(path); + this.fsSep = fs.getSeparator(); + } + + public ClassFile getClassFile(String name) throws IOException { + if (name.indexOf('.') > 0) { + int i = name.lastIndexOf('.'); + String pathname = name.replace(".", fsSep) + ".class"; + Path p = path.resolve(pathname); + if (!Files.exists(p)) { + p = path.resolve(pathname.substring(0, i) + "$" + + pathname.substring(i+1, pathname.length())); + } + if (Files.exists(p)) { + return readClassFile(p); + } + } else { + Path p = path.resolve(name + ".class"); + if (Files.exists(p)) { + return readClassFile(p); + } + } + return null; + } + + public Iterable<ClassFile> getClassFiles() throws IOException { + final Iterator<ClassFile> iter = new DirectoryIterator(); + return new Iterable<ClassFile>() { + public Iterator<ClassFile> iterator() { + return iter; + } + }; + } + + private List<Path> entries; + protected synchronized List<Path> walkTree() throws IOException { + if (entries == null) { + entries = new ArrayList<>(); + Files.walkFileTree(path, new SimpleFileVisitor<Path>() { + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + throws IOException { + if (file.getFileName().toString().endsWith(".class")) { + entries.add(file); + } + return FileVisitResult.CONTINUE; + } + }); + } + return entries; + } + + class DirectoryIterator implements Iterator<ClassFile> { + private List<Path> entries; + private int index = 0; + DirectoryIterator() throws IOException { + entries = walkTree(); + index = 0; + } + + public boolean hasNext() { + return index != entries.size(); + } + + public ClassFile next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + Path path = entries.get(index++); + try { + return readClassFile(path); + } catch (IOException e) { + throw new ClassFileError(e); + } + } + + public void remove() { + throw new UnsupportedOperationException("Not supported yet."); + } + } + } + + static class JarFileReader extends ClassFileReader { + private final JarFile jarfile; + JarFileReader(Path path) throws IOException { + this(path, new JarFile(path.toFile(), false)); + } + + JarFileReader(Path path, JarFile jf) throws IOException { + super(path); + this.jarfile = jf; + } + + public ClassFile getClassFile(String name) throws IOException { + if (name.indexOf('.') > 0) { + int i = name.lastIndexOf('.'); + String entryName = name.replace('.', '/') + ".class"; + JarEntry e = jarfile.getJarEntry(entryName); + if (e == null) { + e = jarfile.getJarEntry(entryName.substring(0, i) + "$" + + entryName.substring(i + 1, entryName.length())); + } + if (e != null) { + return readClassFile(jarfile, e); + } + } else { + JarEntry e = jarfile.getJarEntry(name + ".class"); + if (e != null) { + return readClassFile(jarfile, e); + } + } + return null; + } + + protected ClassFile readClassFile(JarFile jarfile, JarEntry e) throws IOException { + InputStream is = null; + try { + is = jarfile.getInputStream(e); + return ClassFile.read(is); + } catch (ConstantPoolException ex) { + throw new ClassFileError(ex); + } finally { + if (is != null) + is.close(); + } + } + + public Iterable<ClassFile> getClassFiles() throws IOException { + final Iterator<ClassFile> iter = new JarFileIterator(this, jarfile); + return new Iterable<ClassFile>() { + public Iterator<ClassFile> iterator() { + return iter; + } + }; + } + } + + class JarFileIterator implements Iterator<ClassFile> { + protected final JarFileReader reader; + protected Enumeration<JarEntry> entries; + protected JarFile jf; + protected JarEntry nextEntry; + protected ClassFile cf; + JarFileIterator(JarFileReader reader) { + this(reader, null); + } + JarFileIterator(JarFileReader reader, JarFile jarfile) { + this.reader = reader; + setJarFile(jarfile); + } + + void setJarFile(JarFile jarfile) { + if (jarfile == null) return; + + this.jf = jarfile; + this.entries = jf.entries(); + this.nextEntry = nextEntry(); + } + + public boolean hasNext() { + if (nextEntry != null && cf != null) { + return true; + } + while (nextEntry != null) { + try { + cf = reader.readClassFile(jf, nextEntry); + return true; + } catch (ClassFileError | IOException ex) { + skippedEntries.add(nextEntry.getName()); + } + nextEntry = nextEntry(); + } + return false; + } + + public ClassFile next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + ClassFile classFile = cf; + cf = null; + nextEntry = nextEntry(); + return classFile; + } + + protected JarEntry nextEntry() { + while (entries.hasMoreElements()) { + JarEntry e = entries.nextElement(); + String name = e.getName(); + if (name.endsWith(".class")) { + return e; + } + } + return null; + } + + public void remove() { + throw new UnsupportedOperationException("Not supported yet."); + } + } + + /** + * ClassFileReader for modules. + */ + static class ModuleClassReader extends DirectoryReader { + final String modulename; + ModuleClassReader(FileSystem fs, String mn, Path root) throws IOException { + super(fs, root); + this.modulename = mn; + } + + public Set<String> packages() throws IOException { + return walkTree().stream() + .map(this::toPackageName) + .sorted() + .collect(Collectors.toSet()); + } + + String toPackageName(Path p) { + if (p.getParent() == null) { + return ""; + } + return path.relativize(p.getParent()).toString().replace(fsSep, "."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/JdepsTask.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,1099 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Dependencies; +import com.sun.tools.classfile.Dependencies.ClassFileError; +import com.sun.tools.classfile.Dependency; +import com.sun.tools.classfile.Dependency.Location; +import static com.sun.tools.jdeps.Analyzer.Type.*; +import java.io.*; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.MessageFormat; +import java.util.*; +import java.util.regex.Pattern; + +/** + * Implementation for the jdeps tool for static class dependency analysis. + */ +class JdepsTask { + static class BadArgs extends Exception { + static final long serialVersionUID = 8765093759964640721L; + BadArgs(String key, Object... args) { + super(JdepsTask.getMessage(key, args)); + this.key = key; + this.args = args; + } + + BadArgs showUsage(boolean b) { + showUsage = b; + return this; + } + final String key; + final Object[] args; + boolean showUsage; + } + + static abstract class Option { + Option(boolean hasArg, String... aliases) { + this.hasArg = hasArg; + this.aliases = aliases; + } + + boolean isHidden() { + return false; + } + + boolean matches(String opt) { + for (String a : aliases) { + if (a.equals(opt)) + return true; + if (hasArg && opt.startsWith(a + "=")) + return true; + } + return false; + } + + boolean ignoreRest() { + return false; + } + + abstract void process(JdepsTask task, String opt, String arg) throws BadArgs; + final boolean hasArg; + final String[] aliases; + } + + static abstract class HiddenOption extends Option { + HiddenOption(boolean hasArg, String... aliases) { + super(hasArg, aliases); + } + + boolean isHidden() { + return true; + } + } + + static Option[] recognizedOptions = { + new Option(false, "-h", "-?", "-help") { + void process(JdepsTask task, String opt, String arg) { + task.options.help = true; + } + }, + new Option(true, "-dotoutput") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + Path p = Paths.get(arg); + if (Files.exists(p) && (!Files.isDirectory(p) || !Files.isWritable(p))) { + throw new BadArgs("err.invalid.path", arg); + } + task.options.dotOutputDir = arg; + } + }, + new Option(false, "-s", "-summary") { + void process(JdepsTask task, String opt, String arg) { + task.options.showSummary = true; + task.options.verbose = SUMMARY; + } + }, + new Option(false, "-v", "-verbose", + "-verbose:package", + "-verbose:class") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + switch (opt) { + case "-v": + case "-verbose": + task.options.verbose = VERBOSE; + task.options.filterSameArchive = false; + task.options.filterSamePackage = false; + break; + case "-verbose:package": + task.options.verbose = PACKAGE; + break; + case "-verbose:class": + task.options.verbose = CLASS; + break; + default: + throw new BadArgs("err.invalid.arg.for.option", opt); + } + } + }, + new Option(true, "-cp", "-classpath") { + void process(JdepsTask task, String opt, String arg) { + task.options.classpath = arg; + } + }, + new Option(true, "-p", "-package") { + void process(JdepsTask task, String opt, String arg) { + task.options.packageNames.add(arg); + } + }, + new Option(true, "-e", "-regex") { + void process(JdepsTask task, String opt, String arg) { + task.options.regex = arg; + } + }, + + new Option(true, "-f", "-filter") { + void process(JdepsTask task, String opt, String arg) { + task.options.filterRegex = arg; + } + }, + new Option(false, "-filter:package", + "-filter:archive", + "-filter:none") { + void process(JdepsTask task, String opt, String arg) { + switch (opt) { + case "-filter:package": + task.options.filterSamePackage = true; + task.options.filterSameArchive = false; + break; + case "-filter:archive": + task.options.filterSameArchive = true; + task.options.filterSamePackage = false; + break; + case "-filter:none": + task.options.filterSameArchive = false; + task.options.filterSamePackage = false; + break; + } + } + }, + new Option(true, "-include") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + task.options.includePattern = Pattern.compile(arg); + } + }, + new Option(false, "-P", "-profile") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + task.options.showProfile = true; + task.options.showModule = false; + } + }, + new Option(false, "-M", "-module") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + task.options.showModule = true; + task.options.showProfile = false; + } + }, + new Option(false, "-apionly") { + void process(JdepsTask task, String opt, String arg) { + task.options.apiOnly = true; + } + }, + new Option(false, "-R", "-recursive") { + void process(JdepsTask task, String opt, String arg) { + task.options.depth = 0; + // turn off filtering + task.options.filterSameArchive = false; + task.options.filterSamePackage = false; + } + }, + new Option(false, "-jdkinternals") { + void process(JdepsTask task, String opt, String arg) { + task.options.findJDKInternals = true; + task.options.verbose = CLASS; + if (task.options.includePattern == null) { + task.options.includePattern = Pattern.compile(".*"); + } + } + }, + new HiddenOption(false, "-verify:access") { + void process(JdepsTask task, String opt, String arg) { + task.options.verifyAccess = true; + task.options.verbose = VERBOSE; + task.options.filterSameArchive = false; + task.options.filterSamePackage = false; + } + }, + new HiddenOption(true, "-mp") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + task.options.mpath = Paths.get(arg); + if (!Files.isDirectory(task.options.mpath)) { + throw new BadArgs("err.invalid.path", arg); + } + if (task.options.includePattern == null) { + task.options.includePattern = Pattern.compile(".*"); + } + } + }, + new Option(false, "-version") { + void process(JdepsTask task, String opt, String arg) { + task.options.version = true; + } + }, + new HiddenOption(false, "-fullversion") { + void process(JdepsTask task, String opt, String arg) { + task.options.fullVersion = true; + } + }, + new HiddenOption(false, "-showlabel") { + void process(JdepsTask task, String opt, String arg) { + task.options.showLabel = true; + } + }, + new HiddenOption(false, "-q", "-quiet") { + void process(JdepsTask task, String opt, String arg) { + task.options.nowarning = true; + } + }, + new HiddenOption(true, "-depth") { + void process(JdepsTask task, String opt, String arg) throws BadArgs { + try { + task.options.depth = Integer.parseInt(arg); + } catch (NumberFormatException e) { + throw new BadArgs("err.invalid.arg.for.option", opt); + } + } + }, + }; + + private static final String PROGNAME = "jdeps"; + private final Options options = new Options(); + private final List<String> classes = new ArrayList<>(); + + private PrintWriter log; + void setLog(PrintWriter out) { + log = out; + } + + /** + * Result codes. + */ + static final int EXIT_OK = 0, // Completed with no errors. + EXIT_ERROR = 1, // Completed but reported errors. + EXIT_CMDERR = 2, // Bad command-line arguments + EXIT_SYSERR = 3, // System error or resource exhaustion. + EXIT_ABNORMAL = 4;// terminated abnormally + + int run(String[] args) { + if (log == null) { + log = new PrintWriter(System.out); + } + try { + handleOptions(args); + if (options.help) { + showHelp(); + } + if (options.version || options.fullVersion) { + showVersion(options.fullVersion); + } + if (classes.isEmpty() && options.includePattern == null) { + if (options.help || options.version || options.fullVersion) { + return EXIT_OK; + } else { + showHelp(); + return EXIT_CMDERR; + } + } + if (options.regex != null && options.packageNames.size() > 0) { + showHelp(); + return EXIT_CMDERR; + } + if ((options.findJDKInternals || options.verifyAccess) && + (options.regex != null || options.packageNames.size() > 0 || options.showSummary)) { + showHelp(); + return EXIT_CMDERR; + } + if (options.showSummary && options.verbose != SUMMARY) { + showHelp(); + return EXIT_CMDERR; + } + + boolean ok = run(); + return ok ? EXIT_OK : EXIT_ERROR; + } catch (BadArgs e) { + reportError(e.key, e.args); + if (e.showUsage) { + log.println(getMessage("main.usage.summary", PROGNAME)); + } + return EXIT_CMDERR; + } catch (IOException e) { + return EXIT_ABNORMAL; + } finally { + log.flush(); + } + } + + private final List<Archive> sourceLocations = new ArrayList<>(); + private final List<Archive> classpaths = new ArrayList<>(); + private final List<Archive> initialArchives = new ArrayList<>(); + private boolean run() throws IOException { + buildArchives(); + + if (options.verifyAccess) { + return verifyModuleAccess(); + } else { + return analyzeDeps(); + } + } + + private boolean analyzeDeps() throws IOException { + Analyzer analyzer = new Analyzer(options.verbose, new Analyzer.Filter() { + @Override + public boolean accepts(Location origin, Archive originArchive, + Location target, Archive targetArchive) + { + if (options.findJDKInternals) { + // accepts target that is JDK class but not exported + return isJDKModule(targetArchive) && + !((Module) targetArchive).isExported(target.getClassName()); + } else if (options.filterSameArchive) { + // accepts origin and target that from different archive + return originArchive != targetArchive; + } + return true; + } + }); + + // parse classfiles and find all dependencies + findDependencies(options.apiOnly); + + // analyze the dependencies + analyzer.run(sourceLocations); + + // output result + if (options.dotOutputDir != null) { + Path dir = Paths.get(options.dotOutputDir); + Files.createDirectories(dir); + generateDotFiles(dir, analyzer); + } else { + printRawOutput(log, analyzer); + } + + if (options.findJDKInternals && !options.nowarning) { + showReplacements(analyzer); + } + return true; + } + + private boolean verifyModuleAccess() throws IOException { + // two passes + // 1. check API dependences where the types of dependences must be re-exported + // 2. check all dependences where types must be accessible + + // pass 1 + findDependencies(true /* api only */); + Analyzer analyzer = Analyzer.getExportedAPIsAnalyzer(); + boolean pass1 = analyzer.run(sourceLocations); + if (!pass1) { + System.out.println("ERROR: Failed API access verification"); + } + // pass 2 + findDependencies(false); + analyzer = Analyzer.getModuleAccessAnalyzer(); + boolean pass2 = analyzer.run(sourceLocations); + if (!pass2) { + System.out.println("ERROR: Failed module access verification"); + } + if (pass1 & pass2) { + System.out.println("Access verification succeeded."); + } + return pass1 & pass2; + } + + private void generateSummaryDotFile(Path dir, Analyzer analyzer) throws IOException { + // If verbose mode (-v or -verbose option), + // the summary.dot file shows package-level dependencies. + Analyzer.Type summaryType = + (options.verbose == PACKAGE || options.verbose == SUMMARY) ? SUMMARY : PACKAGE; + Path summary = dir.resolve("summary.dot"); + try (PrintWriter sw = new PrintWriter(Files.newOutputStream(summary)); + SummaryDotFile dotfile = new SummaryDotFile(sw, summaryType)) { + for (Archive archive : sourceLocations) { + if (!archive.isEmpty()) { + if (options.verbose == PACKAGE || options.verbose == SUMMARY) { + if (options.showLabel) { + // build labels listing package-level dependencies + analyzer.visitDependences(archive, dotfile.labelBuilder(), PACKAGE); + } + } + analyzer.visitDependences(archive, dotfile, summaryType); + } + } + } + } + + private void generateDotFiles(Path dir, Analyzer analyzer) throws IOException { + // output individual .dot file for each archive + if (options.verbose != SUMMARY) { + for (Archive archive : sourceLocations) { + if (analyzer.hasDependences(archive)) { + Path dotfile = dir.resolve(archive.getName() + ".dot"); + try (PrintWriter pw = new PrintWriter(Files.newOutputStream(dotfile)); + DotFileFormatter formatter = new DotFileFormatter(pw, archive)) { + analyzer.visitDependences(archive, formatter); + } + } + } + } + // generate summary dot file + generateSummaryDotFile(dir, analyzer); + } + + private void printRawOutput(PrintWriter writer, Analyzer analyzer) { + RawOutputFormatter depFormatter = new RawOutputFormatter(writer); + RawSummaryFormatter summaryFormatter = new RawSummaryFormatter(writer); + for (Archive archive : sourceLocations) { + if (!archive.isEmpty()) { + analyzer.visitDependences(archive, summaryFormatter, SUMMARY); + if (analyzer.hasDependences(archive) && options.verbose != SUMMARY) { + analyzer.visitDependences(archive, depFormatter); + } + } + } + } + + private boolean isValidClassName(String name) { + if (!Character.isJavaIdentifierStart(name.charAt(0))) { + return false; + } + for (int i=1; i < name.length(); i++) { + char c = name.charAt(i); + if (c != '.' && !Character.isJavaIdentifierPart(c)) { + return false; + } + } + return true; + } + + /* + * Dep Filter configured based on the input jdeps option + * 1. -p and -regex to match target dependencies + * 2. -filter:package to filter out same-package dependencies + * + * This filter is applied when jdeps parses the class files + * and filtered dependencies are not stored in the Analyzer. + * + * -filter:archive is applied later in the Analyzer as the + * containing archive of a target class may not be known until + * the entire archive + */ + class DependencyFilter implements Dependency.Filter { + final Dependency.Filter filter; + final Pattern filterPattern; + DependencyFilter() { + if (options.regex != null) { + this.filter = Dependencies.getRegexFilter(Pattern.compile(options.regex)); + } else if (options.packageNames.size() > 0) { + this.filter = Dependencies.getPackageFilter(options.packageNames, false); + } else { + this.filter = null; + } + + this.filterPattern = + options.filterRegex != null ? Pattern.compile(options.filterRegex) : null; + } + @Override + public boolean accepts(Dependency d) { + if (d.getOrigin().equals(d.getTarget())) { + return false; + } + String pn = d.getTarget().getPackageName(); + if (options.filterSamePackage && d.getOrigin().getPackageName().equals(pn)) { + return false; + } + + if (filterPattern != null && filterPattern.matcher(pn).matches()) { + return false; + } + return filter != null ? filter.accepts(d) : true; + } + } + + /** + * Tests if the given class matches the pattern given in the -include option + */ + private boolean matches(String classname) { + if (options.includePattern != null) { + return options.includePattern.matcher(classname.replace('/', '.')).matches(); + } else { + return true; + } + } + + private void buildArchives() throws IOException { + for (String s : classes) { + Path p = Paths.get(s); + if (Files.exists(p)) { + initialArchives.add(Archive.getInstance(p)); + } + } + sourceLocations.addAll(initialArchives); + + classpaths.addAll(getClassPathArchives(options.classpath)); + if (options.includePattern != null) { + initialArchives.addAll(classpaths); + } + classpaths.addAll(PlatformClassPath.getModules(options.mpath)); + if (options.mpath != null) { + initialArchives.addAll(PlatformClassPath.getModules(options.mpath)); + } else { + classpaths.addAll(PlatformClassPath.getJarFiles()); + } + // add all classpath archives to the source locations for reporting + sourceLocations.addAll(classpaths); + } + + private void findDependencies(boolean apiOnly) throws IOException { + Dependency.Finder finder = + apiOnly ? Dependencies.getAPIFinder(AccessFlags.ACC_PROTECTED) + : Dependencies.getClassDependencyFinder(); + Dependency.Filter filter = new DependencyFilter(); + + Deque<String> roots = new LinkedList<>(); + for (String s : classes) { + Path p = Paths.get(s); + if (!Files.exists(p)) { + if (isValidClassName(s)) { + roots.add(s); + } else { + warning("warn.invalid.arg", s); + } + } + } + + // Work queue of names of classfiles to be searched. + // Entries will be unique, and for classes that do not yet have + // dependencies in the results map. + Deque<String> deque = new LinkedList<>(); + Set<String> doneClasses = new HashSet<>(); + + // get the immediate dependencies of the input files + for (Archive a : initialArchives) { + for (ClassFile cf : a.reader().getClassFiles()) { + String classFileName; + try { + classFileName = cf.getName(); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + + // tests if this class matches the -include or -apiOnly option if specified + if (!matches(classFileName) || (apiOnly && !cf.access_flags.is(AccessFlags.ACC_PUBLIC))) { + continue; + } + + if (!doneClasses.contains(classFileName)) { + doneClasses.add(classFileName); + } + + for (Dependency d : finder.findDependencies(cf)) { + if (filter.accepts(d)) { + String cn = d.getTarget().getName(); + if (!doneClasses.contains(cn) && !deque.contains(cn)) { + deque.add(cn); + } + a.addClass(d.getOrigin(), d.getTarget()); + } else { + // ensure that the parsed class is added the archive + a.addClass(d.getOrigin()); + } + } + for (String name : a.reader().skippedEntries()) { + warning("warn.skipped.entry", name, a.getPathName()); + } + } + } + + // add Archive for looking up classes from the classpath + // for transitive dependency analysis + Deque<String> unresolved = roots; + int depth = options.depth > 0 ? options.depth : Integer.MAX_VALUE; + do { + String name; + while ((name = unresolved.poll()) != null) { + if (doneClasses.contains(name)) { + continue; + } + ClassFile cf = null; + for (Archive a : classpaths) { + cf = a.reader().getClassFile(name); + if (cf != null) { + String classFileName; + try { + classFileName = cf.getName(); + } catch (ConstantPoolException e) { + throw new ClassFileError(e); + } + if (!doneClasses.contains(classFileName)) { + // if name is a fully-qualified class name specified + // from command-line, this class might already be parsed + doneClasses.add(classFileName); + + for (Dependency d : finder.findDependencies(cf)) { + if (depth == 0) { + // ignore the dependency + a.addClass(d.getOrigin()); + break; + } else if (filter.accepts(d)) { + a.addClass(d.getOrigin(), d.getTarget()); + String cn = d.getTarget().getName(); + if (!doneClasses.contains(cn) && !deque.contains(cn)) { + deque.add(cn); + } + } else { + // ensure that the parsed class is added the archive + a.addClass(d.getOrigin()); + } + } + } + break; + } + } + if (cf == null) { + doneClasses.add(name); + } + } + unresolved = deque; + deque = new LinkedList<>(); + } while (!unresolved.isEmpty() && depth-- > 0); + } + + public void handleOptions(String[] args) throws BadArgs { + // process options + for (int i=0; i < args.length; i++) { + if (args[i].charAt(0) == '-') { + String name = args[i]; + Option option = getOption(name); + String param = null; + if (option.hasArg) { + if (name.startsWith("-") && name.indexOf('=') > 0) { + param = name.substring(name.indexOf('=') + 1, name.length()); + } else if (i + 1 < args.length) { + param = args[++i]; + } + if (param == null || param.isEmpty() || param.charAt(0) == '-') { + throw new BadArgs("err.missing.arg", name).showUsage(true); + } + } + option.process(this, name, param); + if (option.ignoreRest()) { + i = args.length; + } + } else { + // process rest of the input arguments + for (; i < args.length; i++) { + String name = args[i]; + if (name.charAt(0) == '-') { + throw new BadArgs("err.option.after.class", name).showUsage(true); + } + classes.add(name); + } + } + } + } + + private Option getOption(String name) throws BadArgs { + for (Option o : recognizedOptions) { + if (o.matches(name)) { + return o; + } + } + throw new BadArgs("err.unknown.option", name).showUsage(true); + } + + private void reportError(String key, Object... args) { + log.println(getMessage("error.prefix") + " " + getMessage(key, args)); + } + + private void warning(String key, Object... args) { + log.println(getMessage("warn.prefix") + " " + getMessage(key, args)); + } + + private void showHelp() { + log.println(getMessage("main.usage", PROGNAME)); + for (Option o : recognizedOptions) { + String name = o.aliases[0].substring(1); // there must always be at least one name + name = name.charAt(0) == '-' ? name.substring(1) : name; + if (o.isHidden() || name.equals("h") || name.startsWith("filter:")) { + continue; + } + log.println(getMessage("main.opt." + name)); + } + } + + private void showVersion(boolean full) { + log.println(version(full ? "full" : "release")); + } + + private String version(String key) { + // key=version: mm.nn.oo[-milestone] + // key=full: mm.mm.oo[-milestone]-build + if (ResourceBundleHelper.versionRB == null) { + return System.getProperty("java.version"); + } + try { + return ResourceBundleHelper.versionRB.getString(key); + } catch (MissingResourceException e) { + return getMessage("version.unknown", System.getProperty("java.version")); + } + } + + static String getMessage(String key, Object... args) { + try { + return MessageFormat.format(ResourceBundleHelper.bundle.getString(key), args); + } catch (MissingResourceException e) { + throw new InternalError("Missing message: " + key); + } + } + + private static class Options { + boolean help; + boolean version; + boolean fullVersion; + boolean showProfile; + boolean showModule; + boolean showSummary; + boolean apiOnly; + boolean showLabel; + boolean findJDKInternals; + boolean nowarning; + // default is to show package-level dependencies + // and filter references from same package + Analyzer.Type verbose = PACKAGE; + boolean filterSamePackage = true; + boolean filterSameArchive = false; + String filterRegex; + String dotOutputDir; + String classpath = ""; + int depth = 1; + Set<String> packageNames = new HashSet<>(); + String regex; // apply to the dependences + Pattern includePattern; // apply to classes + // module boundary access check + boolean verifyAccess; + Path mpath; + } + private static class ResourceBundleHelper { + static final ResourceBundle versionRB; + static final ResourceBundle bundle; + static final ResourceBundle jdkinternals; + + static { + Locale locale = Locale.getDefault(); + try { + bundle = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.jdeps", locale); + } catch (MissingResourceException e) { + throw new InternalError("Cannot find jdeps resource bundle for locale " + locale); + } + try { + versionRB = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.version"); + } catch (MissingResourceException e) { + throw new InternalError("version.resource.missing"); + } + try { + jdkinternals = ResourceBundle.getBundle("com.sun.tools.jdeps.resources.jdkinternals"); + } catch (MissingResourceException e) { + throw new InternalError("Cannot find jdkinternals resource bundle"); + } + } + } + + /* + * Returns the list of Archive specified in cpaths and not included + * initialArchives + */ + private List<Archive> getClassPathArchives(String cpaths) + throws IOException + { + List<Archive> result = new ArrayList<>(); + if (cpaths.isEmpty()) { + return result; + } + List<Path> paths = new ArrayList<>(); + for (String p : cpaths.split(File.pathSeparator)) { + if (p.length() > 0) { + // wildcard to parse all JAR files e.g. -classpath dir/* + int i = p.lastIndexOf(".*"); + if (i > 0) { + Path dir = Paths.get(p.substring(0, i)); + try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.jar")) { + for (Path entry : stream) { + paths.add(entry); + } + } + } else { + paths.add(Paths.get(p)); + } + } + } + for (Path path : paths) { + boolean found = initialArchives.stream() + .map(Archive::path) + .anyMatch(p -> isSameFile(path, p)); + if (!found && Files.exists(path)) { + result.add(Archive.getInstance(path)); + } + } + return result; + } + + private boolean isSameFile(Path p1, Path p2) { + try { + return Files.isSameFile(p1, p2); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + class RawOutputFormatter implements Analyzer.Visitor { + private final PrintWriter writer; + private String pkg = ""; + RawOutputFormatter(PrintWriter writer) { + this.writer = writer; + } + @Override + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive) { + String tag = toTag(target, targetArchive); + if (options.verbose == VERBOSE) { + writer.format(" %-50s -> %-50s %s%n", origin, target, tag); + } else { + if (!origin.equals(pkg)) { + pkg = origin; + writer.format(" %s (%s)%n", origin, originArchive.getName()); + } + writer.format(" -> %-50s %s%n", target, tag); + } + } + } + + class RawSummaryFormatter implements Analyzer.Visitor { + private final PrintWriter writer; + RawSummaryFormatter(PrintWriter writer) { + this.writer = writer; + } + @Override + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive) { + String targetName = targetArchive.getPathName(); + if (options.showModule && isJDKModule(targetArchive)) { + targetName = ((Module)targetArchive).name(); + } + writer.format("%s -> %s", originArchive.getName(), targetName); + if (options.showProfile && isJDKModule(targetArchive)) { + writer.format(" (%s)", target); + } + writer.format("%n"); + } + } + + class DotFileFormatter implements Analyzer.Visitor, AutoCloseable { + private final PrintWriter writer; + private final String name; + DotFileFormatter(PrintWriter writer, Archive archive) { + this.writer = writer; + this.name = archive.getName(); + writer.format("digraph \"%s\" {%n", name); + writer.format(" // Path: %s%n", archive.getPathName()); + } + + @Override + public void close() { + writer.println("}"); + } + + @Override + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive) { + String tag = toTag(target, targetArchive); + writer.format(" %-50s -> \"%s\";%n", + String.format("\"%s\"", origin), + tag.isEmpty() ? target + : String.format("%s (%s)", target, tag)); + } + } + + class SummaryDotFile implements Analyzer.Visitor, AutoCloseable { + private final PrintWriter writer; + private final Analyzer.Type type; + private final Map<Archive, Map<Archive,StringBuilder>> edges = new HashMap<>(); + SummaryDotFile(PrintWriter writer, Analyzer.Type type) { + this.writer = writer; + this.type = type; + writer.format("digraph \"summary\" {%n"); + } + + @Override + public void close() { + writer.println("}"); + } + + @Override + public void visitDependence(String origin, Archive originArchive, + String target, Archive targetArchive) { + String targetName = type == PACKAGE ? target : targetArchive.getName(); + if (isJDKModule(targetArchive)) { + Module m = (Module)targetArchive; + String n = showProfileOrModule(m); + if (!n.isEmpty()) { + targetName += " (" + n + ")"; + } + } else if (type == PACKAGE) { + targetName += " (" + targetArchive.getName() + ")"; + } + String label = getLabel(originArchive, targetArchive); + writer.format(" %-50s -> \"%s\"%s;%n", + String.format("\"%s\"", origin), targetName, label); + } + + String getLabel(Archive origin, Archive target) { + if (edges.isEmpty()) + return ""; + + StringBuilder label = edges.get(origin).get(target); + return label == null ? "" : String.format(" [label=\"%s\",fontsize=9]", label.toString()); + } + + Analyzer.Visitor labelBuilder() { + // show the package-level dependencies as labels in the dot graph + return new Analyzer.Visitor() { + @Override + public void visitDependence(String origin, Archive originArchive, String target, Archive targetArchive) { + edges.putIfAbsent(originArchive, new HashMap<>()); + edges.get(originArchive).putIfAbsent(targetArchive, new StringBuilder()); + StringBuilder sb = edges.get(originArchive).get(targetArchive); + String tag = toTag(target, targetArchive); + addLabel(sb, origin, target, tag); + } + + void addLabel(StringBuilder label, String origin, String target, String tag) { + label.append(origin).append(" -> ").append(target); + if (!tag.isEmpty()) { + label.append(" (" + tag + ")"); + } + label.append("\\n"); + } + }; + } + } + + /** + * Test if the given archive is part of the JDK + */ + private boolean isJDKModule(Archive archive) { + return Module.class.isInstance(archive); + } + + /** + * If the given archive is JDK archive, this method returns the profile name + * only if -profile option is specified; it accesses a private JDK API and + * the returned value will have "JDK internal API" prefix + * + * For non-JDK archives, this method returns the file name of the archive. + */ + private String toTag(String name, Archive source) { + if (!isJDKModule(source)) { + return source.getName(); + } + + Module module = (Module)source; + boolean isExported = false; + if (options.verbose == CLASS || options.verbose == VERBOSE) { + isExported = module.isExported(name); + } else { + isExported = module.isExportedPackage(name); + } + if (isExported) { + // exported API + return showProfileOrModule(module); + } else { + return "JDK internal API (" + source.getName() + ")"; + } + } + + private String showProfileOrModule(Module m) { + String tag = ""; + if (options.showProfile) { + Profile p = Profile.getProfile(m); + if (p != null) { + tag = p.profileName(); + } + } else if (options.showModule) { + tag = m.name(); + } + return tag; + } + + private Profile getProfile(String name) { + String pn = name; + if (options.verbose == CLASS || options.verbose == VERBOSE) { + int i = name.lastIndexOf('.'); + pn = i > 0 ? name.substring(0, i) : ""; + } + return Profile.getProfile(pn); + } + + /** + * Returns the recommended replacement API for the given classname; + * or return null if replacement API is not known. + */ + private String replacementFor(String cn) { + String name = cn; + String value = null; + while (value == null && name != null) { + try { + value = ResourceBundleHelper.jdkinternals.getString(name); + } catch (MissingResourceException e) { + // go up one subpackage level + int i = name.lastIndexOf('.'); + name = i > 0 ? name.substring(0, i) : null; + } + } + return value; + }; + + private void showReplacements(Analyzer analyzer) { + Map<String,String> jdkinternals = new TreeMap<>(); + boolean useInternals = false; + for (Archive source : sourceLocations) { + useInternals = useInternals || analyzer.hasDependences(source); + for (String cn : analyzer.dependences(source)) { + String repl = replacementFor(cn); + if (repl != null) { + jdkinternals.putIfAbsent(cn, repl); + } + } + } + if (useInternals) { + log.println(); + warning("warn.replace.useJDKInternals", getMessage("jdeps.wiki.url")); + } + if (!jdkinternals.isEmpty()) { + log.println(); + log.format("%-40s %s%n", "JDK Internal API", "Suggested Replacement"); + log.format("%-40s %s%n", "----------------", "---------------------"); + for (Map.Entry<String,String> e : jdkinternals.entrySet()) { + log.format("%-40s %s%n", e.getKey(), e.getValue()); + } + } + + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Main.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.jdeps; + +import java.io.*; + +/** + * + * Usage: + * jdeps [options] files ... + * where options include: + * -p package-name restrict analysis to classes in this package + * (may be given multiple times) + * -e regex restrict analysis to packages matching pattern + * (-p and -e are exclusive) + * -v show class-level dependencies + * default: package-level dependencies + * -r --recursive transitive dependencies analysis + * -classpath paths Classpath to locate class files + * -all process all class files in the given classpath + */ +public class Main { + public static void main(String... args) throws Exception { + JdepsTask t = new JdepsTask(); + int rc = t.run(args); + System.exit(rc); + } + + + /** + * Entry point that does <i>not</i> call System.exit. + * + * @param args command line arguments + * @param out output stream + * @return an exit code. 0 means success, non-zero means an error occurred. + */ + public static int run(String[] args, PrintWriter out) { + JdepsTask t = new JdepsTask(); + t.setLog(out); + return t.run(args); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Module.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * JDeps internal representation of module for dependency analysis. + */ +final class Module extends Archive { + private final String moduleName; + private final Map<String, Boolean> requires; + private final Map<String, Set<String>> exports; + private final Set<String> packages; + + private Module(ClassFileReader reader, String name, + Map<String, Boolean> requires, + Map<String, Set<String>> exports, + Set<String> packages) { + super(name, reader); + this.moduleName = name; + this.requires = Collections.unmodifiableMap(requires); + this.exports = Collections.unmodifiableMap(exports); + this.packages = Collections.unmodifiableSet(packages); + } + + public String name() { + return moduleName; + } + + public Map<String, Boolean> requires() { + return requires; + } + + public Map<String, Set<String>> exports() { + return exports; + } + + public Set<String> packages() { + return packages; + } + + /** + * Tests if this module can read m + */ + public boolean canRead(Module m) { + // ## TODO: handle "re-exported=true" + // all JDK modules require all modules containing its direct dependences + // should not be an issue + return requires.containsKey(m.name()); + } + + /** + * Tests if a given fully-qualified name is an exported type. + */ + public boolean isExported(String cn) { + int i = cn.lastIndexOf('.'); + String pn = i > 0 ? cn.substring(0, i) : ""; + + return isExportedPackage(pn); + } + + /** + * Tests if a given package name is exported. + */ + public boolean isExportedPackage(String pn) { + return exports.containsKey(pn) ? exports.get(pn).isEmpty() : false; + } + + /** + * Tests if the given classname is accessible to module m + */ + public boolean isAccessibleTo(String classname, Module m) { + int i = classname.lastIndexOf('.'); + String pn = i > 0 ? classname.substring(0, i) : ""; + if (!packages.contains(pn)) { + throw new IllegalArgumentException(classname + " is not a member of module " + name()); + } + + if (m != null && !m.canRead(this)) { + trace("%s not readable by %s%n", this.name(), m.name()); + return false; + } + + // exported API + Set<String> ms = exports().get(pn); + String mname = m != null ? m.name() : "unnamed"; + if (ms == null) { + trace("%s not exported in %s%n", classname, this.name()); + } else if (!(ms.isEmpty() || ms.contains(mname))) { + trace("%s not permit to %s %s%n", classname, mname, ms); + } + return ms != null && (ms.isEmpty() || ms.contains(mname)); + } + + private static final boolean traceOn = Boolean.getBoolean("jdeps.debug"); + private void trace(String fmt, Object... args) { + if (traceOn) { + System.err.format(fmt, args); + } + } + + @Override + public boolean equals(Object ob) { + if (!(ob instanceof Module)) + return false; + Module that = (Module)ob; + return (moduleName.equals(that.moduleName) + && requires.equals(that.requires) + && exports.equals(that.exports) + && packages.equals(that.packages)); + } + + @Override + public int hashCode() { + int hc = moduleName.hashCode(); + hc = hc * 43 + requires.hashCode(); + hc = hc * 43 + exports.hashCode(); + hc = hc * 43 + packages.hashCode(); + return hc; + } + + @Override + public String toString() { + return name(); + } + + public final static class Builder { + String name; + ClassFileReader reader; + final Map<String, Boolean> requires = new HashMap<>(); + final Map<String, Set<String>> exports = new HashMap<>(); + final Set<String> packages = new HashSet<>(); + + public Builder() { + } + + public Builder name(String n) { + name = n; + return this; + } + + public Builder require(String d, boolean reexport) { + // System.err.format("%s depend %s reexports %s%n", name, d, reexport); + requires.put(d, reexport); + return this; + } + + public Builder packages(Set<String> pkgs) { + packages.addAll(pkgs); + return this; + } + + public Builder export(String p, Set<String> ms) { + Objects.requireNonNull(p); + Objects.requireNonNull(ms); + exports.put(p, new HashSet<>(ms)); + return this; + } + public Builder classes(ClassFileReader.ModuleClassReader reader) { + this.reader = reader; + return this; + } + + public Module build() { + Module m = new Module(reader, name, requires, exports, packages); + return m; + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/ModulesXmlReader.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.XMLEvent; +import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader; +import com.sun.tools.jdeps.PlatformClassPath.ImageHelper; + +final class ModulesXmlReader { + public static Set<Module> load(ImageHelper helper,InputStream in) + throws IOException + { + try { + ModulesXmlReader reader = new ModulesXmlReader(helper); + return reader.load(in); + } catch (XMLStreamException e) { + throw new RuntimeException(e); + } + } + + private static final String MODULES = "modules"; + private static final String MODULE = "module"; + private static final String NAME = "name"; + private static final String DEPEND = "depend"; + private static final String EXPORT = "export"; + private static final String TO = "to"; + private static final QName REEXPORTS = new QName("re-exports"); + private final ImageHelper helper; + ModulesXmlReader(ImageHelper helper) { + this.helper = helper; + } + + public Set<Module> load(InputStream in) throws XMLStreamException, IOException { + Set<Module> modules = new HashSet<>(); + if (in == null) { + throw new RuntimeException("jdeps-modules.xml doesn't exist"); + } + XMLInputFactory factory = XMLInputFactory.newInstance(); + XMLEventReader reader = factory.createXMLEventReader(in, "UTF-8"); + Module.Builder mb = null; + String modulename = null; + String exportedPackage = null; + Set<String> permits = new HashSet<>(); + while (reader.hasNext()) { + XMLEvent event = reader.nextEvent(); + if (event.isStartElement()) { + String startTag = event.asStartElement().getName().getLocalPart(); + switch (startTag) { + case MODULES: + break; + case MODULE: + if (mb != null) { + throw new RuntimeException("end tag for module is missing"); + } + modulename = getNextTag(reader, NAME); + mb = new Module.Builder(); + mb.name(modulename); + break; + case NAME: + throw new RuntimeException(event.toString()); + case DEPEND: + boolean reexports = false; + Attribute attr = event.asStartElement().getAttributeByName(REEXPORTS); + if (attr != null) { + String value = attr.getValue(); + if (value.equals("true") || value.equals("false")) { + reexports = Boolean.parseBoolean(value); + } else { + throw new RuntimeException("unexpected attribute " + attr.toString()); + } + } + mb.require(getData(reader), reexports); + break; + case EXPORT: + exportedPackage = getNextTag(reader, NAME); + break; + case TO: + permits.add(getData(reader)); + break; + default: + throw new RuntimeException("invalid element: " + event); + } + } else if (event.isEndElement()) { + String endTag = event.asEndElement().getName().getLocalPart(); + switch (endTag) { + case MODULE: + ModuleClassReader cfr = helper.getModuleClassReader(modulename); + mb.classes(cfr); + mb.packages(cfr.packages()); + modules.add(mb.build()); + mb = null; + break; + case EXPORT: + if (exportedPackage == null) { + throw new RuntimeException("export's name is missing"); + } + mb.export(exportedPackage, permits); + exportedPackage = null; + permits.clear(); + break; + default: + } + } else if (event.isCharacters()) { + String s = event.asCharacters().getData(); + if (!s.trim().isEmpty()) { + throw new RuntimeException("export-to is malformed"); + } + } + } + return modules; + } + private String getData(XMLEventReader reader) throws XMLStreamException { + XMLEvent e = reader.nextEvent(); + if (e.isCharacters()) { + return e.asCharacters().getData(); + } + throw new RuntimeException(e.toString()); + } + + private String getNextTag(XMLEventReader reader, String tag) throws XMLStreamException { + XMLEvent e = reader.nextTag(); + if (e.isStartElement()) { + String t = e.asStartElement().getName().getLocalPart(); + if (!tag.equals(t)) { + throw new RuntimeException(e + " expected: " + tag); + } + return getData(reader); + } + throw new RuntimeException("export-to name is missing:" + e); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.jdeps.ClassFileReader.ModuleClassReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedInputStream; +import java.net.URI; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; +import java.util.stream.Collectors; + +/** + * ClassPath for Java SE and JDK + */ +class PlatformClassPath { + private static List<Archive> modules; + static synchronized List<Archive> getModules(Path mpath) throws IOException { + if (modules == null) { + initPlatformModules(mpath); + } + return modules; + } + + private static void initPlatformModules(Path mpath) throws IOException { + ImageHelper helper = ImageHelper.getInstance(mpath); + String fn = System.getProperty("jdeps.modules.xml"); + if (fn != null) { + Path p = Paths.get(fn); + try (InputStream in = new BufferedInputStream(Files.newInputStream(p))) { + modules = new ArrayList<>(ModulesXmlReader.load(helper, in)); + } + } else { + try (InputStream in = PlatformClassPath.class + .getResourceAsStream("resources/jdeps-modules.xml")) { + modules = new ArrayList<>(ModulesXmlReader.load(helper, in)); + } + } + if (findModule("java.base") != null) { + Profile.initProfiles(modules); + } + } + + /** + * Finds the module with the given name. Returns null + * if such module doesn't exist. + * + * @param mn module name + */ + static Module findModule(String mn) { + for (Archive a : modules) { + if (Module.class.isInstance(a)) { + Module m = (Module)a; + if (mn.equals(m.name())) { + return m; + } + } + } + return null; + } + + /** + * Returns JAR files in $java.home/lib. This is for transition until + * all components are linked into jimage. + */ + static List<Archive> getJarFiles() throws IOException { + Path home = Paths.get(System.getProperty("java.home"), "lib"); + return Files.find(home, 1, (Path p, BasicFileAttributes attr) + -> p.getFileName().toString().endsWith(".jar")) + .map(Archive::getInstance) + .collect(Collectors.toList()); + } + + static class ImageHelper { + static ImageHelper getInstance(Path mpath) throws IOException { + if (mpath != null) { + return new ImageHelper(mpath); + } + Path home = Paths.get(System.getProperty("java.home")); + Path mlib = home.resolve("lib").resolve("modules"); + if (Files.isDirectory(mlib)) { + // jimage + FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); + return new ImageHelper(fs, fs.getPath("/")); + } else { + // exploded modules + mlib = home.resolve("modules"); + if (!Files.isDirectory(mlib)) { + throw new InternalError(home + " not a modular image"); + } + return new ImageHelper(mlib); + } + } + + private final FileSystem fs; + private final Path mpath; + + ImageHelper(Path path) throws IOException { + this(FileSystems.getDefault(), path); + } + + ImageHelper(FileSystem fs, Path path) throws IOException { + this.fs = fs; + this.mpath = path; + } + + /** + * Returns a ModuleClassReader that only reads classes for the given modulename. + */ + public ModuleClassReader getModuleClassReader(String modulename) + throws IOException + { + Path mp = mpath.resolve(modulename); + if (Files.exists(mp) && Files.isDirectory(mp)) { + return new ModuleClassReader(fs, modulename, mp); + } else { + // aggregator module or os-specific module in jdeps-modules.xml + // mdir not exist + return new NonExistModuleReader(fs, modulename, mp); + } + } + + static class NonExistModuleReader extends ModuleClassReader { + private final List<ClassFile> classes = Collections.emptyList(); + + private NonExistModuleReader(FileSystem fs, String mn, Path mpath) + throws IOException + { + super(fs, mn, mpath); + } + + public ClassFile getClassFile(String name) throws IOException { + return null; + } + + public Iterable<ClassFile> getClassFiles() throws IOException { + return classes; + } + + public Set<String> packages() { + return Collections.emptySet(); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/Profile.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.jdeps; + +import java.io.IOException; +import java.util.*; + +/** + * Build the profile information. + */ +enum Profile { + COMPACT1("compact1", 1, "java.compact1"), + COMPACT2("compact2", 2, "java.compact2"), + COMPACT3("compact3", 3, "java.compact3", "java.smartcardio", "jdk.sctp", + "jdk.httpserver", "jdk.security.auth", + "jdk.naming.dns", "jdk.naming.rmi", + "jdk.management"), + FULL_JRE("Full JRE", 4, "java.se", "jdk.deploy.osx", "jdk.charsets", + "jdk.crypto.ec", "jdk.crypto.pkcs11", + "jdk.crypto.mscapi", "jdk.crypto.ucrypto", "jdk.jvmstat", + "jdk.localedata", "jdk.scripting.nashorn", "jdk.zipfs"); + + final String name; + final int profile; + final String[] mnames; + final Set<Module> modules = new HashSet<>(); + + Profile(String name, int profile, String... mnames) { + this.name = name; + this.profile = profile; + this.mnames = mnames; + } + + public String profileName() { + return name; + } + + @Override + public String toString() { + return mnames[0]; + } + + public static int getProfileCount() { + return JDK.isEmpty() ? 0 : Profile.values().length; + } + + /** + * Returns the Profile for the given package name; null if not found. + */ + public static Profile getProfile(String pn) { + for (Profile p : Profile.values()) { + for (Module m : p.modules) { + if (m.packages().contains(pn)) { + return p; + } + } + } + return null; + } + + /* + * Returns the Profile for a given Module; null if not found. + */ + public static Profile getProfile(Module m) { + for (Profile p : Profile.values()) { + if (p.modules.contains(m)) { + return p; + } + } + return null; + } + + private final static Set<Module> JDK = new HashSet<>(); + static void initProfiles(List<Archive> modules) { + // add all modules into JDK + modules.forEach(m -> JDK.add((Module)m)); + + for (Profile p : Profile.values()) { + for (String mn : p.mnames) { + // this includes platform-dependent module that may not exist + Module m = PlatformClassPath.findModule(mn); + if (m != null) { + p.addModule(m); + } + } + } + } + + private void addModule(Module m) { + modules.add(m); + for (String n : m.requires().keySet()) { + Module d = PlatformClassPath.findModule(n); + if (d == null) { + throw new InternalError("module " + n + " required by " + + m.name() + " doesn't exist"); + } + modules.add(d); + } + } + // for debugging + public static void main(String[] args) throws IOException { + // find platform modules + PlatformClassPath.getModules(null); + if (Profile.getProfileCount() == 0) { + System.err.println("No profile is present in this JDK"); + } + for (Profile p : Profile.values()) { + String profileName = p.name; + System.out.format("%2d: %-10s %s%n", p.profile, profileName, p.modules); + for (Module m: p.modules) { + System.out.format("module %s%n", m.name()); + System.out.format(" requires %s%n", m.requires()); + for (Map.Entry<String,Set<String>> e: m.exports().entrySet()) { + System.out.format(" exports %s %s%n", e.getKey(), + e.getValue().isEmpty() ? "" : "to " + e.getValue()); + } + } + } + System.out.println("All JDK modules:-"); + JDK.stream().sorted(Comparator.comparing(Module::name)) + .forEach(m -> System.out.println(m)); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,107 @@ +main.usage.summary=\ +Usage: {0} <options> <classes...>\n\ +use -h, -? or -help for a list of possible options + +main.usage=\ +Usage: {0} <options> <classes...>\n\ +where <classes> can be a pathname to a .class file, a directory, a JAR file,\n\ +or a fully-qualified class name. Possible options include: + +error.prefix=Error: +warn.prefix=Warning: + +main.opt.h=\ +\ -h -? -help Print this usage message + +main.opt.version=\ +\ -version Version information + +main.opt.v=\ +\ -v -verbose Print all class level dependencies\n\ +\ Equivalent to -verbose:class -filter:none.\n\ +\ -verbose:package Print package-level dependencies excluding\n\ +\ dependencies within the same package by default\n\ +\ -verbose:class Print class-level dependencies excluding\n\ +\ dependencies within the same package by default + +main.opt.f=\ +\ -f <regex> -filter <regex> Filter dependences matching the given pattern\n\ +\ If given multiple times, the last one will be used.\n\ +\ -filter:package Filter dependences within the same package (default)\n\ +\ -filter:archive Filter dependences within the same archive\n\ +\ -filter:none No -filter:package and -filter:archive filtering\n\ +\ Filtering specified via the -filter option still applies. + +main.opt.s=\ +\ -s -summary Print dependency summary only + +main.opt.p=\ +\ -p <pkgname> -package <pkgname> Finds dependences matching the given package name\n\ +\ (may be given multiple times) + +main.opt.e=\ +\ -e <regex> -regex <regex> Finds dependences matching the given pattern\n\ +\ (-p and -e are exclusive) + +main.opt.include=\ +\ -include <regex> Restrict analysis to classes matching pattern\n\ +\ This option filters the list of classes to\n\ +\ be analyzed. It can be used together with\n\ +\ -p and -e which apply pattern to the dependences + +main.opt.P=\ +\ -P -profile Show profile or the file containing a package + +main.opt.M=\ +\ -M -module Show module containing the package + +main.opt.cp=\ +\ -cp <path> -classpath <path> Specify where to find class files + +main.opt.R=\ +\ -R -recursive Recursively traverse all dependencies.\n\ +\ The -R option implies -filter:none. If -p, -e, -f\n\ +\ option is specified, only the matching dependences\n\ +\ are analyzed. + +main.opt.apionly=\ +\ -apionly Restrict analysis to APIs i.e. dependences\n\ +\ from the signature of public and protected\n\ +\ members of public classes including field\n\ +\ type, method parameter types, returned type,\n\ +\ checked exception types etc + +main.opt.dotoutput=\ +\ -dotoutput <dir> Destination directory for DOT file output + +main.opt.jdkinternals=\ +\ -jdkinternals Finds class-level dependences on JDK internal APIs.\n\ +\ By default, it analyzes all classes on -classpath\n\ +\ and input files unless -include option is specified.\n\ +\ This option cannot be used with -p, -e and -s options.\n\ +\ WARNING: JDK internal APIs may not be accessible in\n\ +\ the next release. + +main.opt.depth=\ +\ -depth=<depth> Specify the depth of the transitive\n\ +\ dependency analysis + + +err.unknown.option=unknown option: {0} +err.missing.arg=no value given for {0} +err.invalid.arg.for.option=invalid argument for option: {0} +err.option.after.class=option must be specified before classes: {0} +err.option.unsupported={0} not supported: {1} +err.profiles.msg=No profile information +err.invalid.path=invalid path: {0} +warn.invalid.arg=Invalid classname or pathname not exist: {0} +warn.split.package=package {0} defined in {1} {2} +warn.replace.useJDKInternals=\ +JDK internal APIs are unsupported and private to JDK implementation that are\n\ +subject to be removed or changed incompatibly and could break your application.\n\ +Please modify your code to eliminate dependency on any JDK internal APIs.\n\ +For the most recent update on JDK internal API replacements, please check:\n\ +{0} + +artifact.not.found=not found +jdeps.wiki.url=https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,45 @@ +main.usage.summary=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes...>\n\u4F7F\u7528\u53EF\u80FD\u306A\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u30EA\u30B9\u30C8\u306B\u3064\u3044\u3066\u306F\u3001-h\u3001-?\u307E\u305F\u306F--help\u3092\u4F7F\u7528\u3057\u307E\u3059 + +main.usage=\u4F7F\u7528\u65B9\u6CD5: {0} <options> <classes...>\n<classes>\u306B\u306F\u3001.class\u30D5\u30A1\u30A4\u30EB\u306E\u30D1\u30B9\u540D\u3001\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3001JAR\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u5B8C\u5168\u4FEE\u98FE\n\u30AF\u30E9\u30B9\u540D\u3092\u6307\u5B9A\u3067\u304D\u307E\u3059\u3002\u4F7F\u7528\u3067\u304D\u308B\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059: + +error.prefix=\u30A8\u30E9\u30FC: +warn.prefix=\u8B66\u544A: + +main.opt.h=\ -h -? -help \u3053\u306E\u4F7F\u7528\u65B9\u6CD5\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u51FA\u529B\u3057\u307E\u3059 + +main.opt.version=\ -version \u30D0\u30FC\u30B8\u30E7\u30F3\u60C5\u5831 + +main.opt.v=\ -v -verbose \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u3059\u3079\u3066\u51FA\u529B\u3057\u307E\u3059\n -verbose:package \u30D1\u30C3\u30B1\u30FC\u30B8\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F)\n -verbose:class \u30AF\u30E9\u30B9\u30FB\u30EC\u30D9\u30EB\u306E\u4F9D\u5B58\u6027\u3092\u51FA\u529B\u3057\u307E\u3059\n (\u540C\u3058\u30A2\u30FC\u30AB\u30A4\u30D6\u5185\u306E\u4F9D\u5B58\u6027\u3092\u9664\u304F) + +main.opt.s=\ -s -summary \u4F9D\u5B58\u6027\u306E\u8981\u7D04\u306E\u307F\u51FA\u529B\u3057\u307E\u3059 + +main.opt.p=\ -p <pkgname> -package <pkgname> \u6307\u5B9A\u306E\u30D1\u30C3\u30B1\u30FC\u30B8\u5185\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\n (\u8907\u6570\u56DE\u6307\u5B9A\u53EF\u80FD) + +main.opt.e=\ -e <regex> -regex <regex> \u30D1\u30BF\u30FC\u30F3\u306B\u4E00\u81F4\u3059\u308B\u30D1\u30C3\u30B1\u30FC\u30B8\u5185\u306E\u4F9D\u5B58\u6027\u3092\u691C\u51FA\u3057\u307E\u3059\n (-p\u3068-e\u306F\u6392\u4ED6\u7684) + +main.opt.include=\ -include <regex> \u30D1\u30BF\u30FC\u30F3\u306B\u4E00\u81F4\u3059\u308B\u30AF\u30E9\u30B9\u306B\u5206\u6790\u3092\u5236\u9650\u3057\u307E\u3059\n \u3053\u306E\u30AA\u30D7\u30B7\u30E7\u30F3\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u5206\u6790\u5BFE\u8C61\u30AF\u30E9\u30B9\u306E\n \u30EA\u30B9\u30C8\u304C\u30D5\u30A3\u30EB\u30BF\u51E6\u7406\u3055\u308C\u307E\u3059\u3002\u30D1\u30BF\u30FC\u30F3\u3092\u4F9D\u5B58\u6027\u306B\n \u9069\u7528\u3059\u308B-p\u304A\u3088\u3073-e\u3068\u4E00\u7DD2\u306B\u4F7F\u7528\u3067\u304D\u307E\u3059 + +main.opt.P=\ -P -profile \u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u3001\u307E\u305F\u306F\u30D1\u30C3\u30B1\u30FC\u30B8\u3092\u542B\u3080\u30D5\u30A1\u30A4\u30EB\u3092\u8868\u793A\u3057\u307E\u3059 + +main.opt.cp=\ -cp <path> -classpath <path> \u30AF\u30E9\u30B9\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u691C\u7D22\u3059\u308B\u5834\u6240\u3092\u6307\u5B9A\u3057\u307E\u3059 + +main.opt.R=\ -R -recursive \u3059\u3079\u3066\u306E\u4F9D\u5B58\u6027\u3092\u53CD\u5FA9\u7684\u306B\u8D70\u67FB\u3057\u307E\u3059 + +main.opt.apionly=\ -apionly \u5206\u6790\u3092API\u3001\u3064\u307E\u308A\u3001\u30D1\u30D6\u30EA\u30C3\u30AF\u30FB\u30AF\u30E9\u30B9\u306E\n \u30D1\u30D6\u30EA\u30C3\u30AF\u30FB\u30E1\u30F3\u30D0\u30FC\u304A\u3088\u3073\u4FDD\u8B77\u3055\u308C\u305F\u30E1\u30F3\u30D0\u30FC\u306E\n \u7F72\u540D\u306B\u304A\u3051\u308B\u4F9D\u5B58\u6027(\u30D5\u30A3\u30FC\u30EB\u30C9\u30FB\u30BF\u30A4\u30D7\u3001\u30E1\u30BD\u30C3\u30C9\u30FB\n \u30D1\u30E9\u30E1\u30FC\u30BF\u30FB\u30BF\u30A4\u30D7\u3001\u623B\u3055\u308C\u305F\u30BF\u30A4\u30D7\u3001\u30C1\u30A7\u30C3\u30AF\u3055\u308C\u305F\n \u4F8B\u5916\u30BF\u30A4\u30D7\u306A\u3069)\u306B\u5236\u9650\u3057\u307E\u3059 + +main.opt.dotoutput=\ -dotoutput <dir> DOT\u30D5\u30A1\u30A4\u30EB\u51FA\u529B\u306E\u5B9B\u5148\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA + +main.opt.depth=\ -depth=<depth> \u63A8\u79FB\u7684\u306A\u4F9D\u5B58\u6027\u5206\u6790\u306E\u6DF1\u3055\u3092\n \u6307\u5B9A\u3057\u307E\u3059 + +err.unknown.option=\u4E0D\u660E\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0} +err.missing.arg={0}\u306B\u5024\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093 +err.internal.error=\u5185\u90E8\u30A8\u30E9\u30FC: {0} {1} {2} +err.invalid.arg.for.option=\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0} +err.option.after.class=\u30AA\u30D7\u30B7\u30E7\u30F3\u306F\u30AF\u30E9\u30B9\u306E\u524D\u306B\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059: {0} +err.option.unsupported={0}\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093: {1} +err.profiles.msg=\u30D7\u30ED\u30D5\u30A1\u30A4\u30EB\u60C5\u5831\u304C\u3042\u308A\u307E\u305B\u3093 +err.dot.output.path=\u7121\u52B9\u306A\u30D1\u30B9: {0} +warn.invalid.arg=\u7121\u52B9\u306A\u30AF\u30E9\u30B9\u540D\u307E\u305F\u306F\u30D1\u30B9\u540D\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {0} +warn.split.package=\u30D1\u30C3\u30B1\u30FC\u30B8{0}\u306F{1} {2}\u3067\u5B9A\u7FA9\u3055\u308C\u3066\u3044\u307E\u3059 + +artifact.not.found=\u898B\u3064\u304B\u308A\u307E\u305B\u3093
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,45 @@ +main.usage.summary=\u7528\u6CD5: {0} <options> <classes...>\n\u4F7F\u7528 -h, -? \u6216 --help \u5217\u51FA\u53EF\u80FD\u7684\u9009\u9879 + +main.usage=\u7528\u6CD5: {0} <options> <classes...>\n\u5176\u4E2D <classes> \u53EF\u4EE5\u662F .class \u6587\u4EF6, \u76EE\u5F55, JAR \u6587\u4EF6\u7684\u8DEF\u5F84\u540D,\n\u4E5F\u53EF\u4EE5\u662F\u5168\u9650\u5B9A\u7C7B\u540D\u3002\u53EF\u80FD\u7684\u9009\u9879\u5305\u62EC: + +error.prefix=\u9519\u8BEF: +warn.prefix=\u8B66\u544A: + +main.opt.h=\ -h -? -help \u8F93\u51FA\u6B64\u7528\u6CD5\u6D88\u606F + +main.opt.version=\ -version \u7248\u672C\u4FE1\u606F + +main.opt.v=\ -v -verbose \u8F93\u51FA\u6240\u6709\u7C7B\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61\n -verbose:package \u8F93\u51FA\u7A0B\u5E8F\u5305\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61, \u4E0D\u5305\u62EC\n \u540C\u4E00\u6863\u6848\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n -verbose:class \u8F93\u51FA\u7C7B\u7EA7\u522B\u88AB\u4F9D\u8D56\u5BF9\u8C61, \u4E0D\u5305\u62EC\n \u540C\u4E00\u6863\u6848\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61 + +main.opt.s=\ -s -summary \u4EC5\u8F93\u51FA\u88AB\u4F9D\u8D56\u5BF9\u8C61\u6982\u8981 + +main.opt.p=\ -p <pkgname> -package <pkgname> \u67E5\u627E\u7ED9\u5B9A\u7A0B\u5E8F\u5305\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n (\u53EF\u80FD\u591A\u6B21\u6307\u5B9A) + +main.opt.e=\ -e <regex> -regex <regex> \u67E5\u627E\u4E0E\u6A21\u5F0F\u5339\u914D\u7684\u7A0B\u5E8F\u5305\u4E2D\u7684\u88AB\u4F9D\u8D56\u5BF9\u8C61\n (-p \u548C -e \u4E92\u76F8\u6392\u65A5) + +main.opt.include=\ -include <regex> \u5C06\u5206\u6790\u9650\u5236\u4E3A\u4E0E\u6A21\u5F0F\u5339\u914D\u7684\u7C7B\n \u6B64\u9009\u9879\u7B5B\u9009\u8981\u5206\u6790\u7684\u7C7B\u7684\u5217\u8868\u3002\n \u5B83\u53EF\u4EE5\u4E0E\u5411\u88AB\u4F9D\u8D56\u5BF9\u8C61\u5E94\u7528\u6A21\u5F0F\u7684\n -p \u548C -e \u7ED3\u5408\u4F7F\u7528 + +main.opt.P=\ -P -profile \u663E\u793A\u914D\u7F6E\u6587\u4EF6\u6216\u5305\u542B\u7A0B\u5E8F\u5305\u7684\u6587\u4EF6 + +main.opt.cp=\ -cp <path> -classpath <path> \u6307\u5B9A\u67E5\u627E\u7C7B\u6587\u4EF6\u7684\u4F4D\u7F6E + +main.opt.R=\ -R -recursive \u9012\u5F52\u904D\u5386\u6240\u6709\u88AB\u4F9D\u8D56\u5BF9\u8C61 + +main.opt.apionly=\ -apionly \u901A\u8FC7\u516C\u5171\u7C7B (\u5305\u62EC\u5B57\u6BB5\u7C7B\u578B, \u65B9\u6CD5\u53C2\u6570\n \u7C7B\u578B, \u8FD4\u56DE\u7C7B\u578B, \u53D7\u63A7\u5F02\u5E38\u9519\u8BEF\u7C7B\u578B\n \u7B49) \u7684\u516C\u5171\u548C\u53D7\u4FDD\u62A4\u6210\u5458\u7684\u7B7E\u540D\n \u9650\u5236\u5BF9 API (\u5373\u88AB\u4F9D\u8D56\u5BF9\u8C61)\n \u8FDB\u884C\u5206\u6790 + +main.opt.dotoutput=\ -dotoutput <dir> DOT \u6587\u4EF6\u8F93\u51FA\u7684\u76EE\u6807\u76EE\u5F55 + +main.opt.depth=\ -depth=<depth> \u6307\u5B9A\u8FC7\u6E21\u88AB\u4F9D\u8D56\u5BF9\u8C61\u5206\u6790\n \u7684\u6DF1\u5EA6 + +err.unknown.option=\u672A\u77E5\u9009\u9879: {0} +err.missing.arg=\u6CA1\u6709\u4E3A{0}\u6307\u5B9A\u503C +err.internal.error=\u5185\u90E8\u9519\u8BEF: {0} {1} {2} +err.invalid.arg.for.option=\u9009\u9879\u7684\u53C2\u6570\u65E0\u6548: {0} +err.option.after.class=\u5FC5\u987B\u5728\u7C7B\u4E4B\u524D\u6307\u5B9A\u9009\u9879: {0} +err.option.unsupported=\u4E0D\u652F\u6301{0}: {1} +err.profiles.msg=\u6CA1\u6709\u914D\u7F6E\u6587\u4EF6\u4FE1\u606F +err.dot.output.path=\u65E0\u6548\u8DEF\u5F84: {0} +warn.invalid.arg=\u7C7B\u540D\u65E0\u6548\u6216\u8DEF\u5F84\u540D\u4E0D\u5B58\u5728: {0} +warn.split.package=\u5DF2\u5728{1} {2}\u4E2D\u5B9A\u4E49\u7A0B\u5E8F\u5305{0} + +artifact.not.found=\u627E\u4E0D\u5230
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/jdkinternals.properties Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,22 @@ +// No translation needed +com.sun.crypto.provider.SunJCE=Use java.security.Security.getProvider(provider-name) @since 1.3 +com.sun.image.codec=Use javax.imageio @since 1.4 +com.sun.org.apache.xml.internal.security=Use java.xml.crypto @since 1.6 +com.sun.org.apache.xml.internal.security.utils.Base64=Use java.util.Base64 @since 1.8 +com.sun.net.ssl=Use javax.net.ssl @since 1.4 +com.sun.net.ssl.internal.ssl.Provider=Use java.security.Security.getProvider(provider-name) @since 1.3 +com.sun.rowset=Use javax.sql.rowset.RowSetProvider @since 1.7 +com.sun.tools.javac.tree=Use com.sun.source @since 1.6 +com.sun.tools.javac=Use javax.tools and javax.lang.model @since 1.6 +sun.awt.image.codec=Use javax.imageio @since 1.4 +sun.misc.BASE64Encoder=Use java.util.Base64 @since 1.8 +sun.misc.BASE64Decoder=Use java.util.Base64 @since 1.8 +sun.misc.Cleaner=Use java.lang.ref.PhantomReference @since 1.2 +sun.misc.Service=Use java.util.ServiceLoader @since 1.6 +sun.security.action=Use java.security.PrivilegedAction @since 1.1 +sun.security.krb5=Use com.sun.security.jgss +sun.security.provider.PolicyFile=Use java.security.Policy.getInstance("JavaPolicy", new URIParameter(uri)) @since 1.6 +sun.security.provider.Sun=Use java.security.Security.getProvider(provider-name) @since 1.3 +sun.security.util.SecurityConstants=Use appropriate java.security.Permission subclass @since 1.1 +sun.security.x509.X500Name=Use javax.security.auth.x500.X500Principal @since 1.4 +sun.tools.jar=Use java.util.jar or jar tool @since 1.2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jdk.jdeps/share/classes/com/sun/tools/jdeps/resources/version.properties-template Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,28 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +jdk=$(JDK_VERSION) +full=$(FULL_VERSION) +release=$(RELEASE)
--- a/test/tools/javac/4241573/T4241573.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/4241573/T4241573.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4241573 * @summary SourceFile attribute includes full path - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.Attribute;
--- a/test/tools/javac/4846262/CheckEBCDICLocaleTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/4846262/CheckEBCDICLocaleTest.java Thu May 28 16:54:56 2015 -0700 @@ -34,6 +34,7 @@ */ import java.io.File; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -64,14 +65,11 @@ public void test() throws Exception { ToolBox tb = new ToolBox(); - Path native2asciiBinary = tb.getJDKTool("native2ascii"); - tb.writeFile("Test.java", TestSrc); tb.createDirectories("output"); - tb.new ExecTask(native2asciiBinary) - .args("-reverse", "-encoding", "IBM1047", "Test.java", "output/Test.java") - .run(); + Native2Ascii n2a = new Native2Ascii(Charset.forName("IBM1047")); + n2a.asciiToNative(Paths.get("Test.java"), Paths.get("output", "Test.java")); tb.new JavacTask(ToolBox.Mode.EXEC) .redirect(ToolBox.OutputKind.STDERR, "Test.tmp") @@ -81,14 +79,25 @@ .files("output/Test.java") .run(ToolBox.Expect.FAIL); - tb.new ExecTask(native2asciiBinary) - .args("-encoding", "IBM1047", "Test.tmp", "Test.out") - .run(); + n2a.nativeToAscii(Paths.get("Test.tmp"), Paths.get("Test.out")); List<String> expectLines = Arrays.asList( String.format(TestOutTemplate, File.separator).split("\n")); List<String> actualLines = Files.readAllLines(Paths.get("Test.out")); - tb.checkEqual(expectLines, actualLines); + try { + tb.checkEqual(expectLines, actualLines); + } catch (Throwable tt) { + System.err.println("current ouput don't have the expected number of lines. See output below"); + + System.err.println("Expected output:"); + System.err.println(TestOutTemplate); + System.err.println(); + System.err.println("Actual output:"); + for (String s : actualLines) { + System.err.println(s); + } + System.err.println(); + throw tt; + } } - }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/4846262/Native2Ascii.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FilterReader; +import java.io.FilterWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.file.Files; +import java.nio.file.Path; +import static java.nio.charset.StandardCharsets.*; + +/** + * Simple utility to convert from native encoding file to ascii or reverse + * including \udddd Unicode notation. + */ +public class Native2Ascii { + final Charset cs; + final CharsetEncoder encoder; + public Native2Ascii(Charset cs) { + this.cs = cs; + this.encoder = cs.newEncoder(); + } + + /** + * ASCII to Native conversion + */ + public void asciiToNative(Path infile, Path outfile) throws IOException { + try (BufferedReader in = Files.newBufferedReader(infile, US_ASCII); + BufferedReader reader = new BufferedReader(new A2NFilter(in)); + BufferedWriter writer = Files.newBufferedWriter(outfile, cs)) { + String line; + while ((line = reader.readLine()) != null) { + writer.write(line.toCharArray()); + writer.newLine(); + } + } + } + + /** + * Native to ASCII conversion + */ + public void nativeToAscii(Path infile, Path outfile) throws IOException { + try (BufferedReader reader = Files.newBufferedReader(infile, cs); + BufferedWriter out = Files.newBufferedWriter(outfile, US_ASCII); + BufferedWriter writer = new BufferedWriter(new N2AFilter(out))) { + String line; + while ((line = reader.readLine()) != null) { + writer.write(line.toCharArray()); + writer.newLine(); + } + } + } + + // A copy of native2ascii N2AFilter + class N2AFilter extends FilterWriter { + public N2AFilter(Writer out) { super(out); } + public void write(char b) throws IOException { + char[] buf = new char[1]; + buf[0] = b; + write(buf, 0, 1); + } + + public void write(char[] buf, int off, int len) throws IOException { + for (int i = 0; i < len; i++) { + if ((buf[i] > '\u007f')) { + // write \udddd + out.write('\\'); + out.write('u'); + String hex = Integer.toHexString(buf[i]); + StringBuilder hex4 = new StringBuilder(hex); + hex4.reverse(); + int length = 4 - hex4.length(); + for (int j = 0; j < length; j++) { + hex4.append('0'); + } + for (int j = 0; j < 4; j++) { + out.write(hex4.charAt(3 - j)); + } + } else + out.write(buf[i]); + } + } + } + + // A copy of native2ascii A2NFilter + class A2NFilter extends FilterReader { + // maintain a trailing buffer to hold any incompleted + // unicode escaped sequences + private char[] trailChars = null; + + public A2NFilter(Reader in) { + super(in); + } + + public int read(char[] buf, int off, int len) throws IOException { + int numChars = 0; // how many characters have been read + int retChars = 0; // how many characters we'll return + + char[] cBuf = new char[len]; + int cOffset = 0; // offset at which we'll start reading + boolean eof = false; + + // copy trailing chars from previous invocation to input buffer + if (trailChars != null) { + for (int i = 0; i < trailChars.length; i++) + cBuf[i] = trailChars[i]; + numChars = trailChars.length; + trailChars = null; + } + + int n = in.read(cBuf, numChars, len - numChars); + if (n < 0) { + eof = true; + if (numChars == 0) + return -1; // EOF; + } else { + numChars += n; + } + + for (int i = 0; i < numChars; ) { + char c = cBuf[i++]; + + if (c != '\\' || (eof && numChars <= 5)) { + // Not a backslash, so copy and continue + // Always pass non backslash chars straight thru + // for regular encoding. If backslash occurs in + // input stream at the final 5 chars then don't + // attempt to read-ahead and de-escape since these + // are literal occurrences of U+005C which need to + // be encoded verbatim in the target encoding. + buf[retChars++] = c; + continue; + } + + int remaining = numChars - i; + if (remaining < 5) { + // Might be the first character of a unicode escape, but we + // don't have enough characters to tell, so save it and finish + trailChars = new char[1 + remaining]; + trailChars[0] = c; + for (int j = 0; j < remaining; j++) + trailChars[1 + j] = cBuf[i + j]; + break; + } + // At this point we have at least five characters remaining + + c = cBuf[i++]; + if (c != 'u') { + // Not a unicode escape, so copy and continue + buf[retChars++] = '\\'; + buf[retChars++] = c; + continue; + } + + // The next four characters are the hex part of a unicode escape + char rc = 0; + boolean isUE = true; + try { + rc = (char) Integer.parseInt(new String(cBuf, i, 4), 16); + } catch (NumberFormatException x) { + isUE = false; + } + if (isUE && encoder.canEncode(rc)) { + // We'll be able to convert this + buf[retChars++] = rc; + i += 4; // Align beyond the current uXXXX sequence + } else { + // We won't, so just retain the original sequence + buf[retChars++] = '\\'; + buf[retChars++] = 'u'; + continue; + } + + } + + return retChars; + } + + public int read() throws IOException { + char[] buf = new char[1]; + + if (read(buf, 0, 1) == -1) + return -1; + else + return (int) buf[0]; + } + } +}
--- a/test/tools/javac/7003595/T7003595.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/7003595/T7003595.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7003595 * @summary IncompatibleClassChangeError with unreferenced local class with subclass - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file */
--- a/test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 7153958 * @summary add constant pool reference to class containing inlined constants - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile pkg/ClassToBeStaticallyImported.java CPoolRefClassContainingInlinedCts.java * @run main CPoolRefClassContainingInlinedCts */
--- a/test/tools/javac/7166455/CheckACC_STRICTFlagOnclinitTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/7166455/CheckACC_STRICTFlagOnclinitTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 7166455 * @summary javac doesn't set ACC_STRICT bit on <clinit> for strictfp class - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main CheckACC_STRICTFlagOnclinitTest */
--- a/test/tools/javac/7199823/InnerClassCannotBeVerified.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/7199823/InnerClassCannotBeVerified.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7199823 * @summary javac generates inner class that can't be verified - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main InnerClassCannotBeVerified */
--- a/test/tools/javac/8000518/DuplicateConstantPoolEntry.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/8000518/DuplicateConstantPoolEntry.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8000518 * @summary Javac generates duplicate name_and_type constant pool entry for * class BinaryOpValueExp.java - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main DuplicateConstantPoolEntry */
--- a/test/tools/javac/8005931/CheckACC_STRICTFlagOnPkgAccessClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/8005931/CheckACC_STRICTFlagOnPkgAccessClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8005931 * @summary javac doesn't set ACC_STRICT for classes with package access - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main CheckACC_STRICTFlagOnPkgAccessClassTest */
--- a/test/tools/javac/8009170/RedundantByteCodeInArrayTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/8009170/RedundantByteCodeInArrayTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8009170 * @summary Regression: javac generates redundant bytecode in assignop involving * arrays - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main RedundantByteCodeInArrayTest */
--- a/test/tools/javac/MethodParameters/AnnotationTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/AnnotationTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters AnnotationTest.java * @run main Tester AnnotationTest AnnotationTest.out
--- a/test/tools/javac/MethodParameters/AnonymousClass.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/AnonymousClass.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters AnonymousClass.java * @run main Tester AnonymousClass AnonymousClass.out
--- a/test/tools/javac/MethodParameters/Constructors.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/Constructors.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters Constructors.java * @run main Tester Constructors Constructors.out
--- a/test/tools/javac/MethodParameters/EnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/EnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 8008658 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters EnumTest.java * @run main Tester EnumTest EnumTest.out
--- a/test/tools/javac/MethodParameters/InstanceMethods.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/InstanceMethods.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters InstanceMethods.java * @run main Tester InstanceMethods InstanceMethods.out
--- a/test/tools/javac/MethodParameters/LambdaTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/LambdaTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 8037546 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters LambdaTest.java * @run main Tester LambdaTest LambdaTest.out
--- a/test/tools/javac/MethodParameters/LocalClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/LocalClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 8008658 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters LocalClassTest.java * @run main Tester LocalClassTest LocalClassTest.out
--- a/test/tools/javac/MethodParameters/MemberClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/MemberClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 8008658 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters MemberClassTest.java * @run main Tester MemberClassTest MemberClassTest.out
--- a/test/tools/javac/MethodParameters/StaticMethods.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/StaticMethods.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters StaticMethods.java * @run main Tester StaticMethods StaticMethods.out
--- a/test/tools/javac/MethodParameters/UncommonParamNames.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParameters/UncommonParamNames.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8006582 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build Tester * @compile -parameters UncommonParamNames.java * @run main Tester UncommonParamNames UncommonParamNames.out
--- a/test/tools/javac/MethodParametersTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/MethodParametersTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8004727 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.code * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/NoStringToLower.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/NoStringToLower.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8029800 * @summary String.toLowerCase()/toUpperCase is generally dangerous, check it is not used in langtools - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javac/T6695379/AnnotationsAreNotCopiedToBridgeMethodsTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T6695379/AnnotationsAreNotCopiedToBridgeMethodsTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 6695379 * @summary Copy method annotations and parameter annotations to synthetic * bridge methods - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util * @run main AnnotationsAreNotCopiedToBridgeMethodsTest */
--- a/test/tools/javac/T6970173/DebugPointerAtBadPositionTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T6970173/DebugPointerAtBadPositionTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 6970173 * @summary Debug pointer at bad position * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/T7008643/InlinedFinallyConfuseDebuggersTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T7008643/InlinedFinallyConfuseDebuggersTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 7008643 * @summary inlined finally clauses confuse debuggers * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/T7053059/DoubleCastTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T7053059/DoubleCastTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8015499 * @summary javac, Gen is generating extra checkcast instructions in some corner cases - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util * @run main DoubleCastTest */
--- a/test/tools/javac/T7093325.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T7093325.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @summary Redundant entry in bytecode exception table * temporarily workaround combo tests are causing time out in several platforms * @library lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build JavacTestingAbstractThreadedTest * @run main/othervm T7093325 */
--- a/test/tools/javac/T7165659/InnerClassAttrMustNotHaveStrictFPFlagTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T7165659/InnerClassAttrMustNotHaveStrictFPFlagTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 7165659 * @summary javac incorrectly sets strictfp access flag on inner-classes - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util */
--- a/test/tools/javac/T8003967/DetectMutableStaticFields.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8003967/DetectMutableStaticFields.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8003967 * @summary detect and remove all mutable implicit static enum fields in langtools - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util * @run main DetectMutableStaticFields */
--- a/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8010737 * @summary javac, known parameter's names should be copied to automatically * generated constructors for inner classes - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.code * jdk.compiler/com.sun.tools.javac.tree
--- a/test/tools/javac/T8011181/EmptyUTF8ForInnerClassNameTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8011181/EmptyUTF8ForInnerClassNameTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8011181 * @summary javac, empty UTF8 entry generated for inner class - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util */
--- a/test/tools/javac/T8019486/WrongLNTForLambdaTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8019486/WrongLNTForLambdaTest.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @bug 8019486 8026861 8027142 * @summary javac, generates erroneous LVT for a test case with lambda code * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/T8022186/DeadCodeGeneratedForEmptyTryTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8022186/DeadCodeGeneratedForEmptyTryTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8022186 * @summary javac generates dead code if a try with an empty body has a finalizer - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util */
--- a/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @bug 8024039 * @summary javac, previous solution for JDK-8022186 was incorrect * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/T8028504/DontGenerateLVTForGNoneOpTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/T8028504/DontGenerateLVTForGNoneOpTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8028504 * @summary javac generates LocalVariableTable even with -g:none - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g:none DontGenerateLVTForGNoneOpTest.java * @run main DontGenerateLVTForGNoneOpTest */
--- a/test/tools/javac/annotations/SyntheticParameters.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/SyntheticParameters.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8065132 * @summary Test generation of annotations on inner class parameters. * @library /lib/annotations/ - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main SyntheticParameters */
--- a/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest1.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest1.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8005085 8005877 8004829 8005681 8006734 8006775 * @summary Combinations of Target ElementTypes on (repeated)type annotations. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest2.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest2.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8005085 8005877 8004829 8005681 8006734 8006775 8006507 * @summary Combinations of Target ElementTypes on (repeated)type annotations. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest3.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest3.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8005085 8005681 8008769 8010015 * @summary Check (repeating)type annotations on lambda usage. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main CombinationsTargetTest3 */
--- a/test/tools/javac/annotations/typeAnnotations/classfile/DeadCode.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/DeadCode.java Thu May 28 16:54:56 2015 -0700 @@ -32,7 +32,7 @@ * @test * @bug 6917130 8006775 * @summary test that optimized away annotations are not emited to classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class DeadCode extends ClassfileTestHelper {
--- a/test/tools/javac/annotations/typeAnnotations/classfile/NewTypeArguments.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/NewTypeArguments.java Thu May 28 16:54:56 2015 -0700 @@ -31,7 +31,7 @@ /* * @test ClassLiterals * @summary test that new type arguments are emitted to classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class NewTypeArguments extends ClassfileTestHelper{
--- a/test/tools/javac/annotations/typeAnnotations/classfile/NoTargetAnnotations.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/NoTargetAnnotations.java Thu May 28 16:54:56 2015 -0700 @@ -33,7 +33,7 @@ * @test NoTargetAnnotations * @summary test that annotations with no Target meta type is emitted * only once as declaration annotation - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class NoTargetAnnotations {
--- a/test/tools/javac/annotations/typeAnnotations/classfile/Scopes.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/Scopes.java Thu May 28 16:54:56 2015 -0700 @@ -32,7 +32,7 @@ * @test * @bug 6843077 8006775 * @summary Qualified inner type annotation accessible to the class. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ @Scopes.UniqueInner
--- a/test/tools/javac/annotations/typeAnnotations/classfile/SyntheticParameters.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/SyntheticParameters.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test SyntheticParameters * @summary Test generation of annotations on inner class parameters. * @library /lib/annotations/ - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main SyntheticParameters */
--- a/test/tools/javac/annotations/typeAnnotations/classfile/T8008762.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/T8008762.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8008762 * @summary Type annotation on inner class in anonymous class * shows up as regular annotation - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.lang.annotation.*; import static java.lang.annotation.RetentionPolicy.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/T8008769.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/T8008769.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @summary Repeated type-annotations on type parm of local variable * are not written to classfile. * @bug 8008769 - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.lang.annotation.*; import static java.lang.annotation.RetentionPolicy.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/T8010015.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/T8010015.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @summary Wrong classfile attribution in inner class of lambda expression. * @bug 8010015 - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.lang.annotation.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/TestAnonInnerClasses.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/TestAnonInnerClasses.java Thu May 28 16:54:56 2015 -0700 @@ -33,7 +33,7 @@ * results in 2). Elements with no annotations expect 0. * Source template is read in from testanoninner.template * - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.lang.annotation.*; import java.io.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/TestNewCastArray.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/TestNewCastArray.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8005681 * @summary Repeated annotations on new,array,cast. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.lang.annotation.*; import java.io.*;
--- a/test/tools/javac/annotations/typeAnnotations/classfile/TypeCasts.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/TypeCasts.java Thu May 28 16:54:56 2015 -0700 @@ -33,7 +33,7 @@ * @bug 6843077 8006775 * @summary test that typecasts annotation are emitted if only the cast * expression is optimized away - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class TypeCasts extends ClassfileTestHelper{
--- a/test/tools/javac/annotations/typeAnnotations/classfile/Wildcards.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/classfile/Wildcards.java Thu May 28 16:54:56 2015 -0700 @@ -32,7 +32,7 @@ * @test Wildcards * @bug 6843077 8006775 * @summary test that annotations target wildcards get emitted to classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class Wildcards extends ClassfileTestHelper { public static void main(String[] args) throws Exception {
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for class extends clauses - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ClassExtends.java * @run main Driver ClassExtends */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassTypeParam.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassTypeParam.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for class type parameters - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ClassTypeParam.java * @run main Driver ClassTypeParam */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/ConstructorInvocationTypeArgument.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/ConstructorInvocationTypeArgument.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for constructor invocation type argument - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ConstructorInvocationTypeArgument.java * @run main Driver ConstructorInvocationTypeArgument */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/Constructors.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/Constructors.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8026791 8042451 * @summary Test population of reference info for constructor results - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java Constructors.java * @run main Driver Constructors */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/ExceptionParameters.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/ExceptionParameters.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @bug 8028576 8042451 * @summary Test population of reference info for exception parameters * @author Werner Dietl - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ExceptionParameters.java * @run main Driver ExceptionParameters */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/Fields.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/Fields.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for field - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java Fields.java * @run main Driver Fields */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/FromSpecification.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/FromSpecification.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test that the examples from the manual are stored as expected - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java FromSpecification.java * @run main Driver FromSpecification */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/Initializers.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/Initializers.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @bug 8013852 8042451 * @summary Test population of reference info for instance and class initializers * @author Werner Dietl - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java Initializers.java * @run main Driver Initializers */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/Lambda.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/Lambda.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8008077 8029721 8042451 8043974 * @summary Test population of reference info for lambda expressions * javac crash for annotated parameter type of lambda in a field - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @ignore 8057687 emit correct byte code an attributes for type annotations * @compile -g Driver.java ReferenceInfoUtil.java Lambda.java * @run main Driver Lambda
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodInvocationTypeArgument.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodInvocationTypeArgument.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method invocation type arguments - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodInvocationTypeArgument.java * @run main Driver MethodInvocationTypeArgument */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodParameters.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodParameters.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method parameters - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodParameters.java * @run main Driver MethodParameters */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReceivers.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReceivers.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method receivers - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodReceivers.java * @run main Driver MethodReceivers */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReturns.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReturns.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method return - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodReturns.java * @run main Driver MethodReturns */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodThrows.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodThrows.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method exception clauses - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodThrows.java * @run main Driver MethodThrows */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodTypeParam.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodTypeParam.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for method type parameters - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MethodTypeParam.java * @run main Driver MethodTypeParam */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/MultiCatch.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/MultiCatch.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @bug 8006732 8006775 8042451 * @summary Test population of reference info for multicatch exception parameters * @author Werner Dietl - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java MultiCatch.java * @run main Driver MultiCatch */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 8044009 8044010 * @summary Test population of reference info for nested types - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @ignore 8057687 emit correct byte code an attributes for type annotations * @compile -g Driver.java ReferenceInfoUtil.java NestedTypes.java * @run main Driver NestedTypes
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/NewObjects.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/NewObjects.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for new object creations - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java NewObjects.java * @run main Driver NewObjects */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/RepeatingTypeAnnotations.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/RepeatingTypeAnnotations.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ /* * @test * @summary Test population of reference info for repeating type annotations - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java RepeatingTypeAnnotations.java * @run main Driver RepeatingTypeAnnotations * @author Werner Dietl
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for resource variable - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java ResourceVariable.java * @run main Driver ResourceVariable */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeCasts.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeCasts.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for type casts - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java TypeCasts.java * @run main Driver TypeCasts */
--- a/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeTests.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeTests.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8042451 * @summary Test population of reference info for class literals - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g Driver.java ReferenceInfoUtil.java TypeTests.java * @run main Driver TypeTests */
--- a/test/tools/javac/classfiles/InnerClasses/SyntheticClasses.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/InnerClasses/SyntheticClasses.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @bug 8034854 * @summary Verify that the InnerClasses attribute has outer_class_info_index zero if it has * inner_name_index zero (for synthetic classes) - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile SyntheticClasses.java * @run main SyntheticClasses */
--- a/test/tools/javac/classfiles/attributes/AnnotationDefault/AnnotationDefaultTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/AnnotationDefault/AnnotationDefaultTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042947 * @summary Checking AnnotationDefault attribute. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/EnclosingMethod/EnclosingMethodTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/EnclosingMethod/EnclosingMethodTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042931 * @summary Checking EnclosingMethod attribute of anonymous/local class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/LineNumberTable/LineNumberTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/LineNumberTable/LineNumberTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @bug 8040131 * * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTableTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTableTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary local variable table attribute test. * @bug 8040097 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTypeTableTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTypeTableTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary local variable type table attribute test. * @bug 8040097 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/ConstructorTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/ConstructorTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for constructors. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/EnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/EnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for enum. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/ExceptionTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/ExceptionTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for methods which throw exceptions. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/FieldTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/FieldTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for fields. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/InnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/InnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for inner classes. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/MethodParameterTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/MethodParameterTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for method parameters. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/MethodTypeBoundTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/MethodTypeBoundTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8049238 * @summary Checks Signature attribute for type bounds. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/Signature/ReturnTypeTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/Signature/ReturnTypeTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @summary Checks Signature attribute for array return type of method. * @library /tools/lib /tools/javac/lib ../lib * @modules java.desktop - * jdk.compiler/com.sun.tools.classfile + * jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/AnonymousClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/AnonymousClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for anonymous class. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/InnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/InnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for inner class. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/LocalClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/LocalClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for local class. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/MixTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/MixTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for complex structure of nested classes and other types. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/NoSourceFileAttribute.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/NoSourceFileAttribute.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for file compiled without debug information. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/SyntheticClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/SyntheticClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for synthetic class. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/SourceFile/TopLevelClassesOneFileTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/SourceFile/TopLevelClassesOneFileTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary sourcefile attribute test for two type in one file. * @bug 8040129 * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/deprecated/DeprecatedPackageTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/deprecated/DeprecatedPackageTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042261 * @summary Checking that deprecated attribute does not apply to classes of deprecated package. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/deprecated/DeprecatedTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/deprecated/DeprecatedTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @summary Checking what attribute is generated by annotation Deprecated * or javadoc deprecated for field, method, class(inner/local), interface. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerAnnotationTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerAnnotationTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner annotations in inner annotation. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner annotations in inner class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerEnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerEnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner annotations in inner enum. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerInterfaceTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerInterfaceTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner annotations in inner interface. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesHierarchyTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesHierarchyTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Test that inner classes have in its inner classes attribute enclosing classes and its immediate members. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInAnonymousClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInAnonymousClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 8062373 * @summary Testing InnerClasses_attribute of inner classes in anonymous class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerAnnotationTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerAnnotationTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner classes in inner annotation. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8034854 8042251 * @summary Testing InnerClasses_attribute of inner classes in inner class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerEnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerEnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8034854 8042251 * @summary Testing InnerClasses_attribute of inner classes in inner enum. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerInterfaceTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerInterfaceTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner classes in inner interface. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInLocalClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInLocalClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner classes in local class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesIndexTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesIndexTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Test that outer_class_info_index of local and anonymous class is zero. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @bug 8034854 8042251 * @summary Testing inner classes attributes. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerAnnotationTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerAnnotationTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner enums in inner annotation. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerEnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerEnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner enums in inner enum. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerInterfaceTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerInterfaceTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner enums in inner interface. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumsInInnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumsInInnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner enums in inner class. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerAnnotationTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerAnnotationTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner interfaces in inner annotation. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerClassTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerClassTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @summary Testing InnerClasses_attribute of inner interfaces in inner class. * @author aeremeev * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerEnumTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerEnumTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner interfaces in inner enum. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerInterfaceTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerInterfaceTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Testing InnerClasses_attribute of inner interfaces in inner interface. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classfiles/attributes/innerclasses/NoInnerClassesTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classfiles/attributes/innerclasses/NoInnerClassesTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8042251 * @summary Test that there are no inner classes attributes in case of there are no inner classes. * @library /tools/lib /tools/javac/lib ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/classreader/BadClass.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/classreader/BadClass.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6898851 * @summary Compiling against this corrupt class file causes a stacktrace from javac - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.File;
--- a/test/tools/javac/constDebug/ConstDebugTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/constDebug/ConstDebugTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4645152 4785453 * @summary javac compiler incorrectly inserts <clinit> when -g is specified - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run compile -g ConstDebugTest.java * @run main ConstDebugTest */
--- a/test/tools/javac/defaultMethods/BadClassfile.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/defaultMethods/BadClassfile.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8025087 * @summary Verify that pre-JDK8 classfiles with default and/or static methods * are refused correctly. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.code * jdk.compiler/com.sun.tools.javac.jvm
--- a/test/tools/javac/defaultMethods/CheckACC_STRICTFlagOnDefaultMethodTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/defaultMethods/CheckACC_STRICTFlagOnDefaultMethodTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8012723 * @summary strictfp interface misses strictfp modifer on default method - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main CheckACC_STRICTFlagOnDefaultMethodTest */
--- a/test/tools/javac/defaultMethods/TestDefaultBody.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/defaultMethods/TestDefaultBody.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7192246 * @summary check that code attributed for default methods is correctly generated - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.AccessFlags;
--- a/test/tools/javac/defaultMethods/TestNoBridgeOnDefaults.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/defaultMethods/TestNoBridgeOnDefaults.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7192246 * @summary check that javac does not generate bridge methods for defaults - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.ClassFile;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/defaultMethods/private/Private10.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,16 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8080726 + * @summary Redundant error message on private abstract interface method with body. + * @compile/fail/ref=Private10.out -XDrawDiagnostics Private10.java + */ + + +public class Private10 { + interface I { + private abstract void foo() {} + } + class C { + private abstract void foo() {} + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/defaultMethods/private/Private10.out Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,3 @@ +Private10.java:11:31: compiler.err.illegal.combination.of.modifiers: abstract, private +Private10.java:14:31: compiler.err.illegal.combination.of.modifiers: abstract, private +2 errors
--- a/test/tools/javac/defaultMethods/super/TestDirectSuperInterfaceInvoke.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/defaultMethods/super/TestDirectSuperInterfaceInvoke.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8027281 * @summary As per JVMS 4.9.2, invokespecial can only refer to direct superinterfaces - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile TestDirectSuperInterfaceInvoke.java * @run main TestDirectSuperInterfaceInvoke */
--- a/test/tools/javac/diags/CheckResourceKeys.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/diags/CheckResourceKeys.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6964768 6964461 6964469 6964487 6964460 6964481 6980021 * @summary need test program to validate javac resource bundles - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.code */
--- a/test/tools/javac/expression/_super/NonDirectSuper/NonDirectSuper.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/expression/_super/NonDirectSuper/NonDirectSuper.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8027789 * @summary check that the direct superclass is used as the site when calling * a superclass' method - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile Base.java NonDirectSuper.java * @run main test.NonDirectSuper */
--- a/test/tools/javac/flow/LVTHarness.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/flow/LVTHarness.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * javac crash while creating LVT entry for a local variable defined in * an inner block * @library /tools/javac/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @build JavacTestingAbstractProcessor LVTHarness * @run main LVTHarness */
--- a/test/tools/javac/generics/bridges/BridgeHarness.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/generics/bridges/BridgeHarness.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8013789 * @summary Compiler should emit bridges in interfaces * @library /tools/javac/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.code * jdk.compiler/com.sun.tools.javac.util * @build JavacTestingAbstractProcessor BridgeHarness
--- a/test/tools/javac/jvm/ClassRefDupInConstantPoolTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/jvm/ClassRefDupInConstantPoolTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8015927 * @summary Class reference duplicates in constant pool - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @clean ClassRefDupInConstantPoolTest$Duplicates.class * @run main ClassRefDupInConstantPoolTest */
--- a/test/tools/javac/lambda/ByteCodeTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/ByteCodeTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8011738 * @author sogoel * @summary Code translation test for Lambda expressions, method references - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main ByteCodeTest */
--- a/test/tools/javac/lambda/LambdaTestStrictFPFlag.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/LambdaTestStrictFPFlag.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8046060 * @summary Different results of floating point multiplication for lambda code block - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javac/lambda/LocalVariableTable.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/LocalVariableTable.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8025998 8026749 8054220 8058227 * @summary Missing LV table in lambda bodies - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g LocalVariableTable.java * @run main LocalVariableTable */
--- a/test/tools/javac/lambda/TestInvokeDynamic.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/TestInvokeDynamic.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * Add back-end support for invokedynamic * temporarily workaround combo tests are causing time out in several platforms * @library ../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.code * jdk.compiler/com.sun.tools.javac.jvm
--- a/test/tools/javac/lambda/bytecode/TestLambdaBytecode.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/bytecode/TestLambdaBytecode.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8009649 * @summary Lambda back-end should generate invokespecial for method handles referring to private instance methods * @library ../../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * @build JavacTestingAbstractThreadedTest * @run main/othervm TestLambdaBytecode
--- a/test/tools/javac/lambda/lambdaNaming/TestNonSerializableLambdaNameStability.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/lambda/lambdaNaming/TestNonSerializableLambdaNameStability.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8067422 * @summary Check that the lambda names are not unnecessarily unstable * @library /tools/lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.main
--- a/test/tools/javac/linenumbers/ConditionalLineNumberTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/linenumbers/ConditionalLineNumberTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8034091 * @summary Add LineNumberTable attributes for conditional operator (?:) split across several lines. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.ClassFile;
--- a/test/tools/javac/linenumbers/NestedLineNumberTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/linenumbers/NestedLineNumberTest.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 8061778 * @summary Wrong LineNumberTable for default constructors - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import com.sun.tools.classfile.ClassFile;
--- a/test/tools/javac/meth/TestCP.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/meth/TestCP.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6991980 * @summary polymorphic signature calls don't share the same CP entries - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main TestCP */
--- a/test/tools/javac/multicatch/7005371/T7005371.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/multicatch/7005371/T7005371.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7005371 * @summary Multicatch: assertion error while generating LocalVariableTypeTable attribute - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @compile -g SubTest.java * @run main T7005371 */
--- a/test/tools/javac/multicatch/Pos05.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/multicatch/Pos05.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6943289 * @summary Project Coin: Improved Exception Handling for Java (aka 'multicatch') - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * @run main Pos05 */
--- a/test/tools/javac/varargs/6199075/T6199075.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/varargs/6199075/T6199075.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @summary Unambiguous varargs method calls flagged as ambiguous * @author mcimadamore * - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.api * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.util
--- a/test/tools/javac/varargs/7042566/T7042566.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javac/varargs/7042566/T7042566.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @summary Unambiguous varargs method calls flagged as ambiguous * temporarily workaround combo tests are causing time out in several platforms * @library ../../lib - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.util * @build JavacTestingAbstractThreadedTest * @run main/othervm T7042566
--- a/test/tools/javadoc/CheckResourceKeys.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javadoc/CheckResourceKeys.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8000612 * @summary need test program to validate javadoc resource bundles - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javap/4111861/T4111861.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/4111861/T4111861.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 4111861 * @summary static final field contents are not displayed - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T4111861 { public static void main(String... args) throws Exception {
--- a/test/tools/javap/4870651/T4870651.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/4870651/T4870651.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 4870651 6715757 * @summary javap should recognize generics, varargs, enum; * javap prints "extends java.lang.Object" - * @modules jdk.compiler + * @modules jdk.jdeps * @build T4870651 Test * @run main T4870651 */
--- a/test/tools/javap/6937244/T6937244.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/6937244/T6937244.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6937244 * @summary fields display with JVMS names, not Java names - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/6937244/T6937244A.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/6937244/T6937244A.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6937244 * @summary fields display with JVMS names, not Java names - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/8006334/JavapTaskCtorFailWithNPE.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/8006334/JavapTaskCtorFailWithNPE.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8006334 * @summary javap: JavapTask constructor breaks with null pointer exception if * parameter options is null - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.File;
--- a/test/tools/javap/8007907/JavapReturns0AfterClassNotFoundTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/8007907/JavapReturns0AfterClassNotFoundTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8007907 * @summary javap, method com.sun.tools.javap.Main.run returns 0 even in case * of class not found error - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.IOException;
--- a/test/tools/javap/AccessModifiers.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/AccessModifiers.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8027530 * @summary test -public, -protected, -package, -private options - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/BadAttributeLength.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/BadAttributeLength.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8047072 * @summary javap OOM on fuzzed classfile - * @modules jdk.compiler + * @modules jdk.jdeps * @run main BadAttributeLength */
--- a/test/tools/javap/BoundsTypeVariableTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/BoundsTypeVariableTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8003537 * @summary javap should not use / in Bounds Type Variables - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.File;
--- a/test/tools/javap/DescriptorTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/DescriptorTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8007052 * @summary javap should include the descriptor for a method in verbose mode - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.File;
--- a/test/tools/javap/ExtPath.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/ExtPath.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @bug 6428896 * @summary javap cannot read multiple entries on the extension classpath * @author Wei Tao - * @modules jdk.compiler + * @modules jdk.jdeps * @run main/othervm ExtPath com.sun.crypto.provider.SunJCE */
--- a/test/tools/javap/InvalidOptions.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/InvalidOptions.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8027411 8032869 * @summary test an invalid option - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/MethodParameters.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/MethodParameters.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8004727 8005647 * @summary javac should generate method parameters correctly. - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/StackMapTableTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/StackMapTableTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8033930 8033913 * @summary bad formatting of StackMapTable entries - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4075403.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4075403.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4075403 * @summary Use javap to inquire about a specific inner class - * @modules jdk.compiler + * @modules jdk.jdeps */
--- a/test/tools/javap/T4459541.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4459541.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4459541 * @summary "javap -l" shows line numbers as signed short; they should be unsigned. - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4501660.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4501660.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 4501660 * @summary change diagnostic of -help as 'print this help message and exit' * (actually, verify -help does not cause premature exit) - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4501661.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4501661.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test * @bug 4501661 * @summary disallow mixing -public, -private, and -protected - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T4501661 { public static void main(String... args) throws Exception {
--- a/test/tools/javap/T4777949.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4777949.java Thu May 28 16:54:56 2015 -0700 @@ -30,7 +30,7 @@ * @test * @bug 4777949 * @summary Warn javap usage on package with simple name - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T4777949 { public static void main(String... args) throws Exception {
--- a/test/tools/javap/T4876942.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4876942.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4876942 6715251 * @summary javap invoked without args does not print help screen - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4880663.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4880663.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 4880663 6715757 7031005 * @summary javap could output whitespace between class name and opening brace * javap prints "extends java.lang.Object" - * @modules jdk.compiler + * @modules jdk.jdeps */
--- a/test/tools/javap/T4880672.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4880672.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @test * @bug 4880672 7031005 * @summary javap does not output inner interfaces of an interface - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4884240.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4884240.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 4884240 * @summary additional option required for javap - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T4975569.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T4975569.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 4975569 6622215 8034861 * @summary javap doesn't print new flag bits - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6271787.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6271787.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6271787 * @summary javap dumps LocalVariableTypeTable attribute in hex, needs to print a table - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6474890.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6474890.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6474890 * @summary javap does not open .zip files in -classpath - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6587786.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6587786.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6587786 * @summary Javap throws error : "ERROR:Could not find <classname>" for JRE classes - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6622216.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6622216.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6622216 * @summary javap names some attributes incorrectly - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6622232.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6622232.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6622232 * @summary javap gets whitespace confused - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6622260.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6622260.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6622260 * @summary javap prints negative bytes incorrectly in hex - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6715251.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6715251.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test * @bug 6715251 * @summary javap should be consistent with javac and return 2 if given no arguments - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T6715251 {
--- a/test/tools/javap/T6715753.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6715753.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 6715753 * @summary Use javap to inquire about a specific inner class - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T6715753 {
--- a/test/tools/javap/T6715767.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6715767.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6715767 * @summary javap on java.lang.ClassLoader crashes - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6716452.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6716452.java Thu May 28 16:54:56 2015 -0700 @@ -24,7 +24,7 @@ /* * @test 6716452 * @summary need a method to get an index of an attribute - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javap/T6824493.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6824493.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test * @bug 6824493 * @summary experimental support for additional info for instructions - * @modules jdk.compiler + * @modules jdk.jdeps * @compile -g T6824493.java * @run main T6824493 */
--- a/test/tools/javap/T6863746.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6863746.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 6863746 * @summary javap should not scan ct.sym by default - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T6863746 {
--- a/test/tools/javap/T6866657.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6866657.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @test * @bug 6866657 * @summary add byteLength() method to primary classfile types - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javap/T6868539.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6868539.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 6868539 6868548 8035364 * @summary javap should use current names for constant pool entries, * remove spurious ';' from constant pool entries - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T6879371.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T6879371.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6879371 * @summary javap does not close internal default file manager - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T7004698.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T7004698.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7004698 * @summary javap does not output CharacterRangeTable attributes correctly - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T7186925.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T7186925.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7186925 * @summary JavapTask passes null to java.io.Writer - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javap/T7190862.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T7190862.java Thu May 28 16:54:56 2015 -0700 @@ -3,7 +3,7 @@ * @test /nodynamiccopyright/ * @bug 7190862 7109747 * @summary javap shows an incorrect type for operands if the 'wide' prefix is used - * @modules jdk.compiler + * @modules jdk.jdeps */ import com.sun.source.util.JavacTask;
--- a/test/tools/javap/T8032814.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8032814.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8032814 * @summary LineNumberTable/LocalVariableTable tables duplication for the * "-v -l" combination of options - * @modules jdk.compiler + * @modules jdk.jdeps * @compile -g T8032814.java * @run main T8032814 */
--- a/test/tools/javap/T8032819.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8032819.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8032819 * @summary Extra empty line between field declarations for the "-v -c" and "-v -l" combination of options - * @modules jdk.compiler + * @modules jdk.jdeps * @compile -g T8032819.java * @run main T8032819 */
--- a/test/tools/javap/T8033180.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8033180.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8033180 * @summary Bad newline characters - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T8033711.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8033711.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8033711 * @summary An exception is thrown if using the "-classpath" option with no arguments - * @modules jdk.compiler + * @modules jdk.jdeps */
--- a/test/tools/javap/T8035104.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8035104.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8035104 * @summary reorder class file attributes in javap listing - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/T8038414.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/T8038414.java Thu May 28 16:54:56 2015 -0700 @@ -32,7 +32,7 @@ * @test * @bug 8038414 * @summary Constant pool's strings are not escaped properly - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T8038414 { private static final String NEW_LINE = System.getProperty("line.separator");
--- a/test/tools/javap/TestSuperclass.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/TestSuperclass.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 7031005 * @summary javap prints "extends java.lang.Object" - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.File;
--- a/test/tools/javap/WhitespaceTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/WhitespaceTest.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 8033581 8033798 8033726 * @summary Check whitespace in generated output - * @modules jdk.compiler + * @modules jdk.jdeps */ import java.io.*;
--- a/test/tools/javap/classfile/T6887895.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/classfile/T6887895.java Thu May 28 16:54:56 2015 -0700 @@ -25,7 +25,7 @@ * @test * @bug 6887895 * @summary CONSTANT_Class_info getBaseName does not handle arrays of primitives correctly - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ import java.io.*;
--- a/test/tools/javap/classfile/deps/T6907575.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/classfile/deps/T6907575.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ /* * @test * @bug 6907575 - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile * jdk.compiler/com.sun.tools.javac.file * jdk.compiler/com.sun.tools.javac.util * @build GetDeps p.C1
--- a/test/tools/javap/typeAnnotations/JSR175Annotations.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/JSR175Annotations.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test JSR175Annotations * @bug 6843077 * @summary test that only type annotations are recorded as such in classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class JSR175Annotations {
--- a/test/tools/javap/typeAnnotations/NewArray.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/NewArray.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test NewArray * @bug 6843077 * @summary Test type annotations on local array are in method's code attribute. - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class NewArray {
--- a/test/tools/javap/typeAnnotations/Presence.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/Presence.java Thu May 28 16:54:56 2015 -0700 @@ -30,7 +30,7 @@ * @test Presence * @bug 6843077 * @summary test that all type annotations are present in the classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class Presence {
--- a/test/tools/javap/typeAnnotations/PresenceInner.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/PresenceInner.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test PresenceInner * @bug 6843077 * @summary test that annotations in inner types count only once - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class PresenceInner {
--- a/test/tools/javap/typeAnnotations/T6855990.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/T6855990.java Thu May 28 16:54:56 2015 -0700 @@ -27,7 +27,7 @@ * @test * @bug 6855990 * @summary InstructionDetailWriter should support new 308 annotations attribute - * @modules jdk.compiler + * @modules jdk.jdeps */ public class T6855990 {
--- a/test/tools/javap/typeAnnotations/TypeCasts.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/TypeCasts.java Thu May 28 16:54:56 2015 -0700 @@ -29,7 +29,7 @@ * @bug 6843077 * @summary test that typecasts annotation are emitted if only the cast * expression is optimized away - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class TypeCasts {
--- a/test/tools/javap/typeAnnotations/Visibility.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/Visibility.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test Visibility * @bug 6843077 * @summary test that type annotations are recorded in the classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class Visibility {
--- a/test/tools/javap/typeAnnotations/Wildcards.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/javap/typeAnnotations/Wildcards.java Thu May 28 16:54:56 2015 -0700 @@ -28,7 +28,7 @@ * @test Wildcards * @bug 6843077 * @summary test that annotations target wildcards get emitted to classfile - * @modules jdk.compiler/com.sun.tools.classfile + * @modules jdk.jdeps/com.sun.tools.classfile */ public class Wildcards { public static void main(String[] args) throws Exception {
--- a/test/tools/jdeps/APIDeps.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/jdeps/APIDeps.java Thu May 28 16:54:56 2015 -0700 @@ -27,8 +27,8 @@ * @summary Test -apionly and -jdkinternals options * @modules java.base/sun.misc * java.management - * jdk.compiler/com.sun.tools.classfile - * jdk.dev/com.sun.tools.jdeps + * jdk.jdeps/com.sun.tools.classfile + * jdk.jdeps/com.sun.tools.jdeps * @build m.Bar m.Foo m.Gee b.B c.C c.I d.D e.E f.F g.G * @run main APIDeps */
--- a/test/tools/jdeps/Basic.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/jdeps/Basic.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8003562 8005428 8015912 8027481 8048063 8068937 * @summary Basic tests for jdeps tool * @modules java.management - * jdk.dev/com.sun.tools.jdeps + * jdk.jdeps/com.sun.tools.jdeps * @build Test p.Foo p.Bar p.C p.SubClass q.Gee javax.activity.NotCompactProfile * @run main Basic */
--- a/test/tools/jdeps/DotFileTest.java Thu May 28 16:13:55 2015 -0700 +++ b/test/tools/jdeps/DotFileTest.java Thu May 28 16:54:56 2015 -0700 @@ -26,7 +26,7 @@ * @bug 8003562 * @summary Basic tests for jdeps -dotoutput option * @modules java.management - * jdk.dev/com.sun.tools.jdeps + * jdk.jdeps/com.sun.tools.jdeps * @build Test p.Foo p.Bar javax.activity.NotCompactProfile * @run main DotFileTest */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/JdepsDependencyClosure.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,496 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @test + * @bug 8080608 + * @summary Test that jdeps verbose output has a summary line when dependencies + * are found within the same archive. For each testcase, compare the + * result obtained from jdeps with the expected result. + * @modules jdk.jdeps/com.sun.tools.jdeps + * @build use.indirect.DontUseUnsafe2 + * @build use.indirect.UseUnsafeIndirectly + * @build use.indirect2.DontUseUnsafe3 + * @build use.indirect2.UseUnsafeIndirectly2 + * @build use.unsafe.DontUseUnsafe + * @build use.unsafe.UseClassWithUnsafe + * @build use.unsafe.UseUnsafeClass + * @build use.unsafe.UseUnsafeClass2 + * @run main JdepsDependencyClosure --test:0 + * @run main JdepsDependencyClosure --test:1 + * @run main JdepsDependencyClosure --test:2 + * @run main JdepsDependencyClosure --test:3 + */ +public class JdepsDependencyClosure { + + static boolean VERBOSE = false; + static boolean COMPARE_TEXT = true; + + static final String JDEPS_SUMMARY_TEXT_FORMAT = "%s -> %s%n"; + static final String JDEPS_VERBOSE_TEXT_FORMAT = " %-50s -> %-50s %s%n"; + + /** + * Helper class used to store arguments to pass to + * {@code JdepsDependencyClosure.test} as well as expected + * results. + */ + static class TestCaseData { + final Map<String, Set<String>> expectedDependencies; + final String expectedText; + final String[] args; + final boolean closure; + + TestCaseData(Map<String, Set<String>> expectedDependencies, + String expectedText, + boolean closure, + String[] args) { + this.expectedDependencies = expectedDependencies; + this.expectedText = expectedText; + this.closure = closure; + this.args = args; + } + + public void test() { + if (expectedDependencies != null) { + String format = closure + ? "Running (closure): jdeps %s %s %s %s" + : "Running: jdeps %s %s %s %s"; + System.out.println(String.format(format, (Object[])args)); + } + JdepsDependencyClosure.test(args, expectedDependencies, expectedText, closure); + } + + /** + * Make a new test case data to invoke jdeps and test its output. + * @param pattern The pattern that will passed through to jdeps -e + * This is expected to match only one class. + * @param arcPath The archive to analyze. A jar or a class directory. + * @param classes For each reported archive dependency couple, the + * expected list of classes in the source that will + * be reported as having a dependency on the class + * in the target that matches the given pattern. + * @param dependencies For each archive dependency couple, a singleton list + * containing the name of the class in the target that + * matches the pattern. It is expected that the pattern + * will match only one class in the target. + * If the pattern matches several classes the + * expected text may no longer match the jdeps output. + * @param archives A list of archive dependency couple in the form + * {{sourceName1, sourcePath1, targetDescription1, targetPath1} + * {sourceName2, sourcePath2, targetDescription2, targetPath2} + * ... } + * For a JDK module - e.g. java.base, the targetDescription + * is usually something like "JDK internal API (java.base)" + * and the targetPath is usually the module name "java.base". + * @param closure Whether jdeps should be recursively invoked to build + * the closure. + * @return An instance of TestCaseData containing all the information + * needed to perform the jdeps invokation and test its output. + */ + public static TestCaseData make(String pattern, String arcPath, String[][] classes, + String[][] dependencies, String[][] archives, boolean closure) { + final String[] args = new String[] { + "-e", pattern, "-v", arcPath + }; + Map<String, Set<String>> expected = new HashMap<>(); + String expectedText = ""; + for (int i=0; i<classes.length; i++) { + final int index = i; + expectedText += Stream.of(classes[i]) + .map((cn) -> String.format(JDEPS_VERBOSE_TEXT_FORMAT, cn, + dependencies[index][0], archives[index][2])) + .reduce(String.format(JDEPS_SUMMARY_TEXT_FORMAT, archives[i][0], + archives[index][3]), (s1,s2) -> s1.concat(s2)); + for (String cn : classes[index]) { + expected.putIfAbsent(cn, new HashSet<>()); + expected.get(cn).add(dependencies[index][0]); + } + } + return new TestCaseData(expected, expectedText, closure, args); + } + + public static TestCaseData valueOf(String[] args) { + if (args.length == 1 && args[0].startsWith("--test:")) { + // invoked from jtreg. build test case data for selected test. + int index = Integer.parseInt(args[0].substring("--test:".length())); + if (index >= dataSuppliers.size()) { + throw new RuntimeException("No such test case: " + index + + " - available testcases are [0.." + + (dataSuppliers.size()-1) + "]"); + } + return dataSuppliers.get(index).get(); + } else { + // invoked in standalone. just take the given argument + // and perform no validation on the output (except that it + // must start with a summary line) + return new TestCaseData(null, null, true, args); + } + } + + } + + static TestCaseData makeTestCaseOne() { + final String arcPath = System.getProperty("test.classes", "build/classes"); + final String arcName = Paths.get(arcPath).getFileName().toString(); + final String[][] classes = new String[][] { + {"use.indirect2.UseUnsafeIndirectly2", "use.unsafe.UseClassWithUnsafe"}, + }; + final String[][] dependencies = new String[][] { + {"use.unsafe.UseUnsafeClass"}, + }; + final String[][] archives = new String[][] { + {arcName, arcPath, arcName, arcPath}, + }; + return TestCaseData.make("use.unsafe.UseUnsafeClass", arcPath, classes, + dependencies, archives, false); + } + + static TestCaseData makeTestCaseTwo() { + String arcPath = System.getProperty("test.classes", "build/classes"); + String arcName = Paths.get(arcPath).getFileName().toString(); + String[][] classes = new String[][] { + {"use.unsafe.UseUnsafeClass", "use.unsafe.UseUnsafeClass2"} + }; + String[][] dependencies = new String[][] { + {"sun.misc.Unsafe"} + }; + String[][] archive = new String[][] { + {arcName, arcPath, "JDK internal API (java.base)", "java.base"}, + }; + return TestCaseData.make("sun.misc.Unsafe", arcPath, classes, + dependencies, archive, false); + } + + static TestCaseData makeTestCaseThree() { + final String arcPath = System.getProperty("test.classes", "build/classes"); + final String arcName = Paths.get(arcPath).getFileName().toString(); + final String[][] classes = new String[][] { + {"use.indirect2.UseUnsafeIndirectly2", "use.unsafe.UseClassWithUnsafe"}, + {"use.indirect.UseUnsafeIndirectly"} + }; + final String[][] dependencies = new String[][] { + {"use.unsafe.UseUnsafeClass"}, + {"use.unsafe.UseClassWithUnsafe"} + }; + final String[][] archives = new String[][] { + {arcName, arcPath, arcName, arcPath}, + {arcName, arcPath, arcName, arcPath} + }; + return TestCaseData.make("use.unsafe.UseUnsafeClass", arcPath, classes, + dependencies, archives, true); + } + + + static TestCaseData makeTestCaseFour() { + final String arcPath = System.getProperty("test.classes", "build/classes"); + final String arcName = Paths.get(arcPath).getFileName().toString(); + final String[][] classes = new String[][] { + {"use.unsafe.UseUnsafeClass", "use.unsafe.UseUnsafeClass2"}, + {"use.indirect2.UseUnsafeIndirectly2", "use.unsafe.UseClassWithUnsafe"}, + {"use.indirect.UseUnsafeIndirectly"} + }; + final String[][] dependencies = new String[][] { + {"sun.misc.Unsafe"}, + {"use.unsafe.UseUnsafeClass"}, + {"use.unsafe.UseClassWithUnsafe"} + }; + final String[][] archives = new String[][] { + {arcName, arcPath, "JDK internal API (java.base)", "java.base"}, + {arcName, arcPath, arcName, arcPath}, + {arcName, arcPath, arcName, arcPath} + }; + return TestCaseData.make("sun.misc.Unsafe", arcPath, classes, dependencies, + archives, true); + } + + static final List<Supplier<TestCaseData>> dataSuppliers = Arrays.asList( + JdepsDependencyClosure::makeTestCaseOne, + JdepsDependencyClosure::makeTestCaseTwo, + JdepsDependencyClosure::makeTestCaseThree, + JdepsDependencyClosure::makeTestCaseFour + ); + + + + /** + * The OutputStreamParser is used to parse the format of jdeps. + * It is thus dependent on that format. + */ + static class OutputStreamParser extends OutputStream { + // OutputStreamParser will populate this map: + // + // For each archive, a list of class in where dependencies where + // found... + final Map<String, Set<String>> deps; + final StringBuilder text = new StringBuilder(); + + StringBuilder[] lines = { new StringBuilder(), new StringBuilder() }; + int line = 0; + int sepi = 0; + char[] sep; + + public OutputStreamParser(Map<String, Set<String>> deps) { + this.deps = deps; + this.sep = System.getProperty("line.separator").toCharArray(); + } + + @Override + public void write(int b) throws IOException { + lines[line].append((char)b); + if (b == sep[sepi]) { + if (++sepi == sep.length) { + text.append(lines[line]); + if (lines[0].toString().startsWith(" ")) { + throw new RuntimeException("Bad formatting: " + + "summary line missing for\n"+lines[0]); + } + // Usually the output looks like that: + // <archive-1> -> java.base + // <class-1> -> <dependency> <dependency description> + // <class-2> -> <dependency> <dependency description> + // ... + // <archive-2> -> java.base + // <class-3> -> <dependency> <dependency description> + // <class-4> -> <dependency> <dependency description> + // ... + // + // We want to keep the <archive> line in lines[0] + // and have the ith <class-i> line in lines[1] + if (line == 1) { + // we have either a <class> line or an <archive> line. + String line1 = lines[0].toString(); + String line2 = lines[1].toString(); + if (line2.startsWith(" ")) { + // we have a class line, record it. + parse(line1, line2); + // prepare for next <class> line. + lines[1] = new StringBuilder(); + } else { + // We have an archive line: We are switching to the next archive. + // put the new <archive> line in lines[0], and prepare + // for reading the next <class> line + lines[0] = lines[1]; + lines[1] = new StringBuilder(); + } + } else { + // we just read the first <archive> line. + // prepare to read <class> lines. + line = 1; + } + sepi = 0; + } + } else { + sepi = 0; + } + } + + // Takes a couple of lines, where line1 is an <archive> line and + // line 2 is a <class> line. Parses the line to extract the archive + // name and dependent class name, and record them in the map... + void parse(String line1, String line2) { + String archive = line1.substring(0, line1.indexOf(" -> ")); + int l2ArrowIndex = line2.indexOf(" -> "); + String className = line2.substring(2, l2ArrowIndex).replace(" ", ""); + String depdescr = line2.substring(l2ArrowIndex + 4); + String depclass = depdescr.substring(0, depdescr.indexOf(" ")); + deps.computeIfAbsent(archive, (k) -> new HashSet<>()); + deps.get(archive).add(className); + if (VERBOSE) { + System.out.println(archive+": "+className+" depends on "+depclass); + } + } + + } + + /** + * The main method. + * + * Can be run in two modes: + * <ul> + * <li>From jtreg: expects 1 argument in the form {@code --test:<test-nb>}</li> + * <li>From command line: expected syntax is {@code -e <pattern> -v jar [jars..]}</li> + * </ul> + * <p>When called from the command line this method will call jdeps recursively + * to build a closure of the dependencies on {@code <pattern>} and print a summary. + * <p>When called from jtreg - it will call jdeps either once only or + * recursively depending on the pattern. + * @param args either {@code --test:<test-nb>} or {@code -e <pattern> -v jar [jars..]}. + */ + public static void main(String[] args) { + runWithLocale(Locale.ENGLISH, TestCaseData.valueOf(args)::test); + } + + private static void runWithLocale(Locale loc, Runnable run) { + final Locale defaultLocale = Locale.getDefault(); + Locale.setDefault(loc); + try { + run.run(); + } finally { + Locale.setDefault(defaultLocale); + } + } + + + public static void test(String[] args, Map<String, Set<String>> expected, + String expectedText, boolean closure) { + try { + doTest(args, expected, expectedText, closure); + } catch (Throwable t) { + try { + printDiagnostic(args, expectedText, t, closure); + } catch(Throwable tt) { + throw t; + } + throw t; + } + } + + static class TextFormatException extends RuntimeException { + final String expected; + final String actual; + TextFormatException(String message, String expected, String actual) { + super(message); + this.expected = expected; + this.actual = actual; + } + } + + public static void printDiagnostic(String[] args, String expectedText, + Throwable t, boolean closure) { + if (expectedText != null || t instanceof TextFormatException) { + System.err.println("===== TEST FAILED ======="); + System.err.println("command: " + Stream.of(args) + .reduce("jdeps", (s1,s2) -> s1.concat(" ").concat(s2))); + System.err.println("===== Expected Output ======="); + System.err.append(expectedText); + System.err.println("===== Command Output ======="); + if (t instanceof TextFormatException) { + System.err.print(((TextFormatException)t).actual); + } else { + com.sun.tools.jdeps.Main.run(args, new PrintWriter(System.err)); + if (closure) System.err.println("... (closure not available) ..."); + } + System.err.println("============================="); + } + } + + public static void doTest(String[] args, Map<String, Set<String>> expected, + String expectedText, boolean closure) { + if (args.length < 3 || !"-e".equals(args[0]) || !"-v".equals(args[2])) { + System.err.println("Syntax: -e <classname> -v [list of jars or directories]"); + return; + } + Map<String, Map<String, Set<String>>> alldeps = new HashMap<>(); + String depName = args[1]; + List<String> search = new ArrayList<>(); + search.add(depName); + Set<String> searched = new LinkedHashSet<>(); + StringBuilder text = new StringBuilder(); + while(!search.isEmpty()) { + args[1] = search.remove(0); + if (VERBOSE) { + System.out.println("Looking for " + args[1]); + } + searched.add(args[1]); + Map<String, Set<String>> deps = + alldeps.computeIfAbsent(args[1], (k) -> new HashMap<>()); + OutputStreamParser parser = new OutputStreamParser(deps); + PrintWriter writer = new PrintWriter(parser); + com.sun.tools.jdeps.Main.run(args, writer); + if (VERBOSE) { + System.out.println("Found: " + deps.values().stream() + .flatMap(s -> s.stream()).collect(Collectors.toSet())); + } + if (expectedText != null) { + text.append(parser.text.toString()); + } + search.addAll(deps.values().stream() + .flatMap(s -> s.stream()) + .filter(k -> !searched.contains(k)) + .collect(Collectors.toSet())); + if (!closure) break; + } + + // Print summary... + final Set<String> classes = alldeps.values().stream() + .flatMap((m) -> m.values().stream()) + .flatMap(s -> s.stream()).collect(Collectors.toSet()); + Map<String, Set<String>> result = new HashMap<>(); + for (String c : classes) { + Set<String> archives = new HashSet<>(); + Set<String> dependencies = new HashSet<>(); + for (String d : alldeps.keySet()) { + Map<String, Set<String>> m = alldeps.get(d); + for (String a : m.keySet()) { + Set<String> s = m.get(a); + if (s.contains(c)) { + archives.add(a); + dependencies.add(d); + } + } + } + result.put(c, dependencies); + System.out.println(c + " " + archives + " depends on " + dependencies); + } + + // If we're in jtreg, then check result (expectedText != null) + if (expectedText != null && COMPARE_TEXT) { + //text.append(String.format("%n")); + if (text.toString().equals(expectedText)) { + System.out.println("SUCCESS - got expected text"); + } else { + throw new TextFormatException("jdeps output is not as expected", + expectedText, text.toString()); + } + } + if (expected != null) { + if (expected.equals(result)) { + System.out.println("SUCCESS - found expected dependencies"); + } else if (expectedText == null) { + throw new RuntimeException("Bad dependencies: Expected " + expected + + " but found " + result); + } else { + throw new TextFormatException("Bad dependencies: Expected " + + expected + + " but found " + result, + expectedText, text.toString()); + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/indirect/DontUseUnsafe2.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.indirect; + +import use.unsafe.*; + +public class DontUseUnsafe2 { +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/indirect/UseUnsafeIndirectly.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.indirect; + +import use.unsafe.UseClassWithUnsafe; + +public class UseUnsafeIndirectly { + static UseClassWithUnsafe use = new UseClassWithUnsafe(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/indirect2/DontUseUnsafe3.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.indirect2; + +import use.unsafe.*; + +public class DontUseUnsafe3 { + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/indirect2/UseUnsafeIndirectly2.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.indirect2; + +import use.unsafe.UseUnsafeClass; + +public class UseUnsafeIndirectly2 { + static UseUnsafeClass use = new UseUnsafeClass(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/unsafe/DontUseUnsafe.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.unsafe; + +public class DontUseUnsafe { + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/unsafe/UseClassWithUnsafe.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,7 @@ +package use.unsafe; + +public class UseClassWithUnsafe { + + static UseUnsafeClass use = new UseUnsafeClass(); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/unsafe/UseUnsafeClass.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.unsafe; + +import sun.misc.Unsafe; + +public class UseUnsafeClass { + static Unsafe unsafe = Unsafe.getUnsafe(); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/jdeps/VerboseFormat/use/unsafe/UseUnsafeClass2.java Thu May 28 16:54:56 2015 -0700 @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package use.unsafe; + +import sun.misc.Unsafe; + +public class UseUnsafeClass2 { + static Unsafe unsafe = Unsafe.getUnsafe(); + +}