2003-01-08 Miguel de Icaza <miguel@ximian.com>
authorMiguel de Icaza <miguel@gnome.org>
Wed, 8 Jan 2003 21:46:34 +0000 (21:46 -0000)
committerMiguel de Icaza <miguel@gnome.org>
Wed, 8 Jan 2003 21:46:34 +0000 (21:46 -0000)
* statement.cs: First populate the pinned variables, then emit the
statement, then clear the variables.  Before I was emitting the
code once for each fixed piece.

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

mcs/mcs/statement.cs

index ee79525176289158e2c5b8c6524495010a0e3176..d35d6f145cab96367e1a039036844b1954cdadcf 100755 (executable)
@@ -4257,7 +4257,8 @@ namespace Mono.CSharp {
                        ILGenerator ig = ec.ig;
 
                        bool is_ret = false;
-
+                       LocalBuilder [] clear_list = new LocalBuilder [data.Length];
+                       
                        for (int i = 0; i < data.Length; i++) {
                                VariableInfo vi = data [i].vi;
 
@@ -4270,14 +4271,7 @@ namespace Mono.CSharp {
                                        //
                                        data [i].expr.Emit (ec);
                                        ig.Emit (OpCodes.Stloc, vi.LocalBuilder);
-
-                                       is_ret = statement.Emit (ec);
-
-                                       // Clear the pinned variable.
-                                       ig.Emit (OpCodes.Ldc_I4_0);
-                                       ig.Emit (OpCodes.Conv_U);
-                                       ig.Emit (OpCodes.Stloc, vi.LocalBuilder);
-
+                                       clear_list [i] = vi.LocalBuilder;
                                        continue;
                                }
 
@@ -4291,14 +4285,7 @@ namespace Mono.CSharp {
                                        data [i].converted.Emit (ec);
                                        
                                        ig.Emit (OpCodes.Stloc, vi.LocalBuilder);
-
-                                       is_ret = statement.Emit (ec);
-                                       
-                                       // Clear the pinned variable.
-                                       ig.Emit (OpCodes.Ldc_I4_0);
-                                       ig.Emit (OpCodes.Conv_U);
-                                       ig.Emit (OpCodes.Stloc, vi.LocalBuilder);
-
+                                       clear_list [i] = vi.LocalBuilder;
                                        continue;
                                }
 
@@ -4308,6 +4295,7 @@ namespace Mono.CSharp {
                                if (data [i].expr.Type == TypeManager.string_type){
                                        LocalBuilder pinned_string = ig.DeclareLocal (TypeManager.string_type);
                                        TypeManager.MakePinned (pinned_string);
+                                       clear_list [i] = pinned_string;
                                        
                                        data [i].expr.Emit (ec);
                                        ig.Emit (OpCodes.Stloc, pinned_string);
@@ -4321,12 +4309,24 @@ namespace Mono.CSharp {
 
                                        converted.Emit (ec);
                                        ig.Emit (OpCodes.Stloc, vi.LocalBuilder);
-                                       
-                                       is_ret = statement.Emit (ec);
+                               }
+                       }
 
-                                       // Clear the pinned variable
+                       is_ret = statement.Emit (ec);
+
+                       //
+                       // Clear the pinned variable
+                       //
+                       for (int i = 0; i < data.Length; i++) {
+                               VariableInfo vi = data [i].vi;
+
+                               if (data [i].is_object || data [i].expr.Type.IsArray) {
+                                       ig.Emit (OpCodes.Ldc_I4_0);
+                                       ig.Emit (OpCodes.Conv_U);
+                                       ig.Emit (OpCodes.Stloc, clear_list [i]);
+                               } else if (data [i].expr.Type == TypeManager.string_type){
                                        ig.Emit (OpCodes.Ldnull);
-                                       ig.Emit (OpCodes.Stloc, pinned_string);
+                                       ig.Emit (OpCodes.Stloc, clear_list [i]);
                                }
                        }