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