@@ -529,6 +529,37 @@ static NewReference tp_call_impl(BorrowedReference ob, BorrowedReference args, B
529529 return callBinder . Invoke ( ob , args , kw ) ;
530530 }
531531
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+
532563 static IEnumerable < MethodInfo > GetCallImplementations ( Type type )
533564 => type . GetMethods ( BindingFlags . Public | BindingFlags . Instance )
534565 . Where ( m => m . Name == "__call__" ) ;
@@ -564,6 +595,29 @@ public virtual void InitializeSlots(BorrowedReference pyType, SlotsHolder slotsH
564595 {
565596 TypeManager . InitializeSlotIfEmpty ( pyType , TypeOffset . mp_length , new Interop . B_P ( MpLengthSlot . impl ) , slotsHolder ) ;
566597 }
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+ }
567621 }
568622
569623 public virtual bool HasCustomNew ( ) => this . GetType ( ) . GetMethod ( "tp_new" ) is not null ;
0 commit comments