1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 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.optimize.info; 22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.*; 24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.classfile.util.*; 25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratoimport proguard.evaluation.value.Value; 26b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 27b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/** 28b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * This class stores some optimization information that can be attached to 29b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * a method. 30b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 31b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * @author Eric Lafortune 32b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 33b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratopublic class MethodOptimizationInfo 34b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{ 35b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean hasNoSideEffects = false; 36b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean hasSideEffects = false; 37b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean canBeMadePrivate = true; 38b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean catchesExceptions = false; 39b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean branchesBackward = false; 40b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean invokesSuperMethods = false; 41b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesPrivateCode = false; 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesPackageCode = false; 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesProtectedCode = false; 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int invocationCount = 0; 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int parameterSize = 0; 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private long usedParameters = 0L; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private Value[] parameters; 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private Value returnValue; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new MethodOptimizationInfo for the given method. 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public MethodOptimizationInfo(Clazz clazz, Method method) 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up an array of the right size for storing information about the 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // passed parameters. 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int parameterCount = 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.internalMethodParameterCount(method.getDescriptor(clazz)); 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if ((method.getAccessFlags() & ClassConstants.INTERNAL_ACC_STATIC) == 0) 62b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameterCount++; 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (parameterCount > 0) 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters = new Value[parameterCount]; 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setNoSideEffects() 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato hasNoSideEffects = true; 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean hasNoSideEffects() 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return hasNoSideEffects; 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setSideEffects() 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato hasSideEffects = true; 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean hasSideEffects() 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return hasSideEffects; 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setCanNotBeMadePrivate() 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato canBeMadePrivate = false; 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean canBeMadePrivate() 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return canBeMadePrivate; 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setCatchesExceptions() 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catchesExceptions = true; 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean catchesExceptions() 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return catchesExceptions; 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setBranchesBackward() 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato branchesBackward = true; 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean branchesBackward() 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return branchesBackward; 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setInvokesSuperMethods() 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato invokesSuperMethods = true; 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean invokesSuperMethods() 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return invokesSuperMethods; 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesPrivateCode() 146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesPrivateCode = true; 148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 150b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 151b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesPrivateCode() 152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesPrivateCode; 154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 157b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesPackageCode() 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesPackageCode = true; 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesPackageCode() 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesPackageCode; 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesProtectedCode() 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesProtectedCode = true; 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesProtectedCode() 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesProtectedCode; 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void incrementInvocationCount() 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato invocationCount++; 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getInvocationCount() 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return invocationCount; 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setParameterSize(int parameterSize) 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.parameterSize = parameterSize; 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getParameterSize() 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return parameterSize; 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setParameterUsed(int parameterIndex) 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato usedParameters |= 1 << parameterIndex; 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setUsedParameters(long usedParameters) 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.usedParameters = usedParameters; 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isParameterUsed(int parameterIndex) 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return parameterIndex >= 64 || (usedParameters & (1 << parameterIndex)) != 0; 220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public long getUsedParameters() 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return usedParameters; 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void generalizeParameter(int parameterIndex, Value parameter) 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex] = parameters[parameterIndex] != null ? 232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex].generalize(parameter) : 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameter; 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Value getParameter(int parameterIndex) 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return parameters != null ? 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex] : 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null; 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void generalizeReturnValue(Value returnValue) 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.returnValue = this.returnValue != null ? 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.returnValue.generalize(returnValue) : 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato returnValue; 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Value getReturnValue() 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return returnValue; 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void merge(MethodOptimizationInfo other) 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (other != null) 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasNoSideEffects &= other.hasNoSideEffects; 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasSideEffects |= other.hasSideEffects; 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //this.canBeMadePrivate &= other.canBeMadePrivate; 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.catchesExceptions |= other.catchesExceptions; 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.branchesBackward |= other.branchesBackward; 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.invokesSuperMethods |= other.invokesSuperMethods; 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPrivateCode |= other.accessesPrivateCode; 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPackageCode |= other.accessesPackageCode; 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesProtectedCode |= other.accessesProtectedCode; 272b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 273b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 274b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 275b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasNoSideEffects = false; 276b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasSideEffects = true; 277b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //this.canBeMadePrivate = false; 278b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.catchesExceptions = true; 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.branchesBackward = true; 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.invokesSuperMethods = true; 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPrivateCode = true; 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPackageCode = true; 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesProtectedCode = true; 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void setMethodOptimizationInfo(Clazz clazz, Method method) 289b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MethodLinker.lastMember(method).setVisitorInfo(new MethodOptimizationInfo(clazz, method)); 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static MethodOptimizationInfo getMethodOptimizationInfo(Method method) 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Object visitorInfo = MethodLinker.lastMember(method).getVisitorInfo(); 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return visitorInfo instanceof MethodOptimizationInfo ? 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (MethodOptimizationInfo)visitorInfo : 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null; 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 303