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