Removes some external inconsistency dangers from our collections.
Sometimes external collections can change unexpectedly; this change makes us call foreign collections fewer times to protect us from the possibility of inconsistency.
Review by: rice
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7284 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 e76a993..53754c7 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractList.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractList.java
@@ -206,10 +206,12 @@
public boolean addAll(int index, Collection<? extends E> c) {
Iterator<? extends E> iter = c.iterator();
+ boolean changed = false;
while (iter.hasNext()) {
add(index++, iter.next());
+ changed = true;
}
- return !c.isEmpty();
+ return changed;
}
@Override
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 418d953..b061955 100644
--- a/user/super/com/google/gwt/emul/java/util/ArrayList.java
+++ b/user/super/com/google/gwt/emul/java/util/ArrayList.java
@@ -81,7 +81,7 @@
public ArrayList(Collection<? extends E> c) {
// Avoid calling overridable methods from constructors
spliceArray(array, 0, 0, c.toArray());
- size = c.size();
+ size = array.length;
}
public ArrayList(int initialCapacity) {
@@ -107,23 +107,27 @@
@Override
public boolean addAll(Collection<? extends E> c) {
- if (c.isEmpty()) {
+ Object[] cArray = c.toArray();
+ int len = cArray.length;
+ if (len == 0) {
return false;
}
- spliceArray(array, size, 0, c.toArray());
- size += c.size();
+ spliceArray(array, size, 0, cArray);
+ size += len;
return true;
}
public boolean addAll(int index, Collection<? extends E> c) {
- if (c.isEmpty()) {
- return false;
- }
if (index < 0 || index > size) {
indexOutOfBounds(index, size);
}
- spliceArray(array, index, 0, c.toArray());
- size += c.size();
+ Object[] cArray = c.toArray();
+ int len = cArray.length;
+ if (len == 0) {
+ return false;
+ }
+ spliceArray(array, index, 0, cArray);
+ size += len;
return true;
}
diff --git a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
index 7e2727b..06d7d3c 100644
--- a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
+++ b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
@@ -33,6 +33,17 @@
private static volatile boolean NO_OPTIMIZE_FALSE = false;
+ public void testAddAll() {
+ assertFalse(makeEmptyList().addAll(makeEmptyList()));
+ assertTrue(makeEmptyList().addAll(makeFullList()));
+ assertFalse(makeEmptyList().addAll(0, makeEmptyList()));
+ assertTrue(makeEmptyList().addAll(0, makeFullList()));
+ assertFalse(makeFullList().addAll(makeEmptyList()));
+ assertTrue(makeFullList().addAll(makeFullList()));
+ assertFalse(makeFullList().addAll(1, makeEmptyList()));
+ assertTrue(makeFullList().addAll(1, makeFullList()));
+ }
+
public void testAddWatch() {
List s = makeEmptyList();
s.add("watch");