1 cananian 1.1.2.1 // AttributeSignature.java, created Wed Mar 27 04:23:21 2002 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 2002 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.IR.RawClass;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 /**
 7 cananian 1.1.2.1  * Classfiles need to carry generic type information in a backwards-compatible
 8 cananian 1.1.2.1  * way.  This is accomplished by introducing a new "Signature" attribute for
 9 cananian 1.1.2.1  * classes, methods, and fields.  (GJ)
10 cananian 1.1.2.1  * 
11 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
12 cananian 1.3      * @version $Id: AttributeSignature.java,v 1.3 2003/09/05 21:45:16 cananian Exp $
13 cananian 1.1.2.1  * @see Attribute
14 cananian 1.1.2.1  * @see ClassFile
15 cananian 1.1.2.1  */
16 cananian 1.1.2.1 public class AttributeSignature extends Attribute {
17 cananian 1.3       /** The string naming this <code>Attribute</code> type. */
18 cananian 1.3       public static final String ATTRIBUTE_NAME = "Signature";
19 cananian 1.1.2.1     /** The value of the <code>signature_index</code> item must be a
20 cananian 1.1.2.1         valid index into the <code>constant_pool</code> table.  The
21 cananian 1.1.2.1         constant pool entry at that index must be a
22 cananian 1.1.2.1         <code>CONSTANT_Utf8_info</code> structure representing the
23 cananian 1.1.2.1         string giving the name of the GJ signature for this method,
24 cananian 1.1.2.1         field, or class. */
25 cananian 1.1.2.1     public int signature_index;
26 cananian 1.1.2.1      
27 cananian 1.1.2.1     /** Creates a <code>AttributeSignature</code>. */
28 cananian 1.1.2.1     AttributeSignature(ClassFile parent, ClassDataInputStream in,
29 cananian 1.1.2.1                        int attribute_name_index) throws java.io.IOException {
30 cananian 1.1.2.1         super(parent, attribute_name_index);
31 cananian 1.1.2.1         long attribute_length = in.read_u4();
32 cananian 1.1.2.1         if (attribute_length != 2)
33 cananian 1.1.2.1             throw new ClassDataException("Signature attribute with length "
34 cananian 1.1.2.1                                          + attribute_length);
35 cananian 1.1.2.1         signature_index = in.read_u2();
36 cananian 1.3             assert ATTRIBUTE_NAME.equals(attribute_name());
37 cananian 1.1.2.1     }
38 cananian 1.1.2.1     /** Constructor. */
39 cananian 1.1.2.1     public AttributeSignature(ClassFile parent, int attribute_name_index,
40 cananian 1.1.2.1                               int signature_index) {
41 cananian 1.1.2.1         super(parent, attribute_name_index);
42 cananian 1.1.2.1         this.signature_index = signature_index;
43 cananian 1.3             assert ATTRIBUTE_NAME.equals(attribute_name());
44 cananian 1.1.2.1     }
45 cananian 1.1.2.1     public long attribute_length() { return 2; }
46 cananian 1.1.2.1     
47 cananian 1.1.2.1     // convenience
48 cananian 1.1.2.1     public ConstantUtf8 signature_index()
49 cananian 1.1.2.1     { return (ConstantUtf8) parent.constant_pool[signature_index]; }
50 cananian 1.1.2.1     public String signature() { return signature_index().val; }
51 cananian 1.1.2.1     
52 cananian 1.1.2.1     /** Write to bytecode stream. */
53 cananian 1.1.2.1     public void write(ClassDataOutputStream out) throws java.io.IOException {
54 cananian 1.1.2.1         out.write_u2(attribute_name_index);
55 cananian 1.1.2.1         out.write_u4(attribute_length());
56 cananian 1.1.2.1         out.write_u2(signature_index);
57 cananian 1.1.2.1     }
58 cananian 1.1.2.1     
59 cananian 1.1.2.1     /** Pretty-print this attribute structure. 
60 cananian 1.1.2.1      *  @param indent the indentation level to use.
61 cananian 1.1.2.1      */
62 cananian 1.1.2.1     public void print(java.io.PrintWriter pw, int indent) {
63 cananian 1.1.2.1         indent(pw, indent, "Signature Attribute: " + 
64 cananian 1.1.2.1                signature() + " {" + signature_index + "}");
65 cananian 1.1.2.1     }
66 cananian 1.2     }