diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-29 11:14:49 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-29 11:14:49 -0200 |
| commit | caf01b5bfa33617b7bb2c40292f74599f6030eba (patch) | |
| tree | 7ebc6352b89f9c331d693701aa4824a7320195e5 /lvm.c | |
| parent | ca1f28b829090e99fb82d688dac34b2055d2963e (diff) | |
| download | lua-caf01b5bfa33617b7bb2c40292f74599f6030eba.tar.gz lua-caf01b5bfa33617b7bb2c40292f74599f6030eba.tar.bz2 lua-caf01b5bfa33617b7bb2c40292f74599f6030eba.zip | |
better implementation for list "for"
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 28 |
1 files changed, 18 insertions, 10 deletions
| @@ -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 */ |
