** Adjust the number of results from an expression list 'e' with 'nexps' ** expressions to 'nvars' values. */
| 468 | ** expressions to 'nvars' values. |
| 469 | */ |
| 470 | static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { |
| 471 | FuncState *fs = ls->fs; |
| 472 | int needed = nvars - nexps; /* extra values needed */ |
| 473 | if (hasmultret(e->k)) { /* last expression has multiple returns? */ |
| 474 | int extra = needed + 1; /* discount last expression itself */ |
| 475 | if (extra < 0) |
| 476 | extra = 0; |
| 477 | luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ |
| 478 | } |
| 479 | else { |
| 480 | if (e->k != VVOID) /* at least one expression? */ |
| 481 | luaK_exp2nextreg(fs, e); /* close last expression */ |
| 482 | if (needed > 0) /* missing values? */ |
| 483 | luaK_nil(fs, fs->freereg, needed); /* complete with nils */ |
| 484 | } |
| 485 | if (needed > 0) |
| 486 | luaK_reserveregs(fs, needed); /* registers for extra values */ |
| 487 | else /* adding 'needed' is actually a subtraction */ |
| 488 | fs->freereg += needed; /* remove extra values */ |
| 489 | } |
| 490 | |
| 491 | |
| 492 | #define enterlevel(ls) luaE_incCstack(ls->L) |
no test coverage detected