Fixes issue #2298 by making list.addAdd(list) not get into an infinite loop. The implementation of ArrayList.addAll() should also be improved.
Review by: spoon (desk)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@2513 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractList.java b/user/super/com/google/gwt/emul/java/util/AbstractList.java
index 4290f58..4532d59 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractList.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractList.java
@@ -139,8 +139,7 @@
public boolean addAll(int index, Collection<? extends E> c) {
Iterator<? extends E> iter = c.iterator();
while (iter.hasNext()) {
- add(index, iter.next());
- ++index;
+ add(index++, iter.next());
}
return !c.isEmpty();
}
diff --git a/user/super/com/google/gwt/emul/java/util/ArrayList.java b/user/super/com/google/gwt/emul/java/util/ArrayList.java
index 8f221ce..c0f31e6 100644
--- a/user/super/com/google/gwt/emul/java/util/ArrayList.java
+++ b/user/super/com/google/gwt/emul/java/util/ArrayList.java
@@ -49,6 +49,10 @@
return array[index];
}-*/;
+ private static native void insertImpl(JavaScriptObject array, int index, Object[] o) /*-{
+ Array.prototype.splice.apply(array, [index, 0].concat(o));
+ }-*/;
+
private static native void removeRangeImpl(JavaScriptObject array, int index,
int count) /*-{
array.splice(index, count);
@@ -105,12 +109,24 @@
@Override
public boolean addAll(Collection<? extends E> c) {
- Iterator<? extends E> iter = c.iterator();
- boolean changed = iter.hasNext();
- while (iter.hasNext()) {
- setImpl(array, size++, iter.next());
+ if (c.isEmpty()) {
+ return false;
}
- return changed;
+ insertImpl(array, 0, c.toArray());
+ size += c.size();
+ return true;
+ }
+
+ public boolean addAll(int index, Collection<? extends E> c) {
+ if (c.isEmpty()) {
+ return false;
+ }
+ if (index < 0 || index > size) {
+ indexOutOfBounds(index, size);
+ }
+ insertImpl(array, index, c.toArray());
+ size += c.size();
+ return true;
}
@Override