lm_types.c
changeset 12 63f06a23c235
parent 11 a8c6460d612b
child 19 d775d7289fe4
equal deleted inserted replaced
11:a8c6460d612b 12:63f06a23c235
    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)