Library With Userdata Example |
|
This example is similar to UserDataExample and UserDataWithPointerExample, except it is updated for the Lua 5.2 API.
function foo() local obj = MyLib.MakeObj() obj:method() end foo()
#include <lua.h> #include <lualib.h> #include <lauxlib.h> const static char *Obj_typename = "ObjTypename"; void check_Obj(lua_State *L, int i){ luaL_checkudata(L, i, Obj_typename); } int MyLib_MakeObj(lua_State *L){ printf("In MyLib_MakeObj\n"); lua_newuserdata(L, sizeof(int*)); luaL_setmetatable(L, Obj_typename); return 1; } int Obj__gc(lua_State *L){ printf("In Obj__gc\n"); return 0; } int Obj_method(lua_State *L){ printf("In Obj_method\n"); check_Obj(L, 1); return 0; } int luaopen_MyLib(lua_State *L){ static const luaL_Reg Obj_lib[] = { { "method", &Obj_method }, { NULL, NULL } }; static const luaL_Reg MyLib_lib[] = { { "MakeObj", &MyLib_MakeObj }, { NULL, NULL } }; luaL_newlib(L, MyLib_lib); // Stack: MyLib luaL_newmetatable(L, Obj_typename); // Stack: MyLib meta luaL_newlib(L, Obj_lib); lua_setfield(L, -2, "__index"); // Stack: MyLib meta lua_pushstring(L, "__gc"); lua_pushcfunction(L, Obj__gc); // Stack: MyLib meta "__gc" fptr lua_settable(L, -3); // Stack: MyLib meta lua_pop(L, 1); // Stack: MyLib return 1; } int main(int argc, char *argv[]){ int iarg; lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_requiref(L, "MyLib", &luaopen_MyLib, 1); lua_pop(L, 1); // requiref leaves the library table on the stack printf(" stack top: %d\n", lua_gettop(L)); for(iarg = 1; iarg < argc; ++iarg){ int s = luaL_loadfile(L, argv[iarg]); if(s != 0){ fprintf(stderr, "Could not load: %s\n", argv[iarg]); continue; } s = lua_pcall(L, 0, 0, 0); if(s != 0){ fprintf(stderr, "Error: %s\n", lua_tostring(L, -1)); lua_pop(L, 1); } } lua_close(L); return 0; }
gcc -I/usr/include/lua5.2 ex.c -llua5.2 -o lualibex
stack top: 0 In MyLib_MakeObj In Obj_method In Obj__gc