2009-07-26 Miguel de Icaza <miguel@novell.com>
[mono.git] / mono / metadata / image.c
index da552e6fa65c971a1674302873f03a585e4633f8..47e85ea3690f288ec47d69d71eecf955f1c90f19 100644 (file)
@@ -853,6 +853,21 @@ mono_image_load_cli_data (MonoImage *image)
        return TRUE;
 }
 
+void
+mono_image_load_names (MonoImage *image)
+{
+       /* modules don't have an assembly table row */
+       if (image->tables [MONO_TABLE_ASSEMBLY].rows) {
+               image->assembly_name = mono_metadata_string_heap (image, 
+                       mono_metadata_decode_row_col (&image->tables [MONO_TABLE_ASSEMBLY],
+                                       0, MONO_ASSEMBLY_NAME));
+       }
+
+       image->module_name = mono_metadata_string_heap (image, 
+                       mono_metadata_decode_row_col (&image->tables [MONO_TABLE_MODULE],
+                                       0, MONO_MODULE_NAME));
+}
+
 static MonoImage *
 do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
                    gboolean care_about_cli, gboolean care_about_pecoff)
@@ -889,16 +904,10 @@ do_mono_image_load (MonoImage *image, MonoImageOpenStatus *status,
        if (!mono_image_load_cli_data (image))
                goto invalid_image;
 
-       /* modules don't have an assembly table row */
-       if (image->tables [MONO_TABLE_ASSEMBLY].rows) {
-               image->assembly_name = mono_metadata_string_heap (image, 
-                       mono_metadata_decode_row_col (&image->tables [MONO_TABLE_ASSEMBLY],
-                                       0, MONO_ASSEMBLY_NAME));
-       }
+       if (!mono_verifier_verify_table_data (image, NULL))
+               goto invalid_image;
 
-       image->module_name = mono_metadata_string_heap (image, 
-                       mono_metadata_decode_row_col (&image->tables [MONO_TABLE_MODULE],
-                                       0, MONO_MODULE_NAME));
+       mono_image_load_names (image);
 
        load_modules (image);
 
@@ -1529,7 +1538,6 @@ mono_image_close (MonoImage *image)
        free_hash (image->castclass_cache);
        free_hash (image->proxy_isinst_cache);
        free_hash (image->thunk_invoke_cache);
-       free_hash (image->static_rgctx_invoke_cache);
 
        /* The ownership of signatures is not well defined */
        //g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL);
@@ -1588,7 +1596,10 @@ mono_image_close (MonoImage *image)
                /* Dynamic images are GC_MALLOCed */
                g_free ((char*)image->module_name);
                mono_dynamic_image_free ((MonoDynamicImage*)image);
-               mono_mempool_destroy (image->mempool);
+               if (debug_assembly_unload)
+                       mono_mempool_invalidate (image->mempool);
+               else
+                       mono_mempool_destroy (image->mempool);
        }
 
        mono_profiler_module_event (image, MONO_PROFILE_END_UNLOAD);