Sat Jan 8 19:03:26 CET 2005 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / metadata / image.c
index 6240d94ec8ed3415289efc05b01037d57fbcad22..19aee1acc578ca983a9d281a294282c591a40404 100644 (file)
@@ -607,14 +607,11 @@ mono_image_init (MonoImage *image)
        image->native_wrapper_cache = g_hash_table_new (NULL, NULL);
        image->remoting_invoke_cache = g_hash_table_new (NULL, NULL);
        image->synchronized_cache = g_hash_table_new (NULL, NULL);
+       image->unbox_wrapper_cache = g_hash_table_new (NULL, NULL);
 
        image->typespec_cache = g_hash_table_new (NULL, NULL);
        image->memberref_signatures = g_hash_table_new (NULL, NULL);
        image->helper_signatures = g_hash_table_new (g_str_hash, g_str_equal);
-
-       image->generic_inst_cache =
-               g_hash_table_new ((GHashFunc)mono_metadata_generic_inst_hash,
-                                 (GCompareFunc)mono_metadata_generic_inst_equal);
 }
 
 static MonoImage *
@@ -945,6 +942,12 @@ free_mr_signatures (gpointer key, gpointer val, gpointer user_data)
        mono_metadata_free_method_signature ((MonoMethodSignature*)val);
 }
 
+static void
+free_remoting_wrappers (gpointer key, gpointer val, gpointer user_data)
+{
+       g_free (val);
+}
+
 /**
  * mono_image_addref:
  * @image: The image file we wish to add a reference to
@@ -1007,6 +1010,7 @@ mono_image_close (MonoImage *image)
                g_free (image->raw_data);
        }
        g_free (image->name);
+       g_free (image->guid);
        g_free (image->files);
 
        g_hash_table_destroy (image->method_cache);
@@ -1020,10 +1024,12 @@ mono_image_close (MonoImage *image)
        g_hash_table_destroy (image->delegate_begin_invoke_cache);
        g_hash_table_destroy (image->delegate_end_invoke_cache);
        g_hash_table_destroy (image->delegate_invoke_cache);
+       g_hash_table_foreach (image->remoting_invoke_cache, free_remoting_wrappers, NULL);
        g_hash_table_destroy (image->remoting_invoke_cache);
        g_hash_table_destroy (image->runtime_invoke_cache);
+       g_hash_table_destroy (image->synchronized_cache);
+       g_hash_table_destroy (image->unbox_wrapper_cache);
        g_hash_table_destroy (image->typespec_cache);
-       g_hash_table_destroy (image->generic_inst_cache);
        g_hash_table_foreach (image->memberref_signatures, free_mr_signatures, NULL);
        g_hash_table_destroy (image->memberref_signatures);
        g_hash_table_foreach (image->helper_signatures, free_mr_signatures, NULL);
@@ -1355,7 +1361,7 @@ mono_image_get_table_rows (MonoImage *image, int table_id)
 }
 
 int
-mono_table_info_get_rows (MonoTableInfo *table)
+mono_table_info_get_rows (const MonoTableInfo *table)
 {
        return table->rows;
 }
@@ -1372,4 +1378,12 @@ mono_image_is_dynamic (MonoImage *image)
        return image->dynamic;
 }
 
-
+gboolean
+mono_image_has_authenticode_entry (MonoImage *image)
+{
+       MonoCLIImageInfo *iinfo = image->image_info;
+       MonoDotNetHeader *header = &iinfo->cli_header;
+       MonoPEDirEntry *de = &header->datadir.pe_certificate_table;
+       // the Authenticode "pre" (non ASN.1) header is 8 bytes long
+       return ((de->rva != 0) && (de->size > 8));
+}