aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2015-03-05 12:19:11 +0100
committerMike Pall <mike>2015-03-05 12:19:11 +0100
commit8b6af89ba76ce9a245f37765a645691bdd195039 (patch)
treed13ad388415f6a1333390c2d656e1c4ad1610d98
parent1f578bd424b4499a1d63f4ef3c2647ca0836b877 (diff)
downloadluajit-8b6af89ba76ce9a245f37765a645691bdd195039.tar.gz
luajit-8b6af89ba76ce9a245f37765a645691bdd195039.tar.bz2
luajit-8b6af89ba76ce9a245f37765a645691bdd195039.zip
Fix Lua/C API typecheck error for special indexes.
-rw-r--r--src/lj_err.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index 52631b8e..081bfde4 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -726,9 +726,23 @@ LJ_NOINLINE void lj_err_arg(lua_State *L, int narg, ErrMsg em)
726/* Typecheck error for arguments. */ 726/* Typecheck error for arguments. */
727LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname) 727LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname)
728{ 728{
729 TValue *o = narg < 0 ? L->top + narg : L->base + narg-1; 729 const char *tname, *msg;
730 const char *tname = o < L->top ? lj_typename(o) : lj_obj_typename[0]; 730 if (narg <= LUA_REGISTRYINDEX) {
731 const char *msg = lj_str_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname); 731 if (narg >= LUA_GLOBALSINDEX) {
732 tname = lj_obj_itypename[~LJ_TTAB];
733 } else {
734 GCfunc *fn = curr_func(L);
735 int idx = LUA_GLOBALSINDEX - narg;
736 if (idx <= fn->c.nupvalues)
737 tname = lj_typename(&fn->c.upvalue[idx-1]);
738 else
739 tname = lj_obj_typename[0];
740 }
741 } else {
742 TValue *o = narg < 0 ? L->top + narg : L->base + narg-1;
743 tname = o < L->top ? lj_typename(o) : lj_obj_typename[0];
744 }
745 msg = lj_str_pushf(L, err2msg(LJ_ERR_BADTYPE), xname, tname);
732 err_argmsg(L, narg, msg); 746 err_argmsg(L, narg, msg);
733} 747}
734 748