Ejemplo n.º 1
0
        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
        }