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

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_mistakeis 
> 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