< prev index next >
src/java.base/share/classes/java/lang/StringLatin1.java
Print this page
rev 54892 : imported patch 8223593-Refactor-code-for-reallocating-storage
*** 33,57 ****
import java.util.function.IntConsumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import jdk.internal.HotSpotIntrinsicCandidate;
import static java.lang.String.LATIN1;
import static java.lang.String.UTF16;
import static java.lang.String.checkOffset;
final class StringLatin1 {
- /**
- * 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;
-
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
--- 33,50 ----
import java.util.function.IntConsumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import jdk.internal.HotSpotIntrinsicCandidate;
+ import jdk.internal.util.ArraysSupport;
import static java.lang.String.LATIN1;
import static java.lang.String.UTF16;
import static java.lang.String.checkOffset;
final class StringLatin1 {
public static char charAt(byte[] value, int index) {
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return (char)(value[index] & 0xff);
*** 351,369 ****
int[] pos = new int[16];
pos[0] = i;
i += targLen;
while ((j = indexOf(value, valLen, targ, targLen, i)) > 0) {
if (++p == pos.length) {
! int cap = p + (p >> 1);
! // overflow-conscious code
! if (cap - MAX_ARRAY_SIZE > 0) {
! if (p == MAX_ARRAY_SIZE) {
! throw new OutOfMemoryError();
! }
! cap = MAX_ARRAY_SIZE;
! }
! pos = Arrays.copyOf(pos, cap);
}
pos[p] = j;
i = j + targLen;
}
--- 344,354 ----
int[] pos = new int[16];
pos[0] = i;
i += targLen;
while ((j = indexOf(value, valLen, targ, targLen, i)) > 0) {
if (++p == pos.length) {
! pos = Arrays.copyOf(pos, ArraysSupport.calcLength(p, 1, p >> 1));
}
pos[p] = j;
i = j + targLen;
}
< prev index next >