1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 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.optimize.info; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.visitor.ConstantVisitor; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.constant.*; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.SimplifiedVisitor; 27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.visitor.*; 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This ConstantVisitor marks all classes that refer to package visible classes 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * or class members. 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class PackageVisibleMemberInvokingClassMarker 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoextends SimplifiedVisitor 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimplements ConstantVisitor, 38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang ClassVisitor, 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang MemberVisitor 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang private Clazz referencingClass; 42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Implementations for ConstantVisitor. 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyConstant(Clazz clazz, Constant constant) {} 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void visitStringConstant(Clazz clazz, StringConstant stringConstant) 50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Check the referenced class and class member, if any. 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (stringConstant.referencedClass != clazz) 53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang referencingClass = clazz; 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang stringConstant.referencedClassAccept(this); 57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang stringConstant.referencedMemberAccept(this); 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void visitAnyRefConstant(Clazz clazz, RefConstant refConstant) 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Check the referenced class and class member. 65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (refConstant.referencedClass != clazz) 66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang referencingClass = clazz; 68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang refConstant.referencedClassAccept(this); 70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang refConstant.referencedMemberAccept(this); 71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Check the referenced class. 78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if (classConstant.referencedClass != clazz) 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang referencingClass = clazz; 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang classConstant.referencedClassAccept(this); 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Implementations for ClassVisitor. 88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void visitAnyClass(Clazz clazz) 90b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 91b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((clazz.getAccessFlags() & 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassConstants.INTERNAL_ACC_PUBLIC) == 0) 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 94b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang setInvokesPackageVisibleMembers(referencingClass); 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 98b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 99b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Implementations for MemberVisitor. 100b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void visitAnyMember(Clazz clazz, Member member) 102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang if ((member.getAccessFlags() & 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (ClassConstants.INTERNAL_ACC_PUBLIC | 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassConstants.INTERNAL_ACC_PRIVATE)) == 0) 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 107b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang setInvokesPackageVisibleMembers(referencingClass); 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Small utility methods. 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private static void setInvokesPackageVisibleMembers(Clazz clazz) 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassOptimizationInfo info = ClassOptimizationInfo.getClassOptimizationInfo(clazz); 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (info != null) 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato info.setInvokesPackageVisibleMembers(); 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static boolean invokesPackageVisibleMembers(Clazz clazz) 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassOptimizationInfo info = ClassOptimizationInfo.getClassOptimizationInfo(clazz); 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return info == null || info.invokesPackageVisibleMembers(); 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}