1+ #nullable enable
12using System ;
23using System . Collections ;
34using System . Collections . Generic ;
@@ -124,14 +125,14 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
124125 Exceptions . SetError ( Exceptions . MemoryError , oom . Message ) ;
125126 return default ;
126127 }
127- return CLRObject . GetInstHandle ( result , arrayPyType ) ;
128+ return CLRObject . GetReference ( result , arrayPyType ) ;
128129 }
129130
130131
131132 /// <summary>
132133 /// Implements __getitem__ for array types.
133134 /// </summary>
134- public new static IntPtr mp_subscript ( IntPtr ob , IntPtr idx )
135+ public new static NewReference mp_subscript ( BorrowedReference ob , BorrowedReference idx )
135136 {
136137 var obj = ( CLRObject ) GetManagedObject ( ob ) ;
137138 var arrObj = ( ArrayObject ) GetManagedObjectType ( ob ) ;
@@ -179,7 +180,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
179180 catch ( IndexOutOfRangeException )
180181 {
181182 Exceptions . SetError ( Exceptions . IndexError , "array index out of range" ) ;
182- return IntPtr . Zero ;
183+ return default ;
183184 }
184185
185186 return Converter . ToPython ( value , itemType ) ;
@@ -190,7 +191,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
190191 if ( ! Runtime . PyTuple_Check ( idx ) )
191192 {
192193 Exceptions . SetError ( Exceptions . TypeError , "invalid index value" ) ;
193- return IntPtr . Zero ;
194+ return default ;
194195 }
195196
196197 var count = Runtime . PyTuple_Size ( idx ) ;
@@ -199,7 +200,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
199200
200201 for ( int dimension = 0 ; dimension < count ; dimension ++ )
201202 {
202- IntPtr op = Runtime . PyTuple_GetItem ( idx , dimension ) ;
203+ BorrowedReference op = Runtime . PyTuple_GetItem ( idx , dimension ) ;
203204 if ( ! Runtime . PyInt_Check ( op ) )
204205 {
205206 return RaiseIndexMustBeIntegerError ( op ) ;
@@ -226,7 +227,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
226227 catch ( IndexOutOfRangeException )
227228 {
228229 Exceptions . SetError ( Exceptions . IndexError , "array index out of range" ) ;
229- return IntPtr . Zero ;
230+ return default ;
230231 }
231232
232233 return Converter . ToPython ( value , itemType ) ;
@@ -236,14 +237,14 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
236237 /// <summary>
237238 /// Implements __setitem__ for array types.
238239 /// </summary>
239- public static new int mp_ass_subscript ( IntPtr ob , IntPtr idx , IntPtr v )
240+ public static new int mp_ass_subscript ( BorrowedReference ob , BorrowedReference idx , BorrowedReference v )
240241 {
241- var obj = ( CLRObject ) GetManagedObject ( ob ) ;
242- var items = obj . inst as Array ;
242+ var obj = ( CLRObject ) GetManagedObject ( ob ) ! ;
243+ var items = ( Array ) obj . inst ;
243244 Type itemType = obj . inst . GetType ( ) . GetElementType ( ) ;
244245 int rank = items . Rank ;
245246 nint index ;
246- object value ;
247+ object ? value ;
247248
248249 if ( items . IsReadOnly )
249250 {
@@ -300,7 +301,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
300301
301302 for ( int dimension = 0 ; dimension < count ; dimension ++ )
302303 {
303- IntPtr op = Runtime . PyTuple_GetItem ( idx , dimension ) ;
304+ BorrowedReference op = Runtime . PyTuple_GetItem ( idx , dimension ) ;
304305 if ( ! Runtime . PyInt_Check ( op ) )
305306 {
306307 RaiseIndexMustBeIntegerError ( op ) ;
@@ -335,7 +336,7 @@ static NewReference NewInstance(Type elementType, BorrowedReference arrayPyType,
335336 return 0 ;
336337 }
337338
338- private static IntPtr RaiseIndexMustBeIntegerError ( IntPtr idx )
339+ private static NewReference RaiseIndexMustBeIntegerError ( BorrowedReference idx )
339340 {
340341 string tpName = Runtime . PyObject_GetTypeName ( idx ) ;
341342 return Exceptions . RaiseTypeError ( $ "array index has type { tpName } , expected an integer") ;
@@ -344,7 +345,7 @@ private static IntPtr RaiseIndexMustBeIntegerError(IntPtr idx)
344345 /// <summary>
345346 /// Implements __contains__ for array types.
346347 /// </summary>
347- public static int sq_contains ( IntPtr ob , IntPtr v )
348+ public static int sq_contains ( BorrowedReference ob , BorrowedReference v )
348349 {
349350 var obj = ( CLRObject ) GetManagedObject ( ob ) ;
350351 Type itemType = obj . inst . GetType ( ) . GetElementType ( ) ;
@@ -379,7 +380,7 @@ static int GetBuffer(BorrowedReference obj, out Py_buffer buffer, PyBUF flags)
379380 Exceptions . SetError ( Exceptions . BufferError , "only C-contiguous supported" ) ;
380381 return - 1 ;
381382 }
382- var self = ( Array ) ( ( CLRObject ) GetManagedObject ( obj ) ) . inst ;
383+ var self = ( Array ) ( ( CLRObject ) GetManagedObject ( obj ) ! ) . inst ;
383384 Type itemType = self . GetType ( ) . GetElementType ( ) ;
384385
385386 bool formatRequested = ( flags & PyBUF . FORMATS ) != 0 ;
@@ -405,7 +406,7 @@ static int GetBuffer(BorrowedReference obj, out Py_buffer buffer, PyBUF flags)
405406 buffer = new Py_buffer
406407 {
407408 buf = gcHandle . AddrOfPinnedObject ( ) ,
408- obj = Runtime . SelfIncRef ( obj . DangerousGetAddress ( ) ) ,
409+ obj = new NewReference ( obj ) . DangerousMoveToPointer ( ) ,
409410 len = ( IntPtr ) ( self . LongLength * itemSize ) ,
410411 itemsize = ( IntPtr ) itemSize ,
411412 _readonly = false ,
@@ -427,6 +428,8 @@ static void ReleaseBuffer(BorrowedReference obj, ref Py_buffer buffer)
427428 UnmanagedFree ( ref buffer . strides ) ;
428429 UnmanagedFree ( ref buffer . suboffsets ) ;
429430
431+ // TODO: decref buffer.obj?
432+
430433 var gcHandle = ( GCHandle ) buffer . _internal ;
431434 gcHandle . Free ( ) ;
432435 buffer . _internal = IntPtr . Zero ;
0 commit comments