X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmonodiet.c;h=1ad1f538819b48207c633503e97fda3414b17d49;hb=a5cce3bf094e4f231bab2b7aa4db95c46efbc5eb;hp=b2df77fbc6b76deeec07bbd3c34bee3c57fc7bc5;hpb=6cfd2055426c190ca2f6a9f8ca3af2da6f6a79d0;p=mono.git diff --git a/mono/metadata/monodiet.c b/mono/metadata/monodiet.c index b2df77fbc6b..1ad1f538819 100644 --- a/mono/metadata/monodiet.c +++ b/mono/metadata/monodiet.c @@ -86,13 +86,16 @@ static void add_types_from_method (MonoMethod *method) { const MonoOpcode *opcode; MonoMethodHeader *header; - const unsigned char *ip; + const unsigned char *ip, *il_code_end; gpointer val = NULL, oldkey = NULL; int i, n; guint32 token; MonoClass *klass; MonoClassField *field; MonoCustomAttrInfo* cattrs; + MonoType** locals; + gpointer exc_iter; + MonoExceptionClause clause; if (g_hash_table_lookup_extended (method_table, method, &oldkey, &val)) return; @@ -123,19 +126,20 @@ add_types_from_method (MonoMethod *method) { header = mono_method_get_header (method); - for (i = 0; i < header->num_locals; ++i) { - klass = mono_class_from_mono_type (header->locals [i]); + locals = mono_method_header_get_locals (header, &n, NULL); + for (i = 0; i < n; ++i) { + klass = mono_class_from_mono_type (locals [i]); add_type (klass); } - for (i = 0; i < header->num_clauses; ++i) { - MonoExceptionClause *clause = &header->clauses [i]; - if (clause->flags == MONO_EXCEPTION_CLAUSE_NONE) - add_type (clause->data.catch_class); + for (exc_iter = NULL; mono_method_header_get_clauses (header, method, &exc_iter, &clause);) { + if (clause.flags == MONO_EXCEPTION_CLAUSE_NONE) + add_type (clause.data.catch_class); } - ip = header->code; + ip = mono_method_header_get_code (header, &n, NULL); + il_code_end = ip + n; - while (ip < (header->code + header->code_size)) { + while (ip < il_code_end) { if (verbose > 2) g_print ("#%s", mono_disasm_code_one (NULL, method, ip, NULL)); if (*ip == 0xfe) { @@ -214,6 +218,7 @@ handle_cattrs (MonoCustomAttrInfo* cattrs) for (i = 0; i < cattrs->num_attrs; ++i) { add_types_from_method (cattrs->attrs [i].ctor); } + mono_custom_attrs_free (cattrs); } static void @@ -332,9 +337,8 @@ check_vmethods (MonoClass *klass, MonoMethod *method) if (!vtable) return; if (method->klass->flags & TYPE_ATTRIBUTE_INTERFACE) { - if (method->klass->interface_id <= klass->max_interface_id && - (klass->interface_offsets [method->klass->interface_id] >= 0)) { - int iface_offset = klass->interface_offsets [method->klass->interface_id]; + if (MONO_CLASS_IMPLEMENTS_INTERFACE (klass, method->klass->interface_id)) { + int iface_offset = mono_class_interface_offset (klass, method->klass); g_assert (method->slot != -1); if (vtable [iface_offset + method->slot]) add_types_from_method (vtable [iface_offset + method->slot]);