2010-06-03 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 3 Jun 2010 17:24:57 +0000 (17:24 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 3 Jun 2010 17:24:57 +0000 (17:24 -0000)
* dwarfwriter.c: Update after the mono_debug_lookup_locals () changes.

* debugger-agent.c (method_commands_internal): Ditto. Return scope information for
locals.

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

mono/mini/ChangeLog
mono/mini/debugger-agent.c
mono/mini/dwarfwriter.c

index bf98783c46a334f66a967e6abfe530c82e620996..018e010bfcb2d061f79894f1f8ddd5c3a577193a 100755 (executable)
@@ -1,3 +1,10 @@
+2010-06-03  Zoltan Varga  <vargaz@gmail.com>
+
+       * dwarfwriter.c: Update after the mono_debug_lookup_locals () changes.
+
+       * debugger-agent.c (method_commands_internal): Ditto. Return scope information for
+       locals.
+
 2010-06-03  Zoltan Varga  <vargaz@gmail.com>
 
        * debugger-agent.c (appdomain_unload): Clear all breakpoint instances in the dying
index b1fe15568158dc4680e310ba0d5d8ffbfcdba94b..2c4d3009537a04a76a825b7ff65c30a89eb921e8 100644 (file)
@@ -5983,8 +5983,7 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g
        }
        case CMD_METHOD_GET_LOCALS_INFO: {
                int i, j, num_locals;
-               char **local_names;
-               int *local_indexes;
+               MonoDebugLocalsInfo *locals;
 
                header = mono_method_get_header (method);
                g_assert (header);
@@ -5996,27 +5995,39 @@ method_commands_internal (int command, MonoMethod *method, MonoDomain *domain, g
                        buffer_add_typeid (buf, domain, mono_class_from_mono_type (header->locals [i]));
 
                /* Names */
-               num_locals = mono_debug_lookup_locals (method, &local_names, &local_indexes);
+               locals = mono_debug_lookup_locals (method);
+               if (locals)
+                       num_locals = locals->num_locals;
+               else
+                       num_locals = 0;
                for (i = 0; i < header->num_locals; ++i) {
                        for (j = 0; j < num_locals; ++j)
-                               if (local_indexes [j] == i)
+                               if (locals->locals [j].index == i)
                                        break;
                        if (j < num_locals)
-                               buffer_add_string (buf, local_names [j]);
+                               buffer_add_string (buf, locals->locals [j].name);
                        else
                                buffer_add_string (buf, "");
                }
-               g_free (local_names);
-               g_free (local_indexes);
 
-               /* Live ranges */
-               /* FIXME: This works because we set debug_options.mdb_optimizations */
+               /* Scopes */
                for (i = 0; i < header->num_locals; ++i) {
-                       buffer_add_int (buf, 0);
-                       buffer_add_int (buf, header->code_size);
+                       for (j = 0; j < num_locals; ++j)
+                               if (locals->locals [j].index == i)
+                                       break;
+                       if (j < num_locals && locals->locals [j].block) {
+                               buffer_add_int (buf, locals->locals [j].block->start_offset);
+                               buffer_add_int (buf, locals->locals [j].block->end_offset);
+                       } else {
+                               buffer_add_int (buf, 0);
+                               buffer_add_int (buf, header->code_size);
+                       }
                }
                mono_metadata_free_mh (header);
 
+               if (locals)
+                       mono_debug_symfile_free_locals (locals);
+
                break;
        }
        case CMD_METHOD_GET_INFO:
index 1541629d4d12047459c7ade7ef7c1fd09a24905f..730fab12ef672c8e9c176b2d0d15fe106a2f54b3 100644 (file)
@@ -1585,9 +1585,8 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
        MonoMethodSignature *sig;
        MonoMethodHeader *header;
        char **names;
-       char **local_names;
-       int *local_indexes;
-       int i, num_locals;
+       MonoDebugLocalsInfo *locals_info;
+       int i;
        guint8 buf [128];
        guint8 *p;
 
@@ -1690,7 +1689,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
        g_free (names);
 
        /* Locals */
-       num_locals = mono_debug_lookup_locals (method, &local_names, &local_indexes);
+       locals_info = mono_debug_lookup_locals (method);
 
        for (i = 0; i < header->num_locals; ++i) {
                MonoInst *ins = locals [i];
@@ -1698,6 +1697,7 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
                int j;
                MonoMethodVar *vmv = NULL;
                gboolean need_loclist = FALSE;
+               char *lname;
 
                /* ins->dreg no longer contains the original vreg */
                vmv = find_vmv (cfg, ins);
@@ -1710,11 +1710,16 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
 
                emit_uleb128 (w, need_loclist ? ABBREV_VARIABLE_LOCLIST : ABBREV_VARIABLE);
                /* name */
-               for (j = 0; j < num_locals; ++j)
-                       if (local_indexes [j] == i)
-                               break;
-               if (j < num_locals) {
-                       emit_string (w, local_names [j]);
+               lname = NULL;
+               if (locals_info) {
+                       for (j = 0; j < locals_info->num_locals; ++j)
+                               if (locals_info->locals [j].index == i)
+                                       break;
+                       if (j < locals_info->num_locals)
+                               lname = locals_info->locals [j].name;
+               }
+               if (lname) {
+                       emit_string (w, lname);
                } else {
                        sprintf (name_buf, "V_%d", i);
                        emit_string (w, name_buf);
@@ -1739,8 +1744,8 @@ mono_dwarf_writer_emit_method (MonoDwarfWriter *w, MonoCompile *cfg, MonoMethod
                }
        }
 
-       g_free (local_names);
-       g_free (local_indexes);
+       if (locals_info)
+               mono_debug_symfile_free_locals (locals_info);
 
        /* Subprogram end */
        emit_uleb128 (w, 0x0);