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");