Skip to content

Commit c838ec1

Browse files
committed
Issue #14936: curses_panel was converted to PEP 3121 API.
Patch by Robin Schreiber.
1 parent 474eb23 commit c838ec1

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ Core and Builtins
2121
Library
2222
-------
2323

24+
- Issue #14936: curses_panel was converted to PEP 3121 API.
25+
Patch by Robin Schreiber.
26+
2427
- Issue #1667546: On platforms supporting tm_zone and tm_gmtoff fields
2528
in struct tm, time.struct_time objects returned by time.gmtime(),
2629
time.localtime() and time.strptime() functions now have tm_zone and

Modules/_curses_panel.c

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,38 @@ static char *PyCursesVersion = "2.1";
1616

1717
#include <panel.h>
1818

19-
static PyObject *PyCursesError;
19+
typedef struct {
20+
PyObject *PyCursesError;
21+
} _curses_panelstate;
22+
23+
#define _curses_panelstate(o) ((_curses_panelstate *)PyModule_GetState(o))
24+
25+
/*static PyObject *PyCursesError;*/
26+
27+
static int
28+
_curses_panel_clear(PyObject *m)
29+
{
30+
Py_CLEAR(_curses_panelstate(m)->PyCursesError);
31+
return 0;
32+
}
33+
34+
static int
35+
_curses_panel_traverse(PyObject *m, visitproc visit, void *arg)
36+
{
37+
Py_VISIT(_curses_panelstate(m)->PyCursesError);
38+
return 0;
39+
}
40+
41+
static void
42+
_curses_panel_free(void *m)
43+
{
44+
_curses_panel_clear((PyObject *) m);
45+
}
46+
47+
static struct PyModuleDef _curses_panelmodule;
2048

49+
#define _curses_panelstate_global \
50+
((_curses_panelstate *) PyModule_GetState(PyState_FindModule(&_curses_panelmodule)))
2151

2252
/* Utility Functions */
2353

@@ -34,9 +64,9 @@ PyCursesCheckERR(int code, char *fname)
3464
return Py_None;
3565
} else {
3666
if (fname == NULL) {
37-
PyErr_SetString(PyCursesError, catchall_ERR);
67+
PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_ERR);
3868
} else {
39-
PyErr_Format(PyCursesError, "%s() returned ERR", fname);
69+
PyErr_Format(_curses_panelstate_global->PyCursesError, "%s() returned ERR", fname);
4070
}
4171
return NULL;
4272
}
@@ -280,7 +310,7 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
280310

281311
rtn = replace_panel(self->pan, temp->win);
282312
if (rtn == ERR) {
283-
PyErr_SetString(PyCursesError, "replace_panel() returned ERR");
313+
PyErr_SetString(_curses_panelstate_global->PyCursesError, "replace_panel() returned ERR");
284314
return NULL;
285315
}
286316
Py_DECREF(po->wo);
@@ -305,7 +335,7 @@ PyCursesPanel_userptr(PyCursesPanelObject *self)
305335
PyCursesInitialised;
306336
obj = (PyObject *) panel_userptr(self->pan);
307337
if (obj == NULL) {
308-
PyErr_SetString(PyCursesError, "no userptr set");
338+
PyErr_SetString(_curses_panelstate_global->PyCursesError, "no userptr set");
309339
return NULL;
310340
}
311341

@@ -405,7 +435,7 @@ PyCurses_new_panel(PyObject *self, PyObject *args)
405435
return NULL;
406436
pan = new_panel(win->win);
407437
if (pan == NULL) {
408-
PyErr_SetString(PyCursesError, catchall_NULL);
438+
PyErr_SetString(_curses_panelstate_global->PyCursesError, catchall_NULL);
409439
return NULL;
410440
}
411441
return (PyObject *)PyCursesPanel_New(pan, win);
@@ -467,12 +497,12 @@ static struct PyModuleDef _curses_panelmodule = {
467497
PyModuleDef_HEAD_INIT,
468498
"_curses_panel",
469499
NULL,
470-
-1,
500+
sizeof(_curses_panelstate),
471501
PyCurses_methods,
472502
NULL,
473-
NULL,
474-
NULL,
475-
NULL
503+
_curses_panel_traverse,
504+
_curses_panel_clear,
505+
_curses_panel_free
476506
};
477507

478508
PyMODINIT_FUNC
@@ -493,8 +523,8 @@ PyInit__curses_panel(void)
493523
d = PyModule_GetDict(m);
494524

495525
/* For exception _curses_panel.error */
496-
PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
497-
PyDict_SetItemString(d, "error", PyCursesError);
526+
_curses_panelstate(m)->PyCursesError = PyErr_NewException("_curses_panel.error", NULL, NULL);
527+
PyDict_SetItemString(d, "error", _curses_panelstate(m)->PyCursesError);
498528

499529
/* Make the version available */
500530
v = PyUnicode_FromString(PyCursesVersion);

0 commit comments

Comments
 (0)