|
The __gc closure you create inside tryThis will have inherited the
global environment from tryThis at the time it was executed, so it's
going to have a reference to that environment, but I'm not sure that
would be a reachable reference.
Daniel.
Matthew Armstrong wrote:
> I had already tried the setfenv(tryThis, {}) idea, and it didn't
> work. After your mail, I also tried tryThis = nil, which also didn't
> work. Here is my non-trimmed code:
>
> function tryThis()
> myVar = GfcTimer()
> local mt = getmetatable(myVar)
> mt.__gc = function()
> print("!!! cleanup")
> ldb()
> end
>
> --myVar = nil
> end
>
> function yup()
> local env = {}
> setmetatable(env, { __index = _G })
> setfenv(tryThis, env)
>
> tryThis()
>
> setfenv(tryThis, {})
> tryThis = nil
> env = nil
>
> collectgarbage()
> end
>
> yup()
>
> Note: there is one external function, GfcTimer, which generates a
> userdata object from our library.
>
> If I uncomment the line:
>
> -- myVar = nil
>
> ... then I get a confirmed call to the __gc method.
>
> Can you see anything else which would maintain a reference?
>
> On Tue, Mar 18, 2008 at 5:55 PM, Roberto Ierusalimschy
> <roberto@inf.puc-rio.br <mailto:roberto@inf.puc-rio.br>> wrote:
>
> > So let's say I say:
> >
> > function tryThis()
> > myVar = { foo="baz" }
> > end
> >
> > local env = {}
> > setfenv(tryThis, env)
> > tryThis()
> >
> > My question is: when does myVar get collected? With my current
> testing, it
> > seems that myVar never gets collected. If so, how do I
> "convince" it to be
> > collected?
>
> 'env' is the environment of 'tryThis' (which is global), so it
> cannot be
> collected until tryThis is garbage or until you change its environment
> again. You may try "tryThis = nil" or "setfenv(tryThis, {})".
>
> -- Roberto
>
>