@@ -55,6 +55,50 @@ internal ClassDerivedObject(Type tp) : base(tp)
5555 return Converter . ToPython ( obj , cls . GetType ( ) ) ;
5656 }
5757
58+ /// <summary>
59+ /// Implements __init__ for derived classes of reflected classes.
60+ /// </summary>
61+ public new static int tp_init ( IntPtr ob , IntPtr args , IntPtr kw )
62+ {
63+ var disposeList = new List < PyObject > ( ) ;
64+ try
65+ {
66+ var self = ( CLRObject ) GetManagedObject ( ob ) ;
67+
68+ // call __init__
69+ using ( var pyself = new PyObject ( self . pyHandle ) )
70+ using ( var pynone = new PyObject ( Runtime . PyNone ) )
71+ {
72+ PyObject init = pyself . GetAttr ( "__init__" , pynone ) ;
73+ int pynargs = Runtime . PyTuple_Size ( args ) ;
74+ if ( init . Handle != Runtime . PyNone )
75+ {
76+ // if __init__ hasn't been overridden then it will be a managed object
77+ ManagedType managedMethod = ManagedType . GetManagedObject ( init . Handle ) ;
78+ if ( null == managedMethod )
79+ {
80+ var pyargs = new PyObject [ pynargs ] ;
81+ for ( var i = 0 ; i < pynargs ; ++ i )
82+ {
83+ pyargs [ i ] = new PyObject ( Runtime . PyTuple_GetItem ( args , i ) ) ;
84+ }
85+
86+ disposeList . Add ( init . Invoke ( pyargs ) ) ;
87+ }
88+ }
89+ }
90+
91+ return 0 ;
92+ }
93+ finally
94+ {
95+ foreach ( PyObject x in disposeList )
96+ {
97+ x ? . Dispose ( ) ;
98+ }
99+ }
100+ }
101+
58102 public new static void tp_dealloc ( IntPtr ob )
59103 {
60104 var self = ( CLRObject ) GetManagedObject ( ob ) ;
@@ -829,26 +873,6 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, objec
829873 Runtime . XIncref ( Runtime . PyNone ) ;
830874 var pynone = new PyObject ( Runtime . PyNone ) ;
831875 disposeList . Add ( pynone ) ;
832-
833- // call __init__
834- PyObject init = pyself . GetAttr ( "__init__" , pynone ) ;
835- disposeList . Add ( init ) ;
836- if ( init . Handle != Runtime . PyNone )
837- {
838- // if __init__ hasn't been overridden then it will be a managed object
839- ManagedType managedMethod = ManagedType . GetManagedObject ( init . Handle ) ;
840- if ( null == managedMethod )
841- {
842- var pyargs = new PyObject [ args . Length ] ;
843- for ( var i = 0 ; i < args . Length ; ++ i )
844- {
845- pyargs [ i ] = new PyObject ( Converter . ToPython ( args [ i ] , args [ i ] ? . GetType ( ) ) ) ;
846- disposeList . Add ( pyargs [ i ] ) ;
847- }
848-
849- disposeList . Add ( init . Invoke ( pyargs ) ) ;
850- }
851- }
852876 }
853877 finally
854878 {
0 commit comments