From: bdemsky <bdemsky>
Date: Thu, 29 Jul 2004 22:21:58 +0000 (+0000)
Subject: Updates to allow repairing backpointers.
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=94f62079ed1aec461df5e3e493664abe38cf61f9;p=repair.git

Updates to allow repairing backpointers.
---

diff --git a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java
index a4c1ba3..fc683a9 100755
--- a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java
+++ b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java
@@ -59,6 +59,46 @@ class AbstractInterferes {
 	return false;
     }
 
+    public boolean checkrelationconstraint(AbstractRepair ar, Constraint c) {
+	if (c.numQuantifiers()==1&&
+	    (c.getQuantifier(0) instanceof RelationQuantifier)) {
+	    RelationQuantifier rq=(RelationQuantifier)c.getQuantifier(0);
+	    if (rq.getRelation()==ar.getDescriptor()) {
+		Hashtable ht=new Hashtable();
+		if (ar.getDomainSet()!=null)
+		    ht.put(rq.x,ar.getDomainSet());
+		if (ar.getRangeSet()!=null)
+		    ht.put(rq.y,ar.getRangeSet());
+		DNFConstraint dconst=c.dnfconstraint;
+	    conjloop:
+		for(int i=0;i<dconst.size();i++) {
+		    Conjunction conj=dconst.get(i);
+		predloop:
+		    for(int j=0;j<conj.size();j++) {
+			DNFPredicate dpred=conj.get(j);
+			Predicate p=dpred.getPredicate();
+			if ((p instanceof InclusionPredicate)&&(!dpred.isNegated())) {
+			    InclusionPredicate ip=(InclusionPredicate)p;
+			    if (ip.expr instanceof VarExpr&&
+				ip.setexpr.getDescriptor() instanceof SetDescriptor) {
+				VarDescriptor vd=((VarExpr)ip.expr).getVar();
+				if (ht.containsKey(vd)) {
+				    SetDescriptor td=(SetDescriptor)ip.setexpr.getDescriptor();
+				    SetDescriptor s=(SetDescriptor)ht.get(vd);
+				    if (td.isSubset(s))
+					continue predloop;
+				}
+			    }
+			}
+			continue conjloop;
+		    }
+		    return true;
+		}
+	    }
+	}
+	return false;
+    }
+
     /** Does performing the AbstractRepair ar falsify the predicate dp */
 
     public boolean interfereswithpredicate(AbstractRepair ar, DNFPredicate dp) {
diff --git a/Repair/RepairCompiler/MCC/IR/AbstractRepair.java b/Repair/RepairCompiler/MCC/IR/AbstractRepair.java
index 3cb9b03..aecc4e9 100755
--- a/Repair/RepairCompiler/MCC/IR/AbstractRepair.java
+++ b/Repair/RepairCompiler/MCC/IR/AbstractRepair.java
@@ -138,9 +138,6 @@ class AbstractRepair {
 	return null;
     }
 
-
-    
-
     public int getType() {
 	return type;
     }
diff --git a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java
index 083a506..2e657ef 100755
--- a/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java
+++ b/Repair/RepairCompiler/MCC/IR/ConcreteInterferes.java
@@ -26,7 +26,7 @@ public class ConcreteInterferes {
 		//Abstract updates don't have concrete interference1
 		if (update.isAbstract()) 
 		    continue;
-		
+
 		DNFRule drule=satisfy?r.getDNFNegGuardExpr():r.getDNFGuardExpr();
 		Descriptor updated_des=update.getDescriptor();
 		assert updated_des!=null;
@@ -39,7 +39,6 @@ public class ConcreteInterferes {
 		    continue;
 
 
-
 		// See if the update interferes with the inclusion
 		// condition for the rule
 		if (r.getInclusion().usesDescriptor(updated_des)) {
@@ -68,6 +67,22 @@ public class ConcreteInterferes {
 			} else throw new Error();
 		    }
 
+		    if ((un.getRule()==r)&&
+			((mun.op==MultUpdateNode.ADD)&&!satisfy)&&
+			modifiesremoves(mun,un,r)) {
+			Inclusion inclusion=r.getInclusion();
+			if (inclusion instanceof RelationInclusion) {
+			    RelationInclusion ri=(RelationInclusion)inclusion;
+			    if ((!testdisjoint(update,r,ri.getLeftExpr()))&&
+				(!testdisjoint(update,r,ri.getRightExpr())))
+				ok=true;	 /* Update is specific to
+						    given binding of the rule,
+						    and adds are only performed
+						    if the removal is desired or
+						    the tuple doesn't exist.*/
+			}
+		    }
+
 		    if (!ok) {
 			if (satisfy) {
 			    /** Check to see if the update definitely falsifies r, thus
@@ -95,6 +110,18 @@ public class ConcreteInterferes {
                                              intended one, so we're
                                              okay */
 			}
+			if ((un.getRule()==r)&&
+			    ((mun.op==MultUpdateNode.ADD)&&!satisfy)&&
+			    modifiesremoves(mun,un,r)) {
+			    if (!testdisjoint(update,r,dexpr.getExpr()))
+				continue; /* Update is specific to
+                                             given binding of the
+                                             rule, and adds are only
+                                             performed if the removal
+                                             is desired or the tuple
+                                             doesn't exist.*/
+			}
+
 			if (interferes(update,dexpr))
 			    return true;
 		    }
@@ -103,6 +130,26 @@ public class ConcreteInterferes {
 	}
 	return false;
     }
+
+
+    static private boolean modifiesremoves(MultUpdateNode mun,UpdateNode un, Rule r) {
+	AbstractRepair ar=mun.getRepair();
+	boolean inverted=ar.getPredicate().getPredicate().inverted();
+
+	if (ar.getType()!=AbstractRepair.MODIFYRELATION)
+	    return false;
+	RelationInclusion ri=(RelationInclusion)r.getInclusion();
+	Expr e=inverted?ri.getRightExpr():ri.getLeftExpr();
+	while(e instanceof CastExpr) {
+	    e=((CastExpr)e).getExpr();
+	}
+	if (!(e instanceof VarExpr))
+	    return false;
+	VarExpr ve=(VarExpr)e;
+	if (ve.isValue())
+	    return false;
+	return true;
+    }
     
     static private boolean updateonlytonewobject(MultUpdateNode mun, UpdateNode un, Updates updates) {
 	AbstractRepair ar=mun.getRepair();
diff --git a/Repair/RepairCompiler/MCC/IR/Termination.java b/Repair/RepairCompiler/MCC/IR/Termination.java
index 3cf53b9..5e4bc91 100755
--- a/Repair/RepairCompiler/MCC/IR/Termination.java
+++ b/Repair/RepairCompiler/MCC/IR/Termination.java
@@ -277,6 +277,11 @@ public class Termination {
 		TermNode tn2=(TermNode)gn2.getOwner();
 		Conjunction conj=tn2.getConjunction();
 		Constraint cons=tn2.getConstraint();
+		/* See if this is a relation wellformedness constraint
+                   that is trivially satisfied. */
+		System.out.println(gn.getTextLabel()+"---"+gn2.getTextLabel());
+		if (abstractinterferes.checkrelationconstraint(ar, cons))
+		    continue;
 
 		for(int i=0;i<conj.size();i++) {
 		    DNFPredicate dp=conj.get(i);
diff --git a/Repair/RepairCompiler/MCC/IR/VarExpr.java b/Repair/RepairCompiler/MCC/IR/VarExpr.java
index b25e543..12a47f3 100755
--- a/Repair/RepairCompiler/MCC/IR/VarExpr.java
+++ b/Repair/RepairCompiler/MCC/IR/VarExpr.java
@@ -26,6 +26,8 @@ public class VarExpr extends Expr {
     }
 
     public SetDescriptor getSet() {
+	if (vd==null)
+	    return null;
 	return vd.getSet();
     }