private bool InvokeMethod(AbstractTerm obj, AbstractTerm method, AbstractTerm returnObject, AbstractMachineState state)
{
if (obj.IsConstant)
{
// invoke a static method
Assembly asm = GetRequiredAssembly(obj.Data() as string, state);
Type type = asm.GetType(obj.Data() as string);
if (type == null)
{
return false;
}
ArrayList paramArray = new ArrayList();
GetTypes(type.GetMethod(method.Data() as string), method, ref paramArray, obj);
object[] arguments = paramArray.ToArray();
object res = type.InvokeMember(method.Data() as string, BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, arguments);
switch (res.GetType().ToString())
{
case "System.Char":
case "System.String":
case "System.Int32":
case "System.Boolean":
returnObject.Assign(new ConstantTerm(res.ToString()));
break;
default:
returnObject.Assign(new ObjectTerm(res));
break;
}
SetTypes(method, arguments);
}
else
{
// invoke an instance method
ArrayList paramArray = new ArrayList();
GetTypes(obj.Data().GetType().GetMethod(method.Data() as string), method, ref paramArray, obj);
object classObject = obj.Data();
MethodInfo omi = classObject.GetType().GetMethod(method.Data() as string);
object[] arguments = paramArray.ToArray();
object res = obj.Data().GetType().InvokeMember(method.Data() as string, BindingFlags.Default | BindingFlags.ExactBinding | BindingFlags.InvokeMethod, null, obj.Data(), arguments);
if (res != null)
{
switch (res.GetType().ToString())
{
case "System.String":
ConstantTerm rC = new ConstantTerm(res.ToString());
if (!returnObject.Unify(rC))
{
return false;
}
break;
case "System.Char":
case "System.Int32":
case "System.Boolean":
ConstantTerm returnConstant = new ConstantTerm(res.ToString());
if (!returnObject.Unify(returnConstant))
{
return false;
}
break;
default:
returnObject.Assign(new ObjectTerm(res));
break;
}
}
SetTypes(method, arguments);
}
return true;
}