private bool InvokePredicate(Type type, MethodInfo methodInfo, AMForeignPredicate fp, AbstractMachineState state, Assembly loadedAssembly, ArrayList methodArguments)
{
object[] arguments = methodArguments.ToArray();
object returnedResult = null;
object baseObject = null;
baseObject = Activator.CreateInstance(type);
returnedResult = type.InvokeMember(_methodName,
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
baseObject,
arguments);
int registerIndex = 0;
foreach (AMForeignPredicateArgument fArgument in fp.Arguments)
{
if (fArgument.PassingType == AMForeignPredicateArgument.PASS_OUT ||
fArgument.PassingType == AMForeignPredicateArgument.PASS_INOUT)
{
AbstractTerm term = ((AbstractTerm)state["X" + registerIndex.ToString()]).Dereference();
if (fArgument.Type == AMForeignPredicateArgument.T_TERM)
{
ConstantTerm argumentVariable = new ConstantTerm(arguments[registerIndex]);
term.Assign(argumentVariable);
}
else
{
if (fArgument.Type == AMForeignPredicateArgument.T_STRING)
{
if (term.IsReference)
{
term.Assign(new ConstantTerm(arguments[registerIndex]));
}
}
}
registerIndex++;
}
}
bool returnValue = false;
if (fp.ReturnType == AMForeignPredicate.R_BOOL)
{
if (returnedResult == null)
{
return true;
}
else
{
returnValue = (bool)returnedResult;
}
}
return returnValue;
}