diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-04-28 11:00:11 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-04-28 11:00:11 -0300 |
commit | d120ec29ca6bae7a8f0040c7a0cee27aca7dd81a (patch) | |
tree | 8fc27ceb18ff8a10eef242f5ea492a71f803ae36 | |
parent | 2aff901c932862ccdb32c145d0034c20fe4fc41d (diff) | |
download | lua-d120ec29ca6bae7a8f0040c7a0cee27aca7dd81a.tar.gz lua-d120ec29ca6bae7a8f0040c7a0cee27aca7dd81a.tar.bz2 lua-d120ec29ca6bae7a8f0040c7a0cee27aca7dd81a.zip |
bug in OP_SELF when method name goes to a register
-rw-r--r-- | lcode.c | 14 | ||||
-rw-r--r-- | ldebug.c | 44 |
2 files changed, 39 insertions, 19 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 2.52 2011/04/07 18:14:12 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.53 2011/04/19 16:22:13 roberto Exp roberto $ |
3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -581,15 +581,15 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { | |||
581 | 581 | ||
582 | 582 | ||
583 | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { | 583 | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { |
584 | int func; | 584 | int ereg; |
585 | luaK_exp2anyreg(fs, e); | 585 | luaK_exp2anyreg(fs, e); |
586 | ereg = e->u.info; /* register where 'e' was placed */ | ||
586 | freeexp(fs, e); | 587 | freeexp(fs, e); |
587 | func = fs->freereg; | 588 | e->u.info = fs->freereg; /* base register for op_self */ |
588 | luaK_codeABC(fs, OP_SELF, func, e->u.info, luaK_exp2RK(fs, key)); | ||
589 | freeexp(fs, key); | ||
590 | luaK_reserveregs(fs, 2); | ||
591 | e->u.info = func; | ||
592 | e->k = VNONRELOC; | 589 | e->k = VNONRELOC; |
590 | luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ | ||
591 | luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key)); | ||
592 | freeexp(fs, key); | ||
593 | } | 593 | } |
594 | 594 | ||
595 | 595 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 2.79 2011/04/18 19:49:13 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.80 2011/04/19 16:22:13 roberto Exp roberto $ |
3 | ** Debug Interface | 3 | ** Debug Interface |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -284,15 +284,32 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
284 | ** ======================================================= | 284 | ** ======================================================= |
285 | */ | 285 | */ |
286 | 286 | ||
287 | static const char *getobjname (lua_State *L, CallInfo *ci, int reg, | ||
288 | const char **name); | ||
287 | 289 | ||
288 | static void kname (Proto *p, int c, int reg, const char *what, | 290 | |
289 | const char **name) { | 291 | /* |
290 | if (c == reg && what && *what == 'c') | 292 | ** find a "name" for the RK value 'c' |
291 | return; /* index is a constant; name already correct */ | 293 | */ |
292 | else if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) | 294 | static void kname (lua_State *L, CallInfo *ci, int c, int oreg, |
293 | *name = svalue(&p->k[INDEXK(c)]); | 295 | const char *what, const char **name) { |
294 | else | 296 | if (ISK(c)) { /* is 'c' a constant? */ |
295 | *name = "?"; | 297 | TValue *kvalue = &ci_func(ci)->l.p->k[INDEXK(c)]; |
298 | if (ttisstring(kvalue)) { /* literal constant? */ | ||
299 | *name = svalue(kvalue); /* it is its own name */ | ||
300 | return; | ||
301 | } | ||
302 | /* else no reasonable name found */ | ||
303 | } | ||
304 | else { /* 'c' is a register */ | ||
305 | if (c != oreg) /* not the original register? */ | ||
306 | what = getobjname(L, ci, c, name); /* search for 'c' */ | ||
307 | if (what && *what == 'c') { /* found a constant name? */ | ||
308 | return; /* 'name' already filled */ | ||
309 | } | ||
310 | /* else no reasonable name found */ | ||
311 | } | ||
312 | *name = "?"; /* no reasonable name found */ | ||
296 | } | 313 | } |
297 | 314 | ||
298 | 315 | ||
@@ -328,7 +345,7 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg, | |||
328 | const char *vn = (op == OP_GETTABLE) /* name of indexed variable */ | 345 | const char *vn = (op == OP_GETTABLE) /* name of indexed variable */ |
329 | ? luaF_getlocalname(p, t + 1, pc) | 346 | ? luaF_getlocalname(p, t + 1, pc) |
330 | : getstr(p->upvalues[t].name); | 347 | : getstr(p->upvalues[t].name); |
331 | kname(p, k, a, what, name); | 348 | kname(L, ci, k, a, what, name); |
332 | what = (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field"; | 349 | what = (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field"; |
333 | } | 350 | } |
334 | break; | 351 | break; |
@@ -363,7 +380,7 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg, | |||
363 | case OP_SELF: { | 380 | case OP_SELF: { |
364 | if (reg == a) { | 381 | if (reg == a) { |
365 | int k = GETARG_C(i); /* key index */ | 382 | int k = GETARG_C(i); /* key index */ |
366 | kname(p, k, a, what, name); | 383 | kname(L, ci, k, a, what, name); |
367 | what = "method"; | 384 | what = "method"; |
368 | } | 385 | } |
369 | break; | 386 | break; |
@@ -443,7 +460,10 @@ static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { | |||
443 | 460 | ||
444 | 461 | ||
445 | 462 | ||
446 | /* only ANSI way to check whether a pointer points to an array */ | 463 | /* |
464 | ** only ANSI way to check whether a pointer points to an array | ||
465 | ** (used only for error messages, so efficiency is not a big concern) | ||
466 | */ | ||
447 | static int isinstack (CallInfo *ci, const TValue *o) { | 467 | static int isinstack (CallInfo *ci, const TValue *o) { |
448 | StkId p; | 468 | StkId p; |
449 | for (p = ci->u.l.base; p < ci->top; p++) | 469 | for (p = ci->u.l.base; p < ci->top; p++) |