Skip to content

bpo-46417: _curses uses PyStructSequence_NewType() #30736

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Include/internal/pycore_structseq.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,16 @@ extern PyStatus _PyStructSequence_InitState(PyInterpreterState *);

/* other API */

PyAPI_FUNC(PyTypeObject *) _PyStructSequence_NewType(
PyStructSequence_Desc *desc,
unsigned long tp_flags);

PyAPI_FUNC(int) _PyStructSequence_InitType(
PyTypeObject *type,
PyStructSequence_Desc *desc,
unsigned long tp_flags);

extern void _PyStructSequence_FiniType(PyTypeObject *type);

#ifdef __cplusplus
}
Expand Down
3 changes: 0 additions & 3 deletions Include/structseq.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ PyAPI_FUNC(void) PyStructSequence_InitType(PyTypeObject *type,
PyAPI_FUNC(int) PyStructSequence_InitType2(PyTypeObject *type,
PyStructSequence_Desc *desc);
#endif
#ifdef Py_BUILD_CORE
PyAPI_FUNC(void) _PyStructSequence_FiniType(PyTypeObject *type);
#endif
PyAPI_FUNC(PyTypeObject*) PyStructSequence_NewType(PyStructSequence_Desc *desc);

PyAPI_FUNC(PyObject *) PyStructSequence_New(PyTypeObject* type);
Expand Down
10 changes: 10 additions & 0 deletions Lib/test/pythoninfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,15 @@ def collect_time(info_add):
info_add('time.get_clock_info(%s)' % clock, clock_info)


def collect_curses(info_add):
try:
import curses
except ImportError:
return

copy_attr(info_add, 'curses.ncurses_version', curses, 'ncurses_version')


def collect_datetime(info_add):
try:
import datetime
Expand Down Expand Up @@ -752,6 +761,7 @@ def collect_info(info):

collect_builtins,
collect_cc,
collect_curses,
collect_datetime,
collect_decimal,
collect_expat,
Expand Down
22 changes: 10 additions & 12 deletions Modules/_cursesmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ static const char PyCursesVersion[] = "2.2";

#include "Python.h"
#include "pycore_long.h" // _PyLong_GetZero()
#include "pycore_structseq.h" // PyStructSequence_InitType()
#include "pycore_structseq.h" // _PyStructSequence_NewType()

#ifdef __hpux
#define STRICT_SYSV_CURSES
Expand Down Expand Up @@ -4569,8 +4569,6 @@ PyDoc_STRVAR(ncurses_version__doc__,
\n\
Ncurses version information as a named tuple.");

static PyTypeObject NcursesVersionType;

static PyStructSequence_Field ncurses_version_fields[] = {
{"major", "Major release number"},
{"minor", "Minor release number"},
Expand All @@ -4586,12 +4584,12 @@ static PyStructSequence_Desc ncurses_version_desc = {
};

static PyObject *
make_ncurses_version(void)
make_ncurses_version(PyTypeObject *type)
{
PyObject *ncurses_version;
int pos = 0;

ncurses_version = PyStructSequence_New(&NcursesVersionType);
ncurses_version = PyStructSequence_New(type);
if (ncurses_version == NULL) {
return NULL;
}
Expand Down Expand Up @@ -4796,14 +4794,14 @@ PyInit__curses(void)

#ifdef NCURSES_VERSION
/* ncurses_version */
if (NcursesVersionType.tp_name == NULL) {
if (_PyStructSequence_InitType(&NcursesVersionType,
&ncurses_version_desc,
Py_TPFLAGS_DISALLOW_INSTANTIATION) < 0) {
return NULL;
}
PyTypeObject *version_type;
version_type = _PyStructSequence_NewType(&ncurses_version_desc,
Py_TPFLAGS_DISALLOW_INSTANTIATION);
if (version_type == NULL) {
return NULL;
}
v = make_ncurses_version();
v = make_ncurses_version(version_type);
Py_DECREF(version_type);
if (v == NULL) {
return NULL;
}
Expand Down
1 change: 1 addition & 0 deletions Objects/floatobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "pycore_object.h" // _PyObject_Init()
#include "pycore_pymath.h" // _Py_ADJUST_ERANGE1()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_structseq.h" // _PyStructSequence_FiniType()

#include <ctype.h>
#include <float.h>
Expand Down
1 change: 1 addition & 0 deletions Objects/longobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "pycore_object.h" // _PyObject_InitVar()
#include "pycore_pystate.h" // _Py_IsMainInterpreter()
#include "pycore_runtime.h" // _PY_NSMALLPOSINTS
#include "pycore_structseq.h" // _PyStructSequence_FiniType()

#include <ctype.h>
#include <float.h>
Expand Down
11 changes: 9 additions & 2 deletions Objects/structseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ _PyStructSequence_FiniType(PyTypeObject *type)


PyTypeObject *
PyStructSequence_NewType(PyStructSequence_Desc *desc)
_PyStructSequence_NewType(PyStructSequence_Desc *desc, unsigned long tp_flags)
{
PyMemberDef *members;
PyTypeObject *type;
Expand Down Expand Up @@ -596,7 +596,7 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc)
spec.name = desc->name;
spec.basicsize = sizeof(PyStructSequence) - sizeof(PyObject *);
spec.itemsize = sizeof(PyObject *);
spec.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC;
spec.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | tp_flags;
spec.slots = slots;

type = (PyTypeObject *)PyType_FromSpecWithBases(&spec, (PyObject *)&PyTuple_Type);
Expand All @@ -615,6 +615,13 @@ PyStructSequence_NewType(PyStructSequence_Desc *desc)
}


PyTypeObject *
PyStructSequence_NewType(PyStructSequence_Desc *desc)
{
return _PyStructSequence_NewType(desc, 0);
}


/* runtime lifecycle */

PyStatus _PyStructSequence_InitState(PyInterpreterState *interp)
Expand Down
1 change: 1 addition & 0 deletions Python/errors.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "pycore_initconfig.h" // _PyStatus_ERR()
#include "pycore_pyerrors.h" // _PyErr_Format()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_structseq.h" // _PyStructSequence_FiniType()
#include "pycore_sysmodule.h" // _PySys_Audit()
#include "pycore_traceback.h" // _PyTraceBack_FromFrame()

Expand Down
2 changes: 1 addition & 1 deletion Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Data members:
#include "pycore_pylifecycle.h" // _PyErr_WriteUnraisableDefaultHook()
#include "pycore_pymem.h" // _PyMem_SetDefaultAllocator()
#include "pycore_pystate.h" // _PyThreadState_GET()
#include "pycore_structseq.h" // PyStructSequence_InitType()
#include "pycore_structseq.h" // _PyStructSequence_InitType()
#include "pycore_tuple.h" // _PyTuple_FromArray()

#include "code.h"
Expand Down
3 changes: 2 additions & 1 deletion Python/thread.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
Stuff shared by all thread_*.h files is collected here. */

#include "Python.h"
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_pystate.h" // _PyInterpreterState_GET()
#include "pycore_structseq.h" // _PyStructSequence_FiniType()

#ifndef _POSIX_THREADS
/* This means pthreads are not implemented in libc headers, hence the macro
Expand Down