diff -r 000000000000 -r 84fdfb0344c9 lm_types.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lm_types.c Sun Feb 01 21:28:57 2009 +0200 @@ -0,0 +1,62 @@ + +#include +#include +#include // lm_*ref + +#include "lm_types.h" +#include "util.h" + +void llm_callback_destroy (llm_callback_t *cb) +{ + luaL_unref (cb->L, LUA_REGISTRYINDEX, cb->reference); + luaL_free (cb->L, cb); +} + +#define LLM_CHECK(WHAT, TYPE) \ +llm_##WHAT##_t *luaL_checklm_##WHAT (lua_State *L, int index) \ +{ \ + llm_##WHAT##_t *object = luaL_checkudata (L, index, "loudmouth." #WHAT); \ + luaL_argcheck (L, object != NULL, index, "loudmouth " #WHAT " expected"); \ + return object; \ +} + +#define LLM_BLESS(WHAT, TYPE) \ +llm_##WHAT##_t *llm_##WHAT##_bless (lua_State *L, TYPE *WHAT) \ +{ \ + llm_##WHAT##_t *object; /* top of stack */ \ + lua_pushstring (L, LLM_OBJREGISTRY); /* 1 registry table name */ \ + lua_rawget (L, LUA_REGISTRYINDEX); /* 1 registry table */ \ + lua_pushlightuserdata (L, WHAT); /* 2 light userdata */ \ + lua_rawget (L, -2); /* 2 object/nil */ \ + if (!lua_isnil (L, -1)) { /* 2 object */ \ + lua_remove (L, -2); /* 1 object */ \ + object = lua_touserdata (L, -1); \ + return object; \ + } \ + /* 2 nil */ \ + lua_remove (L, -1); /* 1 registry table */ \ + object = lua_newuserdata (L, sizeof (llm_##WHAT##_t)); /* 2 userdata */ \ + luaL_getmetatable (L, "loudmouth." #WHAT); /* 3 metatable */ \ + lua_setmetatable (L, -2); /* 2 object */ \ + lua_pushlightuserdata (L, WHAT); /* 3 light userdata */ \ + lua_pushvalue (L, -2); /* 4 object */ \ + lua_rawset (L, -4); /* 2 object */ \ + lua_remove (L, -2); /* 1 object */ \ + object->WHAT = WHAT; \ + lm_##WHAT##_ref (WHAT); \ + return object; \ +} + +#define LLM_DEFINE(WHAT, TYPE) \ +LLM_CHECK (WHAT, TYPE) \ +LLM_BLESS (WHAT, TYPE) + +LLM_DEFINE (connection, LmConnection) +LLM_DEFINE (message, LmMessage) +LLM_DEFINE (message_handler, LmMessageHandler) +LLM_DEFINE (message_node, LmMessageNode) +LLM_DEFINE (proxy, LmProxy) +LLM_DEFINE (ssl, LmSSL) + +#undef LLM_DEFINE +