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