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