aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/javassist/compiler/ast/IntConst.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/javassist/compiler/ast/IntConst.java')
-rw-r--r--src/main/javassist/compiler/ast/IntConst.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/main/javassist/compiler/ast/IntConst.java b/src/main/javassist/compiler/ast/IntConst.java
index d90f1438..b6204e1f 100644
--- a/src/main/javassist/compiler/ast/IntConst.java
+++ b/src/main/javassist/compiler/ast/IntConst.java
@@ -16,6 +16,7 @@
package javassist.compiler.ast;
import javassist.compiler.CompileError;
+import javassist.compiler.TokenId;
/**
* Integer constant.
@@ -28,6 +29,8 @@ public class IntConst extends ASTree {
public long get() { return value; }
+ public void set(long v) { value = v; }
+
/* Returns IntConstant, CharConstant, or LongConstant.
*/
public int getType() { return type; }
@@ -37,4 +40,99 @@ public class IntConst extends ASTree {
public void accept(Visitor v) throws CompileError {
v.atIntConst(this);
}
+
+ public ASTree compute(int op, ASTree right) {
+ if (right instanceof IntConst)
+ return compute0(op, (IntConst)right);
+ else if (right instanceof DoubleConst)
+ return compute0(op, (DoubleConst)right);
+ else
+ return null;
+ }
+
+ private IntConst compute0(int op, IntConst right) {
+ int type1 = this.type;
+ int type2 = right.type;
+ int newType;
+ if (type1 == TokenId.LongConstant || type2 == TokenId.LongConstant)
+ newType = TokenId.LongConstant;
+ else if (type1 == TokenId.CharConstant
+ && type2 == TokenId.CharConstant)
+ newType = TokenId.CharConstant;
+ else
+ newType = TokenId.IntConstant;
+
+ long value1 = this.value;
+ long value2 = right.value;
+ long newValue;
+ switch (op) {
+ case '+' :
+ newValue = value1 + value2;
+ break;
+ case '-' :
+ newValue = value1 - value2;
+ break;
+ case '*' :
+ newValue = value1 * value2;
+ break;
+ case '/' :
+ newValue = value1 / value2;
+ break;
+ case '%' :
+ newValue = value1 % value2;
+ break;
+ case '|' :
+ newValue = value1 | value2;
+ break;
+ case '^' :
+ newValue = value1 ^ value2;
+ break;
+ case '&' :
+ newValue = value1 & value2;
+ break;
+ case TokenId.LSHIFT :
+ newValue = value << (int)value2;
+ newType = type1;
+ break;
+ case TokenId.RSHIFT :
+ newValue = value >> (int)value2;
+ newType = type1;
+ break;
+ case TokenId.ARSHIFT :
+ newValue = value >>> (int)value2;
+ newType = type1;
+ break;
+ default :
+ return null;
+ }
+
+ return new IntConst(newValue, newType);
+ }
+
+ private DoubleConst compute0(int op, DoubleConst right) {
+ double value1 = (double)this.value;
+ double value2 = right.value;
+ double newValue;
+ switch (op) {
+ case '+' :
+ newValue = value1 + value2;
+ break;
+ case '-' :
+ newValue = value1 - value2;
+ break;
+ case '*' :
+ newValue = value1 * value2;
+ break;
+ case '/' :
+ newValue = value1 / value2;
+ break;
+ case '%' :
+ newValue = value1 % value2;
+ break;
+ default :
+ return null;
+ }
+
+ return new DoubleConst(newValue, right.type);
+ }
}