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