Debug information about extra arguments from __call
'debug.getinfo' can return number of extra arguments added to a call by a chain of __call metavalues. That information is being used to improve error messages about errors in these extra arguments.
This commit is contained in:
24
lauxlib.c
24
lauxlib.c
@@ -170,19 +170,27 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
|
||||
|
||||
LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) {
|
||||
lua_Debug ar;
|
||||
const char *argword;
|
||||
if (!lua_getstack(L, 0, &ar)) /* no stack frame? */
|
||||
return luaL_error(L, "bad argument #%d (%s)", arg, extramsg);
|
||||
lua_getinfo(L, "n", &ar);
|
||||
if (strcmp(ar.namewhat, "method") == 0) {
|
||||
arg--; /* do not count 'self' */
|
||||
if (arg == 0) /* error is in the self argument itself? */
|
||||
return luaL_error(L, "calling '%s' on bad self (%s)",
|
||||
ar.name, extramsg);
|
||||
lua_getinfo(L, "nt", &ar);
|
||||
if (arg <= ar.extraargs) /* error in an extra argument? */
|
||||
argword = "extra argument";
|
||||
else {
|
||||
arg -= ar.extraargs; /* do not count extra arguments */
|
||||
if (strcmp(ar.namewhat, "method") == 0) { /* colon syntax? */
|
||||
arg--; /* do not count (extra) self argument */
|
||||
if (arg == 0) /* error in self argument? */
|
||||
return luaL_error(L, "calling '%s' on bad self (%s)",
|
||||
ar.name, extramsg);
|
||||
/* else go through; error in a regular argument */
|
||||
}
|
||||
argword = "argument";
|
||||
}
|
||||
if (ar.name == NULL)
|
||||
ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?";
|
||||
return luaL_error(L, "bad argument #%d to '%s' (%s)",
|
||||
arg, ar.name, extramsg);
|
||||
return luaL_error(L, "bad %s #%d to '%s' (%s)",
|
||||
argword, arg, ar.name, extramsg);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user