src/jdk/nashorn/internal/objects/NativeArray.java
Print this page
*** 29,38 ****
--- 29,39 ----
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
import static jdk.nashorn.internal.runtime.PropertyDescriptor.VALUE;
import static jdk.nashorn.internal.runtime.PropertyDescriptor.WRITABLE;
import static jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator.arrayLikeIterator;
import static jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator.reverseArrayLikeIterator;
+ import static jdk.nashorn.internal.runtime.arrays.ArrayIndex.isValidArrayIndex;
import java.lang.invoke.MethodHandle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
*** 348,357 ****
--- 349,379 ----
// not an index property
return super.defineOwnProperty(key, desc, reject);
}
/**
+ * Spec. mentions use of [[DefineOwnProperty]] for indexed properties in
+ * certain places (eg. Array.prototype.map, filter). We can not use ScriptObject.set
+ * method in such cases. This is because set method uses inherited setters (if any)
+ * from any object in proto chain such as Array.prototype, Object.prototype.
+ * This method directly sets a particular element value in the current object.
+ *
+ * @param index key for property
+ * @param value value to define
+ */
+ @Override
+ public final void defineOwnProperty(final int index, final Object value) {
+ assert isValidArrayIndex(index) : "invalid array index";
+ final long longIndex = ArrayIndex.toLongIndex(index);
+ if (longIndex >= getArray().length()) {
+ // make array big enough to hold..
+ setArray(getArray().ensure(longIndex));
+ }
+ setArray(getArray().set(index, value, false));
+ }
+
+ /**
* Return the array contents upcasted as an ObjectArray, regardless of
* representation
*
* @return an object array
*/