diff options
author | Mike Pall <mike> | 2015-03-05 12:19:11 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2015-03-05 12:19:11 +0100 |
commit | 8b6af89ba76ce9a245f37765a645691bdd195039 (patch) | |
tree | d13ad388415f6a1333390c2d656e1c4ad1610d98 | |
parent | 1f578bd424b4499a1d63f4ef3c2647ca0836b877 (diff) | |
download | luajit-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.c | 20 |
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. */ |
727 | LJ_NOINLINE void lj_err_argtype(lua_State *L, int narg, const char *xname) | 727 | LJ_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 | ||