1 // 2 // Permission is hereby granted, free of charge, to any person obtaining 3 // a copy of this software and associated documentation files (the 4 // "Software"), to deal in the Software without restriction, including 5 // without limitation the rights to use, copy, modify, merge, publish, 6 // distribute, sublicense, and/or sell copies of the Software, and to 7 // permit persons to whom the Software is furnished to do so, subject to 8 // the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be 11 // included in all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 15 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 17 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 18 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 19 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 // 21 // Copyright (C) Lluis Sanchez Gual, 2004 22 // 23 24 #if !FULL_AOT_RUNTIME 25 using System; 26 using System.Reflection; 27 using System.Reflection.Emit; 28 29 namespace Mono.CodeGeneration 30 { 31 public class CodeWhen: CodeExpression 32 { 33 CodeExpression condition; 34 CodeExpression trueBlock; 35 CodeExpression falseBlock; 36 CodeWhen(CodeExpression condition, CodeExpression trueResult, CodeExpression falseResult)37 public CodeWhen (CodeExpression condition, CodeExpression trueResult, CodeExpression falseResult) 38 { 39 this.condition = condition; 40 if (condition.GetResultType () != typeof(bool)) 41 throw new InvalidOperationException ("Condition expression is not boolean"); 42 if (trueResult.GetResultType() != falseResult.GetResultType()) 43 throw new InvalidOperationException ("The types of the true and false expressions must be the same"); 44 trueBlock = trueResult; 45 falseBlock = falseResult; 46 } 47 Generate(ILGenerator gen)48 public override void Generate (ILGenerator gen) 49 { 50 Label falseLabel = gen.DefineLabel (); 51 Label endLabel = gen.DefineLabel (); 52 53 GenerateCondition (gen, falseLabel); 54 trueBlock.Generate (gen); 55 gen.Emit (OpCodes.Br, endLabel); 56 gen.MarkLabel(falseLabel); 57 falseBlock.Generate (gen); 58 59 gen.MarkLabel(endLabel); 60 } 61 GenerateCondition(ILGenerator gen, Label falseLabel)62 void GenerateCondition (ILGenerator gen, Label falseLabel) 63 { 64 if (condition is CodeConditionExpression) 65 ((CodeConditionExpression)condition).GenerateForBranch (gen, falseLabel, false); 66 else { 67 condition.Generate (gen); 68 gen.Emit (OpCodes.Brfalse, falseLabel); 69 } 70 } 71 PrintCode(CodeWriter cp)72 public override void PrintCode (CodeWriter cp) 73 { 74 cp.Write ("("); 75 condition.PrintCode (cp); 76 cp.Write (") ? "); 77 trueBlock.PrintCode (cp); 78 cp.Write (" : "); 79 falseBlock.PrintCode (cp); 80 } 81 GetResultType()82 public override Type GetResultType () 83 { 84 return trueBlock.GetResultType(); 85 } 86 } 87 } 88 #endif 89