2004-02-02 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Mon, 2 Feb 2004 15:34:05 +0000 (15:34 -0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 2 Feb 2004 15:34:05 +0000 (15:34 -0000)
* metadata.h: Add new marshalling conventions.

* marshal.c (mono_marshal_get_native_wrapper): Add support for unicode
stringbuilder marshalling. Fixes #53700.

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

mono/metadata/ChangeLog
mono/metadata/marshal.c
mono/metadata/marshal.h
mono/metadata/metadata.h

index b8393dff298377f07e48efe4d719fd02d412770e..53388a93a007256646b160b2c66ec7f6b4eacd54 100644 (file)
@@ -1,5 +1,10 @@
 2004-02-02  Zoltan Varga  <vargaz@freemail.hu>
 
+       * metadata.h: Add new marshalling conventions.
+
+       * marshal.c (mono_marshal_get_native_wrapper): Add support for unicode
+       stringbuilder marshalling. Fixes #53700.
+
        * reflection.h (MonoReflectionTypeBuilder): Add 'permissions' field.
 
        * reflection.c (mono_image_get_type_info): Save declarative security
index 02a63653756d233c12b231c9ffb244ac15e31e83..f4e30cf1bfcb6f8f9b1f7e221e5ef001f04e551f 100644 (file)
@@ -180,6 +180,23 @@ mono_string_utf8_to_builder (MonoStringBuilder *sb, char *text)
        g_free (ut);
 }
 
+void
+mono_string_utf16_to_builder (MonoStringBuilder *sb, gunichar2 *text)
+{
+       const gunichar2 *s;
+       guint32 len;
+
+       if (!sb || !text)
+               return;
+
+       g_assert (mono_string_chars (sb->str) == text);
+
+       for (len = 0; text [len] != 0; ++len)
+               ;
+
+       sb->length = len;
+}
+
 gpointer
 mono_string_builder_to_utf8 (MonoStringBuilder *sb)
 {
@@ -200,6 +217,15 @@ mono_string_builder_to_utf8 (MonoStringBuilder *sb)
        return res;
 }
 
+gpointer
+mono_string_builder_to_utf16 (MonoStringBuilder *sb)
+{
+       if (!sb)
+               return NULL;
+
+       return mono_string_chars (sb->str);
+}
+
 gpointer
 mono_string_to_ansibstr (MonoString *string_obj)
 {
@@ -3122,7 +3148,40 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
                                mono_mb_emit_ldarg (mb, argnum);
                                mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
                                mono_mb_emit_byte (mb, CEE_MONO_FUNC1);
-                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPSTR);
+
+                               if (spec) {
+                                       switch (spec->native) {
+                                       case MONO_NATIVE_LPWSTR:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPWSTR);
+                                               break;
+                                       case MONO_NATIVE_LPSTR:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPSTR);
+                                               break;
+                                       default: {
+                                               char *msg = g_strdup_printf ("stringbuilder marshalling conversion %d not implemented", spec->native);
+                                               MonoException *exc = mono_get_exception_not_implemented (msg);
+                                               g_warning (msg);
+                                               g_free (msg);
+                                               mono_raise_exception (exc);
+                                       }
+                                       }
+                               } else {
+                                       switch (piinfo->piflags & PINVOKE_ATTRIBUTE_CHAR_SET_MASK) {
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_ANSI:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPSTR);
+                                               break;
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_UNICODE:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPWSTR);
+                                               break;
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_AUTO:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPTSTR);
+                                               break;
+                                       default:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_SB_LPSTR);
+                                               break;                                  
+                                       }
+                               }
+
                                mono_mb_emit_stloc (mb, tmp_locals [i]);
                        } else {
                                mono_mb_emit_byte (mb, CEE_LDNULL);
@@ -3577,6 +3636,7 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
        /* we need to convert byref arguments back and free string arrays */
        for (i = 0; i < sig->param_count; i++) {
                MonoType *t = sig->params [i];
+               MonoMarshalSpec *spec = mspecs [i + 1];
                
                argnum = i + sig->hasthis;
 
@@ -3603,7 +3663,35 @@ mono_marshal_get_native_wrapper (MonoMethod *method)
                                mono_mb_emit_ldloc (mb, tmp_locals [i]);
                                mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
                                mono_mb_emit_byte (mb, CEE_MONO_PROC2);
-                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_SB);
+
+                               if (spec) {
+                                       switch (spec->native) {
+                                       case MONO_NATIVE_LPWSTR:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPWSTR_SB);
+                                               break;
+                                       case MONO_NATIVE_LPSTR:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_SB);
+                                               break;
+                                       default:
+                                               g_assert_not_reached ();
+                                       }
+                               } else {
+                                       switch (piinfo->piflags & PINVOKE_ATTRIBUTE_CHAR_SET_MASK) {
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_ANSI:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_SB);
+                                               break;
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_UNICODE:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPWSTR_SB);
+                                               break;
+                                       case PINVOKE_ATTRIBUTE_CHAR_SET_AUTO:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPTSTR_SB);
+                                               break;
+                                       default:
+                                               mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_SB);
+                                               break;                                  
+                                       }
+                               }
+
                                mono_mb_emit_ldloc (mb, tmp_locals [i]);
                                mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
                                mono_mb_emit_byte (mb, CEE_MONO_FREE);
index 5b0067a78d9057b34edd0eda9f7dc948b6e4d84c..9aacd38cdac7260f608396bc347179f8b44f13db 100644 (file)
@@ -46,9 +46,15 @@ mono_array_to_lparray (MonoArray *array);
 void
 mono_string_utf8_to_builder (MonoStringBuilder *sb, char *text);
 
+void
+mono_string_utf16_to_builder (MonoStringBuilder *sb, gunichar2 *text);
+
 gpointer
 mono_string_builder_to_utf8 (MonoStringBuilder *sb);
 
+gpointer
+mono_string_builder_to_utf16 (MonoStringBuilder *sb);
+
 gpointer
 mono_string_to_ansibstr (MonoString *string_obj);
 
index 8f252d2111bde43a6251ce4b1dd2cd8e9464eb07..238295ad29a0051455f40090a51c3e2ab2b6450e 100644 (file)
@@ -143,7 +143,11 @@ typedef enum {
        MONO_MARSHAL_CONV_STR_BYVALSTR,
        MONO_MARSHAL_CONV_STR_BYVALWSTR,
        MONO_MARSHAL_CONV_SB_LPSTR,
+       MONO_MARSHAL_CONV_SB_LPTSTR,
+       MONO_MARSHAL_CONV_SB_LPWSTR,
        MONO_MARSHAL_CONV_LPSTR_SB,
+       MONO_MARSHAL_CONV_LPTSTR_SB,
+       MONO_MARSHAL_CONV_LPWSTR_SB,
        MONO_MARSHAL_CONV_ARRAY_BYVALARRAY,
        MONO_MARSHAL_CONV_ARRAY_SAVEARRAY,
        MONO_MARSHAL_CONV_ARRAY_LPARRAY,