static CRITICAL_SECTION marshal_mutex;
/* Maps wrapper methods to the methods they wrap */
-static MonoGHashTable *wrapper_hash;
+static GHashTable *wrapper_hash;
static guint32 last_error_tls_id;
if (!module_initialized) {
module_initialized = TRUE;
InitializeCriticalSection (&marshal_mutex);
- MONO_GC_REGISTER_ROOT (wrapper_hash);
- wrapper_hash = mono_g_hash_table_new (NULL, NULL);
+ wrapper_hash = g_hash_table_new (NULL, NULL);
last_error_tls_id = TlsAlloc ();
register_icall (mono_marshal_string_to_utf16, "mono_marshal_string_to_utf16", "ptr obj", FALSE);
mono_mb_emit_byte (mb, CEE_ADD);
mono_mb_emit_byte (mb, CEE_LDIND_I);
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
- mono_mb_emit_byte (mb, CEE_MONO_LDPTR);
+ mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.transparent_proxy_class));
mono_mb_emit_byte (mb, branch_code);
pos = mb->pos;
mono_mb_emit_icall (mb, mono_string_new_wrapper);
mono_mb_emit_byte (mb, CEE_STIND_I);
break;
+ case MONO_MARSHAL_CONV_STR_BYVALWSTR:
+ mono_mb_emit_byte (mb, CEE_LDLOC_1);
+ mono_mb_emit_byte (mb, CEE_LDLOC_0);
+ mono_mb_emit_icall (mb, mono_string_from_utf16);
+ 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);
case MONO_MARSHAL_CONV_STR_ANSIBSTR:
case MONO_MARSHAL_CONV_STR_TBSTR:
case MONO_MARSHAL_CONV_ARRAY_SAVEARRAY:
- case MONO_MARSHAL_CONV_STR_BYVALWSTR:
default:
g_warning ("marshaling conversion %d not implemented", conv);
g_assert_not_reached ();
continue;
ntype = mono_type_to_unmanaged (ftype, info->fields [i].mspec, TRUE, klass->unicode, &conv);
-
+
if (last_field) {
msize = klass->instance_size - info->fields [i].field->offset;
usize = info->native_size - info->fields [i].offset;
/* Call DestroyStructure */
/* FIXME: Only do this if needed */
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
- mono_mb_emit_byte (mb, CEE_MONO_LDPTR);
+ mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass));
mono_mb_emit_ldloc (mb, struct_var);
mono_mb_emit_icall (mb, mono_struct_delete_old);
/* This does not acquire any locks */
res = mono_mb_create_method (mb, sig, max_stack);
g_hash_table_insert (cache, key, res);
- mono_g_hash_table_insert (wrapper_hash, res, key);
+ g_hash_table_insert (wrapper_hash, res, key);
}
LeaveCriticalSection (&marshal_mutex);
if (*res == NULL) {
/* This does not acquire any locks */
*res = mono_mb_create_method (mb, sig, max_stack);
- mono_g_hash_table_insert (wrapper_hash, *res, key);
+ g_hash_table_insert (wrapper_hash, *res, key);
}
LeaveCriticalSection (&marshal_mutex);
return wrapper;
EnterCriticalSection (&marshal_mutex);
- res = mono_g_hash_table_lookup (wrapper_hash, wrapper);
+ res = g_hash_table_lookup (wrapper_hash, wrapper);
LeaveCriticalSection (&marshal_mutex);
return res;
}
return mono_marshal_get_remoting_invoke (method);
}
-static gpointer
+G_GNUC_UNUSED static gpointer
mono_marshal_load_remoting_wrapper (MonoRealProxy *rp, MonoMethod *method)
{
if (rp->target_domain_id != -1)
if (!res) {
res = mono_mb_create_method (mb, csig, sig->param_count + 16);
g_hash_table_insert (cache, callsig, res);
- mono_g_hash_table_insert (wrapper_hash, res, callsig);
+ g_hash_table_insert (wrapper_hash, res, callsig);
}
LeaveCriticalSection (&marshal_mutex);
if (klass->delegate) {
g_assert (!t->byref);
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
- mono_mb_emit_byte (mb, CEE_MONO_LDPTR);
+ mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass));
mono_mb_emit_ldarg (mb, i);
mono_mb_emit_icall (mb, conv_to_icall (MONO_MARSHAL_CONV_FTN_DEL));
case MONO_TYPE_VALUETYPE:
klass = sig->ret->data.klass;
if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) ||
- klass->blittable || klass->enumtype)
+ klass->blittable || klass->enumtype) {
+ mono_mb_emit_byte (mb, CEE_STLOC_3);
break;
+ }
/* load pointer to returned value type */
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
g_assert (!t->byref);
mono_mb_emit_byte (mb, CEE_STLOC_0);
mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
- mono_mb_emit_byte (mb, CEE_MONO_LDPTR);
+ mono_mb_emit_byte (mb, CEE_MONO_CLASSCONST);
mono_mb_emit_i4 (mb, mono_mb_add_data (mb, klass));
mono_mb_emit_byte (mb, CEE_LDLOC_0);
mono_mb_emit_icall (mb, conv_to_icall (MONO_MARSHAL_CONV_FTN_DEL));
g_assert (klass != NULL);
+ mono_marshal_load_type_info (klass);
+
if (klass->str_to_ptr)
return klass->str_to_ptr;
g_assert (klass != NULL);
+ mono_marshal_load_type_info (klass);
+
if (klass->ptr_to_str)
return klass->ptr_to_str;
guint32 b1, b2, b3, b4;
guint32 copy_pos;
int aklass, vklass;
+ int array_slot_addr;
if (ret)
return ret;
/* void stelemref (void* array, int idx, void* value) */
sig->ret = &mono_defaults.void_class->byval_arg;
- sig->params [0] = &mono_defaults.int_class->byval_arg;
+ sig->params [0] = &mono_defaults.object_class->byval_arg;
sig->params [1] = &mono_defaults.int_class->byval_arg; /* this is a natural sized int */
- sig->params [2] = &mono_defaults.int_class->byval_arg;
+ sig->params [2] = &mono_defaults.object_class->byval_arg;
aklass = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
vklass = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+ array_slot_addr = mono_mb_add_local (mb, &mono_defaults.object_class->this_arg);
/*
the method:
- <check ABC>
+ <ldelema (bound check)>
if (!value)
goto store;
goto long;
store:
- array [idx] = value;
+ *array_slot_addr = value;
return;
long:
throw new ArrayTypeMismatchException ();
*/
- /* ABC */
+ /* ldelema (implicit bound check) */
mono_mb_emit_ldarg (mb, 0);
mono_mb_emit_ldarg (mb, 1);
mono_mb_emit_byte (mb, CEE_LDELEMA);
- mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.int_class));
- mono_mb_emit_byte (mb, CEE_POP);
+ mono_mb_emit_i4 (mb, mono_mb_add_data (mb, mono_defaults.object_class));
+ mono_mb_emit_stloc (mb, array_slot_addr);
/* if (!value) goto do_store */
mono_mb_emit_ldarg (mb, 2);
copy_pos = mb->pos;
/* do_store */
mono_mb_patch_addr (mb, b1, mb->pos - (b1 + 4));
- mono_mb_emit_ldarg (mb, 0);
- mono_mb_emit_ldarg (mb, 1);
+ mono_mb_emit_ldloc (mb, array_slot_addr);
mono_mb_emit_ldarg (mb, 2);
- mono_mb_emit_byte (mb, CEE_STELEM_I);
+ mono_mb_emit_byte (mb, CEE_STIND_REF);
mono_mb_emit_byte (mb, CEE_RET);
*/
gint32
mono_class_native_size (MonoClass *klass, guint32 *align)
-{
-
+{
if (!klass->marshal_info)
mono_marshal_load_type_info (klass);