aboutsummaryrefslogtreecommitdiff
path: root/ltable.h
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-01-12 15:50:51 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-01-12 15:50:51 -0300
commitd862da6d04111ce7e5b225040fbe7e526761f478 (patch)
tree5fec8b142e05a5e5c97d61161ad7053fb86a3cdb /ltable.h
parent7827c40c49d841daca2a40463b8a60f9a113f77e (diff)
downloadlua-d862da6d04111ce7e5b225040fbe7e526761f478.tar.gz
lua-d862da6d04111ce7e5b225040fbe7e526761f478.tar.bz2
lua-d862da6d04111ce7e5b225040fbe7e526761f478.zip
Optimizations for 'lua_rawgeti' and 'lua_rawseti'
'lua_rawgeti' now uses "fast track"; 'lua_rawseti' still calls 'luaH_setint', but the latter was recoded to avoid extra overhead when writing to the array part after 'alimit'.
Diffstat (limited to 'ltable.h')
-rw-r--r--ltable.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/ltable.h b/ltable.h
index 5581efb1..8b0340b5 100644
--- a/ltable.h
+++ b/ltable.h
@@ -45,6 +45,25 @@
45#define nodefromval(v) cast(Node *, (v)) 45#define nodefromval(v) cast(Node *, (v))
46 46
47 47
48
49#define luaH_fastgeti(t,k,res,hres) \
50 { Table *h = t; lua_Unsigned u = l_castS2U(k); \
51 if ((u - 1u < h->alimit)) { \
52 int tag = *getArrTag(h,(u)-1u); \
53 if (tagisempty(tag)) hres = HNOTFOUND; \
54 else { farr2val(h, u, tag, res); hres = HOK; }} \
55 else { hres = luaH_getint(h, u, res); }}
56
57
58#define luaH_fastseti(t,k,val,hres) \
59 { Table *h = t; lua_Unsigned u = l_castS2U(k); \
60 if ((u - 1u < h->alimit)) { \
61 lu_byte *tag = getArrTag(h,(u)-1u); \
62 if (tagisempty(*tag)) hres = ~cast_int(u); \
63 else { fval2arr(h, u, tag, val); hres = HOK; }} \
64 else { hres = luaH_psetint(h, u, val); }}
65
66
48/* results from get/pset */ 67/* results from get/pset */
49#define HOK 0 68#define HOK 0
50#define HNOTFOUND 1 69#define HNOTFOUND 1