internal static MethodInfo MatchByTypeSig(MethodInfo[] msig,
IntPtr psig) {
IntPtr args = psig;
bool free = false;
if (!Runtime.PyTuple_Check(psig)) {
args = Runtime.PyTuple_New(1);
Runtime.Incref(psig);
Runtime.PyTuple_SetItem(args, 0, psig);
free = true;
}
int plen = Runtime.PyTuple_Size(args);
MethodInfo match = null;
// XXX: what about out args, etc.?
for (int i = 0; i < msig.Length; i++) {
ParameterInfo[] pi = msig[i].GetParameters();
if (pi.Length != plen) {
continue;
}
bool matched = true;
for (int n = 0; n < pi.Length; n++) {
IntPtr p = Runtime.PyTuple_GetItem(args, n);
if (p == IntPtr.Zero) {
Exceptions.Clear();
break;
}
ClassBase c = ManagedType.GetManagedObject(p) as ClassBase;
Type t = (c != null) ? c.type :
Converter.GetTypeByAlias(p);
if (t == null) {
break;
}
if (t != pi[n].ParameterType) {
matched = false;
break;
}
}
if (matched) {
match = msig[i];
break;
}
}
if (free) {
Runtime.Decref(args);
}
return match;
}