From 4e4d7cd11667f1337b3e52a91e6674880741a25d Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Wed, 5 Dec 2012 21:18:03 +0300 Subject: [PATCH] db: change print_returned_struct_members() to new API Make it a returned_states_callback. This fixes a small bug because in the original code the returned ranges were not cast to the correct type. Signed-off-by: Dan Carpenter --- smatch_db.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/smatch_db.c b/smatch_db.c index 66f233bd..68937619 100644 --- a/smatch_db.c +++ b/smatch_db.c @@ -535,14 +535,25 @@ static void call_return_state_hooks(struct expression *expr) } END_FOR_EACH_PTR(cb); } -static void print_returned_struct_members(struct expression *expr) +struct state_list *get_my_states(int owner, struct state_list *source) +{ + struct state_list *slist = NULL; + struct sm_state *tmp; + + FOR_EACH_PTR(source, tmp) { + if (tmp->owner == owner) + add_ptr_list(&slist, tmp); + } END_FOR_EACH_PTR(tmp); + + return slist; +} + +static void print_returned_struct_members(int return_id, char *return_ranges, struct expression *expr, struct state_list *slist) { struct returned_member_callback *cb; - struct state_list *slist; + struct state_list *my_slist; struct sm_state *sm; struct symbol *type; - struct range_list *rl; - char *return_ranges; char *name; char member_name[256]; int len; @@ -557,25 +568,21 @@ static void print_returned_struct_members(struct expression *expr) if (!name) return; - if (!get_implied_range_list(expr, &rl)) - return; - return_ranges = show_ranges(rl); - member_name[sizeof(member_name) - 1] = '\0'; strcpy(member_name, "$$"); len = strlen(name); FOR_EACH_PTR(returned_member_callbacks, cb) { - slist = get_all_states(cb->owner); - FOR_EACH_PTR(slist, sm) { + my_slist = get_my_states(cb->owner, slist); + FOR_EACH_PTR(my_slist, sm) { if (strncmp(sm->name, name, len) != 0) continue; if (strncmp(sm->name + len, "->", 2) != 0) continue; strncpy(member_name + 2, sm->name + len, sizeof(member_name) - 2); - cb->callback(get_return_id(), return_ranges, member_name, sm->state); + cb->callback(return_id, return_ranges, member_name, sm->state); } END_FOR_EACH_PTR(sm); - free_slist(&slist); + free_slist(&my_slist); } END_FOR_EACH_PTR(cb); free_string(name); @@ -637,8 +644,8 @@ void register_definition_db_callbacks(int id) add_hook(&global_variable, BASE_HOOK); add_hook(&global_variable, DECLARATION_HOOK); add_returned_state_callback(match_return_info); + add_returned_state_callback(print_returned_struct_members); add_hook(&call_return_state_hooks, RETURN_HOOK); - add_hook(&print_returned_struct_members, RETURN_HOOK); add_hook(&match_end_func_info, END_FUNC_HOOK); } -- 2.11.4.GIT