public override void GenCode(ICodeGenerator cg) { var gen = cg.GetGenerator; var endLabel = gen.DefineLabel(); ConditionExp.GenCode(cg); gen.Emit(OpCodes.Brfalse, endLabel); ThenInstruction.GenCode(cg); gen.MarkLabel(endLabel); }
protected override bool CheckInstructions(List <Error> errors, SymbolTable symbolTable) { //Note: aqui mismo actualizo el hasBreak, para no tener ke pasar otra vez por cada instruccion //Note: aqui mismo actualizo el ReturnType en caso de error para ke TypeChecking solo se encargue del checkeo correcto de tipos //Check ThenInstruccion bool thenOk = ThenInstruction.CheckSemantic(errors, symbolTable); hasBreak = (ThenInstruction is IBreakable && (ThenInstruction as IBreakable).HasBreak); if (thenOk) { return(true); } ReturnType = TypeExpression.ErrorType; return(false); }
public override void GenCode(ICodeGenerator cg) { var gen = cg.GetGenerator; var endLabel = gen.DefineLabel(); var elseLabel = gen.DefineLabel(); ConditionExp.GenCode(cg); gen.Emit(OpCodes.Brfalse, elseLabel);//Si la condicion es falsa salto al else ThenInstruction.GenCode(cg); gen.Emit(OpCodes.Br, endLabel);//si fue verdadera despues de generar el thenInstruction y salto a la endLabel para terminar gen.MarkLabel(elseLabel); ElseInstruction.GenCode(cg);//si salte al else genero el ElseInstruction y termino gen.MarkLabel(endLabel); }