aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/lapi.c b/lapi.c
index fc17b918..680630dd 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.229 2014/07/19 15:09:37 roberto Exp roberto $ 2** $Id: lapi.c,v 2.230 2014/07/21 16:02:57 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -44,6 +44,9 @@ const char lua_ident[] =
44/* test for pseudo index */ 44/* test for pseudo index */
45#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) 45#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX)
46 46
47/* test for upvalue */
48#define isupvalue(i) ((i) < LUA_REGISTRYINDEX)
49
47/* test for valid but not pseudo index */ 50/* test for valid but not pseudo index */
48#define isstackindex(i, o) (isvalid(o) && !ispseudo(i)) 51#define isstackindex(i, o) (isvalid(o) && !ispseudo(i))
49 52
@@ -214,31 +217,17 @@ LUA_API void lua_rotate (lua_State *L, int idx, int n) {
214} 217}
215 218
216 219
217static void moveto (lua_State *L, TValue *fr, int idx) { 220LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
218 TValue *to = index2addr(L, idx); 221 TValue *fr, *to;
222 lua_lock(L);
223 fr = index2addr(L, fromidx);
224 to = index2addr(L, toidx);
219 api_checkvalidindex(to); 225 api_checkvalidindex(to);
220 setobj(L, to, fr); 226 setobj(L, to, fr);
221 if (idx < LUA_REGISTRYINDEX) /* function upvalue? */ 227 if (isupvalue(toidx)) /* function upvalue? */
222 luaC_barrier(L, clCvalue(L->ci->func), fr); 228 luaC_barrier(L, clCvalue(L->ci->func), fr);
223 /* LUA_REGISTRYINDEX does not need gc barrier 229 /* LUA_REGISTRYINDEX does not need gc barrier
224 (collector revisits it before finishing collection) */ 230 (collector revisits it before finishing collection) */
225}
226
227
228LUA_API void lua_replace (lua_State *L, int idx) {
229 lua_lock(L);
230 api_checknelems(L, 1);
231 moveto(L, L->top - 1, idx);
232 L->top--;
233 lua_unlock(L);
234}
235
236
237LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
238 TValue *fr;
239 lua_lock(L);
240 fr = index2addr(L, fromidx);
241 moveto(L, fr, toidx);
242 lua_unlock(L); 231 lua_unlock(L);
243} 232}
244 233