}
static void
-emit_ptr_to_str_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv conv,
+emit_ptr_to_object_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv conv,
int usize, int msize, MonoMarshalSpec *mspec)
{
switch (conv) {
mono_mb_emit_icall (mb, mono_string_new_wrapper);
mono_mb_emit_byte (mb, CEE_STIND_I);
break;
+ case MONO_MARSHAL_CONV_STR_LPWSTR:
+ mono_mb_emit_byte (mb, CEE_LDLOC_1);
+ mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_byte (mb, CEE_LDIND_I);
+ mono_mb_emit_icall (mb, mono_string_from_utf16);
+ mono_mb_emit_byte (mb, CEE_STIND_I);
+ break;
case MONO_MARSHAL_CONV_OBJECT_STRUCT: {
MonoClass *klass = mono_class_from_mono_type (type);
int src_var, dst_var;
case MONO_MARSHAL_CONV_ARRAY_LPARRAY:
g_error ("Structure field of type %s can't be marshalled as LPArray", mono_class_from_mono_type (type)->name);
break;
- case MONO_MARSHAL_CONV_STR_LPWSTR:
case MONO_MARSHAL_CONV_STR_BSTR:
case MONO_MARSHAL_CONV_STR_ANSIBSTR:
case MONO_MARSHAL_CONV_STR_TBSTR:
}
static void
-emit_str_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv conv, int usize, int msize,
+emit_object_to_ptr_conv (MonoMethodBuilder *mb, MonoType *type, MonoMarshalConv conv, int usize, int msize,
MonoMarshalSpec *mspec)
{
int pos;
}
default:
if (to_object)
- emit_ptr_to_str_conv (mb, ftype, conv, usize, msize, info->fields [i].mspec);
+ emit_ptr_to_object_conv (mb, ftype, conv, usize, msize, info->fields [i].mspec);
else
- emit_str_to_ptr_conv (mb, ftype, conv, usize, msize, info->fields [i].mspec);
+ emit_object_to_ptr_conv (mb, ftype, conv, usize, msize, info->fields [i].mspec);
}
if (to_object) {
}
break;
case MONO_MARSHAL_CONV_STR_LPWSTR:
+ /* We assume this field points inside a MonoString */
+ break;
case MONO_MARSHAL_CONV_STR_LPSTR:
case MONO_MARSHAL_CONV_STR_LPTSTR:
case MONO_MARSHAL_CONV_STR_BSTR: