From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6523 invoked by alias); 28 Feb 2003 03:45:44 -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 6510 invoked from network); 28 Feb 2003 03:45:43 -0000 Received: from unknown (HELO mx1.redhat.com) (172.16.49.200) by 172.16.49.205 with SMTP; 28 Feb 2003 03:45:43 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h1S3jhe10408 for ; Thu, 27 Feb 2003 22:45:43 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1S3jhq20446 for ; Thu, 27 Feb 2003 22:45:43 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h1S3jfc07275; Thu, 27 Feb 2003 22:45:41 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 2F205FF79; Thu, 27 Feb 2003 22:49:45 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15966.56408.999084.527143@localhost.redhat.com> Date: Fri, 28 Feb 2003 03:45:00 -0000 To: David Carlton Cc: gdb-patches@sources.redhat.com, Elena Zannoni , Fernando Nasser Subject: Re: [rfa] linespec.c: find_method In-Reply-To: References: X-SW-Source: 2003-02/txt/msg00799.txt.bz2 David Carlton writes: > This patch extracts a chunk of code from decode_compound into > a new function called find_method. It doesn't change the code at all. > > Tested on i686-pc-linux-gnu/GCC3.1/DWARF-2; OK to commit? yes thanks elena > > David Carlton > carlton@math.stanford.edu > > 2003-02-27 David Carlton > > * linespec.c (decode_compound): Extract code into find_method. > (find_method): New. > > Index: linespec.c > =================================================================== > RCS file: /cvs/src/src/gdb/linespec.c,v > retrieving revision 1.43 > diff -u -p -r1.43 linespec.c > --- linespec.c 25 Feb 2003 21:36:18 -0000 1.43 > +++ linespec.c 28 Feb 2003 00:10:22 -0000 > @@ -57,6 +57,13 @@ static struct symtabs_and_lines decode_c > > static struct symbol *lookup_prefix_sym (char **argptr, char *p); > > +static struct symtabs_and_lines find_method (int funfirstline, > + char ***canonical, > + char *saved_arg, > + char *copy, > + struct type *t, > + struct symbol *sym_class); > + > static NORETURN void cplusplus_error (const char *name, > const char *fmt, ...) > ATTR_NORETURN ATTR_FORMAT (printf, 2, 3); > @@ -945,7 +952,6 @@ decode_compound (char **argptr, int funf > struct symtab *sym_symtab; > char *copy; > struct symbol *sym_class; > - int i1; > struct symbol **sym_arr; > struct type *t; > > @@ -1037,76 +1043,8 @@ decode_compound (char **argptr, int funf > p++; > *argptr = p; > > - sym = 0; > - i1 = 0; /* Counter for the symbol array. */ > - sym_arr = (struct symbol **) 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; > - > - 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); > - if (i1 == 1) > - { > - /* There is exactly one field with that name. */ > - sym = sym_arr[0]; > - > - if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) > - { > - values.sals = (struct symtab_and_line *) > - xmalloc (sizeof (struct symtab_and_line)); > - values.nelts = 1; > - values.sals[0] = find_function_start_sal (sym, > - funfirstline); > - } > - else > - { > - values.nelts = 0; > - } > - return values; > - } > - if (i1 > 0) > - { > - /* There is more than one field with that name > - (overloaded). Ask the user which one to use. */ > - return decode_line_2 (sym_arr, i1, funfirstline, canonical); > - } > - else > - { > - char *tmp; > - > - if (is_operator_name (copy)) > - { > - tmp = (char *) alloca (strlen (copy + 3) + 9); > - strcpy (tmp, "operator "); > - strcat (tmp, copy + 3); > - } > - else > - tmp = copy; > - if (tmp[0] == '~') > - cplusplus_error (saved_arg, > - "the class `%s' does not have destructor defined\n", > - SYMBOL_PRINT_NAME (sym_class)); > - else > - cplusplus_error (saved_arg, > - "the class %s does not have any method named %s\n", > - SYMBOL_PRINT_NAME (sym_class), tmp); > - } > + return find_method (funfirstline, canonical, saved_arg, > + copy, t, sym_class); > } > > /* Move pointer up to next possible class/namespace token. */ > @@ -1186,6 +1124,86 @@ lookup_prefix_sym (char **argptr, char * > > return lookup_symbol (copy, 0, STRUCT_NAMESPACE, 0, > (struct symtab **) NULL); > +} > + > +/* This finds the method COPY in the class whose type is T and whose > + symbol is SYM_CLASS. */ > + > +static struct symtabs_and_lines > +find_method (int funfirstline, char ***canonical, char *saved_arg, > + char *copy, struct type *t, struct symbol *sym_class) > +{ > + struct symtabs_and_lines values; > + struct symbol *sym = 0; > + int i1 = 0; /* 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; > + > + 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); > + if (i1 == 1) > + { > + /* There is exactly one field with that name. */ > + sym = sym_arr[0]; > + > + if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) > + { > + values.sals = (struct symtab_and_line *) > + xmalloc (sizeof (struct symtab_and_line)); > + values.nelts = 1; > + values.sals[0] = find_function_start_sal (sym, > + funfirstline); > + } > + else > + { > + values.nelts = 0; > + } > + return values; > + } > + if (i1 > 0) > + { > + /* There is more than one field with that name > + (overloaded). Ask the user which one to use. */ > + return decode_line_2 (sym_arr, i1, funfirstline, canonical); > + } > + else > + { > + char *tmp; > + > + if (is_operator_name (copy)) > + { > + tmp = (char *) alloca (strlen (copy + 3) + 9); > + strcpy (tmp, "operator "); > + strcat (tmp, copy + 3); > + } > + else > + tmp = copy; > + if (tmp[0] == '~') > + cplusplus_error (saved_arg, > + "the class `%s' does not have destructor defined\n", > + SYMBOL_PRINT_NAME (sym_class)); > + else > + cplusplus_error (saved_arg, > + "the class %s does not have any method named %s\n", > + SYMBOL_PRINT_NAME (sym_class), tmp); > + } > } > >