lm_types.c
changeset 38 34a2b880615c
parent 27 23393a00c2c1
equal deleted inserted replaced
37:6e425a8e245e 38:34a2b880615c
    24 #include "lm_types.h"
    24 #include "lm_types.h"
    25 #include "util.h"
    25 #include "util.h"
    26 
    26 
    27 void llm_callback_destroy (llm_callback_t *cb)
    27 void llm_callback_destroy (llm_callback_t *cb)
    28 {
    28 {
    29 	D ("Destroying callback %X", (int) cb);
    29 	D ("Destroying callback %p", cb);
    30 	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
    30 	luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference);
    31 	luaL_free (cb->L, cb);
    31 	luaL_free (cb->L, cb);
    32 }
    32 }
    33 
    33 
    34 #define LLM_CHECK(WHAT, LWHAT, TYPE)                                              \
    34 #define LLM_CHECK(WHAT, LWHAT, TYPE)                                              \
    48 	lua_pushlightuserdata (L, WHAT);                 /* 2 light userdata */ \
    48 	lua_pushlightuserdata (L, WHAT);                 /* 2 light userdata */ \
    49 	lua_rawget (L, -2);                                  /* 2 object/nil */ \
    49 	lua_rawget (L, -2);                                  /* 2 object/nil */ \
    50 	if (!lua_isnil (L, -1)) {                                /* 2 object */ \
    50 	if (!lua_isnil (L, -1)) {                                /* 2 object */ \
    51 		lua_remove (L, -2);                              /* 1 object */ \
    51 		lua_remove (L, -2);                              /* 1 object */ \
    52 		object = lua_touserdata (L, -1);                                \
    52 		object = lua_touserdata (L, -1);                                \
    53 		D ("Existing " #LWHAT " object %X requested", (int) object);    \
    53 		D ("Existing " #LWHAT " object %p requested", object);          \
    54 		return object;                                                  \
    54 		return object;                                                  \
    55 	}                                                                       \
    55 	}                                                                       \
    56 	                                                            /* 2 nil */ \
    56 	                                                            /* 2 nil */ \
    57 	lua_remove (L, -1);                              /* 1 registry table */ \
    57 	lua_remove (L, -1);                              /* 1 registry table */ \
    58 	object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \
    58 	object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \
    62 	lua_pushvalue (L, -2);                                   /* 4 object */ \
    62 	lua_pushvalue (L, -2);                                   /* 4 object */ \
    63 	lua_rawset (L, -4);                                      /* 2 object */ \
    63 	lua_rawset (L, -4);                                      /* 2 object */ \
    64 	lua_remove (L, -2);                                      /* 1 object */ \
    64 	lua_remove (L, -2);                                      /* 1 object */ \
    65 	object->WHAT = WHAT;                                                    \
    65 	object->WHAT = WHAT;                                                    \
    66 	lm_##LWHAT##_ref (WHAT);                                                \
    66 	lm_##LWHAT##_ref (WHAT);                                                \
    67 	D ("New " #LWHAT " object %X blessed", (int) object);                   \
    67 	D ("New " #LWHAT " object %p blessed", object);                         \
    68 	return object;                                                          \
    68 	return object;                                                          \
    69 }
    69 }
    70 
    70 
    71 #define LLM_DEFINE(WHAT, LWHAT, TYPE) \
    71 #define LLM_DEFINE(WHAT, LWHAT, TYPE) \
    72 LLM_CHECK (WHAT, LWHAT, TYPE)         \
    72 LLM_CHECK (WHAT, LWHAT, TYPE)         \