mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-30 07:49:07 +08:00
* python/py-cmd.c (cmdpy_completer): Use iterator protocol.
Correctly decref.
This commit is contained in:
@ -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>
|
2013-05-20 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* python/py-cmd.c (cmdpy_init): Decref 'ds_obj'.
|
* python/py-cmd.c (cmdpy_init): Decref 'ds_obj'.
|
||||||
|
@ -247,36 +247,7 @@ cmdpy_completer (struct cmd_list_element *command,
|
|||||||
make_cleanup_py_decref (resultobj);
|
make_cleanup_py_decref (resultobj);
|
||||||
|
|
||||||
result = NULL;
|
result = NULL;
|
||||||
if (PySequence_Check (resultobj))
|
if (PyInt_Check (resultobj))
|
||||||
{
|
|
||||||
Py_ssize_t i, len = PySequence_Size (resultobj);
|
|
||||||
Py_ssize_t out;
|
|
||||||
|
|
||||||
if (len < 0)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
for (i = out = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
PyObject *elt = PySequence_GetItem (resultobj, i);
|
|
||||||
char *item;
|
|
||||||
|
|
||||||
if (elt == NULL || ! gdbpy_is_string (elt))
|
|
||||||
{
|
|
||||||
/* Skip problem elements. */
|
|
||||||
PyErr_Clear ();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
item = python_string_to_host_string (elt);
|
|
||||||
if (item == NULL)
|
|
||||||
{
|
|
||||||
/* Skip problem elements. */
|
|
||||||
PyErr_Clear ();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
VEC_safe_push (char_ptr, result, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (PyInt_Check (resultobj))
|
|
||||||
{
|
{
|
||||||
/* User code may also return one of the completion constants,
|
/* User code may also return one of the completion constants,
|
||||||
thus requesting that sort of completion. */
|
thus requesting that sort of completion. */
|
||||||
@ -290,6 +261,42 @@ cmdpy_completer (struct cmd_list_element *command,
|
|||||||
else if (value >= 0 && value < (long) N_COMPLETERS)
|
else if (value >= 0 && value < (long) N_COMPLETERS)
|
||||||
result = completers[value].completer (command, text, word);
|
result = completers[value].completer (command, text, word);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PyObject *iter = PyObject_GetIter (resultobj);
|
||||||
|
PyObject *elt;
|
||||||
|
|
||||||
|
if (iter == NULL)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
while ((elt = PyIter_Next (iter)) != NULL)
|
||||||
|
{
|
||||||
|
char *item;
|
||||||
|
|
||||||
|
if (! gdbpy_is_string (elt))
|
||||||
|
{
|
||||||
|
/* Skip problem elements. */
|
||||||
|
Py_DECREF (elt);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
item = python_string_to_host_string (elt);
|
||||||
|
Py_DECREF (elt);
|
||||||
|
if (item == NULL)
|
||||||
|
{
|
||||||
|
/* Skip problem elements. */
|
||||||
|
PyErr_Clear ();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
VEC_safe_push (char_ptr, result, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_DECREF (iter);
|
||||||
|
|
||||||
|
/* If we got some results, ignore problems. Otherwise, report
|
||||||
|
the problem. */
|
||||||
|
if (result != NULL && PyErr_Occurred ())
|
||||||
|
PyErr_Clear ();
|
||||||
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user