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 */