1
1
using System ;
2
2
using System . Collections ;
3
3
using System . Collections . Concurrent ;
4
+ using System . Collections . Generic ;
4
5
using System . Diagnostics ;
5
6
using System . Linq ;
6
7
using System . Reflection ;
@@ -169,16 +170,16 @@ internal MethodBase[] GetMethods()
169
170
// I'm sure this could be made more efficient.
170
171
list . Sort ( new MethodSorter ( ) ) ;
171
172
methods = ( MethodBase [ ] ) list . ToArray ( typeof ( MethodBase ) ) ;
172
- pyArgumentConverter = this . GetArgumentConverter ( ) ;
173
+ pyArgumentConverter = GetArgumentConverter ( this . methods ) ;
173
174
init = true ;
174
175
}
175
176
return methods ;
176
177
}
177
178
178
- IPyArgumentConverter GetArgumentConverter ( ) {
179
+ static IPyArgumentConverter GetArgumentConverter ( IEnumerable < MethodBase > methods ) {
179
180
IPyArgumentConverter converter = null ;
180
181
Type converterType = null ;
181
- foreach ( MethodBase method in this . methods )
182
+ foreach ( MethodBase method in methods )
182
183
{
183
184
PyArgConverterAttribute attribute = TryGetArgConverter ( method . DeclaringType ) ;
184
185
if ( converterType == null )
@@ -344,14 +345,17 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
344
345
345
346
var pynargs = ( int ) Runtime . PyTuple_Size ( args ) ;
346
347
var isGeneric = false ;
348
+ IPyArgumentConverter argumentConverter ;
347
349
if ( info != null )
348
350
{
349
351
_methods = new MethodBase [ 1 ] ;
350
352
_methods . SetValue ( info , 0 ) ;
353
+ argumentConverter = GetArgumentConverter ( _methods ) ;
351
354
}
352
355
else
353
356
{
354
357
_methods = GetMethods ( ) ;
358
+ argumentConverter = this . pyArgumentConverter ;
355
359
}
356
360
357
361
// TODO: Clean up
@@ -370,7 +374,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
370
374
continue ;
371
375
}
372
376
var outs = 0 ;
373
- var margs = this . TryConvertArguments ( pi , paramsArray , args , pynargs , kwargDict , defaultArgList ,
377
+ var margs = TryConvertArguments ( pi , paramsArray , argumentConverter ,
378
+ args , pynargs , kwargDict , defaultArgList ,
374
379
needsResolution : _methods . Length > 1 ,
375
380
outs : out outs ) ;
376
381
@@ -426,7 +431,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
426
431
/// <param name="needsResolution"><c>true</c>, if overloading resolution is required</param>
427
432
/// <param name="outs">Returns number of output parameters</param>
428
433
/// <returns>An array of .NET arguments, that can be passed to a method.</returns>
429
- object [ ] TryConvertArguments ( ParameterInfo [ ] pi , bool paramsArray ,
434
+ static object [ ] TryConvertArguments ( ParameterInfo [ ] pi , bool paramsArray ,
435
+ IPyArgumentConverter argumentConverter ,
430
436
IntPtr args , int pyArgCount ,
431
437
Dictionary < string , IntPtr > kwargDict ,
432
438
ArrayList defaultArgList ,
@@ -467,7 +473,7 @@ object[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
467
473
}
468
474
469
475
bool isOut ;
470
- if ( ! this . pyArgumentConverter . TryConvertArgument (
476
+ if ( ! argumentConverter . TryConvertArgument (
471
477
op , parameter . ParameterType , needsResolution ,
472
478
out margs [ paramIndex ] , out isOut ) )
473
479
{
0 commit comments