On Feb 16, 2013, at 11:57 AM, Mark S. Miller wrote:

> Allen, by "put:", did you mean "set:"?
> 

aaaaarrrrrrrggg.....  to much vacation.....

yes, of course, it should be "set" in which case the exception does occur as it 
should in FF.

Allen





> 
> On Sat, Feb 16, 2013 at 10:51 AM, Allen Wirfs-Brock <al...@wirfs-brock.com> 
> wrote:
> 
> On Feb 15, 2013, at 6:30 PM, Jeff Walden wrote:
> 
>> Consider:
>> 
>>  Object.defineProperty(Object.prototype, "0", { value: 17, writable: false, 
>> configurable: false });
>>  [].push(42);
>> 
>> Per ES5, I think this is supposed to throw a TypeError.  The push should be 
>> setting property "0" with Throw = true, which means that when [[CanPut]] 
>> fails, a TypeError gets thrown.  No engine I can test does this, I suspect 
>> because everyone's mis-implemented an optimization.
> 
> Right, ES5 carefully put in all those Throw = true's, to account for exactly 
> those situations.   Did you also test for non-writable and accessor 
> properties on an actual Array instance.
> 
> Did you try this on IE9/10 (I don't have copies available with me right now). 
>  All the other browsers had implementations of push and other Array methods  
> that predate ES5, so it is conceivable that those implementations have not 
> been updated to match the spec. IE9, on the other-hand, was a new 
> implementation that post dates ES5 and was supposed to be following the spec.
> 
> I'm shocked if Test262 doesn't include any tests for these situations.  I'm 
> remember including them in a list of things that needed to be tested for all 
> of the Array methods that was handed off to the team that wrote the  Test262 
> tests.
> 
>> 
>> On IRC it was pointed out that 
>> http://wiki.ecmascript.org/doku.php?id=strawman:fixing_override_mistake is 
>> supposed to fix this: you should be able to shadow a non-writable property 
>> on a prototype.  Or something.  But there's contention there about this not 
>> actually being a mistake.  (I think that contention's probably right, for 
>> what it's worth, but I digress.)
>> 
>> But suppose it isn't, for the moment.  What then of this:
>> 
>>  Object.defineProperty(Object.prototype, 0, { set: function() { throw 
>> "FAIL"; } });
>>  [].push(42)
>> 
>> I think this should throw, again because it's *setting* property "0".  But 
>> again, no engine I can test actually throws for this.
>> 
>> My gut says this is a case where every engine attempted to optimize, and 
>> optimized wrongly such that incorrect semantics resulted.  The question is, 
>> since no engine's following the spec, whether the spec should change, the 
>> engines should change, or what.  Given that indexed properties on 
>> Array.prototype and Object.prototype are not something anyone sane does, I 
>> tend to think changing it to [[DefineOwnProperty]] would be good.  But maybe 
>> the spec really should win, and everyone should change.  I dunno.  Please 
>> sort this out!  :-)
> 
> Prior to ES5, implementations were doing various random things for the edge 
> cases of accessor properties in arrays.  ES5 now tells them what they are 
> supposed to do.
> 
> Note that implementation bugs aren't just in the Array methods and don't 
> require access to inherited properties.  I just tried the following  in a 
> FF18 scratch pad:
> 
> var a = []
> 
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> 
> */
> 
> a[1]=0
> /*
> 0
> */
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
> 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
> 
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> var a = []
> Object.defineProperty(a, "1", {
> 
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> 
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
> 
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
> 
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> 
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
> 
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
> 
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> 
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
> 
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
> 
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> 
> */
> 
> var a = []
> Object.defineProperty(a, "1", {
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> */
> 
> 
> Note that no exception was reported on the [[Put]] to the accessor.
> 
> Allen
> var a = []
> Object.defineProperty(a, "1", {
> 
>     get: function() {throw "get"; return "got 1"},
>     put: function(v) {throw "put"+v}, 
>     configurable: true});
> 
> a[1]
> /*
> Exception: get
> */
> 
> a[1]=0
> /*
> 0
> 
> */
> 
> 
>> 
>> Jeff
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
>> 
> 
> 
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
> 
> 
> 
> 
> -- 
>     Cheers,
>     --MarkM

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to