4 class ConcreteInterferes {
5 static public boolean interferes(MultUpdateNode mun, Rule r, boolean satisfy) {
6 for(int i=0;i<mun.numUpdates();i++) {
7 UpdateNode un=mun.getUpdate(i);
8 for (int j=0;j<un.numUpdates();j++) {
9 Updates update=un.getUpdate(j);
11 DNFRule drule=r.getDNFGuardExpr();
13 drule=r.getDNFNegGuardExpr();
15 if (!update.isAbstract()) {
16 Descriptor updated_des=update.getDescriptor();
17 assert updated_des!=null;
18 if (r.getInclusion().usesDescriptor(updated_des))
19 return true; /* Interferes with inclusion condition */
21 for(int k=0;k<drule.size();k++) {
22 RuleConjunction rconj=drule.get(k);
23 for(int l=0;l<rconj.size();l++) {
24 DNFExpr dexpr=rconj.get(l);
25 /* See if update interferes w/ dexpr */
26 if (interferes(un,update, r,dexpr))
36 static private boolean interferes(UpdateNode un,Updates update, Rule r,DNFExpr dexpr) {
37 Descriptor descriptor=update.getDescriptor();
38 if (!dexpr.getExpr().usesDescriptor(descriptor))
40 /* We need to pair the variables */
41 if (update.isExpr()) {
42 Set vars=update.getRightExpr().freeVars();
43 Opcode op1=update.getOpcode();
44 Expr lexpr1=update.getLeftExpr();
45 Expr rexpr1=update.getRightExpr();
47 for(Iterator it=vars.iterator();it.hasNext();) {
48 VarDescriptor vd=(VarDescriptor) it.next();
49 if (un.getBinding(vd)!=null) {
50 /* VarDescriptor isn't a global */
51 if (update.getVar()!=vd) {
57 if (good&&(dexpr.getExpr() instanceof OpExpr)) {
58 OpExpr expr=(OpExpr)dexpr.getExpr();
59 Expr lexpr2=expr.getLeftExpr();
60 Expr rexpr2=expr.getRightExpr();
61 Opcode op2=expr.getOpcode();
62 if (dexpr.getNegation()) {
63 /* remove negation through opcode translation */
66 else if (op2==Opcode.GE)
68 else if (op2==Opcode.EQ)
70 else if (op2==Opcode.NE)
72 else if (op2==Opcode.LT)
74 else if (op2==Opcode.LE)
78 vars=rexpr2.freeVars();
79 VarDescriptor leftdescriptor=null;
80 if (lexpr2 instanceof VarExpr)
81 leftdescriptor=((VarExpr)lexpr2).getVar();
82 else if (lexpr2 instanceof DotExpr) {
84 for(;e instanceof DotExpr;e=((DotExpr)e).getExpr()) ;
85 leftdescriptor=((VarExpr)e).getVar();
86 } else throw new Error("Bad Expr");
88 for(Iterator it=vars.iterator();it.hasNext();) {
89 VarDescriptor vd=(VarDescriptor) it.next();
90 if (un.getBinding(vd)!=null) {
91 /* VarDescriptor isn't a global */
92 if (leftdescriptor!=vd) {
99 HashMap remap=new HashMap();
100 remap.put(update.getVar(),leftdescriptor);
102 lexpr1.equals(remap,lexpr2)&&
103 rexpr1.equals(remap,rexpr2))