103 return elementType == int.class ? getContinuousElementSetter(SET_ELEM, elementType) : null; |
103 return elementType == int.class ? getContinuousElementSetter(SET_ELEM, elementType) : null; |
104 } |
104 } |
105 |
105 |
106 @Override |
106 @Override |
107 public ArrayData copy() { |
107 public ArrayData copy() { |
108 return new IntArrayData(array.clone(), (int) length()); |
108 return new IntArrayData(array.clone(), (int)length); |
109 } |
109 } |
110 |
110 |
111 @Override |
111 @Override |
112 public Object asArrayOfType(final Class<?> componentType) { |
112 public Object asArrayOfType(final Class<?> componentType) { |
113 if (componentType == int.class) { |
113 if (componentType == int.class) { |
114 return array.length == length() ? array.clone() : Arrays.copyOf(array, (int) length()); |
114 return array.length == length ? array.clone() : Arrays.copyOf(array, (int)length); |
115 } |
115 } |
116 return super.asArrayOfType(componentType); |
116 return super.asArrayOfType(componentType); |
117 } |
117 } |
118 |
118 |
119 private Object[] toObjectArray() { |
119 private Object[] toObjectArray() { |
181 System.arraycopy(array, by, array, 0, array.length - by); |
181 System.arraycopy(array, by, array, 0, array.length - by); |
182 } |
182 } |
183 |
183 |
184 @Override |
184 @Override |
185 public ArrayData shiftRight(final int by) { |
185 public ArrayData shiftRight(final int by) { |
186 final ArrayData newData = ensure(by + length() - 1); |
186 final ArrayData newData = ensure(by + length - 1); |
187 if (newData != this) { |
187 if (newData != this) { |
188 newData.shiftRight(by); |
188 newData.shiftRight(by); |
189 return newData; |
189 return newData; |
190 } |
190 } |
191 System.arraycopy(array, 0, array, by, array.length - by); |
191 System.arraycopy(array, 0, array, by, array.length - by); |
227 } |
227 } |
228 |
228 |
229 @Override |
229 @Override |
230 public ArrayData set(final int index, final int value, final boolean strict) { |
230 public ArrayData set(final int index, final int value, final boolean strict) { |
231 array[index] = value; |
231 array[index] = value; |
232 setLength(Math.max(index + 1, length())); |
232 setLength(Math.max(index + 1, length)); |
233 |
233 |
234 return this; |
234 return this; |
235 } |
235 } |
236 |
236 |
237 @Override |
237 @Override |
238 public ArrayData set(final int index, final long value, final boolean strict) { |
238 public ArrayData set(final int index, final long value, final boolean strict) { |
239 if (JSType.isRepresentableAsInt(value)) { |
239 if (JSType.isRepresentableAsInt(value)) { |
240 array[index] = JSType.toInt32(value); |
240 array[index] = JSType.toInt32(value); |
241 setLength(Math.max(index + 1, length())); |
241 setLength(Math.max(index + 1, length)); |
242 return this; |
242 return this; |
243 } |
243 } |
244 |
244 |
245 return convert(Long.class).set(index, value, strict); |
245 return convert(Long.class).set(index, value, strict); |
246 } |
246 } |
247 |
247 |
248 @Override |
248 @Override |
249 public ArrayData set(final int index, final double value, final boolean strict) { |
249 public ArrayData set(final int index, final double value, final boolean strict) { |
250 if (JSType.isRepresentableAsInt(value)) { |
250 if (JSType.isRepresentableAsInt(value)) { |
251 array[index] = (int)(long)value; |
251 array[index] = (int)(long)value; |
252 setLength(Math.max(index + 1, length())); |
252 setLength(Math.max(index + 1, length)); |
253 return this; |
253 return this; |
254 } |
254 } |
255 |
255 |
256 return convert(Double.class).set(index, value, strict); |
256 return convert(Double.class).set(index, value, strict); |
257 } |
257 } |
311 return new DeletedRangeArrayFilter(this, fromIndex, toIndex); |
311 return new DeletedRangeArrayFilter(this, fromIndex, toIndex); |
312 } |
312 } |
313 |
313 |
314 @Override |
314 @Override |
315 public Object pop() { |
315 public Object pop() { |
316 if (length() == 0) { |
316 if (length == 0) { |
317 return ScriptRuntime.UNDEFINED; |
317 return ScriptRuntime.UNDEFINED; |
318 } |
318 } |
319 |
319 |
320 final int newLength = (int) length() - 1; |
320 final int newLength = (int)length - 1; |
321 final int elem = array[newLength]; |
321 final int elem = array[newLength]; |
322 array[newLength] = 0; |
322 array[newLength] = 0; |
323 setLength(newLength); |
323 setLength(newLength); |
324 |
324 |
325 return elem; |
325 return elem; |
326 } |
326 } |
327 |
327 |
328 @Override |
328 @Override |
329 public ArrayData slice(final long from, final long to) { |
329 public ArrayData slice(final long from, final long to) { |
330 final long start = from < 0 ? from + length() : from; |
330 final long start = from < 0 ? from + length : from; |
331 final long newLength = to - start; |
331 final long newLength = to - start; |
332 |
332 |
333 return new IntArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength); |
333 return new IntArrayData(Arrays.copyOfRange(array, (int)from, (int)to), (int)newLength); |
334 } |
334 } |
335 |
335 |
336 @Override |
336 @Override |
337 public final ArrayData push(final boolean strict, final int item) { |
337 public final ArrayData push(final boolean strict, final int item) { |
338 final long length = length(); |
338 final long len = length; |
339 final ArrayData newData = ensure(length); |
339 final ArrayData newData = ensure(len); |
340 if (newData == this) { |
340 if (newData == this) { |
341 array[(int)length] = item; |
341 array[(int)len] = item; |
342 return this; |
342 return this; |
343 } |
343 } |
344 return newData.set((int)length, item, strict); |
344 return newData.set((int)len, item, strict); |
345 } |
345 } |
346 |
346 |
347 @Override |
347 @Override |
348 public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException { |
348 public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException { |
349 final long oldLength = length(); |
349 final long oldLength = length; |
350 final long newLength = oldLength - removed + added; |
350 final long newLength = oldLength - removed + added; |
351 if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) { |
351 if (newLength > SparseArrayData.MAX_DENSE_LENGTH && newLength > array.length) { |
352 throw new UnsupportedOperationException(); |
352 throw new UnsupportedOperationException(); |
353 } |
353 } |
354 final ArrayData returnValue = removed == 0 ? |
354 final ArrayData returnValue = removed == 0 ? |