diff options
author | Mike Pall <mike> | 2012-06-30 20:58:19 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-06-30 20:58:19 +0200 |
commit | 89f8c920c652153f690d61b5bede581aad072593 (patch) | |
tree | 0072ff5e8df2a8f9bf5557df13325613f77faa5a /src | |
parent | eacecc90e1eb3993e8cb44537c8a7bedc2f19758 (diff) | |
download | luajit-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.c | 28 |
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 | } |