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