public override void GenerateCode(ILGenerator gen, CodeFlow cf) { // pseudo: if (leftOperandValue) { result=true; } else { result=rightOperandValue; } var elseTarget = gen.DefineLabel(); var endIfTarget = gen.DefineLabel(); var result = gen.DeclareLocal(typeof(bool)); cf.EnterCompilationScope(); LeftOperand.GenerateCode(gen, cf); cf.UnboxBooleanIfNecessary(gen); cf.ExitCompilationScope(); gen.Emit(OpCodes.Brfalse, elseTarget); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Stloc, result); gen.Emit(OpCodes.Br, endIfTarget); gen.MarkLabel(elseTarget); cf.EnterCompilationScope(); RightOperand.GenerateCode(gen, cf); cf.UnboxBooleanIfNecessary(gen); cf.ExitCompilationScope(); gen.Emit(OpCodes.Stloc, result); gen.MarkLabel(endIfTarget); gen.Emit(OpCodes.Ldloc, result); cf.PushDescriptor(_exitTypeDescriptor); }
public override void GenerateCode(ILGenerator gen, CodeFlow cf) { var elseTarget = gen.DefineLabel(); var endIfTarget = gen.DefineLabel(); var result = gen.DeclareLocal(typeof(bool)); var child = _children[0]; child.GenerateCode(gen, cf); cf.UnboxBooleanIfNecessary(gen); gen.Emit(OpCodes.Brtrue, elseTarget); gen.Emit(OpCodes.Ldc_I4_1); gen.Emit(OpCodes.Stloc, result); gen.Emit(OpCodes.Br, endIfTarget); gen.MarkLabel(elseTarget); gen.Emit(OpCodes.Ldc_I4_0); gen.Emit(OpCodes.Stloc, result); gen.MarkLabel(endIfTarget); gen.Emit(OpCodes.Ldloc, result); cf.PushDescriptor(_exitTypeDescriptor); }