2003-01-10 Dietmar Maurer <dietmar@ximian.com>
authorDietmar Maurer <dietmar@mono-cvs.ximian.com>
Fri, 10 Jan 2003 16:18:13 +0000 (16:18 -0000)
committerDietmar Maurer <dietmar@mono-cvs.ximian.com>
Fri, 10 Jan 2003 16:18:13 +0000 (16:18 -0000)
* loader.c (mono_method_get_marshal_info): bug fix

* marshal.c (mono_marshal_get_ptr_to_struct): don't convert
structures with explicit layout

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

mono/metadata/ChangeLog
mono/metadata/loader.c
mono/metadata/marshal.c
mono/tests/Makefile.am

index 09faf21b8afb9d59857f913f2226e3051019941b..50df76d9ee90085b83e45b9206750a49bd51b0ac 100644 (file)
@@ -1,3 +1,9 @@
+2003-01-10  Dietmar Maurer  <dietmar@ximian.com>
+
+       * loader.c (mono_method_get_marshal_info): bug fix
+
+       * marshal.c (mono_marshal_get_ptr_to_struct): don't convert
+       structures with explicit layout
 
 Fri Jan 10 15:58:09 CET 2003 Paolo Molaro <lupus@ximian.com>
 
index 9168744a5e28de1301adc794c1d5bb2b90530519..c960d55db10fb9f729fd6de08f4e76b2a816919d 100644 (file)
@@ -606,9 +606,6 @@ mono_method_get_marshal_info (MonoMethod *method, MonoMarshalSpec **mspecs)
        MonoTableInfo *methodt;
        MonoTableInfo *paramt;
 
-       if (!method->signature->param_count)
-               return;
-
        for (i = 0; i < method->signature->param_count + 1; ++i)
                mspecs [i] = NULL;
 
index 502d2ad84d0c1f955a5f3791b12113c879415dca..f72f9b158bc60d5670a5d48d28519c6452c71471 100644 (file)
@@ -1757,7 +1757,8 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this)
                case MONO_TYPE_VALUETYPE:
                        
                        klass = sig->params [i]->data.klass;
-                       if (klass->blittable || klass->enumtype)
+                       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                           klass->blittable || klass->enumtype)
                                break;
 
                        tmp_locals [i] = mono_mb_add_local (mb, &klass->byval_arg);
@@ -1898,7 +1899,8 @@ mono_marshal_get_managed_wrapper (MonoMethod *method, MonoObject *this)
                case MONO_TYPE_VALUETYPE: {
                        int tmp;
                        klass = sig->ret->data.klass;
-                       if (klass->blittable || klass->enumtype)
+                       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                           klass->blittable || klass->enumtype)
                                break;
                        
                        /* load pointer to returned value type */
@@ -2099,7 +2101,9 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
                switch (t->type) {
                case MONO_TYPE_VALUETYPE:                       
                        klass = t->data.klass;
-                       if (klass->blittable || klass->enumtype)
+
+                       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                           klass->blittable || klass->enumtype)
                                break;
 
                        tmp_locals [i] = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
@@ -2329,7 +2333,8 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
                                continue;
        
                        klass = t->data.klass;
-                       if (klass->blittable || klass->enumtype)
+                       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                           klass->blittable || klass->enumtype)
                                break;
 
                        /* dst = argument */
@@ -2404,7 +2409,8 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
                                goto handle_enum;
                        }
 
-                       if (klass->blittable)
+                       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                           klass->blittable)
                                break;
 
                        tmp = mono_mb_add_local (mb, sig->ret);
@@ -2492,7 +2498,7 @@ mono_marshal_get_struct_to_ptr (MonoClass *klass)
 
        mb = mono_mb_new (klass, stoptr->name, MONO_WRAPPER_UNKNOWN);
 
-       if (klass->blittable) {
+       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) || klass->blittable) {
                mono_mb_emit_byte (mb, CEE_LDARG_1);
                mono_mb_emit_byte (mb, CEE_LDARG_0);
                mono_mb_emit_icon (mb, sizeof (MonoObject));
@@ -2554,7 +2560,7 @@ mono_marshal_get_ptr_to_struct (MonoClass *klass)
 
        mb = mono_mb_new (klass, ptostr->name, MONO_WRAPPER_UNKNOWN);
 
-       if (klass->blittable) {
+       if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) || klass->blittable) {
                mono_mb_emit_byte (mb, CEE_LDARG_1);
                mono_mb_emit_icon (mb, sizeof (MonoObject));
                mono_mb_emit_byte (mb, CEE_ADD);
index 6f8e8657d30444a1c27c7f72f0819c56568aabb4..65f2515d249ad8695391eca009abd94d91c482d4 100644 (file)
@@ -1,6 +1,7 @@
 
 TEST_PROG=../interpreter/mint
 JITTEST_PROG=../jit/mono
+#JITTEST_PROG=../../../mini/mini
 RUNTIME_ARGS=--config tests-config
 
 CSC=csc /unsafe