<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 19, 2016 at 1:17 AM, Coroutines <span dir="ltr">&lt;<a href="mailto:coroutines@gmail.com" target="_blank">coroutines@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi - I hope I am not suggesting something that has been said before ~<br>
<br>
Having Proxy and eventual Weak References makes it possible to build<br>
Map/WeakMap in plain JS - nothing in hidden, &#39;native code&#39; (C++).<br></blockquote><div><br></div><div>Not quite. This is why ephemeron collection makes such a difference. It can collect cycles that no arrangement of maps and weak references can collect. In particular, ephemerons are <i>essential</i> to build identity-preserving membranes with both necessary gc properties:</div><div><br></div><div>* While the membrane is up, collect across the membrane transparently, as if the membrane were not there.</div><div>* When the membrane is revoked, sever the reachability of all links crossing the membrane. A compartment fully inside the membrane can then be fully collected.</div><div><br></div><div>If you don&#39;t use ephemeron collection and you use the non-transposed representation, you will fail to collect membrane crossing cycles.</div><div>If you don&#39;t use ephemeron collection and do use the transposed representation (as MS Edge currently does) then you will fail to sever reachability on revocation, failing to collect logically unreachable compartments.</div><div><br></div><div>Since collection across the membrane needs to happen much more often than cleaning up after revocation, best is ephemeron collection with the (Edge-like) transposed representation. Ephemeron collection without the transposed representation (as I think everyone but Edge currently does) makes normal collection across the membrane boundary much more expensive. But at least it does eventually clean up both kinds of garbage.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
I&#39;d like to propose basing them off of these when Weak References are a &#39;thing&#39;.<br>
<br>
Map&#39;s API could just go away and follow traditional Object assignment<br>
and existence checks:<br>
<br>
map[key] = value;<br>
<br>
// wish JS had a null-coalescing `?` operator like Coffeescript..<br>
if (map[key] !== undefined || map[key] !== null) { ... }<br>
<br>
It&#39;s totally legal in non-Node JS to have Objects as keys in other<br>
Objects, right? (I forget)<br>
<br>
So that&#39;s my idea.  Toodles ~<br>
<br>
PS: And build Set off of a Proxy + Array.  Just stop being weird. :P<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" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">    Cheers,<br>    --MarkM</div>
</div></div>