Author: gonzalo
Date: 2006-02-28 16:12:34 -0500 (Tue, 28 Feb 2006)
New Revision: 57430

Modified:
   branches/mono-1-1-13/mono/mono/metadata/ChangeLog
   branches/mono-1-1-13/mono/mono/metadata/marshal.c
   branches/mono-1-1-13/mono/mono/metadata/marshal.h
Log:
r57037 from HEAD

Modified: branches/mono-1-1-13/mono/mono/metadata/ChangeLog
===================================================================
--- branches/mono-1-1-13/mono/mono/metadata/ChangeLog   2006-02-28 20:58:45 UTC 
(rev 57429)
+++ branches/mono-1-1-13/mono/mono/metadata/ChangeLog   2006-02-28 21:12:34 UTC 
(rev 57430)
@@ -1,3 +1,9 @@
+2006-02-18  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * marshal.c (mono_marshal_asany): Fix marshalling of blittable formatted
+       classes and add support for [In, Out] attributes.
+       (mono_marshal_free_asany): Ditto. Fixes #77524.
+
 2006-02-28 Gonzalo Paniagua Javier <[EMAIL PROTECTED]>
 
        * file-io.c: fix typo in warning message.

Modified: branches/mono-1-1-13/mono/mono/metadata/marshal.c
===================================================================
--- branches/mono-1-1-13/mono/mono/metadata/marshal.c   2006-02-28 20:58:45 UTC 
(rev 57429)
+++ branches/mono-1-1-13/mono/mono/metadata/marshal.c   2006-02-28 21:12:34 UTC 
(rev 57430)
@@ -144,8 +144,8 @@
                register_icall (mono_array_to_lparray, "mono_array_to_lparray", 
"ptr object", FALSE);
                register_icall (mono_delegate_to_ftnptr, 
"mono_delegate_to_ftnptr", "ptr object", FALSE);
                register_icall (mono_ftnptr_to_delegate, 
"mono_ftnptr_to_delegate", "object ptr ptr", FALSE);
-               register_icall (mono_marshal_asany, "mono_marshal_asany", "ptr 
object int32", FALSE);
-               register_icall (mono_marshal_free_asany, 
"mono_marshal_free_asany", "void object ptr int32", FALSE);
+               register_icall (mono_marshal_asany, "mono_marshal_asany", "ptr 
object int32 int32", FALSE);
+               register_icall (mono_marshal_free_asany, 
"mono_marshal_free_asany", "void object ptr int32 int32", FALSE);
                register_icall (mono_marshal_alloc, "mono_marshal_alloc", "ptr 
int32", FALSE);
                register_icall (mono_marshal_free, "mono_marshal_free", "void 
ptr", FALSE);
                register_icall (mono_string_utf8_to_builder, 
"mono_string_utf8_to_builder", "void ptr ptr", FALSE);
@@ -4593,6 +4593,7 @@
                conv_arg = mono_mb_add_local (mb, 
&mono_defaults.int_class->byval_arg);
                mono_mb_emit_ldarg (mb, argnum);
                mono_mb_emit_icon (mb, encoding);
+               mono_mb_emit_icon (mb, t->attrs);
                mono_mb_emit_icall (mb, mono_marshal_asany);
                mono_mb_emit_stloc (mb, conv_arg);
                break;
@@ -4608,6 +4609,7 @@
                mono_mb_emit_ldarg (mb, argnum);
                mono_mb_emit_ldloc (mb, conv_arg);
                mono_mb_emit_icon (mb, encoding);
+               mono_mb_emit_icon (mb, t->attrs);
                mono_mb_emit_icall (mb, mono_marshal_free_asany);
                break;
        }
@@ -8410,7 +8412,7 @@
 }
 
 gpointer
-mono_marshal_asany (MonoObject *o, MonoMarshalNative string_encoding)
+mono_marshal_asany (MonoObject *o, MonoMarshalNative string_encoding, int 
param_attrs)
 {
        MonoType *t;
        MonoClass *klass;
@@ -8460,19 +8462,21 @@
                if ((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == 
TYPE_ATTRIBUTE_AUTO_LAYOUT)
                        break;
 
-               if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == 
TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
-                       klass->blittable || klass->enumtype)
+               if (klass->valuetype && (((klass->flags & 
TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
+                       klass->blittable || klass->enumtype))
                        return mono_object_unbox (o);
 
                res = mono_marshal_alloc (mono_class_native_size (klass, NULL));
 
-               method = mono_marshal_get_struct_to_ptr (o->vtable->klass);
+               if (!((param_attrs & PARAM_ATTRIBUTE_OUT) && !(param_attrs & 
PARAM_ATTRIBUTE_IN))) {
+                       method = mono_marshal_get_struct_to_ptr 
(o->vtable->klass);
 
-               pa [0] = o;
-               pa [1] = &res;
-               pa [2] = &delete_old;
+                       pa [0] = o;
+                       pa [1] = &res;
+                       pa [2] = &delete_old;
 
-               mono_runtime_invoke (method, NULL, pa, NULL);
+                       mono_runtime_invoke (method, NULL, pa, NULL);
+               }
 
                return res;
        }
@@ -8484,7 +8488,7 @@
 }
 
 void
-mono_marshal_free_asany (MonoObject *o, gpointer ptr, MonoMarshalNative 
string_encoding)
+mono_marshal_free_asany (MonoObject *o, gpointer ptr, MonoMarshalNative 
string_encoding, int param_attrs)
 {
        MonoType *t;
        MonoClass *klass;
@@ -8513,8 +8517,20 @@
                        klass->blittable || klass->enumtype)
                        break;
 
-               mono_struct_delete_old (klass, ptr);
+               if (param_attrs & PARAM_ATTRIBUTE_OUT) {
+                       MonoMethod *method = mono_marshal_get_ptr_to_struct 
(o->vtable->klass);
+                       gpointer pa [2];
 
+                       pa [0] = &ptr;
+                       pa [1] = o;
+
+                       mono_runtime_invoke (method, NULL, pa, NULL);
+               }
+
+               if (!((param_attrs & PARAM_ATTRIBUTE_OUT) && !(param_attrs & 
PARAM_ATTRIBUTE_IN))) {
+                       mono_struct_delete_old (klass, ptr);
+               }
+
                mono_marshal_free (ptr);
                break;
        }

Modified: branches/mono-1-1-13/mono/mono/metadata/marshal.h
===================================================================
--- branches/mono-1-1-13/mono/mono/metadata/marshal.h   2006-02-28 20:58:45 UTC 
(rev 57429)
+++ branches/mono-1-1-13/mono/mono/metadata/marshal.h   2006-02-28 21:12:34 UTC 
(rev 57430)
@@ -82,10 +82,10 @@
 mono_marshal_set_last_error (void);
 
 gpointer
-mono_marshal_asany (MonoObject *obj, MonoMarshalNative string_encoding);
+mono_marshal_asany (MonoObject *obj, MonoMarshalNative string_encoding, int 
param_attrs);
 
 void
-mono_marshal_free_asany (MonoObject *o, gpointer ptr, MonoMarshalNative 
string_encoding);
+mono_marshal_free_asany (MonoObject *o, gpointer ptr, MonoMarshalNative 
string_encoding, int param_attrs);
 
 /* method builder functions */
 

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

Reply via email to