ReferenceValueType.java
package edu.udel.cis.vsl.tass.dynamic.impl.type;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ReferenceValueTypeIF;
import edu.udel.cis.vsl.tass.dynamic.IF.type.ValueTypeIF;
public class ReferenceValueType extends ValueType implements
ReferenceValueTypeIF {
/** A complete reference value type */
ReferenceValueType(int instanceId, ValueType baseType) {
super(instanceId, true, new ValueType[] { baseType });
if (baseType == null || baseType.isCommitted())
commit();
}
/** An incomplete reference value type */
ReferenceValueType(int instanceId) {
super(instanceId, false, new ValueType[] { null });
}
/**
* Sets the base type of this pointer type and makes this pointer type
* complete. NOTE: base type is allowed to be null; this is how we represent
* void*; this is still considered to be a complete type.
*/
void setBaseType(ValueType baseType) {
assert !isComplete();
assert !isCommitted();
setChild(0, baseType);
makeComplete();
if (baseType == null || baseType.isCommitted())
commit();
}
public String stringRecursive() {
if (isComplete()) {
if (getFlag())
return "...";
ValueType base = (ValueType) baseType();
setFlag(true);
return "Ref[" + (base == null ? "void" : base.stringRecursive())
+ "]";
} else {
return "IncompleteReferenceValueType";
}
}
@Override
public ValueTypeIF baseType() {
assert isComplete();
return (ValueTypeIF) getChild(0);
}
}