seqlua
changeset 6:7b05ca6ef925
Allow seqlua_iterinit to modify the value on stack instead of storing an extra element on stack
author | jbe |
---|---|
date | Wed Aug 20 01:52:35 2014 +0200 (2014-08-20) |
parents | e29e2d7b73a5 |
children | 2cb22d01fdd0 |
files | README seqlualib.c |
line diff
1.1 --- a/README Wed Aug 20 01:45:04 2014 +0200 1.2 +++ b/README Wed Aug 20 01:52:35 2014 +0200 1.3 @@ -133,9 +133,9 @@ 1.4 1.5 printcsv{"a", "b", "c"} -- prints: a,b,c 1.6 1.7 -NOTE: ``seqlua_iterinit`` will store one extra element on the stack during 1.8 -iteration. When ``seqlua_iternext`` returns 0, this extra element is popped 1.9 -from the stack automatically. 1.10 +NOTE: If the index passed to ``seqlua_iterinit`` points to a value that has a 1.11 +``__call`` metamethod, then the value at the stack position will be replaced by 1.12 +that metamethod. 1.13 1.14 Additionally, ``seqlualib`` includes a function ``seqlua_iterclosure(L, idx)``, 1.15 which converts a table at a given stack index into a function closure (stored
2.1 --- a/seqlualib.c Wed Aug 20 01:45:04 2014 +0200 2.2 +++ b/seqlualib.c Wed Aug 20 01:52:35 2014 +0200 2.3 @@ -11,9 +11,9 @@ 2.4 iter->L = L; 2.5 if (luaL_getmetafield(L, idx, "__call")) { 2.6 if (lua_type(L, -1) != LUA_TFUNCTION) luaL_error(L, "__call is not a function"); 2.7 + lua_replace(L, idx); 2.8 iter->itertype = SEQLUA_ITERTYPE_FUNC; 2.9 } else if (lua_type(L, idx) == LUA_TFUNCTION) { 2.10 - lua_pushvalue(L, idx); 2.11 iter->itertype = SEQLUA_ITERTYPE_FUNC; 2.12 } else { 2.13 if (luaL_getmetafield(L, idx, "__index")) { 2.14 @@ -23,7 +23,6 @@ 2.15 luaL_checktype(L, idx, LUA_TTABLE); 2.16 iter->itertype = SEQLUA_ITERTYPE_RAW; 2.17 } 2.18 - lua_pushvalue(L, idx); 2.19 } 2.20 iter->i = 0; 2.21 } 2.22 @@ -44,7 +43,7 @@ 2.23 lua_rawgeti(L, -1, i); 2.24 } 2.25 if (lua_isnil(L, -1)) { 2.26 - lua_pop(L, 2); 2.27 + lua_pop(L, 1); 2.28 return 0; 2.29 } 2.30 return 1;