From 0dc09cb42e558aabf9ffca397b5588e6ee2fecfa Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 28 Dec 2009 14:30:31 -0200 Subject: [PATCH] 'unpack' moved to table library (and therefore "renamed" to 'table.unpack'. --- lbaselib.c | 19 +------------------ ltablib.c | 26 ++++++++++++++++++++++++-- luaconf.h | 9 ++++++++- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/lbaselib.c b/lbaselib.c index 6e176990..0554ba55 100644 --- a/lbaselib.c +++ b/lbaselib.c @@ -1,5 +1,5 @@ /* -** $Id: lbaselib.c,v 1.233 2009/12/17 16:20:01 roberto Exp roberto $ +** $Id: lbaselib.c,v 1.234 2009/12/22 15:32:50 roberto Exp roberto $ ** Basic library ** See Copyright Notice in lua.h */ @@ -412,22 +412,6 @@ static int luaB_assert (lua_State *L) { } -static int luaB_unpack (lua_State *L) { - int i, e, n; - luaL_checktype(L, 1, LUA_TTABLE); - i = luaL_optint(L, 2, 1); - e = luaL_opt(L, luaL_checkint, 3, (int)lua_rawlen(L, 1)); - if (i > e) return 0; /* empty range */ - n = e - i + 1; /* number of elements */ - if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ - return luaL_error(L, "too many results to unpack"); - lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ - while (i++ < e) /* push arg[i + 1...e] */ - lua_rawgeti(L, 1, i); - return n; -} - - static int luaB_select (lua_State *L) { int n = lua_gettop(L); if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { @@ -542,7 +526,6 @@ static const luaL_Reg base_funcs[] = { {"tonumber", luaB_tonumber}, {"tostring", luaB_tostring}, {"type", luaB_type}, - {"unpack", luaB_unpack}, {"xpcall", luaB_xpcall}, {NULL, NULL} }; diff --git a/ltablib.c b/ltablib.c index 9a089932..a288633a 100644 --- a/ltablib.c +++ b/ltablib.c @@ -1,5 +1,5 @@ /* -** $Id: ltablib.c,v 1.51 2009/12/17 16:20:01 roberto Exp roberto $ +** $Id: ltablib.c,v 1.52 2009/12/18 16:53:12 roberto Exp roberto $ ** Library for Table Manipulation ** See Copyright Notice in lua.h */ @@ -164,7 +164,7 @@ static int tconcat (lua_State *L) { /* ** {====================================================== -** Pack +** Pack/unpack ** ======================================================= */ @@ -181,6 +181,22 @@ static int pack (lua_State *L) { return 1; } + +static int unpack (lua_State *L) { + int i, e, n; + luaL_checktype(L, 1, LUA_TTABLE); + i = luaL_optint(L, 2, 1); + e = luaL_opt(L, luaL_checkint, 3, (int)lua_rawlen(L, 1)); + if (i > e) return 0; /* empty range */ + n = e - i + 1; /* number of elements */ + if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ + return luaL_error(L, "too many results to unpack"); + lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ + while (i++ < e) /* push arg[i + 1...e] */ + lua_rawgeti(L, 1, i); + return n; +} + /* }====================================================== */ @@ -298,6 +314,7 @@ static const luaL_Reg tab_funcs[] = { {"maxn", maxn}, {"insert", tinsert}, {"pack", pack}, + {"unpack", unpack}, {"remove", tremove}, {"sort", sort}, {NULL, NULL} @@ -306,6 +323,11 @@ static const luaL_Reg tab_funcs[] = { LUAMOD_API int luaopen_table (lua_State *L) { luaL_register(L, LUA_TABLIBNAME, tab_funcs); +#if defined(LUA_COMPAT_UNPACK) + /* _G.unpack = table.unpack */ + lua_getfield(L, -1, "unpack"); + lua_setfield(L, LUA_ENVIRONINDEX, "unpack"); +#endif return 1; } diff --git a/luaconf.h b/luaconf.h index 0768c9f4..4a9703ab 100644 --- a/luaconf.h +++ b/luaconf.h @@ -1,5 +1,5 @@ /* -** $Id: luaconf.h,v 1.124 2009/12/17 13:08:51 roberto Exp roberto $ +** $Id: luaconf.h,v 1.125 2009/12/22 16:47:00 roberto Exp roberto $ ** Configuration file for Lua ** See Copyright Notice in lua.h */ @@ -205,6 +205,13 @@ ** =================================================================== */ +/* +@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'. +** CHANGE it (define it) if you have not replaced its uses with +** 'table.unpack'. +*/ +/* #define LUA_COMPAT_UNPACK */ + /* @@ LUA_COMPAT_CPCALL controls the presence of function 'lua_cpcall'. ** CHANGE it (define it) if you need this function. (You can replace