From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17086 invoked by alias); 6 Jan 2003 20:32:26 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 17078 invoked from network); 6 Jan 2003 20:32:25 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by 209.249.29.67 with SMTP; 6 Jan 2003 20:32:25 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h06K4dB13823 for ; Mon, 6 Jan 2003 15:04:39 -0500 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h06KWBn19686; Mon, 6 Jan 2003 15:32:11 -0500 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id h06KWBn05276; Mon, 6 Jan 2003 12:32:11 -0800 Message-ID: <3E19E7CB.F5D1F13B@redhat.com> Date: Mon, 06 Jan 2003 20:32:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: Adam Fedor CC: GDB Patches Subject: Re: [RFA] Add ObjC recognition to linespec.c [5/5] References: <3E161D25.7070106@doc.com> <3E1639BC.42723FC6@redhat.com> <3E164C7B.2070003@doc.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2003-01/txt/msg00227.txt.bz2 Adam Fedor wrote: > > 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 > >> > >> * 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 Good, then I presume your version is static. Either way, it wouldn't hurt to make its name "objc_find_methods'. > > > > >> /* 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. OK, so if there is a C function init and an objc selector init, how do we resolve the conflict? Which one wins? In other words, will this un-protected code (not inside an if) ever obscure a C function when it shouldn't? > > >>+ > >> /* 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). OK, I guess.