Esempio n. 1
0
File: code.c Progetto: WeiY/ktap
static void discharge2anyreg(FuncState *fs, expdesc *e)
{
	if (e->k != VNONRELOC) {
		codegen_reserveregs(fs, 1);
		discharge2reg(fs, e, fs->freereg-1);
	}
}
Esempio n. 2
0
File: code.c Progetto: WeiY/ktap
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);
	}
}
Esempio n. 3
0
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);
		}
	}
}