[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: __gc & error and GC & local weirdness
- From: nobody <nobody+lua-list@...>
- Date: Thu, 4 Aug 2016 22:47:13 +0200
Hey all,
I'm currently exploring the next assertion and found some unrelated
unexpected behavior that I can't quite track down yet.
For both of these: Is this expected / intentional or not?
-- begin testcase #1 --
local function trace( str ) return io.stderr:write( str ) end
local body = function( )
trace 'B'
while true do trace '.' ; t = { } end
trace 'X1'
end
local handler = function( ) trace "H" end
-- set up delayed error
t = setmetatable( {}, {
__gc = function() trace "E" error "blergh!" trace "X2" end
} )
-- run
trace "A"
xpcall( body, handler )
trace "Z"
-- end testcase #1 --
There's three possible results that I'd expect
E1: AB....(forever)
E2: AB....(exit)
E3: AB....(etc.)....EHZ
But what I actually get is:
A1: AB....(etc.)....EZ
A2: AB..EZ (with HARDMEMTESTS)
i.e. the error handler doesn't run.
Another weird thing happens when changing
-- begin diff to testcase #2 --
4c4
< while true do trace '.' ; t = { } end
---
> while true do trace '.' ; local t = { } end
-- end diff to testcase #2 --
(or alternatively saying `local t` in 'body' before entering the loop.)
Now I get (with and without HARDMEMTESTS, even when adding an additional
explicit `collectgarbage "collect"` in the loop)
AB........(forever)
i.e. the GC doesn't run while Lua merrily allocates gigabytes of memory.
If I interrupt (^C), it's
AB........<^C>HZE
(same (minus the ^C) when limiting available memory, e.g. by using the
test lib's T.totalmem) - i.e. the GC runs only after leaving the loop.
-- Marco