2011-01-05 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / python / py-cmd.c
1 /* gdb commands implemented in Python
2
3 Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20
21 #include "defs.h"
22 #include "arch-utils.h"
23 #include "value.h"
24 #include "exceptions.h"
25 #include "python-internal.h"
26 #include "charset.h"
27 #include "gdbcmd.h"
28 #include "cli/cli-decode.h"
29 #include "completer.h"
30 #include "language.h"
31
32 /* Struct representing built-in completion types. */
33 struct cmdpy_completer
34 {
35 /* Python symbol name. */
36 char *name;
37 /* Completion function. */
38 char **(*completer) (struct cmd_list_element *, char *, char *);
39 };
40
41 static struct cmdpy_completer completers[] =
42 {
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 },
48 };
49
50 #define N_COMPLETERS (sizeof (completers) / sizeof (completers[0]))
51
52 /* A gdb command. For the time being only ordinary commands (not
53 set/show commands) are allowed. */
54 struct cmdpy_object
55 {
56 PyObject_HEAD
57
58 /* The corresponding gdb command object, or NULL if the command is
59 no longer installed. */
60 struct cmd_list_element *command;
61
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;
67 };
68
69 typedef struct cmdpy_object cmdpy_object;
70
71 static PyTypeObject cmdpy_object_type;
72
73
74 /* Constants used by this module. */
75 static PyObject *invoke_cst;
76 static PyObject *complete_cst;
77
78 \f
79
80 /* Python function which wraps dont_repeat. */
81 static PyObject *
82 cmdpy_dont_repeat (PyObject *self, PyObject *args)
83 {
84 dont_repeat ();
85 Py_RETURN_NONE;
86 }
87
88 \f
89
90 /* Called if the gdb cmd_list_element is destroyed. */
91
92 static void
93 cmdpy_destroyer (struct cmd_list_element *self, void *context)
94 {
95 cmdpy_object *cmd;
96 struct cleanup *cleanup;
97
98 cleanup = ensure_python_env (get_current_arch (), current_language);
99
100 /* Release our hold on the command object. */
101 cmd = (cmdpy_object *) context;
102 cmd->command = NULL;
103 Py_DECREF (cmd);
104
105 /* We allocated the name, doc string, and perhaps the prefix
106 name. */
107 xfree (self->name);
108 xfree (self->doc);
109 xfree (self->prefixname);
110
111 do_cleanups (cleanup);
112 }
113
114 /* Called by gdb to invoke the command. */
115
116 static void
117 cmdpy_function (struct cmd_list_element *command, char *args, int from_tty)
118 {
119 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
120 PyObject *argobj, *ttyobj, *result;
121 struct cleanup *cleanup;
122
123 cleanup = ensure_python_env (get_current_arch (), current_language);
124
125 if (! obj)
126 error (_("Invalid invocation of Python command object."));
127 if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst))
128 {
129 if (obj->command->prefixname)
130 {
131 /* A prefix command does not need an invoke method. */
132 do_cleanups (cleanup);
133 return;
134 }
135 error (_("Python command object missing 'invoke' method."));
136 }
137
138 if (! args)
139 args = "";
140 argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL);
141 if (! argobj)
142 {
143 gdbpy_print_stack ();
144 error (_("Could not convert arguments to Python string."));
145 }
146
147 ttyobj = from_tty ? Py_True : Py_False;
148 Py_INCREF (ttyobj);
149 result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
150 ttyobj, NULL);
151 Py_DECREF (argobj);
152 Py_DECREF (ttyobj);
153
154 if (! result)
155 {
156 PyObject *ptype, *pvalue, *ptraceback;
157 char *msg;
158
159 PyErr_Fetch (&ptype, &pvalue, &ptraceback);
160
161 /* Try to fetch an error message contained within ptype, pvalue.
162 When fetching the error message we need to make our own copy,
163 we no longer own ptype, pvalue after the call to PyErr_Restore. */
164
165 msg = gdbpy_exception_to_string (ptype, pvalue);
166 make_cleanup (xfree, msg);
167
168 if (msg == NULL)
169 {
170 /* An error occurred computing the string representation of the
171 error message. This is rare, but we should inform the user. */
172 printf_filtered (_("An error occurred in a Python command\n"
173 "and then another occurred computing the "
174 "error message.\n"));
175 gdbpy_print_stack ();
176 }
177
178 /* Don't print the stack for gdb.GdbError exceptions.
179 It is generally used to flag user errors.
180
181 We also don't want to print "Error occurred in Python command"
182 for user errors. However, a missing message for gdb.GdbError
183 exceptions is arguably a bug, so we flag it as such. */
184
185 if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
186 || msg == NULL || *msg == '\0')
187 {
188 PyErr_Restore (ptype, pvalue, ptraceback);
189 gdbpy_print_stack ();
190 if (msg != NULL && *msg != '\0')
191 error (_("Error occurred in Python command: %s"), msg);
192 else
193 error (_("Error occurred in Python command."));
194 }
195 else
196 {
197 Py_XDECREF (ptype);
198 Py_XDECREF (pvalue);
199 Py_XDECREF (ptraceback);
200 error ("%s", msg);
201 }
202 }
203
204 Py_DECREF (result);
205 do_cleanups (cleanup);
206 }
207
208 /* Called by gdb for command completion. */
209 static char **
210 cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
211 {
212 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
213 PyObject *textobj, *wordobj, *resultobj = NULL;
214 char **result = NULL;
215 struct cleanup *cleanup;
216
217 cleanup = ensure_python_env (get_current_arch (), current_language);
218
219 if (! obj)
220 error (_("Invalid invocation of Python command object."));
221 if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
222 {
223 /* If there is no complete method, don't error -- instead, just
224 say that there are no completions. */
225 goto done;
226 }
227
228 textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
229 if (! textobj)
230 error (_("Could not convert argument to Python string."));
231 wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
232 if (! wordobj)
233 error (_("Could not convert argument to Python string."));
234
235 resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
236 textobj, wordobj, NULL);
237 Py_DECREF (textobj);
238 Py_DECREF (wordobj);
239 if (! resultobj)
240 {
241 /* Just swallow errors here. */
242 PyErr_Clear ();
243 goto done;
244 }
245 make_cleanup_py_decref (resultobj);
246
247 result = NULL;
248 if (PySequence_Check (resultobj))
249 {
250 Py_ssize_t i, len = PySequence_Size (resultobj);
251 Py_ssize_t out;
252
253 if (len < 0)
254 goto done;
255
256 result = (char **) xmalloc ((len + 1) * sizeof (char *));
257 for (i = out = 0; i < len; ++i)
258 {
259 PyObject *elt = PySequence_GetItem (resultobj, i);
260
261 if (elt == NULL || ! gdbpy_is_string (elt))
262 {
263 /* Skip problem elements. */
264 PyErr_Clear ();
265 continue;
266 }
267 result[out] = python_string_to_host_string (elt);
268 if (result[out] == NULL)
269 {
270 /* Skip problem elements. */
271 PyErr_Clear ();
272 continue;
273 }
274 ++out;
275 }
276 result[out] = NULL;
277 }
278 else if (PyInt_Check (resultobj))
279 {
280 /* User code may also return one of the completion constants,
281 thus requesting that sort of completion. */
282 long value = PyInt_AsLong (resultobj);
283
284 if (value >= 0 && value < (long) N_COMPLETERS)
285 result = completers[value].completer (command, text, word);
286 }
287
288 done:
289
290 do_cleanups (cleanup);
291
292 return result;
293 }
294
295 /* Helper for cmdpy_init which locates the command list to use and
296 pulls out the command name.
297
298 TEXT is the command name list. The final word in the list is the
299 name of the new command. All earlier words must be existing prefix
300 commands.
301
302 *BASE_LIST is set to the final prefix command's list of
303 *sub-commands.
304
305 START_LIST is the list in which the search starts.
306
307 This function returns the xmalloc()d name of the new command. On
308 error sets the Python error and returns NULL. */
309 char *
310 gdbpy_parse_command_name (char *text,
311 struct cmd_list_element ***base_list,
312 struct cmd_list_element **start_list)
313 {
314 struct cmd_list_element *elt;
315 int len = strlen (text);
316 int i, lastchar;
317 char *prefix_text;
318 char *result;
319
320 /* Skip trailing whitespace. */
321 for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
322 ;
323 if (i < 0)
324 {
325 PyErr_SetString (PyExc_RuntimeError, _("No command name found."));
326 return NULL;
327 }
328 lastchar = i;
329
330 /* Find first character of the final word. */
331 for (; i > 0 && (isalnum (text[i - 1])
332 || text[i - 1] == '-'
333 || text[i - 1] == '_');
334 --i)
335 ;
336 result = xmalloc (lastchar - i + 2);
337 memcpy (result, &text[i], lastchar - i + 1);
338 result[lastchar - i + 1] = '\0';
339
340 /* Skip whitespace again. */
341 for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
342 ;
343 if (i < 0)
344 {
345 *base_list = start_list;
346 return result;
347 }
348
349 prefix_text = xmalloc (i + 2);
350 memcpy (prefix_text, text, i + 1);
351 prefix_text[i + 1] = '\0';
352
353 text = prefix_text;
354 elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
355 if (!elt || elt == (struct cmd_list_element *) -1)
356 {
357 PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
358 prefix_text);
359 xfree (prefix_text);
360 xfree (result);
361 return NULL;
362 }
363
364 if (elt->prefixlist)
365 {
366 xfree (prefix_text);
367 *base_list = elt->prefixlist;
368 return result;
369 }
370
371 PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command."),
372 prefix_text);
373 xfree (prefix_text);
374 xfree (result);
375 return NULL;
376 }
377
378 /* Object initializer; sets up gdb-side structures for command.
379
380 Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]).
381
382 NAME is the name of the command. It may consist of multiple words,
383 in which case the final word is the name of the new command, and
384 earlier words must be prefix commands.
385
386 COMMAND_CLASS is the kind of command. It should be one of the COMMAND_*
387 constants defined in the gdb module.
388
389 COMPLETER_CLASS is the kind of completer. If not given, the
390 "complete" method will be used. Otherwise, it should be one of the
391 COMPLETE_* constants defined in the gdb module.
392
393 If PREFIX is True, then this command is a prefix command.
394
395 The documentation for the command is taken from the doc string for
396 the python class.
397
398 */
399 static int
400 cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
401 {
402 cmdpy_object *obj = (cmdpy_object *) self;
403 char *name;
404 int cmdtype;
405 int completetype = -1;
406 char *docstring = NULL;
407 volatile struct gdb_exception except;
408 struct cmd_list_element **cmd_list;
409 char *cmd_name, *pfx_name;
410 static char *keywords[] = { "name", "command_class", "completer_class",
411 "prefix", NULL };
412 PyObject *is_prefix = NULL;
413 int cmp;
414
415 if (obj->command)
416 {
417 /* Note: this is apparently not documented in Python. We return
418 0 for success, -1 for failure. */
419 PyErr_Format (PyExc_RuntimeError,
420 _("Command object already initialized."));
421 return -1;
422 }
423
424 if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO",
425 keywords, &name, &cmdtype,
426 &completetype, &is_prefix))
427 return -1;
428
429 if (cmdtype != no_class && cmdtype != class_run
430 && cmdtype != class_vars && cmdtype != class_stack
431 && cmdtype != class_files && cmdtype != class_support
432 && cmdtype != class_info && cmdtype != class_breakpoint
433 && cmdtype != class_trace && cmdtype != class_obscure
434 && cmdtype != class_maintenance)
435 {
436 PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
437 return -1;
438 }
439
440 if (completetype < -1 || completetype >= (int) N_COMPLETERS)
441 {
442 PyErr_Format (PyExc_RuntimeError,
443 _("Invalid completion type argument."));
444 return -1;
445 }
446
447 cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist);
448 if (! cmd_name)
449 return -1;
450
451 pfx_name = NULL;
452 if (is_prefix != NULL)
453 {
454 cmp = PyObject_IsTrue (is_prefix);
455 if (cmp == 1)
456 {
457 int i, out;
458
459 /* Make a normalized form of the command name. */
460 pfx_name = xmalloc (strlen (name) + 2);
461
462 i = 0;
463 out = 0;
464 while (name[i])
465 {
466 /* Skip whitespace. */
467 while (name[i] == ' ' || name[i] == '\t')
468 ++i;
469 /* Copy non-whitespace characters. */
470 while (name[i] && name[i] != ' ' && name[i] != '\t')
471 pfx_name[out++] = name[i++];
472 /* Add a single space after each word -- including the final
473 word. */
474 pfx_name[out++] = ' ';
475 }
476 pfx_name[out] = '\0';
477 }
478 else if (cmp < 0)
479 return -1;
480 }
481 if (PyObject_HasAttr (self, gdbpy_doc_cst))
482 {
483 PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
484
485 if (ds_obj && gdbpy_is_string (ds_obj))
486 {
487 docstring = python_string_to_host_string (ds_obj);
488 if (docstring == NULL)
489 {
490 xfree (cmd_name);
491 xfree (pfx_name);
492 return -1;
493 }
494 }
495 }
496 if (! docstring)
497 docstring = xstrdup (_("This command is not documented."));
498
499 Py_INCREF (self);
500
501 TRY_CATCH (except, RETURN_MASK_ALL)
502 {
503 struct cmd_list_element *cmd;
504
505 if (pfx_name)
506 {
507 int allow_unknown;
508
509 /* If we have our own "invoke" method, then allow unknown
510 sub-commands. */
511 allow_unknown = PyObject_HasAttr (self, invoke_cst);
512 cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype,
513 NULL, docstring, &obj->sub_list,
514 pfx_name, allow_unknown, cmd_list);
515 }
516 else
517 cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
518 docstring, cmd_list);
519
520 /* There appears to be no API to set this. */
521 cmd->func = cmdpy_function;
522 cmd->destroyer = cmdpy_destroyer;
523
524 obj->command = cmd;
525 set_cmd_context (cmd, self);
526 set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
527 : completers[completetype].completer));
528 }
529 if (except.reason < 0)
530 {
531 xfree (cmd_name);
532 xfree (docstring);
533 xfree (pfx_name);
534 Py_DECREF (self);
535 PyErr_Format (except.reason == RETURN_QUIT
536 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
537 "%s", except.message);
538 return -1;
539 }
540 return 0;
541 }
542
543 \f
544
545 /* Initialize the 'commands' code. */
546 void
547 gdbpy_initialize_commands (void)
548 {
549 int i;
550
551 if (PyType_Ready (&cmdpy_object_type) < 0)
552 return;
553
554 /* Note: alias and user are special; pseudo appears to be unused,
555 and there is no reason to expose tui or xdb, I think. */
556 if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0
557 || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0
558 || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0
559 || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0
560 || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0
561 || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT",
562 class_support) < 0
563 || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0
564 || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS",
565 class_breakpoint) < 0
566 || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS",
567 class_trace) < 0
568 || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
569 class_obscure) < 0
570 || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
571 class_maintenance) < 0)
572 return;
573
574 for (i = 0; i < N_COMPLETERS; ++i)
575 {
576 if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
577 return;
578 }
579
580 Py_INCREF (&cmdpy_object_type);
581 PyModule_AddObject (gdb_module, "Command",
582 (PyObject *) &cmdpy_object_type);
583
584 invoke_cst = PyString_FromString ("invoke");
585 complete_cst = PyString_FromString ("complete");
586 }
587
588 \f
589
590 static PyMethodDef cmdpy_object_methods[] =
591 {
592 { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
593 "Prevent command repetition when user enters empty line." },
594
595 { 0 }
596 };
597
598 static PyTypeObject cmdpy_object_type =
599 {
600 PyObject_HEAD_INIT (NULL)
601 0, /*ob_size*/
602 "gdb.Command", /*tp_name*/
603 sizeof (cmdpy_object), /*tp_basicsize*/
604 0, /*tp_itemsize*/
605 0, /*tp_dealloc*/
606 0, /*tp_print*/
607 0, /*tp_getattr*/
608 0, /*tp_setattr*/
609 0, /*tp_compare*/
610 0, /*tp_repr*/
611 0, /*tp_as_number*/
612 0, /*tp_as_sequence*/
613 0, /*tp_as_mapping*/
614 0, /*tp_hash */
615 0, /*tp_call*/
616 0, /*tp_str*/
617 0, /*tp_getattro*/
618 0, /*tp_setattro*/
619 0, /*tp_as_buffer*/
620 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
621 "GDB command object", /* tp_doc */
622 0, /* tp_traverse */
623 0, /* tp_clear */
624 0, /* tp_richcompare */
625 0, /* tp_weaklistoffset */
626 0, /* tp_iter */
627 0, /* tp_iternext */
628 cmdpy_object_methods, /* tp_methods */
629 0, /* tp_members */
630 0, /* tp_getset */
631 0, /* tp_base */
632 0, /* tp_dict */
633 0, /* tp_descr_get */
634 0, /* tp_descr_set */
635 0, /* tp_dictoffset */
636 cmdpy_init, /* tp_init */
637 0, /* tp_alloc */
638 PyType_GenericNew /* tp_new */
639 };
640
641 \f
642
643 /* Utility to build a buildargv-like result from ARGS.
644 This intentionally parses arguments the way libiberty/argv.c:buildargv
645 does. It splits up arguments in a reasonable way, and we want a standard
646 way of parsing arguments. Several gdb commands use buildargv to parse their
647 arguments. Plus we want to be able to write compatible python
648 implementations of gdb commands. */
649
650 PyObject *
651 gdbpy_string_to_argv (PyObject *self, PyObject *args)
652 {
653 PyObject *py_argv;
654 char *input;
655
656 if (!PyArg_ParseTuple (args, "s", &input))
657 return NULL;
658
659 py_argv = PyList_New (0);
660
661 /* buildargv uses NULL to represent an empty argument list, but we can't use
662 that in Python. Instead, if ARGS is "" then return an empty list.
663 This undoes the NULL -> "" conversion that cmdpy_function does. */
664
665 if (*input != '\0')
666 {
667 char **c_argv = gdb_buildargv (input);
668 int i;
669
670 for (i = 0; c_argv[i] != NULL; ++i)
671 {
672 PyObject *argp = PyString_FromString (c_argv[i]);
673
674 if (argp == NULL
675 || PyList_Append (py_argv, argp) < 0)
676 {
677 if (argp != NULL)
678 {
679 Py_DECREF (argp);
680 }
681 Py_DECREF (py_argv);
682 freeargv (c_argv);
683 return NULL;
684 }
685 }
686
687 freeargv (c_argv);
688 }
689
690 return py_argv;
691 }
This page took 0.066131 seconds and 4 git commands to generate.