--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/glib_types.c Sun Feb 01 21:28:57 2009 +0200
@@ -0,0 +1,58 @@
+
+#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
+