diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-09-28 13:48:16 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-09-28 13:48:16 -0300 |
commit | f54cdb33a565aacd41fe00a172a3062a4a33118b (patch) | |
tree | d238f343f2430acae38b1a914d681e9ee3c9723b /lparser.c | |
parent | 8e9b1e4ae979aec95dcceb0db177367f5e865041 (diff) | |
download | lua-f54cdb33a565aacd41fe00a172a3062a4a33118b.tar.gz lua-f54cdb33a565aacd41fe00a172a3062a4a33118b.tar.bz2 lua-f54cdb33a565aacd41fe00a172a3062a4a33118b.zip |
small bug in close x return
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 14 |
1 files changed, 7 insertions, 7 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 1.156 2001/09/07 17:39:10 roberto Exp $ | 2 | ** $Id: lparser.c,v 1.157 2001/09/25 17:06:48 roberto Exp $ |
3 | ** Lua Parser | 3 | ** Lua Parser |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -184,9 +184,10 @@ static void closelevel (LexState *ls, int level) { | |||
184 | } | 184 | } |
185 | 185 | ||
186 | 186 | ||
187 | static void removelocalvars (LexState *ls, int nvars) { | 187 | static void removelocalvars (LexState *ls, int nvars, int toclose) { |
188 | FuncState *fs = ls->fs; | 188 | FuncState *fs = ls->fs; |
189 | closelevel(ls, fs->nactloc - nvars); | 189 | if (toclose) |
190 | closelevel(ls, fs->nactloc - nvars); | ||
190 | while (nvars--) | 191 | while (nvars--) |
191 | fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc; | 192 | fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc; |
192 | } | 193 | } |
@@ -333,7 +334,7 @@ static void close_func (LexState *ls) { | |||
333 | lua_State *L = ls->L; | 334 | lua_State *L = ls->L; |
334 | FuncState *fs = ls->fs; | 335 | FuncState *fs = ls->fs; |
335 | Proto *f = fs->f; | 336 | Proto *f = fs->f; |
336 | removelocalvars(ls, fs->nactloc); | 337 | removelocalvars(ls, fs->nactloc, 0); |
337 | luaK_codeABC(fs, OP_RETURN, 0, 0, 0); /* final return */ | 338 | luaK_codeABC(fs, OP_RETURN, 0, 0, 0); /* final return */ |
338 | luaK_getlabel(fs); /* close eventual list of pending jumps */ | 339 | luaK_getlabel(fs); /* close eventual list of pending jumps */ |
339 | lua_assert(G(L)->roottable == fs->h); | 340 | lua_assert(G(L)->roottable == fs->h); |
@@ -816,7 +817,7 @@ static void block (LexState *ls) { | |||
816 | FuncState *fs = ls->fs; | 817 | FuncState *fs = ls->fs; |
817 | int nactloc = fs->nactloc; | 818 | int nactloc = fs->nactloc; |
818 | chunk(ls); | 819 | chunk(ls); |
819 | removelocalvars(ls, fs->nactloc - nactloc); | 820 | removelocalvars(ls, fs->nactloc - nactloc, 1); |
820 | fs->freereg = nactloc; /* free registers used by locals */ | 821 | fs->freereg = nactloc; /* free registers used by locals */ |
821 | } | 822 | } |
822 | 823 | ||
@@ -951,7 +952,7 @@ static void forbody (LexState *ls, int nvar, OpCode prepfor, OpCode loopfor) { | |||
951 | block(ls); | 952 | block(ls); |
952 | luaK_patchlist(fs, luaK_codeAsBc(fs, loopfor, basereg, NO_JUMP), blockinit); | 953 | luaK_patchlist(fs, luaK_codeAsBc(fs, loopfor, basereg, NO_JUMP), blockinit); |
953 | luaK_fixfor(fs, prep, luaK_getlabel(fs)); | 954 | luaK_fixfor(fs, prep, luaK_getlabel(fs)); |
954 | removelocalvars(ls, nvar); | 955 | removelocalvars(ls, nvar, 1); |
955 | } | 956 | } |
956 | 957 | ||
957 | 958 | ||
@@ -1128,7 +1129,6 @@ static void retstat (LexState *ls) { | |||
1128 | nret = fs->freereg - first; /* return all `active' values */ | 1129 | nret = fs->freereg - first; /* return all `active' values */ |
1129 | } | 1130 | } |
1130 | } | 1131 | } |
1131 | closelevel(ls, 0); | ||
1132 | luaK_codeABC(fs, OP_RETURN, first, nret, 0); | 1132 | luaK_codeABC(fs, OP_RETURN, first, nret, 0); |
1133 | fs->freereg = fs->nactloc; /* removes all temp values */ | 1133 | fs->freereg = fs->nactloc; /* removes all temp values */ |
1134 | } | 1134 | } |