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) { |
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 ? |