summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2018-02-14 14:44:17 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2018-02-14 14:45:25 +0000
commit413bb725fc56ecaea4dde751be4c531486eb4b50 (patch)
tree73f357396d0dae29eca03d7d566782fabe3599fc /contrib
parent57747dfc454c33f83daebbe1007502c718593836 (diff)
downloadrspamd-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.c37
-rw-r--r--contrib/libucl/ucl_hash.c4
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