Index: runtime/lib/array.dart |
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart |
index 78d30f784c4881a72821297bc853313251507d91..5ad34037a7cbb8a5e3c2357f8ff7c7b570069f86 100644 |
--- a/runtime/lib/array.dart |
+++ b/runtime/lib/array.dart |
@@ -102,11 +102,12 @@ class _List<E> implements List<E> { |
Lists.indicesCheck(this, start, end); |
if (end == null) end = this.length; |
int length = end - start; |
- if (start == end) return []; |
- List list = new _GrowableList<E>.withCapacity(length); |
- list.length = length; |
- Lists.copy(this, start, list, 0, length); |
- return list; |
+ if (start == end) return <E>[]; |
+ List list = new _List(length); |
+ list._copyFromObjectArray(this, start, 0, length); |
+ var result = new _GrowableList<E>.withData(list); |
+ result._setLength(length); |
+ return result; |
} |
// Iterable interface. |
@@ -249,8 +250,15 @@ class _List<E> implements List<E> { |
throw IterableElementError.tooMany(); |
} |
- List<E> toList({ bool growable: true}) { |
- return new List<E>.from(this, growable: growable); |
+ List<E> toList({ bool growable: true }) { |
+ var length = this.length; |
+ var result = growable ? new _List(length) : new _List<E>(length); |
+ result._copyFromObjectArray(this, 0, 0, length); |
+ if (growable) { |
+ result = new _GrowableList<E>.withData(result); |
+ result._setLength(length); |
+ } |
+ return result; |
} |
Set<E> toSet() { |
@@ -340,11 +348,12 @@ class _ImmutableList<E> implements List<E> { |
Lists.indicesCheck(this, start, end); |
if (end == null) end = this.length; |
int length = end - start; |
- if (start == end) return []; |
- List list = new List<E>(); |
- list.length = length; |
+ if (start == end) return <E>[]; |
+ List list = new _List(length); |
Lists.copy(this, start, list, 0, length); |
- return list; |
+ var result = new _GrowableList<E>.withData(list); |
+ result._setLength(length); |
+ return result; |
} |
Iterable<E> getRange(int start, int end) { |
@@ -496,7 +505,10 @@ class _ImmutableList<E> implements List<E> { |
} |
List<E> toList({ bool growable: true }) { |
- return new List<E>.from(this, growable: growable); |
+ int length = this.length; |
+ List list = growable ? new _GrowableList<E>(length) : new _List<E>(length); |
+ Lists.copy(this, 0, list, 0, length); |
+ return list; |
} |
Set<E> toSet() { |