Ejemplo n.º 1
0
 /** Write a single method with the byte code associated with it. */
 private void writeMethod(Method method, int method_number) throws IOException {
   // Get raw signature
   String signature = method.getSignature();
   // Get array of strings containing the argument types
   String[] args = Utility.methodSignatureArgumentTypes(signature, false);
   // Get return type string
   String type = Utility.methodSignatureReturnType(signature, false);
   // Get method name
   String name = method.getName();
   String html_name = Class2HTML.toHTML(name);
   // Get method's access flags
   String access = Utility.accessToString(method.getAccessFlags());
   access = Utility.replace(access, " ", " ");
   // Get the method's attributes, the Code Attribute in particular
   Attribute[] attributes = method.getAttributes();
   file.print(
       "<P><B><FONT COLOR=\"#FF0000\">"
           + access
           + "</FONT>&nbsp;"
           + "<A NAME=method"
           + method_number
           + ">"
           + Class2HTML.referenceType(type)
           + "</A>&nbsp<A HREF=\""
           + class_name
           + "_methods.html#method"
           + method_number
           + "\" TARGET=Methods>"
           + html_name
           + "</A>(");
   for (int i = 0; i < args.length; i++) {
     file.print(Class2HTML.referenceType(args[i]));
     if (i < args.length - 1) {
       file.print(",&nbsp;");
     }
   }
   file.println(")</B></P>");
   Code c = null;
   byte[] code = null;
   if (attributes.length > 0) {
     file.print("<H4>Attributes</H4><UL>\n");
     for (int i = 0; i < attributes.length; i++) {
       byte tag = attributes[i].getTag();
       if (tag != ATTR_UNKNOWN) {
         file.print(
             "<LI><A HREF=\""
                 + class_name
                 + "_attributes.html#method"
                 + method_number
                 + "@"
                 + i
                 + "\" TARGET=Attributes>"
                 + ATTRIBUTE_NAMES[tag]
                 + "</A></LI>\n");
       } else {
         file.print("<LI>" + attributes[i] + "</LI>");
       }
       if (tag == ATTR_CODE) {
         c = (Code) attributes[i];
         Attribute[] attributes2 = c.getAttributes();
         code = c.getCode();
         file.print("<UL>");
         for (int j = 0; j < attributes2.length; j++) {
           tag = attributes2[j].getTag();
           file.print(
               "<LI><A HREF=\""
                   + class_name
                   + "_attributes.html#"
                   + "method"
                   + method_number
                   + "@"
                   + i
                   + "@"
                   + j
                   + "\" TARGET=Attributes>"
                   + ATTRIBUTE_NAMES[tag]
                   + "</A></LI>\n");
         }
         file.print("</UL>");
       }
     }
     file.println("</UL>");
   }
   if (code != null) { // No code, an abstract method, e.g.
     // System.out.println(name + "\n" + Utility.codeToString(code, constant_pool, 0, -1));
     // Print the byte code
     ByteSequence stream = new ByteSequence(code);
     stream.mark(stream.available());
     findGotos(stream, method, c);
     stream.reset();
     file.println(
         "<TABLE BORDER=0><TR><TH ALIGN=LEFT>Byte<BR>offset</TH>"
             + "<TH ALIGN=LEFT>Instruction</TH><TH ALIGN=LEFT>Argument</TH>");
     for (int i = 0; stream.available() > 0; i++) {
       int offset = stream.getIndex();
       String str = codeToHTML(stream, method_number);
       String anchor = "";
       /* Set an anchor mark if this line is targetted by a goto, jsr, etc.
        * Defining an anchor for every line is very inefficient!
        */
       if (goto_set.get(offset)) {
         anchor = "<A NAME=code" + method_number + "@" + offset + "></A>";
       }
       String anchor2;
       if (stream.getIndex() == code.length) {
         anchor2 = "<A NAME=code" + method_number + "@" + code.length + ">" + offset + "</A>";
       } else {
         anchor2 = "" + offset;
       }
       file.println("<TR VALIGN=TOP><TD>" + anchor2 + "</TD><TD>" + anchor + str + "</TR>");
     }
     // Mark last line, may be targetted from Attributes window
     file.println("<TR><TD> </A></TD></TR>");
     file.println("</TABLE>");
   }
 }