1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 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.optimize.peephole;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.editor.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.visitor.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor replaces references to classes and class members if the
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * classes have targets that are intended to replace them.
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see VerticalClassMerger
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see ClassReferenceFixer
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see MemberReferenceFixer
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class TargetClassChanger
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AttributeVisitor,
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableInfoVisitor,
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableTypeInfoVisitor,
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AnnotationVisitor,
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ElementValueVisitor
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz   superClass       = null;
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz[] interfaceClasses = null;
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the constant pool.
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.constantPoolEntriesAccept(this);
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the class members.
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the attributes.
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Is the class itself being retargeted?
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz targetClass = ClassMerger.getTargetClass(programClass);
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (targetClass != null)
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Restore the class name. We have to add a new class entry
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // to avoid an existing entry with the same name being reused. The
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // names have to be fixed later, based on their referenced classes.
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programClass.u2thisClass =
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                addNewClassConstant(programClass,
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    programClass.getName(),
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    programClass);
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // This class will loose all its subclasses.
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            programClass.subClasses = null;
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Remove interface classes that are pointing to this class.
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int newInterfacesCount = 0;
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < programClass.u2interfacesCount; index++)
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz interfaceClass = programClass.getInterface(index);
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (!programClass.equals(interfaceClass))
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                programClass.u2interfaces[newInterfacesCount++] =
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    programClass.u2interfaces[index];
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.u2interfacesCount = newInterfacesCount;
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Update the subclasses of the superclass and interfaces of the
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // target class.
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ConstantVisitor subclassAdder =
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ReferencedClassVisitor(
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new SubclassFilter(programClass,
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new SubclassAdder(programClass)));
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.superClassConstantAccept(subclassAdder);
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.interfaceConstantsAccept(subclassAdder);
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // TODO: Maybe restore private method references.
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the class members.
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.fieldsAccept(this);
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryClass.methodsAccept(this);
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramField(ProgramClass programClass, ProgramField programField)
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced class.
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.referencedClass =
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            updateReferencedClass(programField.referencedClass);
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the attributes.
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.attributesAccept(programClass, this);
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(programMethod.referencedClasses);
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the attributes.
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.attributesAccept(programClass, this);
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField)
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced class.
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        libraryField.referencedClass =
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            updateReferencedClass(libraryField.referencedClass);
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod)
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(libraryMethod.referencedClasses);
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant) {}
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Does the string refer to a class, due to a Class.forName construct?
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz referencedClass    = stringConstant.referencedClass;
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz newReferencedClass = updateReferencedClass(referencedClass);
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass != newReferencedClass)
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced class.
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stringConstant.referencedClass = newReferencedClass;
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced class member, if applicable.
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stringConstant.referencedMember =
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                updateReferencedMember(stringConstant.referencedMember,
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       stringConstant.getString(clazz),
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       null,
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       newReferencedClass);
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz referencedClass    = refConstant.referencedClass;
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz newReferencedClass = updateReferencedClass(referencedClass);
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass != newReferencedClass)
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced class.
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedClass  = newReferencedClass;
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced class member.
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedMember =
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                updateReferencedMember(refConstant.referencedMember,
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       refConstant.getName(clazz),
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       refConstant.getType(clazz),
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                       newReferencedClass);
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced class.
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        classConstant.referencedClass =
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            updateReferencedClass(classConstant.referencedClass);
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAttribute(Clazz clazz, Attribute attribute) {}
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the attributes.
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.attributesAccept(clazz, method, this);
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the local variables.
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the local variables.
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(signatureAttribute.referencedClasses);
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the annotations.
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationsAttribute.annotationsAccept(clazz, this);
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the annotations.
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the annotation.
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationDefaultAttribute.defaultValueAccept(clazz, this);
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato   // Implementations for LocalVariableInfoVisitor.
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced class.
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableInfo.referencedClass =
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            updateReferencedClass(localVariableInfo.referencedClass);
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableTypeInfoVisitor.
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(localVariableTypeInfo.referencedClasses);
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AnnotationVisitor.
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotation(Clazz clazz, Annotation annotation)
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(annotation.referencedClasses);
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the element values.
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.elementValuesAccept(clazz, this);
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ElementValueVisitor.
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyElementValue(Clazz clazz, Annotation annotation, ElementValue elementValue)
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz referencedClass    = elementValue.referencedClass;
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz newReferencedClass = updateReferencedClass(referencedClass);
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass != newReferencedClass)
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced annotation class.
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.referencedClass  = newReferencedClass;
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Change the referenced method.
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            elementValue.referencedMethod =
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                (Method)updateReferencedMember(elementValue.referencedMethod,
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               elementValue.getMethodName(clazz),
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               null,
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                               newReferencedClass);
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced annotation class and method.
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitAnyElementValue(clazz, annotation, constantElementValue);
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced annotation class and method.
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitAnyElementValue(clazz, annotation, enumConstantElementValue);
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(enumConstantElementValue.referencedClasses);
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced annotation class and method.
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitAnyElementValue(clazz, annotation, classElementValue);
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced classes.
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        updateReferencedClasses(classElementValue.referencedClasses);
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced annotation class and method.
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitAnyElementValue(clazz, annotation, annotationElementValue);
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the annotation.
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationElementValue.annotationAccept(clazz, this);
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the referenced annotation class and method.
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitAnyElementValue(clazz, annotation, arrayElementValue);
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Change the references of the element values.
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        arrayElementValue.elementValuesAccept(clazz, annotation, this);
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Updates the retargeted classes in the given array of classes.
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void updateReferencedClasses(Clazz[] referencedClasses)
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClasses == null)
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return;
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        for (int index = 0; index < referencedClasses.length; index++)
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            referencedClasses[index] =
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                updateReferencedClass(referencedClasses[index]);
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the retargeted class of the given class.
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Clazz updateReferencedClass(Clazz referencedClass)
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedClass == null)
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return null;
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Clazz targetClazz = ClassMerger.getTargetClass(referencedClass);
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return targetClazz != null ?
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            targetClazz :
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            referencedClass;
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
399b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
400b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
401b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
402b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns the retargeted class member of the given class member.
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private Member updateReferencedMember(Member referencedMember,
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          String name,
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          String type,
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                          Clazz  newReferencedClass)
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (referencedMember == null)
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return null;
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return referencedMember instanceof Field ?
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (Member)newReferencedClass.findField(name, type) :
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (Member)newReferencedClass.findMethod(name, type);
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Explicitly adds a new class constant for the given class in the given
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * program class.
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private int addNewClassConstant(ProgramClass programClass,
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    String       className,
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                    Clazz        referencedClass)
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ConstantPoolEditor constantPoolEditor =
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            new ConstantPoolEditor(programClass);
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int nameIndex =
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPoolEditor.addUtf8Constant(className);
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int classConstantIndex =
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            constantPoolEditor.addConstant(new ClassConstant(nameIndex,
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                             referencedClass));
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return classConstantIndex;
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}