#include <lua.h>
#include <lauxlib.h>
#include <glib.h>
#include "glib_types.h"
#include "util.h"
void lglib_callback_destroy (lglib_callback_t *cb)
{
luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
luaL_free (cb->L, cb);
}
#define LGLIB_CHECK(WHAT, TYPE) \
lglib_##WHAT##_t *luaL_checklglib_##WHAT (lua_State *L, int index) \
{ \
lglib_##WHAT##_t *object = luaL_checkudata (L, index, "glib." #WHAT); \
luaL_argcheck (L, object != NULL, index, "glib " #WHAT " expected"); \
return object; \
}
#define LGLIB_BLESS(WHAT, TYPE) \
lglib_##WHAT##_t *lglib_##WHAT##_bless (lua_State *L, TYPE *WHAT) \
{ \
lglib_##WHAT##_t *object; /* top of stack */ \
lua_pushstring (L, LGLIB_OBJREGISTRY); /* 1 registry table name */ \
lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \
lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \
lua_rawget (L, -2); /* 2 object/nil */ \
if (!lua_isnil (L, -1)) { /* 2 object */ \
lua_remove (L, -2); /* 1 object */ \
object = lua_touserdata (L, -1); \
return object; \
} \
/* 2 nil */ \
lua_remove (L, -1); /* 1 registry table */ \
object = lua_newuserdata (L, sizeof (lglib_##WHAT##_t)); /* 2 userdata */ \
luaL_getmetatable (L, "glib." #WHAT); /* 3 metatable */ \
lua_setmetatable (L, -2); /* 2 object */ \
lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \
lua_pushvalue (L, -2); /* 4 object */ \
lua_rawset (L, -4); /* 2 object */ \
lua_remove (L, -2); /* 1 object */ \
object->WHAT = WHAT; \
g_##WHAT##_ref (WHAT); \
return object; \
}
#define LGLIB_DEFINE(WHAT, TYPE) \
LGLIB_CHECK (WHAT, TYPE) \
LGLIB_BLESS (WHAT, TYPE)
LGLIB_DEFINE (main_context, GMainContext)
LGLIB_DEFINE (source, GSource)
#undef LGLIB_DEFINE