aboutsummaryrefslogtreecommitdiff
path: root/ltable.h
diff options
context:
space:
mode:
Diffstat (limited to 'ltable.h')
-rw-r--r--ltable.h36
1 files changed, 21 insertions, 15 deletions
diff --git a/ltable.h b/ltable.h
index 6db197ba..2e7f86fd 100644
--- a/ltable.h
+++ b/ltable.h
@@ -47,20 +47,20 @@
47 47
48 48
49#define luaH_fastgeti(t,k,res,tag) \ 49#define luaH_fastgeti(t,k,res,tag) \
50 { Table *h = t; lua_Unsigned u = l_castS2U(k); \ 50 { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \
51 if ((u - 1u < h->alimit)) { \ 51 if ((u < h->alimit)) { \
52 tag = *getArrTag(h,(u)-1u); \ 52 tag = *getArrTag(h, u); \
53 if (!tagisempty(tag)) { farr2val(h, u, tag, res); }} \ 53 if (!tagisempty(tag)) { farr2val(h, u, tag, res); }} \
54 else { tag = luaH_getint(h, u, res); }} 54 else { tag = luaH_getint(h, (k), res); }}
55 55
56 56
57#define luaH_fastseti(t,k,val,hres) \ 57#define luaH_fastseti(t,k,val,hres) \
58 { Table *h = t; lua_Unsigned u = l_castS2U(k); \ 58 { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \
59 if ((u - 1u < h->alimit)) { \ 59 if ((u < h->alimit)) { \
60 lu_byte *tag = getArrTag(h,(u)-1u); \ 60 lu_byte *tag = getArrTag(h, u); \
61 if (tagisempty(*tag)) hres = ~cast_int(u); \ 61 if (tagisempty(*tag)) hres = ~cast_int(u); \
62 else { fval2arr(h, u, tag, val); hres = HOK; }} \ 62 else { fval2arr(h, u, tag, val); hres = HOK; }} \
63 else { hres = luaH_psetint(h, u, val); }} 63 else { hres = luaH_psetint(h, k, val); }}
64 64
65 65
66/* results from pset */ 66/* results from pset */
@@ -82,6 +82,12 @@
82** in the array part, the encoding is (~array index), a negative value. 82** in the array part, the encoding is (~array index), a negative value.
83** The value HNOTATABLE is used by the fast macros to signal that the 83** The value HNOTATABLE is used by the fast macros to signal that the
84** value being indexed is not a table. 84** value being indexed is not a table.
85** (The size for the array part is limited by the maximum power of two
86** that fits in an unsigned integer; that is INT_MAX+1. So, the C-index
87** ranges from 0, which encodes to -1, to INT_MAX, which encodes to
88** INT_MIN. The size of the hash part is limited by the maximum power of
89** two that fits in a signed integer; that is (INT_MAX+1)/2. So, it is
90** safe to add HFIRSTNODE to any index there.)
85*/ 91*/
86 92
87 93
@@ -102,21 +108,21 @@
102** and 'getArrVal'. 108** and 'getArrVal'.
103*/ 109*/
104 110
105/* Computes the address of the tag for the abstract index 'k' */ 111/* Computes the address of the tag for the abstract C-index 'k' */
106#define getArrTag(t,k) (cast(lu_byte*, (t)->array) + (k)) 112#define getArrTag(t,k) (cast(lu_byte*, (t)->array) + (k))
107 113
108/* Computes the address of the value for the abstract index 'k' */ 114/* Computes the address of the value for the abstract C-index 'k' */
109#define getArrVal(t,k) ((t)->array - 1 - (k)) 115#define getArrVal(t,k) ((t)->array - 1 - (k))
110 116
111 117
112/* 118/*
113** Move TValues to/from arrays, using Lua indices 119** Move TValues to/from arrays, using C indices
114*/ 120*/
115#define arr2obj(h,k,val) \ 121#define arr2obj(h,k,val) \
116 ((val)->tt_ = *getArrTag(h,(k)-1u), (val)->value_ = *getArrVal(h,(k)-1u)) 122 ((val)->tt_ = *getArrTag(h,(k)), (val)->value_ = *getArrVal(h,(k)))
117 123
118#define obj2arr(h,k,val) \ 124#define obj2arr(h,k,val) \
119 (*getArrTag(h,(k)-1u) = (val)->tt_, *getArrVal(h,(k)-1u) = (val)->value_) 125 (*getArrTag(h,(k)) = (val)->tt_, *getArrVal(h,(k)) = (val)->value_)
120 126
121 127
122/* 128/*
@@ -125,10 +131,10 @@
125** precomputed tag value or address as an extra argument. 131** precomputed tag value or address as an extra argument.
126*/ 132*/
127#define farr2val(h,k,tag,res) \ 133#define farr2val(h,k,tag,res) \
128 ((res)->tt_ = tag, (res)->value_ = *getArrVal(h,(k)-1u)) 134 ((res)->tt_ = tag, (res)->value_ = *getArrVal(h,(k)))
129 135
130#define fval2arr(h,k,tag,val) \ 136#define fval2arr(h,k,tag,val) \
131 (*tag = (val)->tt_, *getArrVal(h,(k)-1u) = (val)->value_) 137 (*tag = (val)->tt_, *getArrVal(h,(k)) = (val)->value_)
132 138
133 139
134LUAI_FUNC int luaH_get (Table *t, const TValue *key, TValue *res); 140LUAI_FUNC int luaH_get (Table *t, const TValue *key, TValue *res);