summaryrefslogtreecommitdiff
path: root/src/ldblib.js
diff options
context:
space:
mode:
authorBenoit Giannangeli <giann008@gmail.com>2017-04-13 13:41:21 +0200
committerBenoit Giannangeli <giann008@gmail.com>2017-04-13 13:41:21 +0200
commit127ca3042ce2be23bd0b07570154c81ac3fda432 (patch)
treeaaa3405832acf6c9e26083d83357394588855451 /src/ldblib.js
parentad3491890872721b7cfb81517c1465c7bdbd53a8 (diff)
downloadfengari-127ca3042ce2be23bd0b07570154c81ac3fda432.tar.gz
fengari-127ca3042ce2be23bd0b07570154c81ac3fda432.tar.bz2
fengari-127ca3042ce2be23bd0b07570154c81ac3fda432.zip
debug.getupvalue, debug.setupvalue
Diffstat (limited to 'src/ldblib.js')
-rw-r--r--src/ldblib.js25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/ldblib.js b/src/ldblib.js
index 2edc507..d3e3c7c 100644
--- a/src/ldblib.js
+++ b/src/ldblib.js
@@ -178,6 +178,29 @@ const db_getlocal = function(L) {
};
/*
+** get (if 'get' is true) or set an upvalue from a closure
+*/
+const auxupvalue = function(L, get) {
+ let n = lauxlib.luaL_checkinteger(L, 2); /* upvalue index */
+ lauxlib.luaL_checktype(L, 1, lua.CT.LUA_TFUNCTION); /* closure */
+ let name = get ? lapi.lua_getupvalue(L, 1, n) : lapi.lua_setupvalue(L, 1, n);
+ if (name === null) return 0;
+ lapi.lua_pushstring(L, name);
+ lapi.lua_insert(L, -(get+1)); /* no-op if get is false */
+ return get + 1;
+};
+
+
+const db_getupvalue = function(L) {
+ return auxupvalue(L, 1);
+};
+
+const db_setupvalue = function(L) {
+ lauxlib.luaL_checkany(L, 3);
+ return auxupvalue(L, 0);
+};
+
+/*
** Check whether a given upvalue from a given closure exists and
** returns its index
*/
@@ -214,7 +237,9 @@ const dblib = {
"getlocal": db_getlocal,
"getmetatable": db_getmetatable,
"getregistry": db_getregistry,
+ "getupvalue": db_getupvalue,
"setmetatable": db_setmetatable,
+ "setupvalue": db_setupvalue,
"traceback": db_traceback,
"upvalueid": db_upvalueid
};