commit 97e299c3958dfd865cda7cce06cf1ea825bbaffb
parent c697aa30bccc80af3b005cfdbe62686edd730a14
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Tue, 22 Jul 2014 15:07:22 -0300
'lua_replace' implemented as a macro using 'lua_copy'
Diffstat:
M | lapi.c | | | 31 | ++++++++++--------------------- |
M | lua.h | | | 5 | +++-- |
2 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -1,5 +1,5 @@
/*
-** $Id: lapi.c,v 2.229 2014/07/19 15:09:37 roberto Exp roberto $
+** $Id: lapi.c,v 2.230 2014/07/21 16:02:57 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -44,6 +44,9 @@ const char lua_ident[] =
/* test for pseudo index */
#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX)
+/* test for upvalue */
+#define isupvalue(i) ((i) < LUA_REGISTRYINDEX)
+
/* test for valid but not pseudo index */
#define isstackindex(i, o) (isvalid(o) && !ispseudo(i))
@@ -214,31 +217,17 @@ LUA_API void lua_rotate (lua_State *L, int idx, int n) {
}
-static void moveto (lua_State *L, TValue *fr, int idx) {
- TValue *to = index2addr(L, idx);
+LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) {
+ TValue *fr, *to;
+ lua_lock(L);
+ fr = index2addr(L, fromidx);
+ to = index2addr(L, toidx);
api_checkvalidindex(to);
setobj(L, to, fr);
- if (idx < LUA_REGISTRYINDEX) /* function upvalue? */
+ if (isupvalue(toidx)) /* function upvalue? */
luaC_barrier(L, clCvalue(L->ci->func), fr);
/* LUA_REGISTRYINDEX does not need gc barrier
(collector revisits it before finishing collection) */
-}
-
-
-LUA_API void lua_replace (lua_State *L, int idx) {
- lua_lock(L);
- 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);
- moveto(L, fr, toidx);
lua_unlock(L);
}
diff --git a/lua.h b/lua.h
@@ -1,5 +1,5 @@
/*
-** $Id: lua.h,v 1.308 2014/06/26 17:25:11 roberto Exp roberto $
+** $Id: lua.h,v 1.309 2014/07/17 13:53:37 roberto Exp roberto $
** Lua - A Scripting Language
** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
** See Copyright Notice at the end of this file
@@ -158,7 +158,6 @@ LUA_API int (lua_gettop) (lua_State *L);
LUA_API void (lua_settop) (lua_State *L, int idx);
LUA_API void (lua_pushvalue) (lua_State *L, int idx);
LUA_API void (lua_rotate) (lua_State *L, int idx, int n);
-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);
@@ -366,6 +365,8 @@ LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1))
+#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1))
+
/* }============================================================== */