changes
[IRC.git] / Robust / src / IR / Tree / OpNode.java
index 815f4894674cd3ba69537973ce78e5193ccbcb3f..7589a19d3112ba268c44768b5c05a75db6254463 100644 (file)
@@ -68,4 +68,65 @@ public class OpNode extends ExpressionNode {
   public int kind() {
     return Kind.OpNode;
   }
+
+  public Long evaluate() {
+    eval = null;
+    Long l = this.left.evaluate();
+    if(l != null) {
+      if (this.op.getOp() == Operation.LOGIC_NOT)
+        eval = Long.valueOf(l.longValue() > 0?0:1);
+      else if (this.op.getOp() == Operation.COMP)
+        eval = Long.valueOf((long)(~l.longValue()));
+      else if (this.op.getOp() == Operation.UNARYMINUS)
+        eval = Long.valueOf(-l.longValue() );
+      else if (this.op.getOp() == Operation.UNARYPLUS)
+        eval = Long.valueOf(+l.longValue());
+      else {
+        Long r = this.right.evaluate();
+        if(r != null) {
+          //if (this.op.getOp() == Operation.LOGIC_OR)
+          //  return Long.valueOf((long)(l.longValue() || r.longValue()));
+          //else if (this.op.getOp() == Operation.LOGIC_AND)
+          //  return Long.valueOf((long)(l.longValue() && r.longValue()));
+          /*else */ if (this.op.getOp() == Operation.BIT_OR)
+            eval = Long.valueOf(l.longValue() | r.longValue());
+          else if (this.op.getOp() == Operation.BIT_XOR)
+            eval = Long.valueOf(l.longValue() ^ r.longValue());
+          else if (this.op.getOp() == Operation.BIT_AND)
+            eval = Long.valueOf(l.longValue() & r.longValue());
+          else if (this.op.getOp() == Operation.EQUAL)
+            eval = Long.valueOf((l.longValue() == r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.NOTEQUAL)
+            eval = Long.valueOf((l.longValue() != r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.LT)
+            eval = Long.valueOf((l.longValue() < r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.GT)
+            eval = Long.valueOf((l.longValue() > r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.LTE)
+            eval = Long.valueOf((l.longValue() <= r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.GTE)
+            eval = Long.valueOf((l.longValue() >= r.longValue())?1:0);
+          else if (this.op.getOp() == Operation.LEFTSHIFT)
+            eval = Long.valueOf(l.longValue() << r.longValue());
+          else if (this.op.getOp() == Operation.RIGHTSHIFT)
+            eval = Long.valueOf(l.longValue() >> r.longValue());
+          else if (this.op.getOp() == Operation.URIGHTSHIFT)
+            eval = Long.valueOf(l.longValue() >>> r.longValue());
+          else if (this.op.getOp() == Operation.SUB)
+            eval = Long.valueOf(l.longValue() - r.longValue());
+          else if (this.op.getOp() == Operation.ADD)
+            eval = Long.valueOf(l.longValue() + r.longValue());
+          else if (this.op.getOp() == Operation.MULT)
+            eval = Long.valueOf(l.longValue() * r.longValue());
+          else if (this.op.getOp() == Operation.DIV)
+            eval = Long.valueOf(l.longValue() / r.longValue());
+          else if (this.op.getOp() == Operation.MOD)
+            eval = Long.valueOf(l.longValue() % r.longValue());
+          else if (this.op.getOp() == Operation.ASSIGN)
+            eval = Long.valueOf(r.longValue());
+        }
+      }
+    }
+    return eval;
+  }
 }