small bug in close x return
This commit is contained in:
3
ldebug.c
3
ldebug.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: ldebug.c,v 1.87 2001/07/03 17:01:34 roberto Exp $
|
** $Id: ldebug.c,v 1.88 2001/09/07 17:39:10 roberto Exp $
|
||||||
** Debug Interface
|
** Debug Interface
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -331,7 +331,6 @@ static int checkopenop (const Proto *pt, int pc) {
|
|||||||
check(GETARG_B(i) == NO_REG);
|
check(GETARG_B(i) == NO_REG);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case OP_CLOSE: return checkopenop(pt, pc+1);
|
|
||||||
case OP_SETLISTO: return 1;
|
case OP_SETLISTO: return 1;
|
||||||
default: return 0; /* invalid instruction after an open call */
|
default: return 0; /* invalid instruction after an open call */
|
||||||
}
|
}
|
||||||
|
|||||||
14
lparser.c
14
lparser.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lparser.c,v 1.156 2001/09/07 17:39:10 roberto Exp $
|
** $Id: lparser.c,v 1.157 2001/09/25 17:06:48 roberto Exp $
|
||||||
** Lua Parser
|
** Lua Parser
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -184,9 +184,10 @@ static void closelevel (LexState *ls, int level) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void removelocalvars (LexState *ls, int nvars) {
|
static void removelocalvars (LexState *ls, int nvars, int toclose) {
|
||||||
FuncState *fs = ls->fs;
|
FuncState *fs = ls->fs;
|
||||||
closelevel(ls, fs->nactloc - nvars);
|
if (toclose)
|
||||||
|
closelevel(ls, fs->nactloc - nvars);
|
||||||
while (nvars--)
|
while (nvars--)
|
||||||
fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc;
|
fs->f->locvars[fs->actloc[--fs->nactloc]].endpc = fs->pc;
|
||||||
}
|
}
|
||||||
@@ -333,7 +334,7 @@ static void close_func (LexState *ls) {
|
|||||||
lua_State *L = ls->L;
|
lua_State *L = ls->L;
|
||||||
FuncState *fs = ls->fs;
|
FuncState *fs = ls->fs;
|
||||||
Proto *f = fs->f;
|
Proto *f = fs->f;
|
||||||
removelocalvars(ls, fs->nactloc);
|
removelocalvars(ls, fs->nactloc, 0);
|
||||||
luaK_codeABC(fs, OP_RETURN, 0, 0, 0); /* final return */
|
luaK_codeABC(fs, OP_RETURN, 0, 0, 0); /* final return */
|
||||||
luaK_getlabel(fs); /* close eventual list of pending jumps */
|
luaK_getlabel(fs); /* close eventual list of pending jumps */
|
||||||
lua_assert(G(L)->roottable == fs->h);
|
lua_assert(G(L)->roottable == fs->h);
|
||||||
@@ -816,7 +817,7 @@ static void block (LexState *ls) {
|
|||||||
FuncState *fs = ls->fs;
|
FuncState *fs = ls->fs;
|
||||||
int nactloc = fs->nactloc;
|
int nactloc = fs->nactloc;
|
||||||
chunk(ls);
|
chunk(ls);
|
||||||
removelocalvars(ls, fs->nactloc - nactloc);
|
removelocalvars(ls, fs->nactloc - nactloc, 1);
|
||||||
fs->freereg = nactloc; /* free registers used by locals */
|
fs->freereg = nactloc; /* free registers used by locals */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -951,7 +952,7 @@ static void forbody (LexState *ls, int nvar, OpCode prepfor, OpCode loopfor) {
|
|||||||
block(ls);
|
block(ls);
|
||||||
luaK_patchlist(fs, luaK_codeAsBc(fs, loopfor, basereg, NO_JUMP), blockinit);
|
luaK_patchlist(fs, luaK_codeAsBc(fs, loopfor, basereg, NO_JUMP), blockinit);
|
||||||
luaK_fixfor(fs, prep, luaK_getlabel(fs));
|
luaK_fixfor(fs, prep, luaK_getlabel(fs));
|
||||||
removelocalvars(ls, nvar);
|
removelocalvars(ls, nvar, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1128,7 +1129,6 @@ static void retstat (LexState *ls) {
|
|||||||
nret = fs->freereg - first; /* return all `active' values */
|
nret = fs->freereg - first; /* return all `active' values */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
closelevel(ls, 0);
|
|
||||||
luaK_codeABC(fs, OP_RETURN, first, nret, 0);
|
luaK_codeABC(fs, OP_RETURN, first, nret, 0);
|
||||||
fs->freereg = fs->nactloc; /* removes all temp values */
|
fs->freereg = fs->nactloc; /* removes all temp values */
|
||||||
}
|
}
|
||||||
|
|||||||
6
lvm.c
6
lvm.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: lvm.c,v 1.190 2001/06/28 14:57:17 roberto Exp roberto $
|
** $Id: lvm.c,v 1.193 2001/09/07 17:39:10 roberto Exp $
|
||||||
** Lua virtual machine
|
** Lua virtual machine
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@@ -556,7 +556,9 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_RETURN: {
|
case OP_RETURN: {
|
||||||
int b = GETARG_B(i);
|
int b;
|
||||||
|
luaF_close(L, base);
|
||||||
|
b = GETARG_B(i);
|
||||||
if (b != NO_REG)
|
if (b != NO_REG)
|
||||||
L->top = ra+b;
|
L->top = ra+b;
|
||||||
return ra;
|
return ra;
|
||||||
|
|||||||
Reference in New Issue
Block a user