diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-12-06 15:09:00 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-12-06 15:09:00 -0200 |
commit | cc4a22ebe28c5d09566facde05840ddf42778eac (patch) | |
tree | 3c7b30728c9c819c04eeddb5558902236f3fecde /lvm.c | |
parent | acf62ddfbe1163f7cc1ab463842fb6a1b6aba8fe (diff) | |
download | lua-cc4a22ebe28c5d09566facde05840ddf42778eac.tar.gz lua-cc4a22ebe28c5d09566facde05840ddf42778eac.tar.bz2 lua-cc4a22ebe28c5d09566facde05840ddf42778eac.zip |
bug: scope of generic for variables is not sound
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 25 |
1 files changed, 17 insertions, 8 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.270 2002/11/25 17:47:13 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.271 2002/12/04 17:38:31 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -671,14 +671,23 @@ StkId luaV_execute (lua_State *L) { | |||
671 | break; | 671 | break; |
672 | } | 672 | } |
673 | case OP_TFORLOOP: { | 673 | case OP_TFORLOOP: { |
674 | setobjs2s(ra+4, ra+2); | 674 | int nvar = GETARG_C(i) + 1; |
675 | setobjs2s(ra+3, ra+1); | 675 | StkId cb = ra + nvar + 2; /* call base */ |
676 | setobjs2s(ra+2, ra); | 676 | setobjs2s(cb, ra); |
677 | L->top = ra+5; | 677 | setobjs2s(cb+1, ra+1); |
678 | luaD_call(L, ra+2, GETARG_C(i) + 1); | 678 | setobjs2s(cb+2, ra+2); |
679 | L->top = cb+3; /* func. + 2 args (state and index) */ | ||
680 | luaD_call(L, cb, nvar); | ||
679 | L->top = L->ci->top; | 681 | L->top = L->ci->top; |
680 | if (ttisnil(XRA(i)+2)) pc++; /* skip jump (break loop) */ | 682 | ra = XRA(i); /* call may change stack */ |
681 | else dojump(pc, GETARG_sBx(*pc) + 1); /* else jump back */ | 683 | cb = ra + nvar + 2; |
684 | if (ttisnil(cb)) /* break loop? */ | ||
685 | pc++; /* skip jump (break loop) */ | ||
686 | else { | ||
687 | while (nvar--) /* move results to proper positions */ | ||
688 | setobjs2s(ra+2+nvar, cb+nvar); | ||
689 | dojump(pc, GETARG_sBx(*pc) + 1); /* jump back */ | ||
690 | } | ||
682 | break; | 691 | break; |
683 | } | 692 | } |
684 | case OP_TFORPREP: { /* for compatibility only */ | 693 | case OP_TFORPREP: { /* for compatibility only */ |