|
1 |
|
2 #include <lua.h> |
|
3 #include <lauxlib.h> |
|
4 #include <glib.h> |
|
5 |
|
6 #include "glib_types.h" |
|
7 #include "util.h" |
|
8 |
|
9 void lglib_callback_destroy (lglib_callback_t *cb) |
|
10 { |
|
11 luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
|
12 luaL_free (cb->L, cb); |
|
13 } |
|
14 |
|
15 #define LGLIB_CHECK(WHAT, TYPE) \ |
|
16 lglib_##WHAT##_t *luaL_checklglib_##WHAT (lua_State *L, int index) \ |
|
17 { \ |
|
18 lglib_##WHAT##_t *object = luaL_checkudata (L, index, "glib." #WHAT); \ |
|
19 luaL_argcheck (L, object != NULL, index, "glib " #WHAT " expected"); \ |
|
20 return object; \ |
|
21 } |
|
22 |
|
23 #define LGLIB_BLESS(WHAT, TYPE) \ |
|
24 lglib_##WHAT##_t *lglib_##WHAT##_bless (lua_State *L, TYPE *WHAT) \ |
|
25 { \ |
|
26 lglib_##WHAT##_t *object; /* top of stack */ \ |
|
27 lua_pushstring (L, LGLIB_OBJREGISTRY); /* 1 registry table name */ \ |
|
28 lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
|
29 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
|
30 lua_rawget (L, -2); /* 2 object/nil */ \ |
|
31 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
|
32 lua_remove (L, -2); /* 1 object */ \ |
|
33 object = lua_touserdata (L, -1); \ |
|
34 return object; \ |
|
35 } \ |
|
36 /* 2 nil */ \ |
|
37 lua_remove (L, -1); /* 1 registry table */ \ |
|
38 object = lua_newuserdata (L, sizeof (lglib_##WHAT##_t)); /* 2 userdata */ \ |
|
39 luaL_getmetatable (L, "glib." #WHAT); /* 3 metatable */ \ |
|
40 lua_setmetatable (L, -2); /* 2 object */ \ |
|
41 lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
|
42 lua_pushvalue (L, -2); /* 4 object */ \ |
|
43 lua_rawset (L, -4); /* 2 object */ \ |
|
44 lua_remove (L, -2); /* 1 object */ \ |
|
45 object->WHAT = WHAT; \ |
|
46 g_##WHAT##_ref (WHAT); \ |
|
47 return object; \ |
|
48 } |
|
49 |
|
50 #define LGLIB_DEFINE(WHAT, TYPE) \ |
|
51 LGLIB_CHECK (WHAT, TYPE) \ |
|
52 LGLIB_BLESS (WHAT, TYPE) |
|
53 |
|
54 LGLIB_DEFINE (main_context, GMainContext) |
|
55 LGLIB_DEFINE (source, GSource) |
|
56 |
|
57 #undef LGLIB_DEFINE |
|
58 |