X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FUpdateNode.java;h=7c0e5a464ab3129dc016f70f3cb52627b6471fd2;hb=8a685ebd4f3f110bf687bb84ebe772660e13f5fa;hp=ce6288667904368575482d0259c7a0852c7e24a4;hpb=05ed5b46b079b1386ad50708ce7de00a8d9a32f0;p=repair.git diff --git a/Repair/RepairCompiler/MCC/IR/UpdateNode.java b/Repair/RepairCompiler/MCC/IR/UpdateNode.java index ce62886..7c0e5a4 100755 --- a/Repair/RepairCompiler/MCC/IR/UpdateNode.java +++ b/Repair/RepairCompiler/MCC/IR/UpdateNode.java @@ -1,5 +1,6 @@ package MCC.IR; import java.util.*; +import MCC.State; class UpdateNode { Vector updates; @@ -176,6 +177,14 @@ class UpdateNode { binding.put(b.getVar(),b); } + public int numBindings() { + return bindings.size(); + } + + public Binding getBinding(int i) { + return (Binding)bindings.get(i); + } + public Binding getBinding(VarDescriptor vd) { if (binding.containsKey(vd)) return (Binding)binding.get(vd); @@ -193,29 +202,162 @@ class UpdateNode { public Updates getUpdate(int i) { return (Updates)updates.get(i); } - public void generate(CodeWriter cr, boolean removal, String slot0, String slot1) { - if (!removal) + + private MultUpdateNode getMultUpdateNode(boolean negate, Descriptor d, RepairGenerator rg) { + Termination termination=rg.termination; + MultUpdateNode mun=null; + GraphNode gn; + if (negate) + gn=(GraphNode)termination.abstractremove.get(d); + else + gn=(GraphNode)termination.abstractadd.get(d); + TermNode tn=(TermNode)gn.getOwner(); + for(Iterator edgeit=gn.edges();edgeit.hasNext();) { + GraphNode gn2=((GraphNode.Edge) edgeit.next()).getTarget(); + if (!rg.removed.contains(gn2)) { + TermNode tn2=(TermNode)gn2.getOwner(); + if (tn2.getType()==TermNode.UPDATE) { + mun=tn2.getUpdate(); + break; + } + } + } + if (mun==null) + throw new Error("Can't find update node!"); + return mun; + } + + public void generate_abstract(CodeWriter cr, Updates u, RepairGenerator rg) { + State state=rg.state; + Expr abstractexpr=u.getLeftExpr(); + boolean negated=u.negate; + Descriptor d=null; + Expr left=null; + Expr right=null; + boolean istuple=false; + if (abstractexpr instanceof TupleOfExpr) { + TupleOfExpr toe=(TupleOfExpr) abstractexpr; + d=toe.relation; + left=toe.left; + right=toe.right; + istuple=true; + } else if (abstractexpr instanceof ElementOfExpr) { + ElementOfExpr eoe=(ElementOfExpr) abstractexpr; + d=eoe.set; + left=eoe.element; + istuple=false; + } else { + throw new Error("Unsupported Expr"); + } + MultUpdateNode mun=getMultUpdateNode(negated,d,rg); + VarDescriptor leftvar=VarDescriptor.makeNew("leftvar"); + VarDescriptor rightvar=VarDescriptor.makeNew("rightvar"); + left.generate(cr, leftvar); + if (istuple) + right.generate(cr,rightvar); + + if (negated) { + if (istuple) { + RelationDescriptor rd=(RelationDescriptor)d; + boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); + boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE); + if (usageimage) + cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); + if (usageinvimage) + cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hashinv->remove((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + + for(int i=0;iaddrelation("+rd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");"); + } + } + } + } + } else { + SetDescriptor sd=(SetDescriptor) d; + cr.outputline(rg.stmodel+"->"+sd.getJustSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + + for(int i=0;iaddset("+sd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");"); + } + } + } + } + } + } else { + /* Generate update */ + if (istuple) { + RelationDescriptor rd=(RelationDescriptor) d; + boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); + boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE); + if (usageimage) + cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); + if (usageinvimage) + cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hashinv->add((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + + UpdateNode un=mun.getUpdate(0); + String name=(String)rg.updatenames.get(un); + cr.outputline(name+"(this,"+rg.stmodel+","+rg.strepairtable+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");"); + } else { + SetDescriptor sd=(SetDescriptor)d; + cr.outputline(rg.stmodel+"->"+sd.getJustSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + + UpdateNode un=mun.getUpdate(0); + /* Update for rule rule r */ + String name=(String)rg.updatenames.get(un); + cr.outputline(name+"(this,"+rg.stmodel+","+rg.strepairtable+","+leftvar.getSafeSymbol()+");"); + } + } + + } + + public void generate(CodeWriter cr, boolean removal, boolean modify, String slot0, String slot1, String slot2, RepairGenerator rg) { + if (!removal&&!modify) generate_bindings(cr, slot0,slot1); for(int i=0;i1 doesn't exist."); + + if (b.getType()==Binding.SEARCH) { + VarDescriptor vd=b.getVar(); + cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+b.getSet().getSafeSymbol()+"->firstkey();"); + } else if (b.getType()==Binding.CREATE) { + throw new Error("Creation not supported"); + // source.generateSourceAlloc(cr,vd,b.getSet()); + } else { + VarDescriptor vd=b.getVar(); + switch(b.getPosition()) { + case 0: + cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+slot0+";"); + break; + case 1: + cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+slot1+";"); + break; + default: + throw new Error("Slot >1 doesn't exist."); + } } } }