static void discharge2anyreg(FuncState *fs, expdesc *e) { if (e->k != VNONRELOC) { codegen_reserveregs(fs, 1); discharge2reg(fs, e, fs->freereg-1); } }
void codegen_setreturns(FuncState *fs, expdesc *e, int nresults) { if (e->k == VCALL) { /* expression is an open function call? */ SETARG_C(getcode(fs, e), nresults+1); } else if (e->k == VVARARG) { SETARG_B(getcode(fs, e), nresults+1); SETARG_A(getcode(fs, e), fs->freereg); codegen_reserveregs(fs, 1); } }
static void adjust_assign(ktap_lexstate *ls, int nvars, int nexps, ktap_expdesc *e) { ktap_funcstate *fs = ls->fs; int extra = nvars - nexps; if (hasmultret(e->k)) { extra++; /* includes call itself */ if (extra < 0) extra = 0; codegen_setreturns(fs, e, extra); /* last exp. provides the difference */ if (extra > 1) codegen_reserveregs(fs, extra-1); } else { if (e->k != VVOID) codegen_exp2nextreg(fs, e); /* close last expression */ if (extra > 0) { int reg = fs->freereg; codegen_reserveregs(fs, extra); codegen_nil(fs, reg, extra); } } }