+gclass_in_image (MonoGenericClass *gclass, MonoImage *image)
+{
+ return gclass->container_class->image == image ||
+ ginst_in_image (gclass->context.class_inst, image);
+}
+
+static gboolean
+type_in_image (MonoType *type, MonoImage *image)
+{
+retry:
+ switch (type->type) {
+ case MONO_TYPE_GENERICINST:
+ return gclass_in_image (type->data.generic_class, image);
+ case MONO_TYPE_PTR:
+ type = type->data.type;
+ goto retry;
+ case MONO_TYPE_SZARRAY:
+ type = &type->data.klass->byval_arg;
+ goto retry;
+ case MONO_TYPE_ARRAY:
+ type = &type->data.array->eklass->byval_arg;
+ goto retry;
+ case MONO_TYPE_FNPTR:
+ return signature_in_image (type->data.method, image);
+ case MONO_TYPE_VAR:
+ if (type->data.generic_param->owner) {
+ g_assert (!type->data.generic_param->owner->is_method);
+ return type->data.generic_param->owner->owner.klass->image == image;
+ } else {
+ return type->data.generic_param->image == image;
+ }
+ case MONO_TYPE_MVAR:
+ if (type->data.generic_param->owner) {
+ g_assert (type->data.generic_param->owner->is_method);
+ if (!type->data.generic_param->owner->owner.method)
+ /* RefEmit created generic param whose method is not finished */
+ return FALSE;
+ return type->data.generic_param->owner->owner.method->klass->image == image;
+ } else {
+ return type->data.generic_param->image == image;
+ }
+ default:
+ /* At this point, we should've avoided all potential allocations in mono_class_from_mono_type () */
+ return image == mono_class_from_mono_type (type)->image;
+ }
+}
+
+typedef struct {
+ MonoImage *image;
+ GSList *list;
+} CleanForImageUserData;
+
+static gboolean
+steal_gclass_in_image (gpointer key, gpointer value, gpointer data)