1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (c) 2002-2009 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        {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ClassPrinter().visitProgramClass(this);
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new ClassCastException("Expected Utf8Constant at index ["+constantIndex+"] in class ["+getName()+"], found ["+ex.getMessage()+"]");
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getStringString(int constantIndex)
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((StringConstant)constantPool[constantIndex]).getString(this);
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new ClassCastException("Expected StringConstant at index ["+constantIndex+"] in class ["+getName()+"], found ["+ex.getMessage()+"]");
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getClassName(int constantIndex)
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((ClassConstant)constantPool[constantIndex]).getName(this);
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new ClassCastException("Expected ClassConstant at index ["+constantIndex+"] in class ["+getName()+"], found ["+ex.getMessage()+"]");
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getName(int constantIndex)
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((NameAndTypeConstant)constantPool[constantIndex]).getName(this);
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new ClassCastException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"], found ["+ex.getMessage()+"]");
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String getType(int constantIndex)
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        try
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return ((NameAndTypeConstant)constantPool[constantIndex]).getType(this);
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        catch (ClassCastException ex)
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            throw new ClassCastException("Expected NameAndTypeConstant at index ["+constantIndex+"] in class ["+getName()+"], found ["+ex.getMessage()+"]");
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void addSubClass(Clazz clazz)
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (subClasses == null)
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            subClasses = new Clazz[1];
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        else
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Copy the old elements into new larger array.
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz[] temp = new Clazz[subClasses.length+1];
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            System.arraycopy(subClasses, 0, temp, 0, subClasses.length);
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            subClasses = temp;
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        subClasses[subClasses.length-1] = clazz;
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Clazz getSuperClass()
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return u2superClass != 0 ?
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            ((ClassConstant)constantPool[u2superClass]).referencedClass :
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            null;
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Clazz getInterface(int index)
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return ((ClassConstant)constantPool[u2interfaces[index]]).referencedClass;
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean extends_(Clazz clazz)
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (this.equals(clazz))
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz superClass = getSuperClass();
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return superClass != null &&
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               superClass.extends_(clazz);
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean extendsOrImplements(Clazz clazz)
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (this.equals(clazz))
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz superClass = getSuperClass();
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (superClass != null &&
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            superClass.extendsOrImplements(clazz))
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return true;
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2interfacesCount; index++)
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz interfaceClass = getInterface(index);
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (interfaceClass != null &&
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                interfaceClass.extendsOrImplements(clazz))
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return true;
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return false;
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Field findField(String name, String descriptor)
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2fieldsCount; index++)
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Field field = fields[index];
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if ((name       == null || field.getName(this).equals(name)) &&
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null || field.getDescriptor(this).equals(descriptor)))
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return field;
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Method findMethod(String name, String descriptor)
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2methodsCount; index++)
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Method method = methods[index];
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if ((name       == null || method.getName(this).equals(name)) &&
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (descriptor == null || method.getDescriptor(this).equals(descriptor)))
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return method;
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return null;
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void accept(ClassVisitor classVisitor)
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classVisitor.visitProgramClass(this);
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void hierarchyAccept(boolean      visitThisClass,
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitSuperClass,
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitInterfaces,
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                boolean      visitSubclasses,
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                ClassVisitor classVisitor)
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // First visit the current classfile.
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitThisClass)
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            accept(classVisitor);
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its superclass, recursively.
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitSuperClass)
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz superClass = getSuperClass();
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (superClass != null)
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                superClass.hierarchyAccept(true,
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           true,
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           visitInterfaces,
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           false,
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                           classVisitor);
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its interfaces, recursively.
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitInterfaces)
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Visit the interfaces of the superclasses, if we haven't done so yet.
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (!visitSuperClass)
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Clazz superClass = getSuperClass();
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (superClass != null)
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    superClass.hierarchyAccept(false,
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               false,
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               true,
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               false,
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               classVisitor);
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Visit the interfaces.
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < u2interfacesCount; index++)
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                Clazz interfaceClass = getInterface(index);
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (interfaceClass != null)
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    interfaceClass.hierarchyAccept(true,
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   false,
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   true,
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   false,
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                   classVisitor);
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Then visit its subclasses, recursively.
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (visitSubclasses)
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (subClasses != null)
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < subClasses.length; index++)
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    Clazz subClass = subClasses[index];
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    subClass.hierarchyAccept(true,
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             false,
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             false,
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             true,
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                             classVisitor);
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void subclassesAccept(ClassVisitor classVisitor)
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (subClasses != null)
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            for (int index = 0; index < subClasses.length; index++)
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                subClasses[index].accept(classVisitor);
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void constantPoolEntriesAccept(ConstantVisitor constantVisitor)
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 1; index < u2constantPoolCount; index++)
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (constantPool[index] != null)
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                constantPool[index].accept(this, constantVisitor);
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void constantPoolEntryAccept(int index, ConstantVisitor constantVisitor)
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constantPool[index].accept(this, constantVisitor);
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void thisClassConstantAccept(ConstantVisitor constantVisitor)
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        constantPool[u2thisClass].accept(this, constantVisitor);
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void superClassConstantAccept(ConstantVisitor constantVisitor)
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (u2superClass != 0)
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPool[u2superClass].accept(this, constantVisitor);
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void interfaceConstantsAccept(ConstantVisitor constantVisitor)
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2interfacesCount; index++)
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPool[u2interfaces[index]].accept(this, constantVisitor);
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void fieldsAccept(MemberVisitor memberVisitor)
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2fieldsCount; index++)
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            fields[index].accept(this, memberVisitor);
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void fieldAccept(String name, String descriptor, MemberVisitor memberVisitor)
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Field field = findField(name, descriptor);
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (field != null)
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            field.accept(this, memberVisitor);
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void methodsAccept(MemberVisitor memberVisitor)
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2methodsCount; index++)
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            methods[index].accept(this, memberVisitor);
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void methodAccept(String name, String descriptor, MemberVisitor memberVisitor)
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Method method = findMethod(name, descriptor);
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (method != null)
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            method.accept(this, memberVisitor);
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public boolean mayHaveImplementations(Method method)
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 &&
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (method == null ||
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ((method.getAccessFlags() & (ClassConstants.INTERNAL_ACC_PRIVATE |
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          ClassConstants.INTERNAL_ACC_STATIC  |
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          ClassConstants.INTERNAL_ACC_FINAL)) == 0 &&
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato              !method.getName(this).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)));
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void attributesAccept(AttributeVisitor attributeVisitor)
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < u2attributesCount; index++)
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            attributes[index].accept(this, attributeVisitor);
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for VisitorAccepter.
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public Object getVisitorInfo()
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorInfo;
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void setVisitorInfo(Object visitorInfo)
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        this.visitorInfo = visitorInfo;
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for Object.
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public String toString()
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return "ProgramClass("+getName()+")";
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
495