<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Apr 3, 2014 at 8:26 AM, Andreas Rossberg <span dir="ltr"><<a href="mailto:rossberg@google.com" target="_blank">rossberg@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="">On 2 April 2014 20:26, Mark S. Miller <<a href="mailto:erights@google.com">erights@google.com</a>> wrote:<br>

> We could specify that WeakMaps can use typed objects as keys. The current<br>
> discussion in your article confuses semantics with implementation when it<br>
> speaks of typed objects comparing structurally. Typed objects have identity,<br>
> characterized by the four-tuple you explain. Just as all the bits of a thin<br>
> pointer are significant when comparing two thin pointers to see if they<br>
> point at the same semantic object identity, so are all the bits in your fat<br>
> pointer significant. Don't get confused by the bits in the pointer to the<br>
> fat pointer, when the fat pointer happens to be boxed.<br>
<br>
</div>I'm not sure I agree with your notion of identity on pointers here. It<br>
doesn't make sense to me, semantically, to characterise structural<br>
(fat) pointers as having identity, just because their pointees have.<br>
(Or in other words, tuples do not acquire identity just because some<br>
of their components are values with identity. This is mixing up<br>
domains.)<br>
<br>
In any case, from the low-level perspective of the GC, a fat pointer<br>
definitely is an object separate from the buffer it points to (though<br>
it strongly references this buffer). Weak maps currently work by<br>
making the references to their keys weak. But that would simply be<br>
incorrect in the case where a key is a fat pointer -- because of its<br>
structural equality, an equivalent pointer can be recreated. It is<br>
unclear to me how weak maps could (efficiently) be extended to support<br>
this particular notion of reverse transitive weakness that you allude<br>
to.<br></blockquote><div><br></div><div>They can, in theory - for the sake of argument, let's define "weak reference to fat pointer" to be "weak reference to its backing store + offset" (this is probably even fairly efficiently implementable). The question is, is this a desired semantics, and as we discussed above, it is clearly not.</div>
<div><br></div><div>"True JS object" with generative identity seems to be a nice demarcation line for any notion of weak reference that we have (admittedly, we do not have the notion of weak reference per se in the spec, only weak maps, but willy-nilly the programmers will reason of them in terms of weak references). </div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div class=""><br>
>> - uvalues have a prototype linked to their def'n<br>
>>   - the syntax 'uvalue.foo' can be used to access members of this<br>
>> prototype<br>
><br>
> +1.<br>
><br>
>>   - when transmitted between realms, uvalues retain this link<br>
><br>
> A uvalue is deeply uvalue only when its prototype and all the methods found<br>
> there are uvalues. Although this is the case for E, the implications for JS<br>
> are, ahem, tricky. If they're not deep in this way, then they can't be<br>
> passed transparently between vats, address spaces, and machines.<br>
<br>
</div>How can a prototype possibly be a fully structural value in<br>
JavaScript? Especially, since the language has this great feature of<br>
making all functions objects with identity?<br>
<br>
On the other hand, I also don't see how uvalues can work without a<br>
prototype link. So it seems that it's simply impossible to make them<br>
transparently transferable between vats in the way you desire (and I<br>
would, too). It seems that JavaScript is actively hostile to that<br>
idea.<br></blockquote><div><br></div><div>Correct, yes - I think Mark says the same thing when he says "the implications are tricky".</div><div>"Passing transparently between vats, address spaces, and machines" must be a non-goal for value objects as proposed.</div>
<div>That's also how I read "uvalues have a prototype ... <span style="font-family:arial,sans-serif;font-size:13px">when transmitted between realms, uvalues retain this link" - among other things, it means that uvalues from different realms are never equal (since their prototype links are different by virtue of belonging to different realms).</span></div>
<div><br></div><div>Dmitry </div></div></div></div>