};
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;
char *s, *ppdb_filename;
MonoImageOpenStatus status;
+#if 0
MonoTableInfo *tables;
guint32 cols [MONO_MODULE_SIZE];
const char *guid, *ppdb_guid;
+#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;
+#if 0
/* Check that the images match */
+ // FIXME: ppdb files no longer have a MODULE table */
tables = image->tables;
g_assert (tables [MONO_TABLE_MODULE].rows);
mono_metadata_decode_row (&tables [MONO_TABLE_MODULE], 0, cols, MONO_MODULE_SIZE);
mono_image_close (ppdb_image);
return NULL;
}
+#endif
ppdb = g_new0 (MonoPPDBFile, 1);
ppdb->image = ppdb_image;
const char *end;
char *docname;
int idx, size, docidx, iloffset, delta_il, delta_lines, delta_cols, start_line, start_col, adv_line, adv_col;
+ gboolean first = TRUE, first_non_hidden = TRUE;
MonoDebugSourceLocation *location;
g_assert (method->token);
size = mono_metadata_decode_blob_size (ptr, &ptr);
end = ptr + size;
- /* First record */
+ /* Header */
+ /* LocalSignature */
+ mono_metadata_decode_value (ptr, &ptr);
docidx = mono_metadata_decode_value (ptr, &ptr);
docname = get_docname (ppdb, image, docidx);
- iloffset = mono_metadata_decode_value (ptr, &ptr);
- delta_lines = mono_metadata_decode_value (ptr, &ptr);
- if (delta_lines == 0)
- delta_cols = mono_metadata_decode_value (ptr, &ptr);
- else
- delta_cols = mono_metadata_decode_signed_value (ptr, &ptr);
- start_line = mono_metadata_decode_value (ptr, &ptr);
- start_col = mono_metadata_decode_value (ptr, &ptr);
+ iloffset = 0;
+ start_line = 0;
+ start_col = 0;
while (ptr < end) {
- if (iloffset > offset)
- break;
-
delta_il = mono_metadata_decode_value (ptr, &ptr);
- if (delta_il == 0)
+ if (!first && delta_il == 0) {
+ /* Document record */
// FIXME:
g_assert_not_reached ();
+ }
+ if (!first && iloffset + delta_il > offset)
+ break;
+ iloffset += delta_il;
+ first = FALSE;
delta_lines = mono_metadata_decode_value (ptr, &ptr);
if (delta_lines == 0)
if (delta_lines == 0 && delta_cols == 0)
// FIXME:
g_assert_not_reached ();
- adv_line = mono_metadata_decode_signed_value (ptr, &ptr);
- adv_col = mono_metadata_decode_signed_value (ptr, &ptr);
-
- if (iloffset + delta_il > offset)
- break;
-
- iloffset += delta_il;
- start_line += adv_line;
- start_col += adv_col;
+ if (first_non_hidden) {
+ start_line = mono_metadata_decode_value (ptr, &ptr);
+ start_col = mono_metadata_decode_value (ptr, &ptr);
+ } else {
+ adv_line = mono_metadata_decode_signed_value (ptr, &ptr);
+ adv_col = mono_metadata_decode_signed_value (ptr, &ptr);
+ start_line += adv_line;
+ start_col += adv_col;
+ }
+ first_non_hidden = TRUE;
}
location = g_new0 (MonoDebugSourceLocation, 1);
const char *end;
MonoDebugSourceInfo *docinfo;
int i, method_idx, size, docidx, iloffset, delta_il, delta_lines, delta_cols, start_line, start_col, adv_line, adv_col;
+ gboolean first = TRUE, first_non_hidden = TRUE;
GArray *sps;
MonoSymSeqPoint sp;
GPtrArray *sfiles = NULL;
sps = g_array_new (FALSE, TRUE, sizeof (MonoSymSeqPoint));
- /* First record */
+ /* Header */
+ /* LocalSignature */
+ mono_metadata_decode_value (ptr, &ptr);
docidx = mono_metadata_decode_value (ptr, &ptr);
docinfo = get_docinfo (ppdb, image, docidx);
- iloffset = mono_metadata_decode_value (ptr, &ptr);
- delta_lines = mono_metadata_decode_value (ptr, &ptr);
- if (delta_lines == 0)
- delta_cols = mono_metadata_decode_value (ptr, &ptr);
- else
- delta_cols = mono_metadata_decode_signed_value (ptr, &ptr);
- start_line = mono_metadata_decode_value (ptr, &ptr);
- start_col = mono_metadata_decode_value (ptr, &ptr);
-
if (sfiles)
g_ptr_array_add (sfiles, docinfo);
- if (source_files)
- g_ptr_array_add (sindexes, GUINT_TO_POINTER (sfiles->len - 1));
-
- memset (&sp, 0, sizeof (sp));
- sp.il_offset = iloffset;
- sp.line = start_line;
- sp.column = start_col;
- sp.end_line = start_line + delta_lines;
- sp.end_column = start_col + delta_cols;
-
- g_array_append_val (sps, sp);
+ iloffset = 0;
+ start_line = 0;
+ start_col = 0;
while (ptr < end) {
delta_il = mono_metadata_decode_value (ptr, &ptr);
- if (delta_il == 0) {
+ if (!first && delta_il == 0) {
/* subsequent-document-record */
docidx = mono_metadata_decode_value (ptr, &ptr);
docinfo = get_docinfo (ppdb, image, docidx);
g_ptr_array_add (sfiles, docinfo);
continue;
}
+ iloffset += delta_il;
+ first = FALSE;
+
delta_lines = mono_metadata_decode_value (ptr, &ptr);
if (delta_lines == 0)
delta_cols = mono_metadata_decode_value (ptr, &ptr);
if (delta_lines == 0 && delta_cols == 0) {
/* Hidden sequence point */
- // FIXME: This seems to be followed by garbage
continue;
}
- adv_line = mono_metadata_decode_signed_value (ptr, &ptr);
- adv_col = mono_metadata_decode_signed_value (ptr, &ptr);
-
- iloffset += delta_il;
- start_line += adv_line;
- start_col += adv_col;
+ if (first_non_hidden) {
+ start_line = mono_metadata_decode_value (ptr, &ptr);
+ start_col = mono_metadata_decode_value (ptr, &ptr);
+ } else {
+ adv_line = mono_metadata_decode_signed_value (ptr, &ptr);
+ adv_col = mono_metadata_decode_signed_value (ptr, &ptr);
+ start_line += adv_line;
+ start_col += adv_col;
+ }
+ first_non_hidden = TRUE;
memset (&sp, 0, sizeof (sp));
sp.il_offset = iloffset;