1 package Analysis.OwnershipAnalysis;
3 import java.util.HashSet;
4 import java.util.Iterator;
7 import IR.FieldDescriptor;
8 import IR.Flat.FlatCall;
9 import IR.Flat.TempDescriptor;
11 public class MethodEffects {
13 private EffectsSet effectsSet;
15 public MethodEffects() {
16 effectsSet = new EffectsSet();
19 public EffectsSet getEffects() {
23 public void analyzeFlatFieldNode(OwnershipGraph og, TempDescriptor srcDesc,
24 FieldDescriptor fieldDesc) {
26 LabelNode ln = getLabelNodeFromTemp(og, srcDesc);
28 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
30 while (heapRegionsItr.hasNext()) {
31 ReferenceEdge edge = heapRegionsItr.next();
32 HeapRegionNode hrn = edge.getDst();
34 if (hrn.isParameter()) {
35 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
38 if (paramSet != null) {
39 Iterator<Integer> paramIter = paramSet.iterator();
40 while (paramIter.hasNext()) {
41 Integer paramID = paramIter.next();
42 effectsSet.addReadingVar(paramID, new EffectsKey(
43 fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID()));
48 // check weather this heap region is parameter
51 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
52 if (paramSet != null) {
53 Iterator<Integer> paramIter = paramSet.iterator();
55 while (paramIter.hasNext()) {
56 Integer paramID = paramIter.next();
57 effectsSet.addReadingVar(paramID, new EffectsKey(
58 fieldDesc.getSymbol(), srcDesc.getType(),hrn.getID()));
69 public void analyzeFlatSetFieldNode(OwnershipGraph og,
70 TempDescriptor dstDesc, FieldDescriptor fieldDesc) {
72 LabelNode ln = getLabelNodeFromTemp(og, dstDesc);
74 /// check possible strong updates
75 boolean strongUpdate = false;
76 if( !fieldDesc.getType().isImmutable() || fieldDesc.getType().isArray() ) {
77 Iterator<ReferenceEdge> itrXhrn = ln.iteratorToReferencees();
78 while( itrXhrn.hasNext() ) {
79 ReferenceEdge edgeX = itrXhrn.next();
80 HeapRegionNode hrnX = edgeX.getDst();
82 if( fieldDesc != null &&
83 fieldDesc != OwnershipAnalysis.getArrayField( fieldDesc.getType() ) &&
84 ( (hrnX.getNumReferencers() == 1) || // case 1
85 (hrnX.isSingleObject() && ln.getNumReferencees() == 1) // case 2
94 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
96 while (heapRegionsItr.hasNext()) {
97 ReferenceEdge edge = heapRegionsItr.next();
98 HeapRegionNode hrn = edge.getDst();
100 if (hrn.isParameter()) {
102 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
105 if (paramSet != null) {
106 Iterator<Integer> paramIter = paramSet.iterator();
107 while (paramIter.hasNext()) {
108 Integer paramID = paramIter.next();
109 effectsSet.addWritingVar(paramID, new EffectsKey(
110 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
112 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
113 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
119 // check weather this heap region is parameter
122 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
123 if (paramSet != null) {
124 Iterator<Integer> paramIter = paramSet.iterator();
126 while (paramIter.hasNext()) {
127 Integer paramID = paramIter.next();
128 effectsSet.addWritingVar(paramID, new EffectsKey(
129 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
131 effectsSet.addStrongUpdateVar(paramID, new EffectsKey(
132 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
144 private Set<Integer> getReachableParamIndexSet(OwnershipGraph og,
145 TempDescriptor paramDesc) {
147 HashSet<Integer> resultSet = new HashSet<Integer>();
149 LabelNode ln = getLabelNodeFromTemp(og, paramDesc);
152 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
154 while (heapRegionsItr.hasNext()) {
155 ReferenceEdge edge = heapRegionsItr.next();
156 HeapRegionNode hrn = edge.getDst();
158 if (hrn.isParameter()) {
160 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
163 if (paramSet != null) {
164 Iterator<Integer> paramIter = paramSet.iterator();
165 while (paramIter.hasNext()) {
166 Integer paramID = paramIter.next();
168 resultSet.add(paramID);
173 // check weather this heap region is parameter
176 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
177 if (paramSet != null) {
178 Iterator<Integer> paramIter = paramSet.iterator();
180 while (paramIter.hasNext()) {
181 Integer paramID = paramIter.next();
183 resultSet.add(paramID);
197 public void analyzeFlatCall(OwnershipGraph og, FlatCall fc,
198 MethodContext mc, MethodEffects callee) {
200 TempDescriptor[] tdArray = fc.readsTemps();
202 for (int calleeParamIdx = 0; calleeParamIdx < tdArray.length; calleeParamIdx++) {
203 TempDescriptor paramDesc = tdArray[calleeParamIdx];
205 Set<Integer> paramIDs = getReachableParamIndexSet(og, paramDesc);
207 // handle read effects
208 Iterator<Integer> paramIter = paramIDs.iterator();
209 while (paramIter.hasNext()) {
210 Integer paramIdx = paramIter.next();
211 HashSet<EffectsKey> newSet = callee.getEffects().getReadTable()
212 .get(calleeParamIdx);
213 effectsSet.addReadingEffectsSet(paramIdx, newSet);
216 // handle write effects
217 paramIter = paramIDs.iterator();
218 while (paramIter.hasNext()) {
219 Integer paramIdx = paramIter.next();
220 HashSet<EffectsKey> newSet = callee.getEffects()
221 .getWriteTable().get(calleeParamIdx);
222 effectsSet.addWritingEffectsSet(paramIdx, newSet);
225 // handle strong update effects
226 paramIter = paramIDs.iterator();
227 while (paramIter.hasNext()) {
228 Integer paramIdx = paramIter.next();
229 HashSet<EffectsKey> newSet = callee.getEffects()
230 .getStrongUpdateTable().get(calleeParamIdx);
231 effectsSet.addStrongUpdateEffectsSet(paramIdx, newSet);
238 protected LabelNode getLabelNodeFromTemp(OwnershipGraph og,
242 if (!og.td2ln.containsKey(td)) {
243 og.td2ln.put(td, new LabelNode(td));
246 return og.td2ln.get(td);
249 public boolean equals(Object o) {
254 if (!(o instanceof MethodEffects)) {
258 MethodEffects in = (MethodEffects) o;
260 if (getEffects().equals(in.getEffects())) {
268 public int hashCode() {
271 hash += getEffects().hashCode() * 37;