<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Sep 5, 2015 at 4:07 AM, Isiah Meadows <span dir="ltr"><<a href="mailto:isiahmeadows@gmail.com" target="_blank">isiahmeadows@gmail.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 dir="ltr"><div><div><div>I'm resurrecting this [1] because I have found a use case where I needed a weak reference. Is there any chance this could get into the language?<br></div></div></div></div></blockquote><div><br></div><div>I wrote the [1] strawman and continue to be positive on the idea. The strawman text is old and needs revision, as well as reconciliation with the separately written strawman at <<a href="http://wiki.ecmascript.org/doku.php?id=strawman:weak_refs">http://wiki.ecmascript.org/doku.php?id=strawman:weak_refs</a>>. Together these capture the needed abstract idea, but are not necessarily the best API. FWIW, the ParcPlaceSmalltalk API helped amortize some costs by providing a weak-array as the primitive, where notification includes the array index. (If someone has a link for that API, please post.)</div><div><br></div><div><br></div><div>I'll note that the pattern in your code:</div><div><br></div><div><div>        if (ref.exists()) setStream(ref.get(), format)<br></div></div><div><br></div><div>would not work on any previous weak-reference system, since the designated object might be collected, and `ref` nulled, between your `ref.exists()` and your `ref.get()`. It would happen to work in the strawman because observable gc events only happen between turns/jobs. Nevertheless, frankly, I don't like this pattern and would recommend instead:</div><div><br></div><div>      const strong = ref.get();</div><div>      if (strong !== undefined) { setStream(strong, format); }</div><div><br></div><div>On the flip side, despite my recommendation, we should certainly expect that many people will independently use your pattern. The fact that the strawman's turn atomicity will happen to make this code more reliable does corroborate the attractiveness of turn atomicity. I mention this because turn atomicity was a controversial aspect of this strawman.</div><div><br></div><div><br></div><div>To answer your question, I think there is a *good* chance that we could get this into the language if someone else would champion it. Although I am positive, given the scarcity of my time and where this idea falls on my priority queue, I would not find the time to be its champion. If someone else does step up as champion, I would certainly help.</div><div><br></div><div>Volunteers?</div><div><br></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 dir="ltr"><div><div><div><br></div>Here's my particular use case: making a stream with a rotating destination that itself acts as a stream (snippet of that code, or what I'd like it to be).<br><br></div>```js<br>function rotateStream(interval, format) {<br>    // Without the weak reference here, there's a memory leak<br>    const ref = new WeakReference({})<br>    setStream(ref.get(), format)<br>    setInterval(function () {<br></div><div>        if (ref.exists()) setStream(ref.get(), format)<br></div><div>        else clearInterval(this)<br></div><div>    }, interval)<br>    return ref.get()<br>}<br>```<br><br></div><div>This basically rotates an active stream, with the weak reference pointing to the said stream. The alternative requires explicit marking (in this case, with a `close` method):<br><br></div><div>```js<br>function leakyRotateStream(interval, format) {<br>    let stream = {close() {<br><div>        clearInterval(timer)<br></div>        timer = stream = null<br>    }}<br>    const timer = setInterval(function () {<br><div>        setStream(stream, format)<br>    }, interval)<br></div>    setStream(stream, format)<br>    return stream<br>}<br>```<br><br></div><div>In this use case, weak references would simplify the implementation and reduce memory costs. And I would rather take advantage of the GC machinery than explicit memory management (as explicit as C), as it would be easier to collect when that's the only thing referenced.<br><br></div><div>(The setInterval callback is gc'd with all its references when it's cleared from within.)<br></div><div><br></div><div>Thankfully, I'm using Node.js, so `weak` [2] is an option (the only option, really). But I would definitely appreciate if it was available in JS proper, across engines. V8, SpiderMonkey, and JSC all have weak references to JS objects as part of their public API, and I would be surprised if the implementation work would be anything significant.<br></div><div><div><div><div><div><br>[1]: <a href="https://esdiscuss.org/topic/what-is-the-status-of-weak-references" target="_blank">https://esdiscuss.org/topic/what-is-the-status-of-weak-references</a><br>[2]: <a href="https://github.com/TooTallNate/node-weak" target="_blank">https://github.com/TooTallNate/node-weak</a><span class=""><font color="#888888"><br><br>-- <br><div><div dir="ltr">Isiah Meadows</div></div>
</font></span></div></div></div></div></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" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">    Cheers,<br>    --MarkM</div>
</div></div>