| 1240 | |
| 1241 | |
| 1242 | static void retstat (LexState *ls) { |
| 1243 | /* stat -> RETURN explist */ |
| 1244 | FuncState *fs = ls->fs; |
| 1245 | expdesc e; |
| 1246 | int first, nret; /* registers with returned values */ |
| 1247 | luaX_next(ls); /* skip RETURN */ |
| 1248 | if (block_follow(ls->t.token) || ls->t.token == ';') |
| 1249 | first = nret = 0; /* return no values */ |
| 1250 | else { |
| 1251 | nret = explist1(ls, &e); /* optional return values */ |
| 1252 | if (hasmultret(e.k)) { |
| 1253 | luaK_setmultret(fs, &e); |
| 1254 | if (e.k == VCALL && nret == 1) { /* tail call? */ |
| 1255 | SET_OPCODE(getcode(fs,&e), OP_TAILCALL); |
| 1256 | lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); |
| 1257 | } |
| 1258 | first = fs->nactvar; |
| 1259 | nret = LUA_MULTRET; /* return all values */ |
| 1260 | } |
| 1261 | else { |
| 1262 | if (nret == 1) /* only one single value? */ |
| 1263 | first = luaK_exp2anyreg(fs, &e); |
| 1264 | else { |
| 1265 | luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ |
| 1266 | first = fs->nactvar; /* return all `active' values */ |
| 1267 | lua_assert(nret == fs->freereg - first); |
| 1268 | } |
| 1269 | } |
| 1270 | } |
| 1271 | luaK_ret(fs, first, nret); |
| 1272 | } |
| 1273 | |
| 1274 | |
| 1275 | static int statement (LexState *ls) { |
no test coverage detected