2003-02-28 David Carlton <carlton@math.stanford.edu>
authorDavid Carlton <carlton@bactrian.org>
Fri, 28 Feb 2003 17:21:16 +0000 (17:21 +0000)
committerDavid Carlton <carlton@bactrian.org>
Fri, 28 Feb 2003 17:21:16 +0000 (17:21 +0000)
* linespec.c (decode_compound): Extract code into find_method.
(find_method): New.

gdb/ChangeLog
gdb/linespec.c

index 5940c391bc8fc4f5d14408f4d3382a1581d8a046..3efe544405008af13e5df7580184d9ca9de3cbcf 100644 (file)
@@ -1,3 +1,8 @@
+2003-02-28  David Carlton  <carlton@math.stanford.edu>
+
+       * linespec.c (decode_compound): Extract code into find_method.
+       (find_method): New.
+
 2003-02-28  J. Brobecker  <brobecker@gnat.com>
 
        * Makefile.in: Add rules to build and link in observer.o.
index 9efe1355f25a47eb9b45ad39e4c09265b319026d..088c2e63d8138cc5223998620f61f4a77578e866 100644 (file)
@@ -57,6 +57,13 @@ static struct symtabs_and_lines decode_compound (char **argptr,
 
 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 funfirstline, char ***canonical,
   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 funfirstline, char ***canonical,
            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.  */
@@ -1188,6 +1126,86 @@ lookup_prefix_sym (char **argptr, char *p)
                        (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
 
 /* Return the symtab associated to the filename given by the substring