aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-12-15 00:37:15 +0300
committerJosh Triplett <josh@freedesktop.org>2007-02-27 10:35:50 -0800
commite8eb70dfab02569a8caeeff362da78ca8c2f26ae (patch)
tree671bccea605c515f011487f3a8c48e3d50d44df2 /dissect.c
parentCoding style fix: use parentheses with sizeof (diff)
downloadsparse-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.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/dissect.c b/dissect.c
index 301ee1c..91aecf3 100644
--- a/dissect.c
+++ b/dissect.c
@@ -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)