* locales.c
[mono.git] / mono / metadata / image.c
index 3d0839c3420edf1a77b5d7ed24073f2893303b3d..0c8ca5f9043e6a8c51652c3a35ae2442b0d2576a 100644 (file)
@@ -278,6 +278,9 @@ load_metadata_ptrs (MonoImage *image, MonoCLIImageInfo *iinfo)
        char *ptr;
        
        offset = mono_cli_rva_image_map (iinfo, iinfo->cli_cli_header.ch_metadata.rva);
+       if (offset == INVALID_ADDRESS)
+               return FALSE;
+
        size = iinfo->cli_cli_header.ch_metadata.size;
 
        if (!image->f) {
@@ -338,7 +341,7 @@ load_metadata_ptrs (MonoImage *image, MonoCLIImageInfo *iinfo)
                        return FALSE;
                } else {
                        g_message ("Unknown heap type: %s\n", ptr + 8);
-                       ptr += 8 + strlen (ptr) + 1;
+                       ptr += 8 + strlen (ptr + 8) + 1;
                }
                pad = ptr - image->raw_metadata;
                if (pad % 4)
@@ -558,8 +561,11 @@ mono_image_init (MonoImage *image)
        image->remoting_invoke_cache = g_hash_table_new (NULL, NULL);
        image->synchronized_cache = g_hash_table_new (NULL, NULL);
 
-       image->generics_cache = g_hash_table_new ((GHashFunc)mono_metadata_type_hash, (GEqualFunc)mono_metadata_type_equal);
        image->typespec_cache = g_hash_table_new (NULL, NULL);
+
+       image->generic_inst_cache =
+               g_hash_table_new ((GHashFunc)mono_metadata_generic_inst_hash,
+                                 (GCompareFunc)mono_metadata_generic_inst_equal);
 }
 
 static MonoImage *
@@ -756,10 +762,17 @@ do_mono_image_open (const char *fname, MonoImageOpenStatus *status)
        image = g_new0 (MonoImage, 1);
        image->ref_count = 1;
        image->f = filed;
-       image->name = g_strdup (fname);
        iinfo = g_new0 (MonoCLIImageInfo, 1);
        image->image_info = iinfo;
 
+       if (g_path_is_absolute (fname))
+               image->name = g_strdup (fname);
+       else {
+               gchar *path = g_get_current_dir ();
+               image->name = g_build_filename (path, fname, NULL);
+               g_free (path);
+       }
+
        return do_mono_image_load (image, status);
 }
 
@@ -768,9 +781,6 @@ mono_image_loaded (const char *name)
 {
        MonoImage *res;
         
-       if (strcmp (name, "corlib") == 0)
-               name = "mscorlib";
-
        EnterCriticalSection (&images_mutex);
        res = g_hash_table_lookup (loaded_images_hash, name);
        LeaveCriticalSection (&images_mutex);
@@ -882,6 +892,18 @@ free_hash_table (gpointer key, gpointer val, gpointer user_data)
        g_hash_table_destroy ((GHashTable*)val);
 }
 
+/**
+ * mono_image_close:
+ * @image: The image file we wish to add a reference to
+ *
+ *  Increases the reference count of an image.
+ */
+void
+mono_image_addref (MonoImage *image)
+{
+       InterlockedIncrement (&image->ref_count);
+}      
+
 /**
  * mono_image_close:
  * @image: The image file we wish to close
@@ -934,6 +956,8 @@ mono_image_close (MonoImage *image)
        g_hash_table_destroy (image->delegate_invoke_cache);
        g_hash_table_destroy (image->remoting_invoke_cache);
        g_hash_table_destroy (image->runtime_invoke_cache);
+       g_hash_table_destroy (image->typespec_cache);
+       g_hash_table_destroy (image->generic_inst_cache);
        
        if (image->raw_metadata != NULL)
                mono_raw_buffer_free (image->raw_metadata);