1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 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.editor; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class can add interfaces and class members to a given class. 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Elements to be added must be filled out beforehand, including their 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * references to the constant pool. 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class ClassEditor 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final boolean DEBUG = false; 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private ProgramClass targetClass; 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new ClassEditor that will edit elements in the given 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * target class. 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public ClassEditor(ProgramClass targetClass) 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.targetClass = targetClass; 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Adds the given interface. 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void addInterface(int interfaceConstantIndex) 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int interfacesCount = targetClass.u2interfacesCount; 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] interfaces = targetClass.u2interfaces; 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure there is enough space for the new interface. 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaces.length <= interfacesCount) 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.u2interfaces = new int[interfacesCount+1]; 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(interfaces, 0, 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.u2interfaces, 0, 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfacesCount); 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaces = targetClass.u2interfaces; 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(targetClass.getName()+": adding interface ["+targetClass.getClassName(interfaceConstantIndex)+"]"); 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the interface. 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaces[targetClass.u2interfacesCount++] = interfaceConstantIndex; 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Removes the given interface. 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void removeInterface(int interfaceConstantIndex) 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int interfacesCount = targetClass.u2interfacesCount; 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] interfaces = targetClass.u2interfaces; 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int interfaceIndex = findInterfaceIndex(interfaceConstantIndex); 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Shift the interface entries. 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(interfaces, interfaceIndex+1, 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaces, interfaceIndex, 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfacesCount - interfaceIndex - 1); 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Clear the last entry. 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaces[--targetClass.u2interfacesCount] = 0; 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Finds the index of the given interface in the target class. 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int findInterfaceIndex(int interfaceConstantIndex) 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int interfacesCount = targetClass.u2interfacesCount; 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int[] interfaces = targetClass.u2interfaces; 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < interfacesCount; index++) 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (interfaces[index] == interfaceConstantIndex) 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return index; 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return interfacesCount; 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Adds the given field. 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void addField(Field field) 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int fieldsCount = targetClass.u2fieldsCount; 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field[] fields = targetClass.fields; 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure there is enough space for the new field. 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (fields.length <= fieldsCount) 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.fields = new ProgramField[fieldsCount+1]; 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(fields, 0, 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.fields, 0, 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fieldsCount); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fields = targetClass.fields; 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(targetClass.getName()+": adding field ["+field.getName(targetClass)+" "+field.getDescriptor(targetClass)+"]"); 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the field. 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fields[targetClass.u2fieldsCount++] = field; 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Removes the given field. Note that removing a field that is still being 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * referenced can cause unpredictable effects. 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void removeField(Field field) 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int fieldsCount = targetClass.u2fieldsCount; 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field[] fields = targetClass.fields; 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int fieldIndex = findFieldIndex(field); 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Shift the field entries. 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(fields, fieldIndex+1, 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fields, fieldIndex, 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fieldsCount - fieldIndex - 1); 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Clear the last entry. 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fields[--targetClass.u2fieldsCount] = null; 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Finds the index of the given field in the target class. 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int findFieldIndex(Field field) 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int fieldsCount = targetClass.u2fieldsCount; 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Field[] fields = targetClass.fields; 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < fieldsCount; index++) 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (fields[index].equals(field)) 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return index; 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return fieldsCount; 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Adds the given method. 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void addMethod(Method method) 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int methodsCount = targetClass.u2methodsCount; 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method[] methods = targetClass.methods; 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Make sure there is enough space for the new method. 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (methods.length <= methodsCount) 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.methods = new ProgramMethod[methodsCount+1]; 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(methods, 0, 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato targetClass.methods, 0, 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methodsCount); 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methods = targetClass.methods; 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(targetClass.getName()+": adding method ["+method.getName(targetClass)+method.getDescriptor(targetClass)+"]"); 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Add the method. 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methods[targetClass.u2methodsCount++] = method; 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Removes the given method. Note that removing a method that is still being 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * referenced can cause unpredictable effects. 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void removeMethod(Method method) 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int methodsCount = targetClass.u2methodsCount; 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method[] methods = targetClass.methods; 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int methodIndex = findMethodIndex(method); 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Shift the method entries. 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.arraycopy(methods, methodIndex+1, 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methods, methodIndex, 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methodsCount - methodIndex - 1); 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Clear the last entry. 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methods[--targetClass.u2methodsCount] = null; 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Finds the index of the given method in the target class. 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int findMethodIndex(Method method) 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int methodsCount = targetClass.u2methodsCount; 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Method[] methods = targetClass.methods; 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 0; index < methodsCount; index++) 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (methods[index].equals(method)) 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return index; 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return methodsCount; 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 256