/* * Javassist, a Java-bytecode translator toolkit. * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved. * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. Alternatively, the contents of this file may be used under * the terms of the GNU Lesser General Public License Version 2.1 or later. * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. */ package javassist.compiler.ast; import javassist.compiler.CompileError; import javassist.compiler.TokenId; /** * Double constant. */ public class DoubleConst extends ASTree { protected double value; protected int type; public DoubleConst(double v, int tokenId) { value = v; type = tokenId; } public double get() { return value; } public void set(double v) { value = v; } /* Returns DoubleConstant or FloatConstant */ public int getType() { return type; } public String toString() { return Double.toString(value); } public void accept(Visitor v) throws CompileError { v.atDoubleConst(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 DoubleConst compute0(int op, DoubleConst right) { int newType; if (this.type == TokenId.DoubleConstant || right.type == TokenId.DoubleConstant) newType = TokenId.DoubleConstant; else newType = TokenId.FloatConstant; return compute(op, this.value, right.value, newType); } private DoubleConst compute0(int op, IntConst right) { return compute(op, this.value, (double)right.value, this.type); } private static DoubleConst compute(int op, double value1, double value2, int newType) { 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, newType); } }