aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lapi.c92
-rw-r--r--lbaselib.c22
-rw-r--r--lobject.h17
-rw-r--r--ltablib.c6
-rw-r--r--lua.h4
5 files changed, 98 insertions, 43 deletions
diff --git a/lapi.c b/lapi.c
index 0debc1d3..b6c52721 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.285 2018/02/20 16:52:50 roberto Exp roberto $ 2** $Id: lapi.c,v 2.286 2018/02/23 13:13:31 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*/
@@ -668,35 +668,65 @@ static int finishrawget (lua_State *L, const TValue *val) {
668} 668}
669 669
670 670
671static Table *gettable (lua_State *L, int idx) {
672 TValue *t = index2value(L, idx);
673 api_check(L, ttistable(t), "table expected");
674 return hvalue(t);
675}
676
677
671LUA_API int lua_rawget (lua_State *L, int idx) { 678LUA_API int lua_rawget (lua_State *L, int idx) {
672 TValue *t; 679 Table *t;
673 const TValue *val; 680 const TValue *val;
674 lua_lock(L); 681 lua_lock(L);
675 t = index2value(L, idx); 682 t = gettable(L, idx);
676 api_check(L, ttistable(t), "table expected"); 683 val = luaH_get(t, s2v(L->top - 1));
677 val = luaH_get(hvalue(t), s2v(L->top - 1));
678 L->top--; /* remove key */ 684 L->top--; /* remove key */
679 return finishrawget(L, val); 685 return finishrawget(L, val);
680} 686}
681 687
682 688
683LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { 689LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {
684 TValue *t; 690 Table *t;
685 lua_lock(L); 691 lua_lock(L);
686 t = index2value(L, idx); 692 t = gettable(L, idx);
687 api_check(L, ttistable(t), "table expected"); 693 return finishrawget(L, luaH_getint(t, n));
688 return finishrawget(L, luaH_getint(hvalue(t), n));
689} 694}
690 695
691 696
692LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { 697LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {
693 TValue *t; 698 Table *t;
694 TValue k; 699 TValue k;
695 lua_lock(L); 700 lua_lock(L);
696 t = index2value(L, idx); 701 t = gettable(L, idx);
697 api_check(L, ttistable(t), "table expected");
698 setpvalue(&k, cast_voidp(p)); 702 setpvalue(&k, cast_voidp(p));
699 return finishrawget(L, luaH_get(hvalue(t), &k)); 703 return finishrawget(L, luaH_get(t, &k));
704}
705
706
707static int auxkeyman (lua_State *L, int idx, int remove) {
708 Table *t;
709 const TValue *val;
710 int res;
711 lua_lock(L);
712 t = gettable(L, idx);
713 val = luaH_get(t, s2v(L->top - 1));
714 L->top--; /* remove key */
715 res = !isempty(val);
716 if (remove && res) /* key is present and should be removed? */
717 setempty(cast(TValue*, val));
718 lua_unlock(L);
719 return res;
720}
721
722
723LUA_API void lua_removekey (lua_State *L, int idx) {
724 auxkeyman(L, idx, 1);
725}
726
727
728LUA_API int lua_keyin (lua_State *L, int idx) {
729 return auxkeyman(L, idx, 0);
700} 730}
701 731
702 732
@@ -834,45 +864,42 @@ LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
834 864
835 865
836LUA_API void lua_rawset (lua_State *L, int idx) { 866LUA_API void lua_rawset (lua_State *L, int idx) {
837 TValue *o; 867 Table *t;
838 TValue *slot; 868 TValue *slot;
839 lua_lock(L); 869 lua_lock(L);
840 api_checknelems(L, 2); 870 api_checknelems(L, 2);
841 o = index2value(L, idx); 871 t = gettable(L, idx);
842 api_check(L, ttistable(o), "table expected"); 872 slot = luaH_set(L, t, s2v(L->top - 2));
843 slot = luaH_set(L, hvalue(o), s2v(L->top - 2));
844 setobj2t(L, slot, s2v(L->top - 1)); 873 setobj2t(L, slot, s2v(L->top - 1));
845 invalidateTMcache(hvalue(o)); 874 invalidateTMcache(t);
846 luaC_barrierback(L, gcvalue(o), s2v(L->top - 1)); 875 luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
847 L->top -= 2; 876 L->top -= 2;
848 lua_unlock(L); 877 lua_unlock(L);
849} 878}
850 879
851 880
852LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { 881LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) {
853 TValue *o; 882 Table *t;
854 lua_lock(L); 883 lua_lock(L);
855 api_checknelems(L, 1); 884 api_checknelems(L, 1);
856 o = index2value(L, idx); 885 t = gettable(L, idx);
857 api_check(L, ttistable(o), "table expected"); 886 luaH_setint(L, t, n, s2v(L->top - 1));
858 luaH_setint(L, hvalue(o), n, s2v(L->top - 1)); 887 luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
859 luaC_barrierback(L, gcvalue(o), s2v(L->top - 1));
860 L->top--; 888 L->top--;
861 lua_unlock(L); 889 lua_unlock(L);
862} 890}
863 891
864 892
865LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { 893LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
866 TValue *o; 894 Table *t;
867 TValue k, *slot; 895 TValue k, *slot;
868 lua_lock(L); 896 lua_lock(L);
869 api_checknelems(L, 1); 897 api_checknelems(L, 1);
870 o = index2value(L, idx); 898 t = gettable(L, idx);
871 api_check(L, ttistable(o), "table expected");
872 setpvalue(&k, cast_voidp(p)); 899 setpvalue(&k, cast_voidp(p));
873 slot = luaH_set(L, hvalue(o), &k); 900 slot = luaH_set(L, t, &k);
874 setobj2t(L, slot, s2v(L->top - 1)); 901 setobj2t(L, slot, s2v(L->top - 1));
875 luaC_barrierback(L, gcvalue(o), s2v(L->top - 1)); 902 luaC_barrierback(L, obj2gco(t), s2v(L->top - 1));
876 L->top--; 903 L->top--;
877 lua_unlock(L); 904 lua_unlock(L);
878} 905}
@@ -1193,12 +1220,11 @@ LUA_API int lua_error (lua_State *L) {
1193 1220
1194 1221
1195LUA_API int lua_next (lua_State *L, int idx) { 1222LUA_API int lua_next (lua_State *L, int idx) {
1196 TValue *t; 1223 Table *t;
1197 int more; 1224 int more;
1198 lua_lock(L); 1225 lua_lock(L);
1199 t = index2value(L, idx); 1226 t = gettable(L, idx);
1200 api_check(L, ttistable(t), "table expected"); 1227 more = luaH_next(L, t, L->top - 1);
1201 more = luaH_next(L, hvalue(t), L->top - 1);
1202 if (more) { 1228 if (more) {
1203 api_incr_top(L); 1229 api_incr_top(L);
1204 } 1230 }
diff --git a/lbaselib.c b/lbaselib.c
index c95a6e53..443bf066 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.318 2017/11/16 13:19:06 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.319 2018/02/05 17:10:52 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*/
@@ -170,6 +170,24 @@ static int luaB_rawset (lua_State *L) {
170} 170}
171 171
172 172
173static int luaB_keyin (lua_State *L) {
174 luaL_checktype(L, 1, LUA_TTABLE);
175 luaL_checkany(L, 2);
176 lua_settop(L, 2);
177 lua_pushboolean(L, lua_keyin(L, 1));
178 return 1;
179}
180
181
182static int luaB_removekey (lua_State *L) {
183 luaL_checktype(L, 1, LUA_TTABLE);
184 luaL_checkany(L, 2);
185 lua_settop(L, 2);
186 lua_removekey(L, 1);
187 return 0;
188}
189
190
173static int pushmode (lua_State *L, int oldmode) { 191static int pushmode (lua_State *L, int oldmode) {
174 lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" : "generational"); 192 lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" : "generational");
175 return 1; 193 return 1;
@@ -501,6 +519,8 @@ static const luaL_Reg base_funcs[] = {
501 {"rawlen", luaB_rawlen}, 519 {"rawlen", luaB_rawlen},
502 {"rawget", luaB_rawget}, 520 {"rawget", luaB_rawget},
503 {"rawset", luaB_rawset}, 521 {"rawset", luaB_rawset},
522 {"keyin", luaB_keyin},
523 {"removekey", luaB_removekey},
504 {"select", luaB_select}, 524 {"select", luaB_select},
505 {"setmetatable", luaB_setmetatable}, 525 {"setmetatable", luaB_setmetatable},
506 {"tonumber", luaB_tonumber}, 526 {"tonumber", luaB_tonumber},
diff --git a/lobject.h b/lobject.h
index c6590cf0..da110128 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 2.136 2018/02/22 17:28:10 roberto Exp roberto $ 2** $Id: lobject.h,v 2.137 2018/02/23 13:13:31 roberto Exp roberto $
3** Type definitions for Lua objects 3** Type definitions for Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -156,13 +156,20 @@ typedef StackValue *StkId; /* index to stack elements */
156#define LUA_TEMPTY (LUA_TNIL | (1 << 4)) 156#define LUA_TEMPTY (LUA_TNIL | (1 << 4))
157 157
158#define ttisnilorempty(v) checktype((v), LUA_TNIL) 158#define ttisnilorempty(v) checktype((v), LUA_TNIL)
159/*
160** By default, entries with any kind of nil are considered empty
161*/
162#define isempty(v) ttisnilorempty(v)
163 159
164#define isreallyempty(v) checktag((v), LUA_TEMPTY) 160#define isreallyempty(v) checktag((v), LUA_TEMPTY)
165 161
162
163#if defined(LUA_NILINTABLE)
164
165#define isempty(v) isreallyempty(v)
166
167#else /* By default, entries with any kind of nil are considered empty */
168
169#define isempty(v) ttisnilorempty(v)
170
171#endif
172
166/* macro defining an empty value */ 173/* macro defining an empty value */
167#define EMPTYCONSTANT {NULL}, LUA_TEMPTY 174#define EMPTYCONSTANT {NULL}, LUA_TEMPTY
168 175
diff --git a/ltablib.c b/ltablib.c
index 588bf40d..982821ed 100644
--- a/ltablib.c
+++ b/ltablib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltablib.c,v 1.92 2016/02/08 12:55:19 roberto Exp roberto $ 2** $Id: ltablib.c,v 1.93 2016/02/25 19:41:54 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*/
@@ -113,8 +113,8 @@ static int tremove (lua_State *L) {
113 lua_geti(L, 1, pos + 1); 113 lua_geti(L, 1, pos + 1);
114 lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */ 114 lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */
115 } 115 }
116 lua_pushnil(L); 116 lua_pushinteger(L, pos);
117 lua_seti(L, 1, pos); /* t[pos] = nil */ 117 lua_removekey(L, 1); /* remove entry t[pos] */
118 return 1; 118 return 1;
119} 119}
120 120
diff --git a/lua.h b/lua.h
index 8fb2ccbe..3c481a70 100644
--- a/lua.h
+++ b/lua.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.h,v 1.340 2018/02/17 19:29:29 roberto Exp roberto $ 2** $Id: lua.h,v 1.341 2018/02/20 16:52:50 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
@@ -331,6 +331,8 @@ LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s);
331LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); 331LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
332LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); 332LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud);
333 333
334LUA_API void (lua_removekey) (lua_State *L, int idx);
335LUA_API int (lua_keyin) (lua_State *L, int idx);
334 336
335 337
336/* 338/*