コード例 #1
0
ファイル: BindingTarget.cs プロジェクト: tnachen/ironruby
 /// <summary>
 /// Creates a new BindingTarget when the method binding has succeeded.
 /// </summary>
 internal BindingTarget(string name, int actualArgumentCount, MethodTarget target, NarrowingLevel level, RestrictionInfo restrictedArgs) {
     _name = name;
     _target = target;
     _restrictedArgs = restrictedArgs;
     _level = level;
     _actualArgs = actualArgumentCount;
 }
コード例 #2
0
        internal static Candidate GetPreferredCandidate(MethodCandidate one, MethodCandidate two, CallTypes callType, MetaObject[] actualTypes)
        {
            Candidate cmpParams = ParameterWrapper.GetPreferredParameters(one.Parameters, two.Parameters, actualTypes);

            if (cmpParams.Chosen())
            {
                return(cmpParams);
            }

            Candidate ret = MethodTarget.CompareEquivalentParameters(one.Target, two.Target);

            if (ret.Chosen())
            {
                return(ret);
            }

            if (CompilerHelpers.IsStatic(one.Target.Method) && !CompilerHelpers.IsStatic(two.Target.Method))
            {
                return(callType == CallTypes.ImplicitInstance ? Candidate.Two : Candidate.One);
            }
            else if (!CompilerHelpers.IsStatic(one.Target.Method) && CompilerHelpers.IsStatic(two.Target.Method))
            {
                return(callType == CallTypes.ImplicitInstance ? Candidate.One : Candidate.Two);
            }

            return(Candidate.Equivalent);
        }
コード例 #3
0
ファイル: BindingTarget.cs プロジェクト: tnachen/ironruby
        private readonly int _actualArgs;                                                 // gets the actual number of arguments provided

        /// <summary>
        /// Creates a new BindingTarget when the method binding has succeeded.
        /// 
        /// OBSOLETE
        /// </summary>
        internal BindingTarget(string name, int actualArgumentCount, MethodTarget target, NarrowingLevel level, Type[] argTests) {
            _name = name;
            _target = target;
            _argTests = argTests;
            _level = level;
            _actualArgs = actualArgumentCount;
        }
コード例 #4
0
 /// <summary>
 /// Creates a new BindingTarget when the method binding has succeeded
 /// </summary>
 internal BindingTarget(string name, int actualArgumentCount, MethodTarget target, NarrowingLevel level, MetaObject[] restrictedArgs)
 {
     _name           = name;
     _target         = target;
     _restrictedArgs = restrictedArgs;
     _level          = level;
     _actualArgs     = actualArgumentCount;
 }
コード例 #5
0
        private readonly int _actualArgs;                                                 // gets the actual number of arguments provided

        /// <summary>
        /// Creates a new BindingTarget when the method binding has succeeded
        /// </summary>
        internal BindingTarget(string name, int actualArgumentCount, MethodTarget target, NarrowingLevel level, Type[] argTests)
        {
            _name       = name;
            _target     = target;
            _argTests   = argTests;
            _level      = level;
            _actualArgs = actualArgumentCount;
        }
コード例 #6
0
        internal static Candidate CompareEquivalentParameters(MethodTarget one, MethodTarget two)
        {
            // Prefer normal methods over explicit interface implementations
            if (two.Method.IsPrivate && !one.Method.IsPrivate)
            {
                return(Candidate.One);
            }
            if (one.Method.IsPrivate && !two.Method.IsPrivate)
            {
                return(Candidate.Two);
            }

            // Prefer non-generic methods over generic methods
            if (one.Method.IsGenericMethod)
            {
                if (!two.Method.IsGenericMethod)
                {
                    return(Candidate.Two);
                }
                else
                {
                    //!!! Need to support selecting least generic method here
                    return(Candidate.Equivalent);
                }
            }
            else if (two.Method.IsGenericMethod)
            {
                return(Candidate.One);
            }

            //prefer methods without out params over those with them
            switch (Compare(one._returnBuilder.CountOutParams, two._returnBuilder.CountOutParams))
            {
            case 1: return(Candidate.Two);

            case -1: return(Candidate.One);
            }

            //prefer methods using earlier conversions rules to later ones
            for (int i = Int32.MaxValue; i >= 0;)
            {
                int maxPriorityThis  = FindMaxPriority(one._argBuilders, i);
                int maxPriorityOther = FindMaxPriority(two._argBuilders, i);

                if (maxPriorityThis < maxPriorityOther)
                {
                    return(Candidate.One);
                }
                if (maxPriorityOther < maxPriorityThis)
                {
                    return(Candidate.Two);
                }

                i = maxPriorityThis - 1;
            }

            return(Candidate.Equivalent);
        }
コード例 #7
0
        internal MethodCandidate(MethodTarget target, List <ParameterWrapper> parameters)
        {
            Debug.Assert(target != null);

            _target         = target;
            _parameters     = parameters;
            _narrowingLevel = NarrowingLevel.None;
            parameters.TrimExcess();
        }
コード例 #8
0
 internal CallFailure(MethodTarget target, SymbolId[] keywordArgs, bool unassignable)
 {
     _reason      = unassignable ? CallFailureReason.UnassignableKeyword : CallFailureReason.DuplicateKeyword;
     _target      = target;
     _keywordArgs = keywordArgs;
 }
コード例 #9
0
 internal CallFailure(MethodTarget target, ConversionResult[] results)
 {
     _target  = target;
     _results = results;
     _reason  = CallFailureReason.ConversionFailure;
 }
コード例 #10
0
ファイル: CallFailure.cs プロジェクト: jxnmaomao/ironruby
 internal CallFailure(MethodTarget target, string[] keywordArgs, bool unassignable) {
     _reason = unassignable ? CallFailureReason.UnassignableKeyword : CallFailureReason.DuplicateKeyword;
     _target = target;
     _keywordArgs = keywordArgs;
 }
コード例 #11
0
ファイル: CallFailure.cs プロジェクト: jxnmaomao/ironruby
 internal CallFailure(MethodTarget target, ConversionResult[] results) {
     _target = target;
     _results = results;
     _reason = CallFailureReason.ConversionFailure;
 }
コード例 #12
0
ファイル: BindingTarget.cs プロジェクト: tnachen/ironruby
 /// <summary>
 /// Creates a new BindingTarget when the match was ambiguous
 /// </summary>
 internal BindingTarget(string name, int actualArgumentCount, MethodTarget[] ambiguousMatches) {
     _name = name;
     _result = BindingResult.AmbiguousMatch;
     _ambiguousMatches = ambiguousMatches;
     _actualArgs = actualArgumentCount;
 }
コード例 #13
0
 internal MethodCandidate(MethodCandidate previous, NarrowingLevel narrowingLevel)
 {
     this._target     = previous.Target;
     this._parameters = previous._parameters;
     _narrowingLevel  = narrowingLevel;
 }