2003-11-11 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Tue, 11 Nov 2003 14:56:14 +0000 (14:56 -0000)
committerZoltan Varga <vargaz@gmail.com>
Tue, 11 Nov 2003 14:56:14 +0000 (14:56 -0000)
* debug-helpers.c (mono_type_full_name): New helper function.

* image.h (MonoAssembly): Change 'dynamic' to a boolean.

* image.c (mono_image_load_file_for_image): New public function which
is a replacement for the load_file_for_image in class.c.

* assembly.c (mono_assembly_load_module): A wrapper for the function
above which does assembly association and reference loading too.

* class.c (mono_class_from_name): Call mono_assembly_load_module.

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

mono/metadata/ChangeLog
mono/metadata/assembly.c
mono/metadata/assembly.h
mono/metadata/class.c
mono/metadata/debug-helpers.c
mono/metadata/debug-helpers.h
mono/metadata/image.c
mono/metadata/image.h

index 9789b392eeb772bf5d13d02cecb883db0fd3326b..6ff70be549f8651d23c7b937dea01ae193215c92 100644 (file)
@@ -1,3 +1,17 @@
+2003-11-11  Zoltan Varga  <vargaz@freemail.hu>
+
+       * debug-helpers.c (mono_type_full_name): New helper function.
+
+       * image.h (MonoAssembly): Change 'dynamic' to a boolean.
+
+       * image.c (mono_image_load_file_for_image): New public function which
+       is a replacement for the load_file_for_image in class.c.
+
+       * assembly.c (mono_assembly_load_module): A wrapper for the function
+       above which does assembly association and reference loading too.
+
+       * class.c (mono_class_from_name): Call mono_assembly_load_module.
+
 2003-11-11  Gonzalo Paniagua Javier <gonzalo@ximian.com>
 
        * appdomain.c: not all of the attributes for the full assembly name
index 912e2a68c1d83526b94758db5554b50358bb74d0..9908b286ea48e24b0a33aa1ae2ca3b6d5d2641cb 100644 (file)
@@ -652,6 +652,19 @@ mono_assembly_close (MonoAssembly *assembly)
        g_free (assembly);
 }
 
