1
- using System ;
1
+ using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
4
using System . Reflection ;
@@ -55,6 +55,33 @@ internal ClassDerivedObject(Type tp) : base(tp)
55
55
return Converter . ToPython ( obj , cls . GetType ( ) ) ;
56
56
}
57
57
58
+ public new static int tp_init ( IntPtr obj , IntPtr args , IntPtr kw )
59
+ {
60
+ Runtime . XIncref ( obj ) ;
61
+ Runtime . XIncref ( Runtime . PyNone ) ;
62
+ using ( var pyself = new PyObject ( obj ) )
63
+ using ( var pynone = new PyObject ( Runtime . PyNone ) )
64
+ using ( var init = pyself . GetAttr ( "__init__" , pynone ) )
65
+ {
66
+ if ( init . Handle != Runtime . PyNone )
67
+ {
68
+ // if __init__ hasn't been overridden then it will be a managed object
69
+ if ( GetManagedObject ( init . Handle ) == null )
70
+ {
71
+ Runtime . XIncref ( args ) ;
72
+ Runtime . XIncref ( kw ) ;
73
+ using ( var args_ = new PyTuple ( args ) )
74
+ using ( var kw_ = new PyDict ( kw ) )
75
+ using ( var res = init . Invoke ( args_ , kw_ ) )
76
+ {
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ return 0 ;
83
+ }
84
+
58
85
public new static void tp_dealloc ( IntPtr ob )
59
86
{
60
87
var self = ( CLRObject ) GetManagedObject ( ob ) ;
@@ -801,6 +828,8 @@ public static void InvokeSetProperty<T>(IPythonDerivedType obj, string propertyN
801
828
802
829
public static void InvokeCtor ( IPythonDerivedType obj , string origCtorName , object [ ] args )
803
830
{
831
+ Console . Error . WriteLine ( $ "{ origCtorName } : { string . Join ( ", " , args ) } ") ;
832
+
804
833
// call the base constructor
805
834
obj . GetType ( ) . InvokeMember ( origCtorName ,
806
835
BindingFlags . InvokeMethod ,
@@ -822,33 +851,7 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, objec
822
851
FieldInfo fi = obj . GetType ( ) . GetField ( "__pyobj__" ) ;
823
852
fi . SetValue ( obj , self ) ;
824
853
825
- Runtime . XIncref ( self . pyHandle ) ;
826
- var pyself = new PyObject ( self . pyHandle ) ;
827
- disposeList . Add ( pyself ) ;
828
-
829
- Runtime . XIncref ( Runtime . PyNone ) ;
830
- var pynone = new PyObject ( Runtime . PyNone ) ;
831
- disposeList . Add ( pynone ) ;
832
854
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
855
}
853
856
finally
854
857
{
0 commit comments