diff options
-rw-r--r-- | dissect.c | 12 | ||||
-rw-r--r-- | dissect.h | 1 | ||||
-rw-r--r-- | test-dissect.c | 6 |
3 files changed, 18 insertions, 1 deletions
@@ -203,6 +203,12 @@ static bool deanon(struct symbol *base, struct ident *node, struct symbol *paren return true; } +static void report_memdef(struct symbol *sym, struct symbol *mem) +{ + if (sym && mem->ident) + reporter->r_memdef(sym, mem); +} + static void examine_sym_node(struct symbol *node, struct symbol *parent) { struct symbol *base; @@ -236,8 +242,12 @@ static void examine_sym_node(struct symbol *node, struct symbol *parent) if (base->ident || deanon(base, name, parent)) reporter->r_symdef(base); + + if (base->ident) + parent = base; DO_LIST(base->symbol_list, mem, - examine_sym_node(mem, base->ident ? base : parent)); + examine_sym_node(mem, parent); + report_memdef(parent, mem)); default: return; } @@ -19,6 +19,7 @@ struct reporter { void (*r_symdef)(struct symbol *); + void (*r_memdef)(struct symbol *, struct symbol *); void (*r_symbol)(unsigned, struct position *, struct symbol *); void (*r_member)(unsigned, struct position *, struct symbol *, struct symbol *); diff --git a/test-dissect.c b/test-dissect.c index af1212a0..e725eec5 100644 --- a/test-dissect.c +++ b/test-dissect.c @@ -75,10 +75,16 @@ static void r_symdef(struct symbol *sym) r_symbol(-1, &sym->pos, sym); } +static void r_memdef(struct symbol *sym, struct symbol *mem) +{ + r_member(-1, &mem->pos, sym, mem); +} + int main(int argc, char **argv) { static struct reporter reporter = { .r_symdef = r_symdef, + .r_memdef = r_memdef, .r_symbol = r_symbol, .r_member = r_member, }; |