aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-06-30 20:58:19 +0200
committerMike Pall <mike>2012-06-30 20:58:19 +0200
commit89f8c920c652153f690d61b5bede581aad072593 (patch)
tree0072ff5e8df2a8f9bf5557df13325613f77faa5a /src
parenteacecc90e1eb3993e8cb44537c8a7bedc2f19758 (diff)
downloadluajit-89f8c920c652153f690d61b5bede581aad072593.tar.gz
luajit-89f8c920c652153f690d61b5bede581aad072593.tar.bz2
luajit-89f8c920c652153f690d61b5bede581aad072593.zip
Expand array slots in template tables with mixed const/var initializers.
Diffstat (limited to 'src')
-rw-r--r--src/lj_parse.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/src/lj_parse.c b/src/lj_parse.c
index 7e1d2929..170801ed 100644
--- a/src/lj_parse.c
+++ b/src/lj_parse.c
@@ -1530,7 +1530,7 @@ static void expr_table(LexState *ls, ExpDesc *e)
1530 BCLine line = ls->linenumber; 1530 BCLine line = ls->linenumber;
1531 GCtab *t = NULL; 1531 GCtab *t = NULL;
1532 int vcall = 0, needarr = 0, fixt = 0; 1532 int vcall = 0, needarr = 0, fixt = 0;
1533 int32_t narr = 1; /* First array index. */ 1533 uint32_t narr = 1; /* First array index. */
1534 uint32_t nhash = 0; /* Number of hash entries. */ 1534 uint32_t nhash = 0; /* Number of hash entries. */
1535 BCReg freg = fs->freereg; 1535 BCReg freg = fs->freereg;
1536 BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0); 1536 BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);
@@ -1552,7 +1552,7 @@ static void expr_table(LexState *ls, ExpDesc *e)
1552 nhash++; 1552 nhash++;
1553 } else { 1553 } else {
1554 expr_init(&key, VKNUM, 0); 1554 expr_init(&key, VKNUM, 0);
1555 setintV(&key.u.nval, narr); 1555 setintV(&key.u.nval, (int)narr);
1556 narr++; 1556 narr++;
1557 needarr = vcall = 1; 1557 needarr = vcall = 1;
1558 } 1558 }
@@ -1562,7 +1562,7 @@ static void expr_table(LexState *ls, ExpDesc *e)
1562 TValue k, *v; 1562 TValue k, *v;
1563 if (!t) { /* Create template table on demand. */ 1563 if (!t) { /* Create template table on demand. */
1564 BCReg kidx; 1564 BCReg kidx;
1565 t = lj_tab_new(fs->L, 0, 0); 1565 t = lj_tab_new(fs->L, narr, hsize2hbits(nhash));
1566 kidx = const_gc(fs, obj2gco(t), LJ_TTAB); 1566 kidx = const_gc(fs, obj2gco(t), LJ_TTAB);
1567 fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx); 1567 fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);
1568 } 1568 }
@@ -1611,15 +1611,19 @@ static void expr_table(LexState *ls, ExpDesc *e)
1611 if (!needarr) narr = 0; 1611 if (!needarr) narr = 0;
1612 else if (narr < 3) narr = 3; 1612 else if (narr < 3) narr = 3;
1613 else if (narr > 0x7ff) narr = 0x7ff; 1613 else if (narr > 0x7ff) narr = 0x7ff;
1614 setbc_d(ip, (uint32_t)narr|(hsize2hbits(nhash)<<11)); 1614 setbc_d(ip, narr|(hsize2hbits(nhash)<<11));
1615 } else if (fixt) { /* Fix value for dummy keys in template table. */ 1615 } else {
1616 Node *node = noderef(t->node); 1616 if (needarr && t->asize < narr)
1617 uint32_t i, hmask = t->hmask; 1617 lj_tab_reasize(fs->L, t, narr-1);
1618 for (i = 0; i <= hmask; i++) { 1618 if (fixt) { /* Fix value for dummy keys in template table. */
1619 Node *n = &node[i]; 1619 Node *node = noderef(t->node);
1620 if (tvistab(&n->val)) { 1620 uint32_t i, hmask = t->hmask;
1621 lua_assert(tabV(&n->val) == t); 1621 for (i = 0; i <= hmask; i++) {
1622 setnilV(&n->val); /* Turn value into nil. */ 1622 Node *n = &node[i];
1623 if (tvistab(&n->val)) {
1624 lua_assert(tabV(&n->val) == t);
1625 setnilV(&n->val); /* Turn value into nil. */
1626 }
1623 } 1627 }
1624 } 1628 }
1625 } 1629 }