mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-08 15:34:09 +00:00
add lua_copy
This commit is contained in:
parent
b7ea5c97b8
commit
36e34118b9
29
src/lj_api.c
29
src/lj_api.c
@ -157,30 +157,39 @@ LUA_API void lua_insert(lua_State *L, int idx)
|
|||||||
copyTV(L, p, L->top);
|
copyTV(L, p, L->top);
|
||||||
}
|
}
|
||||||
|
|
||||||
LUA_API void lua_replace(lua_State *L, int idx)
|
static void moveto (lua_State *L, TValue *fr, int idx) {
|
||||||
{
|
|
||||||
api_checknelems(L, 1);
|
|
||||||
if (idx == LUA_GLOBALSINDEX) {
|
if (idx == LUA_GLOBALSINDEX) {
|
||||||
api_check(L, tvistab(L->top-1));
|
api_check(L, tvistab(fr));
|
||||||
/* NOBARRIER: A thread (i.e. L) is never black. */
|
/* NOBARRIER: A thread (i.e. L) is never black. */
|
||||||
setgcref(L->env, obj2gco(tabV(L->top-1)));
|
setgcref(L->env, obj2gco(tabV(fr)));
|
||||||
} else if (idx == LUA_ENVIRONINDEX) {
|
} else if (idx == LUA_ENVIRONINDEX) {
|
||||||
GCfunc *fn = curr_func(L);
|
GCfunc *fn = curr_func(L);
|
||||||
if (fn->c.gct != ~LJ_TFUNC)
|
if (fn->c.gct != ~LJ_TFUNC)
|
||||||
lj_err_msg(L, LJ_ERR_NOENV);
|
lj_err_msg(L, LJ_ERR_NOENV);
|
||||||
api_check(L, tvistab(L->top-1));
|
api_check(L, tvistab(fr));
|
||||||
setgcref(fn->c.env, obj2gco(tabV(L->top-1)));
|
setgcref(fn->c.env, obj2gco(tabV(fr)));
|
||||||
lj_gc_barrier(L, fn, L->top-1);
|
lj_gc_barrier(L, fn, fr);
|
||||||
} else {
|
} else {
|
||||||
TValue *o = index2adr(L, idx);
|
TValue *o = index2adr(L, idx);
|
||||||
api_checkvalidindex(L, o);
|
api_checkvalidindex(L, o);
|
||||||
copyTV(L, o, L->top-1);
|
copyTV(L, o, fr);
|
||||||
if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */
|
if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */
|
||||||
lj_gc_barrier(L, curr_func(L), L->top-1);
|
lj_gc_barrier(L, curr_func(L), fr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LUA_API void lua_replace (lua_State *L, int idx) {
|
||||||
|
api_checknelems(L, 1);
|
||||||
|
moveto(L, L->top - 1, idx);
|
||||||
L->top--;
|
L->top--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
|
||||||
|
TValue *fr;
|
||||||
|
fr = index2adr(L, fromidx);
|
||||||
|
moveto(L, fr, toidx);
|
||||||
|
}
|
||||||
|
|
||||||
LUA_API void lua_pushvalue(lua_State *L, int idx)
|
LUA_API void lua_pushvalue(lua_State *L, int idx)
|
||||||
{
|
{
|
||||||
copyTV(L, L->top, index2adr(L, idx));
|
copyTV(L, L->top, index2adr(L, idx));
|
||||||
|
@ -349,6 +349,7 @@ LUA_API void lua_upvaluejoin (lua_State *L, int idx1, int n1, int idx2, int n2);
|
|||||||
LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,
|
LUA_API int lua_loadx (lua_State *L, lua_Reader reader, void *dt,
|
||||||
const char *chunkname, const char *mode);
|
const char *chunkname, const char *mode);
|
||||||
LUA_API const lua_Number *lua_version (lua_State *L);
|
LUA_API const lua_Number *lua_version (lua_State *L);
|
||||||
|
LUA_API void lua_copy (lua_State *L, int fromidx, int toidx);
|
||||||
|
|
||||||
|
|
||||||
struct lua_Debug {
|
struct lua_Debug {
|
||||||
|
Loading…
Reference in New Issue
Block a user