X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmetadata.c;h=86fea9155ce42b9337bff38ad9c0a12823d1043e;hb=b1f867e4e54ce055ea8550c934ed24e6f143bd9b;hp=ab0911bc677f89e1459c8f7476aff317c5e4eccf;hpb=883a0ae745bf33b35d44bb730d5714936a2141f7;p=mono.git diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c index ab0911bc677..86fea9155ce 100644 --- a/mono/metadata/metadata.c +++ b/mono/metadata/metadata.c @@ -2789,6 +2789,9 @@ free_inflated_method (MonoMethodInflated *imethod) if (method->signature) mono_metadata_free_inflated_signature (method->signature); + if (method->wrapper_type) + g_free (((MonoMethodWrapper*)method)->method_data); + g_free (method); } @@ -2806,8 +2809,6 @@ static void free_generic_class (MonoGenericClass *gclass) { /* The gclass itself is allocated from the image set mempool */ - if (gclass->is_dynamic) - mono_reflection_free_dynamic_generic_class (gclass); if (gclass->cached_class && gclass->cached_class->interface_id) mono_unload_interface_id (gclass->cached_class); } @@ -2936,7 +2937,7 @@ mono_metadata_get_generic_inst (int type_argc, MonoType **type_argv) static gboolean mono_metadata_is_type_builder_generic_type_definition (MonoClass *container_class, MonoGenericInst *inst, gboolean is_dynamic) { - MonoGenericContainer *container = container_class->generic_container; + MonoGenericContainer *container = mono_class_get_generic_container (container_class); if (!is_dynamic || container_class->wastypebuilder || container->type_argc != inst->type_argc) return FALSE; @@ -2958,6 +2959,8 @@ mono_metadata_lookup_generic_class (MonoClass *container_class, MonoGenericInst MonoImageSet *set; CollectData data; + g_assert (mono_class_get_generic_container (container_class)->type_argc == inst->type_argc); + memset (&helper, 0, sizeof(helper)); // act like g_new0 helper.container_class = container_class; helper.context.class_inst = inst; @@ -2984,20 +2987,16 @@ mono_metadata_lookup_generic_class (MonoClass *container_class, MonoGenericInst return gclass; } - if (is_dynamic) { - MonoDynamicGenericClass *dgclass = mono_image_set_new0 (set, MonoDynamicGenericClass, 1); - gclass = &dgclass->generic_class; + gclass = mono_image_set_new0 (set, MonoGenericClass, 1); + if (is_dynamic) gclass->is_dynamic = 1; - } else { - gclass = mono_image_set_new0 (set, MonoGenericClass, 1); - } gclass->is_tb_open = is_tb_open; gclass->container_class = container_class; gclass->context.class_inst = inst; gclass->context.method_inst = NULL; gclass->owner = set; - if (inst == container_class->generic_container->context.class_inst && !is_tb_open) + if (inst == mono_class_get_generic_container (container_class)->context.class_inst && !is_tb_open) gclass->cached_class = container_class; g_hash_table_insert (set->gclass_cache, gclass, gclass); @@ -3092,7 +3091,7 @@ do_mono_metadata_parse_generic_class (MonoType *type, MonoImage *m, MonoGenericC return FALSE; gklass = mono_class_from_mono_type (gtype); - if (!gklass->generic_container) { + if (!mono_class_is_gtd (gklass)) { mono_error_set_bad_image (error, m, "Generic instance with non-generic definition"); return FALSE; } @@ -4807,7 +4806,7 @@ static gboolean _mono_metadata_generic_class_container_equal (const MonoGenericClass *g1, MonoClass *c2, gboolean signature_only) { MonoGenericInst *i1 = g1->context.class_inst; - MonoGenericInst *i2 = c2->generic_container->context.class_inst; + MonoGenericInst *i2 = mono_class_get_generic_container (c2)->context.class_inst; if (!mono_metadata_class_equal (g1->container_class, c2, signature_only)) return FALSE; @@ -4962,12 +4961,12 @@ mono_metadata_class_equal (MonoClass *c1, MonoClass *c2, gboolean signature_only { if (c1 == c2) return TRUE; - if (c1->generic_class && c2->generic_class) - return _mono_metadata_generic_class_equal (c1->generic_class, c2->generic_class, signature_only); - if (c1->generic_class && c2->generic_container) - return _mono_metadata_generic_class_container_equal (c1->generic_class, c2, signature_only); - if (c1->generic_container && c2->generic_class) - return _mono_metadata_generic_class_container_equal (c2->generic_class, c1, signature_only); + if (mono_class_is_ginst (c1) && mono_class_is_ginst (c2)) + return _mono_metadata_generic_class_equal (mono_class_get_generic_class (c1), mono_class_get_generic_class (c2), signature_only); + if (mono_class_is_ginst (c1) && mono_class_is_gtd (c2)) + return _mono_metadata_generic_class_container_equal (mono_class_get_generic_class (c1), c2, signature_only); + if (mono_class_is_gtd (c1) && mono_class_is_ginst (c2)) + return _mono_metadata_generic_class_container_equal (mono_class_get_generic_class (c2), c1, signature_only); if ((c1->byval_arg.type == MONO_TYPE_VAR) && (c2->byval_arg.type == MONO_TYPE_VAR)) return mono_metadata_generic_param_equal_internal ( c1->byval_arg.data.generic_param, c2->byval_arg.data.generic_param, signature_only); @@ -5815,6 +5814,9 @@ handle_enum: case MONO_NATIVE_TBSTR: *conv = MONO_MARSHAL_CONV_STR_TBSTR; return MONO_NATIVE_TBSTR; + case MONO_NATIVE_UTF8STR: + *conv = MONO_MARSHAL_CONV_STR_UTF8STR; + return MONO_NATIVE_UTF8STR; case MONO_NATIVE_BYVALTSTR: if (unicode) *conv = MONO_MARSHAL_CONV_STR_BYVALWSTR; @@ -6069,6 +6071,21 @@ mono_guid_to_string (const guint8 *guid) guid[10], guid[11], guid[12], guid[13], guid[14], guid[15]); } +/** + * mono_guid_to_string_minimal: + * + * Converts a 16 byte Microsoft GUID to lower case no '-' representation.. + */ +char * +mono_guid_to_string_minimal (const guint8 *guid) +{ + return g_strdup_printf ("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + guid[3], guid[2], guid[1], guid[0], + guid[5], guid[4], + guid[7], guid[6], + guid[8], guid[9], + guid[10], guid[11], guid[12], guid[13], guid[14], guid[15]); +} static gboolean get_constraints (MonoImage *image, int owner, MonoClass ***constraints, MonoGenericContainer *container, MonoError *error) { @@ -6444,6 +6461,12 @@ mono_type_is_reference (MonoType *type) !mono_metadata_generic_class_is_valuetype (type->data.generic_class)))); } +mono_bool +mono_type_is_generic_parameter (MonoType *type) +{ + return !type->byref && (type->type == MONO_TYPE_VAR || type->type == MONO_TYPE_MVAR); +} + /** * mono_signature_get_return_type: * @sig: the method signature inspected @@ -6589,10 +6612,10 @@ mono_metadata_get_corresponding_field_from_generic_type_definition (MonoClassFie MonoClass *gtd; int offset; - if (!field->parent->generic_class) + if (!mono_class_is_ginst (field->parent)) return field; - gtd = field->parent->generic_class->container_class; + gtd = mono_class_get_generic_class (field->parent)->container_class; offset = field - field->parent->fields; return gtd->fields + offset; } @@ -6607,12 +6630,12 @@ mono_metadata_get_corresponding_event_from_generic_type_definition (MonoEvent *e MonoClass *gtd; int offset; - if (!event->parent->generic_class) + if (!mono_class_is_ginst (event->parent)) return event; - gtd = event->parent->generic_class->container_class; - offset = event - event->parent->ext->events; - return gtd->ext->events + offset; + gtd = mono_class_get_generic_class (event->parent)->container_class; + offset = event - mono_class_get_event_info (event->parent)->events; + return mono_class_get_event_info (gtd)->events + offset; } /* @@ -6622,15 +6645,17 @@ mono_metadata_get_corresponding_event_from_generic_type_definition (MonoEvent *e MonoProperty* mono_metadata_get_corresponding_property_from_generic_type_definition (MonoProperty *property) { + MonoClassPropertyInfo *info; MonoClass *gtd; int offset; - if (!property->parent->generic_class) + if (!mono_class_is_ginst (property->parent)) return property; - gtd = property->parent->generic_class->container_class; - offset = property - property->parent->ext->properties; - return gtd->ext->properties + offset; + info = mono_class_get_property_info (property->parent); + gtd = mono_class_get_generic_class (property->parent)->container_class; + offset = property - info->properties; + return mono_class_get_property_info (gtd)->properties + offset; } MonoWrapperCaches*