[Tarantool-patches] [PATCH v3 04/16] lua: factor out tuple encoding from luaT_tuple_new
Alexander Turenko
alexander.turenko at tarantool.org
Tue Oct 13 02:23:11 MSK 2020
It simplifies further changes around encoding a tuple: next commits will
get rid of throwing serialization errors and will expose a function to
encode a table (or tuple) from the Lua stack on the box region to the
module API.
Part of #5273
Part of #5382
---
src/box/lua/tuple.c | 21 +++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)
diff --git a/src/box/lua/tuple.c b/src/box/lua/tuple.c
index 03b4b8a2e..ed97c85e4 100644
--- a/src/box/lua/tuple.c
+++ b/src/box/lua/tuple.c
@@ -98,8 +98,9 @@ luaT_istuple(struct lua_State *L, int narg)
return *(struct tuple **) data;
}
-struct tuple *
-luaT_tuple_new(struct lua_State *L, int idx, box_tuple_format_t *format)
+static char *
+luaT_tuple_encode_on_lua_ibuf(struct lua_State *L, int idx,
+ size_t *tuple_len_ptr)
{
if (idx != 0 && !lua_istable(L, idx) && !luaT_istuple(L, idx)) {
diag_set(IllegalParams, "A tuple or a table expected, got %s",
@@ -127,8 +128,20 @@ luaT_tuple_new(struct lua_State *L, int idx, box_tuple_format_t *format)
luamp_encode_tuple(L, &tuple_serializer, &stream, idx);
}
mpstream_flush(&stream);
- struct tuple *tuple = box_tuple_new(format, buf->buf,
- buf->buf + ibuf_used(buf));
+ if (tuple_len_ptr != NULL)
+ *tuple_len_ptr = ibuf_used(buf);
+ return buf->buf;
+}
+
+struct tuple *
+luaT_tuple_new(struct lua_State *L, int idx, box_tuple_format_t *format)
+{
+ size_t tuple_len;
+ char *tuple_data = luaT_tuple_encode_on_lua_ibuf(L, idx, &tuple_len);
+ if (tuple_data == NULL)
+ return NULL;
+ struct tuple *tuple = box_tuple_new(format, tuple_data,
+ tuple_data + tuple_len);
if (tuple == NULL)
return NULL;
ibuf_reinit(tarantool_lua_ibuf);
--
2.25.0
More information about the Tarantool-patches
mailing list