2006-06-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / metadata / assembly.c
index f070a6780f7609d8c93e542968c19d64639db33d..f52ffc393c4e5429ab90657aecabd442a6a674a2 100644 (file)
@@ -847,7 +847,7 @@ mono_assembly_load_reference (MonoImage *image, int index)
                 * a non loaded reference using the ReflectionOnly api
                */
                if (!reference)
-                       reference = (gpointer)-1;
+                       reference = REFERENCE_MISSING;
        } else
                reference = mono_assembly_load (&aname, image->assembly->basedir, &status);
 
@@ -877,12 +877,19 @@ mono_assembly_load_reference (MonoImage *image, int index)
        mono_assemblies_lock ();
        if (reference == NULL) {
                /* Flag as not found */
-               reference = (gpointer)-1;
+               reference = REFERENCE_MISSING;
        }       
 
        if (!image->references [index]) {
-               mono_assembly_addref (reference);
-               mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s %p -> %s %p: %d\n", image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count);
+               if (reference != REFERENCE_MISSING){
+                       mono_assembly_addref (reference);
+                       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s %p -> %s %p: %d\n",
+                                   image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count);
+               } else {
+                       mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s %p\n",
+                                   image->assembly->aname.name, image->assembly);
+               }
+               
                image->references [index] = reference;
        }
        mono_assemblies_unlock ();
@@ -1269,12 +1276,13 @@ mono_assembly_open_full (const char *filename, MonoImageOpenStatus *status, gboo
 
        if (!image) {
                mono_assemblies_lock ();
-               image = mono_image_open_full (filename, status, refonly);
+               image = mono_image_open_full (fname, status, refonly);
                mono_assemblies_unlock ();
        }
 
        if (!image){
-               *status = MONO_IMAGE_ERROR_ERRNO;
+               if (*status == MONO_IMAGE_OK)
+                       *status = MONO_IMAGE_ERROR_ERRNO;
                g_free (fname);
                return NULL;
        }
@@ -1353,8 +1361,9 @@ load_friend_assemblies (MonoAssembly* ass)
  * mono_assembly_open opens the PE-image pointed by @filename, and
  * loads any external assemblies referenced by it.
  *
- * NOTE: we could do lazy loading of the assemblies.  Or maybe not worth
- * it. 
+ * Return: a pointer to the MonoAssembly if @filename contains a valid
+ * assembly or NULL on error.  Details about the error are stored in the
+ * @status variable.
  */
 MonoAssembly *
 mono_assembly_open (const char *filename, MonoImageOpenStatus *status)
@@ -1364,7 +1373,7 @@ mono_assembly_open (const char *filename, MonoImageOpenStatus *status)
 
 MonoAssembly *
 mono_assembly_load_from_full (MonoImage *image, const char*fname, 
-                        MonoImageOpenStatus *status, gboolean refonly)
+                             MonoImageOpenStatus *status, gboolean refonly)
 {
        MonoAssembly *ass, *ass2;
        char *base_dir;
@@ -1429,9 +1438,9 @@ mono_assembly_load_from_full (MonoImage *image, const char*fname,
                }
        }
        ass_loading = refonly ? assemblies_refonly_loading : assemblies_loading;
-       loading = g_hash_table_lookup (ass_loading, GetCurrentThreadId ());
+       loading = g_hash_table_lookup (ass_loading, (gpointer)GetCurrentThreadId ());
        loading = g_list_prepend (loading, ass);
-       g_hash_table_insert (ass_loading, GetCurrentThreadId (), loading);
+       g_hash_table_insert (ass_loading, (gpointer)GetCurrentThreadId (), loading);
        mono_assemblies_unlock ();
 
        g_assert (image->assembly == NULL);
@@ -1441,13 +1450,13 @@ mono_assembly_load_from_full (MonoImage *image, const char*fname,
 
        mono_assemblies_lock ();
 
-       loading = g_hash_table_lookup (ass_loading, GetCurrentThreadId ());
+       loading = g_hash_table_lookup (ass_loading, (gpointer)GetCurrentThreadId ());
        loading = g_list_remove (loading, ass);
        if (loading == NULL)
                /* Prevent memory leaks */
-               g_hash_table_remove (ass_loading, GetCurrentThreadId ());
+               g_hash_table_remove (ass_loading, (gpointer)GetCurrentThreadId ());
        else
-               g_hash_table_insert (ass_loading, GetCurrentThreadId (), loading);
+               g_hash_table_insert (ass_loading, (gpointer)GetCurrentThreadId (), loading);
        if (*status != MONO_IMAGE_OK) {
                mono_assemblies_unlock ();
                mono_assembly_close (ass);
@@ -1714,10 +1723,11 @@ mono_assembly_name_parse_full (const char *name, MonoAssemblyName *aname, gboole
 * mono_assembly_name_parse:
 * @name: name to parse
 * @aname: the destination assembly name
-* Returns: true if the name could be parsed.
 * 
 * Parses an assembly qualified type name and assigns the name,
 * version, culture and token to the provided assembly name object.
+*
+* Returns: true if the name could be parsed.
 */
 gboolean
 mono_assembly_name_parse (const char *name, MonoAssemblyName *aname)
@@ -2107,7 +2117,22 @@ mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus *
        return corlib;
 }
 
-
+/**
+ * mono_assembly_load_full:
+ * @aname: A MonoAssemblyName with the assembly name to load.
+ * @basedir: A directory to look up the assembly at.
+ * @status: a pointer to a MonoImageOpenStatus to return the status of the load operation
+ * @refonly: Whether this assembly is being opened in "reflection-only" mode.
+ *
+ * Loads the assembly referenced by @aname, if the value of @basedir is not NULL, it
+ * attempts to load the assembly from that directory before probing the standard locations.
+ *
+ * If the assembly is being opened in reflection-only mode (@refonly set to TRUE) then no 
+ * assembly binding takes place.
+ *
+ * Returns: the assembly referenced by @aname loaded or NULL on error.   On error the
+ * value pointed by status is updated with an error code.
+ */
 MonoAssembly*
 mono_assembly_load_full (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status, gboolean refonly)
 {
@@ -2178,6 +2203,18 @@ mono_assembly_load_full (MonoAssemblyName *aname, const char *basedir, MonoImage
        return result;
 }
 
+/**
+ * mono_assembly_load:
+ * @aname: A MonoAssemblyName with the assembly name to load.
+ * @basedir: A directory to look up the assembly at.
+ * @status: a pointer to a MonoImageOpenStatus to return the status of the load operation
+ *
+ * Loads the assembly referenced by @aname, if the value of @basedir is not NULL, it
+ * attempts to load the assembly from that directory before probing the standard locations.
+ *
+ * Returns: the assembly referenced by @aname loaded or NULL on error.   On error the
+ * value pointed by status is updated with an error code.
+ */
 MonoAssembly*
 mono_assembly_load (MonoAssemblyName *aname, const char *basedir, MonoImageOpenStatus *status)
 {
@@ -2199,6 +2236,13 @@ mono_assembly_loaded_full (MonoAssemblyName *aname, gboolean refonly)
        return res;
 }
 
+/**
+ * mono_assembly_loaded:
+ * @aname: an assembly to look for.
+ *
+ * Returns: NULL If the given @aname assembly has not been loaded, or a pointer to
+ * a MonoAssembly that matches the MonoAssemblyName specified.
+ */
 MonoAssembly*
 mono_assembly_loaded (MonoAssemblyName *aname)
 {
@@ -2218,6 +2262,9 @@ mono_assembly_close (MonoAssembly *assembly)
        GSList *tmp;
        g_return_if_fail (assembly != NULL);
 
+       if (assembly == REFERENCE_MISSING)
+               return;
+       
        /* Might be 0 already */
        if (InterlockedDecrement (&assembly->ref_count) > 0)
                return;
@@ -2237,6 +2284,7 @@ mono_assembly_close (MonoAssembly *assembly)
                }
 
                g_free (assembly->image->references);
+               assembly->image->references = NULL;
        }
 
        assembly->image->assembly = NULL;
@@ -2291,7 +2339,7 @@ mono_assembly_foreach (GFunc func, gpointer user_data)
 /**
  * mono_assemblies_cleanup:
  *
- *  Free all resources used by this module.
+ * Free all resources used by this module.
  */
 void
 mono_assemblies_cleanup (void)
@@ -2325,16 +2373,25 @@ static MonoAssembly *main_assembly=NULL;
 void
 mono_assembly_set_main (MonoAssembly *assembly)
 {
-       main_assembly=assembly;
+       main_assembly = assembly;
 }
 
+/**
+ * mono_assembly_get_main:
+ *
+ * Returns: the assembly for the application, the first assembly that is loaded by the VM
+ */
 MonoAssembly *
 mono_assembly_get_main (void)
 {
-       return(main_assembly);
+       return (main_assembly);
 }
 
-/*
+/**
+ * mono_assembly_get_image:
+ * @assembly: The assembly to retrieve the image from
+ *
+ * Returns: the MonoImage associated with this assembly.
  */
 MonoImage*
 mono_assembly_get_image (MonoAssembly *assembly)