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.Collections; 27 using System.Reflection; 28 using System.Reflection.Emit; 29 30 namespace Mono.CodeGeneration 31 { 32 public class CodeSelect: CodeStatement 33 { 34 ArrayList conditions = new ArrayList (); 35 ArrayList blocks = new ArrayList (); 36 CodeSelect()37 public CodeSelect () 38 { 39 } 40 AddCase(CodeExpression condition, CodeBlock block)41 public void AddCase (CodeExpression condition, CodeBlock block) 42 { 43 conditions.Add (condition); 44 blocks.Add (block); 45 } 46 Generate(ILGenerator gen)47 public override void Generate (ILGenerator gen) 48 { 49 if (blocks.Count == 0) return; 50 51 CodeIf initialIf = new CodeIf ((CodeExpression)conditions[0]); 52 initialIf.TrueBlock = (CodeBlock) blocks[0]; 53 CodeIf prevCif = initialIf; 54 55 for (int n=1; n<blocks.Count; n++) { 56 CodeIf cif = new CodeIf ((CodeExpression)conditions[n]); 57 cif.TrueBlock = (CodeBlock) blocks[n]; 58 CodeBlock cb = new CodeBlock (); 59 cb.Add (cif); 60 prevCif.FalseBlock = cb; 61 prevCif = cif; 62 } 63 64 initialIf.Generate (gen); 65 } 66 PrintCode(CodeWriter cp)67 public override void PrintCode (CodeWriter cp) 68 { 69 for (int n=0; n<blocks.Count; n++) { 70 if (n == 0) 71 cp.Write ("if ("); 72 else 73 cp.Write ("else if ("); 74 75 ((CodeExpression)conditions[n]).PrintCode (cp); 76 cp.Write (") {"); 77 cp.EndLine (); 78 cp.Indent (); 79 ((CodeBlock) blocks[n]).PrintCode (cp); 80 cp.Unindent (); 81 cp.BeginLine ().Write ("}"); 82 if (n < blocks.Count - 1) { 83 cp.EndLine (); 84 cp.BeginLine (); 85 } 86 } 87 } 88 } 89 } 90 #endif 91