nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java
changeset 26886 18c744ab4df2
parent 26768 751b0f427090
child 27098 2875b30458d3
equal deleted inserted replaced
26786:f0c5e4b732da 26886:18c744ab4df2
    65         return new ObjectArrayData(array.clone(), (int)length);
    65         return new ObjectArrayData(array.clone(), (int)length);
    66     }
    66     }
    67 
    67 
    68     @Override
    68     @Override
    69     public Object[] asObjectArray() {
    69     public Object[] asObjectArray() {
    70         return array.length == length() ? array.clone() : asObjectArrayCopy();
    70         return array.length == length ? array.clone() : asObjectArrayCopy();
    71     }
    71     }
    72 
    72 
    73     private Object[] asObjectArrayCopy() {
    73     private Object[] asObjectArrayCopy() {
    74         final long l = length();
    74         final long len = length;
    75         assert l <= Integer.MAX_VALUE;
    75         assert len <= Integer.MAX_VALUE;
    76         final Object[] copy = new Object[(int)l];
    76         final Object[] copy = new Object[(int)len];
    77         System.arraycopy(array, 0, copy, 0, (int)l);
    77         System.arraycopy(array, 0, copy, 0, (int)len);
    78         return copy;
    78         return copy;
    79     }
    79     }
    80 
    80 
    81     @Override
    81     @Override
    82     public ArrayData convert(final Class<?> type) {
    82     public ArrayData convert(final Class<?> type) {
    88         System.arraycopy(array, by, array, 0, array.length - by);
    88         System.arraycopy(array, by, array, 0, array.length - by);
    89     }
    89     }
    90 
    90 
    91     @Override
    91     @Override
    92     public ArrayData shiftRight(final int by) {
    92     public ArrayData shiftRight(final int by) {
    93         final ArrayData newData = ensure(by + length() - 1);
    93         final ArrayData newData = ensure(by + length - 1);
    94         if (newData != this) {
    94         if (newData != this) {
    95             newData.shiftRight(by);
    95             newData.shiftRight(by);
    96             return newData;
    96             return newData;
    97         }
    97         }
    98         System.arraycopy(array, 0, array, by, array.length - by);
    98         System.arraycopy(array, 0, array, by, array.length - by);
   120     }
   120     }
   121 
   121 
   122     @Override
   122     @Override
   123     public ArrayData set(final int index, final Object value, final boolean strict) {
   123     public ArrayData set(final int index, final Object value, final boolean strict) {
   124         array[index] = value;
   124         array[index] = value;
   125         setLength(Math.max(index + 1, length()));
   125         setLength(Math.max(index + 1, length));
   126         return this;
   126         return this;
   127     }
   127     }
   128 
   128 
   129     @Override
   129     @Override
   130     public ArrayData set(final int index, final int value, final boolean strict) {
   130     public ArrayData set(final int index, final int value, final boolean strict) {
   131         array[index] = value;
   131         array[index] = value;
   132         setLength(Math.max(index + 1, length()));
   132         setLength(Math.max(index + 1, length));
   133         return this;
   133         return this;
   134     }
   134     }
   135 
   135 
   136     @Override
   136     @Override
   137     public ArrayData set(final int index, final long value, final boolean strict) {
   137     public ArrayData set(final int index, final long value, final boolean strict) {
   138         array[index] = value;
   138         array[index] = value;
   139         setLength(Math.max(index + 1, length()));
   139         setLength(Math.max(index + 1, length));
   140         return this;
   140         return this;
   141     }
   141     }
   142 
   142 
   143     @Override
   143     @Override
   144     public ArrayData set(final int index, final double value, final boolean strict) {
   144     public ArrayData set(final int index, final double value, final boolean strict) {
   145         array[index] = value;
   145         array[index] = value;
   146         setLength(Math.max(index + 1, length()));
   146         setLength(Math.max(index + 1, length));
   147         return this;
   147         return this;
   148     }
   148     }
   149 
   149 
   150     @Override
   150     @Override
   151     public ArrayData setEmpty(final int index) {
   151     public ArrayData setEmpty(final int index) {
   218         return array[index];
   218         return array[index];
   219     }
   219     }
   220 
   220 
   221     @Override
   221     @Override
   222     public boolean has(final int index) {
   222     public boolean has(final int index) {
   223         return 0 <= index && index < length();
   223         return 0 <= index && index < length;
   224     }
   224     }
   225 
   225 
   226     @Override
   226     @Override
   227     public ArrayData delete(final int index) {
   227     public ArrayData delete(final int index) {
   228         setEmpty(index);
   228         setEmpty(index);
   271         return elem;
   271         return elem;
   272     }
   272     }
   273 
   273 
   274     @Override
   274     @Override
   275     public Object pop() {
   275     public Object pop() {
   276         if (length() == 0) {
   276         if (length == 0) {
   277             return ScriptRuntime.UNDEFINED;
   277             return ScriptRuntime.UNDEFINED;
   278         }
   278         }
   279 
   279 
   280         final int newLength = (int) (length() - 1);
   280         final int newLength = (int)length - 1;
   281         final Object elem = array[newLength];
   281         final Object elem = array[newLength];
   282         setEmpty(newLength);
   282         setEmpty(newLength);
   283         setLength(newLength);
   283         setLength(newLength);
   284         return elem;
   284         return elem;
   285     }
   285     }
   286 
   286 
   287     @Override
   287     @Override
   288     public ArrayData slice(final long from, final long to) {
   288     public ArrayData slice(final long from, final long to) {
   289         final long start     = from < 0 ? from + length() : from;
   289         final long start     = from < 0 ? from + length : from;
   290         final long newLength = to - start;
   290         final long newLength = to - start;
   291         return new ObjectArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength);
   291         return new ObjectArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength);
   292     }
   292     }
   293 
   293 
   294     @Override
   294     @Override
   295     public ArrayData push(final boolean strict, final Object item) {
   295     public ArrayData push(final boolean strict, final Object item) {
   296         final long      length = length();
   296         final long      len     = length;
   297         final ArrayData newData = ensure(length);
   297         final ArrayData newData = ensure(len);
   298         if (newData == this) {
   298         if (newData == this) {
   299             array[(int)length] = item;
   299             array[(int)len] = item;
   300             return this;
   300             return this;
   301         }
   301         }
   302         return newData.set((int)length, item, strict);
   302         return newData.set((int)len, item, strict);
   303     }
   303     }
   304 
   304 
   305     @Override
   305     @Override
   306     public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
   306     public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
   307         final long oldLength = length();
   307         final long oldLength = length;
   308         final long newLength = oldLength - removed + added;
   308         final long newLength = oldLength - removed + added;
   309         if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) {
   309         if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) {
   310             throw new UnsupportedOperationException();
   310             throw new UnsupportedOperationException();
   311         }
   311         }
   312         final ArrayData returnValue = removed == 0 ?
   312         final ArrayData returnValue = removed == 0 ?