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;