add lua_copy

This commit is contained in:
Francois Perrad 2017-03-23 18:30:26 +01:00
parent b7ea5c97b8
commit 36e34118b9
2 changed files with 20 additions and 10 deletions

View File

@ -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));

View File

@ -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 {