+MonoImage*
+mono_assembly_load_module (MonoAssembly *assembly, guint32 idx)
+{
+       MonoImageOpenStatus status;
+       MonoImage *module;
+
+       module = mono_image_load_file_for_image (assembly->image, idx);
+       if (module)
+               mono_assembly_load_references (module, &status);
+
+       return module;
+}
+
 void
 mono_assembly_foreach (GFunc func, gpointer user_data)
 {
index 6d744ac4123ccad0bcf7c22f4ff3bb9df92d4155..382f0a79d49b65039f863409f4341bc7cf15e4da 100644 (file)
@@ -13,6 +13,7 @@ MonoAssembly *mono_assembly_open       (const char *filename,
 MonoAssembly* mono_assembly_load       (MonoAssemblyName *aname, 
                                                const char       *basedir, 
                                        MonoImageOpenStatus *status);
+MonoImage*    mono_assembly_load_module (MonoAssembly *assembly, guint32 idx);
 void          mono_assembly_close      (MonoAssembly *assembly);
 void          mono_assembly_setrootdir (const char *root_dir);
 void         mono_assembly_foreach    (GFunc func, gpointer user_data);
index aa802c5a1065ad2c377558f775baceb22e57d66e..6fa5ded950641f63f34d1ff8adc53cb2209c8956 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <signal.h>
 #include <mono/metadata/image.h>
+#include <mono/metadata/assembly.h>
 #include <mono/metadata/cil-coff.h>
 #include <mono/metadata/metadata.h>
 #include <mono/metadata/tabledefs.h>
@@ -2258,37 +2259,6 @@ mono_class_from_name_case (MonoImage *image, const char* name_space, const char
        return NULL;
 }
 
-static MonoImage*
-load_file_for_image (MonoImage *image, int fileidx)
-{
-       char *base_dir, *name;
-       MonoImage *res;
-       MonoTableInfo  *t = &image->tables [MONO_TABLE_FILE];
-       const char *fname;
-       guint32 fname_id;
-
-       if (fileidx < 1 || fileidx > t->rows)
-               return NULL;
-       fname_id = mono_metadata_decode_row_col (t, fileidx - 1, MONO_FILE_NAME);
-       fname = mono_metadata_string_heap (image, fname_id);
-       base_dir = g_path_get_dirname (image->name);
-       name = g_build_filename (base_dir, fname, NULL);
-       res = mono_image_open (name, NULL);
-       if (res) {
-               int i;
-               t = &res->tables [MONO_TABLE_MODULEREF];
-               //g_print ("loaded file %s from %s (%p)\n", name, image->name, image->assembly);
-               res->assembly = image->assembly;
-               for (i = 0; i < t->rows; ++i) {
-                       if (res->modules [i] && !res->modules [i]->assembly)
-                               res->modules [i]->assembly = image->assembly;
-               }
-       }
-       g_free (name);
-       g_free (base_dir);
-       return res;
-}
-
 static MonoClass*
 return_nested_in (MonoClass *class, char *nested) {
        MonoClass *found;
@@ -2354,7 +2324,7 @@ mono_class_from_name (MonoImage *image, const char* name_space, const char *name
                        if (strcmp (name, ename) == 0 && strcmp (name_space, enspace) == 0) {
                                guint32 impl = cols [MONO_EXP_TYPE_IMPLEMENTATION];
                                if ((impl & IMPLEMENTATION_MASK) == IMPLEMENTATION_FILE) {
-                                       loaded_image = load_file_for_image (image, impl >> IMPLEMENTATION_BITS);
+                                       loaded_image = mono_assembly_load_module (image->assembly, impl >> IMPLEMENTATION_BITS);
                                        if (!loaded_image)
                                                return NULL;
                                        class = mono_class_from_name (loaded_image, name_space, name);
index 1d2268239eae87a8fdb78c7f272355b54a2518a3..35b188f7721aa8baaea7627d5439ef13130d3928 100644 (file)
@@ -108,6 +108,20 @@ mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace) {
                g_string_append_c (res, '&');
 }
 
+char*
+mono_type_full_name (MonoType *type)
+{
+       GString *str;
+       char *res;
+
+       str = g_string_new ("");
+       mono_type_get_desc (str, type, TRUE);
+
+       res = g_strdup (str->str);
+       g_string_free (str, TRUE);
+       return res;
+}
+
 char*
 mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace)
 {
@@ -471,7 +485,7 @@ mono_method_full_name (MonoMethod *method, gboolean signature)
                if (method->wrapper_type != MONO_WRAPPER_NONE)
                        sprintf (wrapper, "(wrapper %s) ", wrapper_type_to_str (method->wrapper_type));
                else
-                       sprintf (wrapper, "");
+                       strcpy (wrapper, "");
                res = g_strdup_printf ("%s%s.%s:%s (%s)", wrapper, method->klass->name_space, 
                                       method->klass->name, method->name, tmpsig);
                g_free (tmpsig);
index 2622c2af3cda93c64845cab19a4328c656556d4f..56fbaddf9f7ed6174b96b1a81b973dfaa44e0b7d 100644 (file)
@@ -24,6 +24,8 @@ char* mono_disasm_code     (MonoDisHelper *dh, MonoMethod *method, const guchar
 typedef struct MonoMethodDesc MonoMethodDesc;
 
 void            mono_type_get_desc (GString *res, MonoType *type, gboolean include_namespace);
+char*           mono_type_full_name (MonoType *type);
+
 char*           mono_signature_get_desc (MonoMethodSignature *sig, gboolean include_namespace);
 
 MonoMethodDesc* mono_method_desc_new (const char *name, gboolean include_namespace);
index 852e1c2991cb2656fc405353bc995893a3bb112b..5966a6ae21b5cf4716262b73aa50b0524ef67a8c 100644 (file)
@@ -1104,6 +1104,37 @@ mono_image_get_resource (MonoImage *image, guint32 offset, guint32 *size)
        return data;
 }
 
+MonoImage*
+mono_image_load_file_for_image (MonoImage *image, int fileidx)
+{
+       char *base_dir, *name;
+       MonoImage *res;
+       MonoTableInfo  *t = &image->tables [MONO_TABLE_FILE];
+       const char *fname;
+       guint32 fname_id;
+
+       if (fileidx < 1 || fileidx > t->rows)
+               return NULL;
+       fname_id = mono_metadata_decode_row_col (t, fileidx - 1, MONO_FILE_NAME);
+       fname = mono_metadata_string_heap (image, fname_id);
+       base_dir = g_path_get_dirname (image->name);
+       name = g_build_filename (base_dir, fname, NULL);
+       res = mono_image_open (name, NULL);
+       if (res) {
+               int i;
+               t = &res->tables [MONO_TABLE_MODULEREF];
+               //g_print ("loaded file %s from %s (%p)\n", name, image->name, image->assembly);
+               res->assembly = image->assembly;
+               for (i = 0; i < t->rows; ++i) {
+                       if (res->modules [i] && !res->modules [i]->assembly)
+                               res->modules [i]->assembly = image->assembly;
+               }
+       }
+       g_free (name);
+       g_free (base_dir);
+       return res;
+}
+
 const char*
 mono_image_get_strong_name (MonoImage *image, guint32 *size)
 {
index fd7e3966fc61975c45c9afae0bb950e03b33a9cf..04f138c462f2c399da65fd6a47797bc408181a5e 100644 (file)
@@ -25,7 +25,7 @@ typedef struct {
        GModule *aot_module;
        MonoImage *image;
        /* Load files here */
-       void *dynamic;
+       gboolean dynamic;
 } MonoAssembly;
 
 typedef struct {
@@ -165,6 +165,7 @@ int           mono_image_ensure_section_idx (MonoImage *image,
 
 guint32       mono_image_get_entry_point    (MonoImage *image);
 const char   *mono_image_get_resource       (MonoImage *image, guint32 offset, guint32 *size);
+MonoImage*    mono_image_load_file_for_image (MonoImage *image, int fileidx);
 
 /* This actually returns a MonoPEResourceDataEntry *, but declaring it
  * causes an include file loop.