From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp48.i.mail.ru (smtp48.i.mail.ru [94.100.177.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 7466944643B for ; Wed, 23 Sep 2020 04:14:17 +0300 (MSK) From: Alexander Turenko Date: Wed, 23 Sep 2020 04:14:09 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 04/14] WIP: module api/lua: expose luaT_tuple_new() List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vladislav Shpilevoy Cc: tarantool-patches@dev.tarantool.org, Alexander Turenko It is convenient wrapper around box_tuple_new() to create a tuple from a Lua table (or from another tuple). XXX: Add a module API test. There is unit test already, so maybe just verify some basic case in the module API test. Or, better, transform the unit test into a module API test. Part of #5273 --- src/box/lua/tuple.c | 6 +++--- src/box/lua/tuple.h | 22 ++++++++++++++++++---- src/exports.h | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/box/lua/tuple.c b/src/box/lua/tuple.c index 03b4b8a2e..7baab467b 100644 --- a/src/box/lua/tuple.c +++ b/src/box/lua/tuple.c @@ -98,7 +98,7 @@ luaT_istuple(struct lua_State *L, int narg) return *(struct tuple **) data; } -struct tuple * +box_tuple_t * luaT_tuple_new(struct lua_State *L, int idx, box_tuple_format_t *format) { if (idx != 0 && !lua_istable(L, idx) && !luaT_istuple(L, idx)) { @@ -127,8 +127,8 @@ 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)); + box_tuple_t *tuple = box_tuple_new(format, buf->buf, + buf->buf + ibuf_used(buf)); if (tuple == NULL) return NULL; ibuf_reinit(tarantool_lua_ibuf); diff --git a/src/box/lua/tuple.h b/src/box/lua/tuple.h index fd280f565..766275ff2 100644 --- a/src/box/lua/tuple.h +++ b/src/box/lua/tuple.h @@ -79,8 +79,6 @@ luaT_pushtuple(struct lua_State *L, box_tuple_t *tuple); box_tuple_t * luaT_istuple(struct lua_State *L, int idx); -/** \endcond public */ - /** * Create a new tuple with specific format from a Lua table, a * tuple, or objects on the lua stack. @@ -88,11 +86,27 @@ luaT_istuple(struct lua_State *L, int idx); * Set idx to zero to create the new tuple from objects on the lua * stack. * - * In case of an error set a diag and return NULL. + * The new tuple is referenced in the same way as one created by + * (). There are two possible usage scenarious: + * + * 1. A short living tuple may not be referenced explicitly and + * will be collected automatically at the next module API call + * that yields or returns a tuple. + * 2. A long living tuple must be referenced using + * () and unreferenced than with + * (). + * + * @sa box_tuple_ref() + * + * If encoding fails, raise an error. + * + * In case of any other error set a diag and return NULL. */ -struct tuple * +API_EXPORT box_tuple_t * luaT_tuple_new(struct lua_State *L, int idx, box_tuple_format_t *format); +/** \endcond public */ + static inline int luaT_pushtupleornil(struct lua_State *L, struct tuple *tuple) { diff --git a/src/exports.h b/src/exports.h index 08ca03507..9ebb082c8 100644 --- a/src/exports.h +++ b/src/exports.h @@ -406,6 +406,7 @@ EXPORT(luaT_istuple) EXPORT(luaT_pushtuple) EXPORT(luaT_state) EXPORT(luaT_tolstring) +EXPORT(luaT_tuple_new) EXPORT(mp_char2escape) EXPORT(mp_decode_double) EXPORT(mp_decode_extl) -- 2.25.0