Static `super` may cause a unwanted "memory leak".

Jason Orendorff jason.orendorff at gmail.com
Tue Aug 2 20:59:36 UTC 2016


On Tue, Aug 2, 2016 at 3:09 PM, Bergi <a.d.bergi at web.de> wrote:

> Why would `tmp` be stored as the [[HomeObject]] when the function doesn't
> use `super`? In that case a [[HomeObject]] is not needed at all.
>

To clarify this: of course the JS engine knows whether the code uses
`super` or not and can decide to retain the [[HomeObject]] only when
there's some danger of its actually being needed. But do implementations
actually do this optimization in practice?

SpiderMonkey has a findPath() primitive that searches the GC heap for paths
from one object to another, handy for answering questions like this one:

    js> function SomeFactory(name) {
      let tmp = {
        [name]() { /* this doesn't use `super` */ }
      }
      return findPath(tmp[name], tmp);
    }
    js> SomeFactory("foo") === undefined
    true

That is, there is no GC-path from the method back to the object; apparently
[[HomeObject]] is not being retained. What if we change the method to use
`super`?

    js> function SomeFactory2(name) {
      let tmp = {
        [name]() { return super[name](); }
      };
      return findPath(tmp[name], tmp);
    }
    js> typeof SomeFactory2("foo")
    "object"
    js> SomeFactory2("foo").length
    1

Now there is a direct GC-reference from the method to its home object, as
expected.

-j
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160802/a9fdd755/attachment.html>


More information about the es-discuss mailing list