[dart2wasm] Check array length in _allocateData

New passing tests:

- co19/LibTest/collection/ListBase/ListBase_class_A01_t01
- co19/LibTest/collection/ListMixin/ListMixin_class_A01_t01
- co19/LibTest/core/List/List_all_t01

Change-Id: I5ee455714e82c4f70df42037db11414832e4f9fa
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/284160
Commit-Queue: Ömer Ağacan <omersa@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
diff --git a/sdk/lib/_internal/wasm/lib/growable_list.dart b/sdk/lib/_internal/wasm/lib/growable_list.dart
index a9e458d..43b0825 100644
--- a/sdk/lib/_internal/wasm/lib/growable_list.dart
+++ b/sdk/lib/_internal/wasm/lib/growable_list.dart
@@ -239,6 +239,9 @@
       WasmObjectArray<Object?>(0);
 
   static WasmObjectArray<Object?> _allocateData(int capacity) {
+    if (capacity < 0) {
+      throw new RangeError.range(capacity, 0, _maxWasmArrayLength);
+    }
     if (capacity == 0) {
       // Use shared empty list as backing.
       return _emptyData;
diff --git a/sdk/lib/_internal/wasm/lib/list.dart b/sdk/lib/_internal/wasm/lib/list.dart
index 081bd49..8922353 100644
--- a/sdk/lib/_internal/wasm/lib/list.dart
+++ b/sdk/lib/_internal/wasm/lib/list.dart
@@ -4,6 +4,8 @@
 
 part of "core_patch.dart";
 
+const int _maxWasmArrayLength = 2147483647; // max i32
+
 @pragma("wasm:entry-point")
 abstract class _ListBase<E> extends ListBase<E> {
   @pragma("wasm:entry-point")
@@ -13,8 +15,8 @@
 
   _ListBase(int length, int capacity)
       : _length = length,
-        _data = WasmObjectArray<Object?>(RangeError.checkValueInInterval(
-            capacity, 0, 2147483647)); // max i32
+        _data = WasmObjectArray<Object?>(
+            RangeError.checkValueInInterval(capacity, 0, _maxWasmArrayLength));
 
   _ListBase._withData(this._length, this._data);