home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.javap;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.util.Vector;
- import sun.tools.java.BinaryClass;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.ClassPath;
- import sun.tools.java.Identifier;
- import sun.tools.util.ModifierFilter;
-
- public class JavaP {
- private JavaPEnvironment env;
- private Vector classList = new Vector();
- private PrintWriter output;
- private static final String progname = "javap";
- private static final String version = "97/04/22";
-
- public JavaP(PrintWriter var1) {
- this.output = var1;
- this.env = new JavaPEnvironment(var1);
- }
-
- private void error(String var1) {
- int var2 = var1.length();
-
- for(int var3 = 0; var3 < var2; ++var3) {
- System.err.write(var1.charAt(var3));
- }
-
- System.err.write(10);
- System.err.flush();
- }
-
- private void usage() {
- this.error("Usage: javap <options> <classes>...");
- this.error("");
- this.error("where options include:");
- this.error(" -b Backward compatibility with javap in JDK 1.1");
- this.error(" -c Disassemble the code");
- this.error(" -classpath <directories separated by colons>");
- this.error(" List directories in which to look for classes");
- this.error(" -l Print line number and local variable tables");
- this.error(" -public Show only public classes and members");
- this.error(" -protected Show protected/public classes and members");
- this.error(" -package Show package/protected/public classes");
- this.error(" and members (default)");
- this.error(" -private Show all classes and members");
- this.error(" -s Print internal type signatures");
- this.error(" -verbose Print stack size, number of locals and args for methods");
- this.error(" If verifying, print reasons for failure");
- this.error(" -version Print the javap version string");
- this.error(" -verify Run the verifier");
- this.error("");
- }
-
- private boolean parseArguments(String[] var1) {
- String var2 = System.getProperty("java.class.path");
- boolean var3 = true;
-
- for(int var4 = 0; var4 < var1.length; ++var4) {
- String var5 = var1[var4];
- if (var5.startsWith("-")) {
- if (var5.equals("-l")) {
- this.env.showLineAndLocal = true;
- } else if (!var5.equals("-private") && !var5.equals("-p")) {
- if (var5.equals("-package")) {
- this.env.showAccess = new ModifierFilter(-9223372036854775803L);
- } else if (var5.equals("-protected")) {
- this.env.showAccess = new ModifierFilter(5L);
- } else if (var5.equals("-public")) {
- this.env.showAccess = new ModifierFilter(1L);
- } else if (var5.equals("-b")) {
- this.env.showBackwardCompatible = true;
- } else if (var5.equals("-c")) {
- this.env.showDisassembled = true;
- } else if (var5.equals("-s")) {
- this.env.showInternalSigs = true;
- } else if (var5.equals("-verbose")) {
- this.env.showVerbose = true;
- } else if (var5.equals("-v")) {
- this.env.showVerbose = true;
- } else if (var5.equals("-h")) {
- this.env.doMakeInclude = true;
- } else if (var5.equals("-verify")) {
- this.env.doVerify = true;
- } else if (var5.equals("-verify-verbose")) {
- this.env.doVerify = true;
- ++this.env.verifyLevel;
- } else if (var5.equals("-version")) {
- this.error("javap version 97/04/22");
- var3 = false;
- } else {
- if (!var5.equals("-classpath")) {
- this.error("invalid flag: " + var5);
- this.usage();
- return false;
- }
-
- if (var4 + 1 >= var1.length) {
- this.error("-classpath requires argument");
- this.usage();
- return false;
- }
-
- ++var4;
- var2 = var1[var4];
- }
- } else {
- this.env.showAccess = new ModifierFilter(-9223372036854775801L);
- }
- } else {
- this.classList.addElement(var5);
- var3 = false;
- }
- }
-
- if (var3) {
- this.usage();
- return false;
- } else {
- this.env.path = new ClassPath(var2);
- return true;
- }
- }
-
- private void displayResults() {
- for(int var1 = 0; var1 < this.classList.size(); ++var1) {
- String var2 = (String)this.classList.elementAt(var1);
- Identifier var3 = Identifier.lookup(var2);
- if (!this.env.classExists(var3)) {
- this.error("Class '" + var2 + "' not found");
- } else {
- try {
- BinaryClass var4 = (BinaryClass)this.env.getClassDefinition(var3);
- var4.hasBeenLoaded(this.env);
- JavaPClassPrinter var5 = new JavaPClassPrinter(var4, this.env);
- var5.print();
- } catch (ClassNotFound var6) {
- this.error("class not found");
- } catch (IOException var7) {
- this.error("I/O Exception");
- }
- }
- }
-
- }
-
- private void exec(String var1) {
- String var2 = System.getProperty("file.separator");
- StringBuffer var3 = new StringBuffer();
- var3.append(System.getProperty("java.home"));
- var3.append(var2).append("bin").append(var2);
- var3.append(var1);
- var3.append(" -classpath ").append(this.env.path);
- if (this.env.showVerbose) {
- var3.append(" -verbose");
- }
-
- for(int var5 = 0; var5 < this.env.verifyLevel; ++var5) {
- var3.append(" -verify-verbose");
- }
-
- for(int var6 = 0; var6 < this.classList.size(); ++var6) {
- String var7 = (String)this.classList.elementAt(var6);
- var3.append(" ").append(var7);
- }
-
- String var4 = var3.toString();
-
- try {
- Process var14 = Runtime.getRuntime().exec(var4);
- InputStream var8 = var14.getInputStream();
- InputStream var9 = var14.getErrorStream();
- byte[] var10 = new byte[256];
- var14.waitFor();
-
- int var11;
- while((var11 = var9.read(var10)) != -1) {
- this.output.write(new String(var10, 0, var11));
- }
-
- while((var11 = var8.read(var10)) != -1) {
- this.output.write(new String(var10, 0, var11));
- }
-
- } catch (IOException var12) {
- this.error("Cannot execute '" + var4 + "' - " + var12);
- } catch (InterruptedException var13) {
- this.error("Cannot execute '" + var4 + "' - " + var13);
- }
- }
-
- private void perform(String[] var1) {
- if (this.parseArguments(var1)) {
- if (this.env.doMakeInclude) {
- this.error("-h is no longer available - use the 'javah' program");
- return;
- }
-
- if (this.env.doVerify) {
- if (this.env.verifyLevel > 0) {
- this.exec("javaverify_g");
- return;
- }
-
- this.exec("javaverify");
- return;
- }
-
- this.displayResults();
- }
-
- }
-
- public static void main(String[] var0) {
- PrintWriter var1 = new PrintWriter(new OutputStreamWriter(System.out));
-
- try {
- JavaP var4 = new JavaP(var1);
- var4.perform(var0);
- } finally {
- var1.close();
- }
-
- }
- }
-