Use gdbpy_enter in py-finishbreakpoint.c
[deliverable/binutils-gdb.git] / gdb / python / py-param.c
CommitLineData
d7b32ed3
PM
1/* GDB parameters implemented in Python
2
61baf725 3 Copyright (C) 2008-2017 Free Software Foundation, Inc.
d7b32ed3
PM
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20
21#include "defs.h"
22#include "value.h"
d7b32ed3
PM
23#include "python-internal.h"
24#include "charset.h"
25#include "gdbcmd.h"
26#include "cli/cli-decode.h"
27#include "completer.h"
ecec24e6
PM
28#include "language.h"
29#include "arch-utils.h"
1bb44c9f 30#include "py-ref.h"
d7b32ed3
PM
31
32/* Parameter constants and their values. */
33struct parm_constant
34{
35 char *name;
36 int value;
37};
38
39struct parm_constant parm_constants[] =
40{
3c0ee1a4 41 { "PARAM_BOOLEAN", var_boolean }, /* ARI: var_boolean */
d7b32ed3
PM
42 { "PARAM_AUTO_BOOLEAN", var_auto_boolean },
43 { "PARAM_UINTEGER", var_uinteger },
44 { "PARAM_INTEGER", var_integer },
45 { "PARAM_STRING", var_string },
46 { "PARAM_STRING_NOESCAPE", var_string_noescape },
47 { "PARAM_OPTIONAL_FILENAME", var_optional_filename },
48 { "PARAM_FILENAME", var_filename },
49 { "PARAM_ZINTEGER", var_zinteger },
50 { "PARAM_ENUM", var_enum },
51 { NULL, 0 }
52};
53
54/* A union that can hold anything described by enum var_types. */
55union parmpy_variable
56{
57 /* Hold an integer value, for boolean and integer types. */
58 int intval;
59
60 /* Hold an auto_boolean. */
61 enum auto_boolean autoboolval;
62
63 /* Hold an unsigned integer value, for uinteger. */
64 unsigned int uintval;
65
66 /* Hold a string, for the various string types. */
67 char *stringval;
68
69 /* Hold a string, for enums. */
70 const char *cstringval;
71};
72
73/* A GDB parameter. */
74struct parmpy_object
75{
76 PyObject_HEAD
77
78 /* The type of the parameter. */
79 enum var_types type;
80
81 /* The value of the parameter. */
82 union parmpy_variable value;
83
84 /* For an enum command, the possible values. The vector is
85 allocated with xmalloc, as is each element. It is
86 NULL-terminated. */
87 const char **enumeration;
88};
89
90typedef struct parmpy_object parmpy_object;
91
e36122e9 92extern PyTypeObject parmpy_object_type
62eec1a5 93 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("parmpy_object");
d7b32ed3
PM
94
95/* Some handy string constants. */
96static PyObject *set_doc_cst;
97static PyObject *show_doc_cst;
98
99\f
100
101/* Get an attribute. */
102static PyObject *
103get_attr (PyObject *obj, PyObject *attr_name)
104{
105 if (PyString_Check (attr_name)
9a27f2c6
PK
106#ifdef IS_PY3K
107 && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
108#else
d7b32ed3 109 && ! strcmp (PyString_AsString (attr_name), "value"))
9a27f2c6 110#endif
d7b32ed3
PM
111 {
112 parmpy_object *self = (parmpy_object *) obj;
d59b6f6c 113
d7b32ed3
PM
114 return gdbpy_parameter_value (self->type, &self->value);
115 }
116
117 return PyObject_GenericGetAttr (obj, attr_name);
118}
119
8dc78533
JK
120/* Set a parameter value from a Python value. Return 0 on success. Returns
121 -1 on error, with a python exception set. */
d7b32ed3
PM
122static int
123set_parameter_value (parmpy_object *self, PyObject *value)
124{
125 int cmp;
126
127 switch (self->type)
128 {
129 case var_string:
130 case var_string_noescape:
131 case var_optional_filename:
132 case var_filename:
133 if (! gdbpy_is_string (value)
134 && (self->type == var_filename
135 || value != Py_None))
136 {
256458bc 137 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
138 _("String required for filename."));
139
140 return -1;
141 }
d7b32ed3
PM
142 if (value == Py_None)
143 {
8dc78533 144 xfree (self->value.stringval);
d7b32ed3
PM
145 if (self->type == var_optional_filename)
146 self->value.stringval = xstrdup ("");
147 else
148 self->value.stringval = NULL;
149 }
150 else
8dc78533 151 {
9b972014
TT
152 gdb::unique_xmalloc_ptr<char>
153 string (python_string_to_host_string (value));
8dc78533
JK
154 if (string == NULL)
155 return -1;
156
157 xfree (self->value.stringval);
9b972014 158 self->value.stringval = string.release ();
8dc78533 159 }
d7b32ed3
PM
160 break;
161
162 case var_enum:
163 {
164 int i;
d7b32ed3
PM
165
166 if (! gdbpy_is_string (value))
167 {
256458bc 168 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
169 _("ENUM arguments must be a string."));
170 return -1;
171 }
172
9b972014
TT
173 gdb::unique_xmalloc_ptr<char>
174 str (python_string_to_host_string (value));
8dc78533
JK
175 if (str == NULL)
176 return -1;
d7b32ed3 177 for (i = 0; self->enumeration[i]; ++i)
9b972014 178 if (! strcmp (self->enumeration[i], str.get ()))
d7b32ed3 179 break;
d7b32ed3
PM
180 if (! self->enumeration[i])
181 {
182 PyErr_SetString (PyExc_RuntimeError,
183 _("The value must be member of an enumeration."));
184 return -1;
185 }
186 self->value.cstringval = self->enumeration[i];
187 break;
188 }
189
190 case var_boolean:
191 if (! PyBool_Check (value))
192 {
256458bc 193 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
194 _("A boolean argument is required."));
195 return -1;
196 }
197 cmp = PyObject_IsTrue (value);
256458bc 198 if (cmp < 0)
d7b32ed3
PM
199 return -1;
200 self->value.intval = cmp;
201 break;
202
203 case var_auto_boolean:
204 if (! PyBool_Check (value) && value != Py_None)
205 {
206 PyErr_SetString (PyExc_RuntimeError,
207 _("A boolean or None is required"));
208 return -1;
209 }
210
211 if (value == Py_None)
212 self->value.autoboolval = AUTO_BOOLEAN_AUTO;
213 else
214 {
215 cmp = PyObject_IsTrue (value);
216 if (cmp < 0 )
256458bc 217 return -1;
d7b32ed3
PM
218 if (cmp == 1)
219 self->value.autoboolval = AUTO_BOOLEAN_TRUE;
256458bc 220 else
d7b32ed3 221 self->value.autoboolval = AUTO_BOOLEAN_FALSE;
d7b32ed3 222 }
92e96192 223 break;
d7b32ed3
PM
224
225 case var_integer:
226 case var_zinteger:
227 case var_uinteger:
228 {
229 long l;
230 int ok;
231
232 if (! PyInt_Check (value))
233 {
256458bc 234 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
235 _("The value must be integer."));
236 return -1;
237 }
238
74aedc46
TT
239 if (! gdb_py_int_as_long (value, &l))
240 return -1;
241
d7b32ed3
PM
242 if (self->type == var_uinteger)
243 {
244 ok = (l >= 0 && l <= UINT_MAX);
245 if (l == 0)
246 l = UINT_MAX;
247 }
248 else if (self->type == var_integer)
249 {
250 ok = (l >= INT_MIN && l <= INT_MAX);
251 if (l == 0)
252 l = INT_MAX;
253 }
254 else
255 ok = (l >= INT_MIN && l <= INT_MAX);
256
257 if (! ok)
258 {
256458bc 259 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
260 _("Range exceeded."));
261 return -1;
262 }
263
264 self->value.intval = (int) l;
265 break;
266 }
267
268 default:
256458bc 269 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
270 _("Unhandled type in parameter value."));
271 return -1;
272 }
273
274 return 0;
275}
276
8dc78533 277/* Set an attribute. Returns -1 on error, with a python exception set. */
d7b32ed3
PM
278static int
279set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
280{
281 if (PyString_Check (attr_name)
9a27f2c6
PK
282#ifdef IS_PY3K
283 && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
284#else
d7b32ed3 285 && ! strcmp (PyString_AsString (attr_name), "value"))
9a27f2c6 286#endif
d7b32ed3
PM
287 {
288 if (!val)
289 {
290 PyErr_SetString (PyExc_RuntimeError,
291 _("Cannot delete a parameter's value."));
292 return -1;
293 }
294 return set_parameter_value ((parmpy_object *) obj, val);
295 }
296
297 return PyObject_GenericSetAttr (obj, attr_name, val);
298}
299
ecec24e6
PM
300/* A helper function which returns a documentation string for an
301 object. */
302
9b972014 303static gdb::unique_xmalloc_ptr<char>
ecec24e6
PM
304get_doc_string (PyObject *object, PyObject *attr)
305{
9b972014 306 gdb::unique_xmalloc_ptr<char> result;
ecec24e6
PM
307
308 if (PyObject_HasAttr (object, attr))
309 {
310 PyObject *ds_obj = PyObject_GetAttr (object, attr);
311
312 if (ds_obj && gdbpy_is_string (ds_obj))
313 {
314 result = python_string_to_host_string (ds_obj);
315 if (result == NULL)
316 gdbpy_print_stack ();
317 }
318 Py_XDECREF (ds_obj);
319 }
320 if (! result)
9b972014 321 result.reset (xstrdup (_("This command is not documented.")));
ecec24e6
PM
322 return result;
323}
324
325/* Helper function which will execute a METHOD in OBJ passing the
326 argument ARG. ARG can be NULL. METHOD should return a Python
327 string. If this function returns NULL, there has been an error and
328 the appropriate exception set. */
9b972014 329static gdb::unique_xmalloc_ptr<char>
ecec24e6
PM
330call_doc_function (PyObject *obj, PyObject *method, PyObject *arg)
331{
9b972014 332 gdb::unique_xmalloc_ptr<char> data;
1bb44c9f 333 gdbpy_ref result (PyObject_CallMethodObjArgs (obj, method, arg, NULL));
ecec24e6 334
1bb44c9f 335 if (result == NULL)
ecec24e6
PM
336 return NULL;
337
1bb44c9f 338 if (gdbpy_is_string (result.get ()))
ecec24e6 339 {
1bb44c9f 340 data = python_string_to_host_string (result.get ());
ecec24e6
PM
341 if (! data)
342 return NULL;
343 }
344 else
345 {
346 PyErr_SetString (PyExc_RuntimeError,
347 _("Parameter must return a string value."));
348 return NULL;
349 }
350
351 return data;
352}
353
354/* A callback function that is registered against the respective
355 add_setshow_* set_doc prototype. This function will either call
356 the Python function "get_set_string" or extract the Python
357 attribute "set_doc" and return the contents as a string. If
358 neither exist, insert a string indicating the Parameter is not
359 documented. */
360static void
361get_set_value (char *args, int from_tty,
362 struct cmd_list_element *c)
363{
364 PyObject *obj = (PyObject *) get_cmd_context (c);
9b972014 365 gdb::unique_xmalloc_ptr<char> set_doc_string;
ecec24e6
PM
366 struct cleanup *cleanup = ensure_python_env (get_current_arch (),
367 current_language);
368 PyObject *set_doc_func = PyString_FromString ("get_set_string");
369
370 if (! set_doc_func)
371 goto error;
372
ecec24e6
PM
373 if (PyObject_HasAttr (obj, set_doc_func))
374 {
375 set_doc_string = call_doc_function (obj, set_doc_func, NULL);
376 if (! set_doc_string)
377 goto error;
378 }
379 else
380 {
381 /* We have to preserve the existing < GDB 7.3 API. If a
382 callback function does not exist, then attempt to read the
383 set_doc attribute. */
384 set_doc_string = get_doc_string (obj, set_doc_cst);
385 }
386
9b972014 387 fprintf_filtered (gdb_stdout, "%s\n", set_doc_string.get ());
ecec24e6 388
3d4a3c3e 389 Py_XDECREF (set_doc_func);
ecec24e6
PM
390 do_cleanups (cleanup);
391 return;
392
393 error:
3d4a3c3e 394 Py_XDECREF (set_doc_func);
ecec24e6
PM
395 gdbpy_print_stack ();
396 do_cleanups (cleanup);
397 return;
398}
399
400/* A callback function that is registered against the respective
401 add_setshow_* show_doc prototype. This function will either call
402 the Python function "get_show_string" or extract the Python
403 attribute "show_doc" and return the contents as a string. If
404 neither exist, insert a string indicating the Parameter is not
405 documented. */
406static void
407get_show_value (struct ui_file *file, int from_tty,
408 struct cmd_list_element *c,
409 const char *value)
410{
411 PyObject *obj = (PyObject *) get_cmd_context (c);
9b972014 412 gdb::unique_xmalloc_ptr<char> show_doc_string;
ecec24e6
PM
413 struct cleanup *cleanup = ensure_python_env (get_current_arch (),
414 current_language);
415 PyObject *show_doc_func = PyString_FromString ("get_show_string");
416
417 if (! show_doc_func)
418 goto error;
419
ecec24e6
PM
420 if (PyObject_HasAttr (obj, show_doc_func))
421 {
422 PyObject *val_obj = PyString_FromString (value);
423
424 if (! val_obj)
425 goto error;
426
ecec24e6 427 show_doc_string = call_doc_function (obj, show_doc_func, val_obj);
3d4a3c3e 428 Py_DECREF (val_obj);
ecec24e6
PM
429 if (! show_doc_string)
430 goto error;
431
9b972014 432 fprintf_filtered (file, "%s\n", show_doc_string.get ());
ecec24e6
PM
433 }
434 else
435 {
436 /* We have to preserve the existing < GDB 7.3 API. If a
437 callback function does not exist, then attempt to read the
438 show_doc attribute. */
439 show_doc_string = get_doc_string (obj, show_doc_cst);
9b972014 440 fprintf_filtered (file, "%s %s\n", show_doc_string.get (), value);
ecec24e6
PM
441 }
442
3d4a3c3e 443 Py_XDECREF (show_doc_func);
ecec24e6
PM
444 do_cleanups (cleanup);
445 return;
446
447 error:
3d4a3c3e 448 Py_XDECREF (show_doc_func);
ecec24e6
PM
449 gdbpy_print_stack ();
450 do_cleanups (cleanup);
451 return;
452}
d7b32ed3
PM
453\f
454
455/* A helper function that dispatches to the appropriate add_setshow
456 function. */
457static void
458add_setshow_generic (int parmclass, enum command_class cmdclass,
459 char *cmd_name, parmpy_object *self,
460 char *set_doc, char *show_doc, char *help_doc,
461 struct cmd_list_element **set_list,
462 struct cmd_list_element **show_list)
463{
ecec24e6 464 struct cmd_list_element *param = NULL;
6f937416 465 const char *tmp_name = NULL;
ecec24e6 466
d7b32ed3
PM
467 switch (parmclass)
468 {
469 case var_boolean:
ecec24e6
PM
470
471 add_setshow_boolean_cmd (cmd_name, cmdclass,
472 &self->value.intval, set_doc, show_doc,
473 help_doc, get_set_value, get_show_value,
474 set_list, show_list);
475
d7b32ed3
PM
476 break;
477
478 case var_auto_boolean:
479 add_setshow_auto_boolean_cmd (cmd_name, cmdclass,
480 &self->value.autoboolval,
481 set_doc, show_doc, help_doc,
ecec24e6
PM
482 get_set_value, get_show_value,
483 set_list, show_list);
d7b32ed3
PM
484 break;
485
486 case var_uinteger:
ecec24e6
PM
487 add_setshow_uinteger_cmd (cmd_name, cmdclass,
488 &self->value.uintval, set_doc, show_doc,
489 help_doc, get_set_value, get_show_value,
490 set_list, show_list);
d7b32ed3
PM
491 break;
492
493 case var_integer:
ecec24e6
PM
494 add_setshow_integer_cmd (cmd_name, cmdclass,
495 &self->value.intval, set_doc, show_doc,
496 help_doc, get_set_value, get_show_value,
497 set_list, show_list); break;
d7b32ed3
PM
498
499 case var_string:
ecec24e6
PM
500 add_setshow_string_cmd (cmd_name, cmdclass,
501 &self->value.stringval, set_doc, show_doc,
502 help_doc, get_set_value, get_show_value,
503 set_list, show_list); break;
d7b32ed3
PM
504
505 case var_string_noescape:
506 add_setshow_string_noescape_cmd (cmd_name, cmdclass,
507 &self->value.stringval,
508 set_doc, show_doc, help_doc,
ecec24e6
PM
509 get_set_value, get_show_value,
510 set_list, show_list);
511
d7b32ed3
PM
512 break;
513
514 case var_optional_filename:
515 add_setshow_optional_filename_cmd (cmd_name, cmdclass,
ecec24e6
PM
516 &self->value.stringval, set_doc,
517 show_doc, help_doc, get_set_value,
518 get_show_value, set_list,
519 show_list);
d7b32ed3
PM
520 break;
521
522 case var_filename:
ecec24e6
PM
523 add_setshow_filename_cmd (cmd_name, cmdclass,
524 &self->value.stringval, set_doc, show_doc,
525 help_doc, get_set_value, get_show_value,
526 set_list, show_list); break;
d7b32ed3
PM
527
528 case var_zinteger:
ecec24e6
PM
529 add_setshow_zinteger_cmd (cmd_name, cmdclass,
530 &self->value.intval, set_doc, show_doc,
531 help_doc, get_set_value, get_show_value,
532 set_list, show_list);
d7b32ed3
PM
533 break;
534
535 case var_enum:
536 add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration,
ecec24e6
PM
537 &self->value.cstringval, set_doc, show_doc,
538 help_doc, get_set_value, get_show_value,
539 set_list, show_list);
d7b32ed3
PM
540 /* Initialize the value, just in case. */
541 self->value.cstringval = self->enumeration[0];
542 break;
543 }
ecec24e6
PM
544
545 /* Lookup created parameter, and register Python object against the
546 parameter context. Perform this task against both lists. */
547 tmp_name = cmd_name;
548 param = lookup_cmd (&tmp_name, *show_list, "", 0, 1);
549 if (param)
550 set_cmd_context (param, self);
551
552 tmp_name = cmd_name;
553 param = lookup_cmd (&tmp_name, *set_list, "", 0, 1);
554 if (param)
555 set_cmd_context (param, self);
d7b32ed3
PM
556}
557
8dc78533
JK
558/* A helper which computes enum values. Returns 1 on success. Returns 0 on
559 error, with a python exception set. */
d7b32ed3
PM
560static int
561compute_enum_values (parmpy_object *self, PyObject *enum_values)
562{
563 Py_ssize_t size, i;
8dc78533 564 struct cleanup *back_to;
d7b32ed3
PM
565
566 if (! enum_values)
567 {
568 PyErr_SetString (PyExc_RuntimeError,
569 _("An enumeration is required for PARAM_ENUM."));
570 return 0;
571 }
572
573 if (! PySequence_Check (enum_values))
574 {
256458bc 575 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
576 _("The enumeration is not a sequence."));
577 return 0;
578 }
579
580 size = PySequence_Size (enum_values);
581 if (size < 0)
582 return 0;
583 if (size == 0)
584 {
256458bc 585 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
586 _("The enumeration is empty."));
587 return 0;
588 }
589
8d749320 590 self->enumeration = XCNEWVEC (const char *, size + 1);
8dc78533 591 back_to = make_cleanup (free_current_contents, &self->enumeration);
d7b32ed3
PM
592
593 for (i = 0; i < size; ++i)
594 {
595 PyObject *item = PySequence_GetItem (enum_values, i);
d59b6f6c 596
d7b32ed3 597 if (! item)
8dc78533
JK
598 {
599 do_cleanups (back_to);
600 return 0;
601 }
d7b32ed3
PM
602 if (! gdbpy_is_string (item))
603 {
fcb49fc8 604 Py_DECREF (item);
8dc78533 605 do_cleanups (back_to);
256458bc 606 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
607 _("The enumeration item not a string."));
608 return 0;
609 }
9b972014 610 self->enumeration[i] = python_string_to_host_string (item).release ();
fcb49fc8 611 Py_DECREF (item);
8dc78533
JK
612 if (self->enumeration[i] == NULL)
613 {
614 do_cleanups (back_to);
615 return 0;
616 }
617 make_cleanup (xfree, (char *) self->enumeration[i]);
d7b32ed3
PM
618 }
619
8dc78533 620 discard_cleanups (back_to);
d7b32ed3
PM
621 return 1;
622}
623
d7b32ed3
PM
624/* Object initializer; sets up gdb-side structures for command.
625
626 Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM])
627
628 NAME is the name of the parameter. It may consist of multiple
629 words, in which case the final word is the name of the new command,
630 and earlier words must be prefix commands.
631
632 CMDCLASS is the kind of command. It should be one of the COMMAND_*
633 constants defined in the gdb module.
634
635 PARMCLASS is the type of the parameter. It should be one of the
636 PARAM_* constants defined in the gdb module.
637
638 If PARMCLASS is PARAM_ENUM, then the final argument should be a
639 collection of strings. These strings are the valid values for this
640 parameter.
641
642 The documentation for the parameter is taken from the doc string
643 for the python class.
8dc78533
JK
644
645 Returns -1 on error, with a python exception set. */
646
d7b32ed3
PM
647static int
648parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
649{
650 parmpy_object *obj = (parmpy_object *) self;
ddd49eee 651 const char *name;
d7b32ed3
PM
652 char *set_doc, *show_doc, *doc;
653 char *cmd_name;
654 int parmclass, cmdtype;
655 PyObject *enum_values = NULL;
d7b32ed3 656 struct cmd_list_element **set_list, **show_list;
d7b32ed3
PM
657
658 if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass,
659 &enum_values))
660 return -1;
661
662 if (cmdtype != no_class && cmdtype != class_run
663 && cmdtype != class_vars && cmdtype != class_stack
664 && cmdtype != class_files && cmdtype != class_support
665 && cmdtype != class_info && cmdtype != class_breakpoint
666 && cmdtype != class_trace && cmdtype != class_obscure
667 && cmdtype != class_maintenance)
668 {
669 PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
670 return -1;
671 }
672
3c0ee1a4
PM
673 if (parmclass != var_boolean /* ARI: var_boolean */
674 && parmclass != var_auto_boolean
d7b32ed3
PM
675 && parmclass != var_uinteger && parmclass != var_integer
676 && parmclass != var_string && parmclass != var_string_noescape
677 && parmclass != var_optional_filename && parmclass != var_filename
678 && parmclass != var_zinteger && parmclass != var_enum)
679 {
9a2b4c1b
MS
680 PyErr_SetString (PyExc_RuntimeError,
681 _("Invalid parameter class argument."));
d7b32ed3
PM
682 return -1;
683 }
684
685 if (enum_values && parmclass != var_enum)
686 {
687 PyErr_SetString (PyExc_RuntimeError,
688 _("Only PARAM_ENUM accepts a fourth argument."));
689 return -1;
690 }
691 if (parmclass == var_enum)
692 {
693 if (! compute_enum_values (obj, enum_values))
694 return -1;
695 }
696 else
697 obj->enumeration = NULL;
698 obj->type = (enum var_types) parmclass;
699 memset (&obj->value, 0, sizeof (obj->value));
700
63d97a20 701 cmd_name = gdbpy_parse_command_name (name, &set_list,
d7b32ed3
PM
702 &setlist);
703
704 if (! cmd_name)
63d97a20 705 return -1;
d7b32ed3 706 xfree (cmd_name);
63d97a20 707 cmd_name = gdbpy_parse_command_name (name, &show_list,
d7b32ed3
PM
708 &showlist);
709 if (! cmd_name)
710 return -1;
711
9b972014
TT
712 set_doc = get_doc_string (self, set_doc_cst).release ();
713 show_doc = get_doc_string (self, show_doc_cst).release ();
714 doc = get_doc_string (self, gdbpy_doc_cst).release ();
d7b32ed3
PM
715
716 Py_INCREF (self);
717
492d29ea 718 TRY
d7b32ed3
PM
719 {
720 add_setshow_generic (parmclass, (enum command_class) cmdtype,
721 cmd_name, obj,
722 set_doc, show_doc,
723 doc, set_list, show_list);
724 }
492d29ea 725 CATCH (except, RETURN_MASK_ALL)
d7b32ed3
PM
726 {
727 xfree (cmd_name);
728 xfree (set_doc);
729 xfree (show_doc);
730 xfree (doc);
731 Py_DECREF (self);
732 PyErr_Format (except.reason == RETURN_QUIT
733 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
734 "%s", except.message);
735 return -1;
736 }
492d29ea
PA
737 END_CATCH
738
d7b32ed3
PM
739 return 0;
740}
741
742\f
743
744/* Initialize the 'parameters' module. */
999633ed 745int
d7b32ed3
PM
746gdbpy_initialize_parameters (void)
747{
748 int i;
749
6a1b1664 750 parmpy_object_type.tp_new = PyType_GenericNew;
d7b32ed3 751 if (PyType_Ready (&parmpy_object_type) < 0)
999633ed 752 return -1;
d7b32ed3
PM
753
754 set_doc_cst = PyString_FromString ("set_doc");
755 if (! set_doc_cst)
999633ed 756 return -1;
d7b32ed3
PM
757 show_doc_cst = PyString_FromString ("show_doc");
758 if (! show_doc_cst)
999633ed 759 return -1;
d7b32ed3
PM
760
761 for (i = 0; parm_constants[i].name; ++i)
762 {
763 if (PyModule_AddIntConstant (gdb_module,
764 parm_constants[i].name,
765 parm_constants[i].value) < 0)
999633ed 766 return -1;
d7b32ed3
PM
767 }
768
aa36459a
TT
769 return gdb_pymodule_addobject (gdb_module, "Parameter",
770 (PyObject *) &parmpy_object_type);
d7b32ed3
PM
771}
772
773\f
774
e36122e9 775PyTypeObject parmpy_object_type =
d7b32ed3 776{
9a27f2c6 777 PyVarObject_HEAD_INIT (NULL, 0)
d7b32ed3
PM
778 "gdb.Parameter", /*tp_name*/
779 sizeof (parmpy_object), /*tp_basicsize*/
780 0, /*tp_itemsize*/
781 0, /*tp_dealloc*/
782 0, /*tp_print*/
783 0, /*tp_getattr*/
784 0, /*tp_setattr*/
785 0, /*tp_compare*/
786 0, /*tp_repr*/
787 0, /*tp_as_number*/
788 0, /*tp_as_sequence*/
789 0, /*tp_as_mapping*/
790 0, /*tp_hash */
791 0, /*tp_call*/
792 0, /*tp_str*/
793 get_attr, /*tp_getattro*/
794 set_attr, /*tp_setattro*/
795 0, /*tp_as_buffer*/
796 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
797 "GDB parameter object", /* tp_doc */
798 0, /* tp_traverse */
799 0, /* tp_clear */
800 0, /* tp_richcompare */
801 0, /* tp_weaklistoffset */
802 0, /* tp_iter */
803 0, /* tp_iternext */
804 0, /* tp_methods */
805 0, /* tp_members */
806 0, /* tp_getset */
807 0, /* tp_base */
808 0, /* tp_dict */
809 0, /* tp_descr_get */
810 0, /* tp_descr_set */
811 0, /* tp_dictoffset */
812 parmpy_init, /* tp_init */
813 0, /* tp_alloc */
d7b32ed3 814};
This page took 0.75257 seconds and 4 git commands to generate.