Axiom.Runtime.Instructions.FCallInstruction.InvokePredicate C# (CSharp) Method

InvokePredicate() private method

private InvokePredicate ( Type type, MethodInfo methodInfo, AMForeignPredicate fp, AbstractMachineState state, Assembly loadedAssembly, ArrayList methodArguments ) : bool
type System.Type
methodInfo System.Reflection.MethodInfo
fp AMForeignPredicate
state AbstractMachineState
loadedAssembly System.Reflection.Assembly
methodArguments System.Collections.ArrayList
return bool
        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;
        }