12 D ("Destroying callback %X", (int) cb); |
12 D ("Destroying callback %X", (int) cb); |
13 luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
13 luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
14 luaL_free (cb->L, cb); |
14 luaL_free (cb->L, cb); |
15 } |
15 } |
16 |
16 |
17 #define LLM_CHECK(WHAT, TYPE) \ |
17 #define LLM_CHECK(WHAT, LWHAT, TYPE) \ |
18 llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \ |
18 llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \ |
19 { \ |
19 { \ |
20 llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \ |
20 llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #LWHAT); \ |
21 luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
21 luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ |
22 return object; \ |
22 return object; \ |
23 } |
23 } |
24 |
24 |
25 #define LLM_BLESS(WHAT, LWHAT, TYPE) \ |
25 #define LLM_BLESS(WHAT, LWHAT, TYPE) \ |
26 llm_##WHAT##_t *bless_lm_##WHAT (lua_State *L, TYPE *WHAT) \ |
26 llm_##WHAT##_t *bless_lm_##WHAT (lua_State *L, TYPE *WHAT) \ |
27 { \ |
27 { \ |
28 llm_##WHAT##_t *object; /* top of stack */ \ |
28 llm_##WHAT##_t *object; /* top of stack */ \ |
29 lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
29 lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ |
30 lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
30 lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ |
31 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
31 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
32 lua_rawget (L, -2); /* 2 object/nil */ \ |
32 lua_rawget (L, -2); /* 2 object/nil */ \ |
33 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
33 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
34 lua_remove (L, -2); /* 1 object */ \ |
34 lua_remove (L, -2); /* 1 object */ \ |
35 object = lua_touserdata (L, -1); \ |
35 object = lua_touserdata (L, -1); \ |
36 D ("Existing " #LWHAT " object %X requested", (int) object); \ |
36 D ("Existing " #LWHAT " object %X requested", (int) object); \ |
37 return object; \ |
37 return object; \ |
38 } \ |
38 } \ |
39 /* 2 nil */ \ |
39 /* 2 nil */ \ |
40 lua_remove (L, -1); /* 1 registry table */ \ |
40 lua_remove (L, -1); /* 1 registry table */ \ |
41 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
41 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
42 luaL_getmetatable (L, "loudmouth." #LWHAT); /* 3 metatable */ \ |
42 luaL_getmetatable (L, "loudmouth." #LWHAT); /* 3 metatable */ \ |
43 lua_setmetatable (L, -2); /* 2 object */ \ |
43 lua_setmetatable (L, -2); /* 2 object */ \ |
44 lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
44 lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ |
45 lua_pushvalue (L, -2); /* 4 object */ \ |
45 lua_pushvalue (L, -2); /* 4 object */ \ |
46 lua_rawset (L, -4); /* 2 object */ \ |
46 lua_rawset (L, -4); /* 2 object */ \ |
47 lua_remove (L, -2); /* 1 object */ \ |
47 lua_remove (L, -2); /* 1 object */ \ |
48 object->WHAT = WHAT; \ |
48 object->WHAT = WHAT; \ |
49 lm_##LWHAT##_ref (WHAT); \ |
49 lm_##LWHAT##_ref (WHAT); \ |
50 D ("New " #LWHAT " object %X blessed", (int) object); \ |
50 D ("New " #LWHAT " object %X blessed", (int) object); \ |
51 return object; \ |
51 return object; \ |
52 } |
52 } |
53 |
53 |
54 #define LLM_DEFINE(WHAT, LWHAT, TYPE) \ |
54 #define LLM_DEFINE(WHAT, LWHAT, TYPE) \ |
55 LLM_CHECK (WHAT, TYPE) \ |
55 LLM_CHECK (WHAT, LWHAT, TYPE) \ |
56 LLM_BLESS (WHAT, LWHAT, TYPE) |
56 LLM_BLESS (WHAT, LWHAT, TYPE) |
57 |
57 |
58 LLM_DEFINE (connection, connection, LmConnection) |
58 LLM_DEFINE (connection, connection, LmConnection) |
59 LLM_DEFINE (message, message, LmMessage) |
59 LLM_DEFINE (message, message, LmMessage) |
60 LLM_DEFINE (handler, message_handler, LmMessageHandler) |
60 LLM_DEFINE (handler, message_handler, LmMessageHandler) |