Checking in some checks...
[repair.git] / Repair / RepairCompiler / MCC / IR / Updates.java
index 7e4dbd3ca9e826f13579663ed29fd2e89da219ff..a4e6d801654d56d2e54de76a00659671342909bc 100755 (executable)
@@ -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;