#ifndef LUA_THRD_INC #define LUA_THRD_INC static int luaTHRD_pushudata(lua_State *L, void *ptr, const char* typename) { void **udata = lua_newuserdata(L, sizeof(void*)); if(udata) { *udata = ptr; luaL_getmetatable(L, typename); lua_setmetatable(L, -2); return 1; } return 0; } static void *luaTHRD_checkudata(lua_State *L, int narg, const char *typename) { void **udata = luaL_checkudata(L, narg, typename); if(udata) return *udata; else return NULL; } static void *luaTHRD_toudata(lua_State *L, int narg, const char *typename) { void **udata = lua_touserdata(L, narg); if(udata) { if(lua_getmetatable(L, -1)) { luaL_getmetatable(L, typename); if(lua_equal(L, -1, -2)) { lua_pop(L, 2); return *udata; } else { lua_pop(L, 2); return NULL; } } else return NULL; } else return NULL; } static int luaTHRD_ctor(lua_State *L) { if(!lua_istable(L, 1)) /* dummy ctor table */ luaL_error(L, "ctor: table expected"); lua_getmetatable(L, 1); lua_remove(L, 1); /* dummy ctor table */ if(!lua_istable(L, -1)) luaL_error(L, "ctor: no metatable found"); lua_pushstring(L, "__new"); lua_rawget(L, -2); lua_remove(L, -2); /* forget about metatable */ if(!lua_isfunction(L, -1)) luaL_error(L, "ctor: __new appears to be not a function"); lua_insert(L, 1); /* ctor first, arguments follow */ lua_call(L, lua_gettop(L)-1, LUA_MULTRET); return lua_gettop(L); } static void luaTHRD_pushctortable(lua_State *L, lua_CFunction ctor, const char* typename) { lua_newtable(L); /* empty useless dude */ lua_newtable(L); /* metatable of the dude */ lua_pushstring(L, "__index"); luaL_getmetatable(L, typename); lua_rawset(L, -3); lua_pushstring(L, "__newindex"); luaL_getmetatable(L, typename); lua_rawset(L, -3); lua_pushstring(L, "__new"); /* __call will look into there */ lua_pushcfunction(L, ctor); lua_rawset(L, -3); lua_pushstring(L, "__call"); /* pop the table and calls __new */ lua_pushcfunction(L, luaTHRD_ctor); lua_rawset(L, -3); lua_setmetatable(L, -2); } #endif