11using System ;
22using System . Collections ;
33using System . Collections . Concurrent ;
4+ using System . Collections . Generic ;
45using System . Diagnostics ;
56using System . Linq ;
67using System . Reflection ;
@@ -169,16 +170,16 @@ internal MethodBase[] GetMethods()
169170 // I'm sure this could be made more efficient.
170171 list . Sort ( new MethodSorter ( ) ) ;
171172 methods = ( MethodBase [ ] ) list . ToArray ( typeof ( MethodBase ) ) ;
172- pyArgumentConverter = this . GetArgumentConverter ( ) ;
173+ pyArgumentConverter = GetArgumentConverter ( this . methods ) ;
173174 init = true ;
174175 }
175176 return methods ;
176177 }
177178
178- IPyArgumentConverter GetArgumentConverter ( ) {
179+ static IPyArgumentConverter GetArgumentConverter ( IEnumerable < MethodBase > methods ) {
179180 IPyArgumentConverter converter = null ;
180181 Type converterType = null ;
181- foreach ( MethodBase method in this . methods )
182+ foreach ( MethodBase method in methods )
182183 {
183184 PyArgConverterAttribute attribute = TryGetArgConverter ( method . DeclaringType ) ;
184185 if ( converterType == null )
@@ -344,14 +345,17 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
344345
345346 var pynargs = ( int ) Runtime . PyTuple_Size ( args ) ;
346347 var isGeneric = false ;
348+ IPyArgumentConverter argumentConverter ;
347349 if ( info != null )
348350 {
349351 _methods = new MethodBase [ 1 ] ;
350352 _methods . SetValue ( info , 0 ) ;
353+ argumentConverter = GetArgumentConverter ( _methods ) ;
351354 }
352355 else
353356 {
354357 _methods = GetMethods ( ) ;
358+ argumentConverter = this . pyArgumentConverter ;
355359 }
356360
357361 // TODO: Clean up
@@ -370,7 +374,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
370374 continue ;
371375 }
372376 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 ,
374379 needsResolution : _methods . Length > 1 ,
375380 outs : out outs ) ;
376381
@@ -426,7 +431,8 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth
426431 /// <param name="needsResolution"><c>true</c>, if overloading resolution is required</param>
427432 /// <param name="outs">Returns number of output parameters</param>
428433 /// <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 ,
430436 IntPtr args , int pyArgCount ,
431437 Dictionary < string , IntPtr > kwargDict ,
432438 ArrayList defaultArgList ,
@@ -467,7 +473,7 @@ o
6668
bject[] TryConvertArguments(ParameterInfo[] pi, bool paramsArray,
467473 }
468474
469475 bool isOut ;
470- if ( ! this . pyArgumentConverter . TryConvertArgument (
476+ if ( ! argumentConverter . TryConvertArgument (
471477 op , parameter . ParameterType , needsResolution ,
472478 out margs [ paramIndex ] , out isOut ) )
473479 {
0 commit comments