src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java
Print this page
*** 273,283 ****
// Step 3b
final PropertyDescriptor newLenDesc = desc;
// Step 3c and 3d - get new length and convert to long
! final long newLen = NativeArray.validLength(newLenDesc.getValue(), true);
// Step 3e
newLenDesc.setValue(newLen);
// Step 3f
--- 273,283 ----
// Step 3b
final PropertyDescriptor newLenDesc = desc;
// Step 3c and 3d - get new length and convert to long
! final long newLen = NativeArray.validLength(newLenDesc.getValue());
// Step 3e
newLenDesc.setValue(newLen);
// Step 3f
*** 346,357 ****
// never be undefined as "length" is always defined and can't be deleted for arrays
// Step 1
final PropertyDescriptor oldLenDesc = (PropertyDescriptor) super.getOwnPropertyDescriptor("length");
// Step 2
! // get old length and convert to long
! final long oldLen = NativeArray.validLength(oldLenDesc.getValue(), true);
// Step 3
if ("length".equals(key)) {
// check for length being made non-writable
final boolean result = defineLength(oldLen, oldLenDesc, desc, reject);
--- 346,357 ----
// never be undefined as "length" is always defined and can't be deleted for arrays
// Step 1
final PropertyDescriptor oldLenDesc = (PropertyDescriptor) super.getOwnPropertyDescriptor("length");
// Step 2
! // get old length and convert to long. Always a Long/Uint32 but we take the safe road.
! final long oldLen = JSType.toUint32(oldLenDesc.getValue());
// Step 3
if ("length".equals(key)) {
// check for length being made non-writable
final boolean result = defineLength(oldLen, oldLenDesc, desc, reject);
*** 469,479 ****
* @param length new length property
*/
@Setter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static void length(final Object self, final Object length) {
if (isArray(self)) {
! ((ScriptObject)self).setLength(validLength(length, true));
}
}
/**
* Prototype length getter
--- 469,479 ----
* @param length new length property
*/
@Setter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static void length(final Object self, final Object length) {
if (isArray(self)) {
! ((ScriptObject)self).setLength(validLength(length));
}
}
/**
* Prototype length getter
*** 493,514 ****
@Setter(name = "length", where = Where.PROTOTYPE, attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static void setProtoLength(final Object self, final Object length) {
length(self, length); // Same as instance setter but we can't make nasgen use the same method for prototype
}
! static long validLength(final Object length, final boolean reject) {
final double doubleLength = JSType.toNumber(length);
! if (!Double.isNaN(doubleLength) && JSType.isRepresentableAsLong(doubleLength)) {
! final long len = (long) doubleLength;
! if (len >= 0 && len <= JSType.MAX_UINT) {
! return len;
! }
! }
! if (reject) {
throw rangeError("inappropriate.array.length", ScriptRuntime.safeToString(length));
}
! return -1;
}
/**
* ECMA 15.4.4.2 Array.prototype.toString ( )
*
--- 493,509 ----
@Setter(name = "length", where = Where.PROTOTYPE, attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
public static void setProtoLength(final Object self, final Object length) {
length(self, length); // Same as instance setter but we can't make nasgen use the same method for prototype
}
! static long validLength(final Object length) {
! // ES5 15.4.5.1, steps 3.c and 3.d require two ToNumber conversions here
final double doubleLength = JSType.toNumber(length);
! if (doubleLength != JSType.toUint32(length)) {
throw rangeError("inappropriate.array.length", ScriptRuntime.safeToString(length));
}
! return (long) doubleLength;
}
/**
* ECMA 15.4.4.2 Array.prototype.toString ( )
*