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