aboutsummaryrefslogtreecommitdiff
path: root/src/lj_tab.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_tab.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/lj_tab.c b/src/lj_tab.c
index eb9ef4af..efc423cb 100644
--- a/src/lj_tab.c
+++ b/src/lj_tab.c
@@ -38,7 +38,7 @@ static LJ_AINLINE Node *hashmask(const GCtab *t, uint32_t hash)
38/* Hash an arbitrary key and return its anchor position in the hash table. */ 38/* Hash an arbitrary key and return its anchor position in the hash table. */
39static Node *hashkey(const GCtab *t, cTValue *key) 39static Node *hashkey(const GCtab *t, cTValue *key)
40{ 40{
41 lua_assert(!tvisint(key)); 41 lj_assertX(!tvisint(key), "attempt to hash integer");
42 if (tvisstr(key)) 42 if (tvisstr(key))
43 return hashstr(t, strV(key)); 43 return hashstr(t, strV(key));
44 else if (tvisnum(key)) 44 else if (tvisnum(key))
@@ -57,7 +57,7 @@ static LJ_AINLINE void newhpart(lua_State *L, GCtab *t, uint32_t hbits)
57{ 57{
58 uint32_t hsize; 58 uint32_t hsize;
59 Node *node; 59 Node *node;
60 lua_assert(hbits != 0); 60 lj_assertL(hbits != 0, "zero hash size");
61 if (hbits > LJ_MAX_HBITS) 61 if (hbits > LJ_MAX_HBITS)
62 lj_err_msg(L, LJ_ERR_TABOV); 62 lj_err_msg(L, LJ_ERR_TABOV);
63 hsize = 1u << hbits; 63 hsize = 1u << hbits;
@@ -78,7 +78,7 @@ static LJ_AINLINE void clearhpart(GCtab *t)
78{ 78{
79 uint32_t i, hmask = t->hmask; 79 uint32_t i, hmask = t->hmask;
80 Node *node = noderef(t->node); 80 Node *node = noderef(t->node);
81 lua_assert(t->hmask != 0); 81 lj_assertX(t->hmask != 0, "empty hash part");
82 for (i = 0; i <= hmask; i++) { 82 for (i = 0; i <= hmask; i++) {
83 Node *n = &node[i]; 83 Node *n = &node[i];
84 setmref(n->next, NULL); 84 setmref(n->next, NULL);
@@ -103,7 +103,7 @@ static GCtab *newtab(lua_State *L, uint32_t asize, uint32_t hbits)
103 /* First try to colocate the array part. */ 103 /* First try to colocate the array part. */
104 if (LJ_MAX_COLOSIZE != 0 && asize > 0 && asize <= LJ_MAX_COLOSIZE) { 104 if (LJ_MAX_COLOSIZE != 0 && asize > 0 && asize <= LJ_MAX_COLOSIZE) {
105 Node *nilnode; 105 Node *nilnode;
106 lua_assert((sizeof(GCtab) & 7) == 0); 106 lj_assertL((sizeof(GCtab) & 7) == 0, "bad GCtab size");
107 t = (GCtab *)lj_mem_newgco(L, sizetabcolo(asize)); 107 t = (GCtab *)lj_mem_newgco(L, sizetabcolo(asize));
108 t->gct = ~LJ_TTAB; 108 t->gct = ~LJ_TTAB;
109 t->nomm = (uint8_t)~0; 109 t->nomm = (uint8_t)~0;
@@ -185,7 +185,8 @@ GCtab * LJ_FASTCALL lj_tab_dup(lua_State *L, const GCtab *kt)
185 GCtab *t; 185 GCtab *t;
186 uint32_t asize, hmask; 186 uint32_t asize, hmask;
187 t = newtab(L, kt->asize, kt->hmask > 0 ? lj_fls(kt->hmask)+1 : 0); 187 t = newtab(L, kt->asize, kt->hmask > 0 ? lj_fls(kt->hmask)+1 : 0);
188 lua_assert(kt->asize == t->asize && kt->hmask == t->hmask); 188 lj_assertL(kt->asize == t->asize && kt->hmask == t->hmask,
189 "mismatched size of table and template");
189 t->nomm = 0; /* Keys with metamethod names may be present. */ 190 t->nomm = 0; /* Keys with metamethod names may be present. */
190 asize = kt->asize; 191 asize = kt->asize;
191 if (asize > 0) { 192 if (asize > 0) {
@@ -310,7 +311,7 @@ void lj_tab_resize(lua_State *L, GCtab *t, uint32_t asize, uint32_t hbits)
310 311
311static uint32_t countint(cTValue *key, uint32_t *bins) 312static uint32_t countint(cTValue *key, uint32_t *bins)
312{ 313{
313 lua_assert(!tvisint(key)); 314 lj_assertX(!tvisint(key), "bad integer key");
314 if (tvisnum(key)) { 315 if (tvisnum(key)) {
315 lua_Number nk = numV(key); 316 lua_Number nk = numV(key);
316 int32_t k = lj_num2int(nk); 317 int32_t k = lj_num2int(nk);
@@ -463,7 +464,8 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
463 if (!tvisnil(&n->val) || t->hmask == 0) { 464 if (!tvisnil(&n->val) || t->hmask == 0) {
464 Node *nodebase = noderef(t->node); 465 Node *nodebase = noderef(t->node);
465 Node *collide, *freenode = getfreetop(t, nodebase); 466 Node *collide, *freenode = getfreetop(t, nodebase);
466 lua_assert(freenode >= nodebase && freenode <= nodebase+t->hmask+1); 467 lj_assertL(freenode >= nodebase && freenode <= nodebase+t->hmask+1,
468 "bad freenode");
467 do { 469 do {
468 if (freenode == nodebase) { /* No free node found? */ 470 if (freenode == nodebase) { /* No free node found? */
469 rehashtab(L, t, key); /* Rehash table. */ 471 rehashtab(L, t, key); /* Rehash table. */
@@ -471,7 +473,7 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
471 } 473 }
472 } while (!tvisnil(&(--freenode)->key)); 474 } while (!tvisnil(&(--freenode)->key));
473 setfreetop(t, nodebase, freenode); 475 setfreetop(t, nodebase, freenode);
474 lua_assert(freenode != &G(L)->nilnode); 476 lj_assertL(freenode != &G(L)->nilnode, "store to fallback hash");
475 collide = hashkey(t, &n->key); 477 collide = hashkey(t, &n->key);
476 if (collide != n) { /* Colliding node not the main node? */ 478 if (collide != n) { /* Colliding node not the main node? */
477 while (noderef(collide->next) != n) /* Find predecessor. */ 479 while (noderef(collide->next) != n) /* Find predecessor. */
@@ -527,7 +529,7 @@ TValue *lj_tab_newkey(lua_State *L, GCtab *t, cTValue *key)
527 if (LJ_UNLIKELY(tvismzero(&n->key))) 529 if (LJ_UNLIKELY(tvismzero(&n->key)))
528 n->key.u64 = 0; 530 n->key.u64 = 0;
529 lj_gc_anybarriert(L, t); 531 lj_gc_anybarriert(L, t);
530 lua_assert(tvisnil(&n->val)); 532 lj_assertL(tvisnil(&n->val), "new hash slot is not empty");
531 return &n->val; 533 return &n->val;
532} 534}
533 535