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