lua-users home
lua-l archive

FFI tips

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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.

AltStyle によって変換されたページ (->オリジナル) /