|
@@ -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);
|
|
|
}
|
|
|
|
|
|
|