aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-11 15:57:46 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-05-11 15:57:46 -0300
commit7647d5d13d016f114dac4be0b9da62d502eab400 (patch)
tree7240a95fd732596e658648f6052b29e551a01265 /lapi.c
parent7184f6343a0074d02f6f0e35654cfa55427710d3 (diff)
downloadlua-7647d5d13d016f114dac4be0b9da62d502eab400.tar.gz
lua-7647d5d13d016f114dac4be0b9da62d502eab400.tar.bz2
lua-7647d5d13d016f114dac4be0b9da62d502eab400.zip
revamp of fast track for table access (table set uses the same
macros as table get + new macro for integer keys)
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/lapi.c b/lapi.c
index 2be52631..facf9541 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lapi.c,v 2.264 2017/04/20 18:22:44 roberto Exp roberto $ 2** $Id: lapi.c,v 2.265 2017/04/24 16:59:26 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*/
@@ -609,10 +609,15 @@ LUA_API int lua_getglobal (lua_State *L, const char *name) {
609 609
610 610
611LUA_API int lua_gettable (lua_State *L, int idx) { 611LUA_API int lua_gettable (lua_State *L, int idx) {
612 const TValue *slot;
612 StkId t; 613 StkId t;
613 lua_lock(L); 614 lua_lock(L);
614 t = index2addr(L, idx); 615 t = index2addr(L, idx);
615 luaV_gettable(L, t, L->top - 1, L->top - 1); 616 if (luaV_fastget(L, t, L->top - 1, slot, luaH_get)) {
617 setobj2s(L, L->top - 1, slot);
618 }
619 else
620 luaV_finishget(L, t, L->top - 1, L->top - 1, slot);
616 lua_unlock(L); 621 lua_unlock(L);
617 return ttnov(L->top - 1); 622 return ttnov(L->top - 1);
618} 623}
@@ -629,15 +634,15 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) {
629 const TValue *slot; 634 const TValue *slot;
630 lua_lock(L); 635 lua_lock(L);
631 t = index2addr(L, idx); 636 t = index2addr(L, idx);
632 if (luaV_fastget(L, t, n, slot, luaH_getint)) { 637 if (luaV_fastgeti(L, t, n, slot)) {
633 setobj2s(L, L->top, slot); 638 setobj2s(L, L->top, slot);
634 api_incr_top(L);
635 } 639 }
636 else { 640 else {
637 setivalue(L->top, n); 641 TValue aux;
638 api_incr_top(L); 642 setivalue(&aux, n);
639 luaV_finishget(L, t, L->top - 1, L->top - 1, slot); 643 luaV_finishget(L, t, &aux, L->top, slot);
640 } 644 }
645 api_incr_top(L);
641 lua_unlock(L); 646 lua_unlock(L);
642 return ttnov(L->top - 1); 647 return ttnov(L->top - 1);
643} 648}
@@ -743,8 +748,10 @@ static void auxsetstr (lua_State *L, const TValue *t, const char *k) {
743 const TValue *slot; 748 const TValue *slot;
744 TString *str = luaS_new(L, k); 749 TString *str = luaS_new(L, k);
745 api_checknelems(L, 1); 750 api_checknelems(L, 1);
746 if (luaV_fastset(L, t, str, slot, luaH_getstr, L->top - 1)) 751 if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
752 luaV_finishfastset(L, t, slot, L->top - 1);
747 L->top--; /* pop value */ 753 L->top--; /* pop value */
754 }
748 else { 755 else {
749 setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */ 756 setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */
750 api_incr_top(L); 757 api_incr_top(L);
@@ -764,10 +771,14 @@ LUA_API void lua_setglobal (lua_State *L, const char *name) {
764 771
765LUA_API void lua_settable (lua_State *L, int idx) { 772LUA_API void lua_settable (lua_State *L, int idx) {
766 StkId t; 773 StkId t;
774 const TValue *slot;
767 lua_lock(L); 775 lua_lock(L);
768 api_checknelems(L, 2); 776 api_checknelems(L, 2);
769 t = index2addr(L, idx); 777 t = index2addr(L, idx);
770 luaV_settable(L, t, L->top - 2, L->top - 1); 778 if (luaV_fastget(L, t, L->top - 2, slot, luaH_get))
779 luaV_finishfastset(L, t, slot, L->top - 1);
780 else
781 luaV_finishset(L, t, L->top - 2, L->top - 1, slot);
771 L->top -= 2; /* pop index and value */ 782 L->top -= 2; /* pop index and value */
772 lua_unlock(L); 783 lua_unlock(L);
773} 784}
@@ -785,14 +796,14 @@ LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) {
785 lua_lock(L); 796 lua_lock(L);
786 api_checknelems(L, 1); 797 api_checknelems(L, 1);
787 t = index2addr(L, idx); 798 t = index2addr(L, idx);
788 if (luaV_fastset(L, t, n, slot, luaH_getint, L->top - 1)) 799 if (luaV_fastgeti(L, t, n, slot))
789 L->top--; /* pop value */ 800 luaV_finishfastset(L, t, slot, L->top - 1);
790 else { 801 else {
791 setivalue(L->top, n); 802 TValue aux;
792 api_incr_top(L); 803 setivalue(&aux, n);
793 luaV_finishset(L, t, L->top - 1, L->top - 2, slot); 804 luaV_finishset(L, t, &aux, L->top - 1, slot);
794 L->top -= 2; /* pop value and key */
795 } 805 }
806 L->top--; /* pop value */
796 lua_unlock(L); 807 lua_unlock(L);
797} 808}
798 809