private bool InvokeForeignPredicate(Type type, MethodInfo methodInfo, AMForeignPredicate fp, Assembly loadedAssembly, AbstractMachineState state)
{
int registerIndex = 0;
ArrayList methodArguments = new ArrayList();
foreach (AMForeignPredicateArgument arg in fp.Arguments)
{
AbstractTerm term = ((AbstractTerm)state["X" + registerIndex.ToString()]).Dereference();
switch (arg.Type)
{
case AMForeignPredicateArgument.T_BOOL:
bool bResult = false;
if (!Boolean.TryParse(term.Data().ToString(), out bResult))
{
return false;
}
methodArguments.Add(System.Boolean.Parse(term.Data().ToString()));
break;
case AMForeignPredicateArgument.T_CHAR:
if (term.Data() == null)
{
return false;
}
methodArguments.Add(Convert.ToChar(term.Data()));
break;
case AMForeignPredicateArgument.T_DOUBLE:
case AMForeignPredicateArgument.T_FLOAT:
case AMForeignPredicateArgument.T_INTEGER:
int iResult = 0;
if (!Int32.TryParse(term.Data().ToString(), out iResult))
{
return false;
}
methodArguments.Add(Int32.Parse(term.Data().ToString()));
break;
case AMForeignPredicateArgument.T_STRING:
methodArguments.Add(term.Data().ToString());
break;
case AMForeignPredicateArgument.T_TERM:
methodArguments.Add(term);
break;
}
registerIndex++;
}
return InvokePredicate(type, methodInfo, fp, state, loadedAssembly, methodArguments);
}