diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-08-21 17:07:56 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-08-21 17:07:56 -0300 |
| commit | 7f1a2ad69976cc6891c104d2b669771820b8959a (patch) | |
| tree | e9c21db809a04e80a8db95eea379981f32d74131 | |
| parent | a1ab5ab396df521eff70f304e571c16b809037d1 (diff) | |
| download | lua-7f1a2ad69976cc6891c104d2b669771820b8959a.tar.gz lua-7f1a2ad69976cc6891c104d2b669771820b8959a.tar.bz2 lua-7f1a2ad69976cc6891c104d2b669771820b8959a.zip | |
new functions 'lua_geti/lua_seti' (non raw)
| -rw-r--r-- | lapi.c | 26 | ||||
| -rw-r--r-- | lbaselib.c | 5 | ||||
| -rw-r--r-- | ltablib.c | 29 | ||||
| -rw-r--r-- | lua.h | 4 |
4 files changed, 35 insertions, 29 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.232 2014/07/30 14:00:14 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.233 2014/08/01 17:33:08 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 | */ |
| @@ -611,6 +611,18 @@ LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { | |||
| 611 | } | 611 | } |
| 612 | 612 | ||
| 613 | 613 | ||
| 614 | LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | ||
| 615 | StkId t; | ||
| 616 | lua_lock(L); | ||
| 617 | t = index2addr(L, idx); | ||
| 618 | setivalue(L->top, n); | ||
| 619 | api_incr_top(L); | ||
| 620 | luaV_gettable(L, t, L->top - 1, L->top - 1); | ||
| 621 | lua_unlock(L); | ||
| 622 | return ttnov(L->top - 1); | ||
| 623 | } | ||
| 624 | |||
| 625 | |||
| 614 | LUA_API int lua_rawget (lua_State *L, int idx) { | 626 | LUA_API int lua_rawget (lua_State *L, int idx) { |
| 615 | StkId t; | 627 | StkId t; |
| 616 | lua_lock(L); | 628 | lua_lock(L); |
| @@ -743,6 +755,18 @@ LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { | |||
| 743 | } | 755 | } |
| 744 | 756 | ||
| 745 | 757 | ||
| 758 | LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { | ||
| 759 | StkId t; | ||
| 760 | lua_lock(L); | ||
| 761 | api_checknelems(L, 1); | ||
| 762 | t = index2addr(L, idx); | ||
| 763 | setivalue(L->top++, n); | ||
| 764 | luaV_settable(L, t, L->top - 1, L->top - 2); | ||
| 765 | L->top -= 2; /* pop value and key */ | ||
| 766 | lua_unlock(L); | ||
| 767 | } | ||
| 768 | |||
| 769 | |||
| 746 | LUA_API void lua_rawset (lua_State *L, int idx) { | 770 | LUA_API void lua_rawset (lua_State *L, int idx) { |
| 747 | StkId o; | 771 | StkId o; |
| 748 | Table *t; | 772 | Table *t; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbaselib.c,v 1.294 2014/08/01 17:22:57 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.295 2014/08/01 17:33:08 roberto Exp roberto $ |
| 3 | ** Basic library | 3 | ** Basic library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -266,8 +266,7 @@ static int ipairsaux (lua_State *L) { | |||
| 266 | } | 266 | } |
| 267 | else { | 267 | else { |
| 268 | lua_pushinteger(L, i); | 268 | lua_pushinteger(L, i); |
| 269 | lua_pushinteger(L, i); /* key for indexing table */ | 269 | lua_geti(L, 1, i); |
| 270 | lua_gettable(L, 1); | ||
| 271 | return 2; | 270 | return 2; |
| 272 | } | 271 | } |
| 273 | } | 272 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltablib.c,v 1.73 2014/07/29 16:01:00 roberto Exp roberto $ | 2 | ** $Id: ltablib.c,v 1.74 2014/08/21 19:13:55 roberto Exp roberto $ |
| 3 | ** Library for Table Manipulation | 3 | ** Library for Table Manipulation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -28,25 +28,6 @@ typedef struct { | |||
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | /* | 30 | /* |
| 31 | ** equivalent to 'lua_rawgeti', but not raw | ||
| 32 | */ | ||
| 33 | static int geti (lua_State *L, int idx, lua_Integer n) { | ||
| 34 | lua_pushinteger(L, n); | ||
| 35 | return lua_gettable(L, idx); /* assume 'idx' is not negative */ | ||
| 36 | } | ||
| 37 | |||
| 38 | |||
| 39 | /* | ||
| 40 | ** equivalent to 'lua_rawseti', but not raw | ||
| 41 | */ | ||
| 42 | static void seti (lua_State *L, int idx, lua_Integer n) { | ||
| 43 | lua_pushinteger(L, n); | ||
| 44 | lua_rotate(L, -2, 1); /* exchange key and value */ | ||
| 45 | lua_settable(L, idx); /* assume 'idx' is not negative */ | ||
| 46 | } | ||
| 47 | |||
| 48 | |||
| 49 | /* | ||
| 50 | ** Check that 'arg' has a table and set access functions in 'ta' to raw | 31 | ** Check that 'arg' has a table and set access functions in 'ta' to raw |
| 51 | ** or non-raw according to the presence of corresponding metamethods. | 32 | ** or non-raw according to the presence of corresponding metamethods. |
| 52 | */ | 33 | */ |
| @@ -55,10 +36,10 @@ static void checktab (lua_State *L, int arg, TabA *ta) { | |||
| 55 | if (lua_getmetatable(L, arg)) { | 36 | if (lua_getmetatable(L, arg)) { |
| 56 | lua_pushliteral(L, "__index"); /* 'index' metamethod */ | 37 | lua_pushliteral(L, "__index"); /* 'index' metamethod */ |
| 57 | if (lua_rawget(L, -2) != LUA_TNIL) | 38 | if (lua_rawget(L, -2) != LUA_TNIL) |
| 58 | ta->geti = geti; | 39 | ta->geti = lua_geti; |
| 59 | lua_pushliteral(L, "__newindex"); /* 'newindex' metamethod */ | 40 | lua_pushliteral(L, "__newindex"); /* 'newindex' metamethod */ |
| 60 | if (lua_rawget(L, -3) != LUA_TNIL) | 41 | if (lua_rawget(L, -3) != LUA_TNIL) |
| 61 | ta->seti = seti; | 42 | ta->seti = lua_seti; |
| 62 | lua_pop(L, 3); /* pop metatable plus both metamethods */ | 43 | lua_pop(L, 3); /* pop metatable plus both metamethods */ |
| 63 | } | 44 | } |
| 64 | if (ta->geti == NULL || ta->seti == NULL) { | 45 | if (ta->geti == NULL || ta->seti == NULL) { |
| @@ -147,10 +128,10 @@ static int tmove (lua_State *L) { | |||
| 147 | lua_Integer n, i; | 128 | lua_Integer n, i; |
| 148 | ta.geti = (!luaL_getmetafield(L, 1, "__index")) | 129 | ta.geti = (!luaL_getmetafield(L, 1, "__index")) |
| 149 | ? (luaL_checktype(L, 1, LUA_TTABLE), lua_rawgeti) | 130 | ? (luaL_checktype(L, 1, LUA_TTABLE), lua_rawgeti) |
| 150 | : geti; | 131 | : lua_geti; |
| 151 | ta.seti = (!luaL_getmetafield(L, tt, "__newindex")) | 132 | ta.seti = (!luaL_getmetafield(L, tt, "__newindex")) |
| 152 | ? (luaL_checktype(L, tt, LUA_TTABLE), lua_rawseti) | 133 | ? (luaL_checktype(L, tt, LUA_TTABLE), lua_rawseti) |
| 153 | : seti; | 134 | : lua_seti; |
| 154 | n = e - f + 1; /* number of elements to move */ | 135 | n = e - f + 1; /* number of elements to move */ |
| 155 | if (t > f) { | 136 | if (t > f) { |
| 156 | for (i = n - 1; i >= 0; i--) { | 137 | for (i = n - 1; i >= 0; i--) { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.312 2014/07/31 13:44:30 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.313 2014/08/01 17:33:08 roberto Exp roberto $ |
| 3 | ** Lua - A Scripting Language | 3 | ** Lua - A Scripting Language |
| 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) | 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) |
| 5 | ** See Copyright Notice at the end of this file | 5 | ** See Copyright Notice at the end of this file |
| @@ -239,6 +239,7 @@ LUA_API int (lua_pushthread) (lua_State *L); | |||
| 239 | LUA_API int (lua_getglobal) (lua_State *L, const char *var); | 239 | LUA_API int (lua_getglobal) (lua_State *L, const char *var); |
| 240 | LUA_API int (lua_gettable) (lua_State *L, int idx); | 240 | LUA_API int (lua_gettable) (lua_State *L, int idx); |
| 241 | LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); | 241 | LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); |
| 242 | LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); | ||
| 242 | LUA_API int (lua_rawget) (lua_State *L, int idx); | 243 | LUA_API int (lua_rawget) (lua_State *L, int idx); |
| 243 | LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); | 244 | LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); |
| 244 | LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); | 245 | LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); |
| @@ -255,6 +256,7 @@ LUA_API int (lua_getuservalue) (lua_State *L, int idx); | |||
| 255 | LUA_API void (lua_setglobal) (lua_State *L, const char *var); | 256 | LUA_API void (lua_setglobal) (lua_State *L, const char *var); |
| 256 | LUA_API void (lua_settable) (lua_State *L, int idx); | 257 | LUA_API void (lua_settable) (lua_State *L, int idx); |
| 257 | LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); | 258 | LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); |
| 259 | LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n); | ||
| 258 | LUA_API void (lua_rawset) (lua_State *L, int idx); | 260 | LUA_API void (lua_rawset) (lua_State *L, int idx); |
| 259 | LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); | 261 | LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); |
| 260 | LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); | 262 | LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); |
