1 /* gdb commands implemented in Python
3 Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "arch-utils.h"
24 #include "exceptions.h"
25 #include "python-internal.h"
28 #include "cli/cli-decode.h"
29 #include "completer.h"
32 /* Struct representing built-in completion types. */
33 struct cmdpy_completer
35 /* Python symbol name. */
37 /* Completion function. */
38 char **(*completer) (struct cmd_list_element *, char *, char *);
41 static struct cmdpy_completer completers[] =
43 { "COMPLETE_NONE", noop_completer },
44 { "COMPLETE_FILENAME", filename_completer },
45 { "COMPLETE_LOCATION", location_completer },
46 { "COMPLETE_COMMAND", command_completer },
47 { "COMPLETE_SYMBOL", make_symbol_completion_list_fn },
50 #define N_COMPLETERS (sizeof (completers) / sizeof (completers[0]))
52 /* A gdb command. For the time being only ordinary commands (not
53 set/show commands) are allowed. */
58 /* The corresponding gdb command object, or NULL if the command is
59 no longer installed. */
60 struct cmd_list_element *command;
62 /* A prefix command requires storage for a list of its sub-commands.
63 A pointer to this is passed to add_prefix_command, and to add_cmd
64 for sub-commands of that prefix. If this Command is not a prefix
65 command, then this field is unused. */
66 struct cmd_list_element *sub_list;
69 typedef struct cmdpy_object cmdpy_object;
71 static PyTypeObject cmdpy_object_type;
74 /* Constants used by this module. */
75 static PyObject *invoke_cst;
76 static PyObject *complete_cst;
80 /* Python function which wraps dont_repeat. */
82 cmdpy_dont_repeat (PyObject *self, PyObject *args)
90 /* Called if the gdb cmd_list_element is destroyed. */
92 cmdpy_destroyer (struct cmd_list_element *self, void *context)
95 struct cleanup *cleanup;
97 cleanup = ensure_python_env (get_current_arch (), current_language);
99 /* Release our hold on the command object. */
100 cmd = (cmdpy_object *) context;
104 /* We allocated the name, doc string, and perhaps the prefix
108 xfree (self->prefixname);
110 do_cleanups (cleanup);
113 /* Called by gdb to invoke the command. */
115 cmdpy_function (struct cmd_list_element *command, char *args, int from_tty)
117 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
118 PyObject *argobj, *ttyobj, *result;
119 struct cleanup *cleanup;
121 cleanup = ensure_python_env (get_current_arch (), current_language);
124 error (_("Invalid invocation of Python command object."));
125 if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst))
127 if (obj->command->prefixname)
129 /* A prefix command does not need an invoke method. */
130 do_cleanups (cleanup);
133 error (_("Python command object missing 'invoke' method."));
138 argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL);
140 error (_("Could not convert arguments to Python string."));
142 ttyobj = from_tty ? Py_True : Py_False;
144 result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
150 PyObject *ptype, *pvalue, *ptraceback;
153 PyErr_Fetch (&ptype, &pvalue, &ptraceback);
155 if (pvalue && PyString_Check (pvalue))
157 /* Make a temporary copy of the string data. */
158 char *s = PyString_AsString (pvalue);
159 char *copy = alloca (strlen (s) + 1);
162 PyErr_Restore (ptype, pvalue, ptraceback);
163 gdbpy_print_stack ();
164 error (_("Error occurred in Python command: %s"), copy);
168 PyErr_Restore (ptype, pvalue, ptraceback);
169 gdbpy_print_stack ();
170 error (_("Error occurred in Python command."));
174 do_cleanups (cleanup);
177 /* Called by gdb for command completion. */
179 cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
181 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
182 PyObject *textobj, *wordobj, *resultobj = NULL;
183 char **result = NULL;
184 struct cleanup *cleanup;
186 cleanup = ensure_python_env (get_current_arch (), current_language);
189 error (_("Invalid invocation of Python command object."));
190 if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
192 /* If there is no complete method, don't error -- instead, just
193 say that there are no completions. */
197 textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
199 error (_("Could not convert argument to Python string."));
200 wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
202 error (_("Could not convert argument to Python string."));
204 resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
205 textobj, wordobj, NULL);
210 /* Just swallow errors here. */
214 make_cleanup_py_decref (resultobj);
217 if (PySequence_Check (resultobj))
219 Py_ssize_t i, len = PySequence_Size (resultobj);
224 result = (char **) xmalloc ((len + 1) * sizeof (char *));
225 for (i = out = 0; i < len; ++i)
228 PyObject *elt = PySequence_GetItem (resultobj, i);
229 if (elt == NULL || ! gdbpy_is_string (elt))
231 /* Skip problem elements. */
235 result[out] = python_string_to_host_string (elt);
240 else if (PyInt_Check (resultobj))
242 /* User code may also return one of the completion constants,
243 thus requesting that sort of completion. */
244 long value = PyInt_AsLong (resultobj);
245 if (value >= 0 && value < (long) N_COMPLETERS)
246 result = completers[value].completer (command, text, word);
251 do_cleanups (cleanup);
256 /* Helper for cmdpy_init which locates the command list to use and
257 pulls out the command name.
259 TEXT is the command name list. The final word in the list is the
260 name of the new command. All earlier words must be existing prefix
263 *BASE_LIST is set to the final prefix command's list of
266 START_LIST is the list in which the search starts.
268 This function returns the xmalloc()d name of the new command. On
269 error sets the Python error and returns NULL. */
271 gdbpy_parse_command_name (char *text,
272 struct cmd_list_element ***base_list,
273 struct cmd_list_element **start_list)
275 struct cmd_list_element *elt;
276 int len = strlen (text);
281 /* Skip trailing whitespace. */
282 for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
286 PyErr_SetString (PyExc_RuntimeError, _("No command name found."));
291 /* Find first character of the final word. */
292 for (; i > 0 && (isalnum (text[i - 1])
293 || text[i - 1] == '-'
294 || text[i - 1] == '_');
297 result = xmalloc (lastchar - i + 2);
298 memcpy (result, &text[i], lastchar - i + 1);
299 result[lastchar - i + 1] = '\0';
301 /* Skip whitespace again. */
302 for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
306 *base_list = start_list;
310 prefix_text = xmalloc (i + 2);
311 memcpy (prefix_text, text, i + 1);
312 prefix_text[i + 1] = '\0';
315 elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
316 if (!elt || elt == (struct cmd_list_element *) -1)
318 PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
328 *base_list = elt->prefixlist;
332 PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command."),
339 /* Object initializer; sets up gdb-side structures for command.
341 Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]).
343 NAME is the name of the command. It may consist of multiple words,
344 in which case the final word is the name of the new command, and
345 earlier words must be prefix commands.
347 COMMAND_CLASS is the kind of command. It should be one of the COMMAND_*
348 constants defined in the gdb module.
350 COMPLETER_CLASS is the kind of completer. If not given, the
351 "complete" method will be used. Otherwise, it should be one of the
352 COMPLETE_* constants defined in the gdb module.
354 If PREFIX is True, then this command is a prefix command.
356 The documentation for the command is taken from the doc string for
361 cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
363 cmdpy_object *obj = (cmdpy_object *) self;
366 int completetype = -1;
367 char *docstring = NULL;
368 volatile struct gdb_exception except;
369 struct cmd_list_element **cmd_list;
370 char *cmd_name, *pfx_name;
371 static char *keywords[] = { "name", "command_class", "completer_class",
373 PyObject *is_prefix = NULL;
378 /* Note: this is apparently not documented in Python. We return
379 0 for success, -1 for failure. */
380 PyErr_Format (PyExc_RuntimeError,
381 _("Command object already initialized."));
385 if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype,
386 &completetype, &is_prefix))
389 if (cmdtype != no_class && cmdtype != class_run
390 && cmdtype != class_vars && cmdtype != class_stack
391 && cmdtype != class_files && cmdtype != class_support
392 && cmdtype != class_info && cmdtype != class_breakpoint
393 && cmdtype != class_trace && cmdtype != class_obscure
394 && cmdtype != class_maintenance)
396 PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
400 if (completetype < -1 || completetype >= (int) N_COMPLETERS)
402 PyErr_Format (PyExc_RuntimeError, _("Invalid completion type argument."));
406 cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist);
411 if (is_prefix != NULL)
413 cmp = PyObject_IsTrue (is_prefix);
418 /* Make a normalized form of the command name. */
419 pfx_name = xmalloc (strlen (name) + 2);
425 /* Skip whitespace. */
426 while (name[i] == ' ' || name[i] == '\t')
428 /* Copy non-whitespace characters. */
429 while (name[i] && name[i] != ' ' && name[i] != '\t')
430 pfx_name[out++] = name[i++];
431 /* Add a single space after each word -- including the final
433 pfx_name[out++] = ' ';
435 pfx_name[out] = '\0';
440 if (PyObject_HasAttr (self, gdbpy_doc_cst))
442 PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
443 if (ds_obj && gdbpy_is_string (ds_obj))
444 docstring = python_string_to_host_string (ds_obj);
447 docstring = xstrdup (_("This command is not documented."));
451 TRY_CATCH (except, RETURN_MASK_ALL)
453 struct cmd_list_element *cmd;
459 /* If we have our own "invoke" method, then allow unknown
461 allow_unknown = PyObject_HasAttr (self, invoke_cst);
462 cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype,
463 NULL, docstring, &obj->sub_list,
464 pfx_name, allow_unknown, cmd_list);
467 cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
468 docstring, cmd_list);
470 /* There appears to be no API to set this. */
471 cmd->func = cmdpy_function;
472 cmd->destroyer = cmdpy_destroyer;
475 set_cmd_context (cmd, self);
476 set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
477 : completers[completetype].completer));
479 if (except.reason < 0)
485 PyErr_Format (except.reason == RETURN_QUIT
486 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
487 "%s", except.message);
495 /* Initialize the 'commands' code. */
497 gdbpy_initialize_commands (void)
501 if (PyType_Ready (&cmdpy_object_type) < 0)
504 /* Note: alias and user are special; pseudo appears to be unused,
505 and there is no reason to expose tui or xdb, I think. */
506 if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0
507 || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0
508 || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0
509 || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0
510 || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0
511 || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT",
513 || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0
514 || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS",
515 class_breakpoint) < 0
516 || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS",
518 || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
520 || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
521 class_maintenance) < 0)
524 for (i = 0; i < N_COMPLETERS; ++i)
526 if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
530 Py_INCREF (&cmdpy_object_type);
531 PyModule_AddObject (gdb_module, "Command",
532 (PyObject *) &cmdpy_object_type);
534 invoke_cst = PyString_FromString ("invoke");
535 complete_cst = PyString_FromString ("complete");
540 static PyMethodDef cmdpy_object_methods[] =
542 { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
543 "Prevent command repetition when user enters empty line." },
548 static PyTypeObject cmdpy_object_type =
550 PyObject_HEAD_INIT (NULL)
552 "gdb.Command", /*tp_name*/
553 sizeof (cmdpy_object), /*tp_basicsize*/
562 0, /*tp_as_sequence*/
570 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
571 "GDB command object", /* tp_doc */
574 0, /* tp_richcompare */
575 0, /* tp_weaklistoffset */
578 cmdpy_object_methods, /* tp_methods */
583 0, /* tp_descr_get */
584 0, /* tp_descr_set */
585 0, /* tp_dictoffset */
586 cmdpy_init, /* tp_init */
588 PyType_GenericNew /* tp_new */