diff options
Diffstat (limited to 'src/lj_tab.c')
-rw-r--r-- | src/lj_tab.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/lj_tab.c b/src/lj_tab.c index 9af51027..ceafb770 100644 --- a/src/lj_tab.c +++ b/src/lj_tab.c | |||
@@ -160,8 +160,16 @@ GCtab *lj_tab_new(lua_State *L, uint32_t asize, uint32_t hbits) | |||
160 | return t; | 160 | return t; |
161 | } | 161 | } |
162 | 162 | ||
163 | GCtab * LJ_FASTCALL lj_tab_new1(lua_State *L, uint32_t ahsize) | ||
164 | { | ||
165 | GCtab *t = newtab(L, ahsize & 0xffffff, ahsize >> 24); | ||
166 | clearapart(t); | ||
167 | if (t->hmask > 0) clearhpart(t); | ||
168 | return t; | ||
169 | } | ||
170 | |||
163 | /* Duplicate a table. */ | 171 | /* Duplicate a table. */ |
164 | GCtab *lj_tab_dup(lua_State *L, const GCtab *kt) | 172 | GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt) |
165 | { | 173 | { |
166 | GCtab *t; | 174 | GCtab *t; |
167 | uint32_t asize, hmask; | 175 | uint32_t asize, hmask; |
@@ -334,8 +342,8 @@ static uint32_t counthash(const GCtab *t, uint32_t *bins, uint32_t *narray) | |||
334 | static uint32_t bestasize(uint32_t bins[], uint32_t *narray) | 342 | static uint32_t bestasize(uint32_t bins[], uint32_t *narray) |
335 | { | 343 | { |
336 | uint32_t b, sum, na = 0, sz = 0, nn = *narray; | 344 | uint32_t b, sum, na = 0, sz = 0, nn = *narray; |
337 | for (b = 0, sum = 0; (1u<<b) <= nn && sum != nn; b++) | 345 | for (b = 0, sum = 0; 2*nn > (1u<<b) && sum != nn; b++) |
338 | if (bins[b] > 0 && (sum += bins[b]) >= (1u<<b)) { | 346 | if (bins[b] > 0 && 2*(sum += bins[b]) > (1u<<b)) { |
339 | sz = (2u<<b)+1; | 347 | sz = (2u<<b)+1; |
340 | na = sum; | 348 | na = sum; |
341 | } | 349 | } |
@@ -599,7 +607,7 @@ static MSize unbound_search(GCtab *t, MSize j) | |||
599 | ** Try to find a boundary in table `t'. A `boundary' is an integer index | 607 | ** Try to find a boundary in table `t'. A `boundary' is an integer index |
600 | ** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). | 608 | ** such that t[i] is non-nil and t[i+1] is nil (and 0 if t[1] is nil). |
601 | */ | 609 | */ |
602 | MSize lj_tab_len(GCtab *t) | 610 | MSize LJ_FASTCALL lj_tab_len(GCtab *t) |
603 | { | 611 | { |
604 | MSize j = (MSize)t->asize; | 612 | MSize j = (MSize)t->asize; |
605 | if (j > 1 && tvisnil(arrayslot(t, j-1))) { | 613 | if (j > 1 && tvisnil(arrayslot(t, j-1))) { |