1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.classfile;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.Attribute;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AttributeVisitor;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.ClassSubHierarchyInitializer;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This Clazz is a complete representation of the data in a Java class.
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ProgramClass implements Clazz
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u4magic;
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u4version;
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2constantPoolCount;
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Constant[]      constantPool;
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2accessFlags;
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2thisClass;
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2superClass;
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2interfacesCount;
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int[]           u2interfaces;
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2fieldsCount;
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ProgramField[]  fields;
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2methodsCount;
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ProgramMethod[] methods;
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int             u2attributesCount;
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Attribute[]     attributes;
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * An extra field pointing to the subclasses of this class.
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * This field is filled out by the {@link ClassSubHierarchyInitializer}.
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Clazz[] subClasses;
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * An extra field in which visitors can store information.
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Object visitorInfo;
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Creates an uninitialized ProgramClass.
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public ProgramClass() {}
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the Constant at the given index in the constant pool.
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Constant getConstant(int constantIndex)
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return constantPool[constantIndex];
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for Clazz.
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int getAccessFlags()
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return u2accessFlags;
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getName()
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return getClassName(u2thisClass);
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getSuperName()
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return u2superClass == 0 ? null : getClassName(u2superClass);
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int getInterfaceCount()
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return u2interfacesCount;
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getInterfaceName(int index)
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return getClassName(u2interfaces[index]);
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public int getTag(int constantIndex)
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return constantPool[constantIndex].getTag();
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getString(int constantIndex)
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((Utf8Constant)constantPool[constantIndex]).getString();
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
120b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected Utf8Constant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getStringString(int constantIndex)
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((StringConstant)constantPool[constantIndex]).getString(this);
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
132b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected StringConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getClassName(int constantIndex)
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((ClassConstant)constantPool[constantIndex]).getName(this);
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
144b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected ClassConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getName(int constantIndex)
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((NameAndTypeConstant)constantPool[constantIndex]).getName(this);
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
156b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getType(int constantIndex)
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((NameAndTypeConstant)constantPool[constantIndex]).getType(this);
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
168b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
169b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
170b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
171b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
172b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
173b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public String getRefName(int constantIndex)
174b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
175b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        try
176b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
177b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            return ((RefConstant)constantPool[constantIndex]).getName(this);
178b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
179b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        catch (ClassCastException ex)
180b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
181b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
182b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
183b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
184b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
185b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public String getRefType(int constantIndex)
186b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
187b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        try
188b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
189b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            return ((RefConstant)constantPool[constantIndex]).getType(this);
190b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
191b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        catch (ClassCastException ex)
192b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void addSubClass(Clazz clazz)
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (subClasses == null)
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            subClasses = new Clazz[1];
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Copy the old elements into new larger array.
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz[] temp = new Clazz[subClasses.length+1];
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.arraycopy(subClasses, 0, temp, 0, subClasses.length);
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            subClasses = temp;
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        subClasses[subClasses.length-1] = clazz;
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Clazz getSuperClass()
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return u2superClass != 0 ?
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            ((ClassConstant)constantPool[u2superClass]).referencedClass :
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            null;
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Clazz getInterface(int index)
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return ((ClassConstant)constantPool[u2interfaces[index]]).referencedClass;
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean extends_(Clazz clazz)
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (this.equals(clazz))
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz superClass = getSuperClass();
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return superClass != null &&
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               superClass.extends_(clazz);
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
243b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public boolean extends_(String className)
244b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
245b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (getName().equals(className))
246b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
247b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            return true;
248b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
249b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
250b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Clazz superClass = getSuperClass();
251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return superClass != null &&
252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang               superClass.extends_(className);
253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean extendsOrImplements(Clazz clazz)
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (this.equals(clazz))
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz superClass = getSuperClass();
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (superClass != null &&
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            superClass.extendsOrImplements(clazz))
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2interfacesCount; index++)
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz interfaceClass = getInterface(index);
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (interfaceClass != null &&
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                interfaceClass.extendsOrImplements(clazz))
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return true;
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return false;
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public boolean extendsOrImplements(String className)
285b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (getName().equals(className))
287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
288b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            return true;
289b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
290b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Clazz superClass = getSuperClass();
292b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (superClass != null &&
293b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            superClass.extendsOrImplements(className))
294b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
295b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            return true;
296b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
298b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        for (int index = 0; index < u2interfacesCount; index++)
299b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            Clazz interfaceClass = getInterface(index);
301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (interfaceClass != null &&
302b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                interfaceClass.extendsOrImplements(className))
303b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
304b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                return true;
305b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return false;
309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Field findField(String name, String descriptor)
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2fieldsCount; index++)
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Field field = fields[index];
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if ((name       == null || field.getName(this).equals(name)) &&
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null || field.getDescriptor(this).equals(descriptor)))
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return field;
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Method findMethod(String name, String descriptor)
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2methodsCount; index++)
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Method method = methods[index];
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if ((name       == null || method.getName(this).equals(name)) &&
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null || method.getDescriptor(this).equals(descriptor)))
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return method;
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void accept(ClassVisitor classVisitor)
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classVisitor.visitProgramClass(this);
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void hierarchyAccept(boolean      visitThisClass,
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitSuperClass,
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitInterfaces,
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitSubclasses,
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                ClassVisitor classVisitor)
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // First visit the current classfile.
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitThisClass)
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            accept(classVisitor);
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its superclass, recursively.
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitSuperClass)
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz superClass = getSuperClass();
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (superClass != null)
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                superClass.hierarchyAccept(true,
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           true,
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           visitInterfaces,
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           false,
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           classVisitor);
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its interfaces, recursively.
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitInterfaces)
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Visit the interfaces of the superclasses, if we haven't done so yet.
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (!visitSuperClass)
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Clazz superClass = getSuperClass();
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (superClass != null)
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    superClass.hierarchyAccept(false,
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               false,
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               true,
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               false,
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               classVisitor);
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Visit the interfaces.
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < u2interfacesCount; index++)
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Clazz interfaceClass = getInterface(index);
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (interfaceClass != null)
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    interfaceClass.hierarchyAccept(true,
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   false,
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   true,
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   false,
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   classVisitor);
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its subclasses, recursively.
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitSubclasses)
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (subClasses != null)
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < subClasses.length; index++)
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    Clazz subClass = subClasses[index];
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    subClass.hierarchyAccept(true,
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             false,
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             false,
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             true,
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             classVisitor);
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void subclassesAccept(ClassVisitor classVisitor)
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (subClasses != null)
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < subClasses.length; index++)
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                subClasses[index].accept(classVisitor);
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void constantPoolEntriesAccept(ConstantVisitor constantVisitor)
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 1; index < u2constantPoolCount; index++)
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (constantPool[index] != null)
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                constantPool[index].accept(this, constantVisitor);
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor)
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constantPool[index].accept(this, constantVisitor);
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void thisClassConstantAccept(ConstantVisitor constantVisitor)
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constantPool[u2thisClass].accept(this, constantVisitor);
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void superClassConstantAccept(ConstantVisitor constantVisitor)
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (u2superClass != 0)
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPool[u2superClass].accept(this, constantVisitor);
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void interfaceConstantsAccept(ConstantVisitor constantVisitor)
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2interfacesCount; index++)
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPool[u2interfaces[index]].accept(this, constantVisitor);
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void fieldsAccept(MemberVisitor memberVisitor)
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2fieldsCount; index++)
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            fields[index].accept(this, memberVisitor);
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor)
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Field field = findField(name, descriptor);
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (field != null)
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            field.accept(this, memberVisitor);
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void methodsAccept(MemberVisitor memberVisitor)
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2methodsCount; index++)
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            methods[index].accept(this, memberVisitor);
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor)
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Method method = findMethod(name, descriptor);
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (method != null)
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            method.accept(this, memberVisitor);
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean mayHaveImplementations(Method method)
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 &&
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (method == null ||
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ((method.getAccessFlags() & (ClassConstants.INTERNAL_ACC_PRIVATE |
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          ClassConstants.INTERNAL_ACC_STATIC  |
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          ClassConstants.INTERNAL_ACC_FINAL)) == 0 &&
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato              !method.getName(this).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)));
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void attributesAccept(AttributeVisitor attributeVisitor)
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2attributesCount; index++)
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            attributes[index].accept(this, attributeVisitor);
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
540b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    public void attributeAccept(String name, AttributeVisitor attributeVisitor)
541b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
542b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        for (int index = 0; index < u2attributesCount; index++)
543b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
544b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            Attribute attribute = attributes[index];
545b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (attribute.getAttributeName(this).equals(name))
546b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
547b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                attribute.accept(this, attributeVisitor);
548b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
549b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
550b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
551b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
552b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for VisitorAccepter.
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Object getVisitorInfo()
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorInfo;
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void setVisitorInfo(Object visitorInfo)
561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.visitorInfo = visitorInfo;
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for Object.
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String toString()
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return "ProgramClass("+getName()+")";
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
573