Merge
authorlana
Thu, 28 May 2015 16:54:56 -0700
changeset 30848 c275389a3680
parent 30842 b02fa8bb730c (current diff)
parent 30847 9385b9c8506b (diff)
child 30849 fcfa8eb95c23
Merge
langtools/make/gensrc/Gensrc-jdk.dev.gmk
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/AccessFlags.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Annotation.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/AnnotationDefault_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/AttributeException.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Attributes.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/CharacterRangeTable_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassFile.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassReader.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassTranslator.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ClassWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Code_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/CompilationID_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPool.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantPoolException.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ConstantValue_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/DefaultAttribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependencies.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Dependency.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Deprecated_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Descriptor.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/DescriptorException.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/EnclosingMethod_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Exceptions_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Field.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/InnerClasses_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Instruction.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/LineNumberTable_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTable_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/LocalVariableTypeTable_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Method.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/MethodParameters_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Opcode.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/ReferenceFinder.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleParameterAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeInvisibleTypeAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeParameterAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeTypeAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleParameterAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/RuntimeVisibleTypeAnnotations_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceFile_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/SourceID_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/StackMap_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Synthetic_attribute.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Type.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/TypeAnnotation.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/package-info.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/AnnotationWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/AttributeWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/BasicWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/ClassWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/CodeWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/ConstantWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/Context.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/DisassemblerTool.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/InstructionDetailWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/InternalError.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/JavapFileManager.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/JavapTask.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTableWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/LocalVariableTypeTableWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/Main.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/Messages.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/Options.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/SourceWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/StackMapWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/TryBlockWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/overview.html
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/package-info.java
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap.properties
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_ja.properties
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/javap_zh_CN.properties
langtools/src/jdk.compiler/share/classes/com/sun/tools/javap/resources/version.properties-template
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/Analyzer.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/Archive.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/ClassFileReader.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/JdepsTask.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/Main.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/Module.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/ModulesXmlReader.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/PlatformClassPath.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/Profile.java
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps.properties
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_ja.properties
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdeps_zh_CN.properties
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/jdkinternals.properties
langtools/src/jdk.dev/share/classes/com/sun/tools/jdeps/resources/version.properties-template
--- a/langtools/make/CompileInterim.gmk	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/make/build.properties	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/make/build.xml	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/make/gensrc/Gensrc-jdk.compiler.gmk	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/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/langtools/make/intellij/langtools.iml	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/make/intellij/workspace.xml	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/make/netbeans/langtools/nbproject/project.xml	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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&nbsp;-\&gt;&nbsp;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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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&trade; 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/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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&nbsp;-\&gt;&nbsp;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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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&trade; 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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/test/tools/javac/4241573/T4241573.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/4846262/CheckEBCDICLocaleTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/test/tools/javac/7003595/T7003595.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/7153958/CPoolRefClassContainingInlinedCts.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/7166455/CheckACC_STRICTFlagOnclinitTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/7199823/InnerClassCannotBeVerified.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/8000518/DuplicateConstantPoolEntry.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/8005931/CheckACC_STRICTFlagOnPkgAccessClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/8009170/RedundantByteCodeInArrayTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/AnnotationTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/AnonymousClass.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/Constructors.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/EnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/InstanceMethods.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/LambdaTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/LocalClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/MemberClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/StaticMethods.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParameters/UncommonParamNames.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/MethodParametersTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/NoStringToLower.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T6695379/AnnotationsAreNotCopiedToBridgeMethodsTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T6970173/DebugPointerAtBadPositionTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T7008643/InlinedFinallyConfuseDebuggersTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T7053059/DoubleCastTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T7093325.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T7165659/InnerClassAttrMustNotHaveStrictFPFlagTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8003967/DetectMutableStaticFields.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8010737/ParameterNamesAreNotCopiedToAnonymousInitTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8011181/EmptyUTF8ForInnerClassNameTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8019486/WrongLNTForLambdaTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8022186/DeadCodeGeneratedForEmptyTryTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8024039/NoDeadCodeGenerationOnTrySmtTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/T8028504/DontGenerateLVTForGNoneOpTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/SyntheticParameters.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest1.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest2.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/CombinationsTargetTest3.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/DeadCode.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/NewTypeArguments.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/NoTargetAnnotations.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/Scopes.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/SyntheticParameters.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/T8008762.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/T8008769.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/T8010015.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/TestAnonInnerClasses.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/TestNewCastArray.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/TypeCasts.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/classfile/Wildcards.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassExtends.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ClassTypeParam.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ConstructorInvocationTypeArgument.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Constructors.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ExceptionParameters.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Fields.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/FromSpecification.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Initializers.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/Lambda.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodInvocationTypeArgument.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodParameters.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReceivers.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodReturns.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodThrows.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodTypeParam.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MultiCatch.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/NestedTypes.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/NewObjects.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/RepeatingTypeAnnotations.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/ResourceVariable.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeCasts.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/TypeTests.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/InnerClasses/SyntheticClasses.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/AnnotationDefault/AnnotationDefaultTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/EnclosingMethod/EnclosingMethodTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/LineNumberTable/LineNumberTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTableTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/LocalVariableTable/LocalVariableTypeTableTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/ConstructorTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/EnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/ExceptionTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/FieldTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/InnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/MethodParameterTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/MethodTypeBoundTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/Signature/ReturnTypeTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/AnonymousClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/InnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/LocalClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/MixTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/NoSourceFileAttribute.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/SyntheticClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/SourceFile/TopLevelClassesOneFileTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/deprecated/DeprecatedPackageTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/deprecated/DeprecatedTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerAnnotationTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerEnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerAnnotationsInInnerInterfaceTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesHierarchyTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInAnonymousClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerAnnotationTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerEnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInInnerInterfaceTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesInLocalClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesIndexTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerClassesTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerAnnotationTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerEnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumInInnerInterfaceTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerEnumsInInnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerAnnotationTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerClassTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerEnumTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/InnerInterfacesInInnerInterfaceTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classfiles/attributes/innerclasses/NoInnerClassesTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/classreader/BadClass.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/constDebug/ConstDebugTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/defaultMethods/BadClassfile.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/defaultMethods/CheckACC_STRICTFlagOnDefaultMethodTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/defaultMethods/TestDefaultBody.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/defaultMethods/TestNoBridgeOnDefaults.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/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/langtools/test/tools/javac/defaultMethods/super/TestDirectSuperInterfaceInvoke.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/diags/CheckResourceKeys.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/expression/_super/NonDirectSuper/NonDirectSuper.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/flow/LVTHarness.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/generics/bridges/BridgeHarness.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/jvm/ClassRefDupInConstantPoolTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/ByteCodeTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/LambdaTestStrictFPFlag.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/LocalVariableTable.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/TestInvokeDynamic.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/bytecode/TestLambdaBytecode.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/lambda/lambdaNaming/TestNonSerializableLambdaNameStability.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/linenumbers/ConditionalLineNumberTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/linenumbers/NestedLineNumberTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/meth/TestCP.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/multicatch/7005371/T7005371.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/multicatch/Pos05.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/varargs/6199075/T6199075.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javac/varargs/7042566/T7042566.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javadoc/CheckResourceKeys.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/4111861/T4111861.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/4870651/T4870651.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/6937244/T6937244.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/6937244/T6937244A.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/8006334/JavapTaskCtorFailWithNPE.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/8007907/JavapReturns0AfterClassNotFoundTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/AccessModifiers.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/BadAttributeLength.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/BoundsTypeVariableTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/DescriptorTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/ExtPath.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/InvalidOptions.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/MethodParameters.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/StackMapTableTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4075403.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4459541.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4501660.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4501661.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4777949.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4876942.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4880663.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4880672.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4884240.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T4975569.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6271787.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6474890.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6587786.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6622216.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6622232.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6622260.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6715251.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6715753.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6715767.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6716452.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6824493.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6863746.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6866657.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6868539.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T6879371.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T7004698.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T7186925.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T7190862.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8032814.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8032819.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8033180.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8033711.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8035104.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/T8038414.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/TestSuperclass.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/WhitespaceTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/classfile/T6887895.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/classfile/deps/T6907575.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/JSR175Annotations.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/NewArray.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/Presence.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/PresenceInner.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/T6855990.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/TypeCasts.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/Visibility.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/javap/typeAnnotations/Wildcards.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/jdeps/APIDeps.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/jdeps/Basic.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/test/tools/jdeps/DotFileTest.java	Thu May 28 16:13:55 2015 -0700
+++ b/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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/langtools/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();
+
+}