public override Type GenCode(ILGenerator ilGenerator, TypeBuilder parent, FieldBuilder IsBreakFields, List <FieldBuilder> level, Label endLabel) { Label conditionFalse = ilGenerator.DefineLabel(); Type condit = Cond.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //en el tope queda el valor de la condicion ilGenerator.Emit(OpCodes.Ldc_I4_0); //meto el 0 en el tope de la pila ilGenerator.Emit(OpCodes.Ble, conditionFalse); //si cond <=0 es false //si se cumple la condicion Type bodyType = Body.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el condigo del body del if ilGenerator.MarkLabel(conditionFalse); return(null); }
public override Type GenCode(ILGenerator ilGenerator, TypeBuilder parent, FieldBuilder IsBreakFields, List <FieldBuilder> level, Label endLabel) { Label conditionTrue = ilGenerator.DefineLabel(); Label end = ilGenerator.DefineLabel(); Type conditionType = Cond.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el codigo de la condicion ilGenerator.Emit(OpCodes.Ldc_I4_0); ilGenerator.Emit(OpCodes.Bgt, conditionTrue); //voy para la etiqueta del true //es falsa la condicion Type elseType = Body_else.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el codigo del cuerpo del else ilGenerator.Emit(OpCodes.Br, end); //voy para el final //la condicion fue true ilGenerator.MarkLabel(conditionTrue); //etiqueta del true Type thenType = Body.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el codigo del cuerpo del then ilGenerator.MarkLabel(end); //etiqueta del fin return((elseType == typeof(object)) ? thenType : elseType); //como el else y el if devuelven lo mismo => devuelvo cualquiera de los dos }