]> Git Repo - binutils.git/blob - gdb/python/py-cmd.c
Allow python to find its files if moved from original location.
[binutils.git] / gdb / python / py-cmd.c
1 /* gdb commands implemented in Python
2
3    Copyright (C) 2008, 2009, 2010 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     error (_("Could not convert arguments to Python string."));
143
144   ttyobj = from_tty ? Py_True : Py_False;
145   Py_INCREF (ttyobj);
146   result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
147                                        ttyobj, NULL);
148   Py_DECREF (argobj);
149   Py_DECREF (ttyobj);
150
151   if (! result)
152     {
153       PyObject *ptype, *pvalue, *ptraceback;
154       char *msg;
155
156       PyErr_Fetch (&ptype, &pvalue, &ptraceback);
157
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.  */
161
162       msg = gdbpy_exception_to_string (ptype, pvalue);
163       make_cleanup (xfree, msg);
164
165       if (msg == NULL)
166         {
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 ();
172         }
173
174       /* Don't print the stack for gdb.GdbError exceptions.
175          It is generally used to flag user errors.
176
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.  */
180
181       if (! PyErr_GivenExceptionMatches (ptype, gdbpy_gdberror_exc)
182           || msg == NULL || *msg == '\0')
183         {
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);
188           else
189             error (_("Error occurred in Python command."));
190         }
191       else
192         error ("%s", msg);
193     }
194
195   Py_DECREF (result);
196   do_cleanups (cleanup);
197 }
198
199 /* Called by gdb for command completion.  */
200 static char **
201 cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
202 {
203   cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
204   PyObject *textobj, *wordobj, *resultobj = NULL;
205   char **result = NULL;
206   struct cleanup *cleanup;
207
208   cleanup = ensure_python_env (get_current_arch (), current_language);
209
210   if (! obj)
211     error (_("Invalid invocation of Python command object."));
212   if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
213     {
214       /* If there is no complete method, don't error -- instead, just
215          say that there are no completions.  */
216       goto done;
217     }
218
219   textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
220   if (! textobj)
221     error (_("Could not convert argument to Python string."));
222   wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
223   if (! wordobj)
224     error (_("Could not convert argument to Python string."));
225
226   resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
227                                           textobj, wordobj, NULL);
228   Py_DECREF (textobj);
229   Py_DECREF (wordobj);
230   if (! resultobj)
231     {
232       /* Just swallow errors here.  */
233       PyErr_Clear ();
234       goto done;
235     }
236   make_cleanup_py_decref (resultobj);
237
238   result = NULL;
239   if (PySequence_Check (resultobj))
240     {
241       Py_ssize_t i, len = PySequence_Size (resultobj);
242       Py_ssize_t out;
243
244       if (len < 0)
245         goto done;
246
247       result = (char **) xmalloc ((len + 1) * sizeof (char *));
248       for (i = out = 0; i < len; ++i)
249         {
250           PyObject *elt = PySequence_GetItem (resultobj, i);
251
252           if (elt == NULL || ! gdbpy_is_string (elt))
253             {
254               /* Skip problem elements.  */
255               PyErr_Clear ();
256               continue;
257             }
258           result[out] = python_string_to_host_string (elt);
259           ++out;
260         }
261       result[out] = NULL;
262     }
263   else if (PyInt_Check (resultobj))
264     {
265       /* User code may also return one of the completion constants,
266          thus requesting that sort of completion.  */
267       long value = PyInt_AsLong (resultobj);
268
269       if (value >= 0 && value < (long) N_COMPLETERS)
270         result = completers[value].completer (command, text, word);
271     }
272
273  done:
274
275   do_cleanups (cleanup);
276
277   return result;
278 }
279
280 /* Helper for cmdpy_init which locates the command list to use and
281    pulls out the command name.
282    
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
285    commands.
286
287    *BASE_LIST is set to the final prefix command's list of
288    *sub-commands.
289    
290    START_LIST is the list in which the search starts.
291
292    This function returns the xmalloc()d name of the new command.  On
293    error sets the Python error and returns NULL.  */
294 char *
295 gdbpy_parse_command_name (char *text,
296                           struct cmd_list_element ***base_list,
297                           struct cmd_list_element **start_list)
298 {
299   struct cmd_list_element *elt;
300   int len = strlen (text);
301   int i, lastchar;
302   char *prefix_text;
303   char *result;
304
305   /* Skip trailing whitespace.  */
306   for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
307     ;
308   if (i < 0)
309     {
310       PyErr_SetString (PyExc_RuntimeError, _("No command name found."));
311       return NULL;
312     }
313   lastchar = i;
314
315   /* Find first character of the final word.  */
316   for (; i > 0 && (isalnum (text[i - 1])
317                    || text[i - 1] == '-'
318                    || text[i - 1] == '_');
319        --i)
320     ;
321   result = xmalloc (lastchar - i + 2);
322   memcpy (result, &text[i], lastchar - i + 1);
323   result[lastchar - i + 1] = '\0';
324
325   /* Skip whitespace again.  */
326   for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
327     ;
328   if (i < 0)
329     {
330       *base_list = start_list;
331       return result;
332     }
333
334   prefix_text = xmalloc (i + 2);
335   memcpy (prefix_text, text, i + 1);
336   prefix_text[i + 1] = '\0';
337
338   text = prefix_text;
339   elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
340   if (!elt || elt == (struct cmd_list_element *) -1)
341     {
342       PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
343                     prefix_text);
344       xfree (prefix_text);
345       xfree (result);
346       return NULL;
347     }
348
349   if (elt->prefixlist)
350     {
351       xfree (prefix_text);
352       *base_list = elt->prefixlist;
353       return result;
354     }
355
356   PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command."),
357                 prefix_text);
358   xfree (prefix_text);
359   xfree (result);
360   return NULL;
361 }
362
363 /* Object initializer; sets up gdb-side structures for command.
364
365    Use: __init__(NAME, COMMAND_CLASS [, COMPLETER_CLASS][, PREFIX]]).
366
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.
370
371    COMMAND_CLASS is the kind of command.  It should be one of the COMMAND_*
372    constants defined in the gdb module.
373
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.
377
378    If PREFIX is True, then this command is a prefix command.
379
380    The documentation for the command is taken from the doc string for
381    the python class.
382    
383 */
384 static int
385 cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
386 {
387   cmdpy_object *obj = (cmdpy_object *) self;
388   char *name;
389   int cmdtype;
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",
396                               "prefix", NULL };
397   PyObject *is_prefix = NULL;
398   int cmp;
399
400   if (obj->command)
401     {
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."));
406       return -1;
407     }
408
409   if (! PyArg_ParseTupleAndKeywords (args, kw, "si|iO", keywords, &name, &cmdtype,
410                           &completetype, &is_prefix))
411     return -1;
412
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)
419     {
420       PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
421       return -1;
422     }
423
424   if (completetype < -1 || completetype >= (int) N_COMPLETERS)
425     {
426       PyErr_Format (PyExc_RuntimeError, _("Invalid completion type argument."));
427       return -1;
428     }
429
430   cmd_name = gdbpy_parse_command_name (name, &cmd_list, &cmdlist);
431   if (! cmd_name)
432     return -1;
433
434   pfx_name = NULL;
435   if (is_prefix != NULL) 
436     {
437       cmp = PyObject_IsTrue (is_prefix);
438       if (cmp == 1)
439         {
440           int i, out;
441           
442           /* Make a normalized form of the command name.  */
443           pfx_name = xmalloc (strlen (name) + 2);
444           
445           i = 0;
446           out = 0;
447           while (name[i])
448             {
449               /* Skip whitespace.  */
450               while (name[i] == ' ' || name[i] == '\t')
451                 ++i;
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
456                  word.  */
457               pfx_name[out++] = ' ';
458             }
459           pfx_name[out] = '\0';
460         }
461       else if (cmp < 0)
462           return -1;
463     }
464   if (PyObject_HasAttr (self, gdbpy_doc_cst))
465     {
466       PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
467
468       if (ds_obj && gdbpy_is_string (ds_obj))
469         docstring = python_string_to_host_string (ds_obj);
470     }
471   if (! docstring)
472     docstring = xstrdup (_("This command is not documented."));
473
474   Py_INCREF (self);
475
476   TRY_CATCH (except, RETURN_MASK_ALL)
477     {
478       struct cmd_list_element *cmd;
479
480       if (pfx_name)
481         {
482           int allow_unknown;
483
484           /* If we have our own "invoke" method, then allow unknown
485              sub-commands.  */
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);
490         }
491       else
492         cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
493                        docstring, cmd_list);
494
495       /* There appears to be no API to set this.  */
496       cmd->func = cmdpy_function;
497       cmd->destroyer = cmdpy_destroyer;
498
499       obj->command = cmd;
500       set_cmd_context (cmd, self);
501       set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
502                                : completers[completetype].completer));
503     }
504   if (except.reason < 0)
505     {
506       xfree (cmd_name);
507       xfree (docstring);
508       xfree (pfx_name);
509       Py_DECREF (self);
510       PyErr_Format (except.reason == RETURN_QUIT
511                     ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
512                     "%s", except.message);
513       return -1;
514     }
515   return 0;
516 }
517
518 \f
519
520 /* Initialize the 'commands' code.  */
521 void
522 gdbpy_initialize_commands (void)
523 {
524   int i;
525
526   if (PyType_Ready (&cmdpy_object_type) < 0)
527     return;
528
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",
537                                   class_support) < 0
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",
542                                   class_trace) < 0
543       || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
544                                   class_obscure) < 0
545       || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
546                                   class_maintenance) < 0)
547     return;
548
549   for (i = 0; i < N_COMPLETERS; ++i)
550     {
551       if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
552         return;
553     }
554
555   Py_INCREF (&cmdpy_object_type);
556   PyModule_AddObject (gdb_module, "Command",
557                       (PyObject *) &cmdpy_object_type);
558
559   invoke_cst = PyString_FromString ("invoke");
560   complete_cst = PyString_FromString ("complete");
561 }
562
563 \f
564
565 static PyMethodDef cmdpy_object_methods[] =
566 {
567   { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
568     "Prevent command repetition when user enters empty line." },
569
570   { 0 }
571 };
572
573 static PyTypeObject cmdpy_object_type =
574 {
575   PyObject_HEAD_INIT (NULL)
576   0,                              /*ob_size*/
577   "gdb.Command",                  /*tp_name*/
578   sizeof (cmdpy_object),          /*tp_basicsize*/
579   0,                              /*tp_itemsize*/
580   0,                              /*tp_dealloc*/
581   0,                              /*tp_print*/
582   0,                              /*tp_getattr*/
583   0,                              /*tp_setattr*/
584   0,                              /*tp_compare*/
585   0,                              /*tp_repr*/
586   0,                              /*tp_as_number*/
587   0,                              /*tp_as_sequence*/
588   0,                              /*tp_as_mapping*/
589   0,                              /*tp_hash */
590   0,                              /*tp_call*/
591   0,                              /*tp_str*/
592   0,                              /*tp_getattro*/
593   0,                              /*tp_setattro*/
594   0,                              /*tp_as_buffer*/
595   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
596   "GDB command object",           /* tp_doc */
597   0,                              /* tp_traverse */
598   0,                              /* tp_clear */
599   0,                              /* tp_richcompare */
600   0,                              /* tp_weaklistoffset */
601   0,                              /* tp_iter */
602   0,                              /* tp_iternext */
603   cmdpy_object_methods,           /* tp_methods */
604   0,                              /* tp_members */
605   0,                              /* tp_getset */
606   0,                              /* tp_base */
607   0,                              /* tp_dict */
608   0,                              /* tp_descr_get */
609   0,                              /* tp_descr_set */
610   0,                              /* tp_dictoffset */
611   cmdpy_init,                     /* tp_init */
612   0,                              /* tp_alloc */
613   PyType_GenericNew               /* tp_new */
614 };
615
616 \f
617
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.  */
624
625 PyObject *
626 gdbpy_string_to_argv (PyObject *self, PyObject *args)
627 {
628   PyObject *py_argv;
629   char *input;
630
631   if (!PyArg_ParseTuple (args, "s", &input))
632     return NULL;
633
634   py_argv = PyList_New (0);
635
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.  */
639
640   if (*input != '\0')
641     {
642       char **c_argv = gdb_buildargv (input);
643       int i;
644
645       for (i = 0; c_argv[i] != NULL; ++i)
646         {
647           PyObject *argp = PyString_FromString (c_argv[i]);
648
649           if (argp == NULL
650               || PyList_Append (py_argv, argp) < 0)
651             {
652               if (argp != NULL)
653                 {
654                   Py_DECREF (argp);
655                 }
656               Py_DECREF (py_argv);
657               freeargv (c_argv);
658               return NULL;
659             }
660         }
661
662       freeargv (c_argv);
663     }
664
665   return py_argv;
666 }
This page took 0.06451 seconds and 4 git commands to generate.