--- jsr166/src/main/java/util/ArrayDeque.java 2017/05/31 19:01:08 1.129 +++ jsr166/src/main/java/util/ArrayDeque.java 2018/06/30 22:35:55 1.134 @@ -9,6 +9,7 @@ import java.io.Serializable; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; +import jdk.internal.misc.SharedSecrets; /** * Resizable-array implementation of the {@link Deque} interface. Array @@ -180,7 +181,7 @@ public class ArrayDeque extends Abstr * sufficient to hold 16 elements. */ public ArrayDeque() { - elements = new Object[16]; + elements = new Object[16 + 1]; } /** @@ -208,11 +209,11 @@ public class ArrayDeque extends Abstr */ public ArrayDeque(Collection c) { this(c.size()); - addAll(c); + copyElements(c); } /** - * Increments i, mod modulus. + * Circularly increments i, mod modulus. * Precondition and postcondition: 0 <= i < modulus. */ static final int inc(int i, int modulus) { @@ -221,7 +222,7 @@ public class ArrayDeque extends Abstr } /** - * Decrements i, mod modulus. + * Circularly decrements i, mod modulus. * Precondition and postcondition: 0 <= i < modulus. */ static final int dec(int i, int modulus) { @@ -234,7 +235,7 @@ public class ArrayDeque extends Abstr * Precondition: 0 <= i < modulus, 0 <= distance <= modulus. * @return index 0 <= i < modulus */ - static final int add(int i, int distance, int modulus) { + static final int inc(int i, int distance, int modulus) { if ((i += distance) - modulus >= 0) i -= modulus; return i; } @@ -244,7 +245,7 @@ public class ArrayDeque extends Abstr * Index i must be logically ahead of index j. * Precondition: 0 <= i < modulus, 0 <= j < modulus. * @return the "circular distance" from j to i; corner case i == j - * is diambiguated to "empty", returning 0. + * is disambiguated to "empty", returning 0. */ static final int sub(int i, int j, int modulus) { if ((i -= j) < 0) i += modulus; @@ -324,11 +325,15 @@ public class ArrayDeque extends Abstr final int s, needed; if ((needed = (s = size()) + c.size() + 1 - elements.length) > 0) grow(needed); - c.forEach(this::addLast); + copyElements(c); // checkInvariants(); return size() > s; } + private void copyElements(Collection c) { + c.forEach(this::addLast); + } + /** * Inserts the specified element at the front of this deque. * @@ -840,7 +845,7 @@ public class ArrayDeque extends Abstr final int i, n; return ((n = sub(getFence(), i = cursor, es.length) >> 1) <= 0) ? null - : new DeqSpliterator(i, cursor = add(i, n, es.length)); + : new DeqSpliterator(i, cursor = inc(i, n, es.length)); } public void forEachRemaining(Consumer action) { @@ -1235,6 +1240,7 @@ public class ArrayDeque extends Abstr // Read in size and allocate array int size = s.readInt(); + SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size + 1); elements = new Object[size + 1]; this.tail = size;