nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java
changeset 26886 18c744ab4df2
parent 26768 751b0f427090
child 27098 2875b30458d3
equal deleted inserted replaced
26786:f0c5e4b732da 26886:18c744ab4df2
    59         return double.class;
    59         return double.class;
    60     }
    60     }
    61 
    61 
    62     @Override
    62     @Override
    63     public ArrayData copy() {
    63     public ArrayData copy() {
    64         return new NumberArrayData(array.clone(), (int) length());
    64         return new NumberArrayData(array.clone(), (int)length);
    65     }
    65     }
    66 
    66 
    67     @Override
    67     @Override
    68     public Object[] asObjectArray() {
    68     public Object[] asObjectArray() {
    69         return toObjectArray(array, (int) length());
    69         return toObjectArray(array, (int)length);
    70     }
    70     }
    71 
    71 
    72     private static Object[] toObjectArray(final double[] array, final int length) {
    72     private static Object[] toObjectArray(final double[] array, final int length) {
    73         assert length <= array.length : "length exceeds internal array size";
    73         assert length <= array.length : "length exceeds internal array size";
    74         final Object[] oarray = new Object[array.length];
    74         final Object[] oarray = new Object[array.length];
    80     }
    80     }
    81 
    81 
    82     @Override
    82     @Override
    83     public Object asArrayOfType(final Class<?> componentType) {
    83     public Object asArrayOfType(final Class<?> componentType) {
    84         if(componentType == double.class) {
    84         if(componentType == double.class) {
    85             return array.length == length() ? array.clone() : Arrays.copyOf(array, (int) length());
    85             return array.length == length ? array.clone() : Arrays.copyOf(array, (int)length);
    86         }
    86         }
    87         return super.asArrayOfType(componentType);
    87         return super.asArrayOfType(componentType);
    88     }
    88     }
    89 
    89 
    90     @Override
    90     @Override
    91     public ArrayData convert(final Class<?> type) {
    91     public ArrayData convert(final Class<?> type) {
    92         if (type != Double.class && type != Integer.class && type != Long.class) {
    92         if (type != Double.class && type != Integer.class && type != Long.class) {
    93             final int length = (int) length();
    93             final int len = (int)length;
    94             return new ObjectArrayData(NumberArrayData.toObjectArray(array, length), length);
    94             return new ObjectArrayData(NumberArrayData.toObjectArray(array, len), len);
    95         }
    95         }
    96         return this;
    96         return this;
    97     }
    97     }
    98 
    98 
    99     @Override
    99     @Override
   101         System.arraycopy(array, by, array, 0, array.length - by);
   101         System.arraycopy(array, by, array, 0, array.length - by);
   102     }
   102     }
   103 
   103 
   104     @Override
   104     @Override
   105     public ArrayData shiftRight(final int by) {
   105     public ArrayData shiftRight(final int by) {
   106         final ArrayData newData = ensure(by + length() - 1);
   106         final ArrayData newData = ensure(by + length - 1);
   107         if (newData != this) {
   107         if (newData != this) {
   108             newData.shiftRight(by);
   108             newData.shiftRight(by);
   109             return newData;
   109             return newData;
   110         }
   110         }
   111         System.arraycopy(array, 0, array, by, array.length - by);
   111         System.arraycopy(array, 0, array, by, array.length - by);
   146     }
   146     }
   147 
   147 
   148     @Override
   148     @Override
   149     public ArrayData set(final int index, final int value, final boolean strict) {
   149     public ArrayData set(final int index, final int value, final boolean strict) {
   150         array[index] = value;
   150         array[index] = value;
   151         setLength(Math.max(index + 1, length()));
   151         setLength(Math.max(index + 1, length));
   152         return this;
   152         return this;
   153     }
   153     }
   154 
   154 
   155     @Override
   155     @Override
   156     public ArrayData set(final int index, final long value, final boolean strict) {
   156     public ArrayData set(final int index, final long value, final boolean strict) {
   157         array[index] = value;
   157         array[index] = value;
   158         setLength(Math.max(index + 1, length()));
   158         setLength(Math.max(index + 1, length));
   159         return this;
   159         return this;
   160     }
   160     }
   161 
   161 
   162     @Override
   162     @Override
   163     public ArrayData set(final int index, final double value, final boolean strict) {
   163     public ArrayData set(final int index, final double value, final boolean strict) {
   164         array[index] = value;
   164         array[index] = value;
   165         setLength(Math.max(index + 1, length()));
   165         setLength(Math.max(index + 1, length));
   166         return this;
   166         return this;
   167     }
   167     }
   168 
   168 
   169     @Override
   169     @Override
   170     public Type getOptimisticType() {
   170     public Type getOptimisticType() {
   229         return array[index];
   229         return array[index];
   230     }
   230     }
   231 
   231 
   232     @Override
   232     @Override
   233     public boolean has(final int index) {
   233     public boolean has(final int index) {
   234         return 0 <= index && index < length();
   234         return 0 <= index && index < length;
   235     }
   235     }
   236 
   236 
   237     @Override
   237     @Override
   238     public ArrayData delete(final int index) {
   238     public ArrayData delete(final int index) {
   239         return new DeletedRangeArrayFilter(this, index, index);
   239         return new DeletedRangeArrayFilter(this, index, index);
   244         return new DeletedRangeArrayFilter(this, fromIndex, toIndex);
   244         return new DeletedRangeArrayFilter(this, fromIndex, toIndex);
   245     }
   245     }
   246 
   246 
   247     @Override
   247     @Override
   248     public Object pop() {
   248     public Object pop() {
   249         if (length() == 0) {
   249         if (length == 0) {
   250             return UNDEFINED;
   250             return UNDEFINED;
   251         }
   251         }
   252 
   252 
   253         final int newLength = (int) (length() - 1);
   253         final int newLength = (int)length - 1;
   254         final double elem = array[newLength];
   254         final double elem = array[newLength];
   255         array[newLength] = 0;
   255         array[newLength] = 0;
   256         setLength(newLength);
   256         setLength(newLength);
   257         return elem;
   257         return elem;
   258     }
   258     }
   259 
   259 
   260     @Override
   260     @Override
   261     public ArrayData slice(final long from, final long to) {
   261     public ArrayData slice(final long from, final long to) {
   262         final long start     = from < 0 ? from + length() : from;
   262         final long start     = from < 0 ? from + length : from;
   263         final long newLength = to - start;
   263         final long newLength = to - start;
   264         return new NumberArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength);
   264         return new NumberArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength);
   265     }
   265     }
   266 
   266 
   267     @Override
   267     @Override
   268     public final ArrayData push(final boolean strict, final double item) {
   268     public final ArrayData push(final boolean strict, final double item) {
   269         final long      length = length();
   269         final long      len     = length;
   270         final ArrayData newData = ensure(length);
   270         final ArrayData newData = ensure(len);
   271         if (newData == this) {
   271         if (newData == this) {
   272             array[(int)length] = item;
   272             array[(int)len] = item;
   273             return this;
   273             return this;
   274         }
   274         }
   275         return newData.set((int)length, item, strict);
   275         return newData.set((int)len, item, strict);
   276     }
   276     }
   277 
   277 
   278     @Override
   278     @Override
   279     public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
   279     public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
   280         final long oldLength = length();
   280         final long oldLength = length;
   281         final long newLength = oldLength - removed + added;
   281         final long newLength = oldLength - removed + added;
   282         if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) {
   282         if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) {
   283             throw new UnsupportedOperationException();
   283             throw new UnsupportedOperationException();
   284         }
   284         }
   285         final ArrayData returnValue = removed == 0 ?
   285         final ArrayData returnValue = removed == 0 ?