--- 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 -\> 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™ 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 -\> 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™ 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();
+
+}