Make ListMixin.take check that the argument is not null.

Fixes #41743, #30155
BUG= http://dartbug.com/41743

Change-Id: I223905a92b7353cdc50498d265a6dfe2f2f614d9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/160640
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Nate Bosch <nbosch@google.com>
This commit is contained in:
Lasse R.H. Nielsen 2021-01-28 17:19:35 +00:00 committed by commit-bot@chromium.org
parent 0a66c39bbe
commit 4a484c88e1
8 changed files with 43 additions and 6 deletions

View file

@ -188,7 +188,7 @@ library from "org-dartlang-test:///main.dart" as main {
return new dart._internal::SkipWhileIterable::•<dart.core::int*>(this, test);
}
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ take(dart.core::int count) → dart.core::Iterable<dart.core::int*>
return new dart._internal::SubListIterable::•<dart.core::int*>(this, 0, count);
return new dart._internal::SubListIterable::•<dart.core::int*>(this, 0, dart._internal::checkNotNullable<dart.core::int>(count, "count"));
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ takeWhile((dart.core::int*) → dart.core::bool test) → dart.core::Iterable<dart.core::int*> {
return new dart._internal::TakeWhileIterable::•<dart.core::int*>(this, test);
}

View file

@ -188,7 +188,7 @@ library from "org-dartlang-test:///main.dart" as main {
return new dart._internal::SkipWhileIterable::•<dart.core::int*>(this, test);
}
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ take(dart.core::int count) → dart.core::Iterable<dart.core::int*>
return new dart._internal::SubListIterable::•<dart.core::int*>(this, 0, count);
return new dart._internal::SubListIterable::•<dart.core::int*>(this, 0, dart._internal::checkNotNullable<dart.core::int>(count, "count"));
method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ takeWhile((dart.core::int*) → dart.core::bool test) → dart.core::Iterable<dart.core::int*> {
return new dart._internal::TakeWhileIterable::•<dart.core::int*>(this, test);
}

View file

@ -217,7 +217,7 @@ class JSArray<E> implements List<E>, JSIndexable<E> {
}
Iterable<E> take(int n) {
return SubListIterable<E>(this, 0, n);
return new SubListIterable<E>(this, 0, checkNotNullable(n, "count"));
}
Iterable<E> takeWhile(bool test(E value)) {

View file

@ -331,7 +331,7 @@ class JSArray<E> extends Interceptor implements List<E>, JSIndexable<E> {
}
Iterable<E> take(int n) {
return new SubListIterable<E>(this, 0, n);
return new SubListIterable<E>(this, 0, checkNotNullable(n, "count"));
}
Iterable<E> takeWhile(bool test(E value)) {

View file

@ -248,7 +248,8 @@ abstract class ListMixin<E> implements List<E> {
return SkipWhileIterable<E>(this, test);
}
Iterable<E> take(int count) => SubListIterable<E>(this, 0, count);
Iterable<E> take(int count) =>
SubListIterable<E>(this, 0, checkNotNullable(count, "count"));
Iterable<E> takeWhile(bool test(E element)) {
return TakeWhileIterable<E>(this, test);

View file

@ -204,7 +204,8 @@ abstract class ListIterable<E> extends EfficientLengthIterable<E> {
Iterable<E> skipWhile(bool test(E element)) => super.skipWhile(test);
Iterable<E> take(int count) => new SubListIterable<E>(this, 0, count);
Iterable<E> take(int count) =>
SubListIterable<E>(this, 0, checkNotNullable(count, "count"));
Iterable<E> takeWhile(bool test(E element)) => super.takeWhile(test);

View file

@ -180,4 +180,28 @@ main() {
Expect.throwsRangeError(() => list3.map((x) => x).skip(-1));
Expect.throwsRangeError(() => set1.map((x) => x).skip(-1));
Expect.throwsRangeError(() => set2.map((x) => x).skip(-1));
// Iterable<dynamic>.
var take5 = set2.take(0);
var it3 = take5.iterator;
Expect.isNull(it3.current);
Expect.isFalse(it3.moveNext());
Expect.isNull(it3.current);
take5 = set2.take(1);
it3 = take5.iterator;
Expect.isNull(it3.current);
Expect.isFalse(it3.moveNext());
Expect.isNull(it3.current);
Expect.throws(() => list1.take(-1), (e) => e is RangeError);
Expect.throws(() => list2.take(-1), (e) => e is RangeError);
Expect.throws(() => list3.take(-1), (e) => e is RangeError);
Expect.throws(() => set1.take(-1), (e) => e is RangeError);
Expect.throws(() => set2.take(-1), (e) => e is RangeError);
Expect.throws(() => list1.map((x) => x).take(-1), (e) => e is RangeError);
Expect.throws(() => list2.map((x) => x).take(-1), (e) => e is RangeError);
Expect.throws(() => list3.map((x) => x).take(-1), (e) => e is RangeError);
Expect.throws(() => set1.map((x) => x).take(-1), (e) => e is RangeError);
Expect.throws(() => set2.map((x) => x).take(-1), (e) => e is RangeError);
}

View file

@ -224,4 +224,15 @@ main() {
Expect.throwsRangeError(() => list3.map((x) => x).skip(-1));
Expect.throwsRangeError(() => set1.map((x) => x).skip(-1));
Expect.throwsRangeError(() => set2.map((x) => x).skip(-1));
Expect.throws(() => list1.take(null));
Expect.throws(() => list2.take(null));
Expect.throws(() => list3.take(null));
Expect.throws(() => set1.take(null));
Expect.throws(() => set2.take(null));
Expect.throws(() => list1.map((x) => x).take(null));
Expect.throws(() => list2.map((x) => x).take(null));
Expect.throws(() => list3.map((x) => x).take(null));
Expect.throws(() => set1.map((x) => x).take(null));
Expect.throws(() => set2.map((x) => x).take(null));
}