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