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.editor; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AttributeVisitor; 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor; 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*; 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*; 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor fixes constant pool field and method references to fields 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * and methods whose names or descriptors have changed. 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class MemberReferenceFixer 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends SimplifiedVisitor 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements ClassVisitor, 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConstantVisitor, 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MemberVisitor, 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato AttributeVisitor, 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato AnnotationVisitor, 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ElementValueVisitor 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final boolean DEBUG = false; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private final StackSizeUpdater stackSizeUpdater = new StackSizeUpdater(); 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Parameter for the visitor methods. 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int constantIndex; 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Return values for the visitor methods. 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean isInterfaceMethod; 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean stackSizesMayHaveChanged; 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ClassVisitor. 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramClass(ProgramClass programClass) 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackSizesMayHaveChanged = false; 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the constant pool entries. 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato for (int index = 1; index < programClass.u2constantPoolCount; index++) 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Constant constant = programClass.constantPool[index]; 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (constant != null) 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the entry, replacing it entirely if needed. 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.constantIndex = index; 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato constant.accept(programClass, this); 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the class members. 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.fieldsAccept(this); 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.methodsAccept(this); 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the attributes. 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.attributesAccept(this); 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ConstantVisitor. 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyConstant(Clazz clazz, Constant constant) {} 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does the string refer to a class member, due to a 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Class.get[Declared]{Field,Method} construct? 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = stringConstant.referencedMember; 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = stringConstant.referencedClass; 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does it have a new name? 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newName = referencedMember.getName(referencedClass); 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!stringConstant.getString(clazz).equals(newName)) 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato debug(clazz, stringConstant, referencedClass, referencedMember); 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the name. 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stringConstant.u2stringIndex = 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newName); 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Do we know the referenced field? 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = fieldrefConstant.referencedMember; 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = fieldrefConstant.referencedClass; 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does it have a new name or type? 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newName = referencedMember.getName(referencedClass); 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newType = referencedMember.getDescriptor(referencedClass); 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!fieldrefConstant.getName(clazz).equals(newName) || 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato !fieldrefConstant.getType(clazz).equals(newType)) 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato debug(clazz, fieldrefConstant, referencedClass, referencedMember); 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the name and type index. 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fieldrefConstant.u2nameAndTypeIndex = 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Do we know the referenced interface method? 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = interfaceMethodrefConstant.referencedMember; 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = interfaceMethodrefConstant.referencedClass; 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does it have a new name or type? 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newName = referencedMember.getName(referencedClass); 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newType = referencedMember.getDescriptor(referencedClass); 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!interfaceMethodrefConstant.getName(clazz).equals(newName) || 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato !interfaceMethodrefConstant.getType(clazz).equals(newType)) 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato debug(clazz, interfaceMethodrefConstant, referencedClass, referencedMember); 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the name and type index. 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaceMethodrefConstant.u2nameAndTypeIndex = 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remember that the stack sizes of the methods in this class 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // may have changed. 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackSizesMayHaveChanged = true; 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Check if this is an interface method. 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isInterfaceMethod = true; 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato clazz.constantPoolEntryAccept(interfaceMethodrefConstant.u2classIndex, this); 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Has the method become a non-interface method? 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!isInterfaceMethod) 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println("MemberReferenceFixer:"); 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Class file = "+clazz.getName()); 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Ref class = "+referencedClass.getName()); 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Ref method = "+interfaceMethodrefConstant.getName(clazz)+interfaceMethodrefConstant.getType(clazz)); 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" -> ordinary method"); 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Replace the interface method reference by a method reference. 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((ProgramClass)clazz).constantPool[this.constantIndex] = 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new MethodrefConstant(interfaceMethodrefConstant.u2classIndex, 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato interfaceMethodrefConstant.u2nameAndTypeIndex, 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato referencedClass, 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato referencedMember); 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Do we know the referenced method? 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = methodrefConstant.referencedMember; 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = methodrefConstant.referencedClass; 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does it have a new name or type? 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newName = referencedMember.getName(referencedClass); 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newType = referencedMember.getDescriptor(referencedClass); 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!methodrefConstant.getName(clazz).equals(newName) || 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato !methodrefConstant.getType(clazz).equals(newType)) 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato debug(clazz, methodrefConstant, referencedClass, referencedMember); 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the name and type index. 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methodrefConstant.u2nameAndTypeIndex = 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(newName, newType); 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Remember that the stack sizes of the methods in this class 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // may have changed. 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackSizesMayHaveChanged = true; 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Check if this is an interface method. 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isInterfaceMethod = false; 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato clazz.constantPoolEntryAccept(methodrefConstant.u2classIndex, this); 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Has the method become an interface method? 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (isInterfaceMethod) 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (DEBUG) 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println("MemberReferenceFixer:"); 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Class file = "+clazz.getName()); 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Ref class = "+referencedClass.getName()); 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" Ref method = "+methodrefConstant.getName(clazz)+methodrefConstant.getType(clazz)); 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println(" -> interface method"); 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Replace the method reference by an interface method reference. 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ((ProgramClass)clazz).constantPool[this.constantIndex] = 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new InterfaceMethodrefConstant(methodrefConstant.u2classIndex, 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato methodrefConstant.u2nameAndTypeIndex, 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato referencedClass, 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato referencedMember); 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Check if this class entry is an array type. 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (ClassUtil.isInternalArrayType(classConstant.getName(clazz))) 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isInterfaceMethod = false; 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Check if this class entry refers to an interface class. 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = classConstant.referencedClass; 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedClass != null) 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato isInterfaceMethod = (referencedClass.getAccessFlags() & ClassConstants.INTERNAL_ACC_INTERFACE) != 0; 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for MemberVisitor. 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramMember(ProgramClass programClass, ProgramMember programMember) 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the attributes. 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programMember.attributesAccept(programClass, this); 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for AttributeVisitor. 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = enclosingMethodAttribute.referencedMethod; 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass = enclosingMethodAttribute.referencedClass; 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 3019f606f95f03a75961498803e24bee6799a7c0885Ying Wang // Does it have a new class? 3029f606f95f03a75961498803e24bee6799a7c0885Ying Wang if (!enclosingMethodAttribute.getClassName(clazz).equals(referencedClass.getName())) 3039f606f95f03a75961498803e24bee6799a7c0885Ying Wang { 3049f606f95f03a75961498803e24bee6799a7c0885Ying Wang // Update the class index. 3059f606f95f03a75961498803e24bee6799a7c0885Ying Wang enclosingMethodAttribute.u2classIndex = 3069f606f95f03a75961498803e24bee6799a7c0885Ying Wang new ConstantPoolEditor((ProgramClass)clazz).addClassConstant(referencedClass); 3079f606f95f03a75961498803e24bee6799a7c0885Ying Wang } 308cfead78069f3dc32998dc118ee08cab3867acea2Ying Wang 3099f606f95f03a75961498803e24bee6799a7c0885Ying Wang // Does it have a new name or type? 3109f606f95f03a75961498803e24bee6799a7c0885Ying Wang if (!enclosingMethodAttribute.getName(clazz).equals(referencedMember.getName(referencedClass)) || 3119f606f95f03a75961498803e24bee6799a7c0885Ying Wang !enclosingMethodAttribute.getType(clazz).equals(referencedMember.getDescriptor(referencedClass))) 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the name and type index. 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato enclosingMethodAttribute.u2nameAndTypeIndex = 3159f606f95f03a75961498803e24bee6799a7c0885Ying Wang new ConstantPoolEditor((ProgramClass)clazz).addNameAndTypeConstant(referencedMember.getName(referencedClass), 3169f606f95f03a75961498803e24bee6799a7c0885Ying Wang referencedMember.getDescriptor(referencedClass)); 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute) 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Recompute the maximum stack size if necessary. 325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (stackSizesMayHaveChanged) 326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato stackSizeUpdater.visitCodeAttribute(clazz, method, codeAttribute); 328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the nested attributes. 331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato codeAttribute.attributesAccept(clazz, method, this); 332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute) 336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the annotations. 338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationsAttribute.annotationsAccept(clazz, this); 339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute) 343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the annotations. 345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameterAnnotationsAttribute.annotationsAccept(clazz, method, this); 346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute) 350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the annotation. 352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationDefaultAttribute.defaultValueAccept(clazz, this); 353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for AnnotationVisitor. 357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotation(Clazz clazz, Annotation annotation) 359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the element values. 361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotation.elementValuesAccept(clazz, this); 362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ElementValueVisitor. 366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue) 368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fixElementValue(clazz, annotation, constantElementValue); 370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue) 374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fixElementValue(clazz, annotation, enumConstantElementValue); 376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue) 380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fixElementValue(clazz, annotation, classElementValue); 382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue) 386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fixElementValue(clazz, annotation, annotationElementValue); 388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the annotation. 390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato annotationElementValue.annotationAccept(clazz, this); 391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue) 395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato fixElementValue(clazz, annotation, arrayElementValue); 397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Fix the element values. 399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato arrayElementValue.elementValuesAccept(clazz, annotation, this); 400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Fixes the method reference of the element value, if any. 407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void fixElementValue(Clazz clazz, 409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Annotation annotation, 410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ElementValue elementValue) 411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Do we know the referenced method? 413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember = elementValue.referencedMethod; 414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (referencedMember != null) 415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Does it have a new name or type? 417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String methodName = elementValue.getMethodName(clazz); 418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato String newMethodName = referencedMember.getName(elementValue.referencedClass); 419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (!methodName.equals(newMethodName)) 421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Update the element name index. 423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato elementValue.u2elementNameIndex = 424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato new ConstantPoolEditor((ProgramClass)clazz).addUtf8Constant(newMethodName); 425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void debug(Clazz clazz, 431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato StringConstant stringConstant, 432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass, 433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember) 434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println("MemberReferenceFixer:"); 4369f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Class file = "+clazz.getName()); 4379f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Ref class = "+referencedClass.getName()); 4389f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Ref member name = "+stringConstant.getString(clazz)); 4399f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" -> "+referencedMember.getName(referencedClass)); 440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void debug(Clazz clazz, 444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato RefConstant refConstant, 445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Clazz referencedClass, 446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Member referencedMember) 447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato System.out.println("MemberReferenceFixer:"); 4499f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Class file = "+clazz.getName()); 4509f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Ref class = "+referencedClass.getName()); 4519f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Ref member name = "+refConstant.getName(clazz)); 4529f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" -> "+referencedMember.getName(referencedClass)); 4539f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" Ref descriptor = "+refConstant.getType(clazz)); 4549f606f95f03a75961498803e24bee6799a7c0885Ying Wang System.out.println(" -> "+referencedMember.getDescriptor(referencedClass)); 455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 457