From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29179 invoked by alias); 28 Feb 2003 22:53:20 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 29156 invoked from network); 28 Feb 2003 22:53:19 -0000 Received: from unknown (HELO jackfruit.Stanford.EDU) (171.64.38.136) by 172.16.49.205 with SMTP; 28 Feb 2003 22:53:19 -0000 Received: (from carlton@localhost) by jackfruit.Stanford.EDU (8.11.6/8.11.6) id h1SMrEF27062; Fri, 28 Feb 2003 14:53:14 -0800 X-Authentication-Warning: jackfruit.Stanford.EDU: carlton set sender to carlton@math.stanford.edu using -f To: gdb-patches@sources.redhat.com Subject: [rfa] linespec.c: collect_methods Cc: Elena Zannoni , Fernando Nasser From: David Carlton Date: Fri, 28 Feb 2003 22:53:00 -0000 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003-02/txt/msg00828.txt.bz2 The latest linespec patch. It extracts some code from find_method into a new function collect_methods. It doesn't change the extracted code. And yes, I do realize that having functions with the similar names find_methods, find_method, and collect_methods is confusing (not to mention having a function with a similar functionality but a different name, namely decode_line_2); I'll rename existing functions to clarify their roles once I'm done with extracting funcitons in this code. (find_methods and decode_line_2 were around before I started this project.) Tested on i686-pc-linux-gnu/GCC3.1/DWARF-2; OK to apply? David Carlton carlton@math.stanford.edu 2003-02-28 David Carlton * linespec.c (find_method): Extract code into collect_methods. (collect_methods): New. Index: linespec.c =================================================================== RCS file: /cvs/src/src/gdb/linespec.c,v retrieving revision 1.44 diff -u -p -r1.44 linespec.c --- linespec.c 28 Feb 2003 17:21:16 -0000 1.44 +++ linespec.c 28 Feb 2003 22:38:34 -0000 @@ -64,6 +64,9 @@ static struct symtabs_and_lines find_met struct type *t, struct symbol *sym_class); +static int collect_methods (char *copy, struct type *t, + struct symbol **sym_arr); + static NORETURN void cplusplus_error (const char *name, const char *fmt, ...) ATTR_NORETURN ATTR_FORMAT (printf, 2, 3); @@ -1135,29 +1138,15 @@ find_method (int funfirstline, char ***c { struct symtabs_and_lines values; struct symbol *sym = 0; - int i1 = 0; /* Counter for the symbol array. */ + int i1; /* Counter for the symbol array. */ struct symbol **sym_arr = alloca (total_number_of_methods (t) * sizeof (struct symbol *)); - if (destructor_name_p (copy, t)) - { - /* Destructors are a special case. */ - int m_index, f_index; + /* Find all methods with a matching name, and put them in + sym_arr. */ - if (get_destructor_fn_field (t, &m_index, &f_index)) - { - struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index); + i1 = collect_methods (copy, t, sym_arr); - sym_arr[i1] = - lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index), - NULL, VAR_NAMESPACE, (int *) NULL, - (struct symtab **) NULL); - if (sym_arr[i1]) - i1++; - } - } - else - i1 = find_methods (t, copy, sym_arr); if (i1 == 1) { /* There is exactly one field with that name. */ @@ -1204,6 +1193,38 @@ find_method (int funfirstline, char ***c "the class %s does not have any method named %s\n", SYMBOL_PRINT_NAME (sym_class), tmp); } +} + +/* Find all methods named COPY in the class whose type is T, and put + them in SYM_ARR. Return the number of methods found. */ + +static int +collect_methods (char *copy, struct type *t, + struct symbol **sym_arr) +{ + int i1 = 0; /* Counter for the symbol array. */ + + if (destructor_name_p (copy, t)) + { + /* Destructors are a special case. */ + int m_index, f_index; + + if (get_destructor_fn_field (t, &m_index, &f_index)) + { + struct fn_field *f = TYPE_FN_FIELDLIST1 (t, m_index); + + sym_arr[i1] = + lookup_symbol (TYPE_FN_FIELD_PHYSNAME (f, f_index), + NULL, VAR_NAMESPACE, (int *) NULL, + (struct symtab **) NULL); + if (sym_arr[i1]) + i1++; + } + } + else + i1 = find_methods (t, copy, sym_arr); + + return i1; }