< prev index next >

src/java.base/share/classes/java/lang/AbstractStringBuilder.java

Print this page
rev 13764 : [mq]: 8149330-Friendly-realloc-in-StringBuilder

*** 136,173 **** * This method has the same contract as ensureCapacity, but is * never synchronized. */ private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code ! int capacity = value.length >> coder; ! if (minimumCapacity - capacity > 0) { ! expandCapacity(minimumCapacity); } } /** ! * This implements the expansion semantics of ensureCapacity with no ! * size check or synchronization. */ ! private void expandCapacity(int minimumCapacity) { ! int newCapacity = (value.length >> coder) * 2 + 2; ! if (newCapacity - minimumCapacity < 0) { ! newCapacity = minimumCapacity; ! } ! if (newCapacity < 0) { ! if (minimumCapacity < 0) {// overflow ! throw new OutOfMemoryError(); ! } ! newCapacity = Integer.MAX_VALUE; } ! if (coder != LATIN1 && newCapacity > StringUTF16.MAX_LENGTH) { ! if (minimumCapacity >= StringUTF16.MAX_LENGTH) { throw new OutOfMemoryError(); } ! newCapacity = StringUTF16.MAX_LENGTH; ! } ! this.value = Arrays.copyOf(value, newCapacity << coder); } /** * If the coder is "isLatin1", this inflates the internal 8-bit storage * to 16-bit <hi=0, low> pair storage. --- 136,192 ---- * This method has the same contract as ensureCapacity, but is * never synchronized. */ private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code ! int oldCapacity = value.length >> coder; ! if (minimumCapacity - oldCapacity > 0) { ! value = Arrays.copyOf(value, ! newCapacity(minimumCapacity) << coder); } } /** ! * The maximum size of array to allocate (unless necessary). ! * Some VMs reserve some header words in an array. ! * Attempts to allocate larger arrays may result in ! * OutOfMemoryError: Requested array size exceeds VM limit */ ! private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; ! ! /** ! * Returns a capacity at least as large as the given minimum capacity. ! * Returns the current capacity increased by the same amount + 2 if ! * that suffices. ! * Will not return a capacity greater than (MAX_ARRAY_SIZE >> coder) ! * unless the given minimum capacity is greater than that. ! * ! * @param minCapacity the desired minimum capacity ! * @throws OutOfMemoryError if minCapacity is less than zero or ! * greater than (Integer.MAX_VALUE >> coder) ! */ ! private int newCapacity(int minCapacity) { ! // overflow-conscious code ! int oldCapacity = value.length >> coder; ! int newCapacity = (oldCapacity << 1) + 2; ! if (newCapacity - minCapacity < 0) { ! newCapacity = minCapacity; ! } ! int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; ! return (newCapacity < 0 || SAFE_BOUND - newCapacity < 0) ! ? hugeCapacity(minCapacity) ! : newCapacity; } ! ! private int hugeCapacity(int minCapacity) { ! int SAFE_BOUND = MAX_ARRAY_SIZE >> coder; ! int UNSAFE_BOUND = Integer.MAX_VALUE >> coder; ! if (UNSAFE_BOUND - minCapacity < 0) { // overflow throw new OutOfMemoryError(); } ! return (minCapacity > SAFE_BOUND) ! ? minCapacity : SAFE_BOUND; } /** * If the coder is "isLatin1", this inflates the internal 8-bit storage * to 16-bit <hi=0, low> pair storage.
< prev index next >