1
1
using System ;
2
- using System . Collections ;
3
2
using System . Reflection ;
4
3
using System . Text ;
5
4
using System . Collections . Generic ;
@@ -16,29 +15,25 @@ namespace Python.Runtime
16
15
[ Serializable ]
17
16
internal class MethodBinder
18
17
{
19
- public ArrayList list ;
20
- public MethodBase [ ] methods ;
18
+ readonly List < MethodBase > methods = new List < MethodBase > ( ) ;
21
19
public bool init = false ;
22
20
public bool allow_threads = true ;
23
21
24
- internal MethodBinder ( )
25
- {
26
- list = new ArrayList ( ) ;
27
- }
22
+ internal MethodBinder ( ) { }
28
23
29
24
internal MethodBinder ( MethodInfo mi )
30
25
{
31
- list = new ArrayList { mi } ;
26
+ this . methods . Add ( mi ) ;
32
27
}
33
28
34
29
public int Count
35
30
{
36
- get { return list . Count ; }
31
+ get { return this . methods . Count ; }
37
32
}
38
33
39
34
internal void AddMethod ( MethodBase m )
40
35
{
41
- list . Add ( m ) ;
36
+ this . methods . Add ( m ) ;
42
37
}
43
38
44
39
/// <summary>
@@ -158,13 +153,12 @@ internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] g
158
153
/// is arranged in order of precedence (done lazily to avoid doing it
159
154
/// at all for methods that are never called).
160
155
/// </summary>
161
- internal MethodBase [ ] GetMethods ( )
156
+ internal List < MethodBase > GetMethods ( )
162
157
{
163
158
if ( ! init )
164
159
{
165
160
// I'm sure this could be made more efficient.
166
- list . Sort ( new MethodSorter ( ) ) ;
167
- methods = ( MethodBase [ ] ) list . ToArray ( typeof ( MethodBase ) ) ;
161
+ this . methods . Sort ( new MethodSorter ( ) ) ;
168
162
init = true ;
169
163
}
170
164
return methods ;
@@ -281,9 +275,6 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info)
281
275
282
276
internal Binding Bind ( IntPtr inst , IntPtr args , IntPtr kw , MethodBase info , MethodInfo [ ] methodinfo )
283
277
{
284
- // loop to find match, return invoker w/ or /wo error
285
- MethodBase [ ] _methods = null ;
286
-
287
278
var kwargDict = new Dictionary < string , IntPtr > ( ) ;
288
279
if ( kw != IntPtr . Zero )
289
280
{
@@ -301,15 +292,9 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
301
292
302
293
var pynargs = ( int ) Runtime . PyTuple_Size ( args ) ;
303
294
var isGeneric = false ;
304
- if ( info != null )
305
- {
306
- _methods = new MethodBase [ 1 ] ;
307
- _methods . SetValue ( info , 0 ) ;
308
- }
309
- else
310
- {
311
- _methods = GetMethods ( ) ;
312
- }
295
+
296
+ // loop to find match, return invoker w/ or /wo error
297
+ List < MethodBase > _methods = info != null ? new List < MethodBase > { info } : GetMethods ( ) ;
313
298
314
299
// TODO: Clean up
315
300
foreach ( MethodBase mi in _methods )
@@ -319,16 +304,15 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
319
304
isGeneric = true ;
320
305
}
321
306
ParameterInfo [ ] pi = mi . GetParameters ( ) ;
322
- ArrayList defaultArgList ;
323
307
bool paramsArray ;
324
308
325
- if ( ! MatchesArgumentCount ( pynargs , pi , kwargDict , out paramsArray , out defaultArgList ) )
309
+ if ( ! MatchesArgumentCount ( pynargs , pi , kwargDict , out paramsArray , out var defaultArgList ) )
326
310
{
327
311
continue ;
328
312
}
329
313
var outs = 0 ;
330
314
var margs = TryConvertArguments ( pi , paramsArray , args , pynargs , kwargDict , defaultArgList ,
331
- needsResolution : _methods . Length > 1 ,
315
+ needsResolution : _methods . Count > 1 ,
332
316
outs : out outs ) ;
333
317
334
318
if ( margs == null )
@@ -417,7 +401,7 @@ static IntPtr HandleParamsArray(IntPtr args, int arrayStart, int pyArgCount, out
417
401
static object [ ] TryConvertArguments ( ParameterInfo [ ] pi , bool paramsArray ,
418
402
IntPtr args , int pyArgCount ,
419
403
Dictionary < string , IntPtr > kwargDict ,
420
- ArrayList defaultArgList ,
404
+ List < object > defaultArgList ,
421
405
bool needsResolution ,
422
406
out int outs )
423
407
{
@@ -575,7 +559,7 @@ static Type TryComputeClrArgumentType(Type parameterType, IntPtr argument, bool
575
559
static bool MatchesArgumentCount ( int positionalArgumentCount , ParameterInfo [ ] parameters ,
576
560
Dictionary < string , IntPtr > kwargDict ,
577
561
out bool paramsArray ,
578
- out ArrayList defaultArgList )
562
+ out List < object > defaultArgList )
579
563
{
580
564
defaultArgList = null ;
581
565
var match = false ;
@@ -590,7 +574,7 @@ static bool MatchesArgumentCount(int positionalArgumentCount, ParameterInfo[] pa
590
574
// every parameter past 'positionalArgumentCount' must have either
591
575
// a corresponding keyword argument or a default parameter
592
576
match = true ;
593
- defaultArgList = new ArrayList ( ) ;
577
+ defaultArgList = new List < object > ( ) ;
594
578
for ( var v = positionalArgumentCount ; v < parameters . Length ; v ++ )
595
579
{
596
580
if ( kwargDict . ContainsKey ( parameters [ v ] . Name ) )
@@ -770,12 +754,10 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i
770
754
/// <summary>
771
755
/// Utility class to sort method info by parameter type precedence.
772
756
/// </summary>
773
- internal class MethodSorter : IComparer
757
+ internal class MethodSorter : IComparer < MethodBase >
774
758
{
775
- int IComparer . Compare ( object m1 , object m2 )
759
+ int IComparer < MethodBase > . Compare ( MethodBase me1 , MethodBase me2 )
776
760
{
777
- var me1 = ( MethodBase ) m1 ;
778
- var me2 = ( MethodBase ) m2 ;
779
761
if ( me1 . DeclaringType != me2 . DeclaringType )
780
762
{
781
763
// m2's type derives from m1's type, favor m2
@@ -787,17 +769,9 @@ int IComparer.Compare(object m1, object m2)
787
769
return - 1 ;
788
770
}
789
771
790
- int p1 = MethodBinder . GetPrecedence ( ( MethodBase ) m1 ) ;
791
- int p2 = MethodBinder . GetPrecedence ( ( MethodBase ) m2 ) ;
792
- if ( p1 < p2 )
793
- {
794
- return - 1 ;
795
- }
796
- if ( p1 > p2 )
797
- {
798
- return 1 ;
799
- }
800
- return 0 ;
772
+ int p1 = MethodBinder . GetPrecedence ( me1 ) ;
773
+ int p2 = MethodBinder . GetPrecedence ( me2 ) ;
774
+ return p1 . CompareTo ( p2 ) ;
801
775
}
802
776
}
803
777
0 commit comments