From cde968f91f28a4819e15443a5f32c89daddb4c15 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Fri, 7 Apr 2017 12:31:06 +0200 Subject: [PATCH] From Lua 5.2: Add luaL_testudata(). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed by François Perrad. --- src/lauxlib.h | 1 + src/lj_api.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/lauxlib.h b/src/lauxlib.h index a8280c20..1ca0d74f 100644 --- a/src/lauxlib.h +++ b/src/lauxlib.h @@ -88,6 +88,7 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname, int sizehint); +LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); /* diff --git a/src/lj_api.c b/src/lj_api.c index c417af7e..c784ed3f 100644 --- a/src/lj_api.c +++ b/src/lj_api.c @@ -875,7 +875,7 @@ LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2) lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1])); } -LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) +LUALIB_API void *luaL_testudata(lua_State *L, int idx, const char *tname) { cTValue *o = index2adr(L, idx); if (tvisudata(o)) { @@ -884,8 +884,14 @@ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable)) return uddata(ud); } - lj_err_argtype(L, idx, tname); - return NULL; /* unreachable */ + return NULL; /* value is not a userdata with a metatable */ +} + +LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) +{ + void *p = luaL_testudata(L, idx, tname); + if (!p) lj_err_argtype(L, idx, tname); + return p; } /* -- Object setters ------------------------------------------------------ */