public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* Re: [PATCH v2 01/18] Add struct completer_data to the completion API.
@ 2015-05-21 21:39 Doug Evans
  0 siblings, 0 replies; 2+ messages in thread
From: Doug Evans @ 2015-05-21 21:39 UTC (permalink / raw)
  To: Keith Seitz; +Cc: gdb-patches

Keith Seitz writes:
  > This patch is largely mechanical.  It modifies the completion API so
  > that all completion functions take a new (pointer to a) structure,
  > which will (eventually) be used internally by the completer to perform
  > completion limiting.
  >
  > gdb/ChangeLog
  >
  > 	* completer.c (struct completer_data): Define.
  > 	* language.h (struct language_defn)
  > 	<la_make_symbol_completion_list>: Add struct completer_data
  > 	to argument list.
  > 	All users updated.
  > 	* symtab.c (COMPLETION_LIST_ADD_SYMBOL): Add CDATA argument.
  > 	Update all callers.
  > 	(MCOMPLETION_LIST_ADD_SYMBOL): Likewise.
  > 	(struct add_name_data) <completer_data>: New field.
  > 	(default_make_symbol_completion_list_break_on_1): Initialize
  > 	the above new field.
  > 	(struct add_partial_filename_data) <completer_data>: New field.
  > 	(make_source_files_completion_list): Initialize the above new
  > 	field.

