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 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 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 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 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 }; 823