2006-06-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / metadata / class.c
index 445d78a101b03ca2d6c564b8dd94ac00fec112e6..2242760ba601fb5413a43c5d70c684848ebd2afa 100644 (file)
@@ -130,13 +130,11 @@ mono_class_from_typeref (MonoImage *image, guint32 type_token)
        /* If the assembly did not load, register this as a type load exception */
        if (references [idx - 1] == REFERENCE_MISSING){
                MonoAssemblyName aname;
-               char *msg = g_strdup_printf ("%s%s%s", nspace, nspace [0] ? "." : "", name);
                char *human_name;
                
                mono_assembly_get_assemblyref (image, idx - 1, &aname);
                human_name = mono_stringify_assembly_name (&aname);
-               mono_loader_set_error_type_load (msg, human_name);
-               g_free (msg);
+               mono_loader_set_error_assembly_load (human_name, image->assembly->ref_only);
                g_free (human_name);
                
                return NULL;
@@ -819,6 +817,8 @@ mono_class_setup_fields (MonoClass *class)
        class->class_size = 0;
 
        if (class->parent) {
+               /* For generic instances, class->parent might not have been initialized */
+               mono_class_init (class->parent);
                if (!class->parent->size_inited)
                        mono_class_setup_fields (class->parent);
                class->instance_size += class->parent->instance_size;
@@ -2075,10 +2075,21 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
                                int j;
                                for (j = 0; j < k->method.count; ++j) {
                                        MonoMethod *m1 = k->methods [j];
+                                       MonoMethodSignature *cmsig, *m1sig;
+
                                        if (!(m1->flags & METHOD_ATTRIBUTE_VIRTUAL))
                                                continue;
+
+                                       cmsig = mono_method_signature (cm);
+                                       m1sig = mono_method_signature (m1);
+
+                                       if (!cmsig || !m1sig) {
+                                               mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+                                               return;
+                                       }
+
                                        if (!strcmp(cm->name, m1->name) && 
-                                           mono_metadata_signature_equal (mono_method_signature (cm), mono_method_signature (m1))) {
+                                           mono_metadata_signature_equal (cmsig, m1sig)) {
 
                                                /* CAS - SecurityAction.InheritanceDemand */
                                                if (security_enabled && (m1->flags & METHOD_ATTRIBUTE_HAS_SECURITY)) {
@@ -2439,7 +2450,12 @@ mono_class_init (MonoClass *class)
        }
        else {
                mono_class_setup_vtable (class);
-       
+
+               if (class->exception_type || mono_loader_get_last_error ()){
+                       class_init_ok = FALSE;
+                       goto leave;
+               }
+
                class->ghcimpl = 1;
                if (class->parent) { 
                        MonoMethod *cmethod = class->vtable [ghc_slot];