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