aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-23 10:16:18 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-23 10:16:18 -0300
commit9243c414d92c253edd908f438caa31e2aa16f3f4 (patch)
treee8959a48f4672037aef061cc6eb82bba21d0766b /lapi.c
parent477ca2fe8ceaf79038972977915987adbef0e425 (diff)
downloadlua-9243c414d92c253edd908f438caa31e2aa16f3f4.tar.gz
lua-9243c414d92c253edd908f438caa31e2aa16f3f4.tar.bz2
lua-9243c414d92c253edd908f438caa31e2aa16f3f4.zip
first version of empty entries in tables
(so that, in the future, tables can contain regular nil entries)
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/lapi.c b/lapi.c
index 78ae7e0b..0debc1d3 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.283 2018/02/05 17:10:52 roberto Exp roberto $ 2** $Id: lapi.c,v 2.285 2018/02/20 16:52:50 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*/
@@ -657,14 +657,26 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {
657} 657}
658 658
659 659
660static int finishrawget (lua_State *L, const TValue *val) {
661 if (isempty(val)) /* avoid copying empty items to the stack */
662 setnilvalue(s2v(L->top));
663 else
664 setobj2s(L, L->top, val);
665 api_incr_top(L);
666 lua_unlock(L);
667 return ttnov(s2v(L->top - 1));
668}
669
670
660LUA_API int lua_rawget (lua_State *L, int idx) { 671LUA_API int lua_rawget (lua_State *L, int idx) {
661 TValue *t; 672 TValue *t;
673 const TValue *val;
662 lua_lock(L); 674 lua_lock(L);
663 t = index2value(L, idx); 675 t = index2value(L, idx);
664 api_check(L, ttistable(t), "table expected"); 676 api_check(L, ttistable(t), "table expected");
665 setobj2s(L, L->top - 1, luaH_get(hvalue(t), s2v(L->top - 1))); 677 val = luaH_get(hvalue(t), s2v(L->top - 1));
666 lua_unlock(L); 678 L->top--; /* remove key */
667 return ttnov(s2v(L->top - 1)); 679 return finishrawget(L, val);
668} 680}
669 681
670 682
@@ -673,10 +685,7 @@ LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) {
673 lua_lock(L); 685 lua_lock(L);
674 t = index2value(L, idx); 686 t = index2value(L, idx);
675 api_check(L, ttistable(t), "table expected"); 687 api_check(L, ttistable(t), "table expected");
676 setobj2s(L, L->top, luaH_getint(hvalue(t), n)); 688 return finishrawget(L, luaH_getint(hvalue(t), n));
677 api_incr_top(L);
678 lua_unlock(L);
679 return ttnov(s2v(L->top - 1));
680} 689}
681 690
682 691
@@ -687,10 +696,7 @@ LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) {
687 t = index2value(L, idx); 696 t = index2value(L, idx);
688 api_check(L, ttistable(t), "table expected"); 697 api_check(L, ttistable(t), "table expected");
689 setpvalue(&k, cast_voidp(p)); 698 setpvalue(&k, cast_voidp(p));
690 setobj2s(L, L->top, luaH_get(hvalue(t), &k)); 699 return finishrawget(L, luaH_get(hvalue(t), &k));
691 api_incr_top(L);
692 lua_unlock(L);
693 return ttnov(s2v(L->top - 1));
694} 700}
695 701
696 702