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