This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] Add ObjC recognition to linespec.c [5/5]



Michael Snyder wrote:
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.

+
  /* Does it look like there actually were two parts?  */

  if ((p[0] == ':' || p[0] == '.') && paren_pointer == NULL)
@@ -669,13 +699,21 @@ decode_line_1 (char **argptr, int funfir
     Find the next token (everything up to end or next whitespace).  */

  if (**argptr == '$')         /* May be a convenience variable */
-    p = skip_quoted (*argptr + (((*argptr)[1] == '$') ? 2 : 1));       /* One or two $ chars possible */
+    {
+      /* One or two $ chars possible */
+      p = skip_quoted (*argptr + (((*argptr)[1] == '$') ? 2 : 1));
+    }
  else if (is_quoted)
    {
      p = skip_quoted (*argptr);
      if (p[-1] != '\'')
       error ("Unmatched single quote.");
    }
+  else if (is_objc_method)
+    {
+      /* allow word separators in method names for Obj-C */
+      p = skip_quoted_chars (*argptr, NULL, "");
+    }

OK, except didn't we decide that "skip_quoted_chars" needs a better name? One that identifies it with objc?

We made it more generic. It's now just like skip_quoted, except that you can pass the character sets that are to be used (in fact, skip_quoted is now defined in terms of skip_quoted_chars).



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]