Author: zoltan
Date: 2007-07-05 16:14:13 -0400 (Thu, 05 Jul 2007)
New Revision: 81433
Modified:
trunk/mono/mono/metadata/ChangeLog
trunk/mono/mono/metadata/marshal.c
Log:
2007-07-05 Zoltan Varga <[EMAIL PROTECTED]>
* marshal.c (emit_marshal_string): When returning a string from managed
code,
allways make a copy even for unicode strings. Fixes #81990.
Modified: trunk/mono/mono/metadata/ChangeLog
===================================================================
--- trunk/mono/mono/metadata/ChangeLog 2007-07-05 20:02:04 UTC (rev 81432)
+++ trunk/mono/mono/metadata/ChangeLog 2007-07-05 20:14:13 UTC (rev 81433)
@@ -1,4 +1,8 @@
+2007-07-05 Zoltan Varga <[EMAIL PROTECTED]>
+ * marshal.c (emit_marshal_string): When returning a string from managed
code,
+ allways make a copy even for unicode strings. Fixes #81990.
+
Wed Jul 4 11:53:57 CEST 2007 Paolo Molaro <[EMAIL PROTECTED]>
* object.c: cleaned up mono_runtime_invoke_array () and fixed handling
Modified: trunk/mono/mono/metadata/marshal.c
===================================================================
--- trunk/mono/mono/metadata/marshal.c 2007-07-05 20:02:04 UTC (rev 81432)
+++ trunk/mono/mono/metadata/marshal.c 2007-07-05 20:14:13 UTC (rev 81433)
@@ -116,6 +116,9 @@
void *
mono_marshal_string_to_utf16 (MonoString *s);
+static void *
+mono_marshal_string_to_utf16_copy (MonoString *s);
+
static gpointer
mono_string_to_lpstr (MonoString *string_obj);
@@ -569,6 +572,7 @@
load_type_info_tls_id = TlsAlloc ();
register_icall (mono_marshal_string_to_utf16,
"mono_marshal_string_to_utf16", "ptr obj", FALSE);
+ register_icall (mono_marshal_string_to_utf16_copy,
"mono_marshal_string_to_utf16_copy", "ptr obj", FALSE);
register_icall (mono_string_to_utf16, "mono_string_to_utf16",
"ptr obj", FALSE);
register_icall (mono_string_from_utf16,
"mono_string_from_utf16", "obj ptr", FALSE);
register_icall (mono_string_new_wrapper,
"mono_string_new_wrapper", "obj ptr", FALSE);
@@ -6391,7 +6395,11 @@
break;
case MARSHAL_ACTION_MANAGED_CONV_RESULT:
- mono_mb_emit_icall (mb, conv_to_icall (conv));
+ if (conv_to_icall (conv) == mono_marshal_string_to_utf16)
+ /* We need to make a copy so the caller is able to free
it */
+ mono_mb_emit_icall (mb,
mono_marshal_string_to_utf16_copy);
+ else
+ mono_mb_emit_icall (mb, conv_to_icall (conv));
mono_mb_emit_stloc (mb, 3);
break;
@@ -9878,6 +9886,18 @@
return s ? mono_string_chars (s) : NULL;
}
+static void *
+mono_marshal_string_to_utf16_copy (MonoString *s)
+{
+ if (s == NULL) {
+ return NULL;
+ } else {
+ gunichar2 *res = mono_marshal_alloc (mono_string_length (s) *
2);
+ memcpy (res, mono_string_chars (s), mono_string_length (s) * 2);
+ return res;
+ }
+}
+
/**
* mono_marshal_set_last_error:
*
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches