aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-01-29 11:14:49 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2001-01-29 11:14:49 -0200
commitcaf01b5bfa33617b7bb2c40292f74599f6030eba (patch)
tree7ebc6352b89f9c331d693701aa4824a7320195e5 /lvm.c
parentca1f28b829090e99fb82d688dac34b2055d2963e (diff)
downloadlua-caf01b5bfa33617b7bb2c40292f74599f6030eba.tar.gz
lua-caf01b5bfa33617b7bb2c40292f74599f6030eba.tar.bz2
lua-caf01b5bfa33617b7bb2c40292f74599f6030eba.zip
better implementation for list "for"
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/lvm.c b/lvm.c
index 9a2c75f4..1da0ce20 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.157 2001/01/24 16:20:54 roberto Exp roberto $ 2** $Id: lvm.c,v 1.158 2001/01/26 18:43:22 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*/
@@ -644,28 +644,36 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) {
644 break; 644 break;
645 } 645 }
646 case OP_LFORPREP: { 646 case OP_LFORPREP: {
647 Node *node; 647 int n;
648 Hash *t;
648 if (ttype(top-1) != LUA_TTABLE) 649 if (ttype(top-1) != LUA_TTABLE)
649 luaD_error(L, "`for' table must be a table"); 650 luaD_error(L, "`for' table must be a table");
650 node = luaH_next(L, hvalue(top-1), &luaO_nilobject); 651 t = hvalue(top-1);
651 if (node == NULL) { /* `empty' loop? */ 652 n = luaH_nexti(t, -1);
653 if (n == -1) { /* `empty' loop? */
652 top--; /* remove table */ 654 top--; /* remove table */
653 dojump(pc, i); /* jump to loop end */ 655 dojump(pc, i); /* jump to loop end */
654 } 656 }
655 else { 657 else {
656 top += 2; /* index,value */ 658 Node *node = node(t, n);
659 top += 3; /* index,key,value */
660 setnvalue(top-3, n); /* index */
657 setobj(top-2, key(node)); 661 setobj(top-2, key(node));
658 setobj(top-1, val(node)); 662 setobj(top-1, val(node));
659 } 663 }
660 break; 664 break;
661 } 665 }
662 case OP_LFORLOOP: { 666 case OP_LFORLOOP: {
663 Node *node; 667 Hash *t = hvalue(top-4);
664 lua_assert(ttype(top-3) == LUA_TTABLE); 668 int n = (int)nvalue(top-3);
665 node = luaH_next(L, hvalue(top-3), top-2); 669 lua_assert(ttype(top-3) == LUA_TNUMBER);
666 if (node == NULL) /* end loop? */ 670 lua_assert(ttype(top-4) == LUA_TTABLE);
667 top -= 3; /* remove table, key, and value */ 671 n = luaH_nexti(t, n);
672 if (n == -1) /* end loop? */
673 top -= 4; /* remove table, index, key, and value */
668 else { 674 else {
675 Node *node = node(t, n);
676 setnvalue(top-3, n); /* index */
669 setobj(top-2, key(node)); 677 setobj(top-2, key(node));
670 setobj(top-1, val(node)); 678 setobj(top-1, val(node));
671 dojump(pc, i); /* repeat loop */ 679 dojump(pc, i); /* repeat loop */