This is the mail archive of the gdb-patches@sourceware.org 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]

[commit] gdbpy_parse_command_name clean up, fix memory leak


Hi.

This is a minor code cleanup, but it does fix one memory leak in parmpy_init.

Committed.

2011-09-08  Doug Evans  <dje@google.com>

	* py-cmd.c: Some minor formatting fixes.
	(gdbpy_parse_command_name): Rename text arg to name, make const.
	All callers updated.
	* python-internal.h (gdbpy_parse_command_name): Update.

Index: py-cmd.c
===================================================================
RCS file: /cvs/src/src/gdb/python/py-cmd.c,v
retrieving revision 1.15
diff -u -p -r1.15 py-cmd.c
--- py-cmd.c	5 Aug 2011 14:24:10 -0000	1.15
+++ py-cmd.c	8 Sep 2011 19:44:15 -0000
@@ -70,7 +70,6 @@ typedef struct cmdpy_object cmdpy_object
 
 static PyTypeObject cmdpy_object_type;
 
-
 /* Constants used by this module.  */
 static PyObject *invoke_cst;
 static PyObject *complete_cst;
@@ -206,6 +205,7 @@ cmdpy_function (struct cmd_list_element 
 }
 
 /* Called by gdb for command completion.  */
+
 static char **
 cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
 {
@@ -300,7 +300,7 @@ cmdpy_completer (struct cmd_list_element
 /* Helper for cmdpy_init which locates the command list to use and
    pulls out the command name.
    
-   TEXT is the command name list.  The final word in the list is the
+   NAME is the command name list.  The final word in the list is the
    name of the new command.  All earlier words must be existing prefix
    commands.
 
@@ -311,19 +311,20 @@ cmdpy_completer (struct cmd_list_element
 
    This function returns the xmalloc()d name of the new command.  On
    error sets the Python error and returns NULL.  */
+
 char *
-gdbpy_parse_command_name (char *text,
+gdbpy_parse_command_name (const char *name,
 			  struct cmd_list_element ***base_list,
 			  struct cmd_list_element **start_list)
 {
   struct cmd_list_element *elt;
-  int len = strlen (text);
+  int len = strlen (name);
   int i, lastchar;
-  char *prefix_text;
+  char *prefix_text, *prefix_text2;
   char *result;
 
   /* Skip trailing whitespace.  */
-  for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
+  for (i = len - 1; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
     ;
   if (i < 0)
     {
@@ -333,17 +334,17 @@ gdbpy_parse_command_name (char *text,
   lastchar = i;
 
   /* Find first character of the final word.  */
-  for (; i > 0 && (isalnum (text[i - 1])
-		   || text[i - 1] == '-'
-		   || text[i - 1] == '_');
+  for (; i > 0 && (isalnum (name[i - 1])
+		   || name[i - 1] == '-'
+		   || name[i - 1] == '_');
        --i)
     ;
   result = xmalloc (lastchar - i + 2);
-  memcpy (result, &text[i], lastchar - i + 1);
+  memcpy (result, &name[i], lastchar - i + 1);
   result[lastchar - i + 1] = '\0';
 
   /* Skip whitespace again.  */
-  for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
+  for (--i; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
     ;
   if (i < 0)
     {
@@ -352,11 +353,11 @@ gdbpy_parse_command_name (char *text,
     }
 
   prefix_text = xmalloc (i + 2);
-  memcpy (prefix_text, text, i + 1);
+  memcpy (prefix_text, name, i + 1);
   prefix_text[i + 1] = '\0';
 
-  text = prefix_text;
-  elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
+  prefix_text2 = prefix_text;
+  elt = lookup_cmd_1 (&prefix_text2, *start_list, NULL, 1);
   if (!elt || elt == (struct cmd_list_element *) -1)
     {
       PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
@@ -398,15 +399,13 @@ gdbpy_parse_command_name (char *text,
    If PREFIX is True, then this command is a prefix command.
 
    The documentation for the command is taken from the doc string for
-   the python class.
-   
-*/
+   the python class.  */
+
 static int
 cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
 {
   cmdpy_object *obj = (cmdpy_object *) self;
   const char *name;
-  char *copy;
   int cmdtype;
   int completetype = -1;
   char *docstring = NULL;
@@ -450,9 +449,7 @@ cmdpy_init (PyObject *self, PyObject *ar
       return -1;
     }
 
-  copy = xstrdup (name);
-  cmd_name = gdbpy_parse_command_name (copy, &cmd_list, &cmdlist);
-  xfree (copy);
+  cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist);
   if (! cmd_name)
     return -1;
 
@@ -554,6 +551,7 @@ cmdpy_init (PyObject *self, PyObject *ar
 
 
 /* Initialize the 'commands' code.  */
+
 void
 gdbpy_initialize_commands (void)
 {
Index: py-param.c
===================================================================
RCS file: /cvs/src/src/gdb/python/py-param.c,v
retrieving revision 1.12
diff -u -p -r1.12 py-param.c
--- py-param.c	5 Aug 2011 14:24:10 -0000	1.12
+++ py-param.c	8 Sep 2011 19:44:15 -0000
@@ -646,7 +646,6 @@ parmpy_init (PyObject *self, PyObject *a
 {
   parmpy_object *obj = (parmpy_object *) self;
   const char *name;
-  char *copy;
   char *set_doc, *show_doc, *doc;
   char *cmd_name;
   int parmclass, cmdtype;
@@ -697,21 +696,16 @@ parmpy_init (PyObject *self, PyObject *a
   obj->type = (enum var_types) parmclass;
   memset (&obj->value, 0, sizeof (obj->value));
 
-  copy = xstrdup (name);
-  cmd_name = gdbpy_parse_command_name (copy, &set_list,
+  cmd_name = gdbpy_parse_command_name (name, &set_list,
 				       &setlist);
 
   if (! cmd_name)
-    {
-      xfree (copy);
-      return -1;
-    }
+    return -1;
   xfree (cmd_name);
-  cmd_name = gdbpy_parse_command_name (copy, &show_list,
+  cmd_name = gdbpy_parse_command_name (name, &show_list,
 				       &showlist);
   if (! cmd_name)
     return -1;
-  xfree (copy);
 
   set_doc = get_doc_string (self, set_doc_cst);
   show_doc = get_doc_string (self, show_doc_cst);
Index: python-internal.h
===================================================================
RCS file: /cvs/src/src/gdb/python/python-internal.h,v
retrieving revision 1.46
diff -u -p -r1.46 python-internal.h
--- python-internal.h	28 Jun 2011 13:09:12 -0000	1.46
+++ python-internal.h	8 Sep 2011 19:44:15 -0000
@@ -154,7 +154,7 @@ PyObject *gdbpy_selected_thread (PyObjec
 PyObject *gdbpy_string_to_argv (PyObject *self, PyObject *args);
 PyObject *gdbpy_parameter (PyObject *self, PyObject *args);
 PyObject *gdbpy_parameter_value (enum var_types type, void *var);
-char *gdbpy_parse_command_name (char *text,
+char *gdbpy_parse_command_name (const char *name,
 				struct cmd_list_element ***base_list,
 				struct cmd_list_element **start_list);
 


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