-Wwrite-strings: The Rest
[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{
a121b7c1 35 const char *name;
d7b32ed3
PM
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 {
7780f186 310 gdbpy_ref<> ds_obj (PyObject_GetAttr (object, attr));
ecec24e6 311
97d83487 312 if (ds_obj != NULL && gdbpy_is_string (ds_obj.get ()))
ecec24e6 313 {
97d83487 314 result = python_string_to_host_string (ds_obj.get ());
ecec24e6
PM
315 if (result == NULL)
316 gdbpy_print_stack ();
317 }
ecec24e6
PM
318 }
319 if (! result)
9b972014 320 result.reset (xstrdup (_("This command is not documented.")));
ecec24e6
PM
321 return result;
322}
323
324/* Helper function which will execute a METHOD in OBJ passing the
325 argument ARG. ARG can be NULL. METHOD should return a Python
326 string. If this function returns NULL, there has been an error and
327 the appropriate exception set. */
9b972014 328static gdb::unique_xmalloc_ptr<char>
ecec24e6
PM
329call_doc_function (PyObject *obj, PyObject *method, PyObject *arg)
330{
9b972014 331 gdb::unique_xmalloc_ptr<char> data;
7780f186 332 gdbpy_ref<> result (PyObject_CallMethodObjArgs (obj, method, arg, NULL));
ecec24e6 333
1bb44c9f 334 if (result == NULL)
ecec24e6
PM
335 return NULL;
336
1bb44c9f 337 if (gdbpy_is_string (result.get ()))
ecec24e6 338 {
1bb44c9f 339 data = python_string_to_host_string (result.get ());
ecec24e6
PM
340 if (! data)
341 return NULL;
342 }
343 else
344 {
345 PyErr_SetString (PyExc_RuntimeError,
346 _("Parameter must return a string value."));
347 return NULL;
348 }
349
350 return data;
351}
352
353/* A callback function that is registered against the respective
354 add_setshow_* set_doc prototype. This function will either call
355 the Python function "get_set_string" or extract the Python
356 attribute "set_doc" and return the contents as a string. If
357 neither exist, insert a string indicating the Parameter is not
358 documented. */
359static void
360get_set_value (char *args, int from_tty,
361 struct cmd_list_element *c)
362{
363 PyObject *obj = (PyObject *) get_cmd_context (c);
9b972014 364 gdb::unique_xmalloc_ptr<char> set_doc_string;
ecec24e6 365
2865bfce 366 gdbpy_enter enter_py (get_current_arch (), current_language);
7780f186 367 gdbpy_ref<> set_doc_func (PyString_FromString ("get_set_string"));
ecec24e6 368
2865bfce 369 if (set_doc_func == NULL)
ecec24e6 370 {
2865bfce
TT
371 gdbpy_print_stack ();
372 return;
373 }
374
375 if (PyObject_HasAttr (obj, set_doc_func.get ()))
376 {
377 set_doc_string = call_doc_function (obj, set_doc_func.get (), NULL);
ecec24e6 378 if (! set_doc_string)
2865bfce
TT
379 {
380 gdbpy_print_stack ();
381 return;
382 }
ecec24e6
PM
383 }
384 else
385 {
386 /* We have to preserve the existing < GDB 7.3 API. If a
387 callback function does not exist, then attempt to read the
388 set_doc attribute. */
389 set_doc_string = get_doc_string (obj, set_doc_cst);
390 }
391
9b972014 392 fprintf_filtered (gdb_stdout, "%s\n", set_doc_string.get ());
ecec24e6
PM
393}
394
395/* A callback function that is registered against the respective
396 add_setshow_* show_doc prototype. This function will either call
397 the Python function "get_show_string" or extract the Python
398 attribute "show_doc" and return the contents as a string. If
399 neither exist, insert a string indicating the Parameter is not
400 documented. */
401static void
402get_show_value (struct ui_file *file, int from_tty,
403 struct cmd_list_element *c,
404 const char *value)
405{
406 PyObject *obj = (PyObject *) get_cmd_context (c);
9b972014 407 gdb::unique_xmalloc_ptr<char> show_doc_string;
ecec24e6 408
2865bfce 409 gdbpy_enter enter_py (get_current_arch (), current_language);
7780f186 410 gdbpy_ref<> show_doc_func (PyString_FromString ("get_show_string"));
2865bfce
TT
411
412 if (show_doc_func == NULL)
413 {
414 gdbpy_print_stack ();
415 return;
416 }
ecec24e6 417
2865bfce 418 if (PyObject_HasAttr (obj, show_doc_func.get ()))
ecec24e6 419 {
7780f186 420 gdbpy_ref<> val_obj (PyString_FromString (value));
ecec24e6 421
2865bfce
TT
422 if (val_obj == NULL)
423 {
424 gdbpy_print_stack ();
425 return;
426 }
ecec24e6 427
2865bfce
TT
428 show_doc_string = call_doc_function (obj, show_doc_func.get (),
429 val_obj.get ());
ecec24e6 430 if (! show_doc_string)
2865bfce
TT
431 {
432 gdbpy_print_stack ();
433 return;
434 }
ecec24e6 435
9b972014 436 fprintf_filtered (file, "%s\n", show_doc_string.get ());
ecec24e6
PM
437 }
438 else
439 {
440 /* We have to preserve the existing < GDB 7.3 API. If a
441 callback function does not exist, then attempt to read the
442 show_doc attribute. */
443 show_doc_string = get_doc_string (obj, show_doc_cst);
9b972014 444 fprintf_filtered (file, "%s %s\n", show_doc_string.get (), value);
ecec24e6 445 }
ecec24e6 446}
d7b32ed3
PM
447\f
448
449/* A helper function that dispatches to the appropriate add_setshow
450 function. */
451static void
452add_setshow_generic (int parmclass, enum command_class cmdclass,
453 char *cmd_name, parmpy_object *self,
454 char *set_doc, char *show_doc, char *help_doc,
455 struct cmd_list_element **set_list,
456 struct cmd_list_element **show_list)
457{
ecec24e6 458 struct cmd_list_element *param = NULL;
6f937416 459 const char *tmp_name = NULL;
ecec24e6 460
d7b32ed3
PM
461 switch (parmclass)
462 {
463 case var_boolean:
ecec24e6
PM
464
465 add_setshow_boolean_cmd (cmd_name, cmdclass,
466 &self->value.intval, set_doc, show_doc,
467 help_doc, get_set_value, get_show_value,
468 set_list, show_list);
469
d7b32ed3
PM
470 break;
471
472 case var_auto_boolean:
473 add_setshow_auto_boolean_cmd (cmd_name, cmdclass,
474 &self->value.autoboolval,
475 set_doc, show_doc, help_doc,
ecec24e6
PM
476 get_set_value, get_show_value,
477 set_list, show_list);
d7b32ed3
PM
478 break;
479
480 case var_uinteger:
ecec24e6
PM
481 add_setshow_uinteger_cmd (cmd_name, cmdclass,
482 &self->value.uintval, set_doc, show_doc,
483 help_doc, get_set_value, get_show_value,
484 set_list, show_list);
d7b32ed3
PM
485 break;
486
487 case var_integer:
ecec24e6
PM
488 add_setshow_integer_cmd (cmd_name, cmdclass,
489 &self->value.intval, set_doc, show_doc,
490 help_doc, get_set_value, get_show_value,
491 set_list, show_list); break;
d7b32ed3
PM
492
493 case var_string:
ecec24e6
PM
494 add_setshow_string_cmd (cmd_name, cmdclass,
495 &self->value.stringval, 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_noescape:
500 add_setshow_string_noescape_cmd (cmd_name, cmdclass,
501 &self->value.stringval,
502 set_doc, show_doc, help_doc,
ecec24e6
PM
503 get_set_value, get_show_value,
504 set_list, show_list);
505
d7b32ed3
PM
506 break;
507
508 case var_optional_filename:
509 add_setshow_optional_filename_cmd (cmd_name, cmdclass,
ecec24e6
PM
510 &self->value.stringval, set_doc,
511 show_doc, help_doc, get_set_value,
512 get_show_value, set_list,
513 show_list);
d7b32ed3
PM
514 break;
515
516 case var_filename:
ecec24e6
PM
517 add_setshow_filename_cmd (cmd_name, cmdclass,
518 &self->value.stringval, set_doc, show_doc,
519 help_doc, get_set_value, get_show_value,
520 set_list, show_list); break;
d7b32ed3
PM
521
522 case var_zinteger:
ecec24e6
PM
523 add_setshow_zinteger_cmd (cmd_name, cmdclass,
524 &self->value.intval, set_doc, show_doc,
525 help_doc, get_set_value, get_show_value,
526 set_list, show_list);
d7b32ed3
PM
527 break;
528
529 case var_enum:
530 add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration,
ecec24e6
PM
531 &self->value.cstringval, set_doc, show_doc,
532 help_doc, get_set_value, get_show_value,
533 set_list, show_list);
d7b32ed3
PM
534 /* Initialize the value, just in case. */
535 self->value.cstringval = self->enumeration[0];
536 break;
537 }
ecec24e6
PM
538
539 /* Lookup created parameter, and register Python object against the
540 parameter context. Perform this task against both lists. */
541 tmp_name = cmd_name;
542 param = lookup_cmd (&tmp_name, *show_list, "", 0, 1);
543 if (param)
544 set_cmd_context (param, self);
545
546 tmp_name = cmd_name;
547 param = lookup_cmd (&tmp_name, *set_list, "", 0, 1);
548 if (param)
549 set_cmd_context (param, self);
d7b32ed3
PM
550}
551
8dc78533
JK
552/* A helper which computes enum values. Returns 1 on success. Returns 0 on
553 error, with a python exception set. */
d7b32ed3
PM
554static int
555compute_enum_values (parmpy_object *self, PyObject *enum_values)
556{
557 Py_ssize_t size, i;
8dc78533 558 struct cleanup *back_to;
d7b32ed3
PM
559
560 if (! enum_values)
561 {
562 PyErr_SetString (PyExc_RuntimeError,
563 _("An enumeration is required for PARAM_ENUM."));
564 return 0;
565 }
566
567 if (! PySequence_Check (enum_values))
568 {
256458bc 569 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
570 _("The enumeration is not a sequence."));
571 return 0;
572 }
573
574 size = PySequence_Size (enum_values);
575 if (size < 0)
576 return 0;
577 if (size == 0)
578 {
256458bc 579 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
580 _("The enumeration is empty."));
581 return 0;
582 }
583
8d749320 584 self->enumeration = XCNEWVEC (const char *, size + 1);
8dc78533 585 back_to = make_cleanup (free_current_contents, &self->enumeration);
d7b32ed3
PM
586
587 for (i = 0; i < size; ++i)
588 {
7780f186 589 gdbpy_ref<> item (PySequence_GetItem (enum_values, i));
d59b6f6c 590
97d83487 591 if (item == NULL)
8dc78533
JK
592 {
593 do_cleanups (back_to);
594 return 0;
595 }
97d83487 596 if (! gdbpy_is_string (item.get ()))
d7b32ed3 597 {
8dc78533 598 do_cleanups (back_to);
256458bc 599 PyErr_SetString (PyExc_RuntimeError,
d7b32ed3
PM
600 _("The enumeration item not a string."));
601 return 0;
602 }
97d83487
TT
603 self->enumeration[i]
604 = python_string_to_host_string (item.get ()).release ();
8dc78533
JK
605 if (self->enumeration[i] == NULL)
606 {
607 do_cleanups (back_to);
608 return 0;
609 }
610 make_cleanup (xfree, (char *) self->enumeration[i]);
d7b32ed3
PM
611 }
612
8dc78533 613 discard_cleanups (back_to);
d7b32ed3
PM
614 return 1;
615}
616
d7b32ed3
PM
617/* Object initializer; sets up gdb-side structures for command.
618
619 Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM])
620
621 NAME is the name of the parameter. It may consist of multiple
622 words, in which case the final word is the name of the new command,
623 and earlier words must be prefix commands.
624
625 CMDCLASS is the kind of command. It should be one of the COMMAND_*
626 constants defined in the gdb module.
627
628 PARMCLASS is the type of the parameter. It should be one of the
629 PARAM_* constants defined in the gdb module.
630
631 If PARMCLASS is PARAM_ENUM, then the final argument should be a
632 collection of strings. These strings are the valid values for this
633 parameter.
634
635 The documentation for the parameter is taken from the doc string
636 for the python class.
8dc78533
JK
637
638 Returns -1 on error, with a python exception set. */
639
d7b32ed3
PM
640static int
641parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
642{
643 parmpy_object *obj = (parmpy_object *) self;
ddd49eee 644 const char *name;
d7b32ed3
PM
645 char *set_doc, *show_doc, *doc;
646 char *cmd_name;
647 int parmclass, cmdtype;
648 PyObject *enum_values = NULL;
d7b32ed3 649 struct cmd_list_element **set_list, **show_list;
d7b32ed3
PM
650
651 if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass,
652 &enum_values))
653 return -1;
654
655 if (cmdtype != no_class && cmdtype != class_run
656 && cmdtype != class_vars && cmdtype != class_stack
657 && cmdtype != class_files && cmdtype != class_support
658 && cmdtype != class_info && cmdtype != class_breakpoint
659 && cmdtype != class_trace && cmdtype != class_obscure
660 && cmdtype != class_maintenance)
661 {
662 PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
663 return -1;
664 }
665
3c0ee1a4
PM
666 if (parmclass != var_boolean /* ARI: var_boolean */
667 && parmclass != var_auto_boolean
d7b32ed3
PM
668 && parmclass != var_uinteger && parmclass != var_integer
669 && parmclass != var_string && parmclass != var_string_noescape
670 && parmclass != var_optional_filename && parmclass != var_filename
671 && parmclass != var_zinteger && parmclass != var_enum)
672 {
9a2b4c1b
MS
673 PyErr_SetString (PyExc_RuntimeError,
674 _("Invalid parameter class argument."));
d7b32ed3
PM
675 return -1;
676 }
677
678 if (enum_values && parmclass != var_enum)
679 {
680 PyErr_SetString (PyExc_RuntimeError,
681 _("Only PARAM_ENUM accepts a fourth argument."));
682 return -1;
683 }
684 if (parmclass == var_enum)
685 {
686 if (! compute_enum_values (obj, enum_values))
687 return -1;
688 }
689 else
690 obj->enumeration = NULL;
691 obj->type = (enum var_types) parmclass;
692 memset (&obj->value, 0, sizeof (obj->value));
693
63d97a20 694 cmd_name = gdbpy_parse_command_name (name, &set_list,
d7b32ed3
PM
695 &setlist);
696
697 if (! cmd_name)
63d97a20 698 return -1;
d7b32ed3 699 xfree (cmd_name);
63d97a20 700 cmd_name = gdbpy_parse_command_name (name, &show_list,
d7b32ed3
PM
701 &showlist);
702 if (! cmd_name)
703 return -1;
704
9b972014
TT
705 set_doc = get_doc_string (self, set_doc_cst).release ();
706 show_doc = get_doc_string (self, show_doc_cst).release ();
707 doc = get_doc_string (self, gdbpy_doc_cst).release ();
d7b32ed3
PM
708
709 Py_INCREF (self);
710
492d29ea 711 TRY
d7b32ed3
PM
712 {
713 add_setshow_generic (parmclass, (enum command_class) cmdtype,
714 cmd_name, obj,
715 set_doc, show_doc,
716 doc, set_list, show_list);
717 }
492d29ea 718 CATCH (except, RETURN_MASK_ALL)
d7b32ed3
PM
719 {
720 xfree (cmd_name);
721 xfree (set_doc);
722 xfree (show_doc);
723 xfree (doc);
724 Py_DECREF (self);
725 PyErr_Format (except.reason == RETURN_QUIT
726 ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
727 "%s", except.message);
728 return -1;
729 }
492d29ea
PA
730 END_CATCH
731
d7b32ed3
PM
732 return 0;
733}
734
735\f
736
737/* Initialize the 'parameters' module. */
999633ed 738int
d7b32ed3
PM
739gdbpy_initialize_parameters (void)
740{
741 int i;
742
6a1b1664 743 parmpy_object_type.tp_new = PyType_GenericNew;
d7b32ed3 744 if (PyType_Ready (&parmpy_object_type) < 0)
999633ed 745 return -1;
d7b32ed3
PM
746
747 set_doc_cst = PyString_FromString ("set_doc");
748 if (! set_doc_cst)
999633ed 749 return -1;
d7b32ed3
PM
750 show_doc_cst = PyString_FromString ("show_doc");
751 if (! show_doc_cst)
999633ed 752 return -1;
d7b32ed3
PM
753
754 for (i = 0; parm_constants[i].name; ++i)
755 {
756 if (PyModule_AddIntConstant (gdb_module,
757 parm_constants[i].name,
758 parm_constants[i].value) < 0)
999633ed 759 return -1;
d7b32ed3
PM
760 }
761
aa36459a
TT
762 return gdb_pymodule_addobject (gdb_module, "Parameter",
763 (PyObject *) &parmpy_object_type);
d7b32ed3
PM
764}
765
766\f
767
e36122e9 768PyTypeObject parmpy_object_type =
d7b32ed3 769{
9a27f2c6 770 PyVarObject_HEAD_INIT (NULL, 0)
d7b32ed3
PM
771 "gdb.Parameter", /*tp_name*/
772 sizeof (parmpy_object), /*tp_basicsize*/
773 0, /*tp_itemsize*/
774 0, /*tp_dealloc*/
775 0, /*tp_print*/
776 0, /*tp_getattr*/
777 0, /*tp_setattr*/
778 0, /*tp_compare*/
779 0, /*tp_repr*/
780 0, /*tp_as_number*/
781 0, /*tp_as_sequence*/
782 0, /*tp_as_mapping*/
783 0, /*tp_hash */
784 0, /*tp_call*/
785 0, /*tp_str*/
786 get_attr, /*tp_getattro*/
787 set_attr, /*tp_setattro*/
788 0, /*tp_as_buffer*/
789 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
790 "GDB parameter object", /* tp_doc */
791 0, /* tp_traverse */
792 0, /* tp_clear */
793 0, /* tp_richcompare */
794 0, /* tp_weaklistoffset */
795 0, /* tp_iter */
796 0, /* tp_iternext */
797 0, /* tp_methods */
798 0, /* tp_members */
799 0, /* tp_getset */
800 0, /* tp_base */
801 0, /* tp_dict */
802 0, /* tp_descr_get */
803 0, /* tp_descr_set */
804 0, /* tp_dictoffset */
805 parmpy_init, /* tp_init */
806 0, /* tp_alloc */
d7b32ed3 807};
This page took 0.691249 seconds and 4 git commands to generate.