[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: finalizers for weak values
- From: Josh Haberman <jhaberman@...>
- Date: Tue, 16 Oct 2012 22:57:21 -0700
Hey, it's me again with another finalizer question, sorry! :)
I must be misunderstanding this portion of the 5.2 reference
manual:
Resurrected objects (that is, objects being finalized
and objects accessible only through objects being
finalized) have a special behavior in weak tables.
They are removed from weak values before running
their finalizers, but are removed from weak keys only
in the next collection after running their
finalizers, when such objects are actually freed.
This behavior allows the finalizer to access
properties associated with the object through weak
tables.
I take this to mean that an object should not be accessible as a value
in a weak table after its finalizer has been run. But in the sample
program that follows, I see exactly that.
What am I missing?
Thanks,
Josh
--
function newtab_gc(fn) return setmetatable({}, { __gc = fn }) end
-- Table with weak values.
local t = setmetatable({}, {__mode = "v"})
newtab_gc(function()
print("found in weak table: " .. tostring(t[1]))
end)
t[1] = newtab_gc(function(o)
print("__gc " .. tostring(o))
end)
--
Output:
__gc table: 0x635960
found in weak table: table: 0x635960