package bsh;
public class
Variable implements java.io.
Serializable
{
static final int
DECLARATION=0,
ASSIGNMENT=1;
/** A null type means an untyped variable */
String name;
Class type = null;
String typeDescriptor;
Object value;
Modifiers modifiers;
LHS lhs;
Variable(
String name,
Class type,
LHS lhs )
{
this.
name =
name;
this.
lhs =
lhs;
this.
type =
type;
}
Variable(
String name,
Object value,
Modifiers modifiers )
throws
UtilEvalError
{
this(
name, (
Class)null/*type*/,
value,
modifiers );
}
/**
This constructor is used in class generation.
*/
Variable(
String name,
String typeDescriptor,
Object value,
Modifiers modifiers
)
throws
UtilEvalError
{
this(
name, (
Class)null/*type*/,
value,
modifiers );
this.
typeDescriptor =
typeDescriptor;
}
/**
@param value may be null if this
*/
Variable(
String name,
Class type,
Object value,
Modifiers modifiers )
throws
UtilEvalError
{
this.
name=
name;
this.
type =
type;
this.
modifiers =
modifiers;
setValue(
value,
DECLARATION );
}
/**
Set the value of the typed variable.
@param value should be an object or wrapped bsh Primitive type.
if value is null the appropriate default value will be set for the
type: e.g. false for boolean, zero for integer types.
*/
public void
setValue(
Object value, int
context )
throws
UtilEvalError
{
// check this.value
if (
hasModifier("final") && this.
value != null )
throw new
UtilEvalError ("Final variable, can't re-assign.");
if (
value == null )
value =
Primitive.
getDefaultValue(
type );
if (
lhs != null )
{
lhs.
assign(
Primitive.
unwrap(
value), false/*strictjava*/ );
return;
}
// TODO: should add isJavaCastable() test for strictJava
// (as opposed to isJavaAssignable())
if (
type != null )
value =
Types.
castObject(
value,
type,
context ==
DECLARATION ?
Types.
CAST :
Types.
ASSIGNMENT
);
this.
value=
value;
}
/*
Note: UtilEvalError here comes from lhs.getValue().
A Variable can represent an LHS for the case of an imported class or
object field.
*/
Object getValue()
throws
UtilEvalError
{
if (
lhs != null )
return
type == null ?
lhs.
getValue() :
Primitive.
wrap(
lhs.
getValue(),
type );
return
value;
}
/** A type of null means loosely typed variable */
public
Class getType() { return
type; }
public
String getTypeDescriptor() { return
typeDescriptor; }
public
Modifiers getModifiers() { return
modifiers; }
public
String getName() { return
name; }
public boolean
hasModifier(
String name ) {
return
modifiers != null &&
modifiers.
hasModifier(
name);
}
public
String toString() {
return "Variable: "+super.toString()+" "+
name+", type:"+
type
+", value:"+
value +", lhs = "+
lhs;
}
}