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-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ba327838bac4a3a536fabaae0d151ff24f359495;p=binutils-gdb.git * python/py-cmd.c (cmdpy_completer): Use iterator protocol. Correctly decref. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 64bac867141..84ca5962e0b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +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'. diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c index 6516e1ff764..26823c7ffff 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: