|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lvm.c,v 1.158 2001/01/26 18:43:22 roberto Exp roberto $
|
|
|
+** $Id: lvm.c,v 1.159 2001/01/29 13:02:20 roberto Exp roberto $
|
|
|
** Lua virtual machine
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -330,7 +330,7 @@ static void adjust_varargs (lua_State *L, StkId base, int nfixargs) {
|
|
|
|
|
|
|
|
|
|
|
|
-#define dojump(pc, i) { int d = GETARG_S(i); pc += d; }
|
|
|
+#define dojump(pc, i) ((pc) += GETARG_S(i))
|
|
|
|
|
|
/*
|
|
|
** Executes the given Lua function. Parameters are between [base,top).
|
|
@@ -615,19 +615,15 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
|
|
|
break;
|
|
|
}
|
|
|
case OP_FORPREP: {
|
|
|
+ int jmp = GETARG_S(i);
|
|
|
if (tonumber(top-1))
|
|
|
luaD_error(L, "`for' step must be a number");
|
|
|
if (tonumber(top-2))
|
|
|
luaD_error(L, "`for' limit must be a number");
|
|
|
if (tonumber(top-3))
|
|
|
luaD_error(L, "`for' initial value must be a number");
|
|
|
- if (nvalue(top-1) > 0 ?
|
|
|
- nvalue(top-3) > nvalue(top-2) :
|
|
|
- nvalue(top-3) < nvalue(top-2)) { /* `empty' loop? */
|
|
|
- top -= 3; /* remove control variables */
|
|
|
- dojump(pc, i); /* jump to loop end */
|
|
|
- }
|
|
|
- break;
|
|
|
+ pc += -jmp; /* "jump" to loop end (delta is negated here) */
|
|
|
+ goto forloop; /* do not increment index */
|
|
|
}
|
|
|
case OP_FORLOOP: {
|
|
|
lua_assert(ttype(top-1) == LUA_TNUMBER);
|
|
@@ -635,6 +631,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
|
|
|
if (ttype(top-3) != LUA_TNUMBER)
|
|
|
luaD_error(L, "`for' index must be a number");
|
|
|
nvalue(top-3) += nvalue(top-1); /* increment index */
|
|
|
+ forloop:
|
|
|
if (nvalue(top-1) > 0 ?
|
|
|
nvalue(top-3) > nvalue(top-2) :
|
|
|
nvalue(top-3) < nvalue(top-2))
|
|
@@ -644,24 +641,15 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
|
|
|
break;
|
|
|
}
|
|
|
case OP_LFORPREP: {
|
|
|
- int n;
|
|
|
- Hash *t;
|
|
|
+ int jmp = GETARG_S(i);
|
|
|
if (ttype(top-1) != LUA_TTABLE)
|
|
|
luaD_error(L, "`for' table must be a table");
|
|
|
- t = hvalue(top-1);
|
|
|
- n = luaH_nexti(t, -1);
|
|
|
- if (n == -1) { /* `empty' loop? */
|
|
|
- top--; /* remove table */
|
|
|
- dojump(pc, i); /* jump to loop end */
|
|
|
- }
|
|
|
- else {
|
|
|
- Node *node = node(t, n);
|
|
|
- top += 3; /* index,key,value */
|
|
|
- setnvalue(top-3, n); /* index */
|
|
|
- setobj(top-2, key(node));
|
|
|
- setobj(top-1, val(node));
|
|
|
- }
|
|
|
- break;
|
|
|
+ top += 3; /* index,key,value */
|
|
|
+ setnvalue(top-3, -1); /* initial index */
|
|
|
+ setnilvalue(top-2);
|
|
|
+ setnilvalue(top-1);
|
|
|
+ pc += -jmp; /* "jump" to loop end (delta is negated here) */
|
|
|
+ /* go through */
|
|
|
}
|
|
|
case OP_LFORLOOP: {
|
|
|
Hash *t = hvalue(top-4);
|