aboutsummaryrefslogtreecommitdiff
path: root/src/lj_tab.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_tab.c')
-rw-r--r--src/lj_tab.c16
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
163GCtab * 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. */
164GCtab *lj_tab_dup(lua_State *L, const GCtab *kt) 172GCtab * 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)
334static uint32_t bestasize(uint32_t bins[], uint32_t *narray) 342static 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*/
602MSize lj_tab_len(GCtab *t) 610MSize 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))) {