gdb/testsuite/tui: Introduce check_box_contents
[deliverable/binutils-gdb.git] / gdb / python / py-param.c
index b8eb447efc7416a9d3947cc19a91e5ec29a8db28..7b183cfa553c71bbd767937018e722138608f86d 100644 (file)
@@ -1,6 +1,6 @@
 /* GDB parameters implemented in Python
 
-   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2008-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
 #include "defs.h"
 #include "value.h"
-#include "exceptions.h"
 #include "python-internal.h"
 #include "charset.h"
 #include "gdbcmd.h"
 #include "cli/cli-decode.h"
 #include "completer.h"
+#include "language.h"
+#include "arch-utils.h"
 
 /* Parameter constants and their values.  */
 struct parm_constant
 {
-  char *name;
+  const char *name;
   int value;
 };
 
@@ -45,6 +46,8 @@ struct parm_constant parm_constants[] =
   { "PARAM_OPTIONAL_FILENAME", var_optional_filename },
   { "PARAM_FILENAME", var_filename },
   { "PARAM_ZINTEGER", var_zinteger },
+  { "PARAM_ZUINTEGER", var_zuinteger },
+  { "PARAM_ZUINTEGER_UNLIMITED", var_zuinteger_unlimited },
   { "PARAM_ENUM", var_enum },
   { NULL, 0 }
 };
