示例#1
0
        /// <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());
        }
示例#2
0
        /// <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());
        }