> Le 8 août 2016 à 22:35, Tom Van Cutsem <[email protected]> a écrit :
> 
> Claude's additional example is indeed evidence that Object.freeze is not to 
> blame, but rather that the invariant checks of [[GetOwnPropertyDescriptor]] 
> and [[DefineOwnProperty]] are too weak. The culprit is, as far as I can tell, 
> that we re-used the state transitions allowed by DefineOwnProperty, which 
> allows the transition from non-configurable,writable (-c+w) to 
> non-configurable,non-writable (-c-w) and which is unwanted here, as Claude 
> rightfully concludes [to better understand the state transitions involved, 
> see MarkM's lucid state transition chart of property attributes 
> <http://wiki.ecmascript.org/doku.php?id=es3.1:attribute_states 
> <http://wiki.ecmascript.org/doku.php?id=es3.1:attribute_states>>. I wish this 
> diagram were in the spec btw, once you know how to read it, it is 
> significantly easier to understand than the DefineOwnProperty algorithm 
> itself]
> 
> I like the simplicity of Claude's suggestion, but I think that check is too 
> tight. Technically if the descriptors are both -c+w data descriptors, their 
> value attributes need not be identical to honor the spec invariants. Instead 
> I would propose to tackle the problem head-on and explicitly disallow a proxy 
> from reporting a -c-w property if the corresponding target property is -c+w. 
> We already have a similar check in place in precisely those two algorithms to 
> test if the configurable attribute matches. It is just a matter of tightening 
> that check to also verify the writable attribute.
> 
> This would entail the following changes to the ES2015 spec (new or modified 
> text in bold):
> 
> 
> 9.5.5 [[GetOwnProperty]] (P)
>   ...
>   22. If resultDesc.[[Configurable]] is false, then
>     a. If targetDesc is undefined or targetDesc.[[Configurable]] is true, then
>       i. Throw a TypeError exception.
>     b. If resultDesc.[[Writable]] is false and targetDesc.[[Writable]] is 
> true, then
>       i. Throw a TypeError exception.
>       
> NOTE [[GetOwnProperty]] for proxy objects enforces the following invariants:
> 
>   ...
>   * A property cannot be reported as non-configurable, non-writable if it 
> exists as a non-configurable, writable own property on the target object.
> 
> 
> 9.5.6 [[DefineOwnProperty]] (P, Desc)
>   ...
>   20. Else targetDesc is not undefined,
>     a.  If IsCompatiblePropertyDescriptor(extensibleTarget, Desc , 
> targetDesc) is false, throw a TypeError exception.
>     b. If settingConfigFalse is true
>       i. If targetDesc.[[Configurable]] is true, throw a TypeError exception.
>       ii. If Desc.[[Writable]] is false and targetDesc.[[Writable]] is true, 
> throw a TypeError exception.

Rather:

  b (unchanged). If settingConfigFalse is true and targetDesc.[[Configurable]] 
is true, throw a TypeError exception. 
  c. If targetDesc.[[Configurable]] is false, then
    i. If targetDesc.[[Writable]] is true and Desc.[[Writable]] is false, throw 
a TypeError exception.

because we need the additional check on [[Writable]] when the property is 
nonconfigurable ("targetDesc.[[Configurable]] is false"), not only when the 
property is made nonconfigurable ("settingConfigFalse is true").

—Claude


>       
> NOTE [[DefineOwnProperty]] for proxy objects enforces the following 
> invariants:
> 
>   ...
>   * A property cannot be successfully set to non-configurable, non-writable 
> if the corresponding own property of the target object is non-configurable, 
> writable.
> 
> WDYT?
> 
> Regards,
> Tom

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

Reply via email to