diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-09-30 10:53:26 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-09-30 10:53:26 -0300 |
commit | d35fff16d5eecf0116193be08586548b53b9f868 (patch) | |
tree | 9a37620d8977615befadf723080cd4155f0ceda7 | |
parent | 56699cd6036a52abaf62a2d3097538b883d1edcb (diff) | |
download | lua-d35fff16d5eecf0116193be08586548b53b9f868.tar.gz lua-d35fff16d5eecf0116193be08586548b53b9f868.tar.bz2 lua-d35fff16d5eecf0116193be08586548b53b9f868.zip |
'ipairs' always stops at first nil element
-rw-r--r-- | lbaselib.c | 19 |
1 files changed, 5 insertions, 14 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbaselib.c,v 1.296 2014/08/21 20:07:56 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.297 2014/09/22 06:42:15 roberto Exp roberto $ |
3 | ** Basic library | 3 | ** Basic library |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -260,15 +260,8 @@ static int ipairsaux_raw (lua_State *L) { | |||
260 | */ | 260 | */ |
261 | static int ipairsaux (lua_State *L) { | 261 | static int ipairsaux (lua_State *L) { |
262 | int i = luaL_checkint(L, 2) + 1; | 262 | int i = luaL_checkint(L, 2) + 1; |
263 | if (i > luaL_len(L, 1)) { /* larger than length? */ | 263 | lua_pushinteger(L, i); |
264 | lua_pushnil(L); /* end traversal */ | 264 | return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; |
265 | return 1; | ||
266 | } | ||
267 | else { | ||
268 | lua_pushinteger(L, i); | ||
269 | lua_geti(L, 1, i); | ||
270 | return 2; | ||
271 | } | ||
272 | } | 265 | } |
273 | 266 | ||
274 | 267 | ||
@@ -278,10 +271,8 @@ static int ipairsaux (lua_State *L) { | |||
278 | ** that can affect the traversal. | 271 | ** that can affect the traversal. |
279 | */ | 272 | */ |
280 | static int luaB_ipairs (lua_State *L) { | 273 | static int luaB_ipairs (lua_State *L) { |
281 | lua_CFunction iter = | 274 | lua_CFunction iter = (luaL_getmetafield(L, 1, "__index") != LUA_TNIL) |
282 | (luaL_getmetafield(L, 1, "__len") != LUA_TNIL || | 275 | ? ipairsaux : ipairsaux_raw; |
283 | luaL_getmetafield(L, 1, "__index") != LUA_TNIL) | ||
284 | ? ipairsaux : ipairsaux_raw; | ||
285 | #if defined(LUA_COMPAT_IPAIRS) | 276 | #if defined(LUA_COMPAT_IPAIRS) |
286 | return pairsmeta(L, "__ipairs", 1, iter); | 277 | return pairsmeta(L, "__ipairs", 1, iter); |
287 | #else | 278 | #else |