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 */ 219f606f95f03a75961498803e24bee6799a7c0885Ying Wangpackage proguard.obfuscate; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.attribute.visitor.AttributeVisitor; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*; 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor; 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor; 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.visitor.ClassVisitor; 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 329f606f95f03a75961498803e24bee6799a7c0885Ying Wang * This ClassVisitor marks all NameAndType constant pool entries that are 339f606f95f03a75961498803e24bee6799a7c0885Ying Wang * being used in the program classes it visits. 349f606f95f03a75961498803e24bee6799a7c0885Ying Wang * 359f606f95f03a75961498803e24bee6799a7c0885Ying Wang * @see NameAndTypeShrinker 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 399f606f95f03a75961498803e24bee6799a7c0885Ying Wangpublic class NameAndTypeUsageMarker 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends SimplifiedVisitor 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimplements ClassVisitor, 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ConstantVisitor, 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato AttributeVisitor 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // A visitor info flag to indicate the NameAndType constant pool entry is being used. 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static final Object USED = new Object(); 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ClassVisitor. 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitProgramClass(ProgramClass programClass) 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the NameAndType entries referenced by all other constant pool 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // entries. 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.constantPoolEntriesAccept(this); 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Mark the NameAndType entries referenced by all EnclosingMethod 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // attributes. 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato programClass.attributesAccept(this); 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 63cfead78069f3dc32998dc118ee08cab3867acea2Ying Wang // Implementations for ConstantVisitor. 64cfead78069f3dc32998dc118ee08cab3867acea2Ying Wang 65cfead78069f3dc32998dc118ee08cab3867acea2Ying Wang public void visitAnyConstant(Clazz clazz, Constant constant) {} 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 689f606f95f03a75961498803e24bee6799a7c0885Ying Wang public void visitFieldrefConstant(Clazz clazz, FieldrefConstant fieldrefConstant) 699f606f95f03a75961498803e24bee6799a7c0885Ying Wang { 709f606f95f03a75961498803e24bee6799a7c0885Ying Wang visitRefConstant(clazz, fieldrefConstant); 719f606f95f03a75961498803e24bee6799a7c0885Ying Wang } 729f606f95f03a75961498803e24bee6799a7c0885Ying Wang 739f606f95f03a75961498803e24bee6799a7c0885Ying Wang 749f606f95f03a75961498803e24bee6799a7c0885Ying Wang public void visitInterfaceMethodrefConstant(Clazz clazz, InterfaceMethodrefConstant interfaceMethodrefConstant) 759f606f95f03a75961498803e24bee6799a7c0885Ying Wang { 769f606f95f03a75961498803e24bee6799a7c0885Ying Wang visitRefConstant(clazz, interfaceMethodrefConstant); 779f606f95f03a75961498803e24bee6799a7c0885Ying Wang } 789f606f95f03a75961498803e24bee6799a7c0885Ying Wang 799f606f95f03a75961498803e24bee6799a7c0885Ying Wang 809f606f95f03a75961498803e24bee6799a7c0885Ying Wang public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant) 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 829f606f95f03a75961498803e24bee6799a7c0885Ying Wang visitRefConstant(clazz, methodrefConstant); 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 869f606f95f03a75961498803e24bee6799a7c0885Ying Wang private void visitRefConstant(Clazz clazz, RefConstant refConstant) 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markNameAndTypeConstant(clazz, refConstant.u2nameAndTypeIndex); 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for AttributeVisitor. 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyAttribute(Clazz clazz, Attribute attribute) {} 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute) 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (enclosingMethodAttribute.u2nameAndTypeIndex != 0) 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markNameAndTypeConstant(clazz, enclosingMethodAttribute.u2nameAndTypeIndex); 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Marks the given UTF-8 constant pool entry of the given class. 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private void markNameAndTypeConstant(Clazz clazz, int index) 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato markAsUsed((NameAndTypeConstant)((ProgramClass)clazz).getConstant(index)); 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Marks the given VisitorAccepter as being used. 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * In this context, the VisitorAccepter will be a NameAndTypeConstant object. 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1219f606f95f03a75961498803e24bee6799a7c0885Ying Wang private static void markAsUsed(VisitorAccepter visitorAccepter) 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato visitorAccepter.setVisitorInfo(USED); 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Returns whether the given VisitorAccepter has been marked as being used. 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * In this context, the VisitorAccepter will be a NameAndTypeConstant object. 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 1319f606f95f03a75961498803e24bee6799a7c0885Ying Wang static boolean isUsed(VisitorAccepter visitorAccepter) 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return visitorAccepter.getVisitorInfo() == USED; 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 136