aboutsummaryrefslogtreecommitdiff
path: root/ltablib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-03-10 14:14:37 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-03-10 14:14:37 -0300
commitba484b9eb16dd62a7c3a5400a66eb952b654d3f0 (patch)
tree31692ddf85265e5a46eab0cd55a0b0757a225e68 /ltablib.c
parentf9d015523ef48266cea37e13717c223c16941b23 (diff)
downloadlua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.tar.gz
lua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.tar.bz2
lua-ba484b9eb16dd62a7c3a5400a66eb952b654d3f0.zip
yielding across lua_call (first version)
Diffstat (limited to 'ltablib.c')
-rw-r--r--ltablib.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/ltablib.c b/ltablib.c
index ab83c0c8..7296fb38 100644
--- a/ltablib.c
+++ b/ltablib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltablib.c,v 1.43 2008/02/14 16:03:27 roberto Exp roberto $ 2** $Id: ltablib.c,v 1.44 2008/04/07 18:43:00 roberto Exp roberto $
3** Library for Table Manipulation 3** Library for Table Manipulation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -36,20 +36,28 @@ static int foreachi (lua_State *L) {
36} 36}
37 37
38 38
39static int foreach (lua_State *L) { 39static int foreachcont (lua_State *L) {
40 luaL_checktype(L, 1, LUA_TTABLE); 40 for (;;) {
41 luaL_checktype(L, 2, LUA_TFUNCTION);
42 lua_pushnil(L); /* first key */
43 while (lua_next(L, 1)) {
44 lua_pushvalue(L, 2); /* function */
45 lua_pushvalue(L, -3); /* key */
46 lua_pushvalue(L, -3); /* value */
47 lua_call(L, 2, 1);
48 if (!lua_isnil(L, -1)) 41 if (!lua_isnil(L, -1))
49 return 1; 42 return 1;
50 lua_pop(L, 2); /* remove value and result */ 43 lua_pop(L, 2); /* remove value and result */
44 if (lua_next(L, 1) == 0) /* no more elements? */
45 return 0;
46 lua_pushvalue(L, 2); /* function */
47 lua_pushvalue(L, -3); /* key */
48 lua_pushvalue(L, -3); /* value */
49 lua_callcont(L, 2, 1, &foreachcont);
51 } 50 }
52 return 0; 51}
52
53
54static int foreach (lua_State *L) {
55 luaL_checktype(L, 1, LUA_TTABLE);
56 luaL_checktype(L, 2, LUA_TFUNCTION);
57 lua_pushnil(L); /* first key */
58 lua_pushnil(L); /* first value */
59 lua_pushnil(L); /* first "return" */
60 return foreachcont(L);
53} 61}
54 62
55 63