package org.overture.interpreter.assistant.definition;
import java.util.HashMap;
import java.util.List;
import org.overture.ast.assistant.IAstAssistant;
import org.overture.ast.assistant.pattern.PTypeList;
import org.overture.ast.definitions.AExplicitFunctionDefinition;
import org.overture.ast.types.PType;
import org.overture.interpreter.assistant.IInterpreterAssistantFactory;
import org.overture.interpreter.runtime.VdmRuntime;
import org.overture.interpreter.runtime.state.AExplicitFunctionDefinitionRuntimeState;
import org.overture.interpreter.values.FunctionValue;
import org.overture.typechecker.assistant.definition.AExplicitFunctionDefinitionAssistantTC;
public class AExplicitFunctionDefinitionAssistantInterpreter extends
AExplicitFunctionDefinitionAssistantTC implements IAstAssistant
{
protected static IInterpreterAssistantFactory af;
@SuppressWarnings("static-access")
public AExplicitFunctionDefinitionAssistantInterpreter(
IInterpreterAssistantFactory af)
{
super(af);
this.af = af;
}
public FunctionValue getPolymorphicValue(IInterpreterAssistantFactory af,
AExplicitFunctionDefinition expdef, PTypeList actualTypes)
{
AExplicitFunctionDefinitionRuntimeState state = VdmRuntime.getNodeState(expdef);
if (state.polyfuncs == null)
{
state.polyfuncs = new HashMap<List<PType>, FunctionValue>();
} else
{
// We always return the same function value for a polymorph
// with a given set of types. This is so that the one function
// value can record measure counts for recursive polymorphic
// functions.
FunctionValue rv = state.polyfuncs.get(actualTypes);
if (rv != null)
{
return rv;
}
}
FunctionValue prefv = null;
FunctionValue postfv = null;
if (expdef.getPredef() != null)
{
prefv = getPolymorphicValue(af, expdef.getPredef(), actualTypes);
} else
{
prefv = null;
}
if (expdef.getPostdef() != null)
{
postfv = getPolymorphicValue(af, expdef.getPostdef(), actualTypes);
} else
{
postfv = null;
}
FunctionValue rv = new FunctionValue(af, expdef, actualTypes, prefv, postfv, null);
state.polyfuncs.put(actualTypes, rv);
return rv;
}
}