X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FConcreteInterferes.java;h=eefde7f2f733ad659d9665426cf6625899178330;hp=e6718a69eefbf4f6b975b9cd1780709ff38a9328;hb=5206adad89e8c25fe06bf649840920337f1c2ad1;hpb=ce993d16a8b0057b8d5881be15aed42926e54783 diff --git a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java index e6718a6..eefde7f 100755 --- a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java +++ b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java @@ -1,23 +1,349 @@ package MCC.IR; +import java.util.*; class ConcreteInterferes { + + static public boolean interferesinclusion(UpdateNode un, Updates update, Rule r) { + Descriptor updated_des=update.getDescriptor(); + Inclusion inclusion=r.getInclusion(); + if (inclusion instanceof RelationInclusion) { + RelationInclusion ri=(RelationInclusion)inclusion; + if (ri.getLeftExpr().usesDescriptor(updated_des)&&interferesinclusion(un,update,r,ri.getLeftExpr())) + return true; + if (ri.getRightExpr().usesDescriptor(updated_des)&&interferesinclusion(un,update,r,ri.getRightExpr())) + return true; + } else if (inclusion instanceof SetInclusion) { + SetInclusion si=(SetInclusion)inclusion; + if (si.getExpr().usesDescriptor(updated_des)&&interferesinclusion(un,update,r,si.getExpr())) + return true; + } else throw new Error(); + return false; + } + + static public boolean interferesinclusion(UpdateNode un, Updates update, Rule r, Expr inclusionexpr) { + Descriptor updated_des=update.getDescriptor(); + if (updated_des instanceof FieldDescriptor) { + /* Build variable correspondance */ + HashSet set=new HashSet(); + inclusionexpr.findmatch(updated_des,set); + + for(Iterator matchit=set.iterator();matchit.hasNext();) { + DotExpr dotexpr=(DotExpr)matchit.next(); + DotExpr updateexpr=(DotExpr)update.getLeftExpr(); + while(true) { + if (dotexpr.getField()!=updateexpr.getField()) + return true; + Expr de=dotexpr.getExpr(); + Expr ue=updateexpr.getExpr(); + if ((de instanceof DotExpr)&&(ue instanceof DotExpr)) { + dotexpr=(DotExpr)de; + updateexpr=(DotExpr)ue; + } else if ((de instanceof VarExpr)&&(ue instanceof VarExpr)) { + VarDescriptor dvd=((VarExpr)de).getVar(); + VarDescriptor uvd=((VarExpr)ue).getVar(); + if (interferesinclusion(un,r,dvd,uvd)) + return true; + else + break; + } else + return true; + } + } + } else if (updated_des instanceof VarDescriptor) { + /* We have a VarDescriptor - no correspondance necessary */ + VarDescriptor vd=(VarDescriptor)updated_des; + if (interferesinclusion(un,r,vd,vd)) + return true; + } else throw new Error(); + return false; + } + + static public boolean interferesinclusion(UpdateNode un, Rule r, VarDescriptor dvd, VarDescriptor uvd) { + DNFRule negrule=r.getDNFNegGuardExpr(); + HashMap remap=new HashMap(); + remap.put(dvd,uvd); + + for(int i=0;i