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 }