Library With Userdata Example

lua-users home
wiki

No diff available--this is the first major revision. (minor diff)

Description

This example is similar to UserDataExample and UserDataWithPointerExample, except it is updated for the Lua 5.2 API.

Lua input file

function foo()
    local obj = MyLib.MakeObj()
    obj:method()
end

foo()
        

C code


#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;
}
        

Compiling the code

gcc -I/usr/include/lua5.2 ex.c -llua5.2 -o lualibex
        

Expected output

 stack top: 0
In MyLib_MakeObj
In Obj_method
In Obj__gc
        

RecentChanges · preferences
edit · history
Last edited December 16, 2012 11:49 pm GMT (diff)