[ppdb] Fix support for Assembly.LoadFrom(). Fixes #33550.
authorZoltan Varga <vargaz@gmail.com>
Tue, 1 Sep 2015 19:03:41 +0000 (15:03 -0400)
committerZoltan Varga <vargaz@gmail.com>
Tue, 1 Sep 2015 19:03:47 +0000 (15:03 -0400)
mono/metadata/debug-mono-ppdb.c
mono/metadata/debug-mono-ppdb.h
mono/metadata/image.c
mono/metadata/metadata-internals.h
mono/metadata/mono-debug.c

index 728a0de1591828faeb737be2b118e26cb21a8914..d8da52cfb04fb1d35165a4ec67e4a3022a332322 100644 (file)
@@ -33,7 +33,7 @@ struct _MonoPPDBFile {
 };
 
 MonoPPDBFile*
-mono_ppdb_load_file (MonoImage *image)
+mono_ppdb_load_file (MonoImage *image, const guint8 *raw_contents, int size)
 {
        MonoImage *ppdb_image;
        const char *filename;
@@ -46,18 +46,22 @@ mono_ppdb_load_file (MonoImage *image)
 #endif
        MonoPPDBFile *ppdb;
 
-       /* ppdb files drop the .exe/.dll extension */
-       filename = mono_image_get_filename (image);
-       if (strlen (filename) > 4 && (!strcmp (filename + strlen (filename) - 4, ".exe"))) {
-               s = g_strdup (filename);
-               s [strlen (filename) - 4] = '\0';
-               ppdb_filename = g_strdup_printf ("%s.pdb", s);
-               g_free (s);
+       if (raw_contents) {
+               ppdb_image = mono_image_open_from_data_internal ((char*)raw_contents, size, TRUE, NULL, FALSE, TRUE, NULL);
        } else {
-               ppdb_filename = g_strdup_printf ("%s.pdb", filename);
-       }
+               /* ppdb files drop the .exe/.dll extension */
+               filename = mono_image_get_filename (image);
+               if (strlen (filename) > 4 && (!strcmp (filename + strlen (filename) - 4, ".exe"))) {
+                       s = g_strdup (filename);
+                       s [strlen (filename) - 4] = '\0';
+                       ppdb_filename = g_strdup_printf ("%s.pdb", s);
+                       g_free (s);
+               } else {
+                       ppdb_filename = g_strdup_printf ("%s.pdb", filename);
+               }
 
-       ppdb_image = mono_image_open_metadata_only (ppdb_filename, &status);
+               ppdb_image = mono_image_open_metadata_only (ppdb_filename, &status);
+       }
        if (!ppdb_image)
                return NULL;
 
index d90120e58073dbee24e1631f149b39f2682d04c1..e23b279cd94007bf047878082857aaa09e0da49c 100644 (file)
@@ -17,7 +17,7 @@
 #include <mono/metadata/mono-debug.h>
 
 MonoPPDBFile*
-mono_ppdb_load_file (MonoImage *image);
+mono_ppdb_load_file (MonoImage *image, const guint8 *raw_contents, int size);
 
 void
 mono_ppdb_close (MonoDebugHandle *handle);
index ec0e05cfecf8e5941c423c5f363d8c2653dc8c21..56403f3463a61b24e0fc601a4b9fbb761ec78eae 100644 (file)
@@ -1145,7 +1145,7 @@ register_image (MonoImage *image)
 }
 
 MonoImage *
-mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
+mono_image_open_from_data_internal (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, gboolean metadata_only, const char *name)
 {
        MonoCLIImageInfo *iinfo;
        MonoImage *image;
@@ -1175,6 +1175,7 @@ mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need
        iinfo = g_new0 (MonoCLIImageInfo, 1);
        image->image_info = iinfo;
        image->ref_only = refonly;
+       image->metadata_only = metadata_only;
 
        image = do_mono_image_load (image, status, TRUE, TRUE);
        if (image == NULL)
@@ -1183,6 +1184,12 @@ mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need
        return register_image (image);
 }
 
+MonoImage *
+mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
+{
+       return mono_image_open_from_data_internal (data, data_len, need_copy, status, refonly, FALSE, name);
+}
+
 MonoImage *
 mono_image_open_from_data_full (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly)
 {
index 0bed5a2ee0bbb278b7135affef5b599e90052ad3..97723beeb97505f1cd41c256748bcb408ec5b46e 100644 (file)
@@ -827,6 +827,8 @@ MonoImage *mono_image_open_raw (const char *fname, MonoImageOpenStatus *status);
 
 MonoImage *mono_image_open_metadata_only (const char *fname, MonoImageOpenStatus *status);
 
+MonoImage *mono_image_open_from_data_internal (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, gboolean metadata_only, const char *name);
+
 MonoException *mono_get_exception_field_access_msg (const char *msg);
 
 MonoException *mono_get_exception_method_access_msg (const char *msg);
index fb12af22a48bae251ef9ac7ed750a952ce00b87f..42c980214eb53a73ef54cd57c7e3af979dd362d0 100644 (file)
@@ -262,7 +262,7 @@ mono_debug_open_image (MonoImage *image, const guint8 *raw_contents, int size)
        mono_image_addref (image);
 
        /* Try a ppdb file first */
-       handle->ppdb = mono_ppdb_load_file (handle->image);
+       handle->ppdb = mono_ppdb_load_file (handle->image, raw_contents, size);
 
        if (!handle->ppdb)
                handle->symfile = mono_debug_open_mono_symbols (handle, raw_contents, size, FALSE);