* lib/gdb.exp (get_hexadecimal_valueof): New procedure.
[deliverable/binutils-gdb.git] / gdb / python / python-cmd.c
CommitLineData
d8906c6f
TJB
1/* gdb commands implemented in Python
2
3 Copyright (C) 2008, 2009 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 "value.h"
23#include "exceptions.h"
24#include "python-internal.h"
25#include "charset.h"
26#include "gdbcmd.h"
27#include "cli/cli-decode.h"
28#include "completer.h"
29
30/* Struct representing built-in completion types. */
31struct cmdpy_completer
32{
33 /* Python symbol name. */
34 char *name;
35 /* Completion function. */
36 char **(*completer) (struct cmd_list_element *, char *, char *);
37};
38
39static struct cmdpy_completer completers[] =
40{
41 { "COMPLETE_NONE", noop_completer },
42 { "COMPLETE_FILENAME", filename_completer },
43 { "COMPLETE_LOCATION", location_completer },
44 { "COMPLETE_COMMAND", command_completer },
45 { "COMPLETE_SYMBOL", make_symbol_completion_list_fn },
46};
47
48#define N_COMPLETERS (sizeof (completers) / sizeof (completers[0]))
49
50/* A gdb command. For the time being only ordinary commands (not
51 set/show commands) are allowed. */
52struct cmdpy_object
53{
54 PyObject_HEAD
55
56 /* The corresponding gdb command object, or NULL if the command is
57 no longer installed. */
58 struct cmd_list_element *command;
59
60 /* A prefix command requires storage for a list of its sub-commands.
61 A pointer to this is passed to add_prefix_command, and to add_cmd
62 for sub-commands of that prefix. If this Command is not a prefix
63 command, then this field is unused. */
64 struct cmd_list_element *sub_list;
65};
66
67typedef struct cmdpy_object cmdpy_object;
68
69static PyTypeObject cmdpy_object_type;
70
71
72/* Constants used by this module. */
73static PyObject *invoke_cst;
74static PyObject *complete_cst;
75
76\f
77
78/* Python function which wraps dont_repeat. */
79static PyObject *
80cmdpy_dont_repeat (PyObject *self, PyObject *args)
81{
82 dont_repeat ();
83 Py_RETURN_NONE;
84}
85
86\f
87
88/* Called if the gdb cmd_list_element is destroyed. */
89static void
90cmdpy_destroyer (struct cmd_list_element *self, void *context)
91{
92 cmdpy_object *cmd;
93 PyGILState_STATE state;
94
95 state = PyGILState_Ensure ();
96
97 /* Release our hold on the command object. */
98 cmd = (cmdpy_object *) context;
99 cmd->command = NULL;
100 Py_DECREF (cmd);
101
102 /* We allocated the name, doc string, and perhaps the prefix
103 name. */
104 xfree (self->name);
105 xfree (self->doc);
106 xfree (self->prefixname);
107
108 PyGILState_Release (state);
109}
110
111/* Called by gdb to invoke the command. */
112static void
113cmdpy_function (struct cmd_list_element *command, char *args, int from_tty)
114{
115 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
116 PyObject *argobj, *ttyobj, *result;
117 struct cleanup *cleanup;
118 PyGILState_STATE state;
119
120 state = PyGILState_Ensure ();
121 cleanup = make_cleanup_py_restore_gil (&state);
122
123 if (! obj)
124 error (_("Invalid invocation of Python command object."));
125 if (! PyObject_HasAttr ((PyObject *) obj, invoke_cst))
126 {
127 if (obj->command->prefixname)
128 {
129 /* A prefix command does not need an invoke method. */
130 do_cleanups (cleanup);
131 return;
132 }
133 error (_("Python command object missing 'invoke' method."));
134 }
135
136 if (! args)
137 args = "";
138 argobj = PyUnicode_Decode (args, strlen (args), host_charset (), NULL);
139 if (! argobj)
140 error (_("Could not convert arguments to Python string."));
141
142 ttyobj = from_tty ? Py_True : Py_False;
143 Py_INCREF (ttyobj);
144 result = PyObject_CallMethodObjArgs ((PyObject *) obj, invoke_cst, argobj,
145 ttyobj, NULL);
146 Py_DECREF (argobj);
147 Py_DECREF (ttyobj);
148 if (! result)
149 {
150 PyObject *ptype, *pvalue, *ptraceback;
151 char *s, *str;
152
153 PyErr_Fetch (&ptype, &pvalue, &ptraceback);
154
155 if (pvalue && PyString_Check (pvalue))
156 {
157 /* Make a temporary copy of the string data. */
158 char *s = PyString_AsString (pvalue);
159 char *copy = alloca (strlen (s) + 1);
160 strcpy (copy, s);
161
162 PyErr_Restore (ptype, pvalue, ptraceback);
163 gdbpy_print_stack ();
164 error (_("Error occurred in Python command: %s"), copy);
165 }
166 else
167 {
168 PyErr_Restore (ptype, pvalue, ptraceback);
169 gdbpy_print_stack ();
170 error (_("Error occurred in Python command."));
171 }
172 }
173 Py_DECREF (result);
174 do_cleanups (cleanup);
175}
176
177/* Called by gdb for command completion. */
178static char **
179cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
180{
181 cmdpy_object *obj = (cmdpy_object *) get_cmd_context (command);
182 PyObject *textobj, *wordobj, *resultobj = NULL;
183 char **result = NULL;
184 struct cleanup *cleanup;
185 PyGILState_STATE state;
186
187 state = PyGILState_Ensure ();
188 cleanup = make_cleanup_py_restore_gil (&state);
189
190 if (! obj)
191 error (_("Invalid invocation of Python command object."));
192 if (! PyObject_HasAttr ((PyObject *) obj, complete_cst))
193 {
194 /* If there is no complete method, don't error -- instead, just
195 say that there are no completions. */
196 goto done;
197 }
198
199 textobj = PyUnicode_Decode (text, strlen (text), host_charset (), NULL);
200 if (! textobj)
201 error (_("Could not convert argument to Python string."));
202 wordobj = PyUnicode_Decode (word, strlen (word), host_charset (), NULL);
203 if (! wordobj)
204 error (_("Could not convert argument to Python string."));
205
206 resultobj = PyObject_CallMethodObjArgs ((PyObject *) obj, complete_cst,
207 textobj, wordobj, NULL);
208 Py_DECREF (textobj);
209 Py_DECREF (wordobj);
210 if (! resultobj)
211 {
212 /* Just swallow errors here. */
213 PyErr_Clear ();
214 goto done;
215 }
216 make_cleanup_py_decref (resultobj);
217
218 result = NULL;
219 if (PySequence_Check (resultobj))
220 {
221 Py_ssize_t i, len = PySequence_Size (resultobj);
222 Py_ssize_t out;
223 if (len < 0)
224 goto done;
225
226 result = (char **) xmalloc ((len + 1) * sizeof (char *));
227 for (i = out = 0; i < len; ++i)
228 {
229 int l;
230 PyObject *elt = PySequence_GetItem (resultobj, i);
231 if (elt == NULL || ! gdbpy_is_string (elt))
232 {
233 /* Skip problem elements. */
234 PyErr_Clear ();
235 continue;
236 }
237 result[out] = python_string_to_host_string (elt);
238 ++out;
239 }
240 result[out] = NULL;
241 }
242 else if (PyInt_Check (resultobj))
243 {
244 /* User code may also return one of the completion constants,
245 thus requesting that sort of completion. */
246 long value = PyInt_AsLong (resultobj);
247 if (value >= 0 && value < (long) N_COMPLETERS)
248 result = completers[value].completer (command, text, word);
249 }
250
251 done:
252
253 do_cleanups (cleanup);
254
255 return result;
256}
257
258/* Helper for cmdpy_init which locates the command list to use and
259 pulls out the command name.
260
261 TEXT is the command name list. The final word in the list is the
262 name of the new command. All earlier words must be existing prefix
263 commands.
264
265 *BASE_LIST is set to the final prefix command's list of
266 *sub-commands.
267
268 This function returns the xmalloc()d name of the new command. On
269 error sets the Python error and returns NULL. */
270static char *
271parse_command_name (char *text, struct cmd_list_element ***base_list)
272{
273 struct cmd_list_element *elt;
274 int len = strlen (text);
275 int i, lastchar;
276 char *prefix_text;
277 char *result;
278
279 /* Skip trailing whitespace. */
280 for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
281 ;
282 if (i < 0)
283 {
284 PyErr_SetString (PyExc_RuntimeError, _("no command name found"));
285 return NULL;
286 }
287 lastchar = i;
288
289 /* Find first character of the final word. */
290 for (; i > 0 && (isalnum (text[i - 1])
291 || text[i - 1] == '-'
292 || text[i - 1] == '_');
293 --i)
294 ;
295 result = xmalloc (lastchar - i + 2);
296 memcpy (result, &text[i], lastchar - i + 1);
297 result[lastchar - i + 1] = '\0';
298
299 /* Skip whitespace again. */
300 for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
301 ;
302 if (i < 0)
303 {
304 *base_list = &cmdlist;
305 return result;
306 }
307
308 prefix_text = xmalloc (i + 2);
309 memcpy (prefix_text, text, i + 1);
310 prefix_text[i + 1] = '\0';
311
312 text = prefix_text;
313 elt = lookup_cmd_1 (&text, cmdlist, NULL, 1);
314 if (!elt || elt == (struct cmd_list_element *) -1)
315 {
316 PyErr_Format (PyExc_RuntimeError, _("could not find command prefix %s"),
317 prefix_text);
318 xfree (prefix_text);
319 xfree (result);
320 return NULL;
321 }
322
323 if (elt->prefixlist)
324 {
325 xfree (prefix_text);
326 *base_list = elt->prefixlist;
327 return result;
328 }
329
330 PyErr_Format (PyExc_RuntimeError, _("'%s' is not a prefix command"),
331 prefix_text);
332 xfree (prefix_text);
333 xfree (result);
334 return NULL;
335}
336
337/* Object initializer; sets up gdb-side structures for command.
338
339 Use: __init__(NAME, CMDCLASS, [COMPLETERCLASS, [PREFIX]]).
340
341 NAME is the name of the command. It may consist of multiple words,
342 in which case the final word is the name of the new command, and
343 earlier words must be prefix commands.
344
345 CMDCLASS is the kind of command. It should be one of the COMMAND_*
346 constants defined in the gdb module.
347
348 COMPLETERCLASS is the kind of completer. If not given, the
349 "complete" method will be used. Otherwise, it should be one of the
350 COMPLETE_* constants defined in the gdb module.
351
352 If PREFIX is True, then this command is a prefix command.
353
354 The documentation for the command is taken from the doc string for
355 the python class.
356
357*/
358static int
359cmdpy_init (PyObject *self, PyObject *args, PyObject *kwds)
360{
361 cmdpy_object *obj = (cmdpy_object *) self;
362 char *name;
363 int cmdtype;
364 int completetype = -1;
365 char *docstring = NULL;
366 volatile struct gdb_exception except;
367 struct cmd_list_element **cmd_list;
368 char *cmd_name, *pfx_name;
369 PyObject *is_prefix = NULL;
370 int cmp;
371
372 if (obj->command)
373 {
374 /* Note: this is apparently not documented in Python. We return
375 0 for success, -1 for failure. */
376 PyErr_Format (PyExc_RuntimeError,
377 _("command object already initialized"));
378 return -1;
379 }
380
381 if (! PyArg_ParseTuple (args, "si|iO", &name, &cmdtype,
382 &completetype, &is_prefix))
383 return -1;
384
385 if (cmdtype != no_class && cmdtype != class_run
386 && cmdtype != class_vars && cmdtype != class_stack
387 && cmdtype != class_files && cmdtype != class_support
388 && cmdtype != class_info && cmdtype != class_breakpoint
389 && cmdtype != class_trace && cmdtype != class_obscure
390 && cmdtype != class_maintenance)
391 {
392 PyErr_Format (PyExc_RuntimeError, _("invalid command class argument"));
393 return -1;
394 }
395
396 if (completetype < -1 || completetype >= (int) N_COMPLETERS)
397 {
398 PyErr_Format (PyExc_RuntimeError, _("invalid completion type argument"));
399 return -1;
400 }
401
402 cmd_name = parse_command_name (name, &cmd_list);
403 if (! cmd_name)
404 return -1;
405
406 pfx_name = NULL;
407 if (is_prefix != NULL)
408 {
409 cmp = PyObject_IsTrue (is_prefix);
410 if (cmp == 1)
411 {
412 int i, out;
413
414 /* Make a normalized form of the command name. */
415 pfx_name = xmalloc (strlen (name) + 2);
416
417 i = 0;
418 out = 0;
419 while (name[i])
420 {
421 /* Skip whitespace. */
422 while (name[i] == ' ' || name[i] == '\t')
423 ++i;
424 /* Copy non-whitespace characters. */
425 while (name[i] && name[i] != ' ' && name[i] != '\t')
426 pfx_name[out++] = name[i++];
427 /* Add a single space after each word -- including the final
428 word. */
429 pfx_name[out++] = ' ';
430 }
431 pfx_name[out] = '\0';
432 }
433 else if (cmp < 0)
434 return -1;
435 }
436 if (PyObject_HasAttr (self, gdbpy_doc_cst))
437 {
438 PyObject *ds_obj = PyObject_GetAttr (self, gdbpy_doc_cst);
439 if (ds_obj && gdbpy_is_string (ds_obj))
440 docstring = python_string_to_host_string (ds_obj);
441 }
442 if (! docstring)
443 docstring = xstrdup (_("This command is not documented."));
444
445 Py_INCREF (self);
446
447 TRY_CATCH (except, RETURN_MASK_ALL)
448 {
449 struct cmd_list_element *cmd;
450
451 if (pfx_name)
452 {
453 int allow_unknown;
454
455 /* If we have our own "invoke" method, then allow unknown
456 sub-commands. */
457 allow_unknown = PyObject_HasAttr (self, invoke_cst);
458 cmd = add_prefix_cmd (cmd_name, (enum command_class) cmdtype,
459 NULL, docstring, &obj->sub_list,
460 pfx_name, allow_unknown, cmd_list);
461 }
462 else
463 cmd = add_cmd (cmd_name, (enum command_class) cmdtype, NULL,
464 docstring, cmd_list);
465
466 /* There appears to be no API to set this. */
467 cmd->func = cmdpy_function;
468 cmd->destroyer = cmdpy_destroyer;
469
470 obj->command = cmd;
471 set_cmd_context (cmd, self);
472 set_cmd_completer (cmd, ((completetype == -1) ? cmdpy_completer
473 : completers[completetype].completer));
474 }
475 if (except.reason < 0)
476 {
477 xfree (cmd_name);
478 xfree (docstring);
479 xfree (pfx_name);
480 Py_DECREF (self);
481 PyErr_Format (except.reason == RETURN_QUIT
482 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
483 "%s", except.message);
484 return -1;
485 }
486 return 0;
487}
488
489\f
490
491/* Initialize the 'commands' code. */
492void
493gdbpy_initialize_commands (void)
494{
495 int i;
496
497 if (PyType_Ready (&cmdpy_object_type) < 0)
498 return;
499
500 /* Note: alias and user are special; pseudo appears to be unused,
501 and there is no reason to expose tui or xdb, I think. */
502 if (PyModule_AddIntConstant (gdb_module, "COMMAND_NONE", no_class) < 0
503 || PyModule_AddIntConstant (gdb_module, "COMMAND_RUNNING", class_run) < 0
504 || PyModule_AddIntConstant (gdb_module, "COMMAND_DATA", class_vars) < 0
505 || PyModule_AddIntConstant (gdb_module, "COMMAND_STACK", class_stack) < 0
506 || PyModule_AddIntConstant (gdb_module, "COMMAND_FILES", class_files) < 0
507 || PyModule_AddIntConstant (gdb_module, "COMMAND_SUPPORT",
508 class_support) < 0
509 || PyModule_AddIntConstant (gdb_module, "COMMAND_STATUS", class_info) < 0
510 || PyModule_AddIntConstant (gdb_module, "COMMAND_BREAKPOINTS",
511 class_breakpoint) < 0
512 || PyModule_AddIntConstant (gdb_module, "COMMAND_TRACEPOINTS",
513 class_trace) < 0
514 || PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
515 class_obscure) < 0
516 || PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
517 class_maintenance) < 0)
518 return;
519
520 for (i = 0; i < N_COMPLETERS; ++i)
521 {
522 if (PyModule_AddIntConstant (gdb_module, completers[i].name, i) < 0)
523 return;
524 }
525
526 Py_INCREF (&cmdpy_object_type);
527 PyModule_AddObject (gdb_module, "Command",
528 (PyObject *) &cmdpy_object_type);
529
530 invoke_cst = PyString_FromString ("invoke");
531 complete_cst = PyString_FromString ("complete");
532}
533
534\f
535
536static PyMethodDef cmdpy_object_methods[] =
537{
538 { "dont_repeat", cmdpy_dont_repeat, METH_NOARGS,
539 "Prevent command repetition when user enters empty line." },
540
541 { 0 }
542};
543
544static PyTypeObject cmdpy_object_type =
545{
546 PyObject_HEAD_INIT (NULL)
547 0, /*ob_size*/
548 "gdb.Command", /*tp_name*/
549 sizeof (cmdpy_object), /*tp_basicsize*/
550 0, /*tp_itemsize*/
551 0, /*tp_dealloc*/
552 0, /*tp_print*/
553 0, /*tp_getattr*/
554 0, /*tp_setattr*/
555 0, /*tp_compare*/
556 0, /*tp_repr*/
557 0, /*tp_as_number*/
558 0, /*tp_as_sequence*/
559 0, /*tp_as_mapping*/
560 0, /*tp_hash */
561 0, /*tp_call*/
562 0, /*tp_str*/
563 0, /*tp_getattro*/
564 0, /*tp_setattro*/
565 0, /*tp_as_buffer*/
566 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
567 "GDB command object", /* tp_doc */
568 0, /* tp_traverse */
569 0, /* tp_clear */
570 0, /* tp_richcompare */
571 0, /* tp_weaklistoffset */
572 0, /* tp_iter */
573 0, /* tp_iternext */
574 cmdpy_object_methods, /* tp_methods */
575 0, /* tp_members */
576 0, /* tp_getset */
577 0, /* tp_base */
578 0, /* tp_dict */
579 0, /* tp_descr_get */
580 0, /* tp_descr_set */
581 0, /* tp_dictoffset */
582 cmdpy_init, /* tp_init */
583 0, /* tp_alloc */
584 PyType_GenericNew /* tp_new */
585};
This page took 0.044955 seconds and 4 git commands to generate.