1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *             of Java bytecode.
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
59f606f95f03a75961498803e24bee6799a7c0885Ying Wang * Copyright (c) 2002-2009 Eric Lafortune (eric@graphics.cornell.edu)
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is free software; you can redistribute it and/or modify it
8b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * under the terms of the GNU General Public License as published by the Free
9b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Software Foundation; either version 2 of the License, or (at your option)
10b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * any later version.
11b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
12b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This program is distributed in the hope that it will be useful, but WITHOUT
13b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * more details.
16b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
17b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You should have received a copy of the GNU General Public License along
18b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * with this program; if not, write to the Free Software Foundation, Inc.,
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopackage proguard.shrink;
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*;
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*;
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.annotation.*;
26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.preverification.*;
27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.preverification.visitor.*;
28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.*;
29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*;
309f606f95f03a75961498803e24bee6799a7c0885Ying Wangimport proguard.classfile.constant.visitor.ConstantVisitor;
31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.*;
32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.instruction.visitor.InstructionVisitor;
339f606f95f03a75961498803e24bee6799a7c0885Ying Wangimport proguard.classfile.util.SimplifiedVisitor;
34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.*;
35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/**
38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This ClassVisitor and MemberVisitor recursively marks all classes and class
39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * elements that are being used.
40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @see ClassShrinker
42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune
44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */
45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoclass      UsageMarker
46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends    SimplifiedVisitor
47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements ClassVisitor,
48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           MemberVisitor,
49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           ConstantVisitor,
50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           AttributeVisitor,
51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           InnerClassesInfoVisitor,
52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           ExceptionInfoVisitor,
53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           StackMapFrameVisitor,
54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           VerificationTypeVisitor,
55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           LocalVariableInfoVisitor,
56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           LocalVariableTypeInfoVisitor,
57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//         AnnotationVisitor,
58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//         ElementValueVisitor,
59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato           InstructionVisitor
60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // A visitor info flag to indicate the ProgramMember object is being used,
62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // if its Clazz can be determined as being used as well.
63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final Object POSSIBLY_USED = new Object();
64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // A visitor info flag to indicate the visitor accepter is being used.
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private static final Object USED          = new Object();
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
689f606f95f03a75961498803e24bee6799a7c0885Ying Wang    private final MyInterfaceUsageMarker          interfaceUsageMarker          = new MyInterfaceUsageMarker();
699f606f95f03a75961498803e24bee6799a7c0885Ying Wang    private final MyPossiblyUsedMemberUsageMarker possiblyUsedMemberUsageMarker = new MyPossiblyUsedMemberUsageMarker();
709f606f95f03a75961498803e24bee6799a7c0885Ying Wang//    private ClassVisitor       dynamicClassMarker   =
719f606f95f03a75961498803e24bee6799a7c0885Ying Wang//        new MultiClassVisitor(
729f606f95f03a75961498803e24bee6799a7c0885Ying Wang//        new ClassVisitor[]
739f606f95f03a75961498803e24bee6799a7c0885Ying Wang//        {
749f606f95f03a75961498803e24bee6799a7c0885Ying Wang//            this,
759f606f95f03a75961498803e24bee6799a7c0885Ying Wang//            new NamedMethodVisitor(ClassConstants.INTERNAL_METHOD_NAME_INIT,
769f606f95f03a75961498803e24bee6799a7c0885Ying Wang//                                   ClassConstants.INTERNAL_METHOD_TYPE_INIT,
779f606f95f03a75961498803e24bee6799a7c0885Ying Wang//                                   this)
789f606f95f03a75961498803e24bee6799a7c0885Ying Wang//        });
799f606f95f03a75961498803e24bee6799a7c0885Ying Wang
80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ClassVisitor.
82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramClass(ProgramClass programClass)
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(programClass))
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark this class.
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(programClass);
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markProgramClassBody(programClass);
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markProgramClassBody(ProgramClass programClass)
96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark this class's name.
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(programClass, programClass.u2thisClass);
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the superclass.
101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (programClass.u2superClass != 0)
102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(programClass, programClass.u2superClass);
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Give the interfaces preliminary marks.
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.hierarchyAccept(false, false, true, false,
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                     interfaceUsageMarker);
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
1109f606f95f03a75961498803e24bee6799a7c0885Ying Wang        // Explicitly mark the <clinit> method.
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodAccept(ClassConstants.INTERNAL_METHOD_NAME_CLINIT,
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                  ClassConstants.INTERNAL_METHOD_TYPE_CLINIT,
1139f606f95f03a75961498803e24bee6799a7c0885Ying Wang                                  this);
1149f606f95f03a75961498803e24bee6799a7c0885Ying Wang
1159f606f95f03a75961498803e24bee6799a7c0885Ying Wang        // Explicitly mark the parameterless <init> method.
1169f606f95f03a75961498803e24bee6799a7c0885Ying Wang        programClass.methodAccept(ClassConstants.INTERNAL_METHOD_NAME_INIT,
1179f606f95f03a75961498803e24bee6799a7c0885Ying Wang                                  ClassConstants.INTERNAL_METHOD_TYPE_INIT,
1189f606f95f03a75961498803e24bee6799a7c0885Ying Wang                                  this);
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Process all class members that have already been marked as possibly used.
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.fieldsAccept(possiblyUsedMemberUsageMarker);
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.methodsAccept(possiblyUsedMemberUsageMarker);
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the attributes.
125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programClass.attributesAccept(this);
126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryClass(LibraryClass libraryClass)
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(libraryClass))
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(libraryClass);
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // We're not going to analyze all library code. We're assuming that
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // if this class is being used, all of its methods will be used as
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // well. We'll mark them as such (here and in all subclasses).
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the superclass.
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz superClass = libraryClass.superClass;
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (superClass != null)
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                superClass.accept(this);
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the interfaces.
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Clazz[] interfaceClasses = libraryClass.interfaceClasses;
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (interfaceClasses != null)
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                for (int index = 0; index < interfaceClasses.length; index++)
151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                {
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    if (interfaceClasses[index] != null)
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    {
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        interfaceClasses[index].accept(this);
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark all methods.
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            libraryClass.methodsAccept(this);
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * This ClassVisitor marks ProgramClass objects as possibly used,
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * and it visits LibraryClass objects with its outer UsageMarker.
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class MyInterfaceUsageMarker
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    ClassVisitor
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitProgramClass(ProgramClass programClass)
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (shouldBeMarkedAsPossiblyUsed(programClass))
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // We can't process the interface yet, because it might not
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // be required. Give it a preliminary mark.
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsPossiblyUsed(programClass);
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitLibraryClass(LibraryClass libraryClass)
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Make sure all library interface methods are marked.
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            UsageMarker.this.visitLibraryClass(libraryClass);
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private class MyPossiblyUsedMemberUsageMarker
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    extends       SimplifiedVisitor
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    implements    MemberVisitor
193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Implementations for MemberVisitor.
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitProgramField(ProgramClass programClass, ProgramField programField)
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Has the method already been referenced?
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (isPossiblyUsed(programField))
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsUsed(programField);
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the name and descriptor.
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(programClass, programField.u2nameIndex);
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markConstant(programClass, programField.u2descriptorIndex);
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the attributes.
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                programField.attributesAccept(programClass, UsageMarker.this);
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the classes referenced in the descriptor string.
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                programField.referencedClassesAccept(UsageMarker.this);
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Has the method already been referenced?
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (isPossiblyUsed(programMethod))
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsUsed(programMethod);
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the method body.
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markProgramMethodBody(programClass, programMethod);
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Note that, if the method has been marked as possibly used,
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // the method hierarchy has already been marked (cfr. below).
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for MemberVisitor.
234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramField(ProgramClass programClass, ProgramField programField)
236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(programField))
238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Is the field's class used?
240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (isUsed(programClass))
241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsUsed(programField);
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the field body.
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markProgramFieldBody(programClass, programField);
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Hasn't the field been marked as possibly being used yet?
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else if (shouldBeMarkedAsPossiblyUsed(programField))
250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // We can't process the field yet, because the class isn't
252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // marked as being used (yet). Give it a preliminary mark.
253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsPossiblyUsed(programField);
254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(programMethod))
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Is the method's class used?
264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (isUsed(programClass))
265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsUsed(programMethod);
267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the method body.
269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markProgramMethodBody(programClass, programMethod);
270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the method hierarchy.
272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markMethodHierarchy(programClass, programMethod);
273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Hasn't the method been marked as possibly being used yet?
276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            else if (shouldBeMarkedAsPossiblyUsed(programMethod))
277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            {
278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // We can't process the method yet, because the class isn't
279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // marked as being used (yet). Give it a preliminary mark.
280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markAsPossiblyUsed(programMethod);
281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // Mark the method hierarchy.
283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                markMethodHierarchy(programClass, programMethod);
284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryField(LibraryClass programClass, LibraryField programField) {}
290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod)
293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(libraryMethod))
295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(libraryMethod);
297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the method hierarchy.
299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markMethodHierarchy(libraryClass, libraryMethod);
300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markProgramFieldBody(ProgramClass programClass, ProgramField programField)
305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the name and descriptor.
307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(programClass, programField.u2nameIndex);
308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(programClass, programField.u2descriptorIndex);
309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the attributes.
311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.attributesAccept(programClass, this);
312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the classes referenced in the descriptor string.
314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programField.referencedClassesAccept(this);
315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markProgramMethodBody(ProgramClass programClass, ProgramMethod programMethod)
319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the name and descriptor.
321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(programClass, programMethod.u2nameIndex);
322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(programClass, programMethod.u2descriptorIndex);
323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
324b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the attributes.
325b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.attributesAccept(programClass, this);
326b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
327b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the classes referenced in the descriptor string.
328b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        programMethod.referencedClassesAccept(this);
329b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
330b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
331b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
332b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
333b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the hierarchy of implementing or overriding methods corresponding
334b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * to the given method, if any.
335b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
336b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markMethodHierarchy(Clazz clazz, Method method)
337b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
338b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if ((method.getAccessFlags() &
339b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             (ClassConstants.INTERNAL_ACC_PRIVATE |
3409f606f95f03a75961498803e24bee6799a7c0885Ying Wang              ClassConstants.INTERNAL_ACC_STATIC)) == 0)
341b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
342b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            clazz.accept(new ConcreteClassDownTraveler(
343b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                         new ClassHierarchyTraveler(true, true, false, true,
344b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                         new NamedMethodVisitor(method.getName(clazz),
345b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                                method.getDescriptor(clazz),
346b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                         new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE | ClassConstants.INTERNAL_ACC_STATIC | ClassConstants.INTERNAL_ACC_ABSTRACT,
347b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                         this)))));
348b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
349b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
350b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
351b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
352b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ConstantVisitor.
353b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
354b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitIntegerConstant(Clazz clazz, IntegerConstant integerConstant)
355b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
356b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(integerConstant))
357b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
358b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(integerConstant);
359b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
360b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
361b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
362b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
363b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLongConstant(Clazz clazz, LongConstant longConstant)
364b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
365b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(longConstant))
366b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
367b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(longConstant);
368b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
369b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
370b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
371b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
372b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitFloatConstant(Clazz clazz, FloatConstant floatConstant)
373b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
374b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(floatConstant))
375b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
376b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(floatConstant);
377b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
378b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
379b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
380b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
381b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitDoubleConstant(Clazz clazz, DoubleConstant doubleConstant)
382b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
383b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(doubleConstant))
384b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
385b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(doubleConstant);
386b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
387b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
388b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
389b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
390b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStringConstant(Clazz clazz, StringConstant stringConstant)
391b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
392b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(stringConstant))
393b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
394b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(stringConstant);
395b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
396b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, stringConstant.u2stringIndex);
397b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
3989f606f95f03a75961498803e24bee6799a7c0885Ying Wang            // Mark the referenced class and its parameterless constructor,
3999f606f95f03a75961498803e24bee6799a7c0885Ying Wang            // if the string is being used in a Class.forName construct.
4009f606f95f03a75961498803e24bee6799a7c0885Ying Wang            //stringConstant.referencedClassAccept(dynamicClassMarker);
4019f606f95f03a75961498803e24bee6799a7c0885Ying Wang
4029f606f95f03a75961498803e24bee6799a7c0885Ying Wang            // Mark the referenced class or class member, if any.
403b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stringConstant.referencedClassAccept(this);
404b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            stringConstant.referencedMemberAccept(this);
405b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
406b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
407b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
408b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
409b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitUtf8Constant(Clazz clazz, Utf8Constant utf8Constant)
410b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
411b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(utf8Constant))
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(utf8Constant);
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
415b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
416b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant)
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(refConstant))
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(refConstant);
423b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, refConstant.u2classIndex);
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, refConstant.u2nameAndTypeIndex);
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // When compiled with "-target 1.2" or higher, the class or
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // interface actually containing the referenced class member may
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // be higher up the hierarchy. Make sure it's marked, in case it
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // isn't used elsewhere.
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedClassAccept(this);
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the referenced class member itself.
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            refConstant.referencedMemberAccept(this);
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitClassConstant(Clazz clazz, ClassConstant classConstant)
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(classConstant))
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(classConstant);
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, classConstant.u2nameIndex);
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // Mark the referenced class itself.
448b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            classConstant.referencedClassAccept(this);
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitNameAndTypeConstant(Clazz clazz, NameAndTypeConstant nameAndTypeConstant)
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (shouldBeMarkedAsUsed(nameAndTypeConstant))
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(nameAndTypeConstant);
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, nameAndTypeConstant.u2nameIndex);
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, nameAndTypeConstant.u2descriptorIndex);
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
465b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for AttributeVisitor.
466b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Note that attributes are typically only referenced once, so we don't
467b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // test if they have been marked already.
468b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
469b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
470b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // This is the best we can do for unknown attributes.
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(unknownAttribute);
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, unknownAttribute.u2attributeNameIndex);
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(sourceFileAttribute);
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, sourceFileAttribute.u2attributeNameIndex);
483b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, sourceFileAttribute.u2sourceFileIndex);
484b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
485b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
486b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
487b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(sourceDirAttribute);
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, sourceDirAttribute.u2attributeNameIndex);
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, sourceDirAttribute.u2sourceDirIndex);
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesAttribute(Clazz clazz, InnerClassesAttribute innerClassesAttribute)
497b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
498b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Don't mark the attribute and its name yet. We may mark it later, in
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // InnerUsageMarker.
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //markAsUsed(innerClassesAttribute);
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        //markConstant(clazz, innerClassesAttribute.u2attrNameIndex);
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Do mark the outer class entries.
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        innerClassesAttribute.innerClassEntriesAccept(clazz, this);
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(enclosingMethodAttribute);
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, enclosingMethodAttribute.u2attributeNameIndex);
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, enclosingMethodAttribute.u2classIndex);
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (enclosingMethodAttribute.u2nameAndTypeIndex != 0)
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex);
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(deprecatedAttribute);
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, deprecatedAttribute.u2attributeNameIndex);
528b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
529b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(syntheticAttribute);
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, syntheticAttribute.u2attributeNameIndex);
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(signatureAttribute);
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, signatureAttribute.u2attributeNameIndex);
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, signatureAttribute.u2signatureIndex);
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(constantValueAttribute);
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, constantValueAttribute.u2attributeNameIndex);
553b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, constantValueAttribute.u2constantValueIndex);
554b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(exceptionsAttribute);
560b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
561b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, exceptionsAttribute.u2attributeNameIndex);
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the exceptions.
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        exceptionsAttribute.exceptionEntriesAccept((ProgramClass)clazz, this);
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(codeAttribute);
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, codeAttribute.u2attributeNameIndex);
573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the instructions,
575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // by the exceptions, and by the attributes.
576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.instructionsAccept(clazz, method, this);
577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.exceptionsAccept(clazz, method, this);
578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        codeAttribute.attributesAccept(clazz, method, this);
579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapAttribute stackMapAttribute)
583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(stackMapAttribute);
585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, stackMapAttribute.u2attributeNameIndex);
587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the stack map frames.
589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        stackMapAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this);
590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
593b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitStackMapTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, StackMapTableAttribute stackMapTableAttribute)
594b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(stackMapTableAttribute);
596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, stackMapTableAttribute.u2attributeNameIndex);
598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the stack map frames.
600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        stackMapTableAttribute.stackMapFramesAccept(clazz, method, codeAttribute, this);
601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLineNumberTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LineNumberTableAttribute lineNumberTableAttribute)
605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(lineNumberTableAttribute);
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, lineNumberTableAttribute.u2attributeNameIndex);
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTableAttribute localVariableTableAttribute)
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(localVariableTableAttribute);
615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
616b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableTableAttribute.u2attributeNameIndex);
617b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the local variables.
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeTableAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeTableAttribute localVariableTypeTableAttribute)
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(localVariableTypeTableAttribute);
626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableTypeTableAttribute.u2attributeNameIndex);
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the local variable types.
630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        localVariableTypeTableAttribute.localVariablesAccept(clazz, method, codeAttribute, this);
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyAnnotationsAttribute(Clazz clazz, AnnotationsAttribute annotationsAttribute)
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Don't mark the attribute and its contents yet. We may mark them later,
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // in AnnotationUsageMarker.
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markAsUsed(annotationsAttribute);
639b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
640b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, annotationsAttribute.u2attributeNameIndex);
641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the annotations.
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        annotationsAttribute.annotationsAccept(clazz, this);
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyParameterAnnotationsAttribute(Clazz clazz, Method method, ParameterAnnotationsAttribute parameterAnnotationsAttribute)
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Don't mark the attribute and its contents yet. We may mark them later,
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // in AnnotationUsageMarker.
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markAsUsed(parameterAnnotationsAttribute);
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, parameterAnnotationsAttribute.u2attributeNameIndex);
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the annotations.
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        parameterAnnotationsAttribute.annotationsAccept(clazz, method, this);
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Don't mark the attribute and its contents yet. We may mark them later,
663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // in AnnotationUsageMarker.
664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markAsUsed(annotationDefaultAttribute);
665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, annotationDefaultAttribute.u2attributeNameIndex);
667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the element value.
669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        annotationDefaultAttribute.defaultValueAccept(clazz, this);
670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
672b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
673b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for ExceptionInfoVisitor.
674b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
675b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitExceptionInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, ExceptionInfo exceptionInfo)
676b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
677b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markAsUsed(exceptionInfo);
678b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
679b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (exceptionInfo.u2catchType != 0)
680b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
681b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markConstant(clazz, exceptionInfo.u2catchType);
682b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
683b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
684b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
685b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
686b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InnerClassesInfoVisitor.
687b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
688b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitInnerClassesInfo(Clazz clazz, InnerClassesInfo innerClassesInfo)
689b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
690b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // At this point, we only mark outer classes of this class.
691b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Inner class can be marked later, by InnerUsageMarker.
692b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (innerClassesInfo.u2innerClassIndex != 0 &&
693b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            clazz.getName().equals(clazz.getClassName(innerClassesInfo.u2innerClassIndex)))
694b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
695b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            markAsUsed(innerClassesInfo);
696b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
697b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            innerClassesInfo.innerClassConstantAccept(clazz, this);
698b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            innerClassesInfo.outerClassConstantAccept(clazz, this);
699b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            innerClassesInfo.innerNameConstantAccept(clazz, this);
700b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
701b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
702b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
703b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
704b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for StackMapFrameVisitor.
705b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
706b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyStackMapFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, StackMapFrame stackMapFrame) {}
707b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
708b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
709b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitSameOneFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, SameOneFrame sameOneFrame)
710b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
711b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the verification types.
712b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        sameOneFrame.stackItemAccept(clazz, method, codeAttribute, offset, this);
713b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
714b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
715b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
716b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitMoreZeroFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, MoreZeroFrame moreZeroFrame)
717b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
718b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the verification types.
719b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        moreZeroFrame.additionalVariablesAccept(clazz, method, codeAttribute, offset, this);
720b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
721b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
722b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
723b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitFullFrame(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, FullFrame fullFrame)
724b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
725b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Mark the constant pool entries referenced by the verification types.
726b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        fullFrame.variablesAccept(clazz, method, codeAttribute, offset, this);
727b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        fullFrame.stackAccept(clazz, method, codeAttribute, offset, this);
728b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
729b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
730b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
731b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for VerificationTypeVisitor.
732b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
733b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyVerificationType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, VerificationType verificationType) {}
734b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
735b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
736b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitObjectType(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ObjectType objectType)
737b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
738b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, objectType.u2classIndex);
739b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
740b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
741b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
742b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableInfoVisitor.
743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableInfo localVariableInfo)
745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableInfo.u2nameIndex);
747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableInfo.u2descriptorIndex);
748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for LocalVariableTypeInfoVisitor.
752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitLocalVariableTypeInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, LocalVariableTypeInfo localVariableTypeInfo)
754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableTypeInfo.u2nameIndex);
756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, localVariableTypeInfo.u2signatureIndex);
757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    // Implementations for AnnotationVisitor.
761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitAnnotation(Clazz clazz, Annotation annotation)
763b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
764b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, annotation.u2typeIndex);
765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the element values.
767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        annotation.elementValuesAccept(clazz, this);
768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    // Implementations for ElementValueVisitor.
772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        if (constantElementValue.u2elementNameIndex != 0)
776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        {
777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//            markConstant(clazz, constantElementValue.u2elementNameIndex);
778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        }
779b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
780b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, constantElementValue.u2constantValueIndex);
781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitEnumConstantElementValue(Clazz clazz, Annotation annotation, EnumConstantElementValue enumConstantElementValue)
785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        if (enumConstantElementValue.u2elementNameIndex != 0)
787b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        {
788b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//            markConstant(clazz, enumConstantElementValue.u2elementNameIndex);
789b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        }
790b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
791b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, enumConstantElementValue.u2typeNameIndex);
792b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, enumConstantElementValue.u2constantNameIndex);
793b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
794b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
795b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
796b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitClassElementValue(Clazz clazz, Annotation annotation, ClassElementValue classElementValue)
797b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
798b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        if (classElementValue.u2elementNameIndex != 0)
799b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        {
800b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//            markConstant(clazz, classElementValue.u2elementNameIndex);
801b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        }
802b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
803b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the referenced class constant pool entry.
804b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        markConstant(clazz, classElementValue.u2classInfoIndex);
805b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
806b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
807b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
808b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitAnnotationElementValue(Clazz clazz, Annotation annotation, AnnotationElementValue annotationElementValue)
809b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
810b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        if (annotationElementValue.u2elementNameIndex != 0)
811b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        {
812b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//            markConstant(clazz, annotationElementValue.u2elementNameIndex);
813b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        }
814b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
815b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the annotation.
816b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        annotationElementValue.annotationAccept(clazz, this);
817b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
818b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
819b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
820b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    public void visitArrayElementValue(Clazz clazz, Annotation annotation, ArrayElementValue arrayElementValue)
821b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    {
822b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        if (arrayElementValue.u2elementNameIndex != 0)
823b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        {
824b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//            markConstant(clazz, arrayElementValue.u2elementNameIndex);
825b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        }
826b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//
827b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        // Mark the constant pool entries referenced by the element values.
828b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//        arrayElementValue.elementValuesAccept(clazz, annotation, this);
829b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato//    }
830b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
831b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
832b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Implementations for InstructionVisitor.
833b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
834b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitAnyInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, Instruction instruction) {}
835b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
836b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
837b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public void visitConstantInstruction(Clazz clazz, Method method, CodeAttribute codeAttribute, int offset, ConstantInstruction constantInstruction)
838b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
839b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        markConstant(clazz, constantInstruction.constantIndex);
840b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
841b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
842b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
843b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Small utility methods.
844b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
845b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
846b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given visitor accepter as being used.
847b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
848b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markAsUsed(VisitorAccepter visitorAccepter)
849b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
850b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitorAccepter.setVisitorInfo(USED);
851b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
852b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
853b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
854b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
855b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given visitor accepter should still be marked as
856b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * being used.
857b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
858b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected boolean shouldBeMarkedAsUsed(VisitorAccepter visitorAccepter)
859b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
860b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() != USED;
861b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
862b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
863b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
864b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
865b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given visitor accepter has been marked as being used.
866b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
867b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected boolean isUsed(VisitorAccepter visitorAccepter)
868b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
869b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() == USED;
870b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
871b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
872b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
873b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
874b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given visitor accepter as possibly being used.
875b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
876b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markAsPossiblyUsed(VisitorAccepter visitorAccepter)
877b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
878b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitorAccepter.setVisitorInfo(POSSIBLY_USED);
879b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
880b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
881b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
882b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
883b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given visitor accepter should still be marked as
884b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * possibly being used.
885b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
886b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected boolean shouldBeMarkedAsPossiblyUsed(VisitorAccepter visitorAccepter)
887b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
888b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() != USED &&
889b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato               visitorAccepter.getVisitorInfo() != POSSIBLY_USED;
890b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
891b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
892b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
893b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
894b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Returns whether the given visitor accepter has been marked as possibly
895b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * being used.
896b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
897b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected boolean isPossiblyUsed(VisitorAccepter visitorAccepter)
898b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
899b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return visitorAccepter.getVisitorInfo() == POSSIBLY_USED;
900b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
901b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
902b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
903b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
904b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Clears any usage marks from the given visitor accepter.
905b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
906b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    protected void markAsUnused(VisitorAccepter visitorAccepter)
907b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
908b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        visitorAccepter.setVisitorInfo(null);
909b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
910b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
911b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
912b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    /**
913b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * Marks the given constant pool entry of the given class. This includes
914b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * visiting any referenced objects.
915b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     */
916b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    private void markConstant(Clazz clazz, int index)
917b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    {
9189f606f95f03a75961498803e24bee6799a7c0885Ying Wang         clazz.constantPoolEntryAccept(index, this);
919b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
920b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
921