@@ -85,9 +85,9 @@ internal static Version PyVersion
85
85
{
86
86
using ( var versionTuple = new PyTuple ( PySys_GetObject ( "version_info" ) ) )
87
87
{
88
- var major = versionTuple [ 0 ] . As < int > ( ) ;
89
- var minor = versionTuple [ 1 ] . As < int > ( ) ;
90
- var micro = versionTuple [ 2 ] . As < int > ( ) ;
88
+ var major = Converter . ToInt32 ( versionTuple [ 0 ] . Reference ) ;
89
+ var minor = Converter . ToInt32 ( versionTuple [ 1 ] . Reference ) ;
90
+ var micro = Converter . ToInt32 ( versionTuple [ 2 ] . Reference ) ;
91
91
return new Version ( major , minor , micro ) ;
92
92
}
93
93
}
@@ -198,15 +198,15 @@ private static void InitPyMembers()
198
198
SetPyMember ( ref PyFalse , PyObject_GetAttrString ( builtins , "False" ) ,
199
199
( ) => PyFalse = IntPtr . Zero ) ;
200
200
201
- SetPyMember ( ref PyBoolType , PyObject_Type ( PyTrue ) ,
201
+ SetPyMemberTypeOf ( ref PyBoolType , PyTrue ,
202
202
( ) => PyBoolType = IntPtr . Zero ) ;
203
- SetPyMember ( ref PyNoneType , PyObject_Type ( PyNone ) ,
203
+ SetPyMemberTypeOf ( ref PyNoneType , PyNone ,
204
204
( ) => PyNoneType = IntPtr . Zero ) ;
205
- SetPyMember ( ref PyTypeType , PyObject_Type ( PyNoneType ) ,
205
+ SetPyMemberTypeOf ( ref PyTypeType , PyNoneType ,
206
206
( ) => PyTypeType = IntPtr . Zero ) ;
207
207
208
208
op = PyObject_GetAttrString ( builtins , "len" ) ;
209
- SetPyMember ( ref PyMethodType , PyObject_Type ( op ) ,
209
+ SetPyMemberTypeOf ( ref PyMethodType , op ,
210
210
( ) => PyMethodType = IntPtr . Zero ) ;
211
211
XDecref ( op ) ;
212
212
@@ -215,7 +215,7 @@ private static void InitPyMembers()
215
215
//
216
216
// object.__init__ seems safe, though.
217
217
op = PyObject_GetAttr ( PyBaseObjectType , PyIdentifier . __init__ ) ;
218
- SetPyMember ( ref PyWrapperDescriptorType , PyObject_Type ( op ) ,
218
+ SetPyMemberTypeOf ( ref PyWrapperDescriptorType , op ,
219
219
( ) => PyWrapperDescriptorType = IntPtr . Zero ) ;
220
220
XDecref ( op ) ;
221
221
@@ -226,47 +226,47 @@ private static void InitPyMembers()
226
226
}
227
227
228
228
op = PyString_FromString ( "string" ) ;
229
- SetPyMember ( ref PyStringType , PyObject_Type ( op ) ,
229
+ SetPyMemberTypeOf ( ref PyStringType , op ,
230
230
( ) => PyStringType = IntPtr . Zero ) ;
231
231
XDecref ( op ) ;
232
232
233
233
op = PyUnicode_FromString ( "unicode" ) ;
234
- SetPyMember ( ref PyUnicodeType , PyObject_Type ( op ) ,
234
+ SetPyMemberTypeOf ( ref PyUnicodeType , op ,
235
235
( ) => PyUnicodeType = IntPtr . Zero ) ;
236
236
XDecref ( op ) ;
237
237
238
238
op = EmptyPyBytes ( ) ;
239
- SetPyMember ( ref PyBytesType , PyObject_Type ( op ) ,
239
+ SetPyMemberTypeOf ( ref PyBytesType , op ,
240
240
( ) => PyBytesType = IntPtr . Zero ) ;
241
241
XDecref ( op ) ;
242
242
243
243
op = PyTuple_New ( 0 ) ;
244
- SetPyMember ( ref PyTupleType , PyObject_Type ( op ) ,
244
+ SetPyMemberTypeOf ( ref PyTupleType , op ,
245
245
( ) => PyTupleType = IntPtr . Zero ) ;
246
246
XDecref ( op ) ;
247
247
248
248
op = PyList_New ( 0 ) ;
249
- SetPyMember ( ref PyListType , PyObject_Type ( op ) ,
249
+ SetPyMemberTypeOf ( ref PyListType , op ,
250
250
( ) => PyListType = IntPtr . Zero ) ;
251
251
XDecref ( op ) ;
252
252
253
253
op = PyDict_New ( ) ;
254
- SetPyMember ( ref PyDictType , PyObject_Type ( op ) ,
254
+ SetPyMemberTypeOf ( ref PyDictType , op ,
255
255
( ) => PyDictType = IntPtr . Zero ) ;
256
256
XDecref ( op ) ;
257
257
258
258
op = PyInt_FromInt32 ( 0 ) ;
259
- SetPyMember ( ref PyIntType , PyObject_Type ( op ) ,
259
+ SetPyMemberTypeOf ( ref PyIntType , op ,
260
260
( ) => PyIntType = IntPtr . Zero ) ;
261
261
XDecref ( op ) ;
262
262
263
263
op = PyLong_FromLong ( 0 ) ;
264
- SetPyMember ( ref PyLongType , PyObject_Type ( op ) ,
264
+ SetPyMemberTypeOf ( ref PyLongType , op ,
265
265
( ) => PyLongType = IntPtr . Zero ) ;
266
266
XDecref ( op ) ;
267
267
268
268
op = PyFloat_FromDouble ( 0 ) ;
269
- SetPyMember ( ref PyFloatType , PyObject_Type ( op ) ,
269
+ SetPyMemberTypeOf ( ref PyFloatType , op ,
270
270
( ) => PyFloatType = IntPtr . Zero ) ;
271
271
XDecref ( op ) ;
272
272
@@ -278,7 +278,8 @@ private static void InitPyMembers()
278
278
_PyObject_NextNotImplemented = Get_PyObject_NextNotImplemented ( ) ;
279
279
{
280
280
using var sys = PyImport_ImportModule ( "sys" ) ;
281
- PyModuleType = PyObject_Type ( sys . DangerousMoveToPointer ( ) ) ;
281
+ SetPyMemberTypeOf ( ref PyModuleType , sys . DangerousGetAddress ( ) ,
282
+ ( ) => PyModuleType = IntPtr . Zero ) ;
282
283
}
283
284
}
284
285
@@ -455,6 +456,12 @@ private static void SetPyMember(ref IntPtr obj, IntPtr value, Action onRelease)
455
456
_pyRefs . Add ( value , onRelease ) ;
456
457
}
457
458
459
+ private static void SetPyMemberTypeOf ( ref IntPtr obj , IntPtr value , Action onRelease )
460
+ {
461
+ var type = PyObject_Type ( new BorrowedReference ( value ) ) . DangerousMoveToPointer ( ) ;
462
+ SetPyMember ( ref obj , type , onRelease ) ;
463
+ }
464
+
458
465
private static void ResetPyMembers ( )
459
466
{
460
467
_pyRefs . Release ( ) ;
@@ -761,16 +768,12 @@ internal static unsafe void XDecref(IntPtr op)
761
768
[ Pure ]
762
769
internalstatic unsafelong Refcount( IntPtr op )
763
770
{
764
- #if PYTHON_WITH_PYDEBUG
765
- var p= ( void * ) ( op + TypeOffset . ob_refcnt ) ;
766
- #else
767
- var p= ( void * ) op ;
768
- #endif
769
- if ( ( void * ) 0 == p )
771
+ if ( op == IntPtr . Zero )
770
772
{
771
773
return 0 ;
772
774
}
773
- return Is32Bit? ( * ( int * ) p ) : ( * ( long * ) p ) ;
775
+ var p= ( nint * ) ( op + ABI . RefCountOffset ) ;
776
+ return * p ;
774
777
}
775
778
776
779
/// <summary>
@@ -977,14 +980,9 @@ internal static unsafe IntPtr PyObject_TYPE(IntPtr op)
977
980
{
978
981
return IntPtr . Zero ;
979
982
}
980
- #ifPYTHON_WITH_PYDEBUG
981
- var n = 3 ;
982
- #else
983
- var n = 1 ;
984
- #endif
985
- return Is32Bit
986
- ? new IntPtr ( ( void * ) ( * ( ( uint * ) p + n ) ) )
987
- : new IntPtr( ( void * ) ( * ( ( ulong * ) p + n ) ) ) ;
983
+ Debug . Assert ( TypeOffset . ob_type > 0 ) ;
984
+ IntPtr * typePtr = ( IntPtr * ) ( op + TypeOffset . ob_type ) ;
985
+ return * typePtr ;
988
986
}
989
987
internal static unsafe BorrowedReference PyObject_TYPE ( BorrowedReference op )
990
988
=> new BorrowedReference ( PyObject_TYPE ( op . DangerousGetAddress ( ) ) ) ;
@@ -1001,6 +999,9 @@ internal static IntPtr PyObject_Type(IntPtr op)
1001
999
return tp ;
1002
1000
}
1003
1001
1002
+ internal static NewReference PyObject_Type ( BorrowedReference o )
1003
+ => Delegates . PyObject_Type ( o ) ;
1004
+
1004
1005
internal static string PyObject_GetTypeName ( IntPtr op )
1005
1006
{
1006
1007
IntPtr pyType = PyObject_TYPE ( op ) ;
@@ -1145,10 +1146,11 @@ internal static IntPtr PyObject_Str(IntPtr pointer)
1145
1146
1146
1147
internal static IntPtr PyObject_Dir ( IntPtr pointer ) => Delegates . PyObject_Dir ( pointer ) ;
1147
1148
1148
- #ifPYTHON_WITH_PYDEBUG
1149
- [ DllImport ( _PythonDll , CallingConvention = CallingConvention . Cdecl ) ]
1150
- internal static extern void _Py_NewReference ( IntPtr ob ) ;
1151
- #endif
1149
+ internal static void _Py_NewReference ( BorrowedReference ob )
1150
+ {
1151
+ if ( Delegates . _Py_NewReference != null )
1152
+ Delegates . _Py_NewReference ( ob ) ;
1153
+ }
1152
1154
1153
1155
//====================================================================
1154
1156
// Python buffer API
@@ -1912,11 +1914,6 @@ internal static string PyModule_GetName(IntPtr module)
1912
1914
internal static string PyModule_GetFilename ( IntPtr module )
1913
1915
=> Delegates . PyModule_GetFilename ( module ) . ToString ( Encoding . UTF8 ) ;
1914
1916
1915
- #ifPYTHON_WITH_PYDEBUG
1916
- [ DllImport ( _PythonDll , EntryPoint = "PyModule_Create2TraceRefs" , CallingConvention = CallingConvention . Cdecl ) ]
1917
- #else
1918
-
1919
- #endif
1920
1917
internal static IntPtr PyModule_Create2 ( IntPtr module , int apiver ) => Delegates . PyModule_Create2 ( module , apiver ) ;
1921
1918
1922
1919
@@ -2331,6 +2328,7 @@ static Delegates()
2331
2328
PyObject_Hash = ( delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > ) GetFunctionByName ( nameof ( PyObject_Hash ) , GetUnmanagedDll ( _PythonDll ) ) ;
2332
2329
PyObject_Repr = ( delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > ) GetFunctionByName ( nameof ( PyObject_Repr ) , GetUnmanagedDll ( _PythonDll ) ) ;
2333
2330
PyObject_Str = ( delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > ) GetFunctionByName ( nameof ( PyObject_Str ) , GetUnmanagedDll ( _PythonDll ) ) ;
2331
+ PyObject_Type = ( delegate * unmanaged[ Cdecl] < BorrowedReference , NewReference > ) GetFunctionByName ( nameof ( PyObject_Type ) , GetUnmanagedDll ( _PythonDll ) ) ;
2334
2332
PyObject_Dir = ( delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > ) GetFunctionByName ( nameof ( PyObject_Dir ) , GetUnmanagedDll ( _PythonDll ) ) ;
2335
2333
PyObject_GetBuffer = ( delegate * unmanaged[ Cdecl] < IntPtr , ref Py_buffer , int , int > ) GetFunctionByName ( nameof ( PyObject_GetBuffer ) , GetUnmanagedDll ( _PythonDll ) ) ;
2336
2334
PyBuffer_Release = ( delegate * unmanaged[ Cdecl] < ref Py_buffer , void > ) GetFunctionByName ( nameof ( PyBuffer_Release ) , GetUnmanagedDll ( _PythonDll ) ) ;
@@ -2466,7 +2464,14 @@ static Delegates()
2466
2464
PyModule_GetName = ( delegate * unmanaged[ Cdecl] < IntPtr , StrPtr > ) GetFunctionByName ( nameof ( PyModule_GetName ) , GetUnmanagedDll ( _PythonDll ) ) ;
2467
2465
PyModule_GetDict = ( delegate * unmanaged[ Cdecl] < BorrowedReference , BorrowedReference > ) GetFunctionByName ( nameof ( PyModule_GetDict ) , GetUnmanagedDll ( _PythonDll ) ) ;
2468
2466
PyModule_GetFilename = ( delegate * unmanaged[ Cdecl] < IntPtr , StrPtr > ) GetFunctionByName ( nameof ( PyModule_GetFilename ) , GetUnmanagedDll ( _PythonDll ) ) ;
2469
- PyModule_Create2 = ( delegate * unmanaged[ Cdecl] < IntPtr , int , IntPtr > ) GetFunctionByName ( nameof ( PyModule_Create2 ) , GetUnmanagedDll ( _PythonDll ) ) ;
2467
+ try
2468
+ {
2469
+ PyModule_Create2 = ( delegate * unmanaged[ Cdecl] < IntPtr , int , IntPtr > ) GetFunctionByName ( nameof ( PyModule_Create2 ) , GetUnmanagedDll ( _PythonDll ) ) ;
2470
+ }
2471
+ catch ( MissingMethodException )
2472
+ {
2473
+ PyModule_Create2 = ( delegate * unmanaged[ Cdecl] < IntPtr , int , IntPtr > ) GetFunctionByName ( "PyModule_Create2TraceRefs" , GetUnmanagedDll ( _PythonDll ) ) ;
2474
+ }
2470
2475
PyImport_Import = ( delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > ) GetFunctionByName ( nameof ( PyImport_Import ) , GetUnmanagedDll ( _PythonDll ) ) ;
2471
2476
PyImport_ImportModule = ( delegate * unmanaged[ Cdecl] < StrPtr , NewReference > ) GetFunctionByName ( nameof ( PyImport_ImportModule ) , GetUnmanagedDll ( _PythonDll ) ) ;
2472
2477
PyImport_ReloadModule = ( delegate * unmanaged[ Cdecl] < BorrowedReference , NewReference > ) GetFunctionByName ( nameof ( PyImport_ReloadModule ) , GetUnmanagedDll ( _PythonDll ) ) ;
@@ -2521,6 +2526,12 @@ static Delegates()
2521
2526
PyThreadState_SetAsyncExcLLP64 = ( delegate * unmanaged[ Cdecl] < uint , IntPtr , int > ) GetFunctionByName ( "PyThreadState_SetAsyncExc" , GetUnmanagedDll ( _PythonDll ) ) ;
2522
2527
PyThreadState_SetAsyncExcLP64 = ( delegate * unmanaged[ Cdecl] < ulong , IntPtr , int > ) GetFunctionByName ( "PyThreadState_SetAsyncExc" , GetUnmanagedDll ( _PythonDll ) ) ;
2523
2528
PyType_FromSpecWithBases = ( delegate * unmanaged[ Cdecl] < in NativeTypeSpec , BorrowedReference , NewReference > ) GetFunctionByName ( nameof ( PyType_FromSpecWithBases ) , GetUnmanagedDll ( PythonDLL ) ) ;
2529
+
2530
+ try
2531
+ {
2532
+ _Py_NewReference = ( delegate * unmanaged[ Cdecl] < BorrowedReference , void > ) GetFunctionByName ( nameof ( _Py_NewReference ) , GetUnmanagedDll ( _PythonDll ) ) ;
2533
+ }
2534
+ catch ( MissingMethodException ) { }
2524
2535
}
2525
2536
2526
2537
static global ::System . IntPtr GetUnmanagedDll ( string libraryName )
@@ -2616,6 +2627,7 @@ static Delegates()
2616
2627
internal static delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > PyObject_Hash { get ; }
2617
2628
internal static delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > PyObject_Repr { get ; }
2618
2629
internal static delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > PyObject_Str { get ; }
2630
+ internal static delegate * unmanaged[ Cdecl] < BorrowedReference , NewReference > PyObject_Type { get ; }
2619
2631
internal static delegate * unmanaged[ Cdecl] < IntPtr , IntPtr > PyObject_Dir { get ; }
2620
2632
internal static delegate * unmanaged[ Cdecl] < IntPtr , ref Py_buffer , int , int > PyObject_GetBuffer { get ; }
2621
2633
internal static delegate * unmanaged[ Cdecl] < ref Py_buffer , void > PyBuffer_Release { get ; }
@@ -2799,6 +2811,7 @@ static Delegates()
2799
2811
internal static delegate * unmanaged[ Cdecl] < ulong , IntPtr , int > PyThreadState_SetAsyncExcLP64 { get ; }
2800
2812
internal static delegate * unmanaged[ Cdecl] < BorrowedReference , IntPtr , NewReference > PyObject_GenericGetDict { get ; }
2801
2813
internal static delegate * unmanaged[ Cdecl] < in NativeTypeSpec , BorrowedReference , NewReference > PyType_FromSpecWithBases { get ; }
2814
+ internal static delegate * unmanaged[ Cdecl] < BorrowedReference , void > _Py_NewReference { get ; }
2802
2815
}
2803
2816
}
2804
2817