<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>I think weak references are discussed before, and get postponed because it can cause information leaks between realms.<br><br><div><hr id="stopSpelling">From: isiahmeadows@gmail.com<br>Date: Sat, 5 Sep 2015 07:07:40 -0400<br>Subject: Weak References<br>To: es-discuss@mozilla.org<br><br><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><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><br><br>-- <br><div class="ecxgmail_signature"><div dir="ltr">Isiah Meadows</div></div>
</div></div></div></div></div></div>
<br>_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss</div>                                          </div></body>
</html>