+ * LOCKING: Assumes the debugger lock is held.
+ */
+static MonoDebugSourceInfo*
+get_source_info (MonoSymbolFile *symfile, int index)
+{
+ MonoDebugSourceInfo *info;
+
+ info = g_hash_table_lookup (symfile->source_hash, GUINT_TO_POINTER (index));
+ if (!info) {
+ int offset = read32(&(symfile->offset_table->_source_table_offset)) +
+ (index - 1) * sizeof (MonoSymbolFileSourceEntry);
+ MonoSymbolFileSourceEntry *se = (MonoSymbolFileSourceEntry *)
+ (symfile->raw_contents + offset);
+ const uint8_t *ptr = symfile->raw_contents + read32(&(se->_data_offset));
+
+ info = g_new0 (MonoDebugSourceInfo, 1);
+ info->source_file = read_string (ptr, &ptr);
+ info->guid = g_malloc0 (16);
+ memcpy (info->guid, ptr, 16);
+ ptr += 16;
+ info->hash = g_malloc0 (16);
+ memcpy (info->hash, ptr, 16);
+ ptr += 16;
+ g_hash_table_insert (symfile->source_hash, GUINT_TO_POINTER (index), info);
+ }
+ return info;
+}
+
+static gboolean
+method_has_column_info (MonoDebugMethodInfo *minfo)
+{
+ MonoSymbolFile *symfile;
+ const unsigned char *ptr;
+ guint32 flags;
+
+ if ((symfile = minfo->handle->symfile) == NULL)
+ return FALSE;
+
+ ptr = symfile->raw_contents + minfo->data_offset;
+
+ /* Has to read 'flags' which is preceeded by a bunch of other data */
+ /* compile_unit_index */
+ read_leb128 (ptr, &ptr);
+ /* local variable table offset */
+ read_leb128 (ptr, &ptr);
+ /* namespace id */
+ read_leb128 (ptr, &ptr);
+ /* code block table offset */
+ read_leb128 (ptr, &ptr);
+ /* scope variable table offset */
+ read_leb128 (ptr, &ptr);
+ /* real name offset */
+ read_leb128 (ptr, &ptr);
+
+ flags = read_leb128 (ptr, &ptr);
+ return (flags & 2) > 0;
+}
+
+/*
+ * mono_debug_symfile_get_line_numbers_full: