[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: FFI tips
- From: Scott Shumaker <sshumaker@...>
- Date: Thu, 9 Jun 2011 12:26:15 -0700
BTW, here are a couple of pointers for working with FFI.
C->Lua calls
You can't call into LUA using FFI, but you can call using the existing
pcall mechanism. If you want to pass C data structures to lua
functions, you can do that too. Simply push a lightuserdata
containing the address of the C structure, and on the lua side
ffi.cast() it to a pointer to the c type.
e..g.
C:
struct WorkData data;
lua_pushlightuserdata(L, &data);
pcall(...)
lua:
function processData(dataPtr)
local data = ffi.cast("WorkData*", dataPtr)
-- use it
end
Make sure to cast it to (WorkData*), not just WorkData, or else you'll
get an error (which makes sense, since you pushed the address as a
lightuserdata).
Lua -> old-style lua C functions
If you need to call into a C function you've exposed to lua using
openLib or register, and want to pass a C data structure, just call
the function normally on the lua side. On the C side, you need to
check to see if the lua_type() is 10 (which represents CDATA - hmmm...
it would be nice to have lua_iscdata). Then, you can call
lua_topointer on it, which will give you a pointer to the structure.
e.g.
int luaCopyBuffer(lua_State* L)
{
if (lua_type(L, 1) == 10) // CDATA
{
struct Buffer* pBuffer = (Buffer*)lua_topointer(L,1);
// use it
}
}
Keep in mind, lua_topointer will return a pointer to whatever you
passed into the function from the lua side. so if you passed a
pointer to begin with - e.g. ffi.new("Buffer*") - you'll actually get
a double pointer (Buffer**) back.