diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_tab.c | 20 |
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. */ |
39 | static Node *hashkey(const GCtab *t, cTValue *key) | 39 | static 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 | ||
311 | static uint32_t countint(cTValue *key, uint32_t *bins) | 312 | static 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 | ||