}
static void
-emit_struct_conv_full (MonoMethodBuilder *mb, MonoClass *klass, gboolean to_object, gboolean unicode)
+emit_struct_conv (MonoMethodBuilder *mb, MonoClass *klass, gboolean to_object)
{
MonoMarshalType *info;
int i;
case MONO_TYPE_R8:
mono_mb_emit_ldloc (mb, 1);
mono_mb_emit_ldloc (mb, 0);
- if (ftype->type == MONO_TYPE_CHAR && !unicode) {
+ if (ntype == MONO_NATIVE_U1) {
if (to_object) {
mono_mb_emit_byte (mb, CEE_LDIND_U1);
mono_mb_emit_byte (mb, CEE_STIND_I2);
}
}
-static void
-emit_struct_conv (MonoMethodBuilder *mb, MonoClass *klass, gboolean to_object)
-{
- emit_struct_conv_full (mb, klass, to_object, TRUE);
-}
-
static void
emit_struct_free (MonoMethodBuilder *mb, MonoClass *klass, int struct_var)
{
case PINVOKE_ATTRIBUTE_CHAR_SET_UNICODE:
return TRUE;
case PINVOKE_ATTRIBUTE_CHAR_SET_AUTO:
+ default:
#ifdef TARGET_WIN32
return TRUE;
#else
return FALSE;
#endif
- default:
- return FALSE;
}
}
mono_mb_emit_stloc (mb, 1);
/* emit valuetype conversion code */
- emit_struct_conv_full (mb, eklass, FALSE, mono_pinvoke_is_unicode (m->piinfo));
+ emit_struct_conv (mb, eklass, FALSE);
}
mono_mb_emit_add_to_local (mb, index_var, 1);
mono_mb_emit_stloc (mb, 1);
/* emit valuetype conversion code */
- emit_struct_conv_full (mb, eklass, TRUE, mono_pinvoke_is_unicode (m->piinfo));
+ emit_struct_conv (mb, eklass, TRUE);
}
if (need_free) {
}
*conv = MONO_MARSHAL_CONV_BOOL_I4;
return MONO_NATIVE_BOOLEAN;
- case MONO_TYPE_CHAR: return unicode ? MONO_NATIVE_U2 : MONO_NATIVE_U1;
+ case MONO_TYPE_CHAR:
+ if (mspec) {
+ switch (mspec->native) {
+ case MONO_NATIVE_U2:
+ case MONO_NATIVE_U1:
+ return mspec->native;
+ default:
+ g_error ("cant marshal char to native type %02x", mspec->native);
+ }
+ }
+ return unicode ? MONO_NATIVE_U2 : MONO_NATIVE_U1;
case MONO_TYPE_I1: return MONO_NATIVE_I1;
case MONO_TYPE_U1: return MONO_NATIVE_U1;
case MONO_TYPE_I2: return MONO_NATIVE_I2;