OSDN Git Service

2002-02-14 Daniel Jacobowitz <drow@mvista.com>
authordrow <drow>
Thu, 14 Feb 2002 23:40:22 +0000 (23:40 +0000)
committerdrow <drow>
Thu, 14 Feb 2002 23:40:22 +0000 (23:40 +0000)
        Fix part of PR gdb/267.
        * linespec.c (find_methods): Handle constructors specially for now.

gdb/ChangeLog
gdb/linespec.c

index a2ee75f..fa0a39e 100644 (file)
@@ -1,3 +1,8 @@
+2002-02-14  Daniel Jacobowitz  <drow@mvista.com>
+
+       Fix part of PR gdb/267.  
+       * linespec.c (find_methods): Handle constructors specially for now.
+
 2002-02-14  Corinna Vinschen  <vinschen@redhat.com>
 
        * arm-tdep.c (arm_push_arguments): Eliminate special float type
index ef3a28c..15ccab0 100644 (file)
@@ -202,6 +202,39 @@ find_methods (struct type *t, char *name, struct symbol **sym_arr)
                     */
                  }
              }
+         else if (strcmp_iw (class_name, name) == 0)
+           {
+             /* For GCC 3.x and stabs, constructors and destructors have names
+                like __base_ctor and __complete_dtor.  Check the physname for now
+                if we're looking for a constructor.  */
+             for (field_counter
+                    = TYPE_FN_FIELDLIST_LENGTH (t, method_counter) - 1;
+                  field_counter >= 0;
+                  --field_counter)
+               {
+                 struct fn_field *f;
+                 char *phys_name;
+                 
+                 f = TYPE_FN_FIELDLIST1 (t, method_counter);
+
+                 /* GCC 3.x will never produce stabs stub methods, so we don't need
+                    to handle this case.  */
+                 if (TYPE_FN_FIELD_STUB (f, field_counter))
+                   continue;
+                 phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter);
+                 if (! is_constructor_name (phys_name))
+                   continue;
+
+                 /* If this method is actually defined, include it in the
+                    list.  */
+                 sym_arr[i1] = lookup_symbol (phys_name,
+                                              NULL, VAR_NAMESPACE,
+                                              (int *) NULL,
+                                              (struct symtab **) NULL);
+                 if (sym_arr[i1])
+                   i1++;
+               }
+           }
        }
     }
 
@@ -1180,7 +1213,7 @@ symbol_found:                     /* We also jump here from inside the C++ class/namespace
            {
              struct blockvector *bv = BLOCKVECTOR (sym_symtab);
              struct block *b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
-             if (lookup_block_symbol (b, copy, VAR_NAMESPACE) != NULL)
+             if (lookup_block_symbol (b, copy, NULL, VAR_NAMESPACE) != NULL)
                build_canonical_line_spec (values.sals, copy, canonical);
            }
          return values;