Minor type confusion in proxies proposal?

Andreas Rossberg rossberg at google.com
Wed Jul 6 05:55:22 PDT 2011


On 3 July 2011 13:29, Tom Van Cutsem <tomvc.be at gmail.com> wrote:
> Comments?

Looks good to me. I agree with Mark's comment that it should do a
(shallow) copy of the attributes object, though. I guess the obvious
point would be in Object.defineProperty, before passing it to
DefineProxyProperty.

/Andreas


> 2011/7/2 Andreas Rossberg <rossberg at google.com>
>>
>> Hi Tom.
>>
>> On 2 July 2011 13:50, Tom Van Cutsem <tomvc.be at gmail.com> wrote:
>> > Hi Andreas,
>> > First, you're right about the typing issue:
>> > In ES5, for values of type Object, the signature for
>> > [[DefineOwnProperty]]
>> > would be:
>> > [[DefineOwnProperty]](P: a property name, Desc: an internal property
>> > descriptor, Throw: a boolean)
>> > On trapping proxies, that signature would need to change to:
>> > [[DefineOwnProperty]](P: a property name, Desc: an Object, Throw: a
>> > boolean)
>>
>> I don't think such a change is consistent. [[DefineOwnProperty]] is
>> invoked in a number of places in the spec, and I think in many of them
>> the type of the receiver is not distinguished and may well be a proxy,
>> so a proxy may then receive both kinds of descriptors. Moreover, I
>> think it would be a mistake to make the appropriate case distinction
>> everywhere -- you really want the internal method to have the same
>> signature in all cases.
>>
>> > With that, I believe the strawman is otherwise internally consistent. In
>> > [[DefineOwnProperty]] step 5, what will be passed to the user-defined
>> > "defineProperty" trap is a proper Object, not an internal descriptor.
>> > I did clarify the note you referred to, to be more explicit in this
>> > regard.
>> > I don't see an alternative to changing the signature of
>> > [[DefineOwnProperty]]. It can't just receive an internal descriptor, as
>> > it
>> > doesn't preserve any non-standard attributes.
>>
>> How about simply bypassing [[DefineOwnProperty]] in
>> Object.defineProperty for proxies, as I suggested in my reply to
>> David? That seems to be the only place where additional objects can
>> occur, or am I wrong?
>>
>> Cheers,
>> /Andreas
>>
>>
>> > 2011/7/1 Andreas Rossberg <rossberg at google.com>
>> >>
>> >> On 1 July 2011 12:12, Andreas Rossberg <rossberg at google.com> wrote:
>> >> > I believe there is some "type" confusion in the proxy proposal spec
>> >> > wrt property descriptors and their reification into attributes
>> >> > objects.
>> >> >
>> >> > 1. In a note on the def of [[DefineOwnProperty]] for proxies, the
>> >> > proposal says:
>> >> >
>> >> > "The Desc argument to this trap is a property descriptor object
>> >> > validated by ToPropertyDescriptor, except that it also retains any
>> >> > non-standard attributes present in the original property descriptor
>> >> > passed to Object.defineProperty. See the semantics of the modified
>> >> > Object.defineProperty built-in, below."
>> >> >
>> >> > That seems fishy, since according to ES5 8.10:
>> >> >
>> >> > "Values of the Property Descriptor type are records composed of named
>> >> > fields where each field‘s name is an attribute name and its value is
>> >> > a
>> >> > corresponding attribute value as specified in 8.6.1."
>> >> >
>> >> > In particular, I take this to mean that property descriptors are not
>> >> > objects (but abstract records), and that there cannot be any fields
>> >> > whose name is not an attribute name. (In fact, in V8 we currently
>> >> > encode property descriptors using objects, but the encoding is
>> >> > different from the reified attributes object representation, and not
>> >> > quite compatible with the idea of adding arbitrary other fields.)
>> >>
>> >> I forgot to say: step 5 of the definition invokes the defineProperty
>> >> trap of the handler passing Desc as the second argument. But the
>> >> handler expects a reified attributes object.
>> >>
>> >> > 2. In the modified definition of Object.defineProperty, the proposal
>> >> > says in step 4.c:
>> >> >
>> >> > "Call the [[DefineOwnProperty]] internal method of O with arguments
>> >> > name, descObj, and true."
>> >> >
>> >> > This is passing descObj, which in fact is _not_ a descriptor, but its
>> >> > reification as an attributes object.
>> >> >
>> >> > /Andreas
>> >> >
>> >> _______________________________________________
>> >> es-discuss mailing list
>> >> es-discuss at mozilla.org
>> >> https://mail.mozilla.org/listinfo/es-discuss
>> >
>> >
>
>


More information about the es-discuss mailing list