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 | } |
