[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: problem with "gc" tag method
- From: "Tom " <tmb@...>
- Date: Fri, 14 Jul 2000 20:46:14 -0000
I'm trying to get C++ objects created with tolua garbage
collected.  Setting the "gc" tag method from within Lua
seems like it's the right thing to do, and it works if
I do it "by hand".  But if I try to encapsulate that idea
into its own function, it fails.  I'm using Lua 3.2.  The
C++ objects are implemented using Tolua.  The C++ objects
print something like [alloc empty vec 0x........] when they
are created, and [destroy vec 0x........] when they are
deleted.
This seems like a bug to me, but maybe there is something
I'm missing.
Tom
Here is the Lua code:
======================================================================
use_makeobj = nil
print("start")
function delmethod (x)
    print("delmethod",x)
    x:delete()
end
print("delmethod is",delmethod)
function makeobj (allocator,args)
    result = call(allocator.new,args)
    settagmethod(tag(result),"gc",delmethod)
    print("tag",tag(result))
    print("gc tag method is",gettagmethod(tag(result),"gc"))
    return result
end
print("calling makeobj")
if use_makeobj then
    v = makeobj(Vec,{})
else
    v = Vec.new()
    settagmethod(tag(v),"gc",delmethod)
end
print("v is",v)
print("tag(v) is",tag(v))
print("gc1")
collectgarbage()
print("gc tag method is",gettagmethod(tag(result),"gc"))
v = ""
print("gc2")
collectgarbage()
print("after")
print("v is",v)
collectgarbage()
collectgarbage()
collectgarbage()
print("done")
======================================================================
Here is the output with use_makeobj=nil:
======================================================================
start
delmethod is	function: 0x806bd30
calling makeobj
[alloc empty vec 0x806afd0]
v is	userdata: 0x806afd0
tag(v) is	-13
gc1
gc tag method is	nil
gc2
delmethod	userdata: 0x806afd0
[destroy vec 0x806afd0]
after
v is	
done
======================================================================
And here is the output with use_makeobj=1:
======================================================================
start
delmethod is	function: 0x806bd30
calling makeobj
[alloc empty vec 0x806afd0]
tag	-13
gc tag method is	function: 0x806bd30
v is	userdata: 0x806afd0
tag(v) is	-13
gc1
gc tag method is	function: 0x806bd30
gc2
after
v is	
done
======================================================================