aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-11-19 14:09:18 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-11-19 14:09:18 -0300
commit50c7c915ee2fa239043d5456237f5145d064089b (patch)
tree386e17e4baa154bb60dc54c1a00c751e3adedde9 /lauxlib.c
parentb117bdb3448778d9e7f9a0302791e8ac3bb97ddd (diff)
downloadlua-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.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/lauxlib.c b/lauxlib.c
index e4b12587..d37d2f8c 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -170,19 +170,27 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
170 170
171LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { 171LUALIB_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