super.prop assignment can silently overwrite non-writable properties

Allen Wirfs-Brock allen at wirfs-brock.com
Mon Apr 20 18:31:12 UTC 2015


On Apr 20, 2015, at 11:11 AM, Rick Waldron wrote:

> 
> 
> On Mon, Apr 20, 2015 at 1:45 PM Allen Wirfs-Brock <allen at wirfs-brock.com> wrote:
> 
> On Apr 20, 2015, at 9:38 AM, Jason Orendorff wrote:
> 
> > We're implementing `super` in Firefox, and ran across this surprising behavior:
> >
> >    class X {
> >        constructor() {
> >            Object.defineProperty(this, "prop", {
> >                configurable: true,
> >                writable: false,
> >                value: 1});
> >        }
> >        f() {
> >            super.prop = 2;  // overwrites non-writable property!
> >        }
> >    }
> >
> >    var x = new X();
> >    x.f();
> >    assertEq(x.prop, 2);  // passes
> >
> > In the spec, 9.1.9 step 4.d.i. is where `super.prop = 2` ends up, with
> > O=X.prototype.
> 
> 4.d.1 doesn't set the property, it just comes up with the property descriptor to use, if the `Receiver` does not already have a corresponding own property.
> 
> 5.c+5.e checks if the corresponding own property actually exists on the `Receiver`.  If it already exits then it does a [[DefineOwnProperty]] that only specifies the `value` attribute. This should respect the current `writable` attribute of the property and hence reject the attempt to change the value.
> 
> So, sounds like a FF bug to me.  Of course, there might also be a problem in the spec. that I'm blind to.
> 
> V8 has implemented the same behavior that Jason has reported. 
> 
> If it's determined that this behaviour is undesirable, implementations could agree to do something like: 

What!?  The behavior Jason described looks like it is  contrary to the specification.  Implementations that are not following the spec. have a bug.  Also, since apparently at least two implementations have this bug, it sounds like we really need to have test262 tests for the specified behavior. 

FWIW, I believe that once upon the time the spec. may have produced the results Jason is observing.  But that behavior was pretty clearly wrong, as a [[Set]] operations should not be ignoring the writability of the property whose value it is modifying.


> 
> 
> 14.5.1 Static Semantics: Early Errors
>   
>   (extend with...)
> 
>   ClassTail : ClassHeritage_opt { ClassBody }
> 
>   ClassBody : ClassElementList
> 
>   ClassElementList : ClassElement
> 
>   ClassElement : MethodDefinition
> 
>   ClassElement : static MethodDefinition
> 
>     - It is a Syntax Error if ClassHeritage is not present and HasSuperProperty of MethodDefinition is true.

This is nothing to do with class definition syntax.  This is about the semantics of the [[Set]] internal method.

allen

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20150420/abafcaa0/attachment.html>


More information about the es-discuss mailing list