lm_types.c
changeset 6 90073cbb535d
parent 0 84fdfb0344c9
child 7 5db1448eb857
equal deleted inserted replaced
5:e617c9cf6dd3 6:90073cbb535d
     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)         \