Index: gdb/python/py-cmd.c |
diff --git a/gdb/python/py-cmd.c b/gdb/python/py-cmd.c |
index d8e375c82ceee8b93030f476f93402eb165c2771..c0e9d9696b8c33609ddddcf7d96ece4643d92cf0 100644 |
--- a/gdb/python/py-cmd.c |
+++ b/gdb/python/py-cmd.c |
@@ -1,6 +1,6 @@ |
/* gdb commands implemented in Python |
- Copyright (C) 2008-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2008-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -45,6 +45,7 @@ static struct cmdpy_completer completers[] = |
{ "COMPLETE_LOCATION", location_completer }, |
{ "COMPLETE_COMMAND", command_completer }, |
{ "COMPLETE_SYMBOL", make_symbol_completion_list_fn }, |
+ { "COMPLETE_EXPRESSION", expression_completer }, |
}; |
#define N_COMPLETERS (sizeof (completers) / sizeof (completers[0])) |
@@ -68,7 +69,8 @@ struct cmdpy_object |
typedef struct cmdpy_object cmdpy_object; |
-static PyTypeObject cmdpy_object_type; |
+static PyTypeObject cmdpy_object_type |
+ CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("cmdpy_object"); |
/* Constants used by this module. */ |
static PyObject *invoke_cst; |
@@ -103,7 +105,7 @@ cmdpy_destroyer (struct cmd_list_element *self, void *context) |
/* We allocated the name, doc string, and perhaps the prefix |
name. */ |
- xfree (self->name); |
+ xfree ((char *) self->name); |
xfree (self->doc); |
xfree (self->prefixname); |
@@ -207,7 +209,8 @@ cmdpy_function (struct cmd_list_element *command, char *args, int from_tty) |
/* Called by gdb for command completion. */ |
static VEC (char_ptr) * |
-cmdpy_completer (struct cmd_list_element *command, char *text, char *word) |
+cmdpy_completer (struct cmd_list_element *command, |
+ const char *text, const char *word) |
{ |
cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command); |
PyObject *textobj, *wordobj, *resultobj = NULL; |
@@ -242,29 +245,42 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word) |
PyErr_Clear (); |
goto done; |
} |
- 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 (len < 0) |
+ 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 (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. */ |
@@ -273,24 +289,18 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word) |
} |
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: |
+ Py_XDECREF (resultobj); |
do_cleanups (cleanup); |
return result; |
@@ -298,14 +308,14 @@ cmdpy_completer (struct cmd_list_element *command, char *text, char *word) |
/* Helper for cmdpy_init which locates the command list to use and |
pulls out the command name. |
- |
+ |
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. |
*BASE_LIST is set to the final prefix command's list of |
*sub-commands. |
- |
+ |
START_LIST is the list in which the search starts. |
This function returns the xmalloc()d name of the new command. On |
@@ -319,7 +329,8 @@ gdbpy_parse_command_name (const char *name, |
struct cmd_list_element *elt; |
int len = strlen (name); |
int i, lastchar; |
- char *prefix_text, *prefix_text2; |
+ char *prefix_text; |
+ const char *prefix_text2; |
char *result; |
/* Skip trailing whitespace. */ |
@@ -453,16 +464,16 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) |
return -1; |
pfx_name = NULL; |
- if (is_prefix != NULL) |
+ if (is_prefix != NULL) |
{ |
cmp = PyObject_IsTrue (is_prefix); |
if (cmp == 1) |
{ |
int i, out; |
- |
+ |
/* Make a normalized form of the command name. */ |
pfx_name = xmalloc (strlen (name) + 2); |
- |
+ |
i = 0; |
out = 0; |
while (name[i]) |
@@ -496,9 +507,12 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) |
{ |
xfree (cmd_name); |
xfree (pfx_name); |
+ Py_DECREF (ds_obj); |
return -1; |
} |
} |
+ |
+ Py_XDECREF (ds_obj); |
} |
if (! docstring) |
docstring = xstrdup (_("This command is not documented.")); |
@@ -551,14 +565,14 @@ cmdpy_init (PyObject *self, PyObject *args, PyObject *kw) |
/* Initialize the 'commands' code. */ |
-void |
+int |
gdbpy_initialize_commands (void) |
{ |
int i; |
cmdpy_object_type.tp_new = PyType_GenericNew; |
if (PyType_Ready (&cmdpy_object_type) < 0) |
- return; |
+ return -1; |
/* Note: alias and user are special; pseudo appears to be unused, |
and there is no reason to expose tui or xdb, I think. */ |
@@ -579,20 +593,26 @@ gdbpy_initialize_commands (void) |
|| PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE", |
class_maintenance) < 0 |
|| PyModule_AddIntConstant (gdb_module, "COMMAND_USER", class_user) < 0) |
- return; |
+ return -1; |
for (i = 0; i < N_COMPLETERS; ++i) |
{ |
if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0) |
- return; |
+ return -1; |
} |
- Py_INCREF (&cmdpy_object_type); |
- PyModule_AddObject (gdb_module, "Command", |
- (PyObject *) &cmdpy_object_type); |
+ if (gdb_pymodule_addobject (gdb_module, "Command", |
+ (PyObject *) &cmdpy_object_type) < 0) |
+ return -1; |
invoke_cst = PyString_FromString ("invoke"); |
+ if (invoke_cst == NULL) |
+ return -1; |
complete_cst = PyString_FromString ("complete"); |
+ if (complete_cst == NULL) |
+ return -1; |
+ |
+ return 0; |
} |
@@ -607,8 +627,7 @@ static PyMethodDef cmdpy_object_methods[] = |
static PyTypeObject cmdpy_object_type = |
{ |
- PyObject_HEAD_INIT (NULL) |
- 0, /*ob_size*/ |
+ PyVarObject_HEAD_INIT (NULL, 0) |
"gdb.Command", /*tp_name*/ |
sizeof (cmdpy_object), /*tp_basicsize*/ |
0, /*tp_itemsize*/ |
@@ -666,6 +685,8 @@ gdbpy_string_to_argv (PyObject *self, PyObject *args) |
return NULL; |
py_argv = PyList_New (0); |
+ if (py_argv == NULL) |
+ return NULL; |
/* buildargv uses NULL to represent an empty argument list, but we can't use |
that in Python. Instead, if ARGS is "" then return an empty list. |