[Python-checkins] cpython: Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.

martin.v.loewis python-checkins at python.org
Thu Jun 14 16:09:38 CEST 2012


http://hg.python.org/cpython/rev/6eb21c1d3099
changeset:   77427:6eb21c1d3099
user:        Martin v. Löwis <martin at v.loewis.de>
date:        Thu Jun 14 16:01:23 2012 +0200
summary:
  Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
Patch by Robin Schreiber.

files:
  Misc/NEWS               |   2 +-
  Modules/_curses_panel.c |  72 +++++++++++-----------------
  2 files changed, 30 insertions(+), 44 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,7 +21,7 @@
 Library
 -------
 
-- Issue #14936: curses_panel was converted to PEP 3121 API.
+- Issue #14936: curses_panel was converted to PEP 3121 and PEP 384 API.
   Patch by Robin Schreiber.
 
 - Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -18,12 +18,11 @@
 
 typedef struct {
     PyObject *PyCursesError;
+    PyObject *PyCursesPanel_Type;
 } _curses_panelstate;
 
 #define _curses_panelstate(o) ((_curses_panelstate *)PyModule_GetState(o))
 
-/*static PyObject *PyCursesError;*/
-
 static int
 _curses_panel_clear(PyObject *m)
 {
@@ -84,9 +83,8 @@
     PyCursesWindowObject *wo;   /* for reference counts */
 } PyCursesPanelObject;
 
-PyTypeObject PyCursesPanel_Type;
-
-#define PyCursesPanel_Check(v)   (Py_TYPE(v) == &PyCursesPanel_Type)
+#define PyCursesPanel_Check(v)  \
+ (Py_TYPE(v) == _curses_panelstate_global->PyCursesPanel_Type)
 
 /* Some helper functions. The problem is that there's always a window
    associated with a panel. To ensure that Python's GC doesn't pull
@@ -205,7 +203,8 @@
 {
     PyCursesPanelObject *po;
 
-    po = PyObject_NEW(PyCursesPanelObject, &PyCursesPanel_Type);
+    po = PyObject_NEW(PyCursesPanelObject,
+                      (PyTypeObject *)(_curses_panelstate_global)->PyCursesPanel_Type);
     if (po == NULL) return NULL;
     po->pan = pan;
     if (insert_lop(po) < 0) {
@@ -364,36 +363,18 @@
 
 /* -------------------------------------------------------*/
 
-PyTypeObject PyCursesPanel_Type = {
-    PyVarObject_HEAD_INIT(NULL, 0)
-    "_curses_panel.curses panel",       /*tp_name*/
-    sizeof(PyCursesPanelObject),        /*tp_basicsize*/
-    0,                  /*tp_itemsize*/
-    /* methods */
-    (destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/
-    0,                  /*tp_print*/
-    0,                  /*tp_getattr*/
-    0,                  /*tp_setattr*/
-    0,                  /*tp_reserved*/
-    0,                  /*tp_repr*/
-    0,                  /*tp_as_number*/
-    0,                  /*tp_as_sequence*/
-    0,                  /*tp_as_mapping*/
-    0,                  /*tp_hash*/
-    0,                  /*tp_call*/
-    0,                  /*tp_str*/
-    0,                  /*tp_getattro*/
-    0,                  /*tp_setattro*/
-    0,                  /*tp_as_buffer*/
-    Py_TPFLAGS_DEFAULT, /*tp_flags*/
-    0,                  /*tp_doc*/
-    0,                  /*tp_traverse*/
-    0,                  /*tp_clear*/
-    0,                  /*tp_richcompare*/
-    0,                  /*tp_weaklistoffset*/
-    0,                  /*tp_iter*/
-    0,                  /*tp_iternext*/
-    PyCursesPanel_Methods, /*tp_methods*/
+static PyType_Slot PyCursesPanel_Type_slots[] = {
+    {Py_tp_dealloc, PyCursesPanel_Dealloc},
+    {Py_tp_methods, PyCursesPanel_Methods},
+    {0, 0},
+};
+
+static PyType_Spec PyCursesPanel_Type_spec = {
+    "_curses_panel.curses panel",
+    sizeof(PyCursesPanelObject),
+    0,
+    Py_TPFLAGS_DEFAULT,
+    PyCursesPanel_Type_slots
 };
 
 /* Wrapper for panel_above(NULL). This function returns the bottom
@@ -510,18 +491,20 @@
 {
     PyObject *m, *d, *v;
 
-    /* Initialize object type */
-    if (PyType_Ready(&PyCursesPanel_Type) < 0)
-        return NULL;
-
-    import_curses();
-
     /* Create the module and add the functions */
     m = PyModule_Create(&_curses_panelmodule);
     if (m == NULL)
-        return NULL;
+        goto fail;
     d = PyModule_GetDict(m);
 
+    /* Initialize object type */
+    _curses_panelstate(m)->PyCursesPanel_Type = \
+        PyType_FromSpec(&PyCursesPanel_Type_spec);
+    if (_curses_panelstate(m)->PyCursesPanel_Type == NULL)
+        goto fail;
+
+    import_curses();
+
     /* For exception _curses_panel.error */
     _curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
     PyDict_SetItemString(d, "error", _curses_panelstate(m)->PyCursesError);
@@ -532,4 +515,7 @@
     PyDict_SetItemString(d, "__version__", v);
     Py_DECREF(v);
     return m;
+  fail:
+    Py_XDECREF(m);
+    return NULL;
 }

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list