예제 #1
0
파일: test_foam.c 프로젝트: hemmecke/aldor
local void
testIter()
{
	Foam seq;
	int i;
	seq = foamNewSeq(NULL);
	i = -1;
	i = foamSeqNextReachable(seq, i);
	testIntEqual("1", -1, i);

	seq = foamNewSeq(foamNewNOp(),
			 foamNewGoto(10),
			 foamNewLabel(10),
			 NULL);
	i = -1;
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 0, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 1, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 2, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", -1, i);

	seq = foamNewSeq(foamNewNOp(),
			 foamNewGoto(10),
			 foamNewNOp(),
			 foamNewLabel(10),
			 NULL);
	i = -1;
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 0, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 1, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", 3, i);
	i = foamSeqNextReachable(seq, i);
	testIntEqual("", -1, i);
}
예제 #2
0
파일: gf_gener.c 프로젝트: dokterp/aldor
local Foam
gen0GenerStepFun(AbSyn body, TForm tf)
{
	GenFoamState	saved;
	Foam		foam, clos, tmp;
        FoamTag         yieldType;
	AInt		startLabel;
	AInt		fmtSlot;
        clos = foamNewClos(foamNewEnv(-1), foamNewConst(gen0NumProgs));
        foam = gen0ProgInitEmpty(stepperFName(), body);

        saved = gen0ProgSaveState(PT_Gener);

        startLabel = gen0State->labelNo++;
        gen0State->yieldPlace = gen0State->labelNo++;

	tf = tfDefineeType(tf);
        yieldType = gen0Type(tf, &fmtSlot);

        gen0State->yieldValueVar = gen0TempLocal0(yieldType, fmtSlot);
	
	tmp = foamNewNOp();
	gen0AddStmt(tmp, NULL);	/* filled by gen0GenerSelect */
	gen0AddStmt(foamNewLabel(startLabel), NULL);
	gen0AddStmt(foamNewSet(yieldDoneVar, foamNewBool(int0)), NULL);
        genFoamStmt(body);
	gen0AddStmt(foamNewSet(yieldDoneVar, foamNewBool(1)), NULL);
	gen0AddStmt(foamNewReturn(foamNew(FOAM_Values, int0)), NULL);
	gen0AddStmt(foamNewLabel(gen0State->yieldPlace), NULL);
	gen0AddStmt(foamNewSet(yieldValVar, gen0State->yieldValueVar), NULL);
	gen0AddStmt(foamNewReturn(foamNew(FOAM_Values, int0)), NULL);

	gen0UseStackedFormat(int0);
	gen0ProgPushFormat(emptyFormatSlot);
	gen0ProgPushFormat(emptyFormatSlot);
	gen0ProgFiniEmpty(foam, FOAM_NOp, int0);

	/* fill in the select statement */
	foam->foamProg.body->foamSeq.argv[0] = gen0GenerSelect(startLabel);
	foamFree(tmp);
        gen0AddLexLevels(foam, 2);

        foam->foamProg.infoBits = IB_SIDE | IB_INLINEME;
        foamOptInfo(foam) = inlInfoNew(gen0State->stab, foam, NULL, true);

	gen0ProgRestoreState(saved);
        return clos;
}