diff options
Diffstat (limited to '')
-rw-r--r-- | ltable.h | 36 |
1 files changed, 22 insertions, 14 deletions
@@ -48,7 +48,7 @@ | |||
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) - 1u; \ | 50 | { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \ |
51 | if ((u < h->alimit)) { \ | 51 | if ((u < h->asize)) { \ |
52 | tag = *getArrTag(h, u); \ | 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, (k), res); }} | 54 | else { tag = luaH_getint(h, (k), res); }} |
@@ -56,10 +56,11 @@ | |||
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) - 1u; \ | 58 | { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \ |
59 | if ((u < h->alimit)) { \ | 59 | if ((u < h->asize)) { \ |
60 | lu_byte *tag = getArrTag(h, u); \ | 60 | lu_byte *tag = getArrTag(h, u); \ |
61 | if (tagisempty(*tag)) hres = ~cast_int(u); \ | 61 | if (h->metatable == NULL || !tagisempty(*tag)) \ |
62 | else { fval2arr(h, u, tag, val); hres = HOK; }} \ | 62 | { fval2arr(h, u, tag, val); hres = HOK; } \ |
63 | else hres = ~cast_int(u); } \ | ||
63 | else { hres = luaH_psetint(h, k, val); }} | 64 | else { hres = luaH_psetint(h, k, val); }} |
64 | 65 | ||
65 | 66 | ||
@@ -94,28 +95,36 @@ | |||
94 | /* | 95 | /* |
95 | ** The array part of a table is represented by an inverted array of | 96 | ** The array part of a table is represented by an inverted array of |
96 | ** values followed by an array of tags, to avoid wasting space with | 97 | ** values followed by an array of tags, to avoid wasting space with |
97 | ** padding. The 'array' pointer points to the junction of the two | 98 | ** padding. In between them there is an unsigned int, explained later. |
98 | ** arrays, so that values are indexed with negative indices and tags | 99 | ** The 'array' pointer points between the two arrays, so that values are |
99 | ** with non-negative indices. | 100 | ** indexed with negative indices and tags with non-negative indices. |
100 | 101 | ||
101 | Values Tags | 102 | Values Tags |
102 | -------------------------------------------------------- | 103 | -------------------------------------------------------- |
103 | ... | Value 1 | Value 0 |0|1|... | 104 | ... | Value 1 | Value 0 |unsigned|0|1|... |
104 | -------------------------------------------------------- | 105 | -------------------------------------------------------- |
105 | ^ t->array | 106 | ^ t->array |
106 | 107 | ||
107 | ** All accesses to 't->array' should be through the macros 'getArrTag' | 108 | ** All accesses to 't->array' should be through the macros 'getArrTag' |
108 | ** and 'getArrVal'. | 109 | ** and 'getArrVal'. |
109 | */ | 110 | */ |
110 | 111 | ||
111 | /* Computes the address of the tag for the abstract C-index 'k' */ | 112 | /* Computes the address of the tag for the abstract C-index 'k' */ |
112 | #define getArrTag(t,k) (cast(lu_byte*, (t)->array) + (k)) | 113 | #define getArrTag(t,k) (cast(lu_byte*, (t)->array) + sizeof(unsigned) + (k)) |
113 | 114 | ||
114 | /* Computes the address of the value for the abstract C-index 'k' */ | 115 | /* Computes the address of the value for the abstract C-index 'k' */ |
115 | #define getArrVal(t,k) ((t)->array - 1 - (k)) | 116 | #define getArrVal(t,k) ((t)->array - 1 - (k)) |
116 | 117 | ||
117 | 118 | ||
118 | /* | 119 | /* |
120 | ** The unsigned between the two arrays is used as a hint for #t; | ||
121 | ** see luaH_getn. It is stored there to avoid wasting space in | ||
122 | ** the structure Table for tables with no array part. | ||
123 | */ | ||
124 | #define lenhint(t) cast(unsigned*, (t)->array) | ||
125 | |||
126 | |||
127 | /* | ||
119 | ** Move TValues to/from arrays, using C indices | 128 | ** Move TValues to/from arrays, using C indices |
120 | */ | 129 | */ |
121 | #define arr2obj(h,k,val) \ | 130 | #define arr2obj(h,k,val) \ |
@@ -167,7 +176,6 @@ LUAI_FUNC lu_mem luaH_size (Table *t); | |||
167 | LUAI_FUNC void luaH_free (lua_State *L, Table *t); | 176 | LUAI_FUNC void luaH_free (lua_State *L, Table *t); |
168 | LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); | 177 | LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); |
169 | LUAI_FUNC lua_Unsigned luaH_getn (Table *t); | 178 | LUAI_FUNC lua_Unsigned luaH_getn (Table *t); |
170 | LUAI_FUNC unsigned luaH_realasize (const Table *t); | ||
171 | 179 | ||
172 | 180 | ||
173 | #if defined(LUA_DEBUG) | 181 | #if defined(LUA_DEBUG) |