diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-19 14:09:18 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-19 14:09:18 -0300 |
| commit | 50c7c915ee2fa239043d5456237f5145d064089b (patch) | |
| tree | 386e17e4baa154bb60dc54c1a00c751e3adedde9 /lauxlib.c | |
| parent | b117bdb3448778d9e7f9a0302791e8ac3bb97ddd (diff) | |
| download | lua-50c7c915ee2fa239043d5456237f5145d064089b.tar.gz lua-50c7c915ee2fa239043d5456237f5145d064089b.tar.bz2 lua-50c7c915ee2fa239043d5456237f5145d064089b.zip | |
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.
Diffstat (limited to 'lauxlib.c')
| -rw-r--r-- | lauxlib.c | 24 |
1 files changed, 16 insertions, 8 deletions
| @@ -170,19 +170,27 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, | |||
| 170 | 170 | ||
| 171 | LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { | 171 | LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { |
| 172 | lua_Debug ar; | 172 | lua_Debug ar; |
| 173 | const char *argword; | ||
| 173 | if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ | 174 | if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ |
| 174 | return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); | 175 | return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); |
| 175 | lua_getinfo(L, "n", &ar); | 176 | lua_getinfo(L, "nt", &ar); |
| 176 | if (strcmp(ar.namewhat, "method") == 0) { | 177 | if (arg <= ar.extraargs) /* error in an extra argument? */ |
| 177 | arg--; /* do not count 'self' */ | 178 | argword = "extra argument"; |
| 178 | if (arg == 0) /* error is in the self argument itself? */ | 179 | else { |
| 179 | return luaL_error(L, "calling '%s' on bad self (%s)", | 180 | arg -= ar.extraargs; /* do not count extra arguments */ |
| 180 | ar.name, extramsg); | 181 | if (strcmp(ar.namewhat, "method") == 0) { /* colon syntax? */ |
| 182 | arg--; /* do not count (extra) self argument */ | ||
| 183 | if (arg == 0) /* error in self argument? */ | ||
| 184 | return luaL_error(L, "calling '%s' on bad self (%s)", | ||
| 185 | ar.name, extramsg); | ||
| 186 | /* else go through; error in a regular argument */ | ||
| 187 | } | ||
| 188 | argword = "argument"; | ||
| 181 | } | 189 | } |
| 182 | if (ar.name == NULL) | 190 | if (ar.name == NULL) |
| 183 | ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; | 191 | ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; |
| 184 | return luaL_error(L, "bad argument #%d to '%s' (%s)", | 192 | return luaL_error(L, "bad %s #%d to '%s' (%s)", |
| 185 | arg, ar.name, extramsg); | 193 | argword, arg, ar.name, extramsg); |
| 186 | } | 194 | } |
| 187 | 195 | ||
| 188 | 196 | ||
