162 @Override
163 public ArrayData set(final int index, final Object value, final boolean strict) {
164 if (value instanceof Double || (value != null && canWiden(value.getClass()))) {
165 return set(index, ((Number)value).doubleValue(), strict);
166 } else if (value == UNDEFINED) {
167 return new UndefinedArrayFilter(this).set(index, value, strict);
168 }
169
170 final ArrayData newData = convert(value == null ? Object.class : value.getClass());
171 return newData.set(index, value, strict);
172 }
173
174 @Override
175 public ArrayData set(final int index, final int value, final boolean strict) {
176 array[index] = value;
177 setLength(Math.max(index + 1, length()));
178 return this;
179 }
180
181 @Override
182 public ArrayData set(final int index, final long value, final boolean strict) {
183 array[index] = value;
184 setLength(Math.max(index + 1, length()));
185 return this;
186 }
187
188 @Override
189 public ArrayData set(final int index, final double value, final boolean strict) {
190 array[index] = value;
191 setLength(Math.max(index + 1, length()));
192 return this;
193 }
194
195 private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "getElem", double.class, int.class).methodHandle();
196 private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
197
198 @SuppressWarnings("unused")
199 private double getElem(final int index) {
200 if (has(index)) {
201 return array[index];
202 }
203 throw new ClassCastException();
204 }
205
206 @SuppressWarnings("unused")
207 private void setElem(final int index, final double elem) {
208 if (hasRoomFor(index)) {
209 array[index] = elem;
210 return;
211 }
212 throw new ClassCastException();
213 }
214
215 @Override
216 public MethodHandle getElementGetter(final Class<?> returnType, final int programPoint) {
217 if (returnType == int.class || returnType == long.class) {
218 return null;
219 }
220 return getContinuousElementGetter(HAS_GET_ELEM, returnType, programPoint);
221 }
222
223 @Override
224 public MethodHandle getElementSetter(final Class<?> elementType) {
225 return elementType.isPrimitive() ? getContinuousElementSetter(MH.asType(SET_ELEM, SET_ELEM.type().changeParameterType(2, elementType)), elementType) : null;
226 }
227
228 @Override
229 public int getInt(final int index) {
230 return JSType.toInt32(array[index]);
231 }
232
233 @Override
234 public long getLong(final int index) {
235 return (long)array[index];
236 }
237
238 @Override
239 public double getDouble(final int index) {
240 return array[index];
241 }
242
243 @Override
244 public double getDoubleOptimistic(final int index, final int programPoint) {
245 return array[index];
246 }
247
248 @Override
249 public Object getObject(final int index) {
250 return array[index];
251 }
252
253 @Override
254 public boolean has(final int index) {
255 return 0 <= index && index < length();
|
162 @Override
163 public ArrayData set(final int index, final Object value, final boolean strict) {
164 if (value instanceof Double || (value != null && canWiden(value.getClass()))) {
165 return set(index, ((Number)value).doubleValue(), strict);
166 } else if (value == UNDEFINED) {
167 return new UndefinedArrayFilter(this).set(index, value, strict);
168 }
169
170 final ArrayData newData = convert(value == null ? Object.class : value.getClass());
171 return newData.set(index, value, strict);
172 }
173
174 @Override
175 public ArrayData set(final int index, final int value, final boolean strict) {
176 array[index] = value;
177 setLength(Math.max(index + 1, length()));
178 return this;
179 }
180
181 @Override
182 public ArrayData set(final int index, final double value, final boolean strict) {
183 array[index] = value;
184 setLength(Math.max(index + 1, length()));
185 return this;
186 }
187
188 private static final MethodHandle HAS_GET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "getElem", double.class, int.class).methodHandle();
189 private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), NumberArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
190
191 @SuppressWarnings("unused")
192 private double getElem(final int index) {
193 if (has(index)) {
194 return array[index];
195 }
196 throw new ClassCastException();
197 }
198
199 @SuppressWarnings("unused")
200 private void setElem(final int index, final double elem) {
201 if (hasRoomFor(index)) {
202 array[index] = elem;
203 return;
204 }
205 throw new ClassCastException();
206 }
207
208 @Override
209 public MethodHandle getElementGetter(final Class<?> returnType, final int programPoint) {
210 if (returnType == int.class) {
211 return null;
212 }
213 return getContinuousElementGetter(HAS_GET_ELEM, returnType, programPoint);
214 }
215
216 @Override
217 public MethodHandle getElementSetter(final Class<?> elementType) {
218 return elementType.isPrimitive() ? getContinuousElementSetter(MH.asType(SET_ELEM, SET_ELEM.type().changeParameterType(2, elementType)), elementType) : null;
219 }
220
221 @Override
222 public int getInt(final int index) {
223 return JSType.toInt32(array[index]);
224 }
225
226 @Override
227 public double getDouble(final int index) {
228 return array[index];
229 }
230
231 @Override
232 public double getDoubleOptimistic(final int index, final int programPoint) {
233 return array[index];
234 }
235
236 @Override
237 public Object getObject(final int index) {
238 return array[index];
239 }
240
241 @Override
242 public boolean has(final int index) {
243 return 0 <= index && index < length();
|