Adam Fedor wrote:
I know that linespec has been changing a lot lately, and I'm not sure if
it's finished changing yet. So this is my attempt to insert ObjC
handling into linespec. Actually Klee Dienes really did most of these
changes, and I probably bastardized those as well...
-------------------------------------------------------------------------------
2003-01-03 Adam Fedor <fedor@gnu.org>
* linespec.c (decode_objc): New function to decode ObjC calls
(decode_line_1): Check for ObjC calls (using decode_objc)
Index: linespec.c
===================================================================
RCS file: /cvs/src/src/gdb/linespec.c,v
retrieving revision 1.32
diff -u -p -r1.32 linespec.c
--- linespec.c 19 Dec 2002 18:56:14 -0000 1.32
+++ linespec.c 3 Jan 2003 22:56:54 -0000
@@ -37,6 +37,11 @@
extern char *operator_chars (char *, char **);
+/* From objc-lang.h. Included here to avoid conflict with other prototypes */
+extern char *find_imps (struct symtab *symtab, struct block *block,
+ char *method, struct symbol **syms, unsigned int *nsym,
+ unsigned int *ndebug);
+
I presume this will go away when you can include objc-lang.h.
I couldn't include objc-lang.h because linespec.c defines a function
'find_methods' which objc-lang also defines. But actually I just
realized I could just take it out of objc-lang.h, since it's not used
anywhere else other than objc-lang.c
/* Prototypes for local functions */
static void initialize_defaults (struct symtab **default_symtab,
@@ -48,6 +53,12 @@ static struct symtabs_and_lines decode_i
static char *locate_first_half (char **argptr, int *is_quote_enclosed);
+static struct symtabs_and_lines decode_objc (char **argptr,
+ int funfirstline,
+ struct symtab *file_symtab,
+ char ***canonical,
+ char *saved_arg);
+
I like this -- presumably it keeps a lot of the new code
out of poor old decrepit decode_line_1.
static struct symtabs_and_lines decode_compound (char **argptr,
int funfirstline,
char ***canonical,
@@ -568,6 +579,7 @@ decode_line_1 (char **argptr, int funfir
int is_quoted;
/* Is part of *ARGPTR is enclosed in double quotes? */
int is_quote_enclosed;
+ int is_objc_method = 0;
char *saved_arg = *argptr;
init_sal (&val); /* initialize to zeroes */
@@ -596,6 +608,24 @@ decode_line_1 (char **argptr, int funfir
p = locate_first_half (argptr, &is_quote_enclosed);
+ /* Check if this is an Objective-C method. */
+ if (*p && (p[0] == ':') && (strchr ("+-", p[1]) != NULL)
+ && (p[2] == '['))
+ {
+ is_objc_method = 1;
+ paren_pointer = NULL; /* Probably just a category name. Ignore it */
+ }
+
+ /* Is it an Objective-C selector? */
+
+ {
+ struct symtabs_and_lines values;
+ values = decode_objc (argptr, funfirstline, NULL,
+ canonical, saved_arg);
+ if (values.sals != NULL)
+ return values;
+ }
Was this meant to be an if? It seems to be a naked block.
I'd feel better if there was an if around it, eg. is there
a simple way to test for a selector name? Do I remember
that they begin with a unique prefix such as '@'?
No. Because the user can do things like 'break init' or 'break
isAnImage', and this will determine that these are really Objective-C
methods and not regular C functions. It's really just a way to keep the
variable local to where it is really used.