xref: /dragonfly/contrib/gdb-7/gdb/python/py-cmd.c (revision ef5ccd6c)
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