From cde968f91f28a4819e15443a5f32c89daddb4c15 Mon Sep 17 00:00:00 2001
From: Mike Pall <mike>
Date: Fri, 7 Apr 2017 12:31:06 +0200
Subject: 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(-)

(limited to 'src')

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 ------------------------------------------------------ */
-- 
cgit v1.2.3-55-g6feb