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 211BD44643A for ; Wed, 23 Sep 2020 04:14:17 +0300 (MSK) From: Alexander Turenko Date: Wed, 23 Sep 2020 04:14:08 +0300 Message-Id: <98551e8b90ebd2839dee57fee13f446aee515e42.1600817803.git.alexander.turenko@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 03/14] 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 --- src/exports.h | 1 + src/lua/utils.c | 6 ++++++ src/lua/utils.h | 20 ++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/src/exports.h b/src/exports.h index 7861bb529..08ca03507 100644 --- a/src/exports.h +++ b/src/exports.h @@ -355,6 +355,7 @@ EXPORT(luaL_fileresult) EXPORT(luaL_findtable) EXPORT(luaL_getmetafield) EXPORT(luaL_gsub) +EXPORT(luaL_iscdata) EXPORT(luaL_iscallable) EXPORT(luaL_loadbuffer) EXPORT(luaL_loadbufferx) diff --git a/src/lua/utils.c b/src/lua/utils.c index af114b0a2..bf5452d3e 100644 --- a/src/lua/utils.c +++ b/src/lua/utils.c @@ -112,6 +112,12 @@ luaL_pushuuid(struct lua_State *L) return luaL_pushcdata(L, CTID_UUID); } +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 7e02a05f2..e9dd27d08 100644 --- a/src/lua/utils.h +++ b/src/lua/utils.h @@ -78,6 +78,26 @@ luaL_pushuuid(struct lua_State *L); /** \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