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