@@ -55,6 +55,50 @@ internal ClassDerivedObject(Type tp) : base(tp)
55
55
return Converter . ToPython ( obj , cls . GetType ( ) ) ;
56
56
}
57
57
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
+
58
102
public new static void tp_dealloc ( IntPtr ob )
59
103
{
60
104
var self = ( CLRObject ) GetManagedObject ( ob ) ;
@@ -829,26 +873,6 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, objec
829
873
Runtime . XIncref ( Runtime . PyNone ) ;
830
874
var pynone = new PyObject ( Runtime . PyNone ) ;
831
875
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
- }
852
876
}
853
877
finally
854
878
{
0 commit comments