4 class ConcreteInterferes {
5 static public boolean interferes(MultUpdateNode mun, Rule r, boolean satisfy) {
6 if (!initialinterferes(mun,r,satisfy)) /* Can't falsify a rule adding something to a set on an initial addition*/
8 for(int i=0;i<mun.numUpdates();i++) {
9 UpdateNode un=mun.getUpdate(i);
10 for (int j=0;j<un.numUpdates();j++) {
11 Updates update=un.getUpdate(j);
13 DNFRule drule=r.getDNFGuardExpr();
15 drule=r.getDNFNegGuardExpr();
18 if (!update.isAbstract()) {
19 Descriptor updated_des=update.getDescriptor();
20 assert updated_des!=null;
21 /* Update is local to this rule, and the effect is intentional */
22 /* If we're adding something, a side effect could be to falsify some other binding
23 If we're removing something, there is no similar side effect */
24 if ((un.getRule()==r)&&
25 (((mun.op==MultUpdateNode.ADD)&&satisfy)||(mun.op==MultUpdateNode.REMOVE))&&
26 (r.numQuantifiers()==1)&&
27 (r.getQuantifier(0) instanceof SetQuantifier)&&
29 (((DotExpr)update.getLeftExpr()).getExpr() instanceof VarExpr)&&
30 ((SetQuantifier)r.getQuantifier(0)).getVar()==((VarExpr)((DotExpr)update.getLeftExpr()).getExpr()).getVar())
32 if ((un.getRule()==r)&&
33 (((mun.op==MultUpdateNode.ADD)&&satisfy)||(mun.op==MultUpdateNode.REMOVE))&&
34 (r.numQuantifiers()==0))
38 if (r.getInclusion().usesDescriptor(updated_des))
39 return true; /* Interferes with inclusion condition */
41 for(int k=0;k<drule.size();k++) {
42 RuleConjunction rconj=drule.get(k);
43 for(int l=0;l<rconj.size();l++) {
46 DNFExpr dexpr=rconj.get(l);
47 /* See if update interferes w/ dexpr */
48 if (interferes(un,update, r,dexpr))
58 static private boolean initialinterferes(MultUpdateNode mun, Rule r, boolean satisfy) {
59 AbstractRepair ar=mun.getRepair();
64 if (ar.getType()!=AbstractRepair.ADDTOSET)
66 // if (mun.op!=MultUpdateNode.ADD) (Redundant)
68 if (!r.getInclusion().getTargetDescriptors().contains(ar.getDescriptor()))
70 boolean negated=ar.getPredicate().isNegated();
71 Predicate p=ar.getPredicate().getPredicate();
72 if (!(p instanceof ExprPredicate))
74 ExprPredicate ep=(ExprPredicate)p;
75 if (ep.getType()!=ExprPredicate.SIZE)
77 if ((ep.getOp()==Opcode.EQ)&&(ep.leftsize()==1)&&!negated)
79 if ((ep.getOp()==Opcode.NE)&&(ep.leftsize()==1)&&negated)
82 if ((ep.getOp()==Opcode.NE)&&(ep.leftsize()==0)&&!negated)
84 if ((ep.getOp()==Opcode.EQ)&&(ep.leftsize()==0)&&negated)
89 if ((ep.getOp()==Opcode.GT)&&(ep.leftsize()==0)&&!negated)
91 if ((ep.getOp()==Opcode.LE)&&(ep.leftsize()==0)&&negated)
94 if ((ep.getOp()==Opcode.GE)&&(ep.leftsize()==1)&&!negated)
96 if ((ep.getOp()==Opcode.LT)&&(ep.leftsize()==1)&&negated)
104 static private boolean interferes(UpdateNode un,Updates update, Rule r,DNFExpr dexpr) {
105 Descriptor descriptor=update.getDescriptor();
106 if (!dexpr.getExpr().usesDescriptor(descriptor))
109 /* We need to pair the variables */
110 if (update.isExpr()) {
111 Set vars=update.getRightExpr().freeVars();
112 Opcode op1=update.getOpcode();
113 Expr lexpr1=update.getLeftExpr();
114 Expr rexpr1=update.getRightExpr();
116 for(Iterator it=vars.iterator();it.hasNext();) {
117 VarDescriptor vd=(VarDescriptor) it.next();
118 if (un.getBinding(vd)!=null) {
119 /* VarDescriptor isn't a global */
120 if (update.getVar()!=vd) {
126 if (good&&(dexpr.getExpr() instanceof OpExpr)) {
127 OpExpr expr=(OpExpr)dexpr.getExpr();
128 Expr lexpr2=expr.getLeftExpr();
129 Expr rexpr2=expr.getRightExpr();
130 Opcode op2=expr.getOpcode();
131 if (dexpr.getNegation()) {
132 /* remove negation through opcode translation */
135 else if (op2==Opcode.GE)
137 else if (op2==Opcode.EQ)
139 else if (op2==Opcode.NE)
141 else if (op2==Opcode.LT)
143 else if (op2==Opcode.LE)
147 vars=rexpr2.freeVars();
148 VarDescriptor leftdescriptor=null;
149 if (lexpr2 instanceof VarExpr)
150 leftdescriptor=((VarExpr)lexpr2).getVar();
151 else if (lexpr2 instanceof DotExpr) {
153 for(;e instanceof DotExpr;e=((DotExpr)e).getExpr()) ;
154 leftdescriptor=((VarExpr)e).getVar();
155 } else throw new Error("Bad Expr");
157 for(Iterator it=vars.iterator();it.hasNext();) {
158 VarDescriptor vd=(VarDescriptor) it.next();
159 if (un.getBinding(vd)!=null) {
160 /* VarDescriptor isn't a global */
161 if (leftdescriptor!=vd) {
168 HashMap remap=new HashMap();
169 remap.put(update.getVar(),leftdescriptor);
171 lexpr1.equals(remap,lexpr2)&&
172 rexpr1.equals(remap,rexpr2))