From: Vsevolod Stakhov Date: Sat, 7 Oct 2017 11:34:00 +0000 (+0100) Subject: [Minor] Accept tables in lua_set_mempool_variable X-Git-Tag: 1.7.0~581 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=096b420d859408cf02b2bca729d4fd99a07f991c;p=rspamd.git [Minor] Accept tables in lua_set_mempool_variable --- diff --git a/src/lua/lua_mempool.c b/src/lua/lua_mempool.c index a6ef9f2c2..77fc249fc 100644 --- a/src/lua/lua_mempool.c +++ b/src/lua/lua_mempool.c @@ -303,6 +303,7 @@ lua_mempool_set_variable (lua_State *L) struct memory_pool_s *mempool = rspamd_lua_check_mempool (L, 1); const gchar *var = luaL_checkstring (L, 2); gpointer value; + struct lua_numbers_bucket *bucket; gchar *vp; union { gdouble d; @@ -310,7 +311,7 @@ lua_mempool_set_variable (lua_State *L) gboolean b; } val; gsize slen; - gint i, len = 0, type; + gint i, j, len = 0, type; if (mempool && var) { @@ -330,7 +331,8 @@ lua_mempool_set_variable (lua_State *L) } else if (type == LUA_TTABLE) { /* We assume it as a bucket of numbers so far */ - + slen = rspamd_lua_table_size (L, i); + len += sizeof (gdouble) * slen + sizeof (*bucket); } else { msg_err ("cannot handle lua type %s", lua_typename (L, type)); @@ -362,6 +364,20 @@ lua_mempool_set_variable (lua_State *L) memcpy (vp, val.s, slen + 1); vp += slen + 1; } + else if (type == LUA_TTABLE) { + slen = rspamd_lua_table_size (L, i); + /* XXX: Ret, ret, ret: alignment issues */ + bucket = (struct lua_numbers_bucket *)vp; + bucket->nelts = slen; + + for (j = 0; j < slen; j ++) { + lua_rawgeti (L, i, j + 1); + bucket->elts[j] = lua_tonumber (L, -1); + lua_pop (L, 1); + } + + vp += sizeof (gdouble) * slen + sizeof (*bucket); + } else { msg_err ("cannot handle lua type %s", lua_typename (L, type)); }