Adding changes to cvs...
[repair.git] / Repair / RepairCompiler / MCC / IR / UpdateNode.java
1 package MCC.IR;
2 import java.util.*;
3
4 class UpdateNode {
5     Vector updates;
6     Vector bindings;
7     Hashtable binding;
8
9     public UpdateNode() {
10         updates=new Vector();
11         bindings=new Vector();
12         binding=new Hashtable();
13     }
14
15     public void addBindings(Vector v) {
16         for (int i=0;i<v.size();i++) {
17             bindings.add((Binding)v.get(i));
18         }
19     }
20
21     public boolean checkconflicts() {
22         Set toremove=new HashSet();
23         for(int i=0;i<updates.size();i++) {
24             Updates u1=(Updates)updates.get(i);
25             for(int j=0;j<updates.size();j++) {
26                 Updates u2=(Updates)updates.get(j);
27                 if (u1.isAbstract()||u2.isAbstract())
28                     continue;  /* Abstract updates are already accounted for by graph */
29                 if (u1.getDescriptor()!=u2.getDescriptor())
30                     continue; /* No interference - different descriptors */
31                 
32                 if ((u1.getOpcode()==Opcode.GT||u1.getOpcode()==Opcode.GE)&&
33                     (u2.getOpcode()==Opcode.GT||u2.getOpcode()==Opcode.GE))
34                     continue; /* Can be satisfied simultaneously */
35
36                 if ((u1.getOpcode()==Opcode.LT||u1.getOpcode()==Opcode.LE)&&
37                     (u2.getOpcode()==Opcode.LT||u2.getOpcode()==Opcode.LE))
38                     continue;
39                 
40                 
41                 return false; /* They interfere */
42             }
43         }
44         updates.remove(toremove);
45         return false;
46     }
47
48     public void addBinding(Binding b) {
49         bindings.add(b);
50         binding.put(b.getVar(),b);
51     }
52
53     public Binding getBinding(VarDescriptor vd) {
54         if (binding.containsKey(vd))
55             return (Binding)binding.get(vd);
56         else
57             return null;
58     }
59
60     public void addUpdate(Updates u) {
61         updates.add(u);
62     }
63
64     public int numUpdates() {
65         return updates.size();
66     }
67     public Updates getUpdate(int i) {
68         return (Updates)updates.get(i);
69     }
70 }