Could we make %ArrayPrototype%'s [[DefineOwnProperty]] throw or no-op for numeric keys?
As long as we have mutable __proto__
in the language that is not going to
help. And even then, you'd have to restrict the whole prototype chain,
including Object.prototype.
AFAICT, the only working solution is to change the behaviour of [[Get]] on arrays, such that they do not consider inherited numeric properties -- like typed arrays, or what we propose for strong mode arrays.
As long as we have mutable proto in the language that is not going to help. And even then, you'd have to restrict the whole prototype chain, including Object.prototype.
AFAICT, the only working solution is to change the behaviour of [[Get]] on arrays, such that they do not consider inherited numeric properties -- like typed arrays, or what we propose for strong mode arrays.
Would it help if one introduced new methods get()
and set()
for accessing array elements? They could be overridden, but that seems like a simpler, more optimizable check.
Just an idle thought:
Many of the spec-compliance bugs in engines' array implementations over the last couple years have had to do with handling what happens when you e.g. install getters or setters on %ArrayPrototype%. I've been told that handling this case adds lots of complexity to the implementations and their optimizations.
Would it be worthwhile to explore making this impossible? Since %ArrayPrototype% is an exotic object anyway, we could give it a custom [[DefineOwnProperty]] that behaves similarly to that of array exotic objects, but disallows defining numeric keys. I guess this comes down to a few questions:
Curious what implementers think.