From: Tom Tromey Date: Mon, 20 May 2013 20:21:55 +0000 (+0000) Subject: * python/py-cmd.c (cmdpy_completer): Use iterator protocol. X-Git-Tag: cygwin-1_7_19-release~164 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ba327838bac4a3a536fabaae0d151ff24f359495;p=external%2Fbinutils.git * python/py-cmd.c (cmdpy_completer): Use iterator protocol. Correctly decref. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 64bac86..84ca596 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2013-05-20 Tom Tromey + * python/py-cmd.c (cmdpy_completer): Use iterator protocol. + Correctly decref. + +2013-05-20 Tom Tromey + * python/py-cmd.c (cmdpy_init): Decref 'ds_obj'. 2013-05-20 Tom Tromey diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index 6516e1f..26823c7 100644 --- a/gdb/python/py-cmd.c +++ b/gdb/python/py-cmd.c @@ -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: