aboutsummaryrefslogtreecommitdiff
path: root/src/lj_api.c
diff options
context:
space:
mode:
authorMike Pall <mike>2012-09-20 17:36:15 +0200
committerMike Pall <mike>2012-09-20 17:36:15 +0200
commit8352335c745eb7053cdc39d949b036f90724a0fb (patch)
treebc2fc36e71bbda6b573ba104ffccfaa113246837 /src/lj_api.c
parenta9baead59f0521b289ba39e4d56ca92b0359e31e (diff)
downloadluajit-8352335c745eb7053cdc39d949b036f90724a0fb.tar.gz
luajit-8352335c745eb7053cdc39d949b036f90724a0fb.tar.bz2
luajit-8352335c745eb7053cdc39d949b036f90724a0fb.zip
From Lua 5.2: Add debug.upvalueid() and debug.upvaluejoin().
Ditto for lua_upvalueid() and lua_upvaluejoin().
Diffstat (limited to 'src/lj_api.c')
-rw-r--r--src/lj_api.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index bfd471d2..a9ea38d8 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -852,6 +852,26 @@ LUA_API const char *lua_getupvalue(lua_State *L, int idx, int n)
852 return name; 852 return name;
853} 853}
854 854
855LUA_API void *lua_upvalueid(lua_State *L, int idx, int n)
856{
857 GCfunc *fn = funcV(index2adr(L, idx));
858 n--;
859 api_check(L, (uint32_t)n < fn->l.nupvalues);
860 return isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :
861 (void *)&fn->c.upvalue[n];
862}
863
864LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)
865{
866 GCfunc *fn1 = funcV(index2adr(L, idx1));
867 GCfunc *fn2 = funcV(index2adr(L, idx2));
868 n1--; n2--;
869 api_check(L, isluafunc(fn1) && (uint32_t)n1 < fn1->l.nupvalues);
870 api_check(L, isluafunc(fn2) && (uint32_t)n2 < fn2->l.nupvalues);
871 setgcrefr(fn1->l.uvptr[n1], fn2->l.uvptr[n2]);
872 lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));
873}
874
855LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) 875LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
856{ 876{
857 cTValue *o = index2adr(L, idx); 877 cTValue *o = index2adr(L, idx);