Optimize VM List's setAll method.
Change-Id: Id488c42b1274de8a3d6f551f726404c0724b684f
Reviewed-on: https://dart-review.googlesource.com/c/84423
Commit-Queue: Leaf Petersen <leafp@google.com>
Reviewed-by: Leaf Petersen <leafp@google.com>
Auto-Submit: Lasse R.H. Nielsen <lrn@google.com>
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 2e93901..3797c4a 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -65,6 +65,30 @@
}
}
+ void setAll(int index, Iterable<E> iterable) {
+ if (index < 0 || index > this.length) {
+ throw new RangeError.range(index, 0, this.length, "index");
+ }
+ List<E> iterableAsList;
+ if (identical(this, iterable)) {
+ iterableAsList = this;
+ } else if (ClassID.getID(iterable) == ClassID.cidArray) {
+ iterableAsList = iterable;
+ } else if (iterable is List<E>) {
+ iterableAsList = iterable;
+ } else {
+ for (var value in iterable) {
+ this[index++] = value;
+ }
+ return;
+ }
+ int length = iterableAsList.length;
+ if (index + length > this.length) {
+ throw new RangeError.range(index + length, 0, this.length);
+ }
+ Lists.copy(iterableAsList, 0, this, index, length);
+ }
+
List<E> sublist(int start, [int end]) {
end = RangeError.checkValidRange(start, end, this.length);
int length = end - start;