diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2006-12-15 00:37:15 +0300 |
---|---|---|
committer | Josh Triplett <josh@freedesktop.org> | 2007-02-27 10:35:50 -0800 |
commit | e8eb70dfab02569a8caeeff362da78ca8c2f26ae (patch) | |
tree | 671bccea605c515f011487f3a8c48e3d50d44df2 /dissect.c | |
parent | Coding style fix: use parentheses with sizeof (diff) | |
download | sparse-e8eb70dfab02569a8caeeff362da78ca8c2f26ae.tar.gz sparse-e8eb70dfab02569a8caeeff362da78ca8c2f26ae.tar.bz2 sparse-e8eb70dfab02569a8caeeff362da78ca8c2f26ae.zip |
dissect: simplify lookup_member()
Change examine_sym_node() to recursively inspect the members of SYM_STRUCT.
This allows us to simplify lookup_member(): no need to do examine_sym_node(),
the member was already examined.
This is also good because now ->r_symdef(member) is called on declaration,
not when dissect detects the first usage of ->member.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Diffstat (limited to 'dissect.c')
-rw-r--r-- | dissect.c | 21 |
1 files changed, 9 insertions, 12 deletions
@@ -212,13 +212,16 @@ static void examine_sym_node(struct symbol *node, struct ident *root) case SYM_STRUCT: case SYM_UNION: //case SYM_ENUM: if (base->evaluated) return; + if (!base->symbol_list) + return; + base->evaluated = 1; + if (!base->ident && name) base->ident = mk_name(root, name); - if (!base->ident || !base->symbol_list) - return; - if (reporter->r_symdef) + if (base->ident && reporter->r_symdef) reporter->r_symdef(base); - base->evaluated = 1; + DO_LIST(base->symbol_list, mem, + examine_sym_node(mem, base->ident ?: root)); default: return; } @@ -265,14 +268,8 @@ found: static struct symbol *lookup_member(struct symbol *type, struct ident *name, int *addr) { - struct symbol *node = __lookup_member(type, name, addr); - - if (node != NULL) - examine_sym_node(node, type->ident); - else - node = no_member(name); - - return node; + return __lookup_member(type, name, addr) + ?: no_member(name); } static struct expression *peek_preop(struct expression *expr, int op) |