}
class->size_inited = 1;
class->blittable = blittable;
+ mono_memory_barrier ();
+ class->fields_inited = 1;
return;
}
/*valuetypes can't be neither bigger than 1Mb or empty. */
if (class->valuetype && (class->instance_size <= 0 || class->instance_size > (0x100000 + sizeof (MonoObject))))
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+
+ mono_memory_barrier ();
+ class->fields_inited = 1;
}
/**
* Initializes the class->fields array of fields.
* Aquires the loader lock.
*/
-static void
+void
mono_class_setup_fields_locking (MonoClass *class)
{
+ /* This can be checked without locks */
+ if (class->fields_inited)
+ return;
mono_loader_lock ();
mono_class_setup_fields (class);
mono_loader_unlock ();
continue;
size = mono_type_size (field->type, &align);
+ align = class->packing_size ? MIN (class->packing_size, align): align;
class->min_align = MAX (align, class->min_align);
/*
real_size = MAX (real_size, size + field->offset);
}
class->instance_size = MAX (real_size, class->instance_size);
+ if (class->instance_size & (class->min_align - 1)) {
+ class->instance_size += class->min_align - 1;
+ class->instance_size &= ~(class->min_align - 1);
+ }
break;
}
*/
eclass = mono_class_from_mono_type (class->generic_class->context.class_inst->type_argv [0]);
original_rank = eclass->rank;
- eclass = eclass->element_class;
+ if (!eclass->rank)
+ eclass = eclass->element_class;
internal_enumerator = TRUE;
*is_enumerator = TRUE;
} else {
static MonoClass *
get_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar)
{
- int n = mono_generic_param_num (param);
+ int n = mono_generic_param_num (param) | ((guint32)param->serial << 16);
MonoImage *image = param->image;
GHashTable *ht;
static void
set_anon_gparam_class (MonoGenericParam *param, gboolean is_mvar, MonoClass *klass)
{
- int n = mono_generic_param_num (param);
+ int n = mono_generic_param_num (param) | ((guint32)param->serial << 16);
MonoImage *image = param->image;
GHashTable *ht;