From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp61.i.mail.ru (smtp61.i.mail.ru [217.69.128.41]) (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 E0A2D469719 for ; Wed, 23 Sep 2020 04:40:34 +0300 (MSK) From: Alexander Turenko Date: Wed, 23 Sep 2020 04:40:18 +0300 Message-Id: <03580565909578fe7268449b7d0a33c8d3e1bc4e.1600824556.git.alexander.turenko@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 1.10 05/16] WIP: module api/lua: add luaL_iscdata() function 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 useful to provide a module specific error when cdata expected, but a value of another type is passed. Alternative would be using of lua_type() to check against LUA_TCDATA, but this constant is not exposed for modules. See more in the luaL_iscdata() API comment. XXX: Add a test to test/app-tap/module_api.{c,test.lua}. Part of #5273 (cherry picked from commit 98551e8b90ebd2839dee57fee13f446aee515e42) --- extra/exports | 1 + src/lua/utils.c | 6 ++++++ src/lua/utils.h | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/extra/exports b/extra/exports index 52bb29d68..a7d8ef81b 100644 --- a/extra/exports +++ b/extra/exports @@ -117,6 +117,7 @@ coio_close coio_call coio_getaddrinfo luaL_pushcdata +luaL_iscdata luaL_checkcdata luaL_setcdatagc luaL_ctypeid diff --git a/src/lua/utils.c b/src/lua/utils.c index d88efc560..e555607cf 100644 --- a/src/lua/utils.c +++ b/src/lua/utils.c @@ -102,6 +102,12 @@ luaL_pushcdata(struct lua_State *L, uint32_t ctypeid) return cdataptr(cd); } +int +luaL_iscdata(struct lua_State *L, int idx) +{ + return lua_type(L, idx) == LUA_TCDATA; +} + void * luaL_checkcdata(struct lua_State *L, int idx, uint32_t *ctypeid) { diff --git a/src/lua/utils.h b/src/lua/utils.h index 5164eb5bf..fe6728986 100644 --- a/src/lua/utils.h +++ b/src/lua/utils.h @@ -69,6 +69,26 @@ extern struct ibuf *tarantool_lua_ibuf; /** \cond public */ +/** + * @brief Checks whether a value on the Lua stack is a cdata. + * + * Unlike () this function does not raise an + * error. It is useful to raise a domain specific error. + * + * Lua API and module API don't expose LUA_TCDATA constant. + * We have no guarantee that this constant will remain the same in + * future LuaJIT versions. So this function should be used in + * modules instead of `lua_type(L, idx) == LUA_TCDATA`. + * + * @param L Lua State + * @param idx stack index + * + * @return 1 if the value at the given acceptable index is a cdata + * and 0 otherwise. + */ +LUA_API int +luaL_iscdata(struct lua_State *L, int idx); + /** * @brief Push cdata of given \a ctypeid onto the stack. * CTypeID must be used from FFI at least once. Allocated memory returned -- 2.25.0