* python/py-cmd.c (cmdpy_completer): Use iterator protocol.
authorTom Tromey <tromey@redhat.com>
Mon, 20 May 2013 20:21:55 +0000 (20:21 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 20 May 2013 20:21:55 +0000 (20:21 +0000)
Correctly decref.

gdb/ChangeLog
gdb/python/py-cmd.c

index 64bac867141f5fc240bab0f1b0c961bfaebd4bab..84ca5962e0b667c194345f8cb96f6fb9169b5781 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-20  Tom Tromey  <tromey@redhat.com>
+
+       * python/py-cmd.c (cmdpy_completer): Use iterator protocol.
+       Correctly decref.
+
 2013-05-20  Tom Tromey  <tromey@redhat.com>
 
        * python/py-cmd.c (cmdpy_init): Decref 'ds_obj'.
index 6516e1ff764d4b387bfacd0362cec9b162b8b017..26823c7ffff34da99f57486366c910a20b732546 100644 (file)
@@ -247,26 +247,40 @@ cmdpy_completer (struct cmd_list_element *command,
   make_cleanup_py_decref (resultobj);
 
   result = NULL;
-  if (PySequence_Check (resultobj))
+  if (PyInt_Check (resultobj))
     {
-      Py_ssize_t i, len = PySequence_Size (resultobj);
-      Py_ssize_t out;
+      /* User code may also return one of the completion constants,
+        thus requesting that sort of completion.  */
+      long value;
+
+      if (! gdb_py_int_as_long (resultobj, &value))
+       {
+         /* Ignore.  */
+         PyErr_Clear ();
+       }
+      else if (value >= 0 && value < (long) N_COMPLETERS)
+       result = completers[value].completer (command, text, word);
+    }
+  else
+    {
+      PyObject *iter = PyObject_GetIter (resultobj);
+      PyObject *elt;
 
-      if (len < 0)
+      if (iter == NULL)
        goto done;
 
-      for (i = out = 0; i < len; ++i)
+      while ((elt = PyIter_Next (iter)) != NULL)
        {
-         PyObject *elt = PySequence_GetItem (resultobj, i);
          char *item;
 
-         if (elt == NULL || ! gdbpy_is_string (elt))
+         if (! gdbpy_is_string (elt))
            {
              /* Skip problem elements.  */
-             PyErr_Clear ();
+             Py_DECREF (elt);
              continue;
            }
          item = python_string_to_host_string (elt);
+         Py_DECREF (elt);
          if (item == NULL)
            {
              /* Skip problem elements.  */
@@ -275,20 +289,13 @@ cmdpy_completer (struct cmd_list_element *command,
            }
          VEC_safe_push (char_ptr, result, item);
        }
-    }
-  else if (PyInt_Check (resultobj))
-    {
-      /* User code may also return one of the completion constants,
-        thus requesting that sort of completion.  */
-      long value;
 
-      if (! gdb_py_int_as_long (resultobj, &value))
-       {
-         /* Ignore.  */
-         PyErr_Clear ();
-       }
-      else if (value >= 0 && value < (long) N_COMPLETERS)
-       result = completers[value].completer (command, text, word);
+      Py_DECREF (iter);
+
+      /* If we got some results, ignore problems.  Otherwise, report
+        the problem.  */
+      if (result != NULL && PyErr_Occurred ())
+       PyErr_Clear ();
     }
 
  done: