mirror of https://github.com/rusefi/lua.git
new function lua_copy
This commit is contained in:
parent
ba21aa8b2b
commit
a5382b763c
46
lapi.c
46
lapi.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lapi.c,v 2.91 2009/09/21 12:09:52 roberto Exp roberto $
|
** $Id: lapi.c,v 2.92 2009/09/28 16:32:50 roberto Exp roberto $
|
||||||
** Lua API
|
** Lua API
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -185,32 +185,46 @@ LUA_API void lua_insert (lua_State *L, int idx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void moveto (lua_State *L, TValue *fr, int idx) {
|
||||||
|
TValue *to = index2addr(L, idx);
|
||||||
|
api_checkvalidindex(L, to);
|
||||||
|
if (idx == LUA_ENVIRONINDEX) {
|
||||||
|
Closure *func = curr_func(L);
|
||||||
|
api_check(L, ttistable(fr), "table expected");
|
||||||
|
func->c.env = hvalue(fr);
|
||||||
|
luaC_barrier(L, func, fr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setobj(L, to, fr);
|
||||||
|
if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
|
||||||
|
luaC_barrier(L, curr_func(L), fr);
|
||||||
|
}
|
||||||
|
/* LUA_GLOBALSINDEX does not need gc barrier (threads are never black) */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_replace (lua_State *L, int idx) {
|
LUA_API void lua_replace (lua_State *L, int idx) {
|
||||||
StkId o;
|
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
/* explicit test for incompatible code */
|
/* explicit test for incompatible code */
|
||||||
if (idx == LUA_ENVIRONINDEX && L->ci->previous == NULL)
|
if (idx == LUA_ENVIRONINDEX && L->ci->previous == NULL)
|
||||||
luaG_runerror(L, "no calling environment");
|
luaG_runerror(L, "no calling environment");
|
||||||
api_checknelems(L, 1);
|
api_checknelems(L, 1);
|
||||||
o = index2addr(L, idx);
|
moveto(L, L->top - 1, idx);
|
||||||
api_checkvalidindex(L, o);
|
|
||||||
if (idx == LUA_ENVIRONINDEX) {
|
|
||||||
Closure *func = curr_func(L);
|
|
||||||
api_check(L, ttistable(L->top - 1), "table expected");
|
|
||||||
func->c.env = hvalue(L->top - 1);
|
|
||||||
luaC_barrier(L, func, L->top - 1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
setobj(L, o, L->top - 1);
|
|
||||||
if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
|
|
||||||
luaC_barrier(L, curr_func(L), L->top - 1);
|
|
||||||
}
|
|
||||||
/* LUA_GLOBALSINDEX does not need gc barrier (threads are never black) */
|
|
||||||
L->top--;
|
L->top--;
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
|
||||||
|
TValue *fr;
|
||||||
|
lua_lock(L);
|
||||||
|
fr = index2addr(L, fromidx);
|
||||||
|
api_checkvalidindex(L, fr);
|
||||||
|
moveto(L, fr, toidx);
|
||||||
|
lua_unlock(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
LUA_API void lua_pushvalue (lua_State *L, int idx) {
|
LUA_API void lua_pushvalue (lua_State *L, int idx) {
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
setobj2s(L, L->top, index2addr(L, idx));
|
setobj2s(L, L->top, index2addr(L, idx));
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lauxlib.c,v 1.191 2009/09/18 18:58:45 roberto Exp roberto $
|
** $Id: lauxlib.c,v 1.192 2009/09/28 12:36:40 roberto Exp roberto $
|
||||||
** Auxiliary functions for building Lua libraries
|
** Auxiliary functions for building Lua libraries
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -75,8 +75,8 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
|
||||||
lua_getinfo(L, "f", ar); /* push function */
|
lua_getinfo(L, "f", ar); /* push function */
|
||||||
lua_pushvalue(L, LUA_GLOBALSINDEX); /* push global table */
|
lua_pushvalue(L, LUA_GLOBALSINDEX); /* push global table */
|
||||||
if (findfield(L, top + 1, 2)) {
|
if (findfield(L, top + 1, 2)) {
|
||||||
lua_replace(L, top + 1); /* move name to proper place */
|
lua_copy(L, -1, top + 1); /* move name to proper place */
|
||||||
lua_pop(L, 1); /* remove other pushed value */
|
lua_pop(L, 2); /* remove pushed values */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lbaselib.c,v 1.217 2009/07/15 17:35:20 roberto Exp roberto $
|
** $Id: lbaselib.c,v 1.218 2009/08/04 18:20:18 roberto Exp roberto $
|
||||||
** Basic library
|
** Basic library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -432,8 +432,7 @@ static int luaB_xpcall (lua_State *L) {
|
||||||
int n = lua_gettop(L);
|
int n = lua_gettop(L);
|
||||||
luaL_argcheck(L, n >= 2, 2, "value expected");
|
luaL_argcheck(L, n >= 2, 2, "value expected");
|
||||||
lua_pushvalue(L, 1); /* exchange function... */
|
lua_pushvalue(L, 1); /* exchange function... */
|
||||||
lua_pushvalue(L, 2); /* ...and error handler */
|
lua_copy(L, 2, 1); /* ...and error handler */
|
||||||
lua_replace(L, 1);
|
|
||||||
lua_replace(L, 2);
|
lua_replace(L, 2);
|
||||||
status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 1, pcallcont);
|
status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 1, pcallcont);
|
||||||
luaL_checkstack(L, 1, NULL);
|
luaL_checkstack(L, 1, NULL);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: loadlib.c,v 1.64 2009/07/15 17:49:48 roberto Exp roberto $
|
** $Id: loadlib.c,v 1.65 2009/09/07 14:24:12 roberto Exp roberto $
|
||||||
** Dynamic library loader for Lua
|
** Dynamic library loader for Lua
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
**
|
**
|
||||||
|
@ -655,8 +655,7 @@ LUALIB_API int luaopen_package (lua_State *L) {
|
||||||
lua_setfield(L, -2, "__gc");
|
lua_setfield(L, -2, "__gc");
|
||||||
/* create `package' table */
|
/* create `package' table */
|
||||||
luaL_register(L, LUA_LOADLIBNAME, pk_funcs);
|
luaL_register(L, LUA_LOADLIBNAME, pk_funcs);
|
||||||
lua_pushvalue(L, -1);
|
lua_copy(L, -1, LUA_ENVIRONINDEX);
|
||||||
lua_replace(L, LUA_ENVIRONINDEX);
|
|
||||||
/* create `loaders' table */
|
/* create `loaders' table */
|
||||||
lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);
|
lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);
|
||||||
/* fill it with pre-defined loaders */
|
/* fill it with pre-defined loaders */
|
||||||
|
|
5
lstate.c
5
lstate.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lstate.c,v 2.60 2009/09/28 13:50:19 roberto Exp roberto $
|
** $Id: lstate.c,v 2.61 2009/09/30 20:49:47 roberto Exp roberto $
|
||||||
** Global State
|
** Global State
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -100,8 +100,7 @@ static int cpcall (lua_State *L) {
|
||||||
lua_CFunction f = *(lua_CFunction *)lua_touserdata(L, 1);
|
lua_CFunction f = *(lua_CFunction *)lua_touserdata(L, 1);
|
||||||
lua_remove(L, 1); /* remove f from stack */
|
lua_remove(L, 1); /* remove f from stack */
|
||||||
/* restore original environment for 'cpcall' */
|
/* restore original environment for 'cpcall' */
|
||||||
lua_pushvalue(L, LUA_GLOBALSINDEX);
|
lua_copy(L, LUA_GLOBALSINDEX, LUA_ENVIRONINDEX);
|
||||||
lua_replace(L, LUA_ENVIRONINDEX);
|
|
||||||
return f(L);
|
return f(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
ltests.c
6
ltests.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: ltests.c,v 2.73 2009/09/28 16:32:50 roberto Exp roberto $
|
** $Id: ltests.c,v 2.74 2009/09/30 20:49:25 roberto Exp roberto $
|
||||||
** Internal Module for Debugging of the Lua Implementation
|
** Internal Module for Debugging of the Lua Implementation
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -971,6 +971,10 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
|
||||||
else if EQ("replace") {
|
else if EQ("replace") {
|
||||||
lua_replace(L1, getindex);
|
lua_replace(L1, getindex);
|
||||||
}
|
}
|
||||||
|
else if EQ("copy") {
|
||||||
|
int f = getindex;
|
||||||
|
lua_copy(L1, f, getindex);
|
||||||
|
}
|
||||||
else if EQ("gettable") {
|
else if EQ("gettable") {
|
||||||
lua_gettable(L1, getindex);
|
lua_gettable(L1, getindex);
|
||||||
}
|
}
|
||||||
|
|
3
lua.h
3
lua.h
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lua.h,v 1.243 2009/09/17 18:04:21 roberto Exp roberto $
|
** $Id: lua.h,v 1.244 2009/09/21 12:09:52 roberto Exp roberto $
|
||||||
** Lua - An Extensible Extension Language
|
** Lua - An Extensible Extension Language
|
||||||
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
|
||||||
** See Copyright Notice at the end of this file
|
** See Copyright Notice at the end of this file
|
||||||
|
@ -135,6 +135,7 @@ LUA_API void (lua_pushvalue) (lua_State *L, int idx);
|
||||||
LUA_API void (lua_remove) (lua_State *L, int idx);
|
LUA_API void (lua_remove) (lua_State *L, int idx);
|
||||||
LUA_API void (lua_insert) (lua_State *L, int idx);
|
LUA_API void (lua_insert) (lua_State *L, int idx);
|
||||||
LUA_API void (lua_replace) (lua_State *L, int idx);
|
LUA_API void (lua_replace) (lua_State *L, int idx);
|
||||||
|
LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx);
|
||||||
LUA_API int (lua_checkstack) (lua_State *L, int sz);
|
LUA_API int (lua_checkstack) (lua_State *L, int sz);
|
||||||
|
|
||||||
LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
|
LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n);
|
||||||
|
|
Loading…
Reference in New Issue