# HG changeset patch # User lagergren # Date 1415023174 -3600 # Node ID b00442519275b0fa7d984b9b6dd30fdca2c30e85 # Parent 4ac6934c6cc2076302ef4c716698283feae8cb17 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 diff -r 4ac6934c6cc2 -r b00442519275 src/jdk/nashorn/internal/runtime/arrays/ArrayData.java --- a/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Mon Nov 03 13:58:52 2014 +0100 +++ b/src/jdk/nashorn/internal/runtime/arrays/ArrayData.java Mon Nov 03 14:59:34 2014 +0100 @@ -98,6 +98,10 @@ @Override public ArrayData ensure(final long safeIndex) { if (safeIndex > 0L) { + if (safeIndex >= SparseArrayData.MAX_DENSE_LENGTH) { + return new SparseArrayData(this, safeIndex + 1); + } + //known to fit in int return toRealArrayData((int)safeIndex).ensure(safeIndex); } return this; diff -r 4ac6934c6cc2 -r b00442519275 src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java --- a/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Mon Nov 03 13:58:52 2014 +0100 +++ b/src/jdk/nashorn/internal/runtime/arrays/SparseArrayData.java Mon Nov 03 14:59:34 2014 +0100 @@ -38,6 +38,11 @@ class SparseArrayData extends ArrayData { static final long MAX_DENSE_LENGTH = 16 * 512 * 1024; + static { + // we must break into sparse arrays before we require long indexes + assert MAX_DENSE_LENGTH <= Integer.MAX_VALUE; + } + /** Underlying array. */ private ArrayData underlying;