169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/* 269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit. 369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. 469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version 669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with 769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License. Alternatively, the contents of this file may be used under 869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later. 969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis, 1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the 1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License. 1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist.compiler.ast; 1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.CompileError; 1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.compiler.TokenId; 2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/** 2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Double constant. 2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class DoubleConst extends ASTree { 2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected double value; 2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal protected int type; 2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public DoubleConst(double v, int tokenId) { value = v; type = tokenId; } 2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public double get() { return value; } 3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void set(double v) { value = v; } 3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal /* Returns DoubleConstant or FloatConstant 3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */ 3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public int getType() { return type; } 3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public String toString() { return Double.toString(value); } 3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public void accept(Visitor v) throws CompileError { 4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal v.atDoubleConst(this); 4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal public ASTree compute(int op, ASTree right) { 4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (right instanceof IntConst) 4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return compute0(op, (IntConst)right); 4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else if (right instanceof DoubleConst) 4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return compute0(op, (DoubleConst)right); 4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private DoubleConst compute0(int op, DoubleConst right) { 5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int newType; 5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal if (this.type == TokenId.DoubleConstant 5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal || right.type == TokenId.DoubleConstant) 5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newType = TokenId.DoubleConstant; 5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal else 5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newType = TokenId.FloatConstant; 6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return compute(op, this.value, right.value, newType); 6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private DoubleConst compute0(int op, IntConst right) { 6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return compute(op, this.value, (double)right.value, this.type); 6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal private static DoubleConst compute(int op, double value1, double value2, 6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal int newType) 7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal { 7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal double newValue; 7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal switch (op) { 7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal case '+' : 7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newValue = value1 + value2; 7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal case '-' : 7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newValue = value1 - value2; 7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal case '*' : 8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newValue = value1 * value2; 8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal case '/' : 8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newValue = value1 / value2; 8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal case '%' : 8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal newValue = value1 % value2; 8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal break; 8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal default : 8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return null; 9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal 9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal return new DoubleConst(newValue, newType); 9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal } 9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal} 95