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.obfuscate;
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.preverification.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor marks all UTF-8 constant pool entries that are
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * being used in the program classes it visits.
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see Utf8Shrinker
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class Utf8UsageMarker
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AttributeVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             InnerClassesInfoVisitor,
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableInfoVisitor,
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableTypeInfoVisitor,
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AnnotationVisitor,
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ElementValueVisitor
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // A visitor info flag to indicate the UTF-8 constant pool entry is being used.
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final Object USED = new Object();
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the other constant pool entries.
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.constantPoolEntriesAccept(this);
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the fields and methods.
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMember(ProgramClass programClass, ProgramMember programMember)
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the name and descriptor UTF-8 entries.
79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(programClass, programMember.u2nameIndex);
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(programClass, programMember.u2descriptorIndex);
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMember.attributesAccept(programClass, this);
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant) {}
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stringConstant.u2stringIndex);
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, classConstant.u2nameIndex);
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant)
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex);
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex);
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // This is the best we can do for unknown attributes.
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex);
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex);
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex);
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex);
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex);
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex);
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the inner classes.
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        innerClassesAttribute.innerClassEntriesAccept(clazz, this);
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex);
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // These entries have already been marked in the constant pool.
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex);
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex);
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex);
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex);
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex);
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex);
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex);
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex);
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex);
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.attributesAccept(clazz, method, this);
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex);
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex);
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex);
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex);
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the local variables.
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex);
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the local variable types.
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex);
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotations.
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationsAttribute.annotationsAccept(clazz, this);
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotations.
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex);
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the element value.
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationDefaultAttribute.defaultValueAccept(clazz, this);
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InnerClassesInfoVisitor.
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (innerClassesInfo.u2innerNameIndex != 0)
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex);
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableInfoVisitor.
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex);
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex);
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableTypeInfoVisitor.
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex);
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex);
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AnnotationVisitor.
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotation(Clazz clazz, Annotation annotation)
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotation.u2typeIndex);
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the element values.
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.elementValuesAccept(clazz, this);
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ElementValueVisitor.
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (constantElementValue.u2elementNameIndex != 0)
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex);
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Only the string constant element value refers to a UTF-8 entry.
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT)
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex);
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (enumConstantElementValue.u2elementNameIndex != 0)
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex);
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex);
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex);
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (classElementValue.u2elementNameIndex != 0)
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex);
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex);
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (annotationElementValue.u2elementNameIndex != 0)
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex);
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotation.
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationElementValue.annotationAccept(clazz, this);
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (arrayElementValue.u2elementNameIndex != 0)
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex);
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the element values.
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        arrayElementValue.elementValuesAccept(clazz, annotation, this);
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given UTF-8 constant pool entry of the given class.
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void markCpUtf8Entry(Clazz clazz, int index)
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato         markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index));
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given VisitorAccepter as being used.
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * In this context, the VisitorAccepter will be a Utf8Constant object.
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static void markAsUsed(VisitorAccepter visitorAccepter)
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitorAccepter.setVisitorInfo(USED);
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given VisitorAccepter has been marked as being used.
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * In this context, the VisitorAccepter will be a Utf8Constant object.
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    static boolean isUsed(VisitorAccepter visitorAccepter)
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() == USED;
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
393