diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-05-16 14:55:49 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-05-16 14:55:49 -0300 |
| commit | f8d30826dda6ee8e99200de57a1997734b853db2 (patch) | |
| tree | d3a24665802f41fe3216714252ed189006f302cd /lapi.c | |
| parent | 351ccd733298e08c41937c1baf22a68e62bfeca9 (diff) | |
| download | lua-f8d30826dda6ee8e99200de57a1997734b853db2.tar.gz lua-f8d30826dda6ee8e99200de57a1997734b853db2.tar.bz2 lua-f8d30826dda6ee8e99200de57a1997734b853db2.zip | |
New table API for 'set' functions
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 31 |
1 files changed, 17 insertions, 14 deletions
| @@ -823,17 +823,18 @@ LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { | |||
| 823 | ** t[k] = value at the top of the stack (where 'k' is a string) | 823 | ** t[k] = value at the top of the stack (where 'k' is a string) |
| 824 | */ | 824 | */ |
| 825 | static void auxsetstr (lua_State *L, const TValue *t, const char *k) { | 825 | static void auxsetstr (lua_State *L, const TValue *t, const char *k) { |
| 826 | const TValue *slot; | 826 | int aux; |
| 827 | TString *str = luaS_new(L, k); | 827 | TString *str = luaS_new(L, k); |
| 828 | api_checknelems(L, 1); | 828 | api_checknelems(L, 1); |
| 829 | if (luaV_fastget(L, t, str, slot, luaH_getstr)) { | 829 | luaV_fastset1(t, str, s2v(L->top.p - 1), aux, luaH_setstr1); |
| 830 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 830 | if (aux == HOK) { |
| 831 | luaV_finishfastset1(L, t, s2v(L->top.p - 1)); | ||
| 831 | L->top.p--; /* pop value */ | 832 | L->top.p--; /* pop value */ |
| 832 | } | 833 | } |
| 833 | else { | 834 | else { |
| 834 | setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ | 835 | setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ |
| 835 | api_incr_top(L); | 836 | api_incr_top(L); |
| 836 | luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), slot); | 837 | luaV_finishset1(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), aux); |
| 837 | L->top.p -= 2; /* pop value and key */ | 838 | L->top.p -= 2; /* pop value and key */ |
| 838 | } | 839 | } |
| 839 | lua_unlock(L); /* lock done by caller */ | 840 | lua_unlock(L); /* lock done by caller */ |
| @@ -850,15 +851,16 @@ LUA_API void lua_setglobal (lua_State *L, const char *name) { | |||
| 850 | 851 | ||
| 851 | LUA_API void lua_settable (lua_State *L, int idx) { | 852 | LUA_API void lua_settable (lua_State *L, int idx) { |
| 852 | TValue *t; | 853 | TValue *t; |
| 853 | const TValue *slot; | 854 | int aux; |
| 854 | lua_lock(L); | 855 | lua_lock(L); |
| 855 | api_checknelems(L, 2); | 856 | api_checknelems(L, 2); |
| 856 | t = index2value(L, idx); | 857 | t = index2value(L, idx); |
| 857 | if (luaV_fastget(L, t, s2v(L->top.p - 2), slot, luaH_get)) { | 858 | luaV_fastset1(t, s2v(L->top.p - 2), s2v(L->top.p - 1), aux, luaH_set1); |
| 858 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 859 | if (aux == HOK) { |
| 860 | luaV_finishfastset1(L, t, s2v(L->top.p - 1)); | ||
| 859 | } | 861 | } |
| 860 | else | 862 | else |
| 861 | luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), slot); | 863 | luaV_finishset1(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), aux); |
| 862 | L->top.p -= 2; /* pop index and value */ | 864 | L->top.p -= 2; /* pop index and value */ |
| 863 | lua_unlock(L); | 865 | lua_unlock(L); |
| 864 | } | 866 | } |
| @@ -872,17 +874,18 @@ LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { | |||
| 872 | 874 | ||
| 873 | LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { | 875 | LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { |
| 874 | TValue *t; | 876 | TValue *t; |
| 875 | const TValue *slot; | 877 | int aux; |
| 876 | lua_lock(L); | 878 | lua_lock(L); |
| 877 | api_checknelems(L, 1); | 879 | api_checknelems(L, 1); |
| 878 | t = index2value(L, idx); | 880 | t = index2value(L, idx); |
| 879 | if (luaV_fastgeti(L, t, n, slot)) { | 881 | luaV_fastseti1(t, n, s2v(L->top.p - 1), aux); |
| 880 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 882 | if (aux == HOK) { |
| 883 | luaV_finishfastset1(L, t, s2v(L->top.p - 1)); | ||
| 881 | } | 884 | } |
| 882 | else { | 885 | else { |
| 883 | TValue aux; | 886 | TValue temp; |
| 884 | setivalue(&aux, n); | 887 | setivalue(&temp, n); |
| 885 | luaV_finishset(L, t, &aux, s2v(L->top.p - 1), slot); | 888 | luaV_finishset1(L, t, &temp, s2v(L->top.p - 1), aux); |
| 886 | } | 889 | } |
| 887 | L->top.p--; /* pop value */ | 890 | L->top.p--; /* pop value */ |
| 888 | lua_unlock(L); | 891 | lua_unlock(L); |
