ScopeStateSimplifier.java
package edu.udel.cis.vsl.tass.state.impl;
import edu.udel.cis.vsl.tass.dynamic.IF.DynamicException;
import edu.udel.cis.vsl.tass.dynamic.IF.DynamicFactoryIF;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.DynamicSimplifierIF;
import edu.udel.cis.vsl.tass.dynamic.IF.simplify.MorphicSimplifierIF;
import edu.udel.cis.vsl.tass.dynamic.IF.value.ValueIF;
import edu.udel.cis.vsl.tass.morph.MorphicArray;
import edu.udel.cis.vsl.tass.state.IF.ScopeStateIF;
public class ScopeStateSimplifier implements MorphicSimplifierIF<ScopeStateIF> {
private ScopeStateFactory scopeStateFactory;
private DynamicFactoryIF dynamicFactory;
public ScopeStateSimplifier(ScopeStateFactory scopeStateFactory) {
this.scopeStateFactory = scopeStateFactory;
this.dynamicFactory = scopeStateFactory.dynamicFactory();
}
@Override
public ScopeStateIF simplify(DynamicSimplifierIF dynamicSimplifier,
ScopeStateIF scopeState) throws DynamicException {
scopeState = scopeStateFactory.canonic(scopeState);
ScopeStateIF result = (ScopeStateIF) dynamicSimplifier
.getCachedResult(scopeState);
if (result != null)
return result;
MorphicArray<ValueIF> oldValues = scopeState.values();
MorphicArray<ValueIF> newValues = dynamicFactory.simplifyValueArray(
dynamicSimplifier, oldValues);
if (newValues == oldValues) {
result = scopeState;
} else {
result = scopeStateFactory
.scopeState(scopeState.scope(), newValues);
result = scopeStateFactory.canonic(result);
}
dynamicSimplifier.cacheResult(scopeState, result);
return result;
}
}