diff options
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 15 |
1 files changed, 7 insertions, 8 deletions
| @@ -561,7 +561,7 @@ static void close_func (LexState *ls) { | |||
| 561 | lua_State *L = ls->L; | 561 | lua_State *L = ls->L; |
| 562 | FuncState *fs = ls->fs; | 562 | FuncState *fs = ls->fs; |
| 563 | Proto *f = fs->f; | 563 | Proto *f = fs->f; |
| 564 | luaK_ret(fs, 0, 0); /* final return */ | 564 | luaK_ret(fs, fs->nactvar, 0); /* final return */ |
| 565 | leaveblock(fs); | 565 | leaveblock(fs); |
| 566 | lua_assert(fs->bl == NULL); | 566 | lua_assert(fs->bl == NULL); |
| 567 | luaK_finish(fs); | 567 | luaK_finish(fs); |
| @@ -1602,9 +1602,10 @@ static void retstat (LexState *ls) { | |||
| 1602 | /* stat -> RETURN [explist] [';'] */ | 1602 | /* stat -> RETURN [explist] [';'] */ |
| 1603 | FuncState *fs = ls->fs; | 1603 | FuncState *fs = ls->fs; |
| 1604 | expdesc e; | 1604 | expdesc e; |
| 1605 | int first, nret; /* registers with returned values */ | 1605 | int nret; /* number of values being returned */ |
| 1606 | int first = fs->nactvar; /* first slot to be returned */ | ||
| 1606 | if (block_follow(ls, 1) || ls->t.token == ';') | 1607 | if (block_follow(ls, 1) || ls->t.token == ';') |
| 1607 | first = nret = 0; /* return no values */ | 1608 | nret = 0; /* return no values */ |
| 1608 | else { | 1609 | else { |
| 1609 | nret = explist(ls, &e); /* optional return values */ | 1610 | nret = explist(ls, &e); /* optional return values */ |
| 1610 | if (hasmultret(e.k)) { | 1611 | if (hasmultret(e.k)) { |
| @@ -1613,15 +1614,13 @@ static void retstat (LexState *ls) { | |||
| 1613 | SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); | 1614 | SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); |
| 1614 | lua_assert(GETARG_A(getinstruction(fs,&e)) == fs->nactvar); | 1615 | lua_assert(GETARG_A(getinstruction(fs,&e)) == fs->nactvar); |
| 1615 | } | 1616 | } |
| 1616 | first = fs->nactvar; | ||
| 1617 | nret = LUA_MULTRET; /* return all values */ | 1617 | nret = LUA_MULTRET; /* return all values */ |
| 1618 | } | 1618 | } |
| 1619 | else { | 1619 | else { |
| 1620 | if (nret == 1) /* only one single value? */ | 1620 | if (nret == 1) /* only one single value? */ |
| 1621 | first = luaK_exp2anyreg(fs, &e); | 1621 | first = luaK_exp2anyreg(fs, &e); /* can use original slot */ |
| 1622 | else { | 1622 | else { /* values must go to the top of the stack */ |
| 1623 | luaK_exp2nextreg(fs, &e); /* values must go to the stack */ | 1623 | luaK_exp2nextreg(fs, &e); |
| 1624 | first = fs->nactvar; /* return all active values */ | ||
| 1625 | lua_assert(nret == fs->freereg - first); | 1624 | lua_assert(nret == fs->freereg - first); |
| 1626 | } | 1625 | } |
| 1627 | } | 1626 | } |
