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     }