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. */
93 cmdpy_destroyer (struct cmd_list_element *self, void *context)
96 struct cleanup *cleanup;
98 cleanup = ensure_python_env (get_current_arch (), current_language);
100 /* Release our hold on the command object. */
101 cmd = (cmdpy_object *) context;
105 /* We allocated the name, doc string, and perhaps the prefix
109 xfree (self->prefixname);
111 do_cleanups (cleanup);
114 /* Called by gdb to invoke the command. */
117 cmdpy_function (struct cmd_list_element *command, char *args, int from_tty)
119 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
120 PyObject *argobj, *ttyobj, *result;
121 struct cleanup *cleanup;
123 cleanup = ensure_python_env (get_current_arch (), current_language);
126 error (_("Invalid invocation of Python command object."));
127 if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst))
129 if (obj->command->prefixname)
131 /* A prefix command does not need an invoke method. */
132 do_cleanups (cleanup);
135 error (_("Python command object missing 'invoke' method."));
140 argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL);
142 error (_("Could not convert arguments to Python string."));
144 ttyobj = from_tty ? Py_True : Py_False;
146 result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
153 PyObject *ptype, *pvalue, *ptraceback;
156 PyErr_Fetch (&ptype, &pvalue, &ptraceback);
158 /* Try to fetch an error message contained within ptype, pvalue.
159 When fetching the error message we need to make our own copy,
160 we no longer own ptype, pvalue after the call to PyErr_Restore. */
162 msg = gdbpy_exception_to_string (ptype, pvalue);
163 make_cleanup (xfree, msg);
167 /* An error occurred computing the string representation of the
168 error message. This is rare, but we should inform the user. */
169 printf_filtered (_("An error occurred in a Python command\n"
170 "and then another occurred computing the error message.\n"));
171 gdbpy_print_stack ();
174 /* Don't print the stack for gdb.GdbError exceptions.
175 It is generally used to flag user errors.
177 We also don't want to print "Error occurred in Python command"
178 for user errors. However, a missing message for gdb.GdbError
179 exceptions is arguably a bug, so we flag it as such. */
181 if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
182 || msg == NULL || *msg == '\0')
184 PyErr_Restore (ptype, pvalue, ptraceback);
185 gdbpy_print_stack ();
186 if (msg != NULL && *msg != '\0')
187 error (_("Error occurred in Python command: %s"), msg);
189 error (_("Error occurred in Python command."));
196 do_cleanups (cleanup);
199 /* Called by gdb for command completion. */
201 cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
203 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
204 PyObject *textobj, *wordobj, *resultobj = NULL;
205 char **result = NULL;
206 struct cleanup *cleanup;
208 cleanup = ensure_python_env (get_current_arch (), current_language);
211 error (_("Invalid invocation of Python command object."));
212 if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
214 /* If there is no complete method, don't error -- instead, just
215 say that there are no completions. */
219 textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
221 error (_("Could not convert argument to Python string."));
222 wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
224 error (_("Could not convert argument to Python string."));
226 resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
227 textobj, wordobj, NULL);
232 /* Just swallow errors here. */
236 make_cleanup_py_decref (resultobj);
239 if (PySequence_Check (resultobj))
241 Py_ssize_t i, len = PySequence_Size (resultobj);
247 result = (char **) xmalloc ((len + 1) * sizeof (char *));
248 for (i = out = 0; i < len; ++i)
250 PyObject *elt = PySequence_GetItem (resultobj, i);
252 if (elt == NULL || ! gdbpy_is_string (elt))
254 /* Skip problem elements. */
258 result[out] = python_string_to_host_string (elt);
263 else if (PyInt_Check (resultobj))
265 /* User code may also return one of the completion constants,
266 thus requesting that sort of completion. */
267 long value = PyInt_AsLong (resultobj);
269 if (value >= 0 && value < (long) N_COMPLETERS)
270 result = completers[value].completer (command, text, word);
275 do_cleanups (cleanup);
280 /* Helper for cmdpy_init which locates the command list to use and
281 pulls out the command name.
283 TEXT is the command name list. The final word in the list is the
284 name of the new command. All earlier words must be existing prefix
287 *BASE_LIST is set to the final prefix command's list of
290 START_LIST is the list in which the search starts.
292 This function returns the xmalloc()d name of the new command. On
293 error sets the Python error and returns NULL. */
295 gdbpy_parse_command_name (char *text,
296 struct cmd_list_element ***base_list,
297 struct cmd_list_element **start_list)
299 struct cmd_list_element *elt;
300 int len = strlen (text);
305 /* Skip trailing whitespace. */
306 for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
310 PyErr_SetString (PyExc_RuntimeError, _("No command name found."));
315 /* Find first character of the final word. */
316 for (; i > 0 && (isalnum (text[i - 1])
317 || text[i - 1] == '-'
318 || text[i - 1] == '_');
321 result = xmalloc (lastchar - i + 2);
322 memcpy (result, &text[i], lastchar - i + 1);
323 result[lastchar - i + 1] = '\0';
325 /* Skip whitespace again. */
326 for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
330 *base_list = start_list;
334 prefix_text = xmalloc (i + 2);
335 memcpy (prefix_text, text, i + 1);
336 prefix_text[i + 1] = '\0';
339 elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
340 if (!elt || elt == (struct cmd_list_element *) -1)
342 PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
352 *base_list = elt->prefixlist;
356 PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command."),
363 /* Object initializer; sets up gdb-side structures for command.
365 Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]).
367 NAME is the name of the command. It may consist of multiple words,
368 in which case the final word is the name of the new command, and
369 earlier words must be prefix commands.
371 COMMAND_CLASS is the kind of command. It should be one of the COMMAND_*
372 constants defined in the gdb module.
374 COMPLETER_CLASS is the kind of completer. If not given, the
375 "complete" method will be used. Otherwise, it should be one of the
376 COMPLETE_* constants defined in the gdb module.
378 If PREFIX is True, then this command is a prefix command.
380 The documentation for the command is taken from the doc string for
385 cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
387 cmdpy_object *obj = (cmdpy_object *) self;
390 int completetype = -1;
391 char *docstring = NULL;
392 volatile struct gdb_exception except;
393 struct cmd_list_element **cmd_list;
394 char *cmd_name, *pfx_name;
395 static char *keywords[] = { "name", "command_class", "completer_class",
397 PyObject *is_prefix = NULL;
402 /* Note: this is apparently not documented in Python. We return
403 0 for success, -1 for failure. */
404 PyErr_Format (PyExc_RuntimeError,
405 _("Command object already initialized."));
409 if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype,
410 &completetype, &is_prefix))
413 if (cmdtype != no_class && cmdtype != class_run
414 && cmdtype != class_vars && cmdtype != class_stack
415 && cmdtype != class_files && cmdtype != class_support
416 && cmdtype != class_info && cmdtype != class_breakpoint
417 && cmdtype != class_trace && cmdtype != class_obscure
418 && cmdtype != class_maintenance)
420 PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
424 if (completetype < -1 || completetype >= (int) N_COMPLETERS)
426 PyErr_Format (PyExc_RuntimeError, _("Invalid completion type argument."));
430 cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist);
435 if (is_prefix != NULL)
437 cmp = PyObject_IsTrue (is_prefix);
442 /* Make a normalized form of the command name. */
443 pfx_name = xmalloc (strlen (name) + 2);
449 /* Skip whitespace. */
450 while (name[i] == ' ' || name[i] == '\t')
452 /* Copy non-whitespace characters. */
453 while (name[i] && name[i] != ' ' && name[i] != '\t')
454 pfx_name[out++] = name[i++];
455 /* Add a single space after each word -- including the final
457 pfx_name[out++] = ' ';
459 pfx_name[out] = '\0';
464 if (PyObject_HasAttr (self, gdbpy_doc_cst))
466 PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
468 if (ds_obj && gdbpy_is_string (ds_obj))
469 docstring = python_string_to_host_string (ds_obj);
472 docstring = xstrdup (_("This command is not documented."));
476 TRY_CATCH (except, RETURN_MASK_ALL)
478 struct cmd_list_element *cmd;
484 /* If we have our own "invoke" method, then allow unknown
486 allow_unknown = PyObject_HasAttr (self, invoke_cst);
487 cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype,
488 NULL, docstring, &obj->sub_list,
489 pfx_name, allow_unknown, cmd_list);
492 cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
493 docstring, cmd_list);
495 /* There appears to be no API to set this. */
496 cmd->func = cmdpy_function;
497 cmd->destroyer = cmdpy_destroyer;
500 set_cmd_context (cmd, self);
501 set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
502 : completers[completetype].completer));
504 if (except.reason < 0)
510 PyErr_Format (except.reason == RETURN_QUIT
511 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
512 "%s", except.message);
520 /* Initialize the 'commands' code. */
522 gdbpy_initialize_commands (void)
526 if (PyType_Ready (&cmdpy_object_type) < 0)
529 /* Note: alias and user are special; pseudo appears to be unused,
530 and there is no reason to expose tui or xdb, I think. */
531 if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0
532 || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0
533 || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0
534 || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0
535 || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0
536 || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT",
538 || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0
539 || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS",
540 class_breakpoint) < 0
541 || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS",
543 || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
545 || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
546 class_maintenance) < 0)
549 for (i = 0; i < N_COMPLETERS; ++i)
551 if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
555 Py_INCREF (&cmdpy_object_type);
556 PyModule_AddObject (gdb_module, "Command",
557 (PyObject *) &cmdpy_object_type);
559 invoke_cst = PyString_FromString ("invoke");
560 complete_cst = PyString_FromString ("complete");
565 static PyMethodDef cmdpy_object_methods[] =
567 { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
568 "Prevent command repetition when user enters empty line." },
573 static PyTypeObject cmdpy_object_type =
575 PyObject_HEAD_INIT (NULL)
577 "gdb.Command", /*tp_name*/
578 sizeof (cmdpy_object), /*tp_basicsize*/
587 0, /*tp_as_sequence*/
595 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
596 "GDB command object", /* tp_doc */
599 0, /* tp_richcompare */
600 0, /* tp_weaklistoffset */
603 cmdpy_object_methods, /* tp_methods */
608 0, /* tp_descr_get */
609 0, /* tp_descr_set */
610 0, /* tp_dictoffset */
611 cmdpy_init, /* tp_init */
613 PyType_GenericNew /* tp_new */
618 /* Utility to build a buildargv-like result from ARGS.
619 This intentionally parses arguments the way libiberty/argv.c:buildargv
620 does. It splits up arguments in a reasonable way, and we want a standard
621 way of parsing arguments. Several gdb commands use buildargv to parse their
622 arguments. Plus we want to be able to write compatible python
623 implementations of gdb commands. */
626 gdbpy_string_to_argv (PyObject *self, PyObject *args)
631 if (!PyArg_ParseTuple (args, "s", &input))
634 py_argv = PyList_New (0);
636 /* buildargv uses NULL to represent an empty argument list, but we can't use
637 that in Python. Instead, if ARGS is "" then return an empty list.
638 This undoes the NULL -> "" conversion that cmdpy_function does. */
642 char **c_argv = gdb_buildargv (input);
645 for (i = 0; c_argv[i] != NULL; ++i)
647 PyObject *argp = PyString_FromString (c_argv[i]);
650 || PyList_Append (py_argv, argp) < 0)