/// <summary> /// Implement explicit overload selection using subscript syntax ([]). /// </summary> public static NewReference mp_subscript(BorrowedReference tp, BorrowedReference idx) { var self = (OverloadMapper)GetManagedObject(tp) !; // Note: if the type provides a non-generic method with N args // and a generic method that takes N params, then we always // prefer the non-generic version in doing overload selection. Type[]? types = Runtime.PythonArgsToTypeArray(idx); if (types == null) { return(Exceptions.RaiseTypeError("type(s) expected")); } MethodBase?mi = MethodBinder.MatchSignature(self.m.info, types); if (mi == null) { var e = "No match found for signature"; return(Exceptions.RaiseTypeError(e)); } var mb = new MethodBinding(self.m, self.target) { info = mi }; return(mb.Alloc()); }
/// <summary> /// Implement binding of generic methods using the subscript syntax []. /// </summary> public static NewReference mp_subscript(BorrowedReference tp, BorrowedReference idx) { var self = (MethodBinding)GetManagedObject(tp) !; Type[]? types = Runtime.PythonArgsToTypeArray(idx); if (types == null) { return(Exceptions.RaiseTypeError("type(s) expected")); } MethodBase[] overloads = self.m.IsInstanceConstructor ? self.m.type.Value.GetConstructor(types) is { } ctor ? new[] { ctor } : Array.Empty <MethodBase>() : MethodBinder.MatchParameters(self.m.info, types); if (overloads.Length == 0) { return(Exceptions.RaiseTypeError("No match found for given type params")); } MethodObject overloaded = self.m.WithOverloads(overloads); var mb = new MethodBinding(overloaded, self.target, self.targetType); return(mb.Alloc()); }