diff options
-rw-r--r-- | lbaselib.c | 21 |
1 files changed, 6 insertions, 15 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbaselib.c,v 1.116 2002/12/20 09:55:56 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.117 2003/02/10 10:21:31 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 | */ |
@@ -295,20 +295,11 @@ static int luaB_assert (lua_State *L) { | |||
295 | static int luaB_unpack (lua_State *L) { | 295 | static int luaB_unpack (lua_State *L) { |
296 | int n, i; | 296 | int n, i; |
297 | luaL_checktype(L, 1, LUA_TTABLE); | 297 | luaL_checktype(L, 1, LUA_TTABLE); |
298 | lua_pushliteral(L, "n"); | 298 | n = luaL_getn(L, 1); |
299 | lua_rawget(L, 1); | 299 | luaL_checkstack(L, n, "table too big to unpack"); |
300 | n = (lua_isnumber(L, -1)) ? (int)lua_tonumber(L, -1) : -1; | 300 | for (i=1; i<=n; i++) /* push arg[1...n] */ |
301 | for (i=0; i<n || n==-1; i++) { /* push arg[1...n] */ | 301 | lua_rawgeti(L, 1, i); |
302 | luaL_checkstack(L, LUA_MINSTACK, "table too big to unpack"); | 302 | return n; |
303 | lua_rawgeti(L, 1, i+1); | ||
304 | if (n == -1) { /* no explicit limit? */ | ||
305 | if (lua_isnil(L, -1)) { /* stop at first `nil' element */ | ||
306 | lua_pop(L, 1); /* remove `nil' */ | ||
307 | break; | ||
308 | } | ||
309 | } | ||
310 | } | ||
311 | return i; | ||
312 | } | 303 | } |
313 | 304 | ||
314 | 305 | ||