2003-11-16 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sun, 16 Nov 2003 17:20:03 +0000 (17:20 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sun, 16 Nov 2003 17:20:03 +0000 (17:20 -0000)
* assembly.c (mono_assembly_fill_assembly_name): New function to
fill out the MonoAssemblyName structure.
(mono_assembly_open): Use the new function.

* icall.c (fill_reflection_assembly_name): New helper function.

* icall.c (ves_icall_System_Reflection_Assembly_FillName): Use the
new function.

* icall.c (ves_icall_System_Reflection_Assembly_InternalGetAssemblyName): New icall.

svn path=/trunk/mono/; revision=20066

mono/metadata/ChangeLog
mono/metadata/assembly.c
mono/metadata/assembly.h
mono/metadata/icall.c

index 05e870b4decafa6431fef6bd5983067fe2a1e21c..92012a21d676e87685e027d53e8baa2403e97c48 100644 (file)
@@ -1,3 +1,16 @@
+2003-11-16  Zoltan Varga  <vargaz@freemail.hu>
+
+       * assembly.c (mono_assembly_fill_assembly_name): New function to
+       fill out the MonoAssemblyName structure.
+       (mono_assembly_open): Use the new function.
+
+       * icall.c (fill_reflection_assembly_name): New helper function.
+
+       * icall.c (ves_icall_System_Reflection_Assembly_FillName): Use the
+       new function.
+
+       * icall.c (ves_icall_System_Reflection_Assembly_InternalGetAssemblyName): New icall.
+
 2003-11-15  Martin Baulig  <martin@ximian.com>
 
        * class.c (mono_class_is_open_constructed_type): New public
index c2435f2206c7cc9343fd95fd622539defc289142..4ba90348b75d07eac4173e440096bb2ca3e3f772 100644 (file)
@@ -168,6 +168,35 @@ mono_assemblies_init (void)
        assemblies_loading = g_hash_table_new (NULL, NULL);
 }
 
+gboolean
+mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname)
+{
+       MonoTableInfo *t = &image->tables [MONO_TABLE_ASSEMBLY];
+       guint32 cols [MONO_ASSEMBLY_SIZE];
+
+       if (!t->rows)
+               return FALSE;
+
+       mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
+
+       aname->hash_len = 0;
+       aname->hash_value = NULL;
+       aname->name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]);
+       aname->culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]);
+       aname->flags = cols [MONO_ASSEMBLY_FLAGS];
+       aname->major = cols [MONO_ASSEMBLY_MAJOR_VERSION];
+       aname->minor = cols [MONO_ASSEMBLY_MINOR_VERSION];
+       aname->build = cols [MONO_ASSEMBLY_BUILD_NUMBER];
+       aname->revision = cols [MONO_ASSEMBLY_REV_NUMBER];
+       aname->hash_alg = cols [MONO_ASSEMBLY_HASH_ALG];
+       if (cols [MONO_ASSEMBLY_PUBLIC_KEY])
+               aname->public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
+       else
+               aname->public_key = 0;
+
+       return TRUE;
+}
+
 static void
 mono_assembly_load_references (MonoImage *image, MonoImageOpenStatus *status)
 {
@@ -425,8 +454,6 @@ mono_assembly_open (const char *filename, MonoImageOpenStatus *status)
 {
        MonoAssembly *ass, *ass2;
        MonoImage *image;
-       MonoTableInfo *t;
-       guint32 cols [MONO_ASSEMBLY_SIZE];
        char *base_dir;
        MonoImageOpenStatus def_status;
        gchar *fname;
@@ -499,23 +526,7 @@ mono_assembly_open (const char *filename, MonoImageOpenStatus *status)
 
        g_free (fname);
 
-       t = &image->tables [MONO_TABLE_ASSEMBLY];
-       if (t->rows) {
-               mono_metadata_decode_row (t, 0, cols, MONO_ASSEMBLY_SIZE);
-
-               ass->aname.hash_len = 0;
-               ass->aname.hash_value = NULL;
-               ass->aname.name = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_NAME]);
-               ass->aname.culture = mono_metadata_string_heap (image, cols [MONO_ASSEMBLY_CULTURE]);
-               ass->aname.flags = cols [MONO_ASSEMBLY_FLAGS];
-               ass->aname.major = cols [MONO_ASSEMBLY_MAJOR_VERSION];
-               ass->aname.minor = cols [MONO_ASSEMBLY_MINOR_VERSION];
-               ass->aname.build = cols [MONO_ASSEMBLY_BUILD_NUMBER];
-               ass->aname.revision = cols [MONO_ASSEMBLY_REV_NUMBER];
-               ass->aname.hash_alg = cols [MONO_ASSEMBLY_HASH_ALG];
-               if (cols [MONO_ASSEMBLY_PUBLIC_KEY])
-                       ass->aname.public_key = mono_metadata_blob_heap (image, cols [MONO_ASSEMBLY_PUBLIC_KEY]);
-       }
+       mono_assembly_fill_assembly_name (image, &ass->aname);
 
        /* 
         * Atomically search the loaded list and add ourselves to it if necessary.
index 41a306699fc2220437ba2dd310e4fd7afc3a7df3..7967e52808203e854262e778cdd15021aac59e98 100644 (file)
@@ -17,6 +17,7 @@ void          mono_assembly_setrootdir (const char *root_dir);
 void         mono_assembly_foreach    (GFunc func, gpointer user_data);
 void          mono_assembly_set_main   (MonoAssembly *assembly);
 MonoAssembly *mono_assembly_get_main   (void);
+gboolean      mono_assembly_fill_assembly_name (MonoImage *image, MonoAssemblyName *aname);
 
 /* Installs a function which is called each time a new assembly is loaded. */
 typedef void  (*MonoAssemblyLoadFunc)         (MonoAssembly *assembly, gpointer user_data);
