diff options
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 34 |
1 files changed, 30 insertions, 4 deletions
| @@ -255,6 +255,7 @@ static void markupval (FuncState *fs, int level) { | |||
| 255 | while (bl->nactvar > level) | 255 | while (bl->nactvar > level) |
| 256 | bl = bl->previous; | 256 | bl = bl->previous; |
| 257 | bl->upval = 1; | 257 | bl->upval = 1; |
| 258 | fs->needclose = 1; | ||
| 258 | } | 259 | } |
| 259 | 260 | ||
| 260 | 261 | ||
| @@ -547,6 +548,7 @@ static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { | |||
| 547 | fs->nups = 0; | 548 | fs->nups = 0; |
| 548 | fs->nlocvars = 0; | 549 | fs->nlocvars = 0; |
| 549 | fs->nactvar = 0; | 550 | fs->nactvar = 0; |
| 551 | fs->needclose = 0; | ||
| 550 | fs->firstlocal = ls->dyd->actvar.n; | 552 | fs->firstlocal = ls->dyd->actvar.n; |
| 551 | fs->bl = NULL; | 553 | fs->bl = NULL; |
| 552 | f->source = ls->source; | 554 | f->source = ls->source; |
| @@ -1509,15 +1511,16 @@ static void localfunc (LexState *ls) { | |||
| 1509 | } | 1511 | } |
| 1510 | 1512 | ||
| 1511 | 1513 | ||
| 1512 | static void localstat (LexState *ls) { | 1514 | static void commonlocalstat (LexState *ls, TString *firstvar) { |
| 1513 | /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ | 1515 | /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ |
| 1514 | int nvars = 0; | 1516 | int nvars = 1; |
| 1515 | int nexps; | 1517 | int nexps; |
| 1516 | expdesc e; | 1518 | expdesc e; |
| 1517 | do { | 1519 | new_localvar(ls, firstvar); |
| 1520 | while (testnext(ls, ',')) { | ||
| 1518 | new_localvar(ls, str_checkname(ls)); | 1521 | new_localvar(ls, str_checkname(ls)); |
| 1519 | nvars++; | 1522 | nvars++; |
| 1520 | } while (testnext(ls, ',')); | 1523 | } |
| 1521 | if (testnext(ls, '=')) | 1524 | if (testnext(ls, '=')) |
| 1522 | nexps = explist(ls, &e); | 1525 | nexps = explist(ls, &e); |
| 1523 | else { | 1526 | else { |
| @@ -1529,6 +1532,29 @@ static void localstat (LexState *ls) { | |||
| 1529 | } | 1532 | } |
| 1530 | 1533 | ||
| 1531 | 1534 | ||
| 1535 | static void scopedlocalstat (LexState *ls) { | ||
| 1536 | FuncState *fs = ls->fs; | ||
| 1537 | new_localvar(ls, str_checkname(ls)); | ||
| 1538 | checknext(ls, '='); | ||
| 1539 | luaK_codeABC(fs, OP_TBC, fs->nactvar, 0, 0); | ||
| 1540 | markupval(fs, fs->nactvar); | ||
| 1541 | exp1(ls, 0); | ||
| 1542 | adjustlocalvars(ls, 1); | ||
| 1543 | } | ||
| 1544 | |||
| 1545 | |||
| 1546 | static void localstat (LexState *ls) { | ||
| 1547 | /* stat -> LOCAL NAME {',' NAME} ['=' explist] | ||
| 1548 | | LOCAL SCOPED NAME '=' exp */ | ||
| 1549 | TString *firstvar = str_checkname(ls); | ||
| 1550 | if (ls->t.token == TK_NAME && | ||
| 1551 | eqshrstr(firstvar, luaS_newliteral(ls->L, "scoped"))) | ||
| 1552 | scopedlocalstat(ls); | ||
| 1553 | else | ||
| 1554 | commonlocalstat(ls, firstvar); | ||
| 1555 | } | ||
| 1556 | |||
| 1557 | |||
| 1532 | static int funcname (LexState *ls, expdesc *v) { | 1558 | static int funcname (LexState *ls, expdesc *v) { |
| 1533 | /* funcname -> NAME {fieldsel} [':' NAME] */ | 1559 | /* funcname -> NAME {fieldsel} [':' NAME] */ |
| 1534 | int ismethod = 0; | 1560 | int ismethod = 0; |
