<div dir="ltr">I was looking at <a href="http://wiki.ecmascript.org/doku.php?id=strawman:names">http://wiki.ecmascript.org/doku.php?id=strawman:names</a> on Name objects, and was wondering whether garbage collection of name objects has been discussed.<br>
<br>I&#39;m not a GC expert, so the below may be hopelessly naive, and I don&#39;t know whether this kind of thing is appropriate for a language spec, but I wanted to raise the issue because some cool things become possible if short lived namespaces don&#39;t leak memory when attached to long-lived objects.<br>
<br>My understanding is that existing ES3 interpreters consider an object reachable if it is any of the following<br>&nbsp; (1) a value of a variable/actual/const from the scope chain of any executing or reachable function&nbsp; -- this includes the global object and any objects in with clauses<br>
&nbsp; (2) the value of a property of a reachable object<br>&nbsp; (3) pinned in memory by a host object.<br><br>With Name objects, that has to change.&nbsp; A name object is additionally reachable if it is the key in an enumerable property, since a for(...in...) loop can always bring a Name object back into the scope chain of an executing function.<br>
If it is the key in a non-enumerable property, then there is no way that it can be brought back into scope.<br><br>Can reachability in the presence of Names be specified thus: An object is reachable if it is any of the following<br>
&nbsp; (1) a value of a variable/actual/const from the scope chain of any executing or reachable function<br>&nbsp; (2) the value of a property of a reachable object (* where the key is a string or a reachable Name *)<br>&nbsp; (3) pinned in memory by a host object<br>
&nbsp; (4) (* the Name key of an enumerable property *)<br>?<br><br>So if a Name were only used as a key of an unenumerable property, then it could be collected as could the properties.&nbsp; This would not break frozenness if Object freezing were defined in terms of visible mutations.<br>
<br>cheers,<br>mike<br><br></div>