+ if (type->type == MONO_TYPE_ARRAY)
+ eclass = mono_class_from_mono_type (type->data.array->type);
+ else if (type->type == MONO_TYPE_SZARRAY) {
+ eclass = mono_class_from_mono_type (type->data.type);
+ } else {
+ g_assert_not_reached ();
+ }
+
+ if (eclass->valuetype)
+ esize = mono_class_instance_size (eclass) - sizeof (MonoObject);
+ else
+ esize = sizeof (gpointer);
+
+ /* create a new array */
+ mono_mb_emit_byte (mb, CEE_LDLOC_1);
+ mono_mb_emit_icon (mb, msize / esize);
+ mono_mb_emit_byte (mb, CEE_NEWARR);
+ mono_mb_emit_i4 (mb, mono_mb_add_data (mb, eclass));
+ mono_mb_emit_byte (mb, CEE_STIND_I);
+
+ /* copy the elements */
+ mono_mb_emit_byte (mb, CEE_LDLOC_1);
+ mono_mb_emit_byte (mb, CEE_LDIND_I);
+ mono_mb_emit_icon (mb, G_STRUCT_OFFSET (MonoArray, vector));
+ mono_mb_emit_byte (mb, CEE_ADD);
+ mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_icon (mb, usize);
+ mono_mb_emit_byte (mb, CEE_PREFIX1);
+ mono_mb_emit_byte (mb, CEE_CPBLK);
+
+ break;
+ }
+ case MONO_MARSHAL_CONV_STR_BYVALSTR:
+ mono_mb_emit_byte (mb, CEE_LDLOC_1);
+ mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_FUNC1);
+ mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_STR);
+ mono_mb_emit_byte (mb, CEE_STIND_I);
+ break;
+ case MONO_MARSHAL_CONV_STR_LPTSTR:
+ case MONO_MARSHAL_CONV_STR_LPSTR:
+ 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_byte (mb, MONO_CUSTOM_PREFIX);
+ mono_mb_emit_byte (mb, CEE_MONO_FUNC1);
+ mono_mb_emit_byte (mb, MONO_MARSHAL_CONV_LPSTR_STR);
+ mono_mb_emit_byte (mb, CEE_STIND_I);
+ 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:
+ case MONO_MARSHAL_CONV_ARRAY_SAVEARRAY:
+ case MONO_MARSHAL_CONV_ARRAY_LPARRAY:
+ case MONO_MARSHAL_CONV_STR_BYVALWSTR:
+ case MONO_MARSHAL_CONV_BOOL_VARIANTBOOL:
+ default:
+ g_warning ("marshalling conversion %d not implemented", conv);
+ g_assert_not_reached ();
+ }