* [rfa] linespec.c: find_method
@ 2003-02-28 0:11 David Carlton
2003-02-28 3:45 ` Elena Zannoni
0 siblings, 1 reply; 3+ messages in thread
From: David Carlton @ 2003-02-28 0:11 UTC (permalink / raw)
To: gdb-patches; +Cc: Elena Zannoni, Fernando Nasser
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?
David Carlton
carlton@math.stanford.edu
2003-02-27 David Carlton <carlton@math.stanford.edu>
* 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);
+ }
}
\f
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [rfa] linespec.c: find_method
2003-02-28 0:11 [rfa] linespec.c: find_method David Carlton
@ 2003-02-28 3:45 ` Elena Zannoni
2003-02-28 17:21 ` David Carlton
0 siblings, 1 reply; 3+ messages in thread
From: Elena Zannoni @ 2003-02-28 3:45 UTC (permalink / raw)
To: David Carlton; +Cc: gdb-patches, Elena Zannoni, Fernando Nasser
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 <carlton@math.stanford.edu>
>
> * 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);
> + }
> }
>
> \f
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [rfa] linespec.c: find_method
2003-02-28 3:45 ` Elena Zannoni
@ 2003-02-28 17:21 ` David Carlton
0 siblings, 0 replies; 3+ messages in thread
From: David Carlton @ 2003-02-28 17:21 UTC (permalink / raw)
To: Elena Zannoni; +Cc: gdb-patches, Fernando Nasser
On Thu, 27 Feb 2003 22:49:44 -0500, Elena Zannoni <ezannoni@redhat.com> said:
> 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, committed.
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-02-28 17:21 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-28 0:11 [rfa] linespec.c: find_method David Carlton
2003-02-28 3:45 ` Elena Zannoni
2003-02-28 17:21 ` David Carlton
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox