< prev index next >
src/jdk/nashorn/internal/objects/NativeArray.java
Print this page
*** 98,121 ****
NativeArray() {
this(ArrayData.initialArray());
}
NativeArray(final long length) {
! // TODO assert valid index in long before casting
! this(ArrayData.allocate((int)length));
}
NativeArray(final int[] array) {
this(ArrayData.allocate(array));
}
! NativeArray(final long[] array) {
this(ArrayData.allocate(array));
}
! NativeArray(final double[] array) {
! this(ArrayData.allocate(array));
}
NativeArray(final Object[] array) {
this(ArrayData.allocate(array.length));
--- 98,139 ----
NativeArray() {
this(ArrayData.initialArray());
}
NativeArray(final long length) {
! this(ArrayData.allocate(length));
}
NativeArray(final int[] array) {
this(ArrayData.allocate(array));
}
! NativeArray(final double[] array) {
this(ArrayData.allocate(array));
}
! NativeArray(final long[] array) {
! this(ArrayData.allocate(array.length));
!
! ArrayData arrayData = this.getArray();
! Class<?> widest = int.class;
!
! for (int index = 0; index < array.length; index++) {
! final long value = array[index];
!
! if (widest == int.class && JSType.isRepresentableAsInt(value)) {
! arrayData = arrayData.set(index, (int) value, false);
! } else if (widest != Object.class && JSType.isRepresentableAsDouble(value)) {
! arrayData = arrayData.set(index, (double) value, false);
! widest = double.class;
! } else {
! arrayData = arrayData.set(index, (Object) value, false);
! widest = Object.class;
! }
! }
!
! this.setArray(arrayData);
}
NativeArray(final Object[] array) {
this(ArrayData.allocate(array.length));
*** 186,196 ****
return Global.instance().getDynamicInvoker(key,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", rtype, Object.class, Object.class, Object.class,
! long.class, Object.class);
}
});
}
private static MethodHandle getEVERY_CALLBACK_INVOKER() {
--- 204,214 ----
return Global.instance().getDynamicInvoker(key,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", rtype, Object.class, Object.class, Object.class,
! double.class, Object.class);
}
});
}
private static MethodHandle getEVERY_CALLBACK_INVOKER() {
*** 217,227 ****
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
! Undefined.class, Object.class, Object.class, long.class, Object.class);
}
});
}
private static MethodHandle getCALL_CMP() {
--- 235,245 ----
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
! Undefined.class, Object.class, Object.class, double.class, Object.class);
}
});
}
private static MethodHandle getCALL_CMP() {
*** 253,264 ****
return "Array";
}
@Override
public Object getLength() {
! final long length = JSType.toUint32(getArray().length());
! if (length < Integer.MAX_VALUE) {
return (int)length;
}
return length;
}
--- 271,283 ----
return "Array";
}
@Override
public Object getLength() {
! final long length = getArray().length();
! assert length >= 0L;
! if (length <= Integer.MAX_VALUE) {
return (int)length;
}
return length;
}
*** 452,462 ****
* @return the length of the object
*/
@Getter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static Object length(final Object self) {
if (isArray(self)) {
! return JSType.toUint32(((ScriptObject) self).getArray().length());
}
return 0;
}
--- 471,487 ----
* @return the length of the object
*/
@Getter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static Object length(final Object self) {
if (isArray(self)) {
! final long length = ((ScriptObject) self).getArray().length();
! assert length >= 0L;
! // Cast to the narrowest supported numeric type to help optimistic type calculator
! if (length <= Integer.MAX_VALUE) {
! return (int) length;
! }
! return (double) length;
}
return 0;
}
*** 1560,1570 ****
private static boolean applyEvery(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Boolean>(Global.toObject(self), callbackfn, thisArg, true) {
private final MethodHandle everyInvoker = getEVERY_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
return result = (boolean)everyInvoker.invokeExact(callbackfn, thisArg, val, i, self);
}
}.apply();
}
--- 1585,1595 ----
private static boolean applyEvery(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Boolean>(Global.toObject(self), callbackfn, thisArg, true) {
private final MethodHandle everyInvoker = getEVERY_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
return result = (boolean)everyInvoker.invokeExact(callbackfn, thisArg, val, i, self);
}
}.apply();
}
*** 1580,1590 ****
public static boolean some(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Boolean>(Global.toObject(self), callbackfn, thisArg, false) {
private final MethodHandle someInvoker = getSOME_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
return !(result = (boolean)someInvoker.invokeExact(callbackfn, thisArg, val, i, self));
}
}.apply();
}
--- 1605,1615 ----
public static boolean some(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Boolean>(Global.toObject(self), callbackfn, thisArg, false) {
private final MethodHandle someInvoker = getSOME_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
return !(result = (boolean)someInvoker.invokeExact(callbackfn, thisArg, val, i, self));
}
}.apply();
}
*** 1600,1610 ****
public static Object forEach(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Object>(Global.toObject(self), callbackfn, thisArg, ScriptRuntime.UNDEFINED) {
private final MethodHandle forEachInvoker = getFOREACH_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
forEachInvoker.invokeExact(callbackfn, thisArg, val, i, self);
return true;
}
}.apply();
}
--- 1625,1635 ----
public static Object forEach(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<Object>(Global.toObject(self), callbackfn, thisArg, ScriptRuntime.UNDEFINED) {
private final MethodHandle forEachInvoker = getFOREACH_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
forEachInvoker.invokeExact(callbackfn, thisArg, val, i, self);
return true;
}
}.apply();
}
*** 1621,1631 ****
public static NativeArray map(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<NativeArray>(Global.toObject(self), callbackfn, thisArg, null) {
private final MethodHandle mapInvoker = getMAP_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
final Object r = mapInvoker.invokeExact(callbackfn, thisArg, val, i, self);
result.defineOwnProperty(ArrayIndex.getArrayIndex(index), r);
return true;
}
--- 1646,1656 ----
public static NativeArray map(final Object self, final Object callbackfn, final Object thisArg) {
return new IteratorAction<NativeArray>(Global.toObject(self), callbackfn, thisArg, null) {
private final MethodHandle mapInvoker = getMAP_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
final Object r = mapInvoker.invokeExact(callbackfn, thisArg, val, i, self);
result.defineOwnProperty(ArrayIndex.getArrayIndex(index), r);
return true;
}
*** 1651,1661 ****
return new IteratorAction<NativeArray>(Global.toObject(self), callbackfn, thisArg, new NativeArray()) {
private long to = 0;
private final MethodHandle filterInvoker = getFILTER_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
if ((boolean)filterInvoker.invokeExact(callbackfn, thisArg, val, i, self)) {
result.defineOwnProperty(ArrayIndex.getArrayIndex(to++), val);
}
return true;
}
--- 1676,1686 ----
return new IteratorAction<NativeArray>(Global.toObject(self), callbackfn, thisArg, new NativeArray()) {
private long to = 0;
private final MethodHandle filterInvoker = getFILTER_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
if ((boolean)filterInvoker.invokeExact(callbackfn, thisArg, val, i, self)) {
result.defineOwnProperty(ArrayIndex.getArrayIndex(to++), val);
}
return true;
}
*** 1683,1693 ****
//if initial value is ScriptRuntime.UNDEFINED - step forward once.
return new IteratorAction<Object>(Global.toObject(self), callbackfn, ScriptRuntime.UNDEFINED, initialValue, iter) {
private final MethodHandle reduceInvoker = getREDUCE_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final long i) throws Throwable {
// TODO: why can't I declare the second arg as Undefined.class?
result = reduceInvoker.invokeExact(callbackfn, ScriptRuntime.UNDEFINED, result, val, i, self);
return true;
}
}.apply();
--- 1708,1718 ----
//if initial value is ScriptRuntime.UNDEFINED - step forward once.
return new IteratorAction<Object>(Global.toObject(self), callbackfn, ScriptRuntime.UNDEFINED, initialValue, iter) {
private final MethodHandle reduceInvoker = getREDUCE_CALLBACK_INVOKER();
@Override
! protected boolean forEach(final Object val, final double i) throws Throwable {
// TODO: why can't I declare the second arg as Undefined.class?
result = reduceInvoker.invokeExact(callbackfn, ScriptRuntime.UNDEFINED, result, val, i, self);
return true;
}
}.apply();
< prev index next >