LGTM
Just a few nits, no need to resubmit for further review
[grep for ^$]

  > ...
  > diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
  > index d034049..e5469c0 100644
  > --- a/gdb/ada-lang.c
  > +++ b/gdb/ada-lang.c
  > @@ -6190,7 +6190,8 @@ ada_complete_symbol_matcher (const char *name,  
void *user_data)
  >     the entire command on which completion is made.  */
  >
  >  static VEC (char_ptr) *
  > -ada_make_symbol_completion_list (const char *text0, const char *word,
  > +ada_make_symbol_completion_list (struct completer_data *cdata,
  > +				 const char *text0, const char *word,
  >  				 enum type_code code)
  >  {
  >    char *text;
  > diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c
  > index 1718f49..4677132 100644
  > --- a/gdb/break-catch-syscall.c
  > +++ b/gdb/break-catch-syscall.c
  > @@ -592,12 +592,13 @@ catching_syscall_number (int syscall_number)
  >
  >  /* Complete syscall names.  Used by "catch syscall".  */
  >  static VEC (char_ptr) *
  > -catch_syscall_completer (struct cmd_list_element *cmd,
  > +catch_syscall_completer (struct completer_data *cdata,
  > +			 struct cmd_list_element *cmd,
  >                           const char *text, const char *word)
  >  {
  >    const char **list = get_syscall_names (get_current_arch ());
  >    VEC (char_ptr) *retlist
  > -    = (list == NULL) ? NULL : complete_on_enum (list, word, word);
  > +    = (list == NULL) ? NULL : complete_on_enum (cdata, list, word,  
word);
  >
  >    xfree (list);
  >    return retlist;
  > diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
  > index a3531a0..8ca1986 100644
  > --- a/gdb/breakpoint.c
  > +++ b/gdb/breakpoint.c
  > @@ -1033,7 +1033,8 @@ set_breakpoint_condition (struct breakpoint *b,  
const char *exp,
  >  /* Completion for the "condition" command.  */
  >
  >  static VEC (char_ptr) *
  > -condition_completer (struct cmd_list_element *cmd,
  > +condition_completer (struct completer_data *cdata,
  > +		     struct cmd_list_element *cmd,
  >  		     const char *text, const char *word)
  >  {
  >    const char *space;
  > @@ -1072,7 +1073,7 @@ condition_completer (struct cmd_list_element *cmd,
  >
  >    /* We're completing the expression part.  */
  >    text = skip_spaces_const (space);
  > -  return expression_completer (cmd, text, word);
  > +  return expression_completer (cdata, cmd, text, word);
  >  }
  >
  >  /* condition N EXP -- set break condition of breakpoint N to EXP.  */
  > diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c
  > index 4d0d5a9..286fc61 100644
  > --- a/gdb/cli/cli-decode.c
  > +++ b/gdb/cli/cli-decode.c
  > @@ -648,7 +648,8 @@ add_setshow_optional_filename_cmd (const char *name,  
enum command_class theclass
  >     support a special "unlimited" value.  */
  >
  >  static VEC (char_ptr) *
  > -integer_unlimited_completer (struct cmd_list_element *ignore,
  > +integer_unlimited_completer (struct completer_data *cdata,
  > +			     struct cmd_list_element *ignore,
  >  			     const char *text, const char *word)
  >  {
  >    static const char * const keywords[] =
  > @@ -657,7 +658,7 @@ integer_unlimited_completer (struct cmd_list_element  
*ignore,
  >        NULL,
  >      };
  >
  > -  return complete_on_enum (keywords, text, word);
  > +  return complete_on_enum (cdata, keywords, text, word);
  >  }
  >
  >  /* Add element named NAME to both the set and show command LISTs (the
  > @@ -1765,7 +1766,8 @@ lookup_cmd_composition (const char *text,
  >     "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
  >
  >  VEC (char_ptr) *
  > -complete_on_cmdlist (struct cmd_list_element *list,
  > +complete_on_cmdlist (struct completer_data *cdata,
  > +		     struct cmd_list_element *list,
  >  		     const char *text, const char *word,
  >  		     int ignore_help_classes)
  >  {
  > @@ -1835,7 +1837,8 @@ complete_on_cmdlist (struct cmd_list_element *list,
  >     "oobar"; if WORD is "baz/foo", return "baz/foobar".  */
  >
  >  VEC (char_ptr) *
  > -complete_on_enum (const char *const *enumlist,
  > +complete_on_enum (struct completer_data *cdata,
  > +		  const char *const *enumlist,
  >  		  const char *text, const char *word)
  >  {
  >    VEC (char_ptr) *matchlist = NULL;
  > diff --git a/gdb/command.h b/gdb/command.h
  > index bdf625b..b2aeb30 100644
  > --- a/gdb/command.h
  > +++ b/gdb/command.h
  > @@ -23,6 +23,8 @@
  >  /* This file defines the public interface for any code wanting to
  >     create commands.  */
  >
  > +struct completer_data;
  > +
  >  /* Command classes are top-level categories into which commands are
  >     broken down for "help" purposes.
  >
  > @@ -156,7 +158,8 @@ typedef void cmd_sfunc_ftype (char *args, int  
from_tty,
  >  extern void set_cmd_sfunc (struct cmd_list_element *cmd,
  >  			   cmd_sfunc_ftype *sfunc);
  >
  > -typedef VEC (char_ptr) *completer_ftype (struct cmd_list_element *,
  > +typedef VEC (char_ptr) *completer_ftype (struct completer_data *,
  > +					 struct cmd_list_element *,
  >  					 const char *, const char *);
  >
  >  typedef void completer_ftype_void (struct cmd_list_element *,
  > @@ -225,10 +228,12 @@ extern struct cmd_list_element *add_info (const  
char *,
  >  extern struct cmd_list_element *add_info_alias (const char *, const  
char *,
  >  						int);
  >
  > -extern VEC (char_ptr) *complete_on_cmdlist (struct cmd_list_element *,
  > +extern VEC (char_ptr) *complete_on_cmdlist (struct completer_data *,
  > +					    struct cmd_list_element *,
  >  					    const char *, const char *, int);
  >
  > -extern VEC (char_ptr) *complete_on_enum (const char *const *enumlist,
  > +extern VEC (char_ptr) *complete_on_enum (struct completer_data *,
  > +					 const char *const *enumlist,
  >  					 const char *, const char *);
  >
  >  /* Functions that implement commands about CLI commands.  */
  > diff --git a/gdb/completer.c b/gdb/completer.c
  > index c8c0e4c..f2b31e9 100644
  > --- a/gdb/completer.c
  > +++ b/gdb/completer.c
  > @@ -86,6 +86,15 @@ static char *gdb_completer_file_name_break_characters  
= " \t\n*|\"';:?><";
  >     we can't include '"' because the gdb C parser treats such quoted
  >     sequences as strings.  */
  >  static char *gdb_completer_quote_characters = "'";
  > +
  > +/* A structure holding completion-specific calldata.  */

s/calldata/call data/

  > +
  > +struct completer_data
  > +{
  > +  /* The completion tracker being used by the completer.  */
  > +  completion_tracker_t tracker;
  > +};
  > +
  >  \f
  >  /* Accessor for some completer data that may interest other files.  */
  >
  > @@ -107,7 +116,8 @@ readline_line_completion_function (const char *text,  
int matches)
  >  /* This can be used for functions which don't want to complete on
  >     symbols but don't want to complete on anything else either.  */
  >  VEC (char_ptr) *
  > -noop_completer (struct cmd_list_element *ignore,
  > +noop_completer (struct completer_data *cdata,
  > +		struct cmd_list_element *ignore,
  >  		const char *text, const char *prefix)
  >  {
  >    return NULL;
  > @@ -115,7 +125,8 @@ noop_completer (struct cmd_list_element *ignore,
  >
  >  /* Complete on filenames.  */
  >  VEC (char_ptr) *
  > -filename_completer (struct cmd_list_element *ignore,
  > +filename_completer (struct completer_data *cdata,
  > +		    struct cmd_list_element *ignore,
  >  		    const char *text, const char *word)
  >  {
  >    int subsequent_name;
  > @@ -184,7 +195,8 @@ filename_completer (struct cmd_list_element *ignore,
  >     etc.  */
  >
  >  VEC (char_ptr) *
  > -location_completer (struct cmd_list_element *ignore,
  > +location_completer (struct completer_data *cdata,
  > +		    struct cmd_list_element *ignore,
  >  		    const char *text, const char *word)
  >  {
  >    int n_syms, n_files, ix;
  > @@ -260,18 +272,18 @@ location_completer (struct cmd_list_element  
*ignore,
  >       symbols as well as on files.  */
  >    if (colon)
  >      {
  > -      list = make_file_symbol_completion_list (symbol_start, word,
  > +      list = make_file_symbol_completion_list (cdata, symbol_start,  
word,
  >  					       file_to_match);
  >        xfree (file_to_match);
  >      }
  >    else
  >      {
  > -      list = make_symbol_completion_list (symbol_start, word);
  > +      list = make_symbol_completion_list (cdata, symbol_start, word);
  >        /* If text includes characters which cannot appear in a file
  >  	 name, they cannot be asking for completion on files.  */
  >        if (strcspn (text,
  >  		   gdb_completer_file_name_break_characters) == text_len)
  > -	fn_list = make_source_files_completion_list (text, text);
  > +	fn_list = make_source_files_completion_list (cdata, text, text);
  >      }
  >
  >    n_syms = VEC_length (char_ptr, list);
  > @@ -326,7 +338,7 @@ location_completer (struct cmd_list_element *ignore,
  >      {
  >        /* No completions at all.  As the final resort, try completing
  >  	 on the entire text as a symbol.  */
  > -      list = make_symbol_completion_list (orig_text, word);
  > +      list = make_symbol_completion_list (cdata, orig_text, word);
  >      }
  >
  >    return list;
  > @@ -336,7 +348,8 @@ location_completer (struct cmd_list_element *ignore,
  >     method names from TYPE, a struct or union type, to the array
  >     OUTPUT.  */
  >  static void
  > -add_struct_fields (struct type *type, VEC (char_ptr) **output,
  > +add_struct_fields (struct completer_data *cdata,
  > +		   struct type *type, VEC (char_ptr) **output,
  >  		   char *fieldname, int namelen)
  >  {
  >    int i;
  > @@ -347,7 +360,7 @@ add_struct_fields (struct type *type, VEC (char_ptr)  
**output,
  >    for (i = 0; i < TYPE_NFIELDS (type); ++i)
  >      {
  >        if (i < TYPE_N_BASECLASSES (type))
  > -	add_struct_fields (TYPE_BASECLASS (type, i),
  > +	add_struct_fields (cdata, TYPE_BASECLASS (type, i),
  >  			   output, fieldname, namelen);
  >        else if (TYPE_FIELD_NAME (type, i))
  >  	{
  > @@ -361,7 +374,7 @@ add_struct_fields (struct type *type, VEC (char_ptr)  
**output,
  >  	  else if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_UNION)
  >  	    {
  >  	      /* Recurse into anonymous unions.  */
  > -	      add_struct_fields (TYPE_FIELD_TYPE (type, i),
  > +	      add_struct_fields (cdata, TYPE_FIELD_TYPE (type, i),
  >  				 output, fieldname, namelen);
  >  	    }
  >  	}
  > @@ -389,7 +402,8 @@ add_struct_fields (struct type *type, VEC (char_ptr)  
**output,
  >     names, but some language parsers also have support for completing
  >     field names.  */
  >  VEC (char_ptr) *
  > -expression_completer (struct cmd_list_element *ignore,
  > +expression_completer (struct completer_data *cdata,
  > +		      struct cmd_list_element *ignore,
  >  		      const char *text, const char *word)
  >  {
  >    struct type *type = NULL;
  > @@ -427,7 +441,7 @@ expression_completer (struct cmd_list_element  
*ignore,
  >  	  int flen = strlen (fieldname);
  >  	  VEC (char_ptr) *result = NULL;
  >
  > -	  add_struct_fields (type, &result, fieldname, flen);
  > +	  add_struct_fields (cdata, type, &result, fieldname, flen);
  >  	  xfree (fieldname);
  >  	  return result;
  >  	}
  > @@ -437,7 +451,8 @@ expression_completer (struct cmd_list_element  
*ignore,
  >        VEC (char_ptr) *result;
  >        struct cleanup *cleanup = make_cleanup (xfree, fieldname);
  >
  > -      result = make_symbol_completion_type (fieldname, fieldname, code);
  > +      result
  > +	= make_symbol_completion_type (cdata, fieldname, fieldname, code);
  >        do_cleanups (cleanup);
  >        return result;
  >      }
  > @@ -451,7 +466,7 @@ expression_completer (struct cmd_list_element  
*ignore,
  >      ;
  >
  >    /* Not ideal but it is what we used to do before...  */
  > -  return location_completer (ignore, p, word);
  > +  return location_completer (cdata, ignore, p, word);
  >  }
  >
  >  /* See definition in completer.h.  */
  > @@ -529,8 +544,8 @@ complete_line_internal_reason;
  >   */
  >
  >  static VEC (char_ptr) *
  > -complete_line_internal (const char *text,
  > -			const char *line_buffer, int point,
  > +complete_line_internal (struct completer_data *cdata,
  > +			const char *text, const char *line_buffer, int point,
  >  			complete_line_internal_reason reason)
  >  {
  >    VEC (char_ptr) *list = NULL;
  > @@ -615,13 +630,13 @@ complete_line_internal (const char *text,
  >  	  if (result_list)
  >  	    {
  >  	      if (reason != handle_brkchars)
  > -		list = complete_on_cmdlist (*result_list->prefixlist, p,
  > -					    word, ignore_help_classes);
  > +		list = complete_on_cmdlist (cdata, *result_list->prefixlist,
  > +					    p, word, ignore_help_classes);
  >  	    }
  >  	  else
  >  	    {
  >  	      if (reason != handle_brkchars)
  > -		list = complete_on_cmdlist (cmdlist, p, word,
  > +		list = complete_on_cmdlist (cdata, cmdlist, p, word,
  >  					    ignore_help_classes);
  >  	    }
  >  	  /* Ensure that readline does the right thing with respect to
  > @@ -648,8 +663,8 @@ complete_line_internal (const char *text,
  >  		  /* It is a prefix command; what comes after it is
  >  		     a subcommand (e.g. "info ").  */
  >  		  if (reason != handle_brkchars)
  > -		    list = complete_on_cmdlist (*c->prefixlist, p, word,
  > -						ignore_help_classes);
  > +		    list = complete_on_cmdlist (cdata, *c->prefixlist, p,
  > +						word, ignore_help_classes);
  >
  >  		  /* Ensure that readline does the right thing
  >  		     with respect to inserting quotes.  */
  > @@ -661,7 +676,7 @@ complete_line_internal (const char *text,
  >  	      else if (c->enums)
  >  		{
  >  		  if (reason != handle_brkchars)
  > -		    list = complete_on_enum (c->enums, p, word);
  > +		    list = complete_on_enum (cdata, c->enums, p, word);
  >  		  rl_completer_word_break_characters =
  >  		    gdb_completer_command_word_break_characters;
  >  		}
  > @@ -701,7 +716,7 @@ complete_line_internal (const char *text,
  >  		      && c->completer_handle_brkchars != NULL)
  >  		    (*c->completer_handle_brkchars) (c, p, word);
  >  		  if (reason != handle_brkchars && c->completer != NULL)
  > -		    list = (*c->completer) (c, p, word);
  > +		    list = (*c->completer) (cdata, c, p, word);
  >  		}
  >  	    }
  >  	  else
  > @@ -723,7 +738,7 @@ complete_line_internal (const char *text,
  >  		}
  >
  >  	      if (reason != handle_brkchars)
  > -		list = complete_on_cmdlist (result_list, q, word,
  > +		list = complete_on_cmdlist (cdata, result_list, q, word,
  >  					    ignore_help_classes);
  >
  >  	      /* Ensure that readline does the right thing
  > @@ -747,7 +762,7 @@ complete_line_internal (const char *text,
  >  	  else if (c->enums)
  >  	    {
  >  	      if (reason != handle_brkchars)
  > -		list = complete_on_enum (c->enums, p, word);
  > +		list = complete_on_enum (cdata, c->enums, p, word);
  >  	    }
  >  	  else
  >  	    {
  > @@ -777,7 +792,7 @@ complete_line_internal (const char *text,
  >  		  && c->completer_handle_brkchars != NULL)
  >  		(*c->completer_handle_brkchars) (c, p, word);
  >  	      if (reason != handle_brkchars && c->completer != NULL)
  > -		list = (*c->completer) (c, p, word);
  > +		list = (*c->completer) (cdata, c, p, word);
  >  	    }
  >  	}
  >      }
  > @@ -804,7 +819,6 @@ new_completion_tracker (void)
  >
  >  /* Cleanup routine to free a completion tracker and reset the pointer
  >     to NULL.  */
  > -

don't delete this line

  >  static void
  >  free_completion_tracker (void *p)
  >  {
  > @@ -885,7 +899,7 @@ complete_line (const char *text, const char  
*line_buffer, int point)
  >
  >    if (max_completions == 0)
  >      return NULL;
  > -  list = complete_line_internal (text, line_buffer, point,
  > +  list = complete_line_internal (NULL, text, line_buffer, point,
  >  				 handle_completions);
  >    if (max_completions < 0)
  >      return list;
  > @@ -932,17 +946,19 @@ complete_line (const char *text, const char  
*line_buffer, int point)
  >
  >  /* Complete on command names.  Used by "help".  */
  >  VEC (char_ptr) *
  > -command_completer (struct cmd_list_element *ignore,
  > +command_completer (struct completer_data *cdata,
  > +		   struct cmd_list_element *ignore,
  >  		   const char *text, const char *word)
  >  {
  > -  return complete_line_internal (word, text,
  > +  return complete_line_internal (cdata, word, text,
  >  				 strlen (text), handle_help);
  >  }
  >
  >  /* Complete on signals.  */
  >
  >  VEC (char_ptr) *
  > -signal_completer (struct cmd_list_element *ignore,
  > +signal_completer (struct completer_data *cdata,
  > +		  struct cmd_list_element *ignore,
  >  		  const char *text, const char *word)
  >  {
  >    VEC (char_ptr) *return_val = NULL;
  > @@ -972,7 +988,8 @@ signal_completer (struct cmd_list_element *ignore,
  >  /* Complete on a register or reggroup.  */
  >
  >  VEC (char_ptr) *
  > -reg_or_group_completer (struct cmd_list_element *ignore,
  > +reg_or_group_completer (struct completer_data *cdata,
  > +			struct cmd_list_element *ignore,
  >  			const char *text, const char *word)
  >  {
  >    VEC (char_ptr) *result = NULL;
  > @@ -1016,8 +1033,8 @@ gdb_completion_word_break_characters (void)
  >  {
  >    VEC (char_ptr) *list;
  >
  > -  list = complete_line_internal (rl_line_buffer, rl_line_buffer,  
rl_point,
  > -				 handle_brkchars);
  > +  list = complete_line_internal (NULL, rl_line_buffer, rl_line_buffer,
  > +				 rl_point, handle_brkchars);
  >    gdb_assert (list == NULL);
  >    return rl_completer_word_break_characters;
  >  }
  > diff --git a/gdb/completer.h b/gdb/completer.h
  > index 56e1a2b..f32c696 100644
  > --- a/gdb/completer.h
  > +++ b/gdb/completer.h
  > @@ -23,6 +23,7 @@
  >  /* Types of functions in struct match_list_displayer.  */
  >
  >  struct match_list_displayer;
  > +struct completer_data;
  >
  >  typedef void mld_crlf_ftype (const struct match_list_displayer *);
  >  typedef void mld_putch_ftype (const struct match_list_displayer *, int);
  > @@ -75,25 +76,32 @@ extern VEC (char_ptr) *complete_line (const char  
*text,
  >  extern char *readline_line_completion_function (const char *text,
  >  						int matches);
  >
  > -extern VEC (char_ptr) *noop_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *noop_completer (struct completer_data *,
  > +				       struct cmd_list_element *,
  >  				       const char *, const char *);
  >
  > -extern VEC (char_ptr) *filename_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *filename_completer (struct completer_data *,
  > +					   struct cmd_list_element *,
  >  					   const char *, const char *);
  >
  > -extern VEC (char_ptr) *expression_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *expression_completer (struct completer_data *,
  > +					     struct cmd_list_element *,
  >  					     const char *, const char *);
  >
  > -extern VEC (char_ptr) *location_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *location_completer (struct completer_data *,
  > +					   struct cmd_list_element *,
  >  					   const char *, const char *);
  >
  > -extern VEC (char_ptr) *command_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *command_completer (struct completer_data *,
  > +					  struct cmd_list_element *,
  >  					  const char *, const char *);
  >
  > -extern VEC (char_ptr) *signal_completer (struct cmd_list_element *,
  > +extern VEC (char_ptr) *signal_completer (struct completer_data *,
  > +					 struct cmd_list_element *,
  >  					 const char *, const char *);
  >
  > -extern VEC (char_ptr) *reg_or_group_completer (struct cmd_list_element  
*,
  > +extern VEC (char_ptr) *reg_or_group_completer (struct completer_data *,
  > +					       struct cmd_list_element *,
  >  					       const char *, const char *);
  >
  >  extern char *get_gdb_completer_quote_characters (void);
  > diff --git a/gdb/corefile.c b/gdb/corefile.c
  > index a042e6d..b5ec0e0 100644
  > --- a/gdb/corefile.c
  > +++ b/gdb/corefile.c
  > @@ -468,7 +468,8 @@ set_gnutarget_command (char *ignore, int from_tty,
  >  /* A completion function for "set gnutarget".  */
  >
  >  static VEC (char_ptr) *
  > -complete_set_gnutarget (struct cmd_list_element *cmd,
  > +complete_set_gnutarget (struct completer_data *cdata,
  > +			struct cmd_list_element *cmd,
  >  			const char *text, const char *word)
  >  {
  >    static const char **bfd_targets;
  > @@ -486,7 +487,7 @@ complete_set_gnutarget (struct cmd_list_element *cmd,
  >        bfd_targets[last + 1] = NULL;
  >      }
  >
  > -  return complete_on_enum (bfd_targets, text, word);
  > +  return complete_on_enum (cdata, bfd_targets, text, word);
  >  }
  >
  >  /* Set the gnutarget.  */
  > diff --git a/gdb/cp-abi.c b/gdb/cp-abi.c
  > index b8af8f0..504bb20 100644
  > --- a/gdb/cp-abi.c
  > +++ b/gdb/cp-abi.c
  > @@ -359,7 +359,8 @@ set_cp_abi_cmd (char *args, int from_tty)
  >  /* A completion function for "set cp-abi".  */
  >
  >  static VEC (char_ptr) *
  > -cp_abi_completer (struct cmd_list_element *ignore,
  > +cp_abi_completer (struct completer_data *cdata,
  > +		  struct cmd_list_element *ignore,
  >  		  const char *text, const char *word)
  >  {
  >    static const char **cp_abi_names;
  > @@ -374,7 +375,7 @@ cp_abi_completer (struct cmd_list_element *ignore,
  >        cp_abi_names[i] = NULL;
  >      }
  >
  > -  return complete_on_enum (cp_abi_names, text, word);
  > +  return complete_on_enum (cdata, cp_abi_names, text, word);
  >  }
  >
  >  /* Show the currently selected C++ ABI.  */
  > diff --git a/gdb/f-lang.c b/gdb/f-lang.c
  > index 8b61028..6852b08 100644
  > --- a/gdb/f-lang.c
  > +++ b/gdb/f-lang.c
  > @@ -229,10 +229,12 @@ f_word_break_characters (void)
  >     class.  */
  >
  >  static VEC (char_ptr) *
  > -f_make_symbol_completion_list (const char *text, const char *word,
  > +f_make_symbol_completion_list (struct completer_data *cdata,
  > +			       const char *text, const char *word,
  >  			       enum type_code code)
  >  {
  > -  return default_make_symbol_completion_list_break_on (text, word, ":",  
code);
  > +  return default_make_symbol_completion_list_break_on (cdata, text,  
word,
  > +						       ":", code);
  >  }
  >
  >  const struct language_defn f_language_defn =
  > diff --git a/gdb/guile/scm-cmd.c b/gdb/guile/scm-cmd.c
  > index a693df2..2c57d17 100644
  > --- a/gdb/guile/scm-cmd.c
  > +++ b/gdb/guile/scm-cmd.c
  > @@ -378,7 +378,8 @@ cmdscm_add_completion (SCM completion, VEC  
(char_ptr) **result)
  >  /* Called by gdb for command completion.  */
  >
  >  static VEC (char_ptr) *
  > -cmdscm_completer (struct cmd_list_element *command,
  > +cmdscm_completer (struct completer_data *cdata,
  > +		  struct cmd_list_element *command,
  >  		  const char *text, const char *word)
  >  {
  >    command_smob *c_smob/*obj*/ = (command_smob *) get_cmd_context  
(command);
  > diff --git a/gdb/infrun.c b/gdb/infrun.c
  > index 7870f70..c9dad43 100644
  > --- a/gdb/infrun.c
  > +++ b/gdb/infrun.c
  > @@ -7076,7 +7076,8 @@ Are you sure you want to change it? "),
  >  /* Complete the "handle" command.  */
  >
  >  static VEC (char_ptr) *
  > -handle_completer (struct cmd_list_element *ignore,
  > +handle_completer (struct completer_data *cdata,
  > +		  struct cmd_list_element *ignore,
  >  		  const char *text, const char *word)
  >  {
  >    VEC (char_ptr) *vec_signals, *vec_keywords, *return_val;
  > @@ -7094,8 +7095,8 @@ handle_completer (struct cmd_list_element *ignore,
  >        NULL,
  >      };
  >
  > -  vec_signals = signal_completer (ignore, text, word);
  > -  vec_keywords = complete_on_enum (keywords, word, word);
  > +  vec_signals = signal_completer (cdata, ignore, text, word);
  > +  vec_keywords = complete_on_enum (cdata, keywords, word, word);
  >
  >    return_val = VEC_merge (char_ptr, vec_signals, vec_keywords);
  >    VEC_free (char_ptr, vec_signals);
  > diff --git a/gdb/interps.c b/gdb/interps.c
  > index 90b5b2d..ac1b512 100644
  > --- a/gdb/interps.c
  > +++ b/gdb/interps.c
  > @@ -437,7 +437,8 @@ interpreter_exec_cmd (char *args, int from_tty)
  >
  >  /* List the possible interpreters which could complete the given text.   
*/
  >  static VEC (char_ptr) *
  > -interpreter_completer (struct cmd_list_element *ignore,
  > +interpreter_completer (struct completer_data *cdata,
  > +		       struct cmd_list_element *ignore,
  >  		       const char *text, const char *word)
  >  {
  >    int textlen;
  > diff --git a/gdb/language.h b/gdb/language.h
  > index 436fd6e..17b670e 100644
  > --- a/gdb/language.h
  > +++ b/gdb/language.h
  > @@ -301,9 +301,11 @@ struct language_defn
  >         completion is being made.  If CODE is TYPE_CODE_UNDEF, then all
  >         symbols should be examined; otherwise, only STRUCT_DOMAIN
  >         symbols whose type has a code of CODE should be matched.  */
  > -    VEC (char_ptr) *(*la_make_symbol_completion_list) (const char *text,
  > -						       const char *word,
  > -						       enum type_code code);
  > +    VEC (char_ptr) *
  > +      (*la_make_symbol_completion_list) (struct completer_data *,
  > +					 const char *text,
  > +					 const char *word,
  > +					 enum type_code code);
  >
  >      /* The per-architecture (OS/ABI) language information.  */
  >      void (*la_language_arch_info) (struct gdbarch *,
  > diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c
  > index b11fc32..21d842e 100644
  > --- a/gdb/python/py-cmd.c
  > +++ b/gdb/python/py-cmd.c
  > @@ -237,7 +237,8 @@ cmdpy_function (struct cmd_list_element *command,  
char *args, int from_tty)
  >     call.  */
  >
  >  static PyObject *
  > -cmdpy_completer_helper (struct cmd_list_element *command,
  > +cmdpy_completer_helper (struct completer_data *cdata,
  > +			struct cmd_list_element *command,
  >  			const char *text, const char *word)
  >  {
  >    cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
  > @@ -293,7 +294,7 @@ cmdpy_completer_handle_brkchars (struct  
cmd_list_element *command,
  >
  >    /* Calling our helper to obtain the PyObject of the Python
  >       function.  */
  > -  resultobj = cmdpy_completer_helper (command, text, word);
  > +  resultobj = cmdpy_completer_helper (NULL, command, text, word);
  >
  >    /* Check if there was an error.  */
  >    if (resultobj == NULL)
  > @@ -330,7 +331,8 @@ cmdpy_completer_handle_brkchars (struct  
cmd_list_element *command,
  >  /* Called by gdb for command completion.  */
  >
  >  static VEC (char_ptr) *
  > -cmdpy_completer (struct cmd_list_element *command,
  > +cmdpy_completer (struct completer_data *cdata,
  > +		 struct cmd_list_element *command,
  >  		 const char *text, const char *word)
  >  {
  >    PyObject *resultobj = NULL;
  > @@ -341,7 +343,7 @@ cmdpy_completer (struct cmd_list_element *command,
  >
  >    /* Calling our helper to obtain the PyObject of the Python
  >       function.  */
  > -  resultobj = cmdpy_completer_helper (command, text, word);
  > +  resultobj = cmdpy_completer_helper (cdata, command, text, word);
  >
  >    /* If the result object of calling the Python function is NULL, it
  >       means that there was an error.  In this case, just give up and
  > @@ -362,7 +364,7 @@ cmdpy_completer (struct cmd_list_element *command,
  >  	  PyErr_Clear ();
  >  	}
  >        else if (value >= 0 && value < (long) N_COMPLETERS)
  > -	result = completers[value].completer (command, text, word);
  > +	result = completers[value].completer (cdata, command, text, word);
  >      }
  >    else
  >      {
  > diff --git a/gdb/remote-sim.c b/gdb/remote-sim.c
  > index fd2fd58..2bcb19e 100644
  > --- a/gdb/remote-sim.c
  > +++ b/gdb/remote-sim.c
  > @@ -1217,7 +1217,8 @@ simulator_command (char *args, int from_tty)
  >  }
  >
  >  static VEC (char_ptr) *
  > -sim_command_completer (struct cmd_list_element *ignore, const char  
*text,
  > +sim_command_completer (struct completer_data *cdata,
  > +		       struct cmd_list_element *ignore, const char *text,
  >  		       const char *word)
  >  {
  >    struct sim_inferior_data *sim_data;
  > diff --git a/gdb/symtab.c b/gdb/symtab.c
  > index 72df872..c0562e1 100644
  > --- a/gdb/symtab.c
  > +++ b/gdb/symtab.c
  > @@ -5007,13 +5007,15 @@ do_free_completion_list (void *list)
  >
  >  static VEC (char_ptr) *return_val;
  >
  > -#define COMPLETION_LIST_ADD_SYMBOL(symbol, sym_text, len, text, word) \
  > -      completion_list_add_name \
  > -	(SYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text), (word))
  > +#define COMPLETION_LIST_ADD_SYMBOL(cdata, symbol, sym_text, len,	\
  > +				   text, word)				\
  > +  completion_list_add_name						\
  > +  ((cdata), SYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text),  
(word))
  >
  > -#define MCOMPLETION_LIST_ADD_SYMBOL(symbol, sym_text, len, text, word) \
  > -      completion_list_add_name \
  > -	(MSYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text), (word))
  > +#define MCOMPLETION_LIST_ADD_SYMBOL(cdata, symbol, sym_text, len,	\
  > +				    text, word)				\
  > +  completion_list_add_name						\
  > +  (cdata, MSYMBOL_NATURAL_NAME (symbol), (sym_text), (len), (text),  
(word))
  >
  >  /* Tracker for how many unique completions have been generated.  Used
  >     to terminate completion list generation early if the list has grown
  > @@ -5029,7 +5031,8 @@ static completion_tracker_t completion_tracker;
  >     characters.  If so, add it to the current completion list.  */
  >
  >  static void
  > -completion_list_add_name (const char *symname,
  > +completion_list_add_name (struct completer_data *cdata,
  > +			  const char *symname,
  >  			  const char *sym_text, int sym_text_len,
  >  			  const char *text, const char *word)
  >  {
  > @@ -5088,7 +5091,8 @@ completion_list_add_name (const char *symname,
  >     again and feed all the selectors into the mill.  */
  >
  >  static void
  > -completion_list_objc_symbol (struct minimal_symbol *msymbol,
  > +completion_list_objc_symbol (struct completer_data *cdata,
  > +			     struct minimal_symbol *msymbol,
  >  			     const char *sym_text, int sym_text_len,
  >  			     const char *text, const char *word)
  >  {
  > @@ -5106,7 +5110,8 @@ completion_list_objc_symbol (struct minimal_symbol  
*msymbol,
  >
  >    if (sym_text[0] == '[')
  >      /* Complete on shortened method method.  */
  > -    completion_list_add_name (method + 1, sym_text, sym_text_len, text,  
word);
  > +    completion_list_add_name (cdata, method + 1, sym_text, sym_text_len,
  > +			      text, word);
  >
  >    while ((strlen (method) + 1) >= tmplen)
  >      {
  > @@ -5127,9 +5132,11 @@ completion_list_objc_symbol (struct  
minimal_symbol *msymbol,
  >        memcpy (tmp, method, (category - method));
  >        tmp[category - method] = ' ';
  >        memcpy (tmp + (category - method) + 1, selector, strlen  
(selector) + 1);
  > -      completion_list_add_name (tmp, sym_text, sym_text_len, text,  
word);
  > +      completion_list_add_name (cdata, tmp, sym_text, sym_text_len,
  > +				text, word);
  >        if (sym_text[0] == '[')
  > -	completion_list_add_name (tmp + 1, sym_text, sym_text_len, text, word);
  > +	completion_list_add_name (cdata, tmp + 1, sym_text, sym_text_len,
  > +				  text, word);
  >      }
  >
  >    if (selector != NULL)
  > @@ -5140,7 +5147,8 @@ completion_list_objc_symbol (struct minimal_symbol  
*msymbol,
  >        if (tmp2 != NULL)
  >  	*tmp2 = '\0';
  >
  > -      completion_list_add_name (tmp, sym_text, sym_text_len, text,  
word);
  > +      completion_list_add_name (cdata, tmp, sym_text, sym_text_len,
  > +				text, word);
  >      }
  >  }
  >
  > @@ -5191,7 +5199,8 @@ language_search_unquoted_string (const char *text,  
const char *p)
  >  }
  >
  >  static void
  > -completion_list_add_fields (struct symbol *sym, const char *sym_text,
  > +completion_list_add_fields (struct completer_data *cdata,
  > +			    struct symbol *sym, const char *sym_text,
  >  			    int sym_text_len, const char *text,
  >  			    const char *word)
  >  {
  > @@ -5204,7 +5213,7 @@ completion_list_add_fields (struct symbol *sym,  
const char *sym_text,
  >        if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT)
  >  	for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++)
  >  	  if (TYPE_FIELD_NAME (t, j))
  > -	    completion_list_add_name (TYPE_FIELD_NAME (t, j),
  > +	    completion_list_add_name (cdata, TYPE_FIELD_NAME (t, j),
  >  				      sym_text, sym_text_len, text, word);
  >      }
  >  }
  > @@ -5220,6 +5229,9 @@ struct add_name_data
  >    const char *text;
  >    const char *word;
  >
  > +  /* Completion data used by the completer function.  */
  > +  struct completer_data *completer_data;
  > +
  >    /* Extra argument required for add_symtab_completions.  */
  >    enum type_code code;
  >  };
  > @@ -5234,7 +5246,7 @@ add_macro_name (const char *name, const struct  
macro_definition *ignore,
  >  {
  >    struct add_name_data *datum = (struct add_name_data *) user_data;
  >
  > -  completion_list_add_name (name,
  > +  completion_list_add_name (datum->completer_data, name,
  >  			    datum->sym_text, datum->sym_text_len,
  >  			    datum->text, datum->word);
  >  }
  > @@ -5252,7 +5264,8 @@ symbol_completion_matcher (const char *name, void  
*user_data)
  >  /* Add matching symbols from SYMTAB to the current completion list.  */
  >
  >  static void
  > -add_symtab_completions (struct compunit_symtab *cust,
  > +add_symtab_completions (struct completer_data *cdata,
  > +			struct compunit_symtab *cust,
  >  			const char *sym_text, int sym_text_len,
  >  			const char *text, const char *word,
  >  			enum type_code code)
  > @@ -5271,7 +5284,7 @@ add_symtab_completions (struct compunit_symtab  
*cust,
  >  	  if (code == TYPE_CODE_UNDEF
  >  	      || (SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
  >  		  && TYPE_CODE (SYMBOL_TYPE (sym)) == code))
  > -	    COMPLETION_LIST_ADD_SYMBOL (sym,
  > +	    COMPLETION_LIST_ADD_SYMBOL (cdata, sym,
  >  					sym_text, sym_text_len,
  >  					text, word);
  >  	}
  > @@ -5287,14 +5300,15 @@ symtab_expansion_callback (struct  
compunit_symtab *symtab,
  >  {
  >    struct add_name_data *datum = (struct add_name_data *) user_data;
  >
  > -  add_symtab_completions (symtab,
  > +  add_symtab_completions (datum->completer_data, symtab,
  >  			  datum->sym_text, datum->sym_text_len,
  >  			  datum->text, datum->word,
  >  			  datum->code);
  >  }
  >
  >  static void
  > -default_make_symbol_completion_list_break_on_1 (const char *text,
  > +default_make_symbol_completion_list_break_on_1 (struct completer_data  
*cdata,
  > +						const char *text,
  >  						const char *word,
  >  						const char *break_on,
  >  						enum type_code code)
  > @@ -5394,6 +5408,7 @@ default_make_symbol_completion_list_break_on_1  
(const char *text,
  >    datum.text = text;
  >    datum.word = word;
  >    datum.code = code;
  > +  datum.completer_data = cdata;
  >
  >    /* At this point scan through the misc symbol vectors and add each
  >       symbol you find to the list.  Eventually we want to ignore
  > @@ -5405,17 +5420,17 @@ default_make_symbol_completion_list_break_on_1  
(const char *text,
  >        ALL_MSYMBOLS (objfile, msymbol)
  >  	{
  >  	  QUIT;
  > -	  MCOMPLETION_LIST_ADD_SYMBOL (msymbol, sym_text, sym_text_len, text,
  > -				       word);
  > +	  MCOMPLETION_LIST_ADD_SYMBOL (cdata, msymbol, sym_text, sym_text_len,
  > +				       text, word);
  >
  > -	  completion_list_objc_symbol (msymbol, sym_text, sym_text_len, text,
  > -				       word);
  > +	  completion_list_objc_symbol (cdata, msymbol, sym_text, sym_text_len,
  > +				       text, word);
  >  	}
  >      }
  >
  >    /* Add completions for all currently loaded symbol tables.  */
  >    ALL_COMPUNITS (objfile, cust)
  > -    add_symtab_completions (cust, sym_text, sym_text_len, text, word,
  > +    add_symtab_completions (cdata, cust, sym_text, sym_text_len, text,  
word,
  >  			    code);
  >
  >    /* Look through the partial symtabs for all symbols which begin
  > @@ -5443,15 +5458,15 @@ default_make_symbol_completion_list_break_on_1  
(const char *text,
  >  	  {
  >  	    if (code == TYPE_CODE_UNDEF)
  >  	      {
  > -		COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text,
  > -					    word);
  > -		completion_list_add_fields (sym, sym_text, sym_text_len, text,
  > -					    word);
  > +		COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text,
  > +					    sym_text_len, text, word);
  > +		completion_list_add_fields (cdata, sym, sym_text,
  > +					    sym_text_len, text, word);
  >  	      }
  >  	    else if (SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN
  >  		     && TYPE_CODE (SYMBOL_TYPE (sym)) == code)
  > -	      COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text,
  > -					  word);
  > +	      COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text, sym_text_len,
  > +					  text, word);
  >  	  }
  >
  >  	/* Stop when we encounter an enclosing function.  Do not stop for
  > @@ -5468,11 +5483,16 @@ default_make_symbol_completion_list_break_on_1  
(const char *text,
  >      {
  >        if (surrounding_static_block != NULL)
  >  	ALL_BLOCK_SYMBOLS (surrounding_static_block, iter, sym)
  > -	  completion_list_add_fields (sym, sym_text, sym_text_len, text, word);
  > -
  > +	  {
  > +	    completion_list_add_fields (cdata, sym, sym_text, sym_text_len,
  > +					text, word);
  > +	  }
  >        if (surrounding_global_block != NULL)
  >  	ALL_BLOCK_SYMBOLS (surrounding_global_block, iter, sym)
  > -	  completion_list_add_fields (sym, sym_text, sym_text_len, text, word);
  > +	  {
  > +	    completion_list_add_fields (cdata, sym, sym_text, sym_text_len,
  > +					text, word);
  > +	  }
  >      }
  >
  >    /* Skip macros if we are completing a struct tag -- arguable but
  > @@ -5505,7 +5525,8 @@ default_make_symbol_completion_list_break_on_1  
(const char *text,
  >  }
  >
  >  VEC (char_ptr) *
  > -default_make_symbol_completion_list_break_on (const char *text,
  > +default_make_symbol_completion_list_break_on (struct completer_data  
*cdata,
  > +					      const char *text,
  >  					      const char *word,
  >  					      const char *break_on,
  >  					      enum type_code code)
  > @@ -5517,7 +5538,7 @@ default_make_symbol_completion_list_break_on  
(const char *text,
  >
  >    TRY
  >      {
  > -      default_make_symbol_completion_list_break_on_1 (text, word,
  > +      default_make_symbol_completion_list_break_on_1 (cdata, text, word,
  >  						      break_on, code);
  >      }
  >    CATCH (except, RETURN_MASK_ERROR)
  > @@ -5532,10 +5553,12 @@ default_make_symbol_completion_list_break_on  
(const char *text,
  >  }
  >
  >  VEC (char_ptr) *
  > -default_make_symbol_completion_list (const char *text, const char *word,
  > +default_make_symbol_completion_list (struct completer_data *cdata,
  > +				     const char *text, const char *word,
  >  				     enum type_code code)
  >  {
  > -  return default_make_symbol_completion_list_break_on (text, word, "",  
code);
  > +  return default_make_symbol_completion_list_break_on (cdata, text,  
word, "",
  > +						       code);
  >  }
  >
  >  /* Return a vector of all symbols (regardless of class) which begin by
  > @@ -5543,9 +5566,10 @@ default_make_symbol_completion_list (const char  
*text, const char *word,
  >     is NULL.  */
  >
  >  VEC (char_ptr) *
  > -make_symbol_completion_list (const char *text, const char *word)
  > +make_symbol_completion_list (struct completer_data *cdata,
  > +			     const char *text, const char *word)
  >  {
  > -  return current_language->la_make_symbol_completion_list (text, word,
  > +  return current_language->la_make_symbol_completion_list (cdata, text,  
word,
  >  							   TYPE_CODE_UNDEF);
  >  }
  >
  > @@ -5553,30 +5577,33 @@ make_symbol_completion_list (const char *text,  
const char *word)
  >     symbols whose type code is CODE.  */
  >
  >  VEC (char_ptr) *
  > -make_symbol_completion_type (const char *text, const char *word,
  > -			     enum type_code code)
  > +make_symbol_completion_type (struct completer_data *cdata, const char  
*text,
  > +			     const char *word, enum type_code code)
  >  {
  >    gdb_assert (code == TYPE_CODE_UNION
  >  	      || code == TYPE_CODE_STRUCT
  >  	      || code == TYPE_CODE_ENUM);
  > -  return current_language->la_make_symbol_completion_list (text, word,  
code);
  > +  return current_language->la_make_symbol_completion_list (cdata, text,  
word,
  > +							   code);
  >  }
  >
  >  /* Like make_symbol_completion_list, but suitable for use as a
  >     completion function.  */
  >
  >  VEC (char_ptr) *
  > -make_symbol_completion_list_fn (struct cmd_list_element *ignore,
  > +make_symbol_completion_list_fn (struct completer_data *cdata,
  > +				struct cmd_list_element *ignore,
  >  				const char *text, const char *word)
  >  {
  > -  return make_symbol_completion_list (text, word);
  > +  return make_symbol_completion_list (cdata, text, word);
  >  }
  >
  >  /* Like make_symbol_completion_list, but returns a list of symbols
  >     defined in a source file FILE.  */
  >
  >  VEC (char_ptr) *
  > -make_file_symbol_completion_list (const char *text, const char *word,
  > +make_file_symbol_completion_list (struct completer_data *cdata,
  > +				  const char *text, const char *word,
  >  				  const char *srcfile)
  >  {
  >    struct symbol *sym;
  > @@ -5658,13 +5685,15 @@ make_file_symbol_completion_list (const char  
*text, const char *word,
  >    b = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (s), GLOBAL_BLOCK);
  >    ALL_BLOCK_SYMBOLS (b, iter, sym)
  >      {
  > -      COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text,  
word);
  > +      COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text, sym_text_len,
  > +				  text, word);
  >      }
  >
  >    b = BLOCKVECTOR_BLOCK (SYMTAB_BLOCKVECTOR (s), STATIC_BLOCK);
  >    ALL_BLOCK_SYMBOLS (b, iter, sym)
  >      {
  > -      COMPLETION_LIST_ADD_SYMBOL (sym, sym_text, sym_text_len, text,  
word);
  > +      COMPLETION_LIST_ADD_SYMBOL (cdata, sym, sym_text, sym_text_len,
  > +				  text, word);
  >      }
  >
  >    return (return_val);
  > @@ -5730,6 +5759,9 @@ struct add_partial_filename_data
  >    const char *word;
  >    int text_len;
  >    VEC (char_ptr) **list;
  > +
  > +  /* Completion data used by the completer function.  */
  > +  struct completer_data *completer_data;
  >  };
  >
  >  /* A callback for map_partial_symbol_filenames.  */
  > @@ -5766,7 +5798,8 @@ maybe_add_partial_symtab_filename (const char  
*filename, const char *fullname,
  >     NULL.  */
  >
  >  VEC (char_ptr) *
  > -make_source_files_completion_list (const char *text, const char *word)
  > +make_source_files_completion_list (struct completer_data *cdata,
  > +				   const char *text, const char *word)
  >  {
  >    struct compunit_symtab *cu;
  >    struct symtab *s;
  > @@ -5817,6 +5850,7 @@ make_source_files_completion_list (const char  
*text, const char *word)
  >    datum.word = word;
  >    datum.text_len = text_len;
  >    datum.list = &list;
  > +  datum.completer_data = cdata;
  >    map_symbol_filenames (maybe_add_partial_symtab_filename, &datum,
  >  			0 /*need_fullname*/);
  >
  > diff --git a/gdb/symtab.h b/gdb/symtab.h
  > index 6a0b8da..508a7e5 100644
  > --- a/gdb/symtab.h
  > +++ b/gdb/symtab.h
  > @@ -38,6 +38,7 @@ struct program_space;
  >  struct language_defn;
  >  struct probe;
  >  struct common_block;
  > +struct completer_data;
  >
  >  /* Some of the structures in this file are space critical.
  >     The space-critical structures are:
  > @@ -1445,24 +1446,31 @@ extern void forget_cached_source_info (void);
  >  extern void select_source_symtab (struct symtab *);
  >
  >  extern VEC (char_ptr) *default_make_symbol_completion_list_break_on
  > -  (const char *text, const char *word, const char *break_on,
  > -   enum type_code code);
  > -extern VEC (char_ptr) *default_make_symbol_completion_list (const char  
*,
  > -							    const char *,
  > -							    enum type_code);
  > -extern VEC (char_ptr) *make_symbol_completion_list (const char *, const  
char *);
  > -extern VEC (char_ptr) *make_symbol_completion_type (const char *, const  
char *,
  > -						    enum type_code);
  > -extern VEC (char_ptr) *make_symbol_completion_list_fn (struct  
cmd_list_element *,
  > -						       const char *,
  > -						       const char *);
  > -
  > -extern VEC (char_ptr) *make_file_symbol_completion_list (const char *,
  > -							 const char *,
  > -							 const char *);
  > -
  > -extern VEC (char_ptr) *make_source_files_completion_list (const char *,
  > -							  const char *);
  > + (struct completer_data *cdata, const char *text, const char *word,
  > +  const char *break_on, enum type_code code);
  > +extern VEC (char_ptr) *
  > + default_make_symbol_completion_list (struct completer_data *,
  > +				      const char *, const char *,
  > +				      enum type_code);
  > +extern VEC (char_ptr) *
  > +  make_symbol_completion_list (struct completer_data *, const char *,
  > +			       const char *);
  > +extern VEC (char_ptr) *
  > +  make_symbol_completion_type (struct completer_data *,
  > +			       const char *, const char *,
  > +			       enum type_code);
  > +extern VEC (char_ptr) *
  > +  make_symbol_completion_list_fn (struct completer_data *,
  > +				  struct cmd_list_element *,
  > +				  const char *, const char *);
  > +
  > +extern VEC (char_ptr) *
  > +  make_file_symbol_completion_list (struct completer_data *,
  > +				    const char *, const char *, const char *);
  > +
  > +extern VEC (char_ptr) *
  > + make_source_files_completion_list (struct completer_data *, const char  
*,
  > +				    const char *);
  >
  >  /* symtab.c */
  >
  >

^ permalink raw reply	[flat|nested] 2+ messages in thread
* [PATCH v2 00/18] Implement full completer limiting
@ 2015-05-04 19:18 Keith Seitz
  2015-05-04 19:18 ` [PATCH v2 01/18] Add struct completer_data to the completion API Keith Seitz
  0 siblings, 1 reply; 2+ messages in thread
From: Keith Seitz @ 2015-05-04 19:18 UTC (permalink / raw)
  To: gdb-patches

Subject: Implement full completer limiting

This series (v2) of patches is essentially a rewrite of the completion API
to enable better/more consistent completion-limiting.

Currently completer functions are not required to implement completion-
limiting.  These functions will compute all possible completions and then
rely on complete_line to limit the result.

The main goal of this patchset is to require completer functions to
implement proper completion-limiting using maybe_add_completion.  This
actually cleans up the completer API significantly and fixes at least one
serious bug (an assertion failure, gdb/17960).

The new API requires all completions to be added to the completion
list using maybe_add_completion:

void
my_completer_function (struct completer_data *cdata,
                       struct cmd_list_element *cmd,
                       const char *text, const char *prefix)
{
    while (/* there are more completions to look for */)
    {
      char *match = xstrdup (a_completion_match);

      if (add_completion (cdata, match)
          == ADD_COMPLETION_MAX_REACHED)
	return;
    }
}

Each patch of the set has been tested regression-free against x86_64
linux, native and native-gdbserver.

---

Keith Seitz (18):
      Add struct completer_data to the completion API.
      Remove completion_tracker_t from the public completion API.
      Implement completion limiting for complete_on_cmdlist.
      Implement completion limiting for add_filename_to_list.
      Implement completion limiting for ada_make_symbol_completion_list.
      Implement completion limiting for condition_completer.
      Implement completion limiting for filename_completer.
      Implement completion limiting for signal_completer.
      Implement completion limiting for interpreter_completer.
      Implement completion limiting for cmdpy_completer.
      Implement completion limiting for reg_or_group_completer.
      Implement completion limiting for sim_command_completer.
      Implement completion limiting for complete_on_enum.
      Implement completion limiting in add_struct_fields.
      Implement completion limiting for scmcmd_add_completion.
      Make the completion API completely opaque.
      Use the hashtable to accumulate completion results.
      Remove the vector return result from the completion API.


 gdb/ada-lang.c                             |   62 ++--
 gdb/break-catch-syscall.c                  |   11 -
 gdb/breakpoint.c                           |   22 +
 gdb/cli/cli-cmds.c                         |    4 
 gdb/cli/cli-decode.c                       |   40 +-
 gdb/command.h                              |   17 +
 gdb/completer.c                            |  471 +++++++++++++++++-----------
 gdb/completer.h                            |  110 +++----
 gdb/corefile.c                             |    7 
 gdb/cp-abi.c                               |    7 
 gdb/f-lang.c                               |    8 
 gdb/guile/scm-cmd.c                        |   33 +-
 gdb/infrun.c                               |   15 -
 gdb/interps.c                              |   12 -
 gdb/language.h                             |    8 
 gdb/python/py-cmd.c                        |   24 +
 gdb/remote-sim.c                           |   10 -
 gdb/symtab.c                               |  256 ++++++---------
 gdb/symtab.h                               |   47 ++-
 gdb/testsuite/gdb.ada/complete.exp         |  144 ++++++++-
 gdb/testsuite/gdb.ada/complete/foo.adb     |    4 
 gdb/testsuite/gdb.ada/complete/pck.ads     |   12 +
 gdb/testsuite/gdb.base/break.c             |   14 +
 gdb/testsuite/gdb.base/break.exp           |    4 
 gdb/testsuite/gdb.base/completion.exp      |  206 ++++++++++++
 gdb/testsuite/gdb.base/condbreak.exp       |   70 ++++
 gdb/testsuite/gdb.base/filesym.c           |    4 
 gdb/testsuite/gdb.base/filesym.exp         |   84 +++++
 gdb/testsuite/gdb.base/filesym2.c          |   24 +
 gdb/testsuite/gdb.base/filesym3.c          |   24 +
 gdb/testsuite/gdb.base/filesym4.c          |   24 +
 gdb/testsuite/gdb.base/filesym5.c          |   22 +
 gdb/testsuite/gdb.cp/cpcompletion.exp      |   55 +++
 gdb/testsuite/gdb.cp/pr9594.cc             |   28 ++
 gdb/testsuite/gdb.guile/scm-cmd.exp        |   24 +
 gdb/testsuite/gdb.python/py-completion.exp |   45 +++
 gdb/value.c                                |   14 -
 gdb/value.h                                |    3 
 38 files changed, 1404 insertions(+), 565 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/filesym2.c
 create mode 100644 gdb/testsuite/gdb.base/filesym3.c
 create mode 100644 gdb/testsuite/gdb.base/filesym4.c
 create mode 100644 gdb/testsuite/gdb.base/filesym5.c
 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-05-21 21:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-21 21:39 [PATCH v2 01/18] Add struct completer_data to the completion API Doug Evans
  -- strict thread matches above, loose matches on Subject: below --
2015-05-04 19:18 [PATCH v2 00/18] Implement full completer limiting Keith Seitz
2015-05-04 19:18 ` [PATCH v2 01/18] Add struct completer_data to the completion API Keith Seitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).