2009-09-24 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 24 Sep 2009 14:31:59 +0000 (14:31 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 24 Sep 2009 14:31:59 +0000 (14:31 -0000)
* aot-compiler.c (add_wrappers): Generate PtrToStructure wrappers for more
structures.

svn path=/trunk/mono/; revision=142577

mono/mini/ChangeLog
mono/mini/aot-compiler.c

index 95b074141685bc086dfb4ee953a9dc4cd34768c7..3252a7cbad4c920ec0a51f94c57181f750f14965 100644 (file)
@@ -1,5 +1,8 @@
 2009-09-24  Zoltan Varga  <vargaz@gmail.com>
 
+       * aot-compiler.c (add_wrappers): Generate PtrToStructure wrappers for more
+       structures.
+
        * decompose.c (mono_decompose_vtype_opts): Avoid reading uninitialized memory
        in the VCALL decomposition code.
 
index 88e4123c1ba912ec09e0f695d6f345e56e6eae04..d75e9ee2525e6e24943c7ece914256ba5d79b519 100644 (file)
@@ -1708,6 +1708,49 @@ get_runtime_invoke_sig (MonoMethodSignature *sig)
        return mono_marshal_get_runtime_invoke (m, FALSE);
 }
 
+static gboolean
+can_marshal_struct (MonoClass *klass)
+{
+       MonoClassField *field;
+       gboolean can_marshal = TRUE;
+       gpointer iter = NULL;
+
+       /* Only allow a few field types to avoid asserts in the marshalling code */
+       while ((field = mono_class_get_fields (klass, &iter))) {
+               if ((field->type->attrs & FIELD_ATTRIBUTE_STATIC))
+                       continue;
+
+               switch (field->type->type) {
+               case MONO_TYPE_I4:
+               case MONO_TYPE_U4:
+               case MONO_TYPE_I1:
+               case MONO_TYPE_U1:
+               case MONO_TYPE_BOOLEAN:
+               case MONO_TYPE_I2:
+               case MONO_TYPE_U2:
+               case MONO_TYPE_CHAR:
+               case MONO_TYPE_I8:
+               case MONO_TYPE_U8:
+               case MONO_TYPE_I:
+               case MONO_TYPE_U:
+               case MONO_TYPE_PTR:
+               case MONO_TYPE_R4:
+               case MONO_TYPE_R8:
+               case MONO_TYPE_STRING:
+                       break;
+               case MONO_TYPE_VALUETYPE:
+                       if (!can_marshal_struct (mono_class_from_mono_type (field->type)))
+                               can_marshal = FALSE;
+                       break;
+               default:
+                       can_marshal = FALSE;
+                       break;
+               }
+       }
+
+       return can_marshal;
+}
+
 static void
 add_wrappers (MonoAotCompile *acfg)
 {
@@ -1945,38 +1988,9 @@ add_wrappers (MonoAotCompile *acfg)
                token = MONO_TOKEN_TYPE_DEF | (i + 1);
                klass = mono_class_get (acfg->image, token);
 
-               if (klass->valuetype && !klass->generic_container && ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT)) {
-                       gboolean can_marshal = TRUE;
-                       gpointer iter = NULL;
-                       MonoClassField *field;
-
-                       /* Only allow a few field types to avoid asserts in the marshalling code */
-                       while ((field = mono_class_get_fields (klass, &iter))) {
-                               switch (field->type->type) {
-                               case MONO_TYPE_I4:
-                               case MONO_TYPE_U4:
-                               case MONO_TYPE_I1:
-                               case MONO_TYPE_U1:
-                               case MONO_TYPE_BOOLEAN:
-                               case MONO_TYPE_I2:
-                               case MONO_TYPE_U2:
-                               case MONO_TYPE_CHAR:
-                               case MONO_TYPE_I8:
-                               case MONO_TYPE_U8:
-                               case MONO_TYPE_PTR:
-                               case MONO_TYPE_R4:
-                               case MONO_TYPE_R8:
-                                       break;
-                               default:
-                                       can_marshal = FALSE;
-                                       break;
-                               }
-                       }
-
-                       if (can_marshal) {
-                               add_method (acfg, mono_marshal_get_struct_to_ptr (klass));
-                               add_method (acfg, mono_marshal_get_ptr_to_struct (klass));
-                       }
+               if (klass->valuetype && !klass->generic_container && ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) != TYPE_ATTRIBUTE_AUTO_LAYOUT) && can_marshal_struct (klass)) {
+                       add_method (acfg, mono_marshal_get_struct_to_ptr (klass));
+                       add_method (acfg, mono_marshal_get_ptr_to_struct (klass));
                }
        }
 }