From: bdemsky Date: Wed, 25 Feb 2004 22:38:02 +0000 (+0000) Subject: Checking in code that: X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=commitdiff_plain;h=9c7a7b2df517d61e4e4e2431c005e152bd45e35c Checking in code that: 1) performs consistency checks 2) doesn abstract repairs 3) calls/schedules data structure updates 4) partially data structure update code --- diff --git a/Repair/RepairCompiler/MCC/IR/MultUpdateNode.java b/Repair/RepairCompiler/MCC/IR/MultUpdateNode.java index 206aeab..ae620fe 100755 --- a/Repair/RepairCompiler/MCC/IR/MultUpdateNode.java +++ b/Repair/RepairCompiler/MCC/IR/MultUpdateNode.java @@ -28,6 +28,13 @@ class MultUpdateNode { scopenode=sn; op=MultUpdateNode.REMOVE; } + + public Descriptor getDescriptor() { + if (abstractrepair!=null) + return abstractrepair.getDescriptor(); + else + return scopenode.getDescriptor(); + } void addUpdate(UpdateNode un) { updates.add(un); } diff --git a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java index 5a29683..bcf68f5 100755 --- a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java +++ b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java @@ -21,6 +21,7 @@ public class RepairGenerator { HashSet usedupdates; Termination termination; Set removed; + HashSet togenerate; static boolean DEBUG=false; Cost cost; Sources sources; @@ -31,6 +32,11 @@ public class RepairGenerator { usedupdates=new HashSet(); termination=t; removed=t.removedset; + togenerate=new HashSet(); + togenerate.addAll(termination.conjunctions); + togenerate.removeAll(removed); + GraphNode.computeclosure(togenerate,removed); + cost=new Cost(); sources=new Sources(state); Repair.repairgenerator=this; @@ -42,6 +48,7 @@ public class RepairGenerator { GraphNode gn=(GraphNode) it.next(); TermNode tn=(TermNode) gn.getOwner(); MultUpdateNode mun=tn.getUpdate(); + if (togenerate.contains(gn)) for (int i=0;i0;"+change.getSafeSymbol()+"--)"); cr.startblock(); + VarDescriptor newobject=VarDescriptor.makeNew("newobject"); + if (d instanceof RelationDescriptor) { + VarDescriptor otherside=((ImageSetExpr)((SizeofExpr)ep.expr).setexpr).vd; + RelationDescriptor rd=(RelationDescriptor)d; + if (sources.relsetSource(rd,!ep.inverted())) { + /* Set Source */ + SetDescriptor sd=sources.relgetSourceSet(rd,!ep.inverted()); + VarDescriptor iterator=VarDescriptor.makeNew("iterator"); + cr.outputline(sd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";"); + cr.outputline("for("+iterator.getSafeSymbol()+"="+sd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)"); + cr.startblock(); + if (ep.inverted()) { + cr.outputline("if !"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+"->key(),"+otherside.getSafeSymbol()+")"); + } else { + cr.outputline("if !"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+"->key())"); + } + cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();"); + cr.outputline(iterator.getSafeSymbol()+"->next();"); + cr.endblock(); + } else if (sources.relallocSource(rd,!ep.inverted())) { + /* Allocation Source*/ + sources.relgenerateSourceAlloc(cr,newobject,rd,!ep.inverted()); + } else throw new Error("No source for adding to Relation"); + if (ep.inverted()) { + boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); + boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE); + if (usageimage) + cr.outputline(rd.getSafeSymbol()+"_hash->add("+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");"); + if (usageinvimage) + cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); + + UpdateNode un=munadd.getUpdate(0); + String name=(String)updatenames.get(un); + cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");"); + } else { + boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); + boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE); + if (usageimage) + cr.outputline(rd.getSafeSymbol()+"_hash->add("+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); + if (usageinvimage) + cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+newobject.getSafeSymbol()+","+otherside.getSafeSymbol()+");"); + UpdateNode un=munadd.getUpdate(0); + String name=(String)updatenames.get(un); + cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+otherside.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); + } + } else { + SetDescriptor sd=(SetDescriptor)d; + if (sources.setSource(sd)) { + /* Set Source */ + /* Set Source */ + SetDescriptor sourcesd=sources.getSourceSet(sd); + VarDescriptor iterator=VarDescriptor.makeNew("iterator"); + cr.outputline(sourcesd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";"); + cr.outputline("for("+iterator.getSafeSymbol()+"="+sourcesd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)"); + cr.startblock(); + cr.outputline("if !"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+"->key())"); + cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();"); + cr.outputline(iterator.getSafeSymbol()+"->next();"); + cr.endblock(); + } else if (sources.allocSource(sd)) { + /* Allocation Source*/ + sources.generateSourceAlloc(cr,newobject,sd); + } else throw new Error("No source for adding to Set"); + cr.outputline(sd.getSafeSymbol()+"_hash->add("+newobject.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); + UpdateNode un=munadd.getUpdate(0); + String name=(String)updatenames.get(un); + cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); + } cr.endblock(); } } diff --git a/Repair/RepairCompiler/MCC/IR/Sources.java b/Repair/RepairCompiler/MCC/IR/Sources.java index de6d4f3..b37fa11 100755 --- a/Repair/RepairCompiler/MCC/IR/Sources.java +++ b/Repair/RepairCompiler/MCC/IR/Sources.java @@ -25,4 +25,27 @@ public class Sources { e.generate(cr, size); cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");"); } + + public boolean relsetSource(RelationDescriptor rd, boolean domain) { + return false; + } + public boolean relallocSource(RelationDescriptor rd, boolean domain) { + return true; + } + public SetDescriptor relgetSourceSet(RelationDescriptor rd, boolean domain) { + return null; + } + public void relgenerateSourceAlloc(CodeWriter cr,VarDescriptor vd, RelationDescriptor rd, boolean domain) { + SetDescriptor sd=null; + if (domain) + sd=rd.getDomain(); + else + sd=rd.getRange(); + TypeDescriptor td=sd.getType(); + Expr e=td.getSizeExpr(); + VarDescriptor size=VarDescriptor.makeNew("size"); + e.generate(cr, size); + cr.outputline(td.getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"=("+td.getGenerateType().getSafeSymbol()+") malloc("+size.getSafeSymbol()+");"); + } + } diff --git a/Repair/RepairCompiler/MCC/IR/Termination.java b/Repair/RepairCompiler/MCC/IR/Termination.java index 69f7613..689a5d2 100755 --- a/Repair/RepairCompiler/MCC/IR/Termination.java +++ b/Repair/RepairCompiler/MCC/IR/Termination.java @@ -273,9 +273,10 @@ public class Termination { Rule r=(Rule) state.vRules.get(i); Vector possiblerules=new Vector(); /* Construct bindings */ - Vector bindings=new Vector(); - constructbindings(bindings, r,true); - + /* No need to construct bindings on remove + Vector bindings=new Vector(); + constructbindings(bindings, r,true); + */ for(int j=0;j<(r.numQuantifiers()+r.getDNFNegGuardExpr().size());j++) { GraphNode gn=(GraphNode)scopesatisfy.get(r); TermNode tn=(TermNode) gn.getOwner(); @@ -284,7 +285,8 @@ public class Termination { TermNode tn2=new TermNode(mun); GraphNode gn2=new GraphNode("CompRem"+compensationcount,tn2); UpdateNode un=new UpdateNode(r); - un.addBindings(bindings); + // un.addBindings(bindings); + // Not necessary if (j1 doesn't exist."); + } + } + } }