Mon, 03 Nov 2014 14:59:34 +0100
8062490: Out of memory problems, as untouched array datas didn't go directly to SparseArrayDatas, but dragged very large int arrays around.
Reviewed-by: attila, sundar
1.1 --- a/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Mon Nov 03 13:58:52 2014 +0100 1.2 +++ b/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Mon Nov 03 14:59:34 2014 +0100 1.3 @@ -98,6 +98,10 @@ 1.4 @Override 1.5 public ArrayData ensure(final long safeIndex) { 1.6 if (safeIndex > 0L) { 1.7 + if (safeIndex >= SparseArrayData.MAX_DENSE_LENGTH) { 1.8 + return new SparseArrayData(this, safeIndex + 1); 1.9 + } 1.10 + //known to fit in int 1.11 return toRealArrayData((int)safeIndex).ensure(safeIndex); 1.12 } 1.13 return this;
2.1 --- a/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Mon Nov 03 13:58:52 2014 +0100 2.2 +++ b/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Mon Nov 03 14:59:34 2014 +0100 2.3 @@ -38,6 +38,11 @@ 2.4 class SparseArrayData extends ArrayData { 2.5 static final long MAX_DENSE_LENGTH = 16 * 512 * 1024; 2.6 2.7 + static { 2.8 + // we must break into sparse arrays before we require long indexes 2.9 + assert MAX_DENSE_LENGTH <= Integer.MAX_VALUE; 2.10 + } 2.11 + 2.12 /** Underlying array. */ 2.13 private ArrayData underlying; 2.14