public override void CGenStmt(Env env, CGenState state) {
// Init
this.Init.Map(_ => CGenExprStmt(env, _, state));
Int32 start_label = state.RequestLabel();
Int32 finish_label = state.RequestLabel();
Int32 continue_label = state.RequestLabel();
// start:
state.CGenLabel(start_label);
// test cont
this.Cond.Map(_ => {
Reg ret = CGenExprStmt(env, _, state);
CGenTest(ret, state);
return ret;
});
// jz finish
state.JZ(finish_label);
// Body
state.InLoop(continue_label, finish_label);
this.Body.CGenStmt(env, state);
state.OutLabels();
// continue:
state.CGenLabel(continue_label);
// Loop
this.Loop.Map(_ => CGenExprStmt(env, _, state));
// jmp start
state.JMP(start_label);
// finish:
state.CGenLabel(finish_label);
}