From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18943 invoked by alias); 8 Nov 2002 19:52:52 -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 18935 invoked from network); 8 Nov 2002 19:52:49 -0000 Received: from unknown (HELO jackfruit.Stanford.EDU) (171.64.38.136) by sources.redhat.com with SMTP; 8 Nov 2002 19:52:49 -0000 Received: (from carlton@localhost) by jackfruit.Stanford.EDU (8.11.6/8.11.6) id gA8JqjR03071; Fri, 8 Nov 2002 11:52:45 -0800 X-Authentication-Warning: jackfruit.Stanford.EDU: carlton set sender to carlton@math.stanford.edu using -f To: gdb-patches@sources.redhat.com Cc: Elena Zannoni , Jim Blandy , Fernando Nasser Subject: [rfa] linespec.c, part 2 From: David Carlton Date: Fri, 08 Nov 2002 11:52:00 -0000 Message-ID: User-Agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Common Lisp) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-11/txt/msg00236.txt.bz2 Here's part 2 of the linespec patches. This one's quite straightforward; it just moves two chunks of code from the beginning of decode_line_1 to separate functions initialize_defaults and decode_indirect. Also, it turns out that, later in decode_line_1, defaults get re-initialized, so I turned that into a second call to initialize_defaults. David Carlton carlton@math.stanford.edu 2002-11-07 David Carlton * linespec.c (decode_line_1): Move chunks of code to separate functions. (initialize_defaults): New function. (decode_indirect): New function. Index: linespec.c =================================================================== RCS file: /cvs/src/src/gdb/linespec.c,v retrieving revision 1.26 diff -u -p -r1.26 linespec.c --- linespec.c 8 Nov 2002 19:16:17 -0000 1.26 +++ linespec.c 8 Nov 2002 19:21:33 -0000 @@ -39,6 +39,11 @@ extern char *operator_chars (char *, cha /* Prototypes for local functions */ +static void initialize_defaults (struct symtab **default_symtab, + int *default_line); + +static struct symtabs_and_lines decode_indirect (char **argptr); + static void cplusplus_error (const char *name, const char *fmt, ...) ATTR_FORMAT (printf, 2, 3); static int total_number_of_methods (struct type *type); @@ -533,7 +538,6 @@ decode_line_1 (char **argptr, int funfir /* The symtab that SYM was found in. */ struct symtab *sym_symtab; - register CORE_ADDR pc; register struct minimal_symbol *msymbol; char *copy; struct symbol *sym_class; @@ -552,35 +556,12 @@ decode_line_1 (char **argptr, int funfir /* Defaults have defaults. */ - if (default_symtab == 0) - { - /* Use whatever we have for the default source line. We don't use - get_current_or_default_symtab_and_line as it can recurse and call - us back! */ - struct symtab_and_line cursal = - get_current_source_symtab_and_line (); - - default_symtab = cursal.symtab; - default_line = cursal.line; - } - + initialize_defaults (&default_symtab, &default_line); + /* See if arg is *PC */ if (**argptr == '*') - { - (*argptr)++; - pc = parse_and_eval_address_1 (argptr); - - values.sals = (struct symtab_and_line *) - xmalloc (sizeof (struct symtab_and_line)); - - values.nelts = 1; - values.sals[0] = find_pc_line (pc, 0); - values.sals[0].pc = pc; - values.sals[0].section = find_pc_overlay (pc); - - return values; - } + return decode_indirect (argptr); /* 'has_if' is for the syntax: * (gdb) break foo if (a==b) @@ -1034,10 +1015,7 @@ decode_line_1 (char **argptr, int funfir /* Make sure we have at least a default source file. */ set_default_source_symtab_and_line (); - cursal = get_current_source_symtab_and_line (); - - default_symtab = cursal.symtab; - default_line = cursal.line; + initialize_defaults (&default_symtab, &default_line); } if (**argptr == '+') @@ -1211,6 +1189,58 @@ decode_line_1 (char **argptr, int funfir return values; /* for lint */ } + + +/* Now, still more helper functions. */ + +/* NOTE: carlton/2002-11-07: Some of these have non-obvious side + effects. In particular, if a function is passed ARGPTR as an + argument, it modifies what ARGPTR points to. (Typically, it + advances *ARGPTR past whatever substring it has just looked + at.) */ + +/* First, some functions to initialize stuff at the beggining of the + function. */ + +static void +initialize_defaults (struct symtab **default_symtab, int *default_line) +{ + if (*default_symtab == 0) + { + /* Use whatever we have for the default source line. We don't use + get_current_or_default_symtab_and_line as it can recurse and call + us back! */ + struct symtab_and_line cursal = + get_current_source_symtab_and_line (); + + *default_symtab = cursal.symtab; + *default_line = cursal.line; + } +} + + + +/* Decode arg of the form *PC. */ + +static struct symtabs_and_lines +decode_indirect (char **argptr) +{ + struct symtabs_and_lines values; + CORE_ADDR pc; + + (*argptr)++; + pc = parse_and_eval_address_1 (argptr); + + values.sals = (struct symtab_and_line *) + xmalloc (sizeof (struct symtab_and_line)); + + values.nelts = 1; + values.sals[0] = find_pc_line (pc, 0); + values.sals[0].pc = pc; + values.sals[0].section = find_pc_overlay (pc); + + return values; +}