diff options
author | Mike Pall <mike> | 2012-09-20 17:36:15 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-09-20 17:36:15 +0200 |
commit | 8352335c745eb7053cdc39d949b036f90724a0fb (patch) | |
tree | bc2fc36e71bbda6b573ba104ffccfaa113246837 /src/lj_api.c | |
parent | a9baead59f0521b289ba39e4d56ca92b0359e31e (diff) | |
download | luajit-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.c | 20 |
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 | ||
855 | LUA_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 | |||
864 | LUA_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 | |||
855 | LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname) | 875 | LUALIB_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); |