|
@@ -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
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -185,32 +185,46 @@ LUA_API void lua_insert (lua_State *L, int idx) {
|
|
|
}
|
|
|
|
|
|
|
|
|
-LUA_API void lua_replace (lua_State *L, int idx) {
|
|
|
- StkId o;
|
|
|
- lua_lock(L);
|
|
|
- /* explicit test for incompatible code */
|
|
|
- if (idx == LUA_ENVIRONINDEX && L->ci->previous == NULL)
|
|
|
- luaG_runerror(L, "no calling environment");
|
|
|
- api_checknelems(L, 1);
|
|
|
- o = index2addr(L, idx);
|
|
|
- api_checkvalidindex(L, o);
|
|
|
+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(L->top - 1), "table expected");
|
|
|
- func->c.env = hvalue(L->top - 1);
|
|
|
- luaC_barrier(L, func, L->top - 1);
|
|
|
+ api_check(L, ttistable(fr), "table expected");
|
|
|
+ func->c.env = hvalue(fr);
|
|
|
+ luaC_barrier(L, func, fr);
|
|
|
}
|
|
|
else {
|
|
|
- setobj(L, o, L->top - 1);
|
|
|
+ setobj(L, to, fr);
|
|
|
if (idx < LUA_GLOBALSINDEX) /* function upvalue? */
|
|
|
- luaC_barrier(L, curr_func(L), L->top - 1);
|
|
|
+ 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_lock(L);
|
|
|
+ /* explicit test for incompatible code */
|
|
|
+ if (idx == LUA_ENVIRONINDEX && L->ci->previous == NULL)
|
|
|
+ luaG_runerror(L, "no calling environment");
|
|
|
+ api_checknelems(L, 1);
|
|
|
+ moveto(L, L->top - 1, idx);
|
|
|
L->top--;
|
|
|
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_lock(L);
|
|
|
setobj2s(L, L->top, index2addr(L, idx));
|