0
|
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 |
|