}
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);
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:
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;
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];
int j;
MonoMethodVar *vmv = NULL;
gboolean need_loclist = FALSE;
+ char *lname;
/* ins->dreg no longer contains the original vreg */
vmv = find_vmv (cfg, ins);
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);
}
}
- g_free (local_names);
- g_free (local_indexes);
+ if (locals_info)
+ mono_debug_symfile_free_locals (locals_info);
/* Subprogram end */
emit_uleb128 (w, 0x0);