Frame.java
package edu.udel.cis.vsl.tass.state.impl;
import edu.udel.cis.vsl.tass.model.IF.FunctionIF;
import edu.udel.cis.vsl.tass.model.IF.location.LocationIF;
import edu.udel.cis.vsl.tass.morph.Morphic;
import edu.udel.cis.vsl.tass.morph.MorphicObject;
import edu.udel.cis.vsl.tass.morph.MorphicVector;
import edu.udel.cis.vsl.tass.morph.MorphicVectorFactory;
import edu.udel.cis.vsl.tass.state.IF.FrameIF;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;
public class Frame extends MorphicObject implements FrameIF {
private LocationIF location;
private MorphicVector<ScopeStateIF> scopeStates;
public Frame(LocationIF location, MorphicVector<ScopeStateIF> scopeStates) {
assert location != null;
this.location = location;
assert scopeStates != null;
this.scopeStates = scopeStates;
}
@Override
public MorphicVector<ScopeStateIF> scopeStates() {
return scopeStates;
}
public void setScopeStates(MorphicVector<ScopeStateIF> scopeStates) {
assert !isCommitted();
this.scopeStates = scopeStates;
}
public void push(ScopeStateIF scopeState) {
scopeStates.push(scopeState);
}
public ScopeStateIF pop() {
return scopeStates.pop();
}
public int numScopes() {
return scopeStates.size();
}
public ScopeStateIF scopeState(int index) {
return scopeStates.get(index);
}
public ScopeStateIF peek() {
return scopeStates.peek();
}
@Override
public LocationIF location() {
return location;
}
public void setLocation(LocationIF location) {
assert !isCommitted();
this.location = location;
}
@Override
public FunctionIF function() {
return location.function();
}
@Override
protected boolean computeEquals(Morphic component) {
if (this == component)
return true;
if (component instanceof Frame) {
Frame that = (Frame) component;
return location.equals(that.location)
&& scopeStates.equals(that.scopeStates);
}
return false;
}
@Override
protected int computeHashCode() {
return location.hashCode() + scopeStates.hashCode();
}
void canonicalizeChildren(MorphicVectorFactory<ScopeStateIF> vectorFactory) {
scopeStates = vectorFactory.canonic(scopeStates);
}
@Override
protected void commitChildren() {
scopeStates.commit();
}
}