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