1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage 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.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
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport java.util.Arrays;
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This ClassVisitor removes UTF-8 constant pool entries that are not used.
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class Utf8Shrinker
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends      SimplifiedVisitor
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements   ClassVisitor,
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             MemberVisitor,
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ConstantVisitor,
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AttributeVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             InnerClassesInfoVisitor,
492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom             ParameterInfoVisitor,
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableInfoVisitor,
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             LocalVariableTypeInfoVisitor,
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             AnnotationVisitor,
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             ElementValueVisitor
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // A visitor info flag to indicate the UTF-8 constant pool entry is being used.
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final Object USED = new Object();
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private       int[]                constantIndexMap     = new int[ClassConstants.TYPICAL_CONSTANT_POOL_SIZE];
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private final ConstantPoolRemapper constantPoolRemapper = new ConstantPoolRemapper();
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the other constant pool entries.
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.constantPoolEntriesAccept(this);
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the fields and methods.
70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(this);
71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(this);
72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Shift the used constant pool entries together, filling out the
77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // index map.
78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        int newConstantPoolCount =
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            shrinkConstantPool(programClass.constantPool,
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                               programClass.u2constantPoolCount);
81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Remap the references to the constant pool if it has shrunk.
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (newConstantPoolCount < programClass.u2constantPoolCount)
84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            programClass.u2constantPoolCount = newConstantPoolCount;
86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // Remap all constant pool references.
88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            constantPoolRemapper.setConstantIndexMap(constantIndexMap);
89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            constantPoolRemapper.visitProgramClass(programClass);
90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMember(ProgramClass programClass, ProgramMember programMember)
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the name and descriptor UTF-8 entries.
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(programClass, programMember.u2nameIndex);
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(programClass, programMember.u2descriptorIndex);
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMember.attributesAccept(programClass, this);
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyConstant(Clazz clazz, Constant constant) {}
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stringConstant.u2stringIndex);
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, classConstant.u2nameIndex);
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant)
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, nameAndTypeConstant.u2nameIndex);
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, nameAndTypeConstant.u2descriptorIndex);
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // This is the best we can do for unknown attributes.
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, unknownAttribute.u2attributeNameIndex);
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceFileAttribute.u2attributeNameIndex);
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceFileAttribute.u2sourceFileIndex);
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceDirAttribute.u2attributeNameIndex);
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, sourceDirAttribute.u2sourceDirIndex);
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, innerClassesAttribute.u2attributeNameIndex);
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the inner classes.
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        innerClassesAttribute.innerClassEntriesAccept(clazz, this);
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enclosingMethodAttribute.u2attributeNameIndex);
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // These entries have already been marked in the constant pool.
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2classIndex);
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //clazz.constantPoolEntryAccept(this, enclosingMethodAttribute.u2nameAndTypeIndex);
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, deprecatedAttribute.u2attributeNameIndex);
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, syntheticAttribute.u2attributeNameIndex);
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, signatureAttribute.u2attributeNameIndex);
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, signatureAttribute.u2signatureIndex);
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, constantValueAttribute.u2attributeNameIndex);
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
2012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute)
2022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
2032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        markCpUtf8Entry(clazz, methodParametersAttribute.u2attributeNameIndex);
2042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
2052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        // Mark the UTF-8 entries referenced by the parameter information.
2062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        methodParametersAttribute.parametersAccept(clazz, method, this);
2072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
2082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
2092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, exceptionsAttribute.u2attributeNameIndex);
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, codeAttribute.u2attributeNameIndex);
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the attributes.
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.attributesAccept(clazz, method, this);
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stackMapAttribute.u2attributeNameIndex);
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, stackMapTableAttribute.u2attributeNameIndex);
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, lineNumberTableAttribute.u2attributeNameIndex);
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTableAttribute.u2attributeNameIndex);
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the local variables.
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeTableAttribute.u2attributeNameIndex);
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the local variable types.
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotationsAttribute.u2attributeNameIndex);
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotations.
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationsAttribute.annotationsAccept(clazz, this);
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotations.
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotationDefaultAttribute.u2attributeNameIndex);
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the element value.
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationDefaultAttribute.defaultValueAccept(clazz, this);
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InnerClassesInfoVisitor.
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (innerClassesInfo.u2innerNameIndex != 0)
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, innerClassesInfo.u2innerNameIndex);
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
2992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    // Implementations for ParameterInfoVisitor.
3002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
3012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void visitParameterInfo(Clazz clazz, Method method, int parameterIndex, ParameterInfo parameterInfo)
3022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
3032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (parameterInfo.u2nameIndex != 0)
3042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
3052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            markCpUtf8Entry(clazz, parameterInfo.u2nameIndex);
3062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
3072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
3082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
3092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableInfoVisitor.
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableInfo.u2nameIndex);
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableInfo.u2descriptorIndex);
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableTypeInfoVisitor.
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeInfo.u2nameIndex);
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, localVariableTypeInfo.u2signatureIndex);
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AnnotationVisitor.
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotation(Clazz clazz, Annotation annotation)
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, annotation.u2typeIndex);
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the element values.
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotation.elementValuesAccept(clazz, this);
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ElementValueVisitor.
340b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (constantElementValue.u2elementNameIndex != 0)
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, constantElementValue.u2elementNameIndex);
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Only the string constant element value refers to a UTF-8 entry.
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (constantElementValue.u1tag == ClassConstants.ELEMENT_VALUE_STRING_CONSTANT)
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, constantElementValue.u2constantValueIndex);
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (enumConstantElementValue.u2elementNameIndex != 0)
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, enumConstantElementValue.u2elementNameIndex);
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enumConstantElementValue.u2typeNameIndex);
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, enumConstantElementValue.u2constantNameIndex);
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (classElementValue.u2elementNameIndex != 0)
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, classElementValue.u2elementNameIndex);
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markCpUtf8Entry(clazz, classElementValue.u2classInfoIndex);
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (annotationElementValue.u2elementNameIndex != 0)
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, annotationElementValue.u2elementNameIndex);
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by the annotation.
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        annotationElementValue.annotationAccept(clazz, this);
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (arrayElementValue.u2elementNameIndex != 0)
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markCpUtf8Entry(clazz, arrayElementValue.u2elementNameIndex);
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
398b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the UTF-8 entries referenced by 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     * Marks the given UTF-8 constant pool entry of the given class.
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void markCpUtf8Entry(Clazz clazz, int index)
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato         markAsUsed((Utf8Constant)((ProgramClass)clazz).getConstant(index));
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given VisitorAccepter as being used.
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * In this context, the VisitorAccepter will be a Utf8Constant object.
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
418b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private void markAsUsed(VisitorAccepter visitorAccepter)
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitorAccepter.setVisitorInfo(USED);
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given VisitorAccepter has been marked as being used.
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * In this context, the VisitorAccepter will be a Utf8Constant object.
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
428b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private boolean isUsed(VisitorAccepter visitorAccepter)
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() == USED;
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
432b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
433b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
434b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /**
435b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Removes all UTF-8 entries that are not marked as being used
436b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * from the given constant pool.
437b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * @return the new number of entries.
438b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
439b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private int shrinkConstantPool(Constant[] constantPool, int length)
440b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    {
441b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Create a new index map, if necessary.
442b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (constantIndexMap.length < length)
443b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
444b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            constantIndexMap = new int[length];
445b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
446b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
447b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        int     counter = 1;
448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        boolean isUsed  = false;
449b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
450b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Shift the used constant pool entries together.
451b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        for (int index = 1; index < length; index++)
452b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        {
453b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            Constant constant = constantPool[index];
454b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
4552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // Is the constant being used? Don't update the flag if this is the
4562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            // second half of a long entry.
457b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (constant != null)
458b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
459b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                isUsed = constant.getTag() != ClassConstants.CONSTANT_Utf8 ||
460b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                         isUsed(constant);
461b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
462b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
463b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (isUsed)
464b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            {
4652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                // Remember the new index.
4662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                constantIndexMap[index] = counter;
4672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
4682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                // Shift the constant pool entry.
469b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                constantPool[counter++] = constant;
470b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
4712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            else
4722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
4732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                // Remember an invalid index.
4742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                constantIndexMap[index] = -1;
4752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
476b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
477b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
478b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Clear the remaining constant pool elements.
479b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Arrays.fill(constantPool, counter, length, null);
480b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
481b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return counter;
482b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
484