aboutsummaryrefslogtreecommitdiff
path: root/src/ltablib.js
diff options
context:
space:
mode:
authorBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-02-24 08:31:29 +0100
committerBenoit Giannangeli <benoit.giannangeli@boursorama.fr>2017-02-24 08:31:29 +0100
commitf52c86ef0450dd03ef9f2cd01143d6ed9ac759d1 (patch)
tree4ce0bd7cd6280b55a151ca4372e3665cc308ca7a /src/ltablib.js
parentbd3ffd7282de8236cd4eb2ff2e21bbc10791bfeb (diff)
downloadfengari-f52c86ef0450dd03ef9f2cd01143d6ed9ac759d1.tar.gz
fengari-f52c86ef0450dd03ef9f2cd01143d6ed9ac759d1.tar.bz2
fengari-f52c86ef0450dd03ef9f2cd01143d6ed9ac759d1.zip
table.unpack
Diffstat (limited to 'src/ltablib.js')
-rw-r--r--src/ltablib.js16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/ltablib.js b/src/ltablib.js
index ec7c578..86b57d7 100644
--- a/src/ltablib.js
+++ b/src/ltablib.js
@@ -91,9 +91,23 @@ const pack = function(L) {
return 1; /* return table */
};
+const unpack = function(L) {
+ let i = lauxlib.luaL_optinteger(L, 2, 1);
+ let e = lauxlib.luaL_opt(L, lauxlib.luaL_checkinteger, 3, lapi.lua_len(L, 1));
+ if (i > e) return 0; /* empty range */
+ let n = e - i; /* number of elements minus 1 (avoid overflows) */
+ if (n >= Number.MAX_SAFE_INTEGER || !lapi.lua_checkstack(L, ++n))
+ return lauxlib.luaL_error(L, "too many results to unpack");
+ for (; i < e; i++) /* push arg[i..e - 1] (to avoid overflows) */
+ lapi.lua_geti(L, 1, i);
+ lapi.lua_geti(L, 1, e); /* push last element */
+ return n;
+};
+
const tab_funcs = {
"concat": tconcat,
- "pack": pack
+ "pack": pack,
+ "unpack": unpack,
};
const luaopen_table = function(L) {