equal
deleted
inserted
replaced
1 |
1 |
2 #include <lua.h> |
2 #include <lua.h> |
3 #include <lauxlib.h> |
3 #include <lauxlib.h> |
4 #include <loudmouth/loudmouth.h> // lm_*ref |
4 #include <loudmouth/loudmouth.h> // lm_*ref |
5 |
5 |
|
6 #include "config.h" |
6 #include "lm_types.h" |
7 #include "lm_types.h" |
7 #include "util.h" |
8 #include "util.h" |
8 |
9 |
9 void llm_callback_destroy (llm_callback_t *cb) |
10 void llm_callback_destroy (llm_callback_t *cb) |
10 { |
11 { |
|
12 D ("Destroying callback %X", (int) cb); |
11 luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
13 luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); |
12 luaL_free (cb->L, cb); |
14 luaL_free (cb->L, cb); |
13 } |
15 } |
14 |
16 |
15 #define LLM_CHECK(WHAT, TYPE) \ |
17 #define LLM_CHECK(WHAT, TYPE) \ |
29 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
31 lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ |
30 lua_rawget (L, -2); /* 2 object/nil */ \ |
32 lua_rawget (L, -2); /* 2 object/nil */ \ |
31 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
33 if (!lua_isnil (L, -1)) { /* 2 object */ \ |
32 lua_remove (L, -2); /* 1 object */ \ |
34 lua_remove (L, -2); /* 1 object */ \ |
33 object = lua_touserdata (L, -1); \ |
35 object = lua_touserdata (L, -1); \ |
|
36 D ("Existing " #WHAT " object %X requested", (int) object); \ |
34 return object; \ |
37 return object; \ |
35 } \ |
38 } \ |
36 /* 2 nil */ \ |
39 /* 2 nil */ \ |
37 lua_remove (L, -1); /* 1 registry table */ \ |
40 lua_remove (L, -1); /* 1 registry table */ \ |
38 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
41 object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ |
42 lua_pushvalue (L, -2); /* 4 object */ \ |
45 lua_pushvalue (L, -2); /* 4 object */ \ |
43 lua_rawset (L, -4); /* 2 object */ \ |
46 lua_rawset (L, -4); /* 2 object */ \ |
44 lua_remove (L, -2); /* 1 object */ \ |
47 lua_remove (L, -2); /* 1 object */ \ |
45 object->WHAT = WHAT; \ |
48 object->WHAT = WHAT; \ |
46 lm_##WHAT##_ref (WHAT); \ |
49 lm_##WHAT##_ref (WHAT); \ |
|
50 D ("New " #WHAT " object %X blessed", (int) object); \ |
47 return object; \ |
51 return object; \ |
48 } |
52 } |
49 |
53 |
50 #define LLM_DEFINE(WHAT, TYPE) \ |
54 #define LLM_DEFINE(WHAT, TYPE) \ |
51 LLM_CHECK (WHAT, TYPE) \ |
55 LLM_CHECK (WHAT, TYPE) \ |