@@ -52,7 +55,10 @@ struct parm_constant parm_constants[] =
 /* A union that can hold anything described by enum var_types.  */
 union parmpy_variable
 {
-  /* Hold an integer value, for boolean and integer types.  */
+  /* Hold a boolean value.  */
+  bool boolval;
+
+  /* Hold an integer value.  */
   int intval;
 
   /* Hold an auto_boolean.  */
@@ -87,7 +93,8 @@ struct parmpy_object
 
 typedef struct parmpy_object parmpy_object;
 
-static PyTypeObject parmpy_object_type;
+extern PyTypeObject parmpy_object_type
+    CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("parmpy_object");
 
 /* Some handy string constants.  */
 static PyObject *set_doc_cst;
@@ -100,7 +107,11 @@ static PyObject *
 get_attr (PyObject *obj, PyObject *attr_name)
 {
   if (PyString_Check (attr_name)
+#ifdef IS_PY3K
+      && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
+#else
       && ! strcmp (PyString_AsString (attr_name), "value"))
+#endif
     {
       parmpy_object *self = (parmpy_object *) obj;
 
@@ -127,7 +138,7 @@ set_parameter_value (parmpy_object *self, PyObject *value)
          && (self->type == var_filename
              || value != Py_None))
        {
-         PyErr_SetString (PyExc_RuntimeError, 
+         PyErr_SetString (PyExc_RuntimeError,
                           _("String required for filename."));
 
          return -1;
@@ -142,36 +153,34 @@ set_parameter_value (parmpy_object *self, PyObject *value)
        }
       else
        {
-         char *string;
-
-         string = python_string_to_host_string (value);
+         gdb::unique_xmalloc_ptr<char>
+           string (python_string_to_host_string (value));
          if (string == NULL)
            return -1;
 
          xfree (self->value.stringval);
-         self->value.stringval = string;
+         self->value.stringval = string.release ();
        }
       break;
 
     case var_enum:
       {
        int i;
-       char *str;
 
        if (! gdbpy_is_string (value))
          {
-           PyErr_SetString (PyExc_RuntimeError, 
+           PyErr_SetString (PyExc_RuntimeError,
                             _("ENUM arguments must be a string."));
            return -1;
          }
 
-       str = python_string_to_host_string (value);
+       gdb::unique_xmalloc_ptr<char>
+         str (python_string_to_host_string (value));
        if (str == NULL)
          return -1;
        for (i = 0; self->enumeration[i]; ++i)
-         if (! strcmp (self->enumeration[i], str))
+         if (! strcmp (self->enumeration[i], str.get ()))
            break;
-       xfree (str);
        if (! self->enumeration[i])
          {
            PyErr_SetString (PyExc_RuntimeError,
@@ -185,14 +194,14 @@ set_parameter_value (parmpy_object *self, PyObject *value)
     case var_boolean:
       if (! PyBool_Check (value))
        {
-         PyErr_SetString (PyExc_RuntimeError, 
+         PyErr_SetString (PyExc_RuntimeError,
                           _("A boolean argument is required."));
          return -1;
        }
       cmp = PyObject_IsTrue (value);
-      if (cmp < 0) 
+      if (cmp < 0)
          return -1;
-      self->value.intval = cmp;
+      self->value.boolval = cmp;
       break;
 
     case var_auto_boolean:
@@ -209,58 +218,77 @@ set_parameter_value (parmpy_object *self, PyObject *value)
        {
          cmp = PyObject_IsTrue (value);
          if (cmp < 0 )
-           return -1;    
+           return -1;  
          if (cmp == 1)
            self->value.autoboolval = AUTO_BOOLEAN_TRUE;
-         else 
+         else
            self->value.autoboolval = AUTO_BOOLEAN_FALSE;
-
-         break;
        }
+      break;
 
     case var_integer:
     case var_zinteger:
     case var_uinteger:
+    case var_zuinteger:
+    case var_zuinteger_unlimited:
       {
        long l;
        int ok;
 
        if (! PyInt_Check (value))
          {
-           PyErr_SetString (PyExc_RuntimeError, 
+           PyErr_SetString (PyExc_RuntimeError,
                             _("The value must be integer."));
            return -1;
          }
 
-       l = PyInt_AsLong (value);
-       if (self->type == var_uinteger)
+       if (! gdb_py_int_as_long (value, &l))
+         return -1;
+
+       switch (self->type)
          {
-           ok = (l >= 0 && l <= UINT_MAX);
+         case var_uinteger:
            if (l == 0)
              l = UINT_MAX;
-         }
-       else if (self->type == var_integer)
-         {
+           /* Fall through.  */
+         case var_zuinteger:
+           ok = (l >= 0 && l <= UINT_MAX);
+           break;
+
+         case var_zuinteger_unlimited:
+           ok = (l >= -1 && l <= INT_MAX);
+           break;
+
+         case var_integer:
            ok = (l >= INT_MIN && l <= INT_MAX);
            if (l == 0)
              l = INT_MAX;
+           break;
+
+         case var_zinteger:
+           ok = (l >= INT_MIN && l <= INT_MAX);
+           break;
+
+         default:
+           gdb_assert_not_reached ("unknown var_ constant");
          }
-       else
-         ok = (l >= INT_MIN && l <= INT_MAX);
 
        if (! ok)
          {
-           PyErr_SetString (PyExc_RuntimeError, 
+           PyErr_SetString (PyExc_RuntimeError,
                             _("Range exceeded."));
            return -1;
          }
 
-       self->value.intval = (int) l;
+       if (self->type == var_uinteger || self->type == var_zuinteger)
+         self->value.uintval = (unsigned) l;
+       else
+         self->value.intval = (int) l;
        break;
       }
 
     default:
-      PyErr_SetString (PyExc_RuntimeError, 
+      PyErr_SetString (PyExc_RuntimeError,
                       _("Unhandled type in parameter value."));
       return -1;
     }
@@ -273,7 +301,11 @@ static int
 set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
 {
   if (PyString_Check (attr_name)
+#ifdef IS_PY3K
+      && ! PyUnicode_CompareWithASCIIString (attr_name, "value"))
+#else
       && ! strcmp (PyString_AsString (attr_name), "value"))
+#endif
     {
       if (!val)
        {
@@ -287,85 +319,264 @@ set_attr (PyObject *obj, PyObject *attr_name, PyObject *val)
   return PyObject_GenericSetAttr (obj, attr_name, val);
 }
 
+/* A helper function which returns a documentation string for an
+   object. */
+
+static gdb::unique_xmalloc_ptr<char>
+get_doc_string (PyObject *object, PyObject *attr)
+{
+  gdb::unique_xmalloc_ptr<char> result;
+
+  if (PyObject_HasAttr (object, attr))
+    {
+      gdbpy_ref<> ds_obj (PyObject_GetAttr (object, attr));
+
+      if (ds_obj != NULL && gdbpy_is_string (ds_obj.get ()))
+       {
+         result = python_string_to_host_string (ds_obj.get ());
+         if (result == NULL)
+           gdbpy_print_stack ();
+       }
+    }
+  if (! result)
+    result.reset (xstrdup (_("This command is not documented.")));
+  return result;
+}
+
+/* Helper function which will execute a METHOD in OBJ passing the
+   argument ARG.  ARG can be NULL.  METHOD should return a Python
+   string.  If this function returns NULL, there has been an error and
+   the appropriate exception set.  */
+static gdb::unique_xmalloc_ptr<char>
+call_doc_function (PyObject *obj, PyObject *method, PyObject *arg)
+{
+  gdb::unique_xmalloc_ptr<char> data;
+  gdbpy_ref<> result (PyObject_CallMethodObjArgs (obj, method, arg, NULL));
+
+  if (result == NULL)
+    return NULL;
+
+  if (gdbpy_is_string (result.get ()))
+    {
+      data = python_string_to_host_string (result.get ());
+      if (! data)
+       return NULL;
+    }
+  else
+    {
+      PyErr_SetString (PyExc_RuntimeError,
+                      _("Parameter must return a string value."));
+      return NULL;
+    }
+
+  return data;
+}
+
+/* A callback function that is registered against the respective
+   add_setshow_* set_doc prototype.  This function will either call
+   the Python function "get_set_string" or extract the Python
+   attribute "set_doc" and return the contents as a string.  If
+   neither exist, insert a string indicating the Parameter is not
+   documented.  */
+static void
+get_set_value (const char *args, int from_tty,
+              struct cmd_list_element *c)
+{
+  PyObject *obj = (PyObject *) get_cmd_context (c);
+  gdb::unique_xmalloc_ptr<char> set_doc_string;
+
+  gdbpy_enter enter_py (get_current_arch (), current_language);
+  gdbpy_ref<> set_doc_func (PyString_FromString ("get_set_string"));
+
+  if (set_doc_func == NULL)
+    {
+      gdbpy_print_stack ();
+      return;
+    }
+
+  if (PyObject_HasAttr (obj, set_doc_func.get ()))
+    {
+      set_doc_string = call_doc_function (obj, set_doc_func.get (), NULL);
+      if (! set_doc_string)
+       gdbpy_handle_exception ();
+    }
+
+  const char *str = set_doc_string.get ();
+  if (str != nullptr && str[0] != '\0')
+    fprintf_filtered (gdb_stdout, "%s\n", str);
+}
+
+/* A callback function that is registered against the respective
+   add_setshow_* show_doc prototype.  This function will either call
+   the Python function "get_show_string" or extract the Python
+   attribute "show_doc" and return the contents as a string.  If
+   neither exist, insert a string indicating the Parameter is not
+   documented.  */
+static void
+get_show_value (struct ui_file *file, int from_tty,
+               struct cmd_list_element *c,
+               const char *value)
+{
+  PyObject *obj = (PyObject *) get_cmd_context (c);
+  gdb::unique_xmalloc_ptr<char> show_doc_string;
+
+  gdbpy_enter enter_py (get_current_arch (), current_language);
+  gdbpy_ref<> show_doc_func (PyString_FromString ("get_show_string"));
+
+  if (show_doc_func == NULL)
+    {
+      gdbpy_print_stack ();
+      return;
+    }
+
+  if (PyObject_HasAttr (obj, show_doc_func.get ()))
+    {
+      gdbpy_ref<> val_obj (PyString_FromString (value));
+
+      if (val_obj == NULL)
+       {
+         gdbpy_print_stack ();
+         return;
+       }
+
+      show_doc_string = call_doc_function (obj, show_doc_func.get (),
+                                          val_obj.get ());
+      if (! show_doc_string)
+       {
+         gdbpy_print_stack ();
+         return;
+       }
+
+      fprintf_filtered (file, "%s\n", show_doc_string.get ());
+    }
+  else
+    {
+      /* We have to preserve the existing < GDB 7.3 API.  If a
+        callback function does not exist, then attempt to read the
+        show_doc attribute.  */
+      show_doc_string  = get_doc_string (obj, show_doc_cst);
+      fprintf_filtered (file, "%s %s\n", show_doc_string.get (), value);
+    }
+}
 \f
 
 /* A helper function that dispatches to the appropriate add_setshow
    function.  */
 static void
 add_setshow_generic (int parmclass, enum command_class cmdclass,
-                    char *cmd_name, parmpy_object *self,
-                    char *set_doc, char *show_doc, char *help_doc,
+                    const char *cmd_name, parmpy_object *self,
+                    const char *set_doc, const char *show_doc,
+                    const char *help_doc,
                     struct cmd_list_element **set_list,
                     struct cmd_list_element **show_list)
 {
+  struct cmd_list_element *param = NULL;
+  const char *tmp_name = NULL;
+
   switch (parmclass)
     {
     case var_boolean:
-      add_setshow_boolean_cmd (cmd_name, cmdclass, &self->value.intval,
-                              set_doc, show_doc, help_doc,
-                              NULL, NULL, set_list, show_list);
+
+      add_setshow_boolean_cmd (cmd_name, cmdclass,
+                              &self->value.boolval, set_doc, show_doc,
+                              help_doc, get_set_value, get_show_value,
+                              set_list, show_list);
+
       break;
 
     case var_auto_boolean:
       add_setshow_auto_boolean_cmd (cmd_name, cmdclass,
                                    &self->value.autoboolval,
                                    set_doc, show_doc, help_doc,
-                                   NULL, NULL, set_list, show_list);
+                                   get_set_value, get_show_value,
+                                   set_list, show_list);
       break;
 
     case var_uinteger:
-      add_setshow_uinteger_cmd (cmd_name, cmdclass, &self->value.uintval,
-                               set_doc, show_doc, help_doc,
-                               NULL, NULL, set_list, show_list);
+      add_setshow_uinteger_cmd (cmd_name, cmdclass,
+                               &self->value.uintval, set_doc, show_doc,
+                               help_doc, get_set_value, get_show_value,
+                               set_list, show_list);
       break;
 
     case var_integer:
-      add_setshow_integer_cmd (cmd_name, cmdclass, &self->value.intval,
-                              set_doc, show_doc, help_doc,
-                              NULL, NULL, set_list, show_list);
-      break;
+      add_setshow_integer_cmd (cmd_name, cmdclass,
+                              &self->value.intval, set_doc, show_doc,
+                              help_doc, get_set_value, get_show_value,
+                              set_list, show_list); break;
 
     case var_string:
-      add_setshow_string_cmd (cmd_name, cmdclass, &self->value.stringval,
-                             set_doc, show_doc, help_doc,
-                             NULL, NULL, set_list, show_list);
-      break;
+      add_setshow_string_cmd (cmd_name, cmdclass,
+                             &self->value.stringval, set_doc, show_doc,
+                             help_doc, get_set_value, get_show_value,
+                             set_list, show_list); break;
 
     case var_string_noescape:
       add_setshow_string_noescape_cmd (cmd_name, cmdclass,
                                       &self->value.stringval,
                                       set_doc, show_doc, help_doc,
-                                      NULL, NULL, set_list, show_list);
+                                      get_set_value, get_show_value,
+                                      set_list, show_list);
+
       break;
 
     case var_optional_filename:
       add_setshow_optional_filename_cmd (cmd_name, cmdclass,
-                                        &self->value.stringval,
-                                        set_doc, show_doc, help_doc,
-                                        NULL, NULL, set_list, show_list);
+                                        &self->value.stringval, set_doc,
+                                        show_doc, help_doc, get_set_value,
+                                        get_show_value, set_list,
+                                        show_list);
       break;
 
     case var_filename:
-      add_setshow_filename_cmd (cmd_name, cmdclass, &self->value.stringval,
-                               set_doc, show_doc, help_doc,
-                               NULL, NULL, set_list, show_list);
-      break;
+      add_setshow_filename_cmd (cmd_name, cmdclass,
+                               &self->value.stringval, set_doc, show_doc,
+                               help_doc, get_set_value, get_show_value,
+                               set_list, show_list); break;
 
     case var_zinteger:
-      add_setshow_zinteger_cmd (cmd_name, cmdclass, &self->value.intval,
-                               set_doc, show_doc, help_doc,
-                               NULL, NULL, set_list, show_list);
+      add_setshow_zinteger_cmd (cmd_name, cmdclass,
+                               &self->value.intval, set_doc, show_doc,
+                               help_doc, get_set_value, get_show_value,
+                               set_list, show_list);
+      break;
+
+    case var_zuinteger:
+      add_setshow_zuinteger_cmd (cmd_name, cmdclass,
+                               &self->value.uintval, set_doc, show_doc,
+                               help_doc, get_set_value, get_show_value,
+                               set_list, show_list);
+      break;
+
+    case var_zuinteger_unlimited:
+      add_setshow_zuinteger_unlimited_cmd (cmd_name, cmdclass,
+                                          &self->value.intval, set_doc,
+                                          show_doc, help_doc, get_set_value,
+                                          get_show_value,
+                                          set_list, show_list);
       break;
 
     case var_enum:
       add_setshow_enum_cmd (cmd_name, cmdclass, self->enumeration,
-                           &self->value.cstringval,
-                           set_doc, show_doc, help_doc,
-                           NULL, NULL, set_list, show_list);
+                           &self->value.cstringval, set_doc, show_doc,
+                           help_doc, get_set_value, get_show_value,
+                           set_list, show_list);
       /* Initialize the value, just in case.  */
       self->value.cstringval = self->enumeration[0];
       break;
     }
+
+  /* Lookup created parameter, and register Python object against the
+     parameter context.  Perform this task against both lists.  */
+  tmp_name = cmd_name;
+  param = lookup_cmd (&tmp_name, *show_list, "", 0, 1);
+  if (param)
+    set_cmd_context (param, self);
+
+  tmp_name = cmd_name;
+  param = lookup_cmd (&tmp_name, *set_list, "", 0, 1);
+  if (param)
+    set_cmd_context (param, self);
 }
 
 /* A helper which computes enum values.  Returns 1 on success.  Returns 0 on
@@ -374,7 +585,6 @@ static int
 compute_enum_values (parmpy_object *self, PyObject *enum_values)
 {
   Py_ssize_t size, i;
-  struct cleanup *back_to;
 
   if (! enum_values)
     {
@@ -385,7 +595,7 @@ compute_enum_values (parmpy_object *self, PyObject *enum_values)
 
   if (! PySequence_Check (enum_values))
     {
-      PyErr_SetString (PyExc_RuntimeError, 
+      PyErr_SetString (PyExc_RuntimeError,
                       _("The enumeration is not a sequence."));
       return 0;
     }
@@ -395,67 +605,35 @@ compute_enum_values (parmpy_object *self, PyObject *enum_values)
     return 0;
   if (size == 0)
     {
-      PyErr_SetString (PyExc_RuntimeError, 
+      PyErr_SetString (PyExc_RuntimeError,
                       _("The enumeration is empty."));
       return 0;
     }
 
-  self->enumeration = xmalloc ((size + 1) * sizeof (char *));
-  back_to = make_cleanup (free_current_contents, &self->enumeration);
-  memset (self->enumeration, 0, (size + 1) * sizeof (char *));
+  gdb_argv holder (XCNEWVEC (char *, size + 1));
+  char **enumeration = holder.get ();
 
   for (i = 0; i < size; ++i)
     {
-      PyObject *item = PySequence_GetItem (enum_values, i);
+      gdbpy_ref<> item (PySequence_GetItem (enum_values, i));
 
-      if (! item)
+      if (item == NULL)
+       return 0;
+      if (! gdbpy_is_string (item.get ()))
        {
-         do_cleanups (back_to);
-         return 0;
-       }
-      if (! gdbpy_is_string (item))
-       {
-         do_cleanups (back_to);
-         PyErr_SetString (PyExc_RuntimeError, 
+         PyErr_SetString (PyExc_RuntimeError,
                           _("The enumeration item not a string."));
          return 0;
        }
-      self->enumeration[i] = python_string_to_host_string (item);
-      if (self->enumeration[i] == NULL)
-       {
-         do_cleanups (back_to);
-         return 0;
-       }
-      make_cleanup (xfree, (char *) self->enumeration[i]);
+      enumeration[i] = python_string_to_host_string (item.get ()).release ();
+      if (enumeration[i] == NULL)
+       return 0;
     }
 
-  discard_cleanups (back_to);
+  self->enumeration = const_cast<const char**> (holder.release ());
   return 1;
 }
 
-/* A helper function which returns a documentation string for an
-   object.  */
-static char *
-get_doc_string (PyObject *object, PyObject *attr)
-{
-  char *result = NULL;
-
-  if (PyObject_HasAttr (object, attr))
-    {
-      PyObject *ds_obj = PyObject_GetAttr (object, attr);
-
-      if (ds_obj && gdbpy_is_string (ds_obj))
-       {
-         result = python_string_to_host_string (ds_obj);
-         if (result == NULL)
-           gdbpy_print_stack ();
-       }
-    }
-  if (! result)
-    result = xstrdup (_("This command is not documented."));
-  return result;
-}
-
 /* Object initializer; sets up gdb-side structures for command.
 
    Use: __init__(NAME, CMDCLASS, PARMCLASS, [ENUM])
@@ -483,13 +661,12 @@ static int
 parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
 {
   parmpy_object *obj = (parmpy_object *) self;
-  char *name;
-  char *set_doc, *show_doc, *doc;
+  const char *name;
+  gdb::unique_xmalloc_ptr<char> set_doc, show_doc, doc;
   char *cmd_name;
   int parmclass, cmdtype;
   PyObject *enum_values = NULL;
   struct cmd_list_element **set_list, **show_list;
-  volatile struct gdb_exception except;
 
   if (! PyArg_ParseTuple (args, "sii|O", &name, &cmdtype, &parmclass,
                          &enum_values))
@@ -511,9 +688,11 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
       && parmclass != var_uinteger && parmclass != var_integer
       && parmclass != var_string && parmclass != var_string_noescape
       && parmclass != var_optional_filename && parmclass != var_filename
-      && parmclass != var_zinteger && parmclass != var_enum)
+      && parmclass != var_zinteger && parmclass != var_zuinteger
+      && parmclass != var_zuinteger_unlimited && parmclass != var_enum)
     {
-      PyErr_SetString (PyExc_RuntimeError, _("Invalid parameter class argument."));
+      PyErr_SetString (PyExc_RuntimeError,
+                      _("Invalid parameter class argument."));
       return -1;
     }
 
@@ -550,65 +729,60 @@ parmpy_init (PyObject *self, PyObject *args, PyObject *kwds)
 
   Py_INCREF (self);
 
-  TRY_CATCH (except, RETURN_MASK_ALL)
+  try
     {
       add_setshow_generic (parmclass, (enum command_class) cmdtype,
                           cmd_name, obj,
-                          set_doc, show_doc,
-                          doc, set_list, show_list);
+                          set_doc.get (), show_doc.get (),
+                          doc.get (), set_list, show_list);
     }
-  if (except.reason < 0)
+  catch (const gdb_exception &except)
     {
       xfree (cmd_name);
-      xfree (set_doc);
-      xfree (show_doc);
-      xfree (doc);
       Py_DECREF (self);
-      PyErr_Format (except.reason == RETURN_QUIT
-                   ? PyExc_KeyboardInterrupt : PyExc_RuntimeError,
-                   "%s", except.message);
+      gdbpy_convert_exception (except);
       return -1;
     }
+
   return 0;
 }
 
 \f
 
 /* Initialize the 'parameters' module.  */
-void
+int
 gdbpy_initialize_parameters (void)
 {
   int i;
 
+  parmpy_object_type.tp_new = PyType_GenericNew;
   if (PyType_Ready (&parmpy_object_type) < 0)
-    return;
+    return -1;
 
   set_doc_cst = PyString_FromString ("set_doc");
   if (! set_doc_cst)
-    return;
+    return -1;
   show_doc_cst = PyString_FromString ("show_doc");
   if (! show_doc_cst)
-    return;
+    return -1;
 
   for (i = 0; parm_constants[i].name; ++i)
     {
       if (PyModule_AddIntConstant (gdb_module,
                                   parm_constants[i].name,
                                   parm_constants[i].value) < 0)
-       return;
+       return -1;
     }
 
-  Py_INCREF (&parmpy_object_type);
-  PyModule_AddObject (gdb_module, "Parameter",
-                     (PyObject *) &parmpy_object_type);
+  return gdb_pymodule_addobject (gdb_module, "Parameter",
+                                (PyObject *) &parmpy_object_type);
 }
 
 \f
 
-static PyTypeObject parmpy_object_type =
+PyTypeObject parmpy_object_type =
 {
-  PyObject_HEAD_INIT (NULL)
-  0,                             /*ob_size*/
+  PyVarObject_HEAD_INIT (NULL, 0)
   "gdb.Parameter",               /*tp_name*/
   sizeof (parmpy_object),        /*tp_basicsize*/
   0,                             /*tp_itemsize*/
@@ -645,5 +819,4 @@ static PyTypeObject parmpy_object_type =
   0,                             /* tp_dictoffset */
   parmpy_init,                   /* tp_init */
   0,                             /* tp_alloc */
-  PyType_GenericNew              /* tp_new */
 };
This page took 0.032592 seconds and 4 git commands to generate.