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 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
76 while (heapRegionsItr.hasNext()) {
77 ReferenceEdge edge = heapRegionsItr.next();
78 HeapRegionNode hrn = edge.getDst();
80 if (hrn.isParameter()) {
82 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
85 if (paramSet != null) {
86 Iterator<Integer> paramIter = paramSet.iterator();
87 while (paramIter.hasNext()) {
88 Integer paramID = paramIter.next();
89 effectsSet.addWritingVar(paramID, new EffectsKey(
90 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
95 // check weather this heap region is parameter
98 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
99 if (paramSet != null) {
100 Iterator<Integer> paramIter = paramSet.iterator();
102 while (paramIter.hasNext()) {
103 Integer paramID = paramIter.next();
104 effectsSet.addWritingVar(paramID, new EffectsKey(
105 fieldDesc.getSymbol(), dstDesc.getType(),hrn.getID()));
116 private Set<Integer> getReachableParamIndexSet(OwnershipGraph og,
117 TempDescriptor paramDesc) {
119 HashSet<Integer> resultSet = new HashSet<Integer>();
121 LabelNode ln = getLabelNodeFromTemp(og, paramDesc);
124 Iterator<ReferenceEdge> heapRegionsItr = ln.iteratorToReferencees();
126 while (heapRegionsItr.hasNext()) {
127 ReferenceEdge edge = heapRegionsItr.next();
128 HeapRegionNode hrn = edge.getDst();
130 if (hrn.isParameter()) {
132 Set<Integer> paramSet = og.idPrimary2paramIndexSet.get(hrn
135 if (paramSet != null) {
136 Iterator<Integer> paramIter = paramSet.iterator();
137 while (paramIter.hasNext()) {
138 Integer paramID = paramIter.next();
140 resultSet.add(paramID);
145 // check weather this heap region is parameter
148 paramSet = og.idSecondary2paramIndexSet.get(hrn.getID());
149 if (paramSet != null) {
150 Iterator<Integer> paramIter = paramSet.iterator();
152 while (paramIter.hasNext()) {
153 Integer paramID = paramIter.next();
155 resultSet.add(paramID);
169 public void analyzeFlatCall(OwnershipGraph og, FlatCall fc,
170 MethodContext mc, MethodEffects callee) {
172 TempDescriptor[] tdArray = fc.readsTemps();
174 for (int calleeParamIdx = 0; calleeParamIdx < tdArray.length; calleeParamIdx++) {
175 TempDescriptor paramDesc = tdArray[calleeParamIdx];
177 Set<Integer> paramIDs = getReachableParamIndexSet(og, paramDesc);
179 // handle read effects
180 Iterator<Integer> paramIter = paramIDs.iterator();
181 while (paramIter.hasNext()) {
182 Integer paramIdx = paramIter.next();
183 HashSet<EffectsKey> newSet = callee.getEffects().getReadTable()
184 .get(calleeParamIdx);
185 effectsSet.addReadingEffectsSet(paramIdx, newSet);
188 // handle write effects
189 paramIter = paramIDs.iterator();
190 while (paramIter.hasNext()) {
191 Integer paramIdx = paramIter.next();
192 HashSet<EffectsKey> newSet = callee.getEffects()
193 .getWriteTable().get(calleeParamIdx);
194 effectsSet.addWritingEffectsSet(paramIdx, newSet);
201 protected LabelNode getLabelNodeFromTemp(OwnershipGraph og,
205 if (!og.td2ln.containsKey(td)) {
206 og.td2ln.put(td, new LabelNode(td));
209 return og.td2ln.get(td);
212 public boolean equals(Object o) {
217 if (!(o instanceof MethodEffects)) {
221 MethodEffects in = (MethodEffects) o;
223 if (getEffects().equals(in.getEffects())) {
231 public int hashCode() {
234 hash += getEffects().hashCode() * 37;