enclosing = mono_class_from_typeref_checked (image, MONO_TOKEN_TYPE_REF | idx, error);
return_val_if_nok (error, NULL);
- if (enclosing->nested_classes_inited && enclosing->ext) {
+ MonoClassExt *ext = mono_class_get_ext (enclosing);
+ if (enclosing->nested_classes_inited && ext) {
/* Micro-optimization: don't scan the metadata tables if enclosing is already inited */
- for (tmp = enclosing->ext->nested_classes; tmp; tmp = tmp->next) {
+ for (tmp = ext->nested_classes; tmp; tmp = tmp->next) {
res = (MonoClass *)tmp->data;
if (strcmp (res->name, name) == 0)
return res;
{
MonoGenericContainer *container = NULL;
MonoImage *m = klass->image;
- const int top = klass->field.count;
+ const int top = mono_class_get_field_count (klass);
int i, first_field_idx;
g_assert (klass->enumtype);
mono_class_setup_basic_field_info (gtd);
mono_loader_lock ();
- klass->field.count = gtd->field.count;
+ mono_class_set_field_count (klass, mono_class_get_field_count (gtd));
mono_loader_unlock ();
}
- top = klass->field.count;
+ top = mono_class_get_field_count (klass);
fields = (MonoClassField *)mono_class_alloc0 (klass, sizeof (MonoClassField) * top);
}
mono_class_setup_basic_field_info (klass);
- top = klass->field.count;
+ top = mono_class_get_field_count (klass);
if (gtd) {
mono_class_setup_fields (gtd);
mono_class_layout_fields (MonoClass *klass, int base_instance_size, int packing_size, gboolean sre)
{
int i;
- const int top = klass->field.count;
+ const int top = mono_class_get_field_count (klass);
guint32 layout = mono_class_get_flags (klass) & TYPE_ATTRIBUTE_LAYOUT_MASK;
guint32 pass, passes, real_size;
gboolean gc_aware_layout = FALSE;
return;
/* The + 1 makes this always non-NULL to pass the check in mono_class_setup_methods () */
- count = gklass->method.count;
+ count = mono_class_get_method_count (gklass);
methods = (MonoMethod **)mono_class_alloc0 (klass, sizeof (MonoMethod*) * (count + 1));
for (i = 0; i < count; i++) {
if (klass->rank == 1 && klass->element_class->rank) {
jagged_ctor = TRUE;
- klass->method.count ++;
+ count ++;
}
if (klass->interface_count) {
MonoError error;
int first_idx = mono_class_get_first_method_idx (klass);
- count = klass->method.count;
+ count = mono_class_get_method_count (klass);
methods = (MonoMethod **)mono_class_alloc (klass, sizeof (MonoMethod*) * count);
for (i = 0; i < count; ++i) {
int idx = mono_metadata_translate_token_index (klass->image, MONO_TABLE_METHOD, first_idx + i + 1);
mono_image_lock (klass->image);
if (!klass->methods) {
- klass->method.count = count;
+ mono_class_set_method_count (klass, count);
/* Needed because of the double-checking locking pattern */
mono_memory_barrier ();
mono_class_setup_methods (klass);
if (mono_class_has_failure (klass)) /*FIXME do proper error handling*/
return NULL;
- g_assert (index >= 0 && index < klass->method.count);
+ g_assert (index >= 0 && index < mono_class_get_method_count (klass));
return klass->methods [index];
}
}
mono_class_get_inflated_method (MonoClass *klass, MonoMethod *method)
{
MonoClass *gklass = mono_class_get_generic_class (klass)->container_class;
- int i;
+ int i, mcount;
g_assert (method->klass == gklass);
mono_class_setup_methods (gklass);
g_assert (!mono_class_has_failure (gklass)); /*FIXME do proper error handling*/
- for (i = 0; i < gklass->method.count; ++i) {
+ mcount = mono_class_get_method_count (gklass);
+ for (i = 0; i < mcount; ++i) {
if (gklass->methods [i] == method) {
if (klass->methods) {
return klass->methods [i];
guint32 last;
int first, count;
- if (klass->ext && klass->ext->properties)
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (ext && ext->properties)
return;
if (mono_class_is_ginst (klass)) {
if (mono_class_set_type_load_failure_causedby_class (klass, gklass, "Generic type definition failed to load"))
return;
- properties = mono_class_new0 (klass, MonoProperty, gklass->ext->property.count + 1);
+ MonoClassExt *gext = mono_class_get_ext (gklass);
+ properties = mono_class_new0 (klass, MonoProperty, gext->property.count + 1);
- for (i = 0; i < gklass->ext->property.count; i++) {
+ for (i = 0; i < gext->property.count; i++) {
MonoError error;
MonoProperty *prop = &properties [i];
- *prop = gklass->ext->properties [i];
+ *prop = gext->properties [i];
if (prop->get)
prop->get = mono_class_inflate_generic_method_full_checked (
prop->parent = klass;
}
- first = gklass->ext->property.first;
- count = gklass->ext->property.count;
+ first = gext->property.first;
+ count = gext->property.count;
} else {
first = mono_metadata_properties_from_typedef (klass->image, mono_metadata_token_index (klass->type_token) - 1, &last);
count = last - first;
}
mono_class_alloc_ext (klass);
+ ext = mono_class_get_ext (klass);
mono_image_lock (klass->image);
- if (klass->ext->properties) {
+ if (ext->properties) {
/* We leak 'properties' which was allocated from the image mempool */
mono_image_unlock (klass->image);
return;
}
- klass->ext->property.first = first;
- klass->ext->property.count = count;
+ ext->property.first = first;
+ ext->property.count = count;
/* Flush any pending writes as we do double checked locking on klass->ext->properties */
mono_memory_barrier ();
/* Leave this assignment as the last op in the function */
- klass->ext->properties = properties;
+ ext->properties = properties;
mono_image_unlock (klass->image);
}
guint32 last;
MonoEvent *events;
- if (klass->ext && klass->ext->events)
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (ext && ext->events)
return;
if (mono_class_is_ginst (klass)) {
if (mono_class_set_type_load_failure_causedby_class (klass, gklass, "Generic type definition failed to load"))
return;
- first = gklass->ext->event.first;
- count = gklass->ext->event.count;
+ MonoClassExt *gext = mono_class_get_ext (gklass);
+ first = gext->event.first;
+ count = gext->event.count;
events = mono_class_new0 (klass, MonoEvent, count);
for (i = 0; i < count; i++) {
MonoError error;
MonoEvent *event = &events [i];
- MonoEvent *gevent = &gklass->ext->events [i];
+ MonoEvent *gevent = &gext->events [i];
mono_error_init (&error); //since we do conditional calls, we must ensure the default value is ok
}
mono_class_alloc_ext (klass);
+ ext = mono_class_get_ext (klass);
mono_image_lock (klass->image);
- if (klass->ext->events) {
+ if (ext->events) {
mono_image_unlock (klass->image);
return;
}
- klass->ext->event.first = first;
- klass->ext->event.count = count;
+ ext->event.first = first;
+ ext->event.count = count;
/* Flush any pending writes as we do double checked locking on klass->ext.events */
mono_memory_barrier ();
/* Leave this assignment as the last op in the function */
- klass->ext->events = events;
+ ext->events = events;
mono_image_unlock (klass->image);
}
printf (" [%03d][UUID %03d][SLOT %03d][SIZE %03d] interface %s.%s\n", i,
klass->interfaces_packed [i]->interface_id,
klass->interface_offsets_packed [i],
- klass->interfaces_packed [i]->method.count,
+ mono_class_get_method_count (klass->interfaces_packed [i]),
klass->interfaces_packed [i]->name_space,
klass->interfaces_packed [i]->name );
printf ("Interface flags: ");
printf (" [%03d][UUID %03d][SLOT %03d][SIZE %03d] interface %s.%s\n", i,
ic->interface_id,
mono_class_interface_offset (klass, ic),
- ic->method.count,
+ mono_class_get_method_count (ic),
ic->name_space,
ic->name );
}
static int
count_virtual_methods (MonoClass *klass)
{
- int i, count = 0;
+ int i, mcount, vcount = 0;
guint32 flags;
klass = mono_class_get_generic_type_definition (klass); /*We can find this information by looking at the GTD*/
if (mono_class_has_failure (klass))
return -1;
- for (i = 0; i < klass->method.count; ++i) {
+ mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i) {
flags = klass->methods [i]->flags;
if (flags & METHOD_ATTRIBUTE_VIRTUAL)
- ++count;
+ ++vcount;
}
} else {
int first_idx = mono_class_get_first_method_idx (klass);
- for (i = 0; i < klass->method.count; ++i) {
+ mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i) {
flags = mono_metadata_decode_table_row_col (klass->image, MONO_TABLE_METHOD, first_idx + i, MONO_METHOD_FLAGS);
if (flags & METHOD_ATTRIBUTE_VIRTUAL)
- ++count;
+ ++vcount;
}
}
- return count;
+ return vcount;
}
static int
int num_array_interfaces;
int is_enumerator = FALSE;
+ mono_loader_lock ();
+
mono_class_setup_supertypes (klass);
/*
* get the implicit generic interfaces for either the arrays or for System.Array/InternalEnumerator<T>
ifaces_array = g_new0 (GPtrArray *, klass->idepth);
for (j = 0; j < klass->idepth; j++) {
k = klass->supertypes [j];
+ g_assert (k);
num_ifaces += k->interface_count;
for (i = 0; i < k->interface_count; i++) {
ic = k->interfaces [i];
}
/* Publish the data */
- mono_loader_lock ();
-
klass->max_interface_id = max_iid;
/*
* We might get called multiple times:
klass->interface_bitmap = bitmap;
#endif
}
+end:
mono_loader_unlock ();
-end:
g_free (interfaces_full);
g_free (interface_offsets_full);
g_free (array_interfaces);
static void
mono_class_verify_vtable (MonoClass *klass)
{
- int i;
+ int i, count;
char *full_name = mono_type_full_name (&klass->byval_arg);
printf ("*** Verifying VTable of class '%s' \n", full_name);
if (!klass->methods)
return;
- for (i = 0; i < klass->method.count; ++i) {
+ count = mono_class_method_count (klass);
+ for (i = 0; i < count; ++i) {
MonoMethod *cm = klass->methods [i];
int slot;
#endif
static void
-print_unimplemented_interface_method_info (MonoClass *klass, MonoClass *ic, MonoMethod *im, int im_slot, MonoMethod **overrides, int onum) {
- int index;
+print_unimplemented_interface_method_info (MonoClass *klass, MonoClass *ic, MonoMethod *im, int im_slot, MonoMethod **overrides, int onum)
+{
+ int index, mcount;
char *method_signature;
char *type_name;
g_free (name);
return;
}
- for (index = 0; index < klass->method.count; ++index) {
+ mcount = mono_class_get_method_count (klass);
+ for (index = 0; index < mcount; ++index) {
MonoMethod *cm = klass->methods [index];
method_signature = mono_signature_get_desc (mono_method_signature (cm), TRUE);
} else if (ifaces) {
for (i = 0; i < ifaces->len; i++) {
MonoClass *ic = (MonoClass *)g_ptr_array_index (ifaces, i);
- max_vtsize += ic->method.count;
+ max_vtsize += mono_class_get_method_count (ic);
}
g_ptr_array_free (ifaces, TRUE);
ifaces = NULL;
cur_slot = klass->parent->vtable_size;
}
- max_vtsize += klass->method.count;
+ max_vtsize += mono_class_get_method_count (klass);
/*Array have a slot for stelemref*/
if (mono_class_need_stelemref_method (klass)) {
/* Have to set method->slot for abstract virtual methods */
if (klass->methods && gklass->methods) {
- for (i = 0; i < klass->method.count; ++i)
+ int mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i)
if (klass->methods [i]->slot == -1)
klass->methods [i]->slot = gklass->methods [i]->slot;
}
mono_class_setup_methods (parent_interface); /*FIXME Just kill this whole chunk of dead code*/
TRACE_INTERFACE_VTABLE (printf (" +++ Inheriting interface %s.%s\n", parent_interface->name_space, parent_interface->name));
- for (j = 0; j < parent_interface->method.count && !mono_class_has_failure (klass); j++) {
+ int mcount = mono_class_get_method_count (parent_interface);
+ for (j = 0; j < mcount && !mono_class_has_failure (klass); j++) {
vtable [interface_offset + j] = parent->vtable [parent_interface_offset + j];
TRACE_INTERFACE_VTABLE (printf (" --- Inheriting: [%03d][(%03d)+(%03d)] => [%03d][(%03d)+(%03d)]\n",
parent_interface_offset + j, parent_interface_offset, j,
}
// Loop on all interface methods...
- for (im_index = 0; im_index < ic->method.count; im_index++) {
+ int mcount = mono_class_get_method_count (ic);
+ for (im_index = 0; im_index < mcount; im_index++) {
MonoMethod *im = ic->methods [im_index];
int im_slot = ic_offset + im->slot;
MonoMethod *override_im = (override_map != NULL) ? (MonoMethod *)g_hash_table_lookup (override_map, im) : NULL;
ic = klass->interfaces_packed [i];
ic_offset = mono_class_interface_offset (klass, ic);
- for (im_index = 0; im_index < ic->method.count; im_index++) {
+ int mcount = mono_class_get_method_count (ic);
+ for (im_index = 0; im_index < mcount; im_index++) {
MonoMethod *im = ic->methods [im_index];
int im_slot = ic_offset + im->slot;
return -1;
if (method->slot == -1) {
MonoClass *gklass;
- int i;
+ int i, mcount;
if (!mono_class_is_ginst (method->klass)) {
g_assert (method->is_inflated);
gklass = mono_class_get_generic_class (method->klass)->container_class;
mono_class_setup_methods (method->klass);
g_assert (method->klass->methods);
- for (i = 0; i < method->klass->method.count; ++i) {
+ mcount = mono_class_get_method_count (method->klass);
+ for (i = 0; i < mcount; ++i) {
if (method->klass->methods [i] == method)
break;
}
- g_assert (i < method->klass->method.count);
+ g_assert (i < mcount);
g_assert (gklass->methods);
method->slot = gklass->methods [i]->slot;
}
static int
generic_array_methods (MonoClass *klass)
{
- int i, count_generic = 0;
+ int i, count_generic = 0, mcount;
GList *list = NULL, *tmp;
if (generic_array_method_num)
return generic_array_method_num;
mono_class_setup_methods (klass->parent); /*This is setting up System.Array*/
g_assert (!mono_class_has_failure (klass->parent)); /*So hitting this assert is a huge problem*/
- for (i = 0; i < klass->parent->method.count; i++) {
+ mcount = mono_class_get_method_count (klass->parent);
+ for (i = 0; i < mcount; i++) {
MonoMethod *m = klass->parent->methods [i];
if (!strncmp (m->name, "InternalArray__", 15)) {
count_generic++;
if (mono_class_has_failure (klass))
goto leave;
- for (i = 0; i < klass->method.count; ++i) {
+ int mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i) {
MonoMethod *method = klass->methods [i];
if ((method->flags & METHOD_ATTRIBUTE_SPECIAL_NAME) &&
(strcmp (".cctor", method->name) == 0)) {
mono_stats.initialized_class_count++;
- if (mono_class_is_ginst (klass) && !mono_class_get_generic_class (klass)->is_dynamic) {
- MonoClass *gklass = mono_class_get_generic_class (klass)->container_class;
-
+ if (mono_class_is_ginst (klass) && !mono_class_get_generic_class (klass)->is_dynamic)
mono_stats.generic_class_count++;
- klass->method = gklass->method;
- klass->field = gklass->field;
- }
-
if (mono_class_is_ginst (klass) || image_is_dynamic (klass->image) || !klass->type_token || (has_cached_info && !cached_info.has_nested_classes))
klass->nested_classes_inited = TRUE;
klass->ghcimpl = ghcimpl;
klass->has_finalize_inited = TRUE;
}
if (klass->rank)
- klass->method.count = array_method_count;
+ mono_class_set_method_count (klass, array_method_count);
mono_loader_unlock ();
locked = FALSE;
* - supertypes: array of classes: each element has a class in the hierarchy
* starting from @class up to System.Object
*
- * LOCKING: This function is atomic, in case of contention we waste memory.
+ * LOCKING: Acquires the loader lock.
*/
void
mono_class_setup_supertypes (MonoClass *klass)
{
- int ms;
+ int ms, idepth;
MonoClass **supertypes;
mono_atomic_load_acquire (supertypes, MonoClass **, &klass->supertypes);
if (klass->parent && !klass->parent->supertypes)
mono_class_setup_supertypes (klass->parent);
if (klass->parent)
- klass->idepth = klass->parent->idepth + 1;
+ idepth = klass->parent->idepth + 1;
else
- klass->idepth = 1;
+ idepth = 1;
- ms = MAX (MONO_DEFAULT_SUPERTABLE_SIZE, klass->idepth);
+ ms = MAX (MONO_DEFAULT_SUPERTABLE_SIZE, idepth);
supertypes = (MonoClass **)mono_class_alloc0 (klass, sizeof (MonoClass *) * ms);
if (klass->parent) {
- CHECKED_METADATA_WRITE_PTR ( supertypes [klass->idepth - 1] , klass );
+ CHECKED_METADATA_WRITE_PTR ( supertypes [idepth - 1] , klass );
int supertype_idx;
for (supertype_idx = 0; supertype_idx < klass->parent->idepth; supertype_idx++)
CHECKED_METADATA_WRITE_PTR ( supertypes [0] , klass );
}
- CHECKED_METADATA_WRITE_PTR_ATOMIC ( klass->supertypes , supertypes );
+ mono_memory_barrier ();
+
+ mono_loader_lock ();
+ klass->idepth = idepth;
+ /* Needed so idepth is visible before supertypes is set */
+ mono_memory_barrier ();
+ klass->supertypes = supertypes;
+ mono_loader_unlock ();
}
static gboolean
if (cols [MONO_TYPEDEF_FIELD_LIST] &&
cols [MONO_TYPEDEF_FIELD_LIST] <= image->tables [MONO_TABLE_FIELD].rows)
- klass->field.count = field_last - first_field_idx;
- else
- klass->field.count = 0;
-
+ mono_class_set_field_count (klass, field_last - first_field_idx);
if (cols [MONO_TYPEDEF_METHOD_LIST] <= image->tables [MONO_TABLE_METHOD].rows)
- klass->method.count = method_last - first_method_idx;
- else
- klass->method.count = 0;
+ mono_class_set_method_count (klass, method_last - first_method_idx);
/* reserve space to store vector pointer in arrays */
if (mono_is_corlib_image (image) && !strcmp (nspace, "System") && !strcmp (name, "Array")) {
klass->instance_size += 2 * sizeof (gpointer);
- g_assert (klass->field.count == 0);
+ g_assert (mono_class_get_field_count (klass) == 0);
}
if (klass->enumtype) {
klass->image = gklass->image;
klass->type_token = gklass->type_token;
- klass->field.count = gklass->field.count;
klass->class_kind = MONO_CLASS_GINST;
//FIXME add setter
mono_class_set_failure (klass, mono_error_box (&prepared_error, klass->image));
mono_error_cleanup (&prepared_error);
} else if (eclass->enumtype && !mono_class_enum_basetype (eclass)) {
- if (!eclass->ref_info_handle || eclass->wastypebuilder) {
+ guint32 ref_info_handle = mono_class_get_ref_info_handle (eclass);
+ if (!ref_info_handle || eclass->wastypebuilder) {
g_warning ("Only incomplete TypeBuilder objects are allowed to be an enum without base_type");
- g_assert (eclass->ref_info_handle && !eclass->wastypebuilder);
+ g_assert (ref_info_handle && !eclass->wastypebuilder);
}
/* element_size -1 is ok as this is not an instantitable type*/
klass->sizes.element_size = -1;
while (klass) {
int first_field_idx = mono_class_get_first_field_idx (klass);
+ int fcount = mono_class_get_field_count (klass);
if (klass->image->uncompressed_metadata) {
/*
* first_field_idx points to the FieldPtr table, while idx points into the
const char *name = mono_metadata_string_heap (klass->image, mono_metadata_decode_row_col (&klass->image->tables [MONO_TABLE_FIELD], idx, MONO_FIELD_NAME));
int i;
- for (i = 0; i < klass->field.count; ++i)
+ for (i = 0; i < fcount; ++i)
if (mono_field_get_name (&klass->fields [i]) == name)
return &klass->fields [i];
g_assert_not_reached ();
} else {
- if (klass->field.count) {
- if ((idx >= first_field_idx) && (idx < first_field_idx + klass->field.count)){
+ if (fcount) {
+ if ((idx >= first_field_idx) && (idx < first_field_idx + fcount)){
return &klass->fields [idx - first_field_idx];
}
}
return NULL;
while (klass) {
- for (i = 0; i < klass->field.count; ++i) {
+ int fcount = mono_class_get_field_count (klass);
+ for (i = 0; i < fcount; ++i) {
MonoClassField *field = &klass->fields [i];
if (strcmp (name, mono_field_get_name (field)) != 0)
if (!klass->fields)
return 0;
int first_field_idx = mono_class_get_first_field_idx (klass);
- for (i = 0; i < klass->field.count; ++i) {
+ int fcount = mono_class_get_field_count (klass);
+ for (i = 0; i < fcount; ++i) {
if (&klass->fields [i] == field) {
int idx = first_field_idx + i + 1;
mono_field_get_index (MonoClassField *field)
{
int index = field - field->parent->fields;
-
- g_assert (index >= 0 && index < field->parent->field.count);
+ g_assert (index >= 0 && index < mono_class_get_field_count (field->parent));
return index;
}
g_assert (field->type->attrs & FIELD_ATTRIBUTE_HAS_DEFAULT);
- if (!klass->ext || !klass->ext->field_def_values) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (!ext || !ext->field_def_values) {
MonoFieldDefaultValue *def_values;
mono_class_alloc_ext (klass);
+ ext = mono_class_get_ext (klass);
- def_values = (MonoFieldDefaultValue *)mono_class_alloc0 (klass, sizeof (MonoFieldDefaultValue) * klass->field.count);
+ def_values = (MonoFieldDefaultValue *)mono_class_alloc0 (klass, sizeof (MonoFieldDefaultValue) * mono_class_get_field_count (klass));
mono_image_lock (klass->image);
mono_memory_barrier ();
- if (!klass->ext->field_def_values)
- klass->ext->field_def_values = def_values;
+ if (!ext->field_def_values)
+ ext->field_def_values = def_values;
mono_image_unlock (klass->image);
}
field_index = mono_field_get_index (field);
- if (!klass->ext->field_def_values [field_index].data) {
+ if (!ext->field_def_values [field_index].data) {
cindex = mono_metadata_get_constant_index (field->parent->image, mono_class_get_field_token (field), 0);
if (!cindex)
return NULL;
g_assert (!(field->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA));
mono_metadata_decode_row (&field->parent->image->tables [MONO_TABLE_CONSTANT], cindex - 1, constant_cols, MONO_CONSTANT_SIZE);
- klass->ext->field_def_values [field_index].def_type = (MonoTypeEnum)constant_cols [MONO_CONSTANT_TYPE];
- klass->ext->field_def_values [field_index].data = (const char *)mono_metadata_blob_heap (field->parent->image, constant_cols [MONO_CONSTANT_VALUE]);
+ ext->field_def_values [field_index].def_type = (MonoTypeEnum)constant_cols [MONO_CONSTANT_TYPE];
+ ext->field_def_values [field_index].data = (const char *)mono_metadata_blob_heap (field->parent->image, constant_cols [MONO_CONSTANT_VALUE]);
}
- *def_type = klass->ext->field_def_values [field_index].def_type;
- return klass->ext->field_def_values [field_index].data;
+ *def_type = ext->field_def_values [field_index].def_type;
+ return ext->field_def_values [field_index].data;
}
static int
mono_property_get_index (MonoProperty *prop)
{
- int index = prop - prop->parent->ext->properties;
+ MonoClassExt *ext = mono_class_get_ext (prop->parent);
+ int index = prop - ext->properties;
- g_assert (index >= 0 && index < prop->parent->ext->property.count);
+ g_assert (index >= 0 && index < ext->property.count);
return index;
}
*/
if (image_is_dynamic (klass->image)) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
int prop_index = mono_property_get_index (property);
- if (klass->ext->prop_def_values && klass->ext->prop_def_values [prop_index].data) {
- *def_type = klass->ext->prop_def_values [prop_index].def_type;
- return klass->ext->prop_def_values [prop_index].data;
+ if (ext->prop_def_values && ext->prop_def_values [prop_index].data) {
+ *def_type = ext->prop_def_values [prop_index].def_type;
+ return ext->prop_def_values [prop_index].data;
}
return NULL;
}
int i;
while (klass) {
- if (klass->ext) {
- for (i = 0; i < klass->ext->event.count; ++i) {
- if (&klass->ext->events [i] == event)
- return mono_metadata_make_token (MONO_TABLE_EVENT, klass->ext->event.first + i + 1);
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (ext) {
+ for (i = 0; i < ext->event.count; ++i) {
+ if (&ext->events [i] == event)
+ return mono_metadata_make_token (MONO_TABLE_EVENT, ext->event.first + i + 1);
}
}
klass = klass->parent;
MonoProperty* p;
int i = 0;
gpointer iter = NULL;
+ MonoClassExt *ext = mono_class_get_ext (klass);
while ((p = mono_class_get_properties (klass, &iter))) {
- if (&klass->ext->properties [i] == prop)
- return mono_metadata_make_token (MONO_TABLE_PROPERTY, klass->ext->property.first + i + 1);
+ if (&ext->properties [i] == prop)
+ return mono_metadata_make_token (MONO_TABLE_PROPERTY, ext->property.first + i + 1);
i ++;
}
}
/* interface_offsets might not be set for dynamic classes */
- if (oklass->ref_info_handle && !oklass->interface_bitmap) {
+ if (mono_class_get_ref_info_handle (oklass) && !oklass->interface_bitmap) {
/*
* oklass might be a generic type parameter but they have
* interface_offsets set.
int
mono_class_num_fields (MonoClass *klass)
{
- return klass->field.count;
+ return mono_class_get_field_count (klass);
}
/**
int
mono_class_num_methods (MonoClass *klass)
{
- return klass->method.count;
+ return mono_class_get_method_count (klass);
}
/**
{
mono_class_setup_properties (klass);
- return klass->ext->property.count;
+ return mono_class_get_ext (klass)->property.count;
}
/**
{
mono_class_setup_events (klass);
- return klass->ext->event.count;
+ return mono_class_get_ext (klass)->event.count;
}
/**
if (mono_class_has_failure (klass))
return NULL;
/* start from the first */
- if (klass->field.count) {
+ if (mono_class_get_field_count (klass)) {
*iter = &klass->fields [0];
return &klass->fields [0];
} else {
}
field = (MonoClassField *)*iter;
field++;
- if (field < &klass->fields [klass->field.count]) {
+ if (field < &klass->fields [mono_class_get_field_count (klass)]) {
*iter = field;
return field;
}
if (!klass->methods)
return NULL;
/* start from the first */
- if (klass->method.count) {
+ if (mono_class_get_method_count (klass)) {
*iter = &klass->methods [0];
return klass->methods [0];
} else {
}
method = (MonoMethod **)*iter;
method++;
- if (method < &klass->methods [klass->method.count]) {
+ if (method < &klass->methods [mono_class_get_method_count (klass)]) {
*iter = method;
return *method;
}
method = (MonoMethod **)*iter;
method++;
}
- while (method < &klass->methods [klass->method.count]) {
+ int mcount = mono_class_get_method_count (klass);
+ while (method < &klass->methods [mcount]) {
if (*method && ((*method)->flags & METHOD_ATTRIBUTE_VIRTUAL))
break;
method ++;
}
- if (method < &klass->methods [klass->method.count]) {
+ if (method < &klass->methods [mcount]) {
*iter = method;
return *method;
} else {
}
int first_idx = mono_class_get_first_method_idx (klass);
- for (i = start_index; i < klass->method.count; ++i) {
+ int mcount = mono_class_get_method_count (klass);
+ for (i = start_index; i < mcount; ++i) {
guint32 flags;
/* first_idx points into the methodptr table */
break;
}
- if (i < klass->method.count) {
+ if (i < mcount) {
MonoError error;
res = mono_get_method_checked (klass->image, MONO_TOKEN_METHOD_DEF | (first_idx + i + 1), klass, NULL, &error);
mono_error_cleanup (&error); /* FIXME don't swallow the error */
return NULL;
if (!*iter) {
mono_class_setup_properties (klass);
+ MonoClassExt *ext = mono_class_get_ext (klass);
/* start from the first */
- if (klass->ext->property.count) {
- *iter = &klass->ext->properties [0];
+ if (ext->property.count) {
+ *iter = &ext->properties [0];
return (MonoProperty *)*iter;
} else {
/* no fields */
}
property = (MonoProperty *)*iter;
property++;
- if (property < &klass->ext->properties [klass->ext->property.count]) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (property < &ext->properties [ext->property.count]) {
*iter = property;
return (MonoProperty *)*iter;
}
return NULL;
if (!*iter) {
mono_class_setup_events (klass);
+ MonoClassExt *ext = mono_class_get_ext (klass);
/* start from the first */
- if (klass->ext->event.count) {
- *iter = &klass->ext->events [0];
+ if (ext->event.count) {
+ *iter = &ext->events [0];
return (MonoEvent *)*iter;
} else {
/* no fields */
}
event = (MonoEvent *)*iter;
event++;
- if (event < &klass->ext->events [klass->ext->event.count]) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (event < &ext->events [ext->event.count]) {
*iter = event;
return (MonoEvent *)*iter;
}
mono_memory_barrier ();
if (!klass->nested_classes_inited) {
- klass->ext->nested_classes = nested_classes;
+ mono_class_get_ext (klass)->nested_classes = nested_classes;
mono_memory_barrier ();
klass->nested_classes_inited = TRUE;
}
setup_nested_types (klass);
if (!*iter) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
/* start from the first */
- if (klass->ext && klass->ext->nested_classes) {
- *iter = klass->ext->nested_classes;
- return (MonoClass *)klass->ext->nested_classes->data;
+ if (ext && ext->nested_classes) {
+ *iter = ext->nested_classes;
+ return (MonoClass *)ext->nested_classes->data;
} else {
/* no nested types */
return NULL;
g_assert (field->type->attrs & FIELD_ATTRIBUTE_HAS_FIELD_RVA);
- if (!klass->ext || !klass->ext->field_def_values) {
+ MonoClassExt *ext = mono_class_get_ext (klass);
+ if (!ext || !ext->field_def_values) {
mono_class_alloc_ext (klass);
+ ext = mono_class_get_ext (klass);
- field_def_values = (MonoFieldDefaultValue *)mono_class_alloc0 (klass, sizeof (MonoFieldDefaultValue) * klass->field.count);
+ field_def_values = (MonoFieldDefaultValue *)mono_class_alloc0 (klass, sizeof (MonoFieldDefaultValue) * mono_class_get_field_count (klass));
mono_image_lock (klass->image);
- if (!klass->ext->field_def_values)
- klass->ext->field_def_values = field_def_values;
+ if (!ext->field_def_values)
+ ext->field_def_values = field_def_values;
mono_image_unlock (klass->image);
}
field_index = mono_field_get_index (field);
- if (!klass->ext->field_def_values [field_index].data && !image_is_dynamic (klass->image)) {
+ if (!ext->field_def_values [field_index].data && !image_is_dynamic (klass->image)) {
int first_field_idx = mono_class_get_first_field_idx (klass);
mono_metadata_field_info (field->parent->image, first_field_idx + field_index, NULL, &rva, NULL);
if (!rva)
g_warning ("field %s in %s should have RVA data, but hasn't", mono_field_get_name (field), field->parent->name);
- klass->ext->field_def_values [field_index].data = mono_image_rva_map (field->parent->image, rva);
+ ext->field_def_values [field_index].data = mono_image_rva_map (field->parent->image, rva);
}
- return klass->ext->field_def_values [field_index].data;
+ return ext->field_def_values [field_index].data;
}
/**
/* Search directly in the metadata to avoid calling setup_methods () */
int first_idx = mono_class_get_first_method_idx (klass);
- for (i = 0; i < klass->method.count; ++i) {
+ int mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i) {
MonoError error;
guint32 cols [MONO_METHOD_SIZE];
MonoMethod *method;
*/
if (!klass->methods)
return NULL;
- for (i = 0; i < klass->method.count; ++i) {
+ int mcount = mono_class_get_method_count (klass);
+ for (i = 0; i < mcount; ++i) {
MonoMethod *method = klass->methods [i];
if (method->name[0] == name [0] &&
if (!found_base_field)
return FALSE;
- if (klass->method.count > 0)
+ if (mono_class_get_method_count (klass) > 0)
return FALSE;
return TRUE;
{
MonoClassExt *ext;
- if (klass->ext)
+ if (mono_class_get_ext (klass))
return;
ext = (MonoClassExt *)mono_class_alloc0 (klass, sizeof (MonoClassExt));
mono_image_lock (klass->image);
mono_memory_barrier ();
- if (!klass->ext)
- klass->ext = ext;
+ if (!mono_class_get_ext (klass))
+ mono_class_set_ext (klass, ext);
class_ext_size += sizeof (MonoClassExt);
++class_ext_count;
mono_image_unlock (klass->image);
MonoClass *klass = field->parent;
MonoImage *image = klass->image;
MonoClass *gtd = mono_class_is_ginst (klass) ? mono_class_get_generic_type_definition (klass) : NULL;
+ MonoType *ftype;
int field_idx = field - klass->fields;
mono_error_init (error);
g_free (full_name);
}
- field->type = mono_class_inflate_generic_type_no_copy (image, gtype, mono_class_get_context (klass), error);
+ ftype = mono_class_inflate_generic_type_no_copy (image, gtype, mono_class_get_context (klass), error);
if (!mono_error_ok (error)) {
char *full_name = mono_type_get_full_name (klass);
mono_class_set_type_load_failure (klass, "Could not load instantiated type of field '%s:%s' (%d) due to: %s", full_name, field->name, field_idx, mono_error_get_message (error));
/* FIELD signature == 0x06 */
g_assert (*sig == 0x06);
- field->type = mono_metadata_parse_type_checked (image, container, cols [MONO_FIELD_FLAGS], FALSE, sig + 1, &sig, error);
- if (!field->type) {
+ ftype = mono_metadata_parse_type_checked (image, container, cols [MONO_FIELD_FLAGS], FALSE, sig + 1, &sig, error);
+ if (!ftype) {
char *full_name = mono_type_get_full_name (klass);
mono_class_set_type_load_failure (klass, "Could not load type of field '%s:%s' (%d) due to: %s", full_name, field->name, field_idx, mono_error_get_message (error));
g_free (full_name);
}
}
+ mono_memory_barrier ();
+ field->type = ftype;
}
static guint32
if (!klass->fields)
return NULL;
/* start from the first */
- if (klass->field.count) {
+ if (mono_class_get_field_count (klass)) {
*iter = &klass->fields [0];
return (MonoClassField *)*iter;
} else {
}
field = (MonoClassField *)*iter;
field++;
- if (field < &klass->fields [klass->field.count]) {
+ if (field < &klass->fields [mono_class_get_field_count (klass)]) {
*iter = field;
return (MonoClassField *)*iter;
}