1 cananian 1.1.2.2 // AttributeInnerClasses.java, created Mon Jan 18 22:44:35 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1998 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 * <code>InnerClasses</code> attributes define the encodings of 8 cananian 1.1.2.1 * bytecode names of inner classes. The attribute is stored in 9 cananian 1.1.2.1 * the <code>ClassFile</code> structure.<p> 10 cananian 1.1.2.1 * Each array element in the attribute records a class with an encoded 11 cananian 1.1.2.1 * name, its defining scope, its simple name, and a bitmask of the 12 cananian 1.1.2.1 * originally declared, untransformed access flags. 13 cananian 1.1.2.1 * 14 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 15 cananian 1.3 * @version $Id: AttributeInnerClasses.java,v 1.3 2003/09/05 21:45:16 cananian Exp $ 16 cananian 1.1.2.1 * @see "Inner Classes Specification" 17 cananian 1.1.2.1 * @see InnerClass 18 cananian 1.1.2.1 * @see Attribute 19 cananian 1.1.2.1 * @see ClassFile 20 cananian 1.1.2.1 */ 21 cananian 1.1.2.1 public class AttributeInnerClasses extends Attribute { 22 cananian 1.3 /** The string naming this <code>Attribute</code> type. */ 23 cananian 1.3 public static final String ATTRIBUTE_NAME = "InnerClasses"; 24 cananian 1.1.2.1 /** Each array element records a class with an encoded name, 25 cananian 1.1.2.1 * its defining scope, its simple name, and its originally 26 cananian 1.1.2.1 * declared access flags. */ 27 cananian 1.1.2.1 public InnerClass[] classes; 28 cananian 1.1.2.1 29 cananian 1.1.2.1 /** Constructor. */ 30 cananian 1.1.2.1 AttributeInnerClasses(ClassFile parent, ClassDataInputStream in, 31 cananian 1.1.2.1 int attribute_name_index) throws java.io.IOException { 32 cananian 1.1.2.1 super(parent, attribute_name_index); 33 cananian 1.1.2.1 long attribute_length = in.read_u4(); 34 cananian 1.1.2.1 35 cananian 1.1.2.1 int number_of_classes = in.read_u2(); 36 cananian 1.1.2.1 classes = new InnerClass[number_of_classes]; 37 cananian 1.1.2.1 for (int i=0; i<number_of_classes; i++) 38 cananian 1.1.2.1 classes[i] = new InnerClass(parent, in); 39 cananian 1.1.2.1 40 cananian 1.1.2.1 if (attribute_length != attribute_length()) 41 cananian 1.1.2.1 throw new ClassDataException("AttributeInnerClasses attribute with " + 42 cananian 1.1.2.1 "length " + attribute_length); 43 cananian 1.3 assert ATTRIBUTE_NAME.equals(attribute_name()); 44 cananian 1.1.2.1 } 45 cananian 1.1.2.1 /** Constructor. */ 46 cananian 1.1.2.1 public AttributeInnerClasses(ClassFile parent, int attribute_name_index, 47 cananian 1.1.2.1 InnerClass[] classes) { 48 cananian 1.1.2.1 super(parent, attribute_name_index); 49 cananian 1.1.2.1 this.classes = classes; 50 cananian 1.3 assert ATTRIBUTE_NAME.equals(attribute_name()); 51 cananian 1.1.2.1 } 52 cananian 1.1.2.1 53 cananian 1.1.2.1 public long attribute_length() { return 2+8*number_of_classes(); } 54 cananian 1.1.2.1 55 cananian 1.1.2.1 // convenience. 56 cananian 1.1.2.1 public int number_of_classes() { return classes.length; } 57 cananian 1.1.2.1 public InnerClass classes(int i) { return classes[i]; } 58 cananian 1.1.2.1 59 cananian 1.1.2.1 /** Write to bytecode stream. */ 60 cananian 1.1.2.1 public void write(ClassDataOutputStream out) throws java.io.IOException { 61 cananian 1.1.2.1 out.write_u2(attribute_name_index); 62 cananian 1.1.2.1 out.write_u4(attribute_length()); 63 cananian 1.1.2.1 out.write_u2(number_of_classes()); 64 cananian 1.1.2.1 for (int i=0; i<classes.length; i++) 65 cananian 1.1.2.1 classes[i].write(out); 66 cananian 1.1.2.1 } 67 cananian 1.1.2.1 68 cananian 1.1.2.1 /** Pretty-print this attribute structure. */ 69 cananian 1.1.2.1 public void print(java.io.PrintWriter pw, int indent) { 70 cananian 1.1.2.1 int in = indent; 71 cananian 1.1.2.1 indent(pw, in, "InnerClasses Attributes ["+number_of_classes()+"]:"); 72 cananian 1.1.2.1 for (int i=0; i<classes.length; i++) { 73 cananian 1.1.2.1 indent(pw, in+1, "#"+i+": " + classes[i].toString()); 74 cananian 1.1.2.1 } 75 cananian 1.1.2.1 } 76 cananian 1.2 }