aboutsummaryrefslogtreecommitdiff
path: root/src/lj_api.c
diff options
context:
space:
mode:
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);