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 /src | |
| parent | 1f578bd424b4499a1d63f4ef3c2647ca0836b877 (diff) | |
| download | luajit-8b6af89ba76ce9a245f37765a645691bdd195039.tar.gz luajit-8b6af89ba76ce9a245f37765a645691bdd195039.tar.bz2 luajit-8b6af89ba76ce9a245f37765a645691bdd195039.zip | |
Fix Lua/C API typecheck error for special indexes.
Diffstat (limited to 'src')
| -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 | ||
