@@ -529,6 +529,37 @@ static NewReference tp_call_impl(BorrowedReference ob, BorrowedReference args, B
529
529
return callBinder . Invoke ( ob , args , kw ) ;
530
530
}
531
531
532
+ static NewReference DoConvert ( BorrowedReference ob )
533
+ {
534
+ var self = ( CLRObject ) GetManagedObject ( ob ) ! ;
535
+ using var python = self . inst . ToPython ( ) ;
536
+ return python . NewReferenceOrNull ( ) ;
537
+ }
538
+
539
+ static NewReference DoConvertInt ( BorrowedReference ob )
540
+ {
541
+ var self = ( CLRObject ) GetManagedObject ( ob ) ! ;
542
+ return Runtime . PyLong_FromLongLong ( Convert . ToInt64 ( self . inst ) ) ;
543
+ }
544
+
545
+ static NewReference DoConvertUInt ( BorrowedReference ob )
546
+ {
547
+ var self = ( CLRObject ) GetManagedObject ( ob ) ! ;
548
+ return Runtime . PyLong_FromUnsignedLongLong ( Convert . ToUInt64 ( self . inst ) ) ;
549
+ }
550
+
551
+ static NewReference DoConvertBooleanInt ( BorrowedReference ob )
552
+ {
553
+ var self = ( CLRObject ) GetManagedObject ( ob ) ! ;
554
+ return Runtime . PyInt_FromInt32 ( ( bool ) self . inst ? 1 : 0 ) ;
555
+ }
556
+
557
+ static NewReference DoConvertFloat ( BorrowedReference ob )
558
+ {
559
+ var self = ( CLRObject ) GetManagedObject ( ob ) ! ;
560
+ return Runtime . PyFloat_FromDouble ( Convert . ToDouble ( self . inst ) ) ;
561
+ }
562
+
532
563
static IEnumerable < MethodInfo > GetCallImplementations ( Type type )
533
564
=> type . GetMethods ( BindingFlags . Public | BindingFlags . Instance )
534
565
. Where ( m => m . Name == "__call__" ) ;
@@ -564,6 +595,29 @@ public virtual void InitializeSlots(BorrowedReference pyType, SlotsHolder slotsH
564
595
{
565
596
TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . mp_length , new Interop . B_P ( MpLengthSlot . impl ) , slotsHolder ) ;
566
597
}
598
+
599
+ switch ( Type . GetTypeCode ( type . Value ) )
600
+ {
601
+ case TypeCode . Boolean :
602
+ case TypeCode . SByte :
603
+ case TypeCode . Int16 :
604
+ case TypeCode . Int32 :
605
+ case TypeCode . Int64 :
606
+ TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . nb_int , new Interop . B_N ( DoConvertInt ) , slotsHolder ) ;
607
+ TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . nb_float , new Interop . B_N ( DoConvertFloat ) , slotsHolder ) ;
608
+ break ;
609
+ case TypeCode . Byte :
610
+ case TypeCode . UInt16 :
611
+ case TypeCode . UInt32 :
612
+ case TypeCode . UInt64 :
613
+ TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . nb_int , new Interop . B_N ( DoConvertUInt ) , slotsHolder ) ;
614
+ TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . nb_float , new Interop . B_N ( DoConvertFloat ) , slotsHolder ) ;
615
+ break ;
616
+ case TypeCode . Double :
617
+ case TypeCode . Single :
618
+ TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . nb_float , new Interop . B_N ( DoConvertFloat ) , slotsHolder ) ;
619
+ break ;
620
+ }
567
621
}
568
622
569
623
public virtual bool HasCustomNew ( ) => this . GetType ( ) . GetMethod ( "tp_new" ) is not null ;
0 commit comments