[runtime] It's spring cleaning in MonoInternalThread. Remove 8 (yes, eight) unused...
[mono.git] / mono / metadata / pedump.c
index a0f8432755fd140980ea8a7a69a7f4db13abbd56..2615373e1223cdeb1f892e92aaae3507ad4ea57a 100644 (file)
@@ -27,6 +27,7 @@
 #include <mono/metadata/marshal.h>
 #include "mono/utils/mono-digest.h"
 #include <mono/utils/mono-mmap.h>
+#include <mono/utils/mono-counters.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifdef HAVE_UNISTD_H
@@ -39,6 +40,10 @@ gboolean verify_metadata = FALSE;
 gboolean verify_code = FALSE;
 gboolean verify_partial_md = FALSE;
 
+static MonoAssembly *pedump_preload (MonoAssemblyName *aname, gchar **assemblies_path, gpointer user_data);
+static void pedump_assembly_load_hook (MonoAssembly *assembly, gpointer user_data);
+static MonoAssembly *pedump_assembly_search_hook (MonoAssemblyName *aname, gpointer user_data);
+
 /* unused
 static void
 hex_dump (const char *buffer, int base, int count)
@@ -355,11 +360,13 @@ dump_verify_info (MonoImage *image, int flags)
 
                for (i = 0; i < m->rows; ++i) {
                        MonoMethod *method;
+                       MonoError error;
                        mono_loader_clear_error ();
 
-                       method = mono_get_method (image, MONO_TOKEN_METHOD_DEF | (i+1), NULL);
+                       method = mono_get_method_checked (image, MONO_TOKEN_METHOD_DEF | (i+1), NULL, NULL, &error);
                        if (!method) {
-                               g_print ("Warning: Cannot lookup method with token 0x%08x\n", i + 1);
+                               g_print ("Warning: Cannot lookup method with token 0x%08x due to %s\n", i + 1, mono_error_get_message (&error));
+                               mono_error_cleanup (&error);
                                continue;
                        }
                        errors = mono_method_verify (method, flags);
@@ -445,21 +452,36 @@ verify_image_file (const char *fname)
 
        mono_image_load_names (image);
 
-       if (!verify_partial_md && !mono_verifier_verify_full_table_data (image, &errors))
-               goto invalid_image;
-
        /*fake an assembly for class loading to work*/
        assembly = g_new0 (MonoAssembly, 1);
        assembly->in_gac = FALSE;
        assembly->image = image;
        image->assembly = assembly;
+       mono_assembly_fill_assembly_name (image, &assembly->aname);
+
+       /*Finish initializing the runtime*/
+       mono_install_assembly_load_hook (pedump_assembly_load_hook, NULL);
+       mono_install_assembly_search_hook (pedump_assembly_search_hook, NULL);
+
+       mono_init_version ("pedump", image->version);
+
+       mono_install_assembly_preload_hook (pedump_preload, GUINT_TO_POINTER (FALSE));
+
+       mono_marshal_init ();
+
+
+       if (!verify_partial_md && !mono_verifier_verify_full_table_data (image, &errors))
+               goto invalid_image;
+
 
        table = &image->tables [MONO_TABLE_TYPEDEF];
        for (i = 1; i <= table->rows; ++i) {
+               MonoError error;
                guint32 token = i | MONO_TOKEN_TYPE_DEF;
-               MonoClass *class = mono_class_get (image, token);
+               MonoClass *class = mono_class_get_checked (image, token, &error);
                if (!class) {
-                       printf ("Could not load class with token %x\n", token);
+                       printf ("Could not load class with token %x due to %s\n", token, mono_error_get_message (&error));
+                       mono_error_cleanup (&error);
                        continue;
                }
                mono_class_init (class);
@@ -468,6 +490,13 @@ verify_image_file (const char *fname)
                        mono_loader_clear_error ();
                        ++count;
                }
+
+               mono_class_setup_vtable (class);
+               if (class->exception_type != MONO_EXCEPTION_NONE || mono_loader_get_last_error ()) {
+                       printf ("Error verifying class(0x%08x) %s.%s a type load error happened\n", token, class->name_space, class->name);
+                       mono_loader_clear_error ();
+                       ++count;
+               }
        }
        if (count)
                return 5;
@@ -626,7 +655,10 @@ main (int argc, char *argv [])
        if (!file)
                usage ();
 
+#ifndef DISABLE_PERFCOUNTERS
        mono_perfcounters_init ();
+#endif
+       mono_counters_init ();
        mono_metadata_init ();
        mono_images_init ();
        mono_assemblies_init ();
@@ -668,14 +700,6 @@ main (int argc, char *argv [])
        }
 
        if (verify_pe || run_new_metadata_verifier) {
-               mono_install_assembly_load_hook (pedump_assembly_load_hook, NULL);
-               mono_install_assembly_search_hook (pedump_assembly_search_hook, NULL);
-
-               mono_init_version ("pedump", "v2.0.50727");
-
-               mono_install_assembly_preload_hook (pedump_preload, GUINT_TO_POINTER (FALSE));
-
-               mono_marshal_init ();
                run_new_metadata_verifier = 1;
        }