diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-02-14 14:44:17 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-02-14 14:45:25 +0000 |
commit | 413bb725fc56ecaea4dde751be4c531486eb4b50 (patch) | |
tree | 73f357396d0dae29eca03d7d566782fabe3599fc /contrib | |
parent | 57747dfc454c33f83daebbe1007502c718593836 (diff) | |
download | rspamd-413bb725fc56ecaea4dde751be4c531486eb4b50.tar.gz rspamd-413bb725fc56ecaea4dde751be4c531486eb4b50.zip |
[Feature] Improve allocation policy when interacting with Lua
Diffstat (limited to 'contrib')
-rw-r--r-- | contrib/libucl/lua_ucl.c | 37 | ||||
-rw-r--r-- | contrib/libucl/ucl_hash.c | 4 |
2 files changed, 23 insertions, 18 deletions
diff --git a/contrib/libucl/lua_ucl.c b/contrib/libucl/lua_ucl.c index 52e787ee5..15d41471e 100644 --- a/contrib/libucl/lua_ucl.c +++ b/contrib/libucl/lua_ucl.c @@ -301,7 +301,7 @@ ucl_object_lua_fromtable (lua_State *L, int idx, ucl_string_flags_t flags) size_t keylen; const char *k; bool is_array = true, is_implicit = false, found_mt = false; - int max = INT_MIN; + size_t max = 0, nelts = 0; if (idx < 0) { /* For negative indicies we want to invert them */ @@ -320,10 +320,22 @@ ucl_object_lua_fromtable (lua_State *L, int idx, ucl_string_flags_t flags) } else if (strcmp (classname, UCL_ARRAY_TYPE_META) == 0) { is_array = true; found_mt = true; +#if LUA_VERSION_NUM >= 502 + max = lua_rawlen (L, idx); +#else + max = lua_objlen (L, idx); +#endif + nelts = max; } else if (strcmp (classname, UCL_IMPL_ARRAY_TYPE_META) == 0) { is_array = true; is_implicit = true; found_mt = true; +#if LUA_VERSION_NUM >= 502 + max = lua_rawlen (L, idx); +#else + max = lua_objlen (L, idx); +#endif + nelts = max; } } @@ -342,34 +354,24 @@ ucl_object_lua_fromtable (lua_State *L, int idx, ucl_string_flags_t flags) } } else { /* Keys are not integer */ - lua_pop (L, 2); is_array = false; - break; } } else { /* Keys are not numeric */ - lua_pop (L, 2); is_array = false; - break; } lua_pop (L, 1); + nelts ++; } } - if (is_array) { -#if LUA_VERSION_NUM >= 502 - max = lua_rawlen (L, idx); -#else - max = lua_objlen (L, idx); -#endif - } - /* Table iterate */ if (is_array) { int i; if (!is_implicit) { top = ucl_object_typed_new (UCL_ARRAY); + ucl_object_reserve (top, nelts); } else { top = NULL; @@ -395,15 +397,18 @@ ucl_object_lua_fromtable (lua_State *L, int idx, ucl_string_flags_t flags) else { lua_pushnil (L); top = ucl_object_typed_new (UCL_OBJECT); + ucl_object_reserve (top, nelts); + while (lua_next (L, idx) != 0) { /* copy key to avoid modifications */ - k = lua_tolstring (L, -2, &keylen); - obj = ucl_object_lua_fromelt (L, lua_gettop (L), flags); + lua_pushvalue (L, -2); + k = lua_tolstring (L, -1, &keylen); + obj = ucl_object_lua_fromelt (L, lua_gettop (L) - 1, flags); if (obj != NULL) { ucl_object_insert_key (top, obj, k, keylen, true); } - lua_pop (L, 1); + lua_pop (L, 2); } } diff --git a/contrib/libucl/ucl_hash.c b/contrib/libucl/ucl_hash.c index 92c8b3933..352ae3a2b 100644 --- a/contrib/libucl/ucl_hash.c +++ b/contrib/libucl/ucl_hash.c @@ -424,11 +424,11 @@ void ucl_hash_reserve (ucl_hash_t *hashlin, size_t sz) khash_t(ucl_hash_caseless_node) *h = (khash_t( ucl_hash_caseless_node) *) hashlin->hash; - kh_resize (ucl_hash_caseless_node, h, sz); + kh_resize (ucl_hash_caseless_node, h, sz * 2); } else { khash_t(ucl_hash_node) *h = (khash_t(ucl_hash_node) *) hashlin->hash; - kh_resize (ucl_hash_node, h, sz); + kh_resize (ucl_hash_node, h, sz * 2); } } }
\ No newline at end of file |