Skip to content

Commit a79f22f

Browse files
authored
Add some nullable annotations (#969)
* Add some nullable annotations * Add some nullable annotations * Cleanup
1 parent 53bc72f commit a79f22f

File tree

7 files changed

+239
-259
lines changed

7 files changed

+239
-259
lines changed

Src/IronPython/Runtime/Operations/ArrayOps.cs

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
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+
57
using System;
68
using System.Collections;
79
using System.Collections.Generic;
810
using System.Diagnostics;
11+
using System.Text;
12+
913
using Microsoft.Scripting.Runtime;
1014
using Microsoft.Scripting.Utils;
11-
using System.Text;
1215

1316
using 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

Comments
 (0)