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