1b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato/* 2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * of Java bytecode. 4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 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; 412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private boolean invokesDynamically = false; 42b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesPrivateCode = false; 43b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesPackageCode = false; 44b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private boolean accessesProtectedCode = false; 45b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int invocationCount = 0; 46b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private int parameterSize = 0; 47b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private long usedParameters = 0L; 48b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private Value[] parameters; 49b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato private Value returnValue; 50b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 51b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 52b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato /** 53b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Creates a new MethodOptimizationInfo for the given method. 54b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato */ 55b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public MethodOptimizationInfo(Clazz clazz, Method method) 56b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 57b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // Set up an array of the right size for storing information about the 58b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato // passed parameters. 59b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato int parameterCount = 60b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato ClassUtil.internalMethodParameterCount(method.getDescriptor(clazz)); 61b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if ((method.getAccessFlags() & ClassConstants.ACC_STATIC) == 0) 63b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 64b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameterCount++; 65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (parameterCount > 0) 68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters = new Value[parameterCount]; 70b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 71b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 72b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 73b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 74b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setNoSideEffects() 75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 76b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato hasNoSideEffects = true; 77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 79b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 80b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean hasNoSideEffects() 81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 82b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return hasNoSideEffects; 83b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 85b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setSideEffects() 87b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato hasSideEffects = true; 89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 92b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean hasSideEffects() 93b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return hasSideEffects; 95b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 96b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setCanNotBeMadePrivate() 99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato canBeMadePrivate = false; 101b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 102b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 103b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean canBeMadePrivate() 105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return canBeMadePrivate; 107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setCatchesExceptions() 111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato catchesExceptions = true; 113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean catchesExceptions() 117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return catchesExceptions; 119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setBranchesBackward() 123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato branchesBackward = true; 125b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 126b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 127b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean branchesBackward() 129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return branchesBackward; 131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setInvokesSuperMethods() 135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato invokesSuperMethods = true; 137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean invokesSuperMethods() 141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return invokesSuperMethods; 143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void setInvokesDynamically() 1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom invokesDynamically = true; 1492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public boolean invokesDynamically() 1532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return invokesDynamically; 1552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 158b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesPrivateCode() 159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesPrivateCode = true; 161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesPrivateCode() 165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesPrivateCode; 167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesPackageCode() 171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesPackageCode = true; 173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesPackageCode() 177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesPackageCode; 179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setAccessesProtectedCode() 183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato accessesProtectedCode = true; 185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean accessesProtectedCode() 189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return accessesProtectedCode; 191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 193b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 194b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void incrementInvocationCount() 195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato invocationCount++; 197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getInvocationCount() 201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return invocationCount; 203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setParameterSize(int parameterSize) 207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.parameterSize = parameterSize; 209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public int getParameterSize() 213b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 214b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return parameterSize; 215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setParameterUsed(int parameterIndex) 219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 220b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang usedParameters |= 1L << parameterIndex; 221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void setUsedParameters(long usedParameters) 225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.usedParameters = usedParameters; 227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public boolean isParameterUsed(int parameterIndex) 231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 232b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return parameterIndex >= 64 || (usedParameters & (1L << parameterIndex)) != 0; 233b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 234b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 235b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 236b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public long getUsedParameters() 237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 238b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return usedParameters; 239b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 240b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 241b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 242b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void generalizeParameter(int parameterIndex, Value parameter) 243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex] = parameters[parameterIndex] != null ? 245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex].generalize(parameter) : 246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameter; 247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 250b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Value getParameter(int parameterIndex) 251b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 252b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return parameters != null ? 253b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato parameters[parameterIndex] : 254b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null; 255b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void generalizeReturnValue(Value returnValue) 259b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 260b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.returnValue = this.returnValue != null ? 261b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.returnValue.generalize(returnValue) : 262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato returnValue; 263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 264b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 265b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 266b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public Value getReturnValue() 267b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 268b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return returnValue; 269b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 270b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 271b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 2722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // For setting enum return values. 2732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void setReturnValue(Value returnValue) 2742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 2752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom this.returnValue = returnValue; 2762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 2782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 279b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public void merge(MethodOptimizationInfo other) 280b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 281b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato if (other != null) 282b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 283b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasNoSideEffects &= other.hasNoSideEffects; 284b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasSideEffects |= other.hasSideEffects; 285b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //this.canBeMadePrivate &= other.canBeMadePrivate; 286b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.catchesExceptions |= other.catchesExceptions; 287b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.branchesBackward |= other.branchesBackward; 288b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.invokesSuperMethods |= other.invokesSuperMethods; 2892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom this.invokesDynamically |= other.invokesDynamically; 290b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPrivateCode |= other.accessesPrivateCode; 291b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPackageCode |= other.accessesPackageCode; 292b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesProtectedCode |= other.accessesProtectedCode; 293b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 294b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato else 295b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 296b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasNoSideEffects = false; 297b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.hasSideEffects = true; 298b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato //this.canBeMadePrivate = false; 299b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.catchesExceptions = true; 300b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.branchesBackward = true; 301b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.invokesSuperMethods = true; 302b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPrivateCode = true; 303b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesPackageCode = true; 304b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato this.accessesProtectedCode = true; 305b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 306b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 307b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 308b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 309b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static void setMethodOptimizationInfo(Clazz clazz, Method method) 310b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 311b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato MethodLinker.lastMember(method).setVisitorInfo(new MethodOptimizationInfo(clazz, method)); 312b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 313b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 314b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 315b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato public static MethodOptimizationInfo getMethodOptimizationInfo(Method method) 316b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato { 317b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato Object visitorInfo = MethodLinker.lastMember(method).getVisitorInfo(); 318b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato 319b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato return visitorInfo instanceof MethodOptimizationInfo ? 320b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato (MethodOptimizationInfo)visitorInfo : 321b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato null; 322b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato } 323b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato} 324