Author: marek
Date: 2007-01-17 17:18:22 -0500 (Wed, 17 Jan 2007)
New Revision: 71233

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/expression.cs
Log:
2007-01-17  Marek Safar  <[EMAIL PROTECTED]>

        A fix for bug #80368, #80522
        * expression.cs (ArrayCreation.only_constant_initializers): Indicates
        whether array initializer contains constants only.
        (ArrayCreation.Emit): Use better formula to decide when
        are array initializers for static initialization.
        (ArrayCreation.EmitDynamicInitializers): When the array is small enough 
we
        have to emit even constants otherwise they are pre-initialized.

Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2007-01-17 22:10:46 UTC (rev 71232)
+++ trunk/mcs/mcs/ChangeLog     2007-01-17 22:18:22 UTC (rev 71233)
@@ -1,3 +1,13 @@
+2007-01-17  Marek Safar  <[EMAIL PROTECTED]>
+
+       A fix for bug #80368, #80522
+       * expression.cs (ArrayCreation.only_constant_initializers): Indicates
+       whether array initializer contains constants only.
+       (ArrayCreation.Emit): Use better formula to decide when
+       are array initializers for static initialization.
+       (ArrayCreation.EmitDynamicInitializers): When the array is small enough 
we
+       have to emit even constants otherwise they are pre-initialized.
+
 2007-01-17  Bill Holmes  <[EMAIL PROTECTED]>
            Raja R Harinath  <[EMAIL PROTECTED]>
 

Modified: trunk/mcs/mcs/expression.cs
===================================================================
--- trunk/mcs/mcs/expression.cs 2007-01-17 22:10:46 UTC (rev 71232)
+++ trunk/mcs/mcs/expression.cs 2007-01-17 22:18:22 UTC (rev 71233)
@@ -5938,6 +5938,7 @@
 
                // The number of constants in array initializers
                int const_initializers_count;
+               bool only_constant_initializers;
                
                public ArrayCreation (Expression requested_base_type, ArrayList 
exprs, string rank, ArrayList initializers, Location l)
                {
@@ -6016,6 +6017,7 @@
                        }
 
                        int child_bounds = -1;
+                       only_constant_initializers = true;
                        for (int i = 0; i < probe.Count; ++i) {
                                object o = probe [i];
                                if (o is ArrayList) {
@@ -6055,7 +6057,7 @@
                                                return false;
 
                                        // Initializers with the default values 
can be ignored
-                                       Constant c = tmp as Constant;
+                                       Constant c = conv as Constant;
                                        if (c != null) {
                                                if (c.IsDefaultInitializer 
(array_element_type)) {
                                                        conv = null;
@@ -6064,8 +6066,7 @@
                                                        
++const_initializers_count;
                                                }
                                        } else {
-                                               // Used to invalidate static 
initializer
-                                               const_initializers_count = 
int.MinValue;
+                                               only_constant_initializers = 
false;
                                        }
                                        
                                        array_data.Add (conv);
@@ -6441,7 +6442,7 @@
                //
                // This always expect the top value on the stack to be the array
                //
-               void EmitDynamicInitializers (EmitContext ec)
+               void EmitDynamicInitializers (EmitContext ec, bool 
emitConstants)
                {
                        ILGenerator ig = ec.ig;
                        int dims = bounds.Count;
@@ -6466,7 +6467,8 @@
 
                                Expression e = (Expression)array_data [i];
 
-                               if (e != null) {
+                               // Constant can be initialized via 
StaticInitializer
+                               if (e != null && !(!emitConstants && e is 
Constant)) {
                                        Type etype = e.Type;
 
                                        ig.Emit (OpCodes.Dup);
@@ -6554,17 +6556,18 @@
                        if (initializers == null)
                                return;
 
-                       // This is a treshold for static initializers
-                       // I tried to make more accurate but it seems to me 
that Array.Initialize is
-                       // always slower (managed -> unmanaged switch?)
-                       const int max_automatic_initializers = 200;
+                       // Emit static initializer for arrays which have 
contain more than 4 items and
+                       // the static initializer will initialize at least 25% 
of array values.
+                       // NOTE: const_initializers_count does not contain 
default constant values.
+                       if (const_initializers_count >= 4 && 
const_initializers_count * 4 > (array_data.Count) &&
+                               TypeManager.IsPrimitiveType 
(array_element_type)) {
+                               EmitStaticInitializers (ec);
 
-                       if (const_initializers_count > 
max_automatic_initializers && TypeManager.IsPrimitiveType (array_element_type)) 
{
-                               EmitStaticInitializers (ec);
-                               return;
-                       }
-                               
-                       EmitDynamicInitializers (ec);
+                               if (!only_constant_initializers)
+                                       EmitDynamicInitializers (ec, false);
+                       } else {
+                               EmitDynamicInitializers (ec, true);
+                       }                               
                }
 
                public override bool GetAttributableValue (Type valueType, out 
object value)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to