Use function view when iterating over block symbols
This changes iterate_over_block_local_vars and iterate_over_block_arg_vars to take a gdb::function_view rather than a function pointer and a user-data. In one spot, this allows us to remove a helper structure and helper function. In another spot, this looked more complicated, so I changed the helper function to be an "operator()" -- also a simplification, just not as big.
This commit is contained in:
parent
abed5aa88a
commit
13835d88dc
3 changed files with 38 additions and 78 deletions
50
gdb/stack.c
50
gdb/stack.c
|
@ -2235,13 +2235,11 @@ backtrace_command_completer (struct cmd_list_element *ignore,
|
||||||
expression_completer (ignore, tracker, text, word);
|
expression_completer (ignore, tracker, text, word);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Iterate over the local variables of a block B, calling CB with
|
/* Iterate over the local variables of a block B, calling CB. */
|
||||||
CB_DATA. */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
iterate_over_block_locals (const struct block *b,
|
iterate_over_block_locals (const struct block *b,
|
||||||
iterate_over_block_arg_local_vars_cb cb,
|
iterate_over_block_arg_local_vars_cb cb)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct block_iterator iter;
|
struct block_iterator iter;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
@ -2260,7 +2258,7 @@ iterate_over_block_locals (const struct block *b,
|
||||||
break;
|
break;
|
||||||
if (sym->domain () == COMMON_BLOCK_DOMAIN)
|
if (sym->domain () == COMMON_BLOCK_DOMAIN)
|
||||||
break;
|
break;
|
||||||
(*cb) (sym->print_name (), sym, cb_data);
|
cb (sym->print_name (), sym);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2275,12 +2273,11 @@ iterate_over_block_locals (const struct block *b,
|
||||||
|
|
||||||
void
|
void
|
||||||
iterate_over_block_local_vars (const struct block *block,
|
iterate_over_block_local_vars (const struct block *block,
|
||||||
iterate_over_block_arg_local_vars_cb cb,
|
iterate_over_block_arg_local_vars_cb cb)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
while (block)
|
while (block)
|
||||||
{
|
{
|
||||||
iterate_over_block_locals (block, cb, cb_data);
|
iterate_over_block_locals (block, cb);
|
||||||
/* After handling the function's top-level block, stop. Don't
|
/* After handling the function's top-level block, stop. Don't
|
||||||
continue to its superblock, the block of per-file
|
continue to its superblock, the block of per-file
|
||||||
symbols. */
|
symbols. */
|
||||||
|
@ -2301,41 +2298,40 @@ struct print_variable_and_value_data
|
||||||
int num_tabs;
|
int num_tabs;
|
||||||
struct ui_file *stream;
|
struct ui_file *stream;
|
||||||
int values_printed;
|
int values_printed;
|
||||||
|
|
||||||
|
void operator() (const char *print_name, struct symbol *sym);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The callback for the locals and args iterators. */
|
/* The callback for the locals and args iterators. */
|
||||||
|
|
||||||
static void
|
void
|
||||||
do_print_variable_and_value (const char *print_name,
|
print_variable_and_value_data::operator() (const char *print_name,
|
||||||
struct symbol *sym,
|
struct symbol *sym)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct print_variable_and_value_data *p
|
|
||||||
= (struct print_variable_and_value_data *) cb_data;
|
|
||||||
struct frame_info *frame;
|
struct frame_info *frame;
|
||||||
|
|
||||||
if (p->preg.has_value ()
|
if (preg.has_value ()
|
||||||
&& p->preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
|
&& preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
|
||||||
return;
|
return;
|
||||||
if (p->treg.has_value ()
|
if (treg.has_value ()
|
||||||
&& !treg_matches_sym_type_name (*p->treg, sym))
|
&& !treg_matches_sym_type_name (*treg, sym))
|
||||||
return;
|
return;
|
||||||
if (language_def (sym->language ())->symbol_printing_suppressed (sym))
|
if (language_def (sym->language ())->symbol_printing_suppressed (sym))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
frame = frame_find_by_id (p->frame_id);
|
frame = frame_find_by_id (frame_id);
|
||||||
if (frame == NULL)
|
if (frame == NULL)
|
||||||
{
|
{
|
||||||
warning (_("Unable to restore previously selected frame."));
|
warning (_("Unable to restore previously selected frame."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_variable_and_value (print_name, sym, frame, p->stream, p->num_tabs);
|
print_variable_and_value (print_name, sym, frame, stream, num_tabs);
|
||||||
|
|
||||||
/* print_variable_and_value invalidates FRAME. */
|
/* print_variable_and_value invalidates FRAME. */
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
|
|
||||||
p->values_printed = 1;
|
values_printed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prepares the regular expression REG from REGEXP.
|
/* Prepares the regular expression REG from REGEXP.
|
||||||
|
@ -2404,9 +2400,7 @@ print_frame_local_vars (struct frame_info *frame,
|
||||||
scoped_restore_selected_frame restore_selected_frame;
|
scoped_restore_selected_frame restore_selected_frame;
|
||||||
select_frame (frame);
|
select_frame (frame);
|
||||||
|
|
||||||
iterate_over_block_local_vars (block,
|
iterate_over_block_local_vars (block, cb_data);
|
||||||
do_print_variable_and_value,
|
|
||||||
&cb_data);
|
|
||||||
|
|
||||||
if (!cb_data.values_printed && !quiet)
|
if (!cb_data.values_printed && !quiet)
|
||||||
{
|
{
|
||||||
|
@ -2494,8 +2488,7 @@ info_locals_command (const char *args, int from_tty)
|
||||||
|
|
||||||
void
|
void
|
||||||
iterate_over_block_arg_vars (const struct block *b,
|
iterate_over_block_arg_vars (const struct block *b,
|
||||||
iterate_over_block_arg_local_vars_cb cb,
|
iterate_over_block_arg_local_vars_cb cb)
|
||||||
void *cb_data)
|
|
||||||
{
|
{
|
||||||
struct block_iterator iter;
|
struct block_iterator iter;
|
||||||
struct symbol *sym, *sym2;
|
struct symbol *sym, *sym2;
|
||||||
|
@ -2518,7 +2511,7 @@ iterate_over_block_arg_vars (const struct block *b,
|
||||||
|
|
||||||
sym2 = lookup_symbol_search_name (sym->search_name (),
|
sym2 = lookup_symbol_search_name (sym->search_name (),
|
||||||
b, VAR_DOMAIN).symbol;
|
b, VAR_DOMAIN).symbol;
|
||||||
(*cb) (sym->print_name (), sym2, cb_data);
|
cb (sym->print_name (), sym2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2569,8 +2562,7 @@ print_frame_arg_vars (struct frame_info *frame,
|
||||||
cb_data.stream = stream;
|
cb_data.stream = stream;
|
||||||
cb_data.values_printed = 0;
|
cb_data.values_printed = 0;
|
||||||
|
|
||||||
iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func),
|
iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func), cb_data);
|
||||||
do_print_variable_and_value, &cb_data);
|
|
||||||
|
|
||||||
/* do_print_variable_and_value invalidates FRAME. */
|
/* do_print_variable_and_value invalidates FRAME. */
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
|
|
11
gdb/stack.h
11
gdb/stack.h
|
@ -30,17 +30,14 @@ gdb::unique_xmalloc_ptr<char> find_frame_funname (struct frame_info *frame,
|
||||||
enum language *funlang,
|
enum language *funlang,
|
||||||
struct symbol **funcp);
|
struct symbol **funcp);
|
||||||
|
|
||||||
typedef void (*iterate_over_block_arg_local_vars_cb) (const char *print_name,
|
typedef gdb::function_view<void (const char *print_name, struct symbol *sym)>
|
||||||
struct symbol *sym,
|
iterate_over_block_arg_local_vars_cb;
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
void iterate_over_block_arg_vars (const struct block *block,
|
void iterate_over_block_arg_vars (const struct block *block,
|
||||||
iterate_over_block_arg_local_vars_cb cb,
|
iterate_over_block_arg_local_vars_cb cb);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
void iterate_over_block_local_vars (const struct block *block,
|
void iterate_over_block_local_vars (const struct block *block,
|
||||||
iterate_over_block_arg_local_vars_cb cb,
|
iterate_over_block_arg_local_vars_cb cb);
|
||||||
void *cb_data);
|
|
||||||
|
|
||||||
/* Initialize *WHAT to be a copy of the user desired print what frame info.
|
/* Initialize *WHAT to be a copy of the user desired print what frame info.
|
||||||
If !WHAT.has_value (), the printing function chooses a default set of
|
If !WHAT.has_value (), the printing function chooses a default set of
|
||||||
|
|
|
@ -1041,36 +1041,6 @@ collection_list::collect_symbol (struct symbol *sym,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Data to be passed around in the calls to the locals and args
|
|
||||||
iterators. */
|
|
||||||
|
|
||||||
struct add_local_symbols_data
|
|
||||||
{
|
|
||||||
struct collection_list *collect;
|
|
||||||
struct gdbarch *gdbarch;
|
|
||||||
CORE_ADDR pc;
|
|
||||||
long frame_regno;
|
|
||||||
long frame_offset;
|
|
||||||
int count;
|
|
||||||
int trace_string;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The callback for the locals and args iterators. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
do_collect_symbol (const char *print_name,
|
|
||||||
struct symbol *sym,
|
|
||||||
void *cb_data)
|
|
||||||
{
|
|
||||||
struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
|
|
||||||
|
|
||||||
p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
|
|
||||||
p->frame_offset, p->pc, p->trace_string);
|
|
||||||
p->count++;
|
|
||||||
|
|
||||||
p->collect->add_wholly_collected (print_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
collection_list::add_wholly_collected (const char *print_name)
|
collection_list::add_wholly_collected (const char *print_name)
|
||||||
{
|
{
|
||||||
|
@ -1085,15 +1055,16 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
|
||||||
int trace_string)
|
int trace_string)
|
||||||
{
|
{
|
||||||
const struct block *block;
|
const struct block *block;
|
||||||
struct add_local_symbols_data cb_data;
|
int count = 0;
|
||||||
|
|
||||||
cb_data.collect = this;
|
auto do_collect_symbol = [&] (const char *print_name,
|
||||||
cb_data.gdbarch = gdbarch;
|
struct symbol *sym)
|
||||||
cb_data.pc = pc;
|
{
|
||||||
cb_data.frame_regno = frame_regno;
|
collect_symbol (sym, gdbarch, frame_regno,
|
||||||
cb_data.frame_offset = frame_offset;
|
frame_offset, pc, trace_string);
|
||||||
cb_data.count = 0;
|
count++;
|
||||||
cb_data.trace_string = trace_string;
|
add_wholly_collected (print_name);
|
||||||
|
};
|
||||||
|
|
||||||
if (type == 'L')
|
if (type == 'L')
|
||||||
{
|
{
|
||||||
|
@ -1105,8 +1076,8 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
|
iterate_over_block_local_vars (block, do_collect_symbol);
|
||||||
if (cb_data.count == 0)
|
if (count == 0)
|
||||||
warning (_("No locals found in scope."));
|
warning (_("No locals found in scope."));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1119,8 +1090,8 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
|
iterate_over_block_arg_vars (block, do_collect_symbol);
|
||||||
if (cb_data.count == 0)
|
if (count == 0)
|
||||||
warning (_("No args found in scope."));
|
warning (_("No args found in scope."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue