1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59f606f95f03a75961498803e24bee6799a7c0885Ying Wang * 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 { 1209f606f95f03a75961498803e24bee6799a7c0885Ying Wang new ClassPrinter().visitProgramClass(this); 1219f606f95f03a75961498803e24bee6799a7c0885Ying Wang 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 { 1339f606f95f03a75961498803e24bee6799a7c0885Ying Wang 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 { 1459f606f95f03a75961498803e24bee6799a7c0885Ying Wang 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 { 1579f606f95f03a75961498803e24bee6799a7c0885Ying Wang 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 { 1699f606f95f03a75961498803e24bee6799a7c0885Ying Wang 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