22// The .NET Foundation licenses this file to you under the Apache 2.0 License.
33// See the LICENSE file in the project root for more information.
44
5+ #nullable enable
6+
57using System ;
68using System . Collections ;
79using System . Collections . Generic ;
810using System . Diagnostics ;
11+ using System . Text ;
12+
913using Microsoft . Scripting . Runtime ;
1014using Microsoft . Scripting . Utils ;
11- using System . Text ;
1215
1316using IronPython . Runtime . Types ;
1417
@@ -27,7 +30,7 @@ public static Array Add(Array data1, Array data2) {
2730
2831 Type type1 = data1 . GetType ( ) ;
2932 Type type2 = data2 . GetType ( ) ;
30- Type type = ( type1 == type2 ) ? type1 . GetElementType ( ) : typeof ( object ) ;
33+ Type type = ( type1 == type2 ) ? type1 . GetElementType ( ) ! : typeof ( object ) ;
3134
3235 Array ret = Array . CreateInstance ( type , data1 . Length + data2 . Length ) ;
3336 Array . Copy ( data1 , 0 , ret , 0 , data1 . Length ) ;
@@ -37,26 +40,26 @@ public static Array Add(Array data1, Array data2) {
3740
3841 [ StaticExtensionMethod ]
3942 public static object __new__ ( CodeContext context , PythonType pythonType , int length ) {
40- Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ;
43+ Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ! ;
4144
4245 return Array . CreateInstance ( type , length ) ;
4346 }
4447
4548 [ StaticExtensionMethod ]
4649 public static object __new__ ( CodeContext context , PythonType pythonType , params int [ ] lengths ) {
47- Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ;
50+ Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ! ;
4851
4952 return Array . CreateInstance ( type , lengths ) ;
5053 }
5154
5255 [ StaticExtensionMethod ]
5356 public static object __new__ ( CodeContext context , PythonType pythonType , ICollection items ) {
54- Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ;
57+ Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ! ;
5558
5659 Array res = Array . CreateInstance ( type , items . Count ) ;
5760
5861 int i = 0 ;
59- foreach ( object item in items ) {
62+ foreach ( var item in items ) {
6063 res . SetValue ( Converter . Convert ( item , type ) , i ++ ) ;
6164 }
6265
@@ -65,9 +68,9 @@ public static object __new__(CodeContext context, PythonType pythonType, ICollec
6568
6669 [ StaticExtensionMethod ]
6770 public static object __new__ ( CodeContext context , PythonType pythonType , object items ) {
68- Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ;
71+ Type type = pythonType . UnderlyingSystemType . GetElementType ( ) ! ;
6972
70- object lenFunc ;
73+ object ? lenFunc ;
7174 if ( ! PythonOps . TryGetBoundAttr ( items , "__len__" , out lenFunc ) )
7275 throw PythonOps . TypeErrorForBadInstance ( "expected object with __len__ function, got {0}" , items ) ;
7376
@@ -91,7 +94,7 @@ public static object __new__(CodeContext context, PythonType pythonType, object
9194 public static Array Multiply ( Array data , int count ) {
9295 if ( data . Rank > 1 ) throw new NotImplementedException ( "can't multiply multidimensional arrays" ) ;
9396
94- Type elemType = data . GetType ( ) . GetElementType ( ) ;
97+ Type elemType = data . GetType ( ) . GetElementType ( ) ! ;
9598 if ( count <= 0 ) return Array . CreateInstance ( elemType , 0 ) ;
9699
97100 int newCount = data . Length * count ;
@@ -112,7 +115,7 @@ public static Array Multiply(Array data, int count) {
112115 }
113116
114117 [ SpecialName ]
115- public static object GetItem ( Array data , int index ) {
118+ public static object ? GetItem ( Array data , int index ) {
116119 if ( data == null ) throw PythonOps . TypeError ( "expected Array, got None" ) ;
117120
118121 return data . GetValue ( PythonOps . FixIndex ( index , data . Length ) + data . GetLowerBound ( 0 ) ) ;
@@ -126,13 +129,13 @@ public static object GetItem(Array data, Slice slice) {
126129 }
127130
128131 [ SpecialName ]
129- public static object GetItem ( Array data , PythonTuple tuple ) {
132+ public static object ? GetItem ( Array data , PythonTuple tuple ) {
130133 if ( data == null ) throw PythonOps . TypeError ( "expected Array, got None" ) ;
131- return GetItem ( data , tuple . ToArray ( ) ) ;
134+ return GetItem ( data , tuple . _data ) ;
132135 }
133136
134137 [ SpecialName ]
135- public static object GetItem ( Array data , params object [ ] indices ) {
138+ public static object ? GetItem ( Array data , params object ? [ ] indices ) {
136139 if ( indices == null || indices . Length < 1 ) throw PythonOps . TypeError ( "__getitem__ requires at least 1 parameter" ) ;
137140
138141 int iindex ;
@@ -181,21 +184,21 @@ public static void SetItem(Array a, params object[] indexAndValue) {
181184 }
182185
183186 [ SpecialName ]
184- public static void SetItem ( Array a , Slice index , object value ) {
187+ public static void SetItem ( Array a , Slice index , object ? value ) {
185188 if ( a . Rank != 1 ) throw PythonOps . NotImplementedError ( "slice on multi-dimensional array" ) ;
186189
187- Type elm = a . GetType ( ) . GetElementType ( ) ;
190+ Type elm = a . GetType ( ) . GetElementType ( ) ! ;
188191
189192 index . DoSliceAssign (
190- delegate ( int idx , object val ) {
193+ delegate ( int idx , object ? val ) {
191194 a . SetValue ( Converter . Convert ( val , elm ) , idx + a . GetLowerBound ( 0 ) ) ;
192195 } ,
193196 a . Length ,
194197 value ) ;
195198 }
196199
197200 public static string __repr__ ( CodeContext /*!*/ context , [ NotNull ] Array /*!*/ self ) {
198- List < object > infinite = PythonOps . GetAndCheckInfinite ( self ) ;
201+ var infinite = PythonOps . GetAndCheckInfinite ( self ) ;
199202 if ( infinite == null ) {
200203 return "..." ;
201204 }
@@ -207,7 +210,7 @@ public static string __repr__(CodeContext/*!*/ context, [NotNull]Array/*!*/ self
207210 if ( self . Rank == 1 ) {
208211 // single dimensional Array's have a valid display
209212 ret . Append ( "Array[" ) ;
210- Type elemType = self . GetType ( ) . GetElementType ( ) ;
213+ Type elemType = self . GetType ( ) . GetElementType ( ) ! ;
211214 ret . Append ( DynamicHelpers . GetPythonTypeFromType ( elemType ) . Name ) ;
212215 ret . Append ( "]" ) ;
213216 ret . Append ( "((" ) ;
@@ -222,7 +225,7 @@ public static string __repr__(CodeContext/*!*/ context, [NotNull]Array/*!*/ self
222225 ret . Append ( "<" ) ;
223226 ret . Append ( self . Rank ) ;
224227 ret . Append ( " dimensional Array[" ) ;
225- Type elemType = self . GetType ( ) . GetElementType ( ) ;
228+ Type elemType = self . GetType ( ) . GetElementType ( ) ! ;
226229 ret . Append ( DynamicHelpers . GetPythonTypeFromType ( elemType ) . Name ) ;
227230 ret . Append ( "] at " ) ;
228231 ret . Append ( PythonOps . HexId ( self ) ) ;
@@ -243,15 +246,15 @@ public static string __repr__(CodeContext/*!*/ context, [NotNull]Array/*!*/ self
243246 /// <summary>
244247 /// Multiply two object[] arrays - internal version used for objects backed by arrays
245248 /// </summary>
246- internal static object [ ] Multiply ( object [ ] data , int size , int count ) {
249+ internal static object ? [ ] Multiply ( object ? [ ] data , int size , int count ) {
247250 int newCount ;
248251 try {
249252 newCount = checked ( size * count ) ;
250253 } catch ( OverflowException ) {
251254 throw PythonOps . MemoryError ( ) ;
252255 }
253256
254- object [ ] ret = ArrayOps . CopyArray ( data , newCount ) ;
257+ var ret = ArrayOps . CopyArray ( data , newCount ) ;
255258 if ( count > 0 ) {
256259 // this should be extremely fast for large count as it uses the same algoithim as efficient integer powers
257260 // ??? need to test to see how large count and n need to be for this to be fastest approach
@@ -274,24 +277,24 @@ internal static object[] Multiply(object[] data, int size, int count) {
274277 /// <param name="data2"></param>
275278 /// <param name="size2"></param>
276279 /// <returns></returns>
277- internal static object [ ] Add ( object [ ] data1 , int size1 , object [ ] data2 , int size2 ) {
278- object [ ] ret = ArrayOps . CopyArray ( data1 , size1 + size2 ) ;
280+ internal static object ? [ ] Add ( object ? [ ] data1 , int size1 , object ? [ ] data2 , int size2 ) {
281+ var ret = ArrayOps . CopyArray ( data1 , size1 + size2 ) ;
279282 Array . Copy ( data2 , 0 , ret , size1 , size2 ) ;
280283 return ret ;
281284 }
282285
283- internal static object [ ] GetSlice ( object [ ] data , int start , int stop ) {
286+ internal static object ? [ ] GetSlice ( object ? [ ] data , int start , int stop ) {
284287 if ( stop <= start ) return ArrayUtils . EmptyObjects ;
285288
286- object [ ] ret = new object [ stop - start ] ;
289+ var ret = new object ? [ stop - start ] ;
287290 int index = 0 ;
288291 for ( int i = start ; i < stop ; i ++ ) {
289292 ret [ index ++ ] = data [ i ] ;
290293 }
291294 return ret ;
292295 }
293296
294- internal static object [ ] GetSlice ( object [ ] data , int start , int stop , int step ) {
297+ internal static object ? [ ] GetSlice ( object ? [ ] data , int start , int stop , int step ) {
295298 Debug . Assert ( step != 0 ) ;
296299
297300 if ( step == 1 ) {
@@ -301,14 +304,14 @@ internal static object[] GetSlice(object[] data, int start, int stop, int step)
301304 int size = PythonOps . GetSliceCount ( start , stop , step ) ;
302305 if ( size <= 0 ) return ArrayUtils . EmptyObjects ;
303306
304- object [ ] res = new object [ size ] ;
307+ var res = new object ? [ size ] ;
305308 for ( int i = 0 , index = start ; i < res . Length ; i ++ , index += step ) {
306309 res [ i ] = data [ index ] ;
307310 }
308311 return res ;
309312 }
310313
311- internal static object [ ] GetSlice ( object [ ] data , Slice slice ) {
314+ internal static object ? [ ] GetSlice ( object ? [ ] data , Slice slice ) {
312315 int start , stop , step ;
313316 slice . indices ( data . Length , out start , out stop , out step ) ;
314317
@@ -325,17 +328,17 @@ internal static Array GetSlice(Array data, int size, Slice slice) {
325328 if ( data . GetType ( ) . GetElementType ( ) == typeof ( object ) )
326329 return ArrayUtils . EmptyObjects ;
327330
328- return Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) , 0 ) ;
331+ return Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) ! , 0 ) ;
329332 }
330333
331334 if ( step == 1 ) {
332335 int n = stop - start ;
333- Array ret = Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) , n ) ;
336+ Array ret = Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) ! , n ) ;
334337 Array . Copy ( data , start + data . GetLowerBound ( 0 ) , ret , 0 , n ) ;
335338 return ret ;
336339 } else {
337340 int n = PythonOps . GetSliceCount ( start , stop , step ) ;
338- Array ret = Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) , n ) ;
341+ Array ret = Array . CreateInstance ( data . GetType ( ) . GetElementType ( ) ! , n ) ;
339342 int ri = 0 ;
340343 for ( int i = 0 , index = start ; i < n ; i ++ , index += step ) {
341344 ret . SetValue ( data . GetValue ( index + data . GetLowerBound ( 0 ) ) , ri ++ ) ;
@@ -344,10 +347,10 @@ internal static Array GetSlice(Array data, int size, Slice slice) {
344347 }
345348 }
346349
347- internal static object [ ] CopyArray ( object [ ] data , int newSize ) {
350+ internal static object ? [ ] CopyArray ( object ? [ ] data , int newSize ) {
348351 if ( newSize == 0 ) return ArrayUtils . EmptyObjects ;
349352
350- object [ ] newData = new object [ newSize ] ;
353+ var newData = new object ? [ newSize ] ;
351354 if ( data . Length < 20 ) {
352355 for ( int i = 0 ; i < data . Length && i < newSize ; i ++ ) {
353356 newData [ i ] = data [ i ] ;
@@ -364,7 +367,7 @@ internal static object[] CopyArray(object[] data, int newSize) {
364367 #region Private helpers
365368
366369
367- private static int [ ] TupleToIndices ( Array a , IList < object > tuple ) {
370+ private static int [ ] TupleToIndices ( Array a , IList < object ? > tuple ) {
368371 int [ ] indices = new int [ tuple . Count ] ;
369372 for ( int i = 0 ; i < indices . Length ; i ++ ) {
370373 indices [ i ] = PythonOps . FixIndex ( Converter . ConvertToInt32 ( tuple [ i ] ) , a . GetUpperBound ( i ) + 1 ) ;
0 commit comments