/*
* 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);
}
}