139 140 for (int index = 0; index < len; index++) { 141 oarray[index] = array[index]; 142 } 143 144 return oarray; 145 } 146 147 private double[] toDoubleArray() { 148 assert length() <= array.length : "length exceeds internal array size"; 149 final int len = (int)length(); 150 final double[] darray = new double[array.length]; 151 152 for (int index = 0; index < len; index++) { 153 darray[index] = array[index]; 154 } 155 156 return darray; 157 } 158 159 private long[] toLongArray() { 160 assert length() <= array.length : "length exceeds internal array size"; 161 final int len = (int)length(); 162 final long[] larray = new long[array.length]; 163 164 for (int index = 0; index < len; index++) { 165 larray[index] = array[index]; 166 } 167 168 return larray; 169 } 170 171 private LongArrayData convertToLong() { 172 return new LongArrayData(toLongArray(), (int)length()); 173 } 174 175 private NumberArrayData convertToDouble() { 176 return new NumberArrayData(toDoubleArray(), (int)length()); 177 } 178 179 private ObjectArrayData convertToObject() { 180 return new ObjectArrayData(toObjectArray(false), (int)length()); 181 } 182 183 @Override 184 public ArrayData convert(final Class<?> type) { 185 if (type == Integer.class || type == Byte.class || type == Short.class) { 186 return this; 187 } else if (type == Long.class) { 188 return convertToLong(); 189 } else if (type == Double.class || type == Float.class) { 190 return convertToDouble(); 191 } else { 192 return convertToObject(); 193 } 194 } 195 196 @Override 197 public void shiftLeft(final int by) { 198 System.arraycopy(array, by, array, 0, array.length - by); 199 } 200 201 @Override 202 public ArrayData shiftRight(final int by) { 203 final ArrayData newData = ensure(by + length() - 1); 204 if (newData != this) { 205 newData.shiftRight(by); 206 return newData; 207 } 208 System.arraycopy(array, 0, array, by, array.length - by); 236 public ArrayData set(final int index, final Object value, final boolean strict) { 237 if (JSType.isRepresentableAsInt(value)) { 238 return set(index, JSType.toInt32(value), strict); 239 } else if (value == ScriptRuntime.UNDEFINED) { 240 return new UndefinedArrayFilter(this).set(index, value, strict); 241 } 242 243 final ArrayData newData = convert(value == null ? Object.class : value.getClass()); 244 return newData.set(index, value, strict); 245 } 246 247 @Override 248 public ArrayData set(final int index, final int value, final boolean strict) { 249 array[index] = value; 250 setLength(Math.max(index + 1, length())); 251 252 return this; 253 } 254 255 @Override 256 public ArrayData set(final int index, final long value, final boolean strict) { 257 if (JSType.isRepresentableAsInt(value)) { 258 array[index] = JSType.toInt32(value); 259 setLength(Math.max(index + 1, length())); 260 return this; 261 } 262 263 return convert(Long.class).set(index, value, strict); 264 } 265 266 @Override 267 public ArrayData set(final int index, final double value, final boolean strict) { 268 if (JSType.isRepresentableAsInt(value)) { 269 array[index] = (int)(long)value; 270 setLength(Math.max(index + 1, length())); 271 return this; 272 } 273 274 return convert(Double.class).set(index, value, strict); 275 } 276 277 @Override 278 public int getInt(final int index) { 279 return array[index]; 280 } 281 282 @Override 283 public int getIntOptimistic(final int index, final int programPoint) { 284 return array[index]; 285 } 286 287 @Override 288 public long getLong(final int index) { 289 return array[index]; 290 } 291 292 @Override 293 public long getLongOptimistic(final int index, final int programPoint) { 294 return array[index]; 295 } 296 297 @Override 298 public double getDouble(final int index) { 299 return array[index]; 300 } 301 302 @Override 303 public double getDoubleOptimistic(final int index, final int programPoint) { 304 return array[index]; 305 } 306 307 @Override 308 public Object getObject(final int index) { 309 return array[index]; 310 } 311 312 @Override 313 public boolean has(final int index) { | 139 140 for (int index = 0; index < len; index++) { 141 oarray[index] = array[index]; 142 } 143 144 return oarray; 145 } 146 147 private double[] toDoubleArray() { 148 assert length() <= array.length : "length exceeds internal array size"; 149 final int len = (int)length(); 150 final double[] darray = new double[array.length]; 151 152 for (int index = 0; index < len; index++) { 153 darray[index] = array[index]; 154 } 155 156 return darray; 157 } 158 159 private NumberArrayData convertToDouble() { 160 return new NumberArrayData(toDoubleArray(), (int)length()); 161 } 162 163 private ObjectArrayData convertToObject() { 164 return new ObjectArrayData(toObjectArray(false), (int)length()); 165 } 166 167 @Override 168 public ArrayData convert(final Class<?> type) { 169 if (type == Integer.class || type == Byte.class || type == Short.class) { 170 return this; 171 } else if (type == Double.class || type == Float.class) { 172 return convertToDouble(); 173 } else { 174 return convertToObject(); 175 } 176 } 177 178 @Override 179 public void shiftLeft(final int by) { 180 System.arraycopy(array, by, array, 0, array.length - by); 181 } 182 183 @Override 184 public ArrayData shiftRight(final int by) { 185 final ArrayData newData = ensure(by + length() - 1); 186 if (newData != this) { 187 newData.shiftRight(by); 188 return newData; 189 } 190 System.arraycopy(array, 0, array, by, array.length - by); 218 public ArrayData set(final int index, final Object value, final boolean strict) { 219 if (JSType.isRepresentableAsInt(value)) { 220 return set(index, JSType.toInt32(value), strict); 221 } else if (value == ScriptRuntime.UNDEFINED) { 222 return new UndefinedArrayFilter(this).set(index, value, strict); 223 } 224 225 final ArrayData newData = convert(value == null ? Object.class : value.getClass()); 226 return newData.set(index, value, strict); 227 } 228 229 @Override 230 public ArrayData set(final int index, final int value, final boolean strict) { 231 array[index] = value; 232 setLength(Math.max(index + 1, length())); 233 234 return this; 235 } 236 237 @Override 238 public ArrayData set(final int index, final double value, final boolean strict) { 239 if (JSType.isRepresentableAsInt(value)) { 240 array[index] = (int)(long)value; 241 setLength(Math.max(index + 1, length())); 242 return this; 243 } 244 245 return convert(Double.class).set(index, value, strict); 246 } 247 248 @Override 249 public int getInt(final int index) { 250 return array[index]; 251 } 252 253 @Override 254 public int getIntOptimistic(final int index, final int programPoint) { 255 return array[index]; 256 } 257 258 @Override 259 public double getDouble(final int index) { 260 return array[index]; 261 } 262 263 @Override 264 public double getDoubleOptimistic(final int index, final int programPoint) { 265 return array[index]; 266 } 267 268 @Override 269 public Object getObject(final int index) { 270 return array[index]; 271 } 272 273 @Override 274 public boolean has(final int index) { |