diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-04 17:27:13 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-04 17:27:13 -0300 |
commit | bdc85357aa41a9610498232c2cffe7aa191e5cf6 (patch) | |
tree | 49acbe61a8c1f4dfaa36892ad01eba7cf56a78f4 /ldebug.c | |
parent | b291008cc2a63eb19918d4cce7e58118f4154b03 (diff) | |
download | lua-bdc85357aa41a9610498232c2cffe7aa191e5cf6.tar.gz lua-bdc85357aa41a9610498232c2cffe7aa191e5cf6.tar.bz2 lua-bdc85357aa41a9610498232c2cffe7aa191e5cf6.zip |
Bug: Active-lines for stripped vararg functions
Lua seg. faults when asked to create the 'activelines' table for a
vararg function with no debug information.
Diffstat (limited to 'ldebug.c')
-rw-r--r-- | ldebug.c | 36 |
1 files changed, 19 insertions, 17 deletions
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | 32 | ||
33 | 33 | ||
34 | #define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_VCCL) | 34 | #define LuaClosure(f) ((f) != NULL && (f)->c.tt == LUA_VLCL) |
35 | 35 | ||
36 | 36 | ||
37 | static const char *funcnamefromcall (lua_State *L, CallInfo *ci, | 37 | static const char *funcnamefromcall (lua_State *L, CallInfo *ci, |
@@ -255,7 +255,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { | |||
255 | 255 | ||
256 | 256 | ||
257 | static void funcinfo (lua_Debug *ar, Closure *cl) { | 257 | static void funcinfo (lua_Debug *ar, Closure *cl) { |
258 | if (noLuaClosure(cl)) { | 258 | if (!LuaClosure(cl)) { |
259 | ar->source = "=[C]"; | 259 | ar->source = "=[C]"; |
260 | ar->srclen = LL("=[C]"); | 260 | ar->srclen = LL("=[C]"); |
261 | ar->linedefined = -1; | 261 | ar->linedefined = -1; |
@@ -288,29 +288,31 @@ static int nextline (const Proto *p, int currentline, int pc) { | |||
288 | 288 | ||
289 | 289 | ||
290 | static void collectvalidlines (lua_State *L, Closure *f) { | 290 | static void collectvalidlines (lua_State *L, Closure *f) { |
291 | if (noLuaClosure(f)) { | 291 | if (!LuaClosure(f)) { |
292 | setnilvalue(s2v(L->top.p)); | 292 | setnilvalue(s2v(L->top.p)); |
293 | api_incr_top(L); | 293 | api_incr_top(L); |
294 | } | 294 | } |
295 | else { | 295 | else { |
296 | int i; | ||
297 | TValue v; | ||
298 | const Proto *p = f->l.p; | 296 | const Proto *p = f->l.p; |
299 | int currentline = p->linedefined; | 297 | int currentline = p->linedefined; |
300 | Table *t = luaH_new(L); /* new table to store active lines */ | 298 | Table *t = luaH_new(L); /* new table to store active lines */ |
301 | sethvalue2s(L, L->top.p, t); /* push it on stack */ | 299 | sethvalue2s(L, L->top.p, t); /* push it on stack */ |
302 | api_incr_top(L); | 300 | api_incr_top(L); |
303 | setbtvalue(&v); /* boolean 'true' to be the value of all indices */ | 301 | if (p->lineinfo != NULL) { /* proto with debug information? */ |
304 | if (!(p->flag & PF_ISVARARG)) /* regular function? */ | 302 | int i; |
305 | i = 0; /* consider all instructions */ | 303 | TValue v; |
306 | else { /* vararg function */ | 304 | setbtvalue(&v); /* boolean 'true' to be the value of all indices */ |
307 | lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); | 305 | if (!(p->flag & PF_ISVARARG)) /* regular function? */ |
308 | currentline = nextline(p, currentline, 0); | 306 | i = 0; /* consider all instructions */ |
309 | i = 1; /* skip first instruction (OP_VARARGPREP) */ | 307 | else { /* vararg function */ |
310 | } | 308 | lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); |
311 | for (; i < p->sizelineinfo; i++) { /* for each instruction */ | 309 | currentline = nextline(p, currentline, 0); |
312 | currentline = nextline(p, currentline, i); /* get its line */ | 310 | i = 1; /* skip first instruction (OP_VARARGPREP) */ |
313 | luaH_setint(L, t, currentline, &v); /* table[line] = true */ | 311 | } |
312 | for (; i < p->sizelineinfo; i++) { /* for each instruction */ | ||
313 | currentline = nextline(p, currentline, i); /* get its line */ | ||
314 | luaH_setint(L, t, currentline, &v); /* table[line] = true */ | ||
315 | } | ||
314 | } | 316 | } |
315 | } | 317 | } |
316 | } | 318 | } |
@@ -339,7 +341,7 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, | |||
339 | } | 341 | } |
340 | case 'u': { | 342 | case 'u': { |
341 | ar->nups = (f == NULL) ? 0 : f->c.nupvalues; | 343 | ar->nups = (f == NULL) ? 0 : f->c.nupvalues; |
342 | if (noLuaClosure(f)) { | 344 | if (!LuaClosure(f)) { |
343 | ar->isvararg = 1; | 345 | ar->isvararg = 1; |
344 | ar->nparams = 0; | 346 | ar->nparams = 0; |
345 | } | 347 | } |