[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Can full userdata be put back on the stack?
- From: lua+Steven.Murdoch@...
- Date: Tue, 10 Dec 2002 16:43:46 +0000
> some C function in your engine pushes a function (that happens to be of C
> type) on the LUA stack, lua_pcall() it, and this leaves a full userdata on
> the LUA stack as a result, from which you extract the pointer ?
> If so, I think your full userdata can be collected anytime you call LUA
> again unless you lua_ref() it.
I'll try to be a bit more accurate:
1) Main program M registers the C function A with Lua as "func_a", the C
function B with Lua as "func_b"
2) M executes loadbuffer with string "x=func_a()" and pcalls it
3) Lua passes control to the C function A which creates a new userdata of
size, sizeof(int) and sets the value to 42. It also saves the pointer returned
by lua_newuserdata in the C variable y.
4) Lua assigns the new userdata to Lua variable x and passes control back to M.
5) M executes loadbuffer with string "z=func_b()" and pcalls it
6) Lua passes control to the C function B which pushes the value of y (a
pointer to userdata) on the Lua stack.
The userdata pointed to by y cannot be garbage collected since it is still
held by Lua variable x.
7) Lua assigns the userdata to the Lua variable z.
8) After these steps the Lua variables x and y are equal, and if passed to
another C function registered with Lua and are interpreted as pointers to ints
they should contain 42.
My questions are 1) Is this recommended, or should setp 6 create a new
userdata of size sizeof(int) and store 42 in it.
2) If it is recommended then what lua_* function do I use to push the userdata
pointer onto the stack. Is it lua_pushlightuserdata since that seems to have
the correct signature.
You can assume that there is no C program which will change the value of a
userdata. Once it is initialised it will not be changed.