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