2009-02-19 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 19 Feb 2009 15:03:40 +0000 (15:03 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 19 Feb 2009 15:03:40 +0000 (15:03 -0000)
        * CodeTryBlock.cs : new statement support.

        * System.ServiceModel.dll.sources,
          net_2_1_raw_System.ServiceModel.dll.sources :
          added CodeTryBlock.cs.

svn path=/trunk/mcs/; revision=127414

mcs/class/System.ServiceModel/ChangeLog
mcs/class/System.ServiceModel/Mono.CodeGeneration/ChangeLog
mcs/class/System.ServiceModel/Mono.CodeGeneration/CodeTryBlock.cs [new file with mode: 0644]
mcs/class/System.ServiceModel/System.ServiceModel.dll.sources
mcs/class/System.ServiceModel/net_2_1_raw_System.ServiceModel.dll.sources

index c92b5fcb9bf3c6e14f123ddc6dbc19f5f7f438cd..b316dca564e706716a8718ff0249b9398b4c5768 100755 (executable)
@@ -1,3 +1,9 @@
+2009-02-19  Astushi Enomoto  <atsushi@ximian.com>
+
+       * System.ServiceModel.dll.sources,
+         net_2_1_raw_System.ServiceModel.dll.sources :
+         added CodeTryBlock.cs.
+
 2009-01-22  Astushi Enomoto  <atsushi@ximian.com>
 
        * net_2_1_raw_System.ServiceModel.dll.sources :
index dc0df226e09a26f87ad033c09fd7b76ab71ebc89..dd91a4c2ff65072946b9acca88a7951cffdf1cbe 100755 (executable)
@@ -1,3 +1,7 @@
+2009-02-19  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * CodeTryBlock.cs : new statement support.
+
 2009-02-19  Atsushi Enomoto  <atsushi@ximian.com>
 
        * CodeCast.cs : fix PrintCode() for no-conversion case.
diff --git a/mcs/class/System.ServiceModel/Mono.CodeGeneration/CodeTryBlock.cs b/mcs/class/System.ServiceModel/Mono.CodeGeneration/CodeTryBlock.cs
new file mode 100644 (file)
index 0000000..3414e32
--- /dev/null
@@ -0,0 +1,125 @@
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// Copyright (C) 2009 Novell, Inc
+//
+
+using System;
+using System.Collections;
+#if NET_2_0
+using System.Collections.Generic;
+#else
+using System.Collections.Specialized;
+#endif
+using System.Reflection;
+using System.Reflection.Emit;
+
+#if NET_2_0
+using DictionaryEntry = System.Collections.Generic.KeyValuePair<
+               Mono.CodeGeneration.CodeVariableDeclaration,
+               Mono.CodeGeneration.CodeBlock>;
+using ArrayList = System.Collections.Generic.List<
+       System.Collections.Generic.KeyValuePair<
+               Mono.CodeGeneration.CodeVariableDeclaration,
+               Mono.CodeGeneration.CodeBlock>>;
+#endif
+
+namespace Mono.CodeGeneration
+{
+       public class CodeTry: CodeStatement
+       {
+               CodeExpression condition;
+               CodeBlock tryBlock, finallyBlock;
+               ArrayList catchBlocks = new ArrayList ();
+               
+               public CodeTry ()
+               {
+                       tryBlock = new CodeBlock ();
+                       catchBlocks = new ArrayList ();
+                       finallyBlock = new CodeBlock ();
+               }
+               
+               public override void Generate (ILGenerator gen)
+               {
+                       gen.BeginExceptionBlock ();
+                       tryBlock.Generate (gen);
+                       foreach (DictionaryEntry de in catchBlocks) {
+                               CodeVariableDeclaration vd = (CodeVariableDeclaration) de.Key;
+                               gen.BeginCatchBlock (vd.Variable.Type);
+                               if (vd.Variable.Name.Length > 0) {
+                                       vd.Generate (gen);
+                                       // FIXME: assign exception to this local declaration
+                               }
+                               ((CodeBlock) de.Value).Generate (gen);
+                       }
+                       if (!finallyBlock.IsEmpty) {
+                               gen.BeginFinallyBlock ();
+                               finallyBlock.Generate (gen);
+                       }
+                       gen.EndExceptionBlock ();
+               }
+                               
+               public override void PrintCode (CodeWriter cp)
+               {
+                       if (tryBlock == null) return;
+                       
+                       cp.Write ("try {");
+                       cp.Indent ();
+                       condition.PrintCode (cp);
+                       cp.Unindent ();
+                       foreach (DictionaryEntry de in catchBlocks) {
+                               CodeVariableDeclaration vd = (CodeVariableDeclaration) de.Key;
+                               cp.Write ("} catch (");
+                               if (vd.Variable.Name.Length > 0)
+                                       vd.PrintCode (cp);
+                               else
+                                       cp.Write (vd.Variable.Type.FullName);
+                               cp.Write (") {");
+                               cp.Indent ();
+                               ((CodeBlock) de.Value).PrintCode (cp);
+                               cp.Unindent ();
+                       }
+                       if (!finallyBlock.IsEmpty) {
+                               cp.Write ("} finally {");
+                               cp.Indent ();
+                               finallyBlock.PrintCode (cp);
+                               cp.Unindent ();
+                       }
+                       cp.Write ("}");
+               }
+               
+               public CodeBlock TryBlock
+               {
+                       get { return tryBlock; }
+                       set { tryBlock = value; }
+               }
+
+               public ArrayList CatchBlocks
+               {
+                       get { return catchBlocks; }
+               }
+               
+               public CodeBlock FinallyBlock
+               {
+                       get { return finallyBlock; }
+                       set { finallyBlock = value; }
+               }
+       }
+}
index 434f7cf832e23d7e9dab0cff8efc24d85aba3616..8e76d4643584515a41a5a4033f7d61026c21088c 100755 (executable)
@@ -41,6 +41,7 @@ Mono.CodeGeneration/CodePropertyReference.cs
 Mono.CodeGeneration/CodeReturn.cs
 Mono.CodeGeneration/CodeSelect.cs
 Mono.CodeGeneration/CodeSelfIncrement.cs
+Mono.CodeGeneration/CodeTryBlock.cs
 Mono.CodeGeneration/CodeUnaryOperation.cs
 Mono.CodeGeneration/CodeValueReference.cs
 Mono.CodeGeneration/CodeVariableDeclaration.cs
index 3c1165671ea4f3837ff8f6fb06c3f49ba13ef262..d44e554434625c2260e344aaae215db261a35b84 100755 (executable)
@@ -40,6 +40,7 @@ Mono.CodeGeneration/CodeProperty.cs
 Mono.CodeGeneration/CodePropertyReference.cs
 Mono.CodeGeneration/CodeReturn.cs
 Mono.CodeGeneration/CodeSelect.cs
+Mono.CodeGeneration/CodeTryBlock.cs
 Mono.CodeGeneration/CodeSelfIncrement.cs
 Mono.CodeGeneration/CodeUnaryOperation.cs
 Mono.CodeGeneration/CodeValueReference.cs