@@ -28,17 +28,22 @@ internal class MethodBinder
28
28
29
29
[ NonSerialized ]
30
30
public bool init = false ;
31
+
31
32
public const bool DefaultAllowThreads = true ;
32
33
public bool allow_threads = DefaultAllowThreads ;
33
34
34
- internal MethodBinder ( )
35
+ public bool args_reversed = false ;
36
+
37
+ internal MethodBinder ( bool reverse_args = false )
35
38
{
36
39
list = new List < MaybeMethodBase > ( ) ;
40
+ args_reversed = reverse_args ;
37
41
}
38
42
39
- internal MethodBinder ( MethodInfo mi )
43
+ internal MethodBinder ( MethodInfo mi , bool reverse_args = false )
40
44
{
41
45
list = new List < MaybeMethodBase > { new MaybeMethodBase ( mi ) } ;
46
+ args_reversed = reverse_args ;
42
47
}
43
48
44
49
public int Count
@@ -271,10 +276,11 @@ internal static int ArgPrecedence(Type t)
271
276
/// <param name="inst">The Python target of the method invocation.</param>
272
277
/// <param name="args">The Python arguments.</param>
273
278
/// <param name="kw">The Python keyword arguments.</param>
279
+ /// <param name="reverse_args">Reverse arguments of methods. Used for methods such as __radd__, __rsub__, __rmod__ etc</param>
274
280
/// <returns>A Binding if successful. Otherwise null.</returns>
275
- internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw )
281
+ internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , bool reverse_args = false )
276
282
{
277
- return Bind ( inst , args , kw , null , null ) ;
283
+ return Bind ( inst , args , kw , null , null , reverse_args ) ;
278
284
}
279
285
280
286
/// <summary>
@@ -287,10 +293,11 @@ internal static int ArgPrecedence(Type t)
287
293
/// <param name="args">The Python arguments.</param>
288
294
/// <param name="kw">The Python keyword arguments.</param>
289
295
/// <param name="info">If not null, only bind to that method.</param>
296
+ /// <param name="reverse_args">Reverse arguments of methods. Used for methods such as __radd__, __rsub__, __rmod__ etc</param>
290
297
/// <returns>A Binding if successful. Otherwise null.</returns>
291
- internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info )
298
+ internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , bool reverse_args = false )
292
299
{
293
- return Bind ( inst , args , kw , info , null ) ;
300
+ return Bind ( inst , args , kw , info , null , reverse_args ) ;
294
301
}
295
302
296
303
private readonly struct MatchedMethod
@@ -334,8 +341,9 @@ public MismatchedMethod(Exception exception, MethodBase mb)
334
341
/// <param name="kw">The Python keyword arguments.</param>
335
342
/// <param name="info">If not null, only bind to that method.</param>
336
343
/// <param name="methodinfo">If not null, additionally attempt to bind to the generic methods in this array by inferring generic type parameters.</param>
344
+ /// <param name="reverse_args">Reverse arguments of methods. Used for methods such as __radd__, __rsub__, __rmod__ etc</param>
337
345
/// <returns>A Binding if successful. Otherwise null.</returns>
338
- internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , MethodBase [ ] ? methodinfo )
346
+ internal Binding ? Bind ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , MethodBase [ ] ? methodinfo , bool reverse_args = false )
339
347
{
340
348
// loop to find match, return invoker w/ or w/o error
341
349
var kwargDict = new Dictionary < string , PyObject > ( ) ;
@@ -363,10 +371,10 @@ public MismatchedMethod(Exception exception, MethodBase mb)
363
371
_methods = GetMethods ( ) ;
364
372
}
365
373
366
- return Bind ( inst , args , kwargDict , _methods , matchGenerics : true ) ;
374
+ return Bind ( inst , args , kwargDict , _methods , matchGenerics : true , reverse_args ) ;
367
375
}
368
376
369
- static Binding ? Bind ( BorrowedReference inst , BorrowedReference args , Dictionary < string , PyObject > kwargDict , MethodBase [ ] methods , bool matchGenerics )
377
+ private static Binding ? Bind ( BorrowedReference inst , BorrowedReference args , Dictionary < string , PyObject > kwargDict , MethodBase [ ] methods , bool matchGenerics , bool reversed = false )
370
378
{
371
379
var pynargs = ( int ) Runtime . PyTuple_Size ( args ) ;
372
380
var isGeneric = false ;
@@ -386,7 +394,7 @@ public MismatchedMethod(Exception exception, MethodBase mb)
386
394
// Binary operator methods will have 2 CLR args but only one Python arg
387
395
// (unary operators will have 1 less each), since Python operator methods are bound.
388
396
isOperator = isOperator && pynargs == pi . Length - 1 ;
389
- bool isReverse = isOperator && OperatorMethod . IsReverse ( ( MethodInfo ) mi ) ; // Only cast if isOperator.
397
+ bool isReverse = isOperator && reversed ; // Only cast if isOperator.
390
398
if ( isReverse && OperatorMethod . IsComparisonOp ( ( MethodInfo ) mi ) )
391
399
continue ; // Comparison operators in Python have no reverse mode.
392
400
if ( ! MatchesArgumentCount ( pynargs , pi , kwargDict , out bool paramsArray , out ArrayList ? defaultArgList , out int kwargsMatched , out int defaultsNeeded ) && ! isOperator )
@@ -809,14 +817,14 @@ static bool MatchesArgumentCount(int positionalArgumentCount, ParameterInfo[] pa
809
817
return match ;
810
818
}
811
819
812
- internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw )
820
+ internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , bool reverse_args = false )
813
821
{
814
- return Invoke ( inst , args , kw , null , null ) ;
822
+ return Invoke ( inst , args , kw , null , null , reverse_args ) ;
815
823
}
816
824
817
- internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info )
825
+ internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , bool reverse_args = false )
818
826
{
819
- return Invoke ( inst , args , kw , info , null ) ;
827
+ return Invoke ( inst , args , kw , info , null , reverse_args = false ) ;
820
828
}
821
829
822
830
protected static void AppendArgumentTypes ( StringBuilder to , BorrowedReference args )
@@ -852,7 +860,7 @@ protected static void AppendArgumentTypes(StringBuilder to, BorrowedReference ar
852
860
to . Append ( ')' ) ;
853
861
}
854
862
855
- internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , MethodBase [ ] ? methodinfo )
863
+ internal virtual NewReference Invoke ( BorrowedReference inst , BorrowedReference args , BorrowedReference kw , MethodBase ? info , MethodBase [ ] ? methodinfo , bool reverse_args = false )
856
864
{
857
865
// No valid methods, nothing to bind.
858
866
if ( GetMethods ( ) . Length == 0 )
@@ -865,7 +873,7 @@ internal virtual NewReference Invoke(BorrowedReference inst, BorrowedReference a
865
873
return Exceptions . RaiseTypeError ( msg . ToString ( ) ) ;
866
874
}
867
875
868
- Binding ? binding = Bind ( inst , args , kw , info , methodinfo ) ;
876
+ Binding ? binding = Bind ( inst , args , kw , info , methodinfo , reverse_args ) ;
869
877
object result ;
870
878
IntPtr ts = IntPtr . Zero ;
871
879
0 commit comments