InnerClasses_attribute.java revision 2942:08092deced3f
1230557Sjimharris/*
2230557Sjimharris * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
3230557Sjimharris * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4230557Sjimharris *
5230557Sjimharris * This code is free software; you can redistribute it and/or modify it
6230557Sjimharris * under the terms of the GNU General Public License version 2 only, as
7230557Sjimharris * published by the Free Software Foundation.  Oracle designates this
8230557Sjimharris * particular file as subject to the "Classpath" exception as provided
9230557Sjimharris * by Oracle in the LICENSE file that accompanied this code.
10230557Sjimharris *
11230557Sjimharris * This code is distributed in the hope that it will be useful, but WITHOUT
12230557Sjimharris * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13230557Sjimharris * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14230557Sjimharris * version 2 for more details (a copy is included in the LICENSE file that
15230557Sjimharris * accompanied this code).
16230557Sjimharris *
17230557Sjimharris * You should have received a copy of the GNU General Public License version
18230557Sjimharris * 2 along with this work; if not, write to the Free Software Foundation,
19230557Sjimharris * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20230557Sjimharris *
21230557Sjimharris * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22230557Sjimharris * or visit www.oracle.com if you need additional information or have any
23230557Sjimharris * questions.
24230557Sjimharris */
25230557Sjimharris
26230557Sjimharrispackage com.sun.tools.classfile;
27230557Sjimharris
28230557Sjimharrisimport java.io.IOException;
29230557Sjimharris
30230557Sjimharrisimport com.sun.tools.classfile.ConstantPool.*;
31230557Sjimharris
32230557Sjimharris/**
33230557Sjimharris * See JVMS, section 4.8.6.
34230557Sjimharris *
35230557Sjimharris *  <p><b>This is NOT part of any supported API.
36230557Sjimharris *  If you write code that depends on this, you do so at your own risk.
37230557Sjimharris *  This code and its internal interfaces are subject to change or
38230557Sjimharris *  deletion without notice.</b>
39230557Sjimharris */
40230557Sjimharrispublic class InnerClasses_attribute extends Attribute {
41230557Sjimharris    InnerClasses_attribute(ClassReader cr, int name_index, int length) throws IOException {
42230557Sjimharris        super(name_index, length);
43230557Sjimharris        number_of_classes = cr.readUnsignedShort();
44230557Sjimharris        classes = new Info[number_of_classes];
45230557Sjimharris        for (int i = 0; i < number_of_classes; i++)
46230557Sjimharris            classes[i] = new Info(cr);
47230557Sjimharris    }
48230557Sjimharris
49230557Sjimharris    public InnerClasses_attribute(ConstantPool constant_pool, Info[] classes)
50230557Sjimharris            throws ConstantPoolException {
51230557Sjimharris        this(constant_pool.getUTF8Index(Attribute.InnerClasses), classes);
52230557Sjimharris    }
53230557Sjimharris
54230557Sjimharris    public InnerClasses_attribute(int name_index, Info[] classes) {
55230557Sjimharris        super(name_index, 2 + Info.length() * classes.length);
56230557Sjimharris        this.number_of_classes = classes.length;
57230557Sjimharris        this.classes = classes;
58230557Sjimharris    }
59230557Sjimharris
60230557Sjimharris    public <R, D> R accept(Visitor<R, D> visitor, D data) {
61230557Sjimharris        return visitor.visitInnerClasses(this, data);
62230557Sjimharris    }
63230557Sjimharris
64230557Sjimharris    public final int number_of_classes;
65230557Sjimharris    public final Info[] classes;
66230557Sjimharris
67230557Sjimharris    public static class Info {
68230557Sjimharris        Info(ClassReader cr) throws IOException {
69230557Sjimharris            inner_class_info_index = cr.readUnsignedShort();
70230557Sjimharris            outer_class_info_index = cr.readUnsignedShort();
71230557Sjimharris            inner_name_index = cr.readUnsignedShort();
72230557Sjimharris            inner_class_access_flags = new AccessFlags(cr.readUnsignedShort());
73230557Sjimharris        }
74230557Sjimharris
75230557Sjimharris        public CONSTANT_Class_info getInnerClassInfo(ConstantPool constant_pool) throws ConstantPoolException {
76230557Sjimharris            if (inner_class_info_index == 0)
77230557Sjimharris                return null;
78230557Sjimharris            return constant_pool.getClassInfo(inner_class_info_index);
79230557Sjimharris        }
80230557Sjimharris
81230557Sjimharris        public CONSTANT_Class_info getOuterClassInfo(ConstantPool constant_pool) throws ConstantPoolException {
82230557Sjimharris            if (outer_class_info_index == 0)
83230557Sjimharris                return null;
84230557Sjimharris            return constant_pool.getClassInfo(outer_class_info_index);
85230557Sjimharris        }
86230557Sjimharris
87230557Sjimharris        public String getInnerName(ConstantPool constant_pool) throws ConstantPoolException {
88230557Sjimharris            if (inner_name_index == 0)
89230557Sjimharris                return null;
90230557Sjimharris            return constant_pool.getUTF8Value(inner_name_index);
91230557Sjimharris        }
92230557Sjimharris
93230557Sjimharris        public static int length() {
94230557Sjimharris            return 8;
95230557Sjimharris        }
96230557Sjimharris
97230557Sjimharris        public final int inner_class_info_index;
98230557Sjimharris        public final int outer_class_info_index;
99230557Sjimharris        public final int inner_name_index;
100230557Sjimharris        public final AccessFlags inner_class_access_flags;
101230557Sjimharris    }
102230557Sjimharris}
103230557Sjimharris