** Adjust the number of results from an expression list 'e' with 'nexps' ** expressions to 'nvars' values. */
| 545 | ** expressions to 'nvars' values. |
| 546 | */ |
| 547 | static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { |
| 548 | FuncState *fs = ls->fs; |
| 549 | int needed = nvars - nexps; /* extra values needed */ |
| 550 | luaK_checkstack(fs, needed); |
| 551 | if (hasmultret(e->k)) { /* last expression has multiple returns? */ |
| 552 | int extra = needed + 1; /* discount last expression itself */ |
| 553 | if (extra < 0) |
| 554 | extra = 0; |
| 555 | luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ |
| 556 | } |
| 557 | else { |
| 558 | if (e->k != VVOID) /* at least one expression? */ |
| 559 | luaK_exp2nextreg(fs, e); /* close last expression */ |
| 560 | if (needed > 0) /* missing values? */ |
| 561 | luaK_nil(fs, fs->freereg, needed); /* complete with nils */ |
| 562 | } |
| 563 | if (needed > 0) |
| 564 | luaK_reserveregs(fs, needed); /* registers for extra values */ |
| 565 | else /* adding 'needed' is actually a subtraction */ |
| 566 | fs->freereg = cast_byte(fs->freereg + needed); /* remove extra values */ |
| 567 | } |
| 568 | |
| 569 | |
| 570 | #define enterlevel(ls) luaE_incCstack(ls->L) |
no test coverage detected