diff options
Diffstat (limited to 'src/main/javassist/compiler/ast/IntConst.java')
-rw-r--r-- | src/main/javassist/compiler/ast/IntConst.java | 98 |
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); + } } |