On Mon, May 11, 2009 at 11:47, Allen Wirfs-Brock
<[email protected]> wrote:
> The motivation for replacing [[Put]] and [Delete]] calls with throwing 
> versions in the Array prototype functions was to provide proactive 
> notification when these algorithms were applied to arrays (or other objects) 
> where the existence of non-writable properties might result in violations of 
> the normally expected post conditions of the algorithms. Note that this had 
> not been a problem for ES3 because ES3 provided no programmatic way to set 
> the readonly attribute and the only built-in readonly property that might 
> impact these algorithms was the length property of strings.
>
> Arguably this situations comes up in ES3 only when these functions are 
> applied to String instances but note that manifesting array index properties 
> on String objects is not specified by ES3 so strictly speaking this is not an 
> ES3 compatibility issues but a compatibility issues relative to 
> implementations that have extended ES3 with such String properties. Also note 
> that IE (including IE8, although it has some SunSpider compatibility hacks in 
> this area) has never supported array-like indexing of String objects.  Hence, 
> it is debatable whether this is truly a "web compatibility" issue, as calling 
> of these functions on Strings does not work identically across all widely 
> used browsers.
>
> When we talked about this in the ES3.1 working group we didn't specifically 
> think about strings.  Instead we were thinking that reified properties 
> attributes creates a hazard where these functions might be inadvertently be 
> applied to Arrays or (or other objects) with non-writable properties and that 
> in such situations it would be better to throw an exception (making the 
> programmer aware of a likely bug) rather than allowing the functions to 
> silently complete but leaving objects in a state that violates the expected 
> post conditions of the functions.
>
> In reexamining this issue now, I started out thinking we had made a mistake 
> but after reconstructing the login chain that lead to this decision I find 
> myself "on the fence" and perhaps leaning a bit towards keeping the 
> exceptions.  The choice is between avoiding creating a new category of silent 
> bugs or maintaining compatibility with a not universally implemented 
> extension to ES3.
>
> How often are these functions really applied to strings? The use case for 
> applying pop to strings seemed reasonably compelling but as I look at most of 
> the other array functions I don't see that they make much sense in the 
> presence of non-writable elements.
>
> The other alternative, would be to special case the algorithms for these 
> functions such that they do not throw when the this object is a string object 
> but throw in all other scenarios.  This is actually a pretty trivial change 
> to make to the specification that would maintain compatibility with existing 
> implementations that support string indexing  but still throw in all other 
> cases (including Arrays) where non-writable properties would result in 
> violations of the expected post conditions.

I think the right solution would be to use a non throwing [[Put]] for
the Array methods for backwards compatibility.  NodeList and Arguments
are the common array like structures that people use the array
generics for and I can see other things like ImageData getting more
common in the near term future. Special casing String will not help
the common case.

-- 
erik
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to