+
+/*
+ * mono_class_alloc_ext:
+ *
+ * Allocate klass->ext if not already done.
+ * LOCKING: Assumes the loader lock is held.
+ */
+void
+mono_class_alloc_ext (MonoClass *klass)
+{
+ if (!klass->ext) {
+ if (klass->generic_class) {
+ klass->ext = g_new0 (MonoClassExt, 1);
+ } else {
+ klass->ext = mono_image_alloc0 (klass->image, sizeof (MonoClassExt));
+ }
+ class_ext_size += sizeof (MonoClassExt);
+ }
+}
+
+/*
+ * mono_class_setup_interfaces:
+ *
+ * Initialize class->interfaces/interfaces_count.
+ * LOCKING: Acquires the loader lock.
+ */
+void
+mono_class_setup_interfaces (MonoClass *klass)
+{
+ int i;
+
+ if (klass->interfaces_inited)
+ return;
+
+ mono_loader_lock ();
+
+ if (klass->interfaces_inited) {
+ mono_loader_unlock ();
+ return;
+ }
+
+ if (klass->rank == 1 && klass->byval_arg.type != MONO_TYPE_ARRAY && mono_defaults.generic_ilist_class) {
+ MonoType *args [1];
+
+ /* generic IList, ICollection, IEnumerable */
+ klass->interface_count = 1;
+ klass->interfaces = mono_image_alloc0 (klass->image, sizeof (MonoClass*) * klass->interface_count);
+
+ args [0] = &klass->element_class->byval_arg;
+ klass->interfaces [0] = mono_class_bind_generic_parameters (
+ mono_defaults.generic_ilist_class, 1, args, FALSE);
+ } else if (klass->generic_class) {
+ MonoClass *gklass = klass->generic_class->container_class;
+
+ klass->interface_count = gklass->interface_count;
+ klass->interfaces = g_new0 (MonoClass *, klass->interface_count);
+ for (i = 0; i < klass->interface_count; i++)
+ klass->interfaces [i] = mono_class_inflate_generic_class (gklass->interfaces [i], mono_generic_class_get_context (klass->generic_class));
+ }
+
+ mono_memory_barrier ();
+
+ klass->interfaces_inited = TRUE;
+
+ mono_loader_unlock ();
+}