X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FUpdates.java;h=a4e6d801654d56d2e54de76a00659671342909bc;hb=1c526e586ae3716fc1ada61e7af588c1dbff44e6;hp=7e4dbd3ca9e826f13579663ed29fd2e89da219ff;hpb=cd8c06f13c3d628b15f745790e3eeac2891c5736;p=repair.git diff --git a/Repair/RepairCompiler/MCC/IR/Updates.java b/Repair/RepairCompiler/MCC/IR/Updates.java index 7e4dbd3..a4e6d80 100755 --- a/Repair/RepairCompiler/MCC/IR/Updates.java +++ b/Repair/RepairCompiler/MCC/IR/Updates.java @@ -9,26 +9,41 @@ class Updates { Expr rightexpr; Expr leftexpr; Opcode opcode; - boolean negate; + boolean negate=false; - public Updates(Expr lexpr, Expr rexpr, Opcode op) { + public String toString() { + if (type==EXPR) + return leftexpr.name()+opcode.toString()+rightexpr.name(); + else if (type==POSITION) + return leftexpr.name()+opcode.toString()+"Position("+String.valueOf(rightposition)+")"; + else if (type==ABSTRACT) { + if (negate) return "!"+leftexpr.name(); + else return leftexpr.name(); + } else throw new Error("Unrecognized type"); + } + + public Updates(Expr lexpr, Expr rexpr, Opcode op, boolean negate) { + if (!lexpr.isValue()) + System.out.println("Building invalid update"); leftexpr=lexpr; type=Updates.EXPR; - opcode=Opcode.EQ; - /* Get rid of everything but NE */ - if (op==Opcode.GT) { - rightexpr=new OpExpr(Opcode.ADD,rexpr,new IntegerLiteralExpr(1)); - } else if (op==Opcode.GE) { - rightexpr=rexpr; - } else if (op==Opcode.LT) { - rightexpr=new OpExpr(Opcode.SUB,rexpr,new IntegerLiteralExpr(1)); - } else if (op==Opcode.LE) { - rightexpr=rexpr; - } else if (op==Opcode.EQ) { - rightexpr=rexpr; - } else if (op==Opcode.NE) { - opcode=Opcode.NE; + if (negate) { + /* remove negation through opcode translation */ + if (op==Opcode.GT) + op=Opcode.LE; + else if (op==Opcode.GE) + op=Opcode.LT; + else if (op==Opcode.EQ) + op=Opcode.NE; + else if (op==Opcode.NE) + op=Opcode.EQ; + else if (op==Opcode.LT) + op=Opcode.GE; + else if (op==Opcode.LE) + op=Opcode.GT; } + opcode=op; + rightexpr=rexpr; } boolean isGlobal() { @@ -37,12 +52,28 @@ class Updates { else return false; } + VarDescriptor getVar() { + if (isGlobal()) { + return ((VarExpr)leftexpr).getVar(); + } else if (isField()) { + Expr e=leftexpr; + for(;e instanceof DotExpr;e=((DotExpr)e).getExpr()) ; + return ((VarExpr)e).getVar(); + } else { + System.out.println(toString()); + throw new Error("Unrecognized Update"); + } + } + Descriptor getDescriptor() { if (isGlobal()) { return ((VarExpr)leftexpr).getVar(); } else if (isField()) { return ((DotExpr)leftexpr).getField(); - } else throw New Error("Unrecognized Update"); + } else { + System.out.println(toString()); + throw new Error("Unrecognized Update"); + } } boolean isField() { @@ -53,12 +84,18 @@ class Updates { return false; } + boolean isExpr() { + return type==Updates.EXPR; + } + Opcode getOpcode() { return opcode; } public Updates(Expr lexpr, Expr rexpr) { + if (!lexpr.isValue()) + System.out.println("Building invalid update"); leftexpr=lexpr; rightexpr=rexpr; type=Updates.EXPR; @@ -66,11 +103,18 @@ class Updates { } public Updates(Expr lexpr, int rpos) { + if (!lexpr.isValue()) + System.out.println("Building invalid update"); leftexpr=lexpr; rightposition=rpos; type=Updates.POSITION; - opcode=null; + opcode=Opcode.EQ; + } + + boolean isAbstract() { + return type==Updates.ABSTRACT; } + public Updates(Expr lexpr,boolean negates) { leftexpr=lexpr; type=Updates.ABSTRACT;