On Sep 4, 2013, at 1:00 PM, Niko Matsakis <[email protected]> wrote:

> On Wed, Sep 04, 2013 at 12:38:39PM -0700, Filip Pizlo wrote:
>> The reason why I'm OK with the more complex story is that we already
>> have that story for '=='.  To me, named object properties are
>> analogous to being able to identify whether you have the same object
>> or a different object: both are mechanisms that reveal aliasing to
>> the user.  Having typed objects that are embedded in other ones
>> already breaks ==.
> 
> I'm afraid I don't quite follow you here. The point is not that
> extensible properties permit the user to observe aliasing: since
> arrays are mutable, aliasing is observable even without `==` or
> extensible properties.

Ah, sorry, I was unclear.  My point is that given two typed arrays a and b, 
both == and custom properties allow you to tell the difference between a and b 
sharing the same backing data (the kind of aliasing you speak of) and actually 
being the same object.

== allows you to do this because either a == b evaluates true or it evaluates 
false.  If you allocate a typed array 'a' and then store it into a binary data 
field and then load from that field later into a variable 'b', then a != b.  
Hence, you've observed that a and b don't point to the same object.

Likewise, custom named properties would also allow you to make the same 
observation.  If you allocate a typed array 'a', then store a custom field into 
it ('a.foo = 42'), then store it into a binary data field and later load from 
it into 'b', then 'b.foo != 42'.  Hence, again, you've observed that a and b 
don't point to the same object even though they are both wrappers for the same 
underlying array data.

I agree that both of these aspects of binary data are quirky.  My observation 
is that prohibiting custom properties doesn't fix the underlying issue.

> 
> Rather, I am saying that it seems desirable for all typed objects with
> a particular type to support the same set of operations: but this is
> not possible if we permit extensible properties on typed arrays, since
> there will always be a distinction between a "top-level" array (i.e.,
> one that owns its own memory) and a derived array (one that aliases
> another object).

Right but that distinction is already there for ==.

> 
> [Well, I suppose it would be possible to permit *all* array instances
> to have extensible properties, whether they are derived or not, but
> that seems surprising indeed. It would imply that if you did
> something like:
> 
>     var MyArray = new ArrayType(...);
>     var MyStruct = new ArrayType({f: MyArray});
>     var struct = new MyStruct(...);
>     var array1 = struct.f;
>     var array2 = struct.f;
> 
> then `array1` and `array2` would have disjoint sets of extensible
> properties.]

Yes, they would.  But even if they didn't, then array1 != array2, which is 
equally odd.

-Filip


> 
> 
> Niko

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

Reply via email to