index 9010b6d20c3969cb8f197c18dd738cf7572d625a..ff242f0daae4015fd91f2ce7ed42989ebad69571 100644 (file)
@@ -2911,22 +2911,20 @@ ves_icall_System_MonoType_getFullName (MonoReflectionType *object)
 }
 
 static void
-ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
+fill_reflection_assembly_name (MonoDomain *domain, MonoReflectionAssemblyName *aname, MonoAssemblyName *name, const char *absolute)
 {
-       MonoAssemblyName *name = &assembly->assembly->aname;
        static MonoMethod *create_culture = NULL;
     gpointer args [1];
        guint32 pkey_len;
        const char *pkey_ptr;
-       gchar *absolute;
        gchar *codebase;
 
        MONO_ARCH_SAVE_REGS;
 
        if (strcmp (name->name, "corlib") == 0)
-               aname->name = mono_string_new (mono_object_domain (assembly), "mscorlib");
+               aname->name = mono_string_new (domain, "mscorlib");
        else
-               aname->name = mono_string_new (mono_object_domain (assembly), name->name);
+               aname->name = mono_string_new (domain, name->name);
 
        aname->major = name->major;
        aname->minor = name->minor;
@@ -2934,11 +2932,11 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly,
        aname->revision = name->revision;
        aname->hashalg = name->hash_alg;
 
-       absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
        codebase = g_filename_to_uri (absolute, NULL, NULL);
-       aname->codebase = mono_string_new (mono_object_domain (assembly), codebase);
-       g_free (codebase);
-       g_free (absolute);
+       if (codebase) {
+               aname->codebase = mono_string_new (domain, codebase);
+               g_free (codebase);
+       }
 
        if (!create_culture) {
                MonoMethodDesc *desc = mono_method_desc_new ("System.Globalization.CultureInfo:CreateSpecificCulture(string)", TRUE);
@@ -2947,7 +2945,7 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly,
                mono_method_desc_free (desc);
        }
 
-       args [0] = mono_string_new (mono_object_domain (assembly), name->culture);
+       args [0] = mono_string_new (domain, name->culture);
        aname->cultureInfo = 
                mono_runtime_invoke (create_culture, NULL, args, NULL);
 
@@ -2955,11 +2953,60 @@ ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly,
                pkey_ptr = name->public_key;
                pkey_len = mono_metadata_decode_blob_size (pkey_ptr, &pkey_ptr);
 
-               aname->publicKey = mono_array_new (mono_object_domain (assembly), mono_defaults.byte_class, pkey_len);
+               aname->publicKey = mono_array_new (domain, mono_defaults.byte_class, pkey_len);
                memcpy (mono_array_addr (aname->publicKey, guint8, 0), pkey_ptr, pkey_len);
        }
 }
 
+static void
+ves_icall_System_Reflection_Assembly_FillName (MonoReflectionAssembly *assembly, MonoReflectionAssemblyName *aname)
+{
+       gchar *absolute;
+
+       MONO_ARCH_SAVE_REGS;
+
+       absolute = g_build_filename (assembly->assembly->basedir, assembly->assembly->image->module_name, NULL);
+
+       fill_reflection_assembly_name (mono_object_domain (assembly), aname, 
+                                                                  &assembly->assembly->aname, absolute);
+
+       g_free (absolute);
+}
+
+static void
+ves_icall_System_Reflection_Assembly_InternalGetAssemblyName (MonoString *fname, MonoReflectionAssemblyName *aname)
+{
+       char *filename;
+       MonoImageOpenStatus status = MONO_IMAGE_OK;
+       gboolean res;
+       MonoImage *image;
+       MonoAssemblyName name;
+
+       MONO_ARCH_SAVE_REGS;
+
+       filename = mono_string_to_utf8 (fname);
+
+       image = mono_image_open (filename, &status);
+       
+       if (!image){
+               g_free (filename);
+               MonoException *exc = mono_get_exception_file_not_found (fname);
+               mono_raise_exception (exc);
+       }
+
+       res = mono_assembly_fill_assembly_name (image, &name);
+       if (!res) {
+               mono_image_close (image);
+               g_free (filename);
+               mono_raise_exception (mono_get_exception_argument ("assemblyFile", "The file does not contain a manifest"));
+       }
+
+       fill_reflection_assembly_name (mono_domain_get (), aname, &name, filename);
+
+       g_free (filename);
+       mono_image_close (image);
+}
+
 static MonoArray*
 mono_module_get_types (MonoDomain *domain, MonoImage *image, 
                                           MonoBoolean exportedOnly)
@@ -4431,6 +4478,7 @@ static gconstpointer icall_map [] = {
        "System.Reflection.Assembly::InternalGetType", ves_icall_System_Reflection_Assembly_InternalGetType,
        "System.Reflection.Assembly::GetTypes", ves_icall_System_Reflection_Assembly_GetTypes,
        "System.Reflection.Assembly::FillName", ves_icall_System_Reflection_Assembly_FillName,
+       "System.Reflection.Assembly::InternalGetAssemblyName", ves_icall_System_Reflection_Assembly_InternalGetAssemblyName,
        "System.Reflection.Assembly::get_code_base", ves_icall_System_Reflection_Assembly_get_code_base,
        "System.Reflection.Assembly::get_location", ves_icall_System_Reflection_Assembly_get_location,
        "System.Reflection.Assembly::InternalImageRuntimeVersion", ves_icall_System_Reflection_Assembly_InternalImageRuntimeVersion,