<div dir="ltr">Tor this[symbol] = value or equivalent on one side of a membrane, followed by this[symbol] or equivalent on the other side of the membrane, we have the following eight cases.<div><br></div><div>For all of these, o1 is the original non-proxy thing associated with the private properties.</div>
<div>p1 is the proxy result of passing o1 through a membrane</div><div>o2 is a PrivateSymbol or WeakMap</div><div>p2 is the result of passing o2 through a membrane. </div><div>  When o2 is a WeakMap, p2 is a proxy for the WeakMap.</div>
<div>  When o2 is a PrivateSymbol, p2 is a PrivateSymbol that the membrane considers to correspond to o2</div><div>o3 is the original non-proxy value to be stored in this private property.</div><div>p3 is the proxy result of passing o3 through the membrane.<br>
<div><br></div><div style>o1[o2] = o3; p1[p2] // undefined !== p3</div><div style>o2.set(o1, o3); p2.get(p1) // p3</div></div><div style><br></div><div style>o1[o2] = p3; p1[p2] // undefined !== o3</div><div style>o2.set(o1, p3); p2.get(p1) // o3</div>
<div style><br></div><div style>o1[p2] = o3; p1[o2] // undefined !== p3</div><div style>p2.set(o1, o3); o2.get(p1) // p3</div><div style><br></div><div style>The remaining 5 cases are left as an exercise for the reader ;).</div>
<div style><br></div><div style>The reason they all work for WeakMaps is that the WeakMap itself is on one side of the membrane and both gets and sets go there. The weakmap only sees the thing and value on its side of the membrane. The requestor only sees the thing and value on their side of the membrane.</div>
<div style><br></div><div style>The reason none of these work under proposal #2 is that the thing[privateSymbol] operations on one side of the membrane don't make it to the other side.</div><div style><br></div><div style>
The reason none of these work under proposal #1 is that the thing[privateSymbol] operations don't trap, and so the membrane doesn't get to wrap or unwrap the stored value.</div><div style><br></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Mon, Jan 28, 2013 at 1:21 PM, Mark S. Miller <span dir="ltr"><<a href="mailto:erights@google.com" target="_blank">erights@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div class="im">On Mon, Jan 28, 2013 at 11:52 AM, Andreas Rossberg <span dir="ltr"><<a href="mailto:rossberg@google.com" target="_blank">rossberg@google.com</a>></span> wrote:<br></div><div class="gmail_extra">
<div class="gmail_quote"><div class="im">
<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><div>On 28 January 2013 19:45, Tom Van Cutsem <<a href="mailto:tomvc.be@gmail.com" target="_blank">tomvc.be@gmail.com</a>> wrote:<br>


> I just wrote up a strawman on the wiki to summarize the recent debates about<br>
> the interaction between proxies and private symbols:<br>
><br>
> <a href="http://wiki.ecmascript.org/doku.php?id=strawman:proxy_symbol_decoupled" target="_blank">http://wiki.ecmascript.org/doku.php?id=strawman:proxy_symbol_decoupled</a><br>
><br>
> The page actually lists two proposals, out of which I prefer the second one.<br>
><br>
> If I forgot some benefits/drawbacks of either approach, please speak up.<br>
<br>
</div></div>Under the second approach, how can you transparently proxy an object<br>
with private properties _at all_? It seems like you can't, even when<br>
you have access to its private names. In other words, what do you mean<br>
by "inherit the private state of the target", when the target is still<br>
aliased and accessed?<br></blockquote><div><br></div><div><br></div></div><div>There is an interesting difference between weakmaps and Tom's second proposal. </div><div><br></div><div><br></div><div>
-----------------------------------------------------</div><div>Consider, in proposal #2:</div><div><br></div><div>// All on the wet side of the membrane. No interesting difference yet</div><div><br>
</div><div>  var wetRecord = {</div><div>    symbol: PrivateSymbol(),</div><div>    thing: whatever()</div><div>  };</div><div>  var wetValue = whatever()</div><div>  wetRecord.thing[wetRecord.symbol] = wetValue;</div>
<div><br></div><div>// transition to dry side</div><div><br></div><div>   var { wrapper: dryRecord, gate } = makeMembrane(wetRecord);</div><div><br></div><div>   var dryValue = dryRecord.thing[dryRecord.symbol]; </div>
<div><br></div><div>// Under proposal #2, dryValue is undefined</div><div><div>-----------------------------------------------------</div><div><br></div></div><div><br></div><div><br></div><div>
<br></div><div>-----------------------------------------------------</div><div>Now let's do the "same" thing with WeakMaps:</div><div><br></div><div><div>// All on the wet side of the membrane. No interesting difference yet</div>

<div><br></div><div>  var wetRecord = {</div><div>    symbol: WeakMap(),</div><div>    thing: whatever()</div><div>  };</div><div>  var wetValue = whatever()</div><div>  wetRecord.symbol.set(wetRecord.thing, wetValue);</div>

<div><br></div><div>// transition to dry side</div><div><br></div><div>   var { wrapper: dryRecord, gate } = makeMembrane(wetRecord);</div><div><br></div><div>   var dryValue = dryRecord.symbol.get(dryRecord.thing);</div>

<div><br></div></div><div>   // dryValue is a proxy for wetValue</div><div><div>-----------------------------------------------------</div><div><br></div><div><br></div></div><div><br></div><div>Conclusion: Although both WeakMaps and Private Symbols have "issues" when virtualized through membranes, WeakMaps virtualize usefully under more scenarios than do Private Symbols under proposal #2.</div>
<span class="HOEnZb"><font color="#888888">
</font></span></div><span class="HOEnZb"><font color="#888888"><br clear="all"><div><br></div>-- <br>    Cheers,<br>    --MarkM
</font></span></div></div>
<br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br>Text by me above is hereby placed in the public domain<br><br>  Cheers,<br>  --MarkM
</div></div>