]> Git Repo - binutils.git/blob - gdb/python/py-param.c
Change get_objfile_arch to a method on objfile
[binutils.git] / gdb / python / py-param.c
1 /* GDB parameters implemented in Python
2
3    Copyright (C) 2008-2020 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 "python-internal.h"
24 #include "charset.h"
25 #include "gdbcmd.h"
26 #include "cli/cli-decode.h"
27 #include "completer.h"
28 #include "language.h"
29 #include "arch-utils.h"
30
31 /* Parameter constants and their values.  */
32 struct parm_constant
33 {
34   const char *name;
35   int value;
36 };
37
38 struct parm_constant parm_constants[] =
39 {
40   { "PARAM_BOOLEAN", var_boolean }, /* ARI: var_boolean */
41   { "PARAM_AUTO_BOOLEAN", var_auto_boolean },
42   { "PARAM_UINTEGER", var_uinteger },
43   { "PARAM_INTEGER", var_integer },
44   { "PARAM_STRING", var_string },
45   { "PARAM_STRING_NOESCAPE", var_string_noescape },
46   { "PARAM_OPTIONAL_FILENAME", var_optional_filename },
47   { "PARAM_FILENAME", var_filename },
48   { "PARAM_ZINTEGER", var_zinteger },
49   { "PARAM_ZUINTEGER", var_zuinteger },
50   { "PARAM_ZUINTEGER_UNLIMITED", var_zuinteger_unlimited },
51   { "PARAM_ENUM", var_enum },
52   { NULL, 0 }
53 };
54
55 /* A union that can hold anything described by enum var_types.  */
56 union parmpy_variable
57 {
58   /* Hold a boolean value.  */
59   bool boolval;
60
61   /* Hold an integer value.  */
62   int intval;
63
64   /* Hold an auto_boolean.  */
65   enum auto_boolean autoboolval;
66
67   /* Hold an unsigned integer value, for uinteger.  */
68   unsigned int uintval;
69
70   /* Hold a string, for the various string types.  */
71   char *stringval;
72
73   /* Hold a string, for enums.  */
74   const char *cstringval;
75 };
76
77 /* A GDB parameter.  */
78 struct parmpy_object
79 {
80   PyObject_HEAD
81
82   /* The type of the parameter.  */
83   enum var_types type;
84
85   /* The value of the parameter.  */
86   union parmpy_variable value;
87
88   /* For an enum command, the possible values.  The vector is
89      allocated with xmalloc, as is each element.  It is
90      NULL-terminated.  */
91   const char **enumeration;
92 };
93
94 typedef struct parmpy_object parmpy_object;
95
96 extern PyTypeObject parmpy_object_type
97     CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("parmpy_object");
98
99 /* Some handy string constants.  */
100 static PyObject *set_doc_cst;
101 static PyObject *show_doc_cst;
102
103 \f
104
105 /* Get an attribute.  */
106 static PyObject *
107 get_attr (PyObject *obj, PyObject *attr_name)
108 {
109   if (PyString_Check (attr_name)
110 #ifdef IS_PY3K
111       && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
112 #else
113       && ! strcmp (PyString_AsString (attr_name), "value"))
114 #endif
115     {
116       parmpy_object *self = (parmpy_object *) obj;
117
118       return gdbpy_parameter_value (self->type, &self->value);
119     }
120
121   return PyObject_GenericGetAttr (obj, attr_name);
122 }
123
124 /* Set a parameter value from a Python value.  Return 0 on success.  Returns
125    -1 on error, with a python exception set.  */
126 static int
127 set_parameter_value (parmpy_object *self, PyObject *value)
128 {
129   int cmp;
130
131   switch (self->type)
132     {
133     case var_string:
134     case var_string_noescape:
135     case var_optional_filename:
136     case var_filename:
137       if (! gdbpy_is_string (value)
138           && (self->type == var_filename
139               || value != Py_None))
140         {
141           PyErr_SetString (PyExc_RuntimeError,
142                            _("String required for filename."));
143
144           return -1;
145         }
146       if (value == Py_None)
147         {
148           xfree (self->value.stringval);
149           if (self->type == var_optional_filename)
150             self->value.stringval = xstrdup ("");
151           else
152             self->value.stringval = NULL;
153         }
154       else
155         {
156           gdb::unique_xmalloc_ptr<char>
157             string (python_string_to_host_string (value));
158           if (string == NULL)
159             return -1;
160
161           xfree (self->value.stringval);
162           self->value.stringval = string.release ();
163         }
164       break;
165
166     case var_enum:
167       {
168         int i;
169
170         if (! gdbpy_is_string (value))
171           {
172             PyErr_SetString (PyExc_RuntimeError,
173                              _("ENUM arguments must be a string."));
174             return -1;
175           }
176
177         gdb::unique_xmalloc_ptr<char>
178           str (python_string_to_host_string (value));
179         if (str == NULL)
180           return -1;
181         for (i = 0; self->enumeration[i]; ++i)
182           if (! strcmp (self->enumeration[i], str.get ()))
183             break;
184         if (! self->enumeration[i])
185           {
186             PyErr_SetString (PyExc_RuntimeError,
187                              _("The value must be member of an enumeration."));
188             return -1;
189           }
190         self->value.cstringval = self->enumeration[i];
191         break;
192       }
193
194     case var_boolean:
195       if (! PyBool_Check (value))
196         {
197           PyErr_SetString (PyExc_RuntimeError,
198                            _("A boolean argument is required."));
199           return -1;
200         }
201       cmp = PyObject_IsTrue (value);
202       if (cmp < 0)
203           return -1;
204       self->value.boolval = cmp;
205       break;
206
207     case var_auto_boolean:
208       if (! PyBool_Check (value) && value != Py_None)
209         {
210           PyErr_SetString (PyExc_RuntimeError,
211                            _("A boolean or None is required"));
212           return -1;
213         }
214
215       if (value == Py_None)
216         self->value.autoboolval = AUTO_BOOLEAN_AUTO;
217       else
218         {
219           cmp = PyObject_IsTrue (value);
220           if (cmp < 0 )
221             return -1;  
222           if (cmp == 1)
223             self->value.autoboolval = AUTO_BOOLEAN_TRUE;
224           else
225             self->value.autoboolval = AUTO_BOOLEAN_FALSE;
226         }
227       break;
228
229     case var_integer:
230     case var_zinteger:
231     case var_uinteger:
232     case var_zuinteger:
233     case var_zuinteger_unlimited:
234       {
235         long l;
236         int ok;
237
238         if (! PyInt_Check (value))
239           {
240             PyErr_SetString (PyExc_RuntimeError,
241                              _("The value must be integer."));
242             return -1;
243           }
244
245         if (! gdb_py_int_as_long (value, &l))
246           return -1;
247
248         switch (self->type)
249           {
250           case var_uinteger:
251             if (l == 0)
252               l = UINT_MAX;
253             /* Fall through.  */
254           case var_zuinteger:
255             ok = (l >= 0 && l <= UINT_MAX);
256             break;
257
258           case var_zuinteger_unlimited:
259             ok = (l >= -1 && l <= INT_MAX);
260             break;
261
262           case var_integer:
263             ok = (l >= INT_MIN && l <= INT_MAX);
264             if (l == 0)
265               l = INT_MAX;
266             break;
267
268           case var_zinteger:
269             ok = (l >= INT_MIN && l <= INT_MAX);
270             break;
271
272           default:
273             gdb_assert_not_reached ("unknown var_ constant");
274           }
275
276         if (! ok)
277           {
278             PyErr_SetString (PyExc_RuntimeError,
279                              _("Range exceeded."));
280             return -1;
281           }
282
283         if (self->type == var_uinteger || self->type == var_zuinteger)
284           self->value.uintval = (unsigned) l;
285         else
286           self->value.intval = (int) l;
287         break;
288       }
289
290     default:
291       PyErr_SetString (PyExc_RuntimeError,
292                        _("Unhandled type in parameter value."));
293       return -1;
294     }
295
296   return 0;
297 }
298
299 /* Set an attribute.  Returns -1 on error, with a python exception set.  */
300 static int
301 set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
302 {
303   if (PyString_Check (attr_name)
304 #ifdef IS_PY3K
305       && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
306 #else
307       && ! strcmp (PyString_AsString (attr_name), "value"))
308 #endif
309     {
310       if (!val)
311         {
312           PyErr_SetString (PyExc_RuntimeError,
313                            _("Cannot delete a parameter's value."));
314           return -1;
315         }
316       return set_parameter_value ((parmpy_object *) obj, val);
317     }
318
319   return PyObject_GenericSetAttr (obj, attr_name, val);
320 }
321
322 /* A helper function which returns a documentation string for an
323    object. */
324
325 static gdb::unique_xmalloc_ptr<char>
326 get_doc_string (PyObject *object, PyObject *attr)
327 {
328   gdb::unique_xmalloc_ptr<char> result;
329
330   if (PyObject_HasAttr (object, attr))
331     {
332       gdbpy_ref<> ds_obj (PyObject_GetAttr (object, attr));
333
334       if (ds_obj != NULL && gdbpy_is_string (ds_obj.get ()))
335         {
336           result = python_string_to_host_string (ds_obj.get ());
337           if (result == NULL)
338             gdbpy_print_stack ();
339         }
340     }
341   if (! result)
342     result.reset (xstrdup (_("This command is not documented.")));
343   return result;
344 }
345
346 /* Helper function which will execute a METHOD in OBJ passing the
347    argument ARG.  ARG can be NULL.  METHOD should return a Python
348    string.  If this function returns NULL, there has been an error and
349    the appropriate exception set.  */
350 static gdb::unique_xmalloc_ptr<char>
351 call_doc_function (PyObject *obj, PyObject *method, PyObject *arg)
352 {
353   gdb::unique_xmalloc_ptr<char> data;
354   gdbpy_ref<> result (PyObject_CallMethodObjArgs (obj, method, arg, NULL));
355
356   if (result == NULL)
357     return NULL;
358
359   if (gdbpy_is_string (result.get ()))
360     {
361       data = python_string_to_host_string (result.get ());
362       if (! data)
363         return NULL;
364     }
365   else
366     {
367       PyErr_SetString (PyExc_RuntimeError,
368                        _("Parameter must return a string value."));
369       return NULL;
370     }
371
372   return data;
373 }
374
375 /* A callback function that is registered against the respective
376    add_setshow_* set_doc prototype.  This function will either call
377    the Python function "get_set_string" or extract the Python
378    attribute "set_doc" and return the contents as a string.  If
379    neither exist, insert a string indicating the Parameter is not
380    documented.  */
381 static void
382 get_set_value (const char *args, int from_tty,
383                struct cmd_list_element *c)
384 {
385   PyObject *obj = (PyObject *) get_cmd_context (c);
386   gdb::unique_xmalloc_ptr<char> set_doc_string;
387
388   gdbpy_enter enter_py (get_current_arch (), current_language);
389   gdbpy_ref<> set_doc_func (PyString_FromString ("get_set_string"));
390
391   if (set_doc_func == NULL)
392     {
393       gdbpy_print_stack ();
394       return;
395     }
396
397   if (PyObject_HasAttr (obj, set_doc_func.get ()))
398     {
399       set_doc_string = call_doc_function (obj, set_doc_func.get (), NULL);
400       if (! set_doc_string)
401         gdbpy_handle_exception ();
402     }
403
404   const char *str = set_doc_string.get ();
405   if (str != nullptr && str[0] != '\0')
406     fprintf_filtered (gdb_stdout, "%s\n", str);
407 }
408
409 /* A callback function that is registered against the respective
410    add_setshow_* show_doc prototype.  This function will either call
411    the Python function "get_show_string" or extract the Python
412    attribute "show_doc" and return the contents as a string.  If
413    neither exist, insert a string indicating the Parameter is not
414    documented.  */
415 static void
416 get_show_value (struct ui_file *file, int from_tty,
417                 struct cmd_list_element *c,
418                 const char *value)
419 {
420   PyObject *obj = (PyObject *) get_cmd_context (c);
421   gdb::unique_xmalloc_ptr<char> show_doc_string;
422
423   gdbpy_enter enter_py (get_current_arch (), current_language);
424   gdbpy_ref<> show_doc_func (PyString_FromString ("get_show_string"));
425
426   if (show_doc_func == NULL)
427     {
428       gdbpy_print_stack ();
429       return;
430     }
431
432   if (PyObject_HasAttr (obj, show_doc_func.get ()))
433     {
434       gdbpy_ref<> val_obj (PyString_FromString (value));
435
436       if (val_obj == NULL)
437         {
438           gdbpy_print_stack ();
439           return;
440         }
441
442       show_doc_string = call_doc_function (obj, show_doc_func.get (),
443                                            val_obj.get ());
444       if (! show_doc_string)
445         {
446           gdbpy_print_stack ();
447           return;
448         }
449
450       fprintf_filtered (file, "%s\n", show_doc_string.get ());
451     }
452   else
453     {
454       /* We have to preserve the existing < GDB 7.3 API.  If a
455          callback function does not exist, then attempt to read the
456          show_doc attribute.  */
457       show_doc_string  = get_doc_string (obj, show_doc_cst);
458       fprintf_filtered (file, "%s %s\n", show_doc_string.get (), value);
459     }
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                      const char *cmd_name, parmpy_object *self,
468                      const char *set_doc, const char *show_doc,
469                      const char *help_doc,
470                      struct cmd_list_element **set_list,
471                      struct cmd_list_element **show_list)
472 {
473   struct cmd_list_element *param = NULL;
474   const char *tmp_name = NULL;
475
476   switch (parmclass)
477     {
478     case var_boolean:
479
480       add_setshow_boolean_cmd (cmd_name, cmdclass,
481                                &self->value.boolval, set_doc, show_doc,
482                                help_doc, get_set_value, get_show_value,
483                                set_list, show_list);
484
485       break;
486
487     case var_auto_boolean:
488       add_setshow_auto_boolean_cmd (cmd_name, cmdclass,
489                                     &self->value.autoboolval,
490                                     set_doc, show_doc, help_doc,
491                                     get_set_value, get_show_value,
492                                     set_list, show_list);
493       break;
494
495     case var_uinteger:
496       add_setshow_uinteger_cmd (cmd_name, cmdclass,
497                                 &self->value.uintval, set_doc, show_doc,
498                                 help_doc, get_set_value, get_show_value,
499                                 set_list, show_list);
500       break;
501
502     case var_integer:
503       add_setshow_integer_cmd (cmd_name, cmdclass,
504                                &self->value.intval, set_doc, show_doc,
505                                help_doc, get_set_value, get_show_value,
506                                set_list, show_list); break;
507
508     case var_string:
509       add_setshow_string_cmd (cmd_name, cmdclass,
510                               &self->value.stringval, set_doc, show_doc,
511                               help_doc, get_set_value, get_show_value,
512                               set_list, show_list); break;
513
514     case var_string_noescape:
515       add_setshow_string_noescape_cmd (cmd_name, cmdclass,
516                                        &self->value.stringval,
517                                        set_doc, show_doc, help_doc,
518                                        get_set_value, get_show_value,
519                                        set_list, show_list);
520
521       break;
522
523     case var_optional_filename:
524       add_setshow_optional_filename_cmd (cmd_name, cmdclass,
525                                          &self->value.stringval, set_doc,
526                                          show_doc, help_doc, get_set_value,
527                                          get_show_value, set_list,
528                                          show_list);
529       break;
530
531     case var_filename:
532       add_setshow_filename_cmd (cmd_name, cmdclass,
533                                 &self->value.stringval, set_doc, show_doc,
534                                 help_doc, get_set_value, get_show_value,
535                                 set_list, show_list); break;
536
537     case var_zinteger:
538       add_setshow_zinteger_cmd (cmd_name, cmdclass,
539                                 &self->value.intval, set_doc, show_doc,
540                                 help_doc, get_set_value, get_show_value,
541                                 set_list, show_list);
542       break;
543
544     case var_zuinteger:
545       add_setshow_zuinteger_cmd (cmd_name, cmdclass,
546                                 &self->value.uintval, set_doc, show_doc,
547                                 help_doc, get_set_value, get_show_value,
548                                 set_list, show_list);
549       break;
550
551     case var_zuinteger_unlimited:
552       add_setshow_zuinteger_unlimited_cmd (cmd_name, cmdclass,
553                                            &self->value.intval, set_doc,
554                                            show_doc, help_doc, get_set_value,
555                                            get_show_value,
556                                            set_list, show_list);
557       break;
558
559     case var_enum:
560       add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration,
561                             &self->value.cstringval, set_doc, show_doc,
562                             help_doc, get_set_value, get_show_value,
563                             set_list, show_list);
564       /* Initialize the value, just in case.  */
565       self->value.cstringval = self->enumeration[0];
566       break;
567     }
568
569   /* Lookup created parameter, and register Python object against the
570      parameter context.  Perform this task against both lists.  */
571   tmp_name = cmd_name;
572   param = lookup_cmd (&tmp_name, *show_list, "", 0, 1);
573   if (param)
574     set_cmd_context (param, self);
575
576   tmp_name = cmd_name;
577   param = lookup_cmd (&tmp_name, *set_list, "", 0, 1);
578   if (param)
579     set_cmd_context (param, self);
580 }
581
582 /* A helper which computes enum values.  Returns 1 on success.  Returns 0 on
583    error, with a python exception set.  */
584 static int
585 compute_enum_values (parmpy_object *self, PyObject *enum_values)
586 {
587   Py_ssize_t size, i;
588
589   if (! enum_values)
590     {
591       PyErr_SetString (PyExc_RuntimeError,
592                        _("An enumeration is required for PARAM_ENUM."));
593       return 0;
594     }
595
596   if (! PySequence_Check (enum_values))
597     {
598       PyErr_SetString (PyExc_RuntimeError,
599                        _("The enumeration is not a sequence."));
600       return 0;
601     }
602
603   size = PySequence_Size (enum_values);
604   if (size < 0)
605     return 0;
606   if (size == 0)
607     {
608       PyErr_SetString (PyExc_RuntimeError,
609                        _("The enumeration is empty."));
610       return 0;
611     }
612
613   gdb_argv holder (XCNEWVEC (char *, size + 1));
614   char **enumeration = holder.get ();
615
616   for (i = 0; i < size; ++i)
617     {
618       gdbpy_ref<> item (PySequence_GetItem (enum_values, i));
619
620       if (item == NULL)
621         return 0;
622       if (! gdbpy_is_string (item.get ()))
623         {
624           PyErr_SetString (PyExc_RuntimeError,
625                            _("The enumeration item not a string."));
626           return 0;
627         }
628       enumeration[i] = python_string_to_host_string (item.get ()).release ();
629       if (enumeration[i] == NULL)
630         return 0;
631     }
632
633   self->enumeration = const_cast<const char**> (holder.release ());
634   return 1;
635 }
636
637 /* Object initializer; sets up gdb-side structures for command.
638
639    Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM])
640
641    NAME is the name of the parameter.  It may consist of multiple
642    words, in which case the final word is the name of the new command,
643    and earlier words must be prefix commands.
644
645    CMDCLASS is the kind of command.  It should be one of the COMMAND_*
646    constants defined in the gdb module.
647
648    PARMCLASS is the type of the parameter.  It should be one of the
649    PARAM_* constants defined in the gdb module.
650
651    If PARMCLASS is PARAM_ENUM, then the final argument should be a
652    collection of strings.  These strings are the valid values for this
653    parameter.
654
655    The documentation for the parameter is taken from the doc string
656    for the python class.
657
658    Returns -1 on error, with a python exception set.  */
659
660 static int
661 parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
662 {
663   parmpy_object *obj = (parmpy_object *) self;
664   const char *name;
665   gdb::unique_xmalloc_ptr<char> set_doc, show_doc, doc;
666   char *cmd_name;
667   int parmclass, cmdtype;
668   PyObject *enum_values = NULL;
669   struct cmd_list_element **set_list, **show_list;
670
671   if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass,
672                           &enum_values))
673     return -1;
674
675   if (cmdtype != no_class && cmdtype != class_run
676       && cmdtype != class_vars && cmdtype != class_stack
677       && cmdtype != class_files && cmdtype != class_support
678       && cmdtype != class_info && cmdtype != class_breakpoint
679       && cmdtype != class_trace && cmdtype != class_obscure
680       && cmdtype != class_maintenance)
681     {
682       PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
683       return -1;
684     }
685
686   if (parmclass != var_boolean /* ARI: var_boolean */
687       && parmclass != var_auto_boolean
688       && parmclass != var_uinteger && parmclass != var_integer
689       && parmclass != var_string && parmclass != var_string_noescape
690       && parmclass != var_optional_filename && parmclass != var_filename
691       && parmclass != var_zinteger && parmclass != var_zuinteger
692       && parmclass != var_zuinteger_unlimited && parmclass != var_enum)
693     {
694       PyErr_SetString (PyExc_RuntimeError,
695                        _("Invalid parameter class argument."));
696       return -1;
697     }
698
699   if (enum_values && parmclass != var_enum)
700     {
701       PyErr_SetString (PyExc_RuntimeError,
702                        _("Only PARAM_ENUM accepts a fourth argument."));
703       return -1;
704     }
705   if (parmclass == var_enum)
706     {
707       if (! compute_enum_values (obj, enum_values))
708         return -1;
709     }
710   else
711     obj->enumeration = NULL;
712   obj->type = (enum var_types) parmclass;
713   memset (&obj->value, 0, sizeof (obj->value));
714
715   cmd_name = gdbpy_parse_command_name (name, &set_list,
716                                        &setlist);
717
718   if (! cmd_name)
719     return -1;
720   xfree (cmd_name);
721   cmd_name = gdbpy_parse_command_name (name, &show_list,
722                                        &showlist);
723   if (! cmd_name)
724     return -1;
725
726   set_doc = get_doc_string (self, set_doc_cst);
727   show_doc = get_doc_string (self, show_doc_cst);
728   doc = get_doc_string (self, gdbpy_doc_cst);
729
730   Py_INCREF (self);
731
732   try
733     {
734       add_setshow_generic (parmclass, (enum command_class) cmdtype,
735                            cmd_name, obj,
736                            set_doc.get (), show_doc.get (),
737                            doc.get (), set_list, show_list);
738     }
739   catch (const gdb_exception &except)
740     {
741       xfree (cmd_name);
742       Py_DECREF (self);
743       gdbpy_convert_exception (except);
744       return -1;
745     }
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 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 };
This page took 0.074749 seconds and 4 git commands to generate.