summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Setup2
-rw-r--r--Modules/_asynciomodule.c9
-rw-r--r--Modules/_bisectmodule.c14
-rw-r--r--Modules/_codecsmodule.c42
-rw-r--r--Modules/_datetimemodule.c12
-rw-r--r--Modules/_posixsubprocess.c16
-rw-r--r--Modules/_sqlite/cache.c137
-rw-r--r--Modules/_sqlite/cache.h6
-rw-r--r--Modules/_sqlite/connection.c84
-rw-r--r--Modules/_sqlite/connection.h4
-rw-r--r--Modules/_sqlite/cursor.c78
-rw-r--r--Modules/_sqlite/cursor.h4
-rw-r--r--Modules/_sqlite/microprotocols.c13
-rw-r--r--Modules/_sqlite/microprotocols.h2
-rw-r--r--Modules/_sqlite/module.c234
-rw-r--r--Modules/_sqlite/prepare_protocol.c69
-rw-r--r--Modules/_sqlite/prepare_protocol.h4
-rw-r--r--Modules/_sqlite/row.c96
-rw-r--r--Modules/_sqlite/row.h4
-rw-r--r--Modules/_sqlite/statement.c75
-rw-r--r--Modules/_sqlite/statement.h4
-rw-r--r--Modules/_testcapimodule.c23
-rw-r--r--Modules/_tracemalloc.c2
-rw-r--r--Modules/clinic/_codecsmodule.c.h50
-rw-r--r--Modules/clinic/fcntlmodule.c.h10
-rw-r--r--Modules/clinic/posixmodule.c.h10
-rw-r--r--Modules/clinic/selectmodule.c.h20
-rw-r--r--Modules/clinic/termios.c.h225
-rw-r--r--Modules/fcntlmodule.c28
-rw-r--r--Modules/mathmodule.c2
-rw-r--r--Modules/posixmodule.c64
-rw-r--r--Modules/selectmodule.c19
-rw-r--r--Modules/termios.c212
-rw-r--r--Modules/unicodedata.c161
34 files changed, 856 insertions, 879 deletions
diff --git a/Modules/Setup b/Modules/Setup
index 470bf6bc2e..87f3a7cb43 100644
--- a/Modules/Setup
+++ b/Modules/Setup
@@ -226,7 +226,7 @@ _symtable symtablemodule.c
#termios termios.c # Steen Lumholt's termios module
#resource resource.c # Jeremy Hylton's rlimit interface
-#_posixsubprocess _posixsubprocess.c # POSIX subprocess module helper
+#_posixsubprocess -DPy_BUILD_CORE_BUILTIN _posixsubprocess.c # POSIX subprocess module helper
# Multimedia modules -- off by default.
# These don't work for 64-bit platforms!!!
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 2151f20281..f01e5884c6 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -16,7 +16,6 @@ _Py_IDENTIFIER(add_done_callback);
_Py_IDENTIFIER(call_soon);
_Py_IDENTIFIER(cancel);
_Py_IDENTIFIER(get_event_loop);
-_Py_IDENTIFIER(send);
_Py_IDENTIFIER(throw);
@@ -2695,13 +2694,7 @@ task_step_impl(TaskObj *task, PyObject *exc)
int gen_status = PYGEN_ERROR;
if (exc == NULL) {
- if (PyGen_CheckExact(coro) || PyCoro_CheckExact(coro)) {
- gen_status = PyGen_Send((PyGenObject*)coro, Py_None, &result);
- }
- else {
- result = _PyObject_CallMethodIdOneArg(coro, &PyId_send, Py_None);
- gen_status = gen_status_from_result(&result);
- }
+ gen_status = PyIter_Send(coro, Py_None, &result);
}
else {
result = _PyObject_CallMethodIdOneArg(coro, &PyId_throw, exc);
diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c
index 82d800d9a8..277e9755f2 100644
--- a/Modules/_bisectmodule.c
+++ b/Modules/_bisectmodule.c
@@ -237,18 +237,14 @@ common approach.\n");
static struct PyModuleDef _bisectmodule = {
PyModuleDef_HEAD_INIT,
- "_bisect",
- module_doc,
- -1,
- bisect_methods,
- NULL,
- NULL,
- NULL,
- NULL
+ .m_name = "_bisect",
+ .m_doc = module_doc,
+ .m_methods = bisect_methods,
+ .m_size = 0
};
PyMODINIT_FUNC
PyInit__bisect(void)
{
- return PyModule_Create(&_bisectmodule);
+ return PyModuleDef_Init(&_bisectmodule);
}
diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c
index 952072102d..2e8cb97fe7 100644
--- a/Modules/_codecsmodule.c
+++ b/Modules/_codecsmodule.c
@@ -69,6 +69,27 @@ _codecs_register(PyObject *module, PyObject *search_function)
}
/*[clinic input]
+_codecs.unregister
+ search_function: object
+ /
+
+Unregister a codec search function and clear the registry's cache.
+
+If the search function is not registered, do nothing.
+[clinic start generated code]*/
+
+static PyObject *
+_codecs_unregister(PyObject *module, PyObject *search_function)
+/*[clinic end generated code: output=1f0edee9cf246399 input=dd7c004c652d345e]*/
+{
+ if (PyCodec_Unregister(search_function) < 0) {
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
+/*[clinic input]
_codecs.lookup
encoding: str
/
@@ -139,25 +160,6 @@ _codecs_decode_impl(PyObject *module, PyObject *obj, const char *encoding,
/* --- Helpers ------------------------------------------------------------ */
-/*[clinic input]
-_codecs._forget_codec
-
- encoding: str
- /
-
-Purge the named codec from the internal codec lookup cache
-[clinic start generated code]*/
-
-static PyObject *
-_codecs__forget_codec_impl(PyObject *module, const char *encoding)
-/*[clinic end generated code: output=0bde9f0a5b084aa2 input=18d5d92d0e386c38]*/
-{
- if (_PyCodec_Forget(encoding) < 0) {
- return NULL;
- };
- Py_RETURN_NONE;
-}
-
static
PyObject *codec_tuple(PyObject *decoded,
Py_ssize_t len)
@@ -992,6 +994,7 @@ _codecs_lookup_error_impl(PyObject *module, const char *name)
static PyMethodDef _codecs_functions[] = {
_CODECS_REGISTER_METHODDEF
+ _CODECS_UNREGISTER_METHODDEF
_CODECS_LOOKUP_METHODDEF
_CODECS_ENCODE_METHODDEF
_CODECS_DECODE_METHODDEF
@@ -1035,7 +1038,6 @@ static PyMethodDef _codecs_functions[] = {
_CODECS_CODE_PAGE_DECODE_METHODDEF
_CODECS_REGISTER_ERROR_METHODDEF
_CODECS_LOOKUP_ERROR_METHODDEF
- _CODECS__FORGET_CODEC_METHODDEF
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 0631272429..94868717e6 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -4663,7 +4663,10 @@ static PyMethodDef time_methods[] = {
{"isoformat", (PyCFunction)(void(*)(void))time_isoformat, METH_VARARGS | METH_KEYWORDS,
PyDoc_STR("Return string in ISO 8601 format, [HH[:MM[:SS[.mmm[uuu]]]]]"
"[+HH:MM].\n\n"
- "timespec specifies what components of the time to include.\n")},
+ "The optional argument timespec specifies the number "
+ "of additional terms\nof the time to include. Valid "
+ "options are 'auto', 'hours', 'minutes',\n'seconds', "
+ "'milliseconds' and 'microseconds'.\n")},
{"strftime", (PyCFunction)(void(*)(void))time_strftime, METH_VARARGS | METH_KEYWORDS,
PyDoc_STR("format -> strftime() style string.")},
@@ -6370,9 +6373,10 @@ static PyMethodDef datetime_methods[] = {
"YYYY-MM-DDT[HH[:MM[:SS[.mmm[uuu]]]]][+HH:MM].\n"
"sep is used to separate the year from the time, and "
"defaults to 'T'.\n"
- "timespec specifies what components of the time to include"
- " (allowed values are 'auto', 'hours', 'minutes', 'seconds',"
- " 'milliseconds', and 'microseconds').\n")},
+ "The optional argument timespec specifies the number "
+ "of additional terms\nof the time to include. Valid "
+ "options are 'auto', 'hours', 'minutes',\n'seconds', "
+ "'milliseconds' and 'microseconds'.\n")},
{"utcoffset", (PyCFunction)datetime_utcoffset, METH_NOARGS,
PyDoc_STR("Return self.tzinfo.utcoffset(self).")},
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index 5d1691ace4..d08c47980e 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -1,5 +1,6 @@
/* Authors: Gregory P. Smith & Jeffrey Yasskin */
#include "Python.h"
+#include "pycore_fileutils.h"
#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE)
# define _GNU_SOURCE
#endif
@@ -250,7 +251,6 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
long end_fd = safe_get_max_fd();
Py_ssize_t num_fds_to_keep = PyTuple_GET_SIZE(py_fds_to_keep);
Py_ssize_t keep_seq_idx;
- int fd_num;
/* As py_fds_to_keep is sorted we can loop through the list closing
* fds in between any in the keep list falling within our range. */
for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
@@ -258,21 +258,11 @@ _close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
int keep_fd = PyLong_AsLong(py_keep_fd);
if (keep_fd < start_fd)
continue;
- for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
- close(fd_num);
- }
+ _Py_closerange(start_fd, keep_fd - 1);
start_fd = keep_fd + 1;
}
if (start_fd <= end_fd) {
-#if defined(__FreeBSD__)
- /* Any errors encountered while closing file descriptors are ignored */
- closefrom(start_fd);
-#else
- for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
- /* Ignore errors */
- (void)close(fd_num);
- }
-#endif
+ _Py_closerange(start_fd, end_fd);
}
}
diff --git a/Modules/_sqlite/cache.c b/Modules/_sqlite/cache.c
index 758fc022f7..0b02be4f0b 100644
--- a/Modules/_sqlite/cache.c
+++ b/Modules/_sqlite/cache.c
@@ -29,7 +29,7 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data)
{
pysqlite_Node* node;
- node = (pysqlite_Node*) (pysqlite_NodeType.tp_alloc(&pysqlite_NodeType, 0));
+ node = (pysqlite_Node*) (pysqlite_NodeType->tp_alloc(pysqlite_NodeType, 0));
if (!node) {
return NULL;
}
@@ -48,10 +48,13 @@ pysqlite_Node* pysqlite_new_node(PyObject* key, PyObject* data)
void pysqlite_node_dealloc(pysqlite_Node* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_DECREF(self->key);
Py_DECREF(self->data);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs)
@@ -88,6 +91,7 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs)
void pysqlite_cache_dealloc(pysqlite_Cache* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
pysqlite_Node* node;
pysqlite_Node* delete_node;
@@ -109,7 +113,8 @@ void pysqlite_cache_dealloc(pysqlite_Cache* self)
}
Py_DECREF(self->mapping);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* key)
@@ -253,6 +258,20 @@ PyObject* pysqlite_cache_display(pysqlite_Cache* self, PyObject* args)
Py_RETURN_NONE;
}
+static PyType_Slot pysqlite_NodeType_slots[] = {
+ {Py_tp_dealloc, pysqlite_node_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {0, NULL},
+};
+
+static PyType_Spec pysqlite_NodeType_spec = {
+ .name = MODULE_NAME ".Node",
+ .basicsize = sizeof(pysqlite_Node),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = pysqlite_NodeType_slots,
+};
+PyTypeObject *pysqlite_NodeType = NULL;
+
static PyMethodDef cache_methods[] = {
{"get", (PyCFunction)pysqlite_cache_get, METH_O,
PyDoc_STR("Gets an entry from the cache or calls the factory function to produce one.")},
@@ -261,102 +280,32 @@ static PyMethodDef cache_methods[] = {
{NULL, NULL}
};
-PyTypeObject pysqlite_NodeType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME "Node", /* tp_name */
- sizeof(pysqlite_Node), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_node_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 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|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot pysqlite_CacheType_slots[] = {
+ {Py_tp_dealloc, pysqlite_cache_dealloc},
+ {Py_tp_methods, cache_methods},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_cache_init},
+ {0, NULL},
};
-PyTypeObject pysqlite_CacheType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Cache", /* tp_name */
- sizeof(pysqlite_Cache), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_cache_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 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|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- cache_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_cache_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Spec pysqlite_CacheType_spec = {
+ .name = MODULE_NAME ".Cache",
+ .basicsize = sizeof(pysqlite_Cache),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = pysqlite_CacheType_slots,
};
+PyTypeObject *pysqlite_CacheType = NULL;
-extern int pysqlite_cache_setup_types(void)
+extern int pysqlite_cache_setup_types(PyObject *mod)
{
- int rc;
-
- pysqlite_NodeType.tp_new = PyType_GenericNew;
- pysqlite_CacheType.tp_new = PyType_GenericNew;
-
- rc = PyType_Ready(&pysqlite_NodeType);
- if (rc < 0) {
- return rc;
+ pysqlite_NodeType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_NodeType_spec, NULL);
+ if (pysqlite_NodeType == NULL) {
+ return -1;
}
- rc = PyType_Ready(&pysqlite_CacheType);
- return rc;
+ pysqlite_CacheType = (PyTypeObject *)PyType_FromModuleAndSpec(mod, &pysqlite_CacheType_spec, NULL);
+ if (pysqlite_CacheType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/cache.h b/Modules/_sqlite/cache.h
index 529010967c..0afdf7f09b 100644
--- a/Modules/_sqlite/cache.h
+++ b/Modules/_sqlite/cache.h
@@ -59,8 +59,8 @@ typedef struct
int decref_factory;
} pysqlite_Cache;
-extern PyTypeObject pysqlite_NodeType;
-extern PyTypeObject pysqlite_CacheType;
+extern PyTypeObject *pysqlite_NodeType;
+extern PyTypeObject *pysqlite_CacheType;
int pysqlite_node_init(pysqlite_Node* self, PyObject* args, PyObject* kwargs);
void pysqlite_node_dealloc(pysqlite_Node* self);
@@ -69,6 +69,6 @@ int pysqlite_cache_init(pysqlite_Cache* self, PyObject* args, PyObject* kwargs);
void pysqlite_cache_dealloc(pysqlite_Cache* self);
PyObject* pysqlite_cache_get(pysqlite_Cache* self, PyObject* args);
-int pysqlite_cache_setup_types(void);
+int pysqlite_cache_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c
index 81fc133537..69203f85e0 100644
--- a/Modules/_sqlite/connection.c
+++ b/Modules/_sqlite/connection.c
@@ -133,7 +133,7 @@ int pysqlite_connection_init(pysqlite_Connection* self, PyObject* args, PyObject
}
Py_DECREF(isolation_level);
- self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)&pysqlite_CacheType, "Oi", self, cached_statements);
+ self->statement_cache = (pysqlite_Cache*)PyObject_CallFunction((PyObject*)pysqlite_CacheType, "Oi", self, cached_statements);
if (PyErr_Occurred()) {
return -1;
}
@@ -220,6 +220,8 @@ void pysqlite_do_all_statements(pysqlite_Connection* self, int action, int reset
void pysqlite_connection_dealloc(pysqlite_Connection* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_XDECREF(self->statement_cache);
/* Clean up if user has not called .close() explicitly. */
@@ -236,7 +238,9 @@ void pysqlite_connection_dealloc(pysqlite_Connection* self)
Py_XDECREF(self->collations);
Py_XDECREF(self->statements);
Py_XDECREF(self->cursors);
- Py_TYPE(self)->tp_free((PyObject*)self);
+
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
/*
@@ -281,13 +285,13 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,
}
if (factory == NULL) {
- factory = (PyObject*)&pysqlite_CursorType;
+ factory = (PyObject*)pysqlite_CursorType;
}
cursor = PyObject_CallOneArg(factory, (PyObject *)self);
if (cursor == NULL)
return NULL;
- if (!PyObject_TypeCheck(cursor, &pysqlite_CursorType)) {
+ if (!PyObject_TypeCheck(cursor, pysqlite_CursorType)) {
PyErr_Format(PyExc_TypeError,
"factory must return a cursor, not %.100s",
Py_TYPE(cursor)->tp_name);
@@ -1234,7 +1238,7 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py
_pysqlite_drop_unused_statement_references(self);
- statement = PyObject_New(pysqlite_Statement, &pysqlite_StatementType);
+ statement = PyObject_New(pysqlite_Statement, pysqlite_StatementType);
if (!statement) {
return NULL;
}
@@ -1494,7 +1498,7 @@ pysqlite_connection_backup(pysqlite_Connection *self, PyObject *args, PyObject *
static char *keywords[] = {"target", "pages", "progress", "name", "sleep", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O!|$iOsO:backup", keywords,
- &pysqlite_ConnectionType, &target,
+ pysqlite_ConnectionType, &target,
&pages, &progress, &name, &sleep_obj)) {
return NULL;
}
@@ -1831,50 +1835,32 @@ static struct PyMemberDef connection_members[] =
{NULL}
};
-PyTypeObject pysqlite_ConnectionType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Connection", /* tp_name */
- sizeof(pysqlite_Connection), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_connection_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- (ternaryfunc)pysqlite_connection_call, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- connection_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- connection_methods, /* tp_methods */
- connection_members, /* tp_members */
- connection_getset, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_connection_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot connection_slots[] = {
+ {Py_tp_dealloc, pysqlite_connection_dealloc},
+ {Py_tp_doc, (void *)connection_doc},
+ {Py_tp_methods, connection_methods},
+ {Py_tp_members, connection_members},
+ {Py_tp_getset, connection_getset},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_connection_init},
+ {Py_tp_call, pysqlite_connection_call},
+ {0, NULL},
+};
+
+static PyType_Spec connection_spec = {
+ .name = MODULE_NAME ".Connection",
+ .basicsize = sizeof(pysqlite_Connection),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = connection_slots,
};
-extern int pysqlite_connection_setup_types(void)
+PyTypeObject *pysqlite_ConnectionType = NULL;
+
+extern int pysqlite_connection_setup_types(PyObject *module)
{
- pysqlite_ConnectionType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_ConnectionType);
+ pysqlite_ConnectionType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &connection_spec, NULL);
+ if (pysqlite_ConnectionType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h
index 206085e00a..aadf439034 100644
--- a/Modules/_sqlite/connection.h
+++ b/Modules/_sqlite/connection.h
@@ -106,7 +106,7 @@ typedef struct
PyObject* NotSupportedError;
} pysqlite_Connection;
-extern PyTypeObject pysqlite_ConnectionType;
+extern PyTypeObject *pysqlite_ConnectionType;
PyObject* pysqlite_connection_alloc(PyTypeObject* type, int aware);
void pysqlite_connection_dealloc(pysqlite_Connection* self);
@@ -122,6 +122,6 @@ int pysqlite_connection_register_cursor(pysqlite_Connection* connection, PyObjec
int pysqlite_check_thread(pysqlite_Connection* self);
int pysqlite_check_connection(pysqlite_Connection* con);
-int pysqlite_connection_setup_types(void);
+int pysqlite_connection_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 5cfb4b97d6..3c09c1c6b7 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -33,7 +33,7 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject*
{
pysqlite_Connection* connection;
- if (!PyArg_ParseTuple(args, "O!", &pysqlite_ConnectionType, &connection))
+ if (!PyArg_ParseTuple(args, "O!", pysqlite_ConnectionType, &connection))
{
return -1;
}
@@ -74,6 +74,8 @@ static int pysqlite_cursor_init(pysqlite_Cursor* self, PyObject* args, PyObject*
static void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
/* Reset the statement if the user has not closed the cursor */
if (self->statement) {
pysqlite_statement_reset(self->statement);
@@ -91,7 +93,8 @@ static void pysqlite_cursor_dealloc(pysqlite_Cursor* self)
PyObject_ClearWeakRefs((PyObject*)self);
}
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -472,7 +475,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args)
if (self->statement->in_use) {
Py_SETREF(self->statement,
- PyObject_New(pysqlite_Statement, &pysqlite_StatementType));
+ PyObject_New(pysqlite_Statement, pysqlite_StatementType));
if (!self->statement) {
goto error;
}
@@ -898,56 +901,39 @@ static struct PyMemberDef cursor_members[] =
{"lastrowid", T_OBJECT, offsetof(pysqlite_Cursor, lastrowid), READONLY},
{"rowcount", T_LONG, offsetof(pysqlite_Cursor, rowcount), READONLY},
{"row_factory", T_OBJECT, offsetof(pysqlite_Cursor, row_factory), 0},
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Cursor, in_weakreflist), READONLY},
{NULL}
};
static const char cursor_doc[] =
PyDoc_STR("SQLite database cursor class.");
-PyTypeObject pysqlite_CursorType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Cursor", /* tp_name */
- sizeof(pysqlite_Cursor), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_cursor_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 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|Py_TPFLAGS_BASETYPE, /* tp_flags */
- cursor_doc, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- offsetof(pysqlite_Cursor, in_weakreflist), /* tp_weaklistoffset */
- PyObject_SelfIter, /* tp_iter */
- (iternextfunc)pysqlite_cursor_iternext, /* tp_iternext */
- cursor_methods, /* tp_methods */
- cursor_members, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_cursor_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot cursor_slots[] = {
+ {Py_tp_dealloc, pysqlite_cursor_dealloc},
+ {Py_tp_doc, (void *)cursor_doc},
+ {Py_tp_iter, PyObject_SelfIter},
+ {Py_tp_iternext, pysqlite_cursor_iternext},
+ {Py_tp_methods, cursor_methods},
+ {Py_tp_members, cursor_members},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_cursor_init},
+ {0, NULL},
+};
+
+static PyType_Spec cursor_spec = {
+ .name = MODULE_NAME ".Cursor",
+ .basicsize = sizeof(pysqlite_Cursor),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = cursor_slots,
};
-extern int pysqlite_cursor_setup_types(void)
+PyTypeObject *pysqlite_CursorType = NULL;
+
+extern int pysqlite_cursor_setup_types(PyObject *module)
{
- pysqlite_CursorType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_CursorType);
+ pysqlite_CursorType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &cursor_spec, NULL);
+ if (pysqlite_CursorType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h
index 4a20e756f7..3e6cde167f 100644
--- a/Modules/_sqlite/cursor.h
+++ b/Modules/_sqlite/cursor.h
@@ -52,7 +52,7 @@ typedef struct
PyObject* in_weakreflist; /* List of weak references */
} pysqlite_Cursor;
-extern PyTypeObject pysqlite_CursorType;
+extern PyTypeObject *pysqlite_CursorType;
PyObject* pysqlite_cursor_execute(pysqlite_Cursor* self, PyObject* args);
PyObject* pysqlite_cursor_executemany(pysqlite_Cursor* self, PyObject* args);
@@ -64,7 +64,7 @@ PyObject* pysqlite_cursor_fetchall(pysqlite_Cursor* self, PyObject* args);
PyObject* pysqlite_noop(pysqlite_Connection* self, PyObject* args);
PyObject* pysqlite_cursor_close(pysqlite_Cursor* self, PyObject* args);
-int pysqlite_cursor_setup_types(void);
+int pysqlite_cursor_setup_types(PyObject *module);
#define UNKNOWN (-1)
#endif
diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c
index 3b2d7f42b8..ddc30e8a89 100644
--- a/Modules/_sqlite/microprotocols.c
+++ b/Modules/_sqlite/microprotocols.c
@@ -37,14 +37,19 @@ static PyObject *psyco_adapters = NULL;
/* pysqlite_microprotocols_init - initialize the adapters dictionary */
int
-pysqlite_microprotocols_init(PyObject *dict)
+pysqlite_microprotocols_init(PyObject *module)
{
/* create adapters dictionary and put it in module namespace */
if ((psyco_adapters = PyDict_New()) == NULL) {
return -1;
}
- return PyDict_SetItemString(dict, "adapters", psyco_adapters);
+ if (PyModule_AddObject(module, "adapters", psyco_adapters) < 0) {
+ Py_DECREF(psyco_adapters);
+ return -1;
+ }
+
+ return 0;
}
@@ -56,7 +61,7 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
PyObject* key;
int rc;
- if (proto == NULL) proto = (PyObject*)&pysqlite_PrepareProtocolType;
+ if (proto == NULL) proto = (PyObject*)pysqlite_PrepareProtocolType;
key = Py_BuildValue("(OO)", (PyObject*)type, proto);
if (!key) {
@@ -152,7 +157,7 @@ PyObject *
pysqlite_adapt(pysqlite_Cursor *self, PyObject *args)
{
PyObject *obj, *alt = NULL;
- PyObject *proto = (PyObject*)&pysqlite_PrepareProtocolType;
+ PyObject *proto = (PyObject*)pysqlite_PrepareProtocolType;
if (!PyArg_ParseTuple(args, "O|OO", &obj, &proto, &alt)) return NULL;
return pysqlite_microprotocols_adapt(obj, proto, alt);
diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h
index 5418c2b98f..87df6bac55 100644
--- a/Modules/_sqlite/microprotocols.h
+++ b/Modules/_sqlite/microprotocols.h
@@ -38,7 +38,7 @@
/** exported functions **/
/* used by module.c to init the microprotocols system */
-extern int pysqlite_microprotocols_init(PyObject *dict);
+extern int pysqlite_microprotocols_init(PyObject *module);
extern int pysqlite_microprotocols_add(
PyTypeObject *type, PyObject *proto, PyObject *cast);
extern PyObject *pysqlite_microprotocols_adapt(
diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c
index 82f58eb248..0297e2fab2 100644
--- a/Modules/_sqlite/module.c
+++ b/Modules/_sqlite/module.c
@@ -82,7 +82,7 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
}
if (factory == NULL) {
- factory = (PyObject*)&pysqlite_ConnectionType;
+ factory = (PyObject*)pysqlite_ConnectionType;
}
if (PySys_Audit("sqlite3.connect", "O", database) < 0) {
@@ -176,7 +176,7 @@ static PyObject* module_register_adapter(PyObject* self, PyObject* args)
pysqlite_BaseTypeAdapted = 1;
}
- rc = pysqlite_microprotocols_add(type, (PyObject*)&pysqlite_PrepareProtocolType, caster);
+ rc = pysqlite_microprotocols_add(type, (PyObject*)pysqlite_PrepareProtocolType, caster);
if (rc == -1)
return NULL;
@@ -236,14 +236,17 @@ PyDoc_STRVAR(enable_callback_tracebacks_doc,
\n\
Enable or disable callback functions throwing errors to stderr.");
-static void converters_init(PyObject* dict)
+static void converters_init(PyObject* module)
{
_pysqlite_converters = PyDict_New();
if (!_pysqlite_converters) {
return;
}
- PyDict_SetItemString(dict, "converters", _pysqlite_converters);
+ if (PyModule_AddObject(module, "converters", _pysqlite_converters) < 0) {
+ Py_DECREF(_pysqlite_converters);
+ }
+ return;
}
static PyMethodDef module_methods[] = {
@@ -264,59 +267,52 @@ static PyMethodDef module_methods[] = {
{NULL, NULL}
};
-struct _IntConstantPair {
- const char *constant_name;
- int constant_value;
-};
-
-typedef struct _IntConstantPair IntConstantPair;
-
-static const IntConstantPair _int_constants[] = {
- {"PARSE_DECLTYPES", PARSE_DECLTYPES},
- {"PARSE_COLNAMES", PARSE_COLNAMES},
-
- {"SQLITE_OK", SQLITE_OK},
- {"SQLITE_DENY", SQLITE_DENY},
- {"SQLITE_IGNORE", SQLITE_IGNORE},
- {"SQLITE_CREATE_INDEX", SQLITE_CREATE_INDEX},
- {"SQLITE_CREATE_TABLE", SQLITE_CREATE_TABLE},
- {"SQLITE_CREATE_TEMP_INDEX", SQLITE_CREATE_TEMP_INDEX},
- {"SQLITE_CREATE_TEMP_TABLE", SQLITE_CREATE_TEMP_TABLE},
- {"SQLITE_CREATE_TEMP_TRIGGER", SQLITE_CREATE_TEMP_TRIGGER},
- {"SQLITE_CREATE_TEMP_VIEW", SQLITE_CREATE_TEMP_VIEW},
- {"SQLITE_CREATE_TRIGGER", SQLITE_CREATE_TRIGGER},
- {"SQLITE_CREATE_VIEW", SQLITE_CREATE_VIEW},
- {"SQLITE_DELETE", SQLITE_DELETE},
- {"SQLITE_DROP_INDEX", SQLITE_DROP_INDEX},
- {"SQLITE_DROP_TABLE", SQLITE_DROP_TABLE},
- {"SQLITE_DROP_TEMP_INDEX", SQLITE_DROP_TEMP_INDEX},
- {"SQLITE_DROP_TEMP_TABLE", SQLITE_DROP_TEMP_TABLE},
- {"SQLITE_DROP_TEMP_TRIGGER", SQLITE_DROP_TEMP_TRIGGER},
- {"SQLITE_DROP_TEMP_VIEW", SQLITE_DROP_TEMP_VIEW},
- {"SQLITE_DROP_TRIGGER", SQLITE_DROP_TRIGGER},
- {"SQLITE_DROP_VIEW", SQLITE_DROP_VIEW},
- {"SQLITE_INSERT", SQLITE_INSERT},
- {"SQLITE_PRAGMA", SQLITE_PRAGMA},
- {"SQLITE_READ", SQLITE_READ},
- {"SQLITE_SELECT", SQLITE_SELECT},
- {"SQLITE_TRANSACTION", SQLITE_TRANSACTION},
- {"SQLITE_UPDATE", SQLITE_UPDATE},
- {"SQLITE_ATTACH", SQLITE_ATTACH},
- {"SQLITE_DETACH", SQLITE_DETACH},
- {"SQLITE_ALTER_TABLE", SQLITE_ALTER_TABLE},
- {"SQLITE_REINDEX", SQLITE_REINDEX},
- {"SQLITE_ANALYZE", SQLITE_ANALYZE},
- {"SQLITE_CREATE_VTABLE", SQLITE_CREATE_VTABLE},
- {"SQLITE_DROP_VTABLE", SQLITE_DROP_VTABLE},
- {"SQLITE_FUNCTION", SQLITE_FUNCTION},
- {"SQLITE_SAVEPOINT", SQLITE_SAVEPOINT},
+static int add_integer_constants(PyObject *module) {
+ int ret = 0;
+
+ ret += PyModule_AddIntMacro(module, PARSE_DECLTYPES);
+ ret += PyModule_AddIntMacro(module, PARSE_COLNAMES);
+ ret += PyModule_AddIntMacro(module, SQLITE_OK);
+ ret += PyModule_AddIntMacro(module, SQLITE_DENY);
+ ret += PyModule_AddIntMacro(module, SQLITE_IGNORE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TEMP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_DELETE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_INDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TEMP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_TRIGGER);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_VIEW);
+ ret += PyModule_AddIntMacro(module, SQLITE_INSERT);
+ ret += PyModule_AddIntMacro(module, SQLITE_PRAGMA);
+ ret += PyModule_AddIntMacro(module, SQLITE_READ);
+ ret += PyModule_AddIntMacro(module, SQLITE_SELECT);
+ ret += PyModule_AddIntMacro(module, SQLITE_TRANSACTION);
+ ret += PyModule_AddIntMacro(module, SQLITE_UPDATE);
+ ret += PyModule_AddIntMacro(module, SQLITE_ATTACH);
+ ret += PyModule_AddIntMacro(module, SQLITE_DETACH);
+ ret += PyModule_AddIntMacro(module, SQLITE_ALTER_TABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_REINDEX);
+ ret += PyModule_AddIntMacro(module, SQLITE_ANALYZE);
+ ret += PyModule_AddIntMacro(module, SQLITE_CREATE_VTABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_DROP_VTABLE);
+ ret += PyModule_AddIntMacro(module, SQLITE_FUNCTION);
+ ret += PyModule_AddIntMacro(module, SQLITE_SAVEPOINT);
#if SQLITE_VERSION_NUMBER >= 3008003
- {"SQLITE_RECURSIVE", SQLITE_RECURSIVE},
+ ret += PyModule_AddIntMacro(module, SQLITE_RECURSIVE);
#endif
- {"SQLITE_DONE", SQLITE_DONE},
- {(char*)NULL, 0}
-};
-
+ ret += PyModule_AddIntMacro(module, SQLITE_DONE);
+ return ret;
+}
static struct PyModuleDef _sqlite3module = {
PyModuleDef_HEAD_INIT,
@@ -338,11 +334,21 @@ do { \
} \
} while (0)
+#define ADD_EXCEPTION(module, name, exc, base) \
+do { \
+ exc = PyErr_NewException(MODULE_NAME "." name, base, NULL); \
+ if (!exc) { \
+ goto error; \
+ } \
+ if (PyModule_AddObject(module, name, exc) < 0) { \
+ Py_DECREF(exc); \
+ goto error; \
+ } \
+} while (0)
+
PyMODINIT_FUNC PyInit__sqlite3(void)
{
- PyObject *module, *dict;
- PyObject *tmp_obj;
- int i;
+ PyObject *module;
if (sqlite3_libversion_number() < 3007003) {
PyErr_SetString(PyExc_ImportError, MODULE_NAME ": SQLite 3.7.3 or higher required");
@@ -352,81 +358,37 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
module = PyModule_Create(&_sqlite3module);
if (!module ||
- (pysqlite_row_setup_types() < 0) ||
- (pysqlite_cursor_setup_types() < 0) ||
- (pysqlite_connection_setup_types() < 0) ||
- (pysqlite_cache_setup_types() < 0) ||
- (pysqlite_statement_setup_types() < 0) ||
- (pysqlite_prepare_protocol_setup_types() < 0)
+ (pysqlite_row_setup_types(module) < 0) ||
+ (pysqlite_cursor_setup_types(module) < 0) ||
+ (pysqlite_connection_setup_types(module) < 0) ||
+ (pysqlite_cache_setup_types(module) < 0) ||
+ (pysqlite_statement_setup_types(module) < 0) ||
+ (pysqlite_prepare_protocol_setup_types(module) < 0)
) {
Py_XDECREF(module);
return NULL;
}
- ADD_TYPE(module, pysqlite_ConnectionType);
- ADD_TYPE(module, pysqlite_CursorType);
- ADD_TYPE(module, pysqlite_PrepareProtocolType);
- ADD_TYPE(module, pysqlite_RowType);
-
- if (!(dict = PyModule_GetDict(module))) {
- goto error;
- }
+ ADD_TYPE(module, *pysqlite_ConnectionType);
+ ADD_TYPE(module, *pysqlite_CursorType);
+ ADD_TYPE(module, *pysqlite_PrepareProtocolType);
+ ADD_TYPE(module, *pysqlite_RowType);
/*** Create DB-API Exception hierarchy */
-
- if (!(pysqlite_Error = PyErr_NewException(MODULE_NAME ".Error", PyExc_Exception, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "Error", pysqlite_Error);
-
- if (!(pysqlite_Warning = PyErr_NewException(MODULE_NAME ".Warning", PyExc_Exception, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "Warning", pysqlite_Warning);
+ ADD_EXCEPTION(module, "Error", pysqlite_Error, PyExc_Exception);
+ ADD_EXCEPTION(module, "Warning", pysqlite_Warning, PyExc_Exception);
/* Error subclasses */
-
- if (!(pysqlite_InterfaceError = PyErr_NewException(MODULE_NAME ".InterfaceError", pysqlite_Error, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "InterfaceError", pysqlite_InterfaceError);
-
- if (!(pysqlite_DatabaseError = PyErr_NewException(MODULE_NAME ".DatabaseError", pysqlite_Error, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "DatabaseError", pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "InterfaceError", pysqlite_InterfaceError, pysqlite_Error);
+ ADD_EXCEPTION(module, "DatabaseError", pysqlite_DatabaseError, pysqlite_Error);
/* pysqlite_DatabaseError subclasses */
-
- if (!(pysqlite_InternalError = PyErr_NewException(MODULE_NAME ".InternalError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "InternalError", pysqlite_InternalError);
-
- if (!(pysqlite_OperationalError = PyErr_NewException(MODULE_NAME ".OperationalError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "OperationalError", pysqlite_OperationalError);
-
- if (!(pysqlite_ProgrammingError = PyErr_NewException(MODULE_NAME ".ProgrammingError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "ProgrammingError", pysqlite_ProgrammingError);
-
- if (!(pysqlite_IntegrityError = PyErr_NewException(MODULE_NAME ".IntegrityError", pysqlite_DatabaseError,NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "IntegrityError", pysqlite_IntegrityError);
-
- if (!(pysqlite_DataError = PyErr_NewException(MODULE_NAME ".DataError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "DataError", pysqlite_DataError);
-
- if (!(pysqlite_NotSupportedError = PyErr_NewException(MODULE_NAME ".NotSupportedError", pysqlite_DatabaseError, NULL))) {
- goto error;
- }
- PyDict_SetItemString(dict, "NotSupportedError", pysqlite_NotSupportedError);
+ ADD_EXCEPTION(module, "InternalError", pysqlite_InternalError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "OperationalError", pysqlite_OperationalError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "ProgrammingError", pysqlite_ProgrammingError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "IntegrityError", pysqlite_IntegrityError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "DataError", pysqlite_DataError, pysqlite_DatabaseError);
+ ADD_EXCEPTION(module, "NotSupportedError", pysqlite_NotSupportedError, pysqlite_DatabaseError);
/* In Python 2.x, setting Connection.text_factory to
OptimizedUnicode caused Unicode objects to be returned for
@@ -434,35 +396,31 @@ PyMODINIT_FUNC PyInit__sqlite3(void)
Now OptimizedUnicode is an alias for str, so it has no
effect. */
Py_INCREF((PyObject*)&PyUnicode_Type);
- PyDict_SetItemString(dict, "OptimizedUnicode", (PyObject*)&PyUnicode_Type);
+ if (PyModule_AddObject(module, "OptimizedUnicode", (PyObject*)&PyUnicode_Type) < 0) {
+ Py_DECREF((PyObject*)&PyUnicode_Type);
+ goto error;
+ }
/* Set integer constants */
- for (i = 0; _int_constants[i].constant_name != NULL; i++) {
- tmp_obj = PyLong_FromLong(_int_constants[i].constant_value);
- if (!tmp_obj) {
- goto error;
- }
- PyDict_SetItemString(dict, _int_constants[i].constant_name, tmp_obj);
- Py_DECREF(tmp_obj);
+ if (add_integer_constants(module) < 0) {
+ goto error;
}
- if (!(tmp_obj = PyUnicode_FromString(PYSQLITE_VERSION))) {
+ if (PyModule_AddStringConstant(module, "version", PYSQLITE_VERSION) < 0) {
goto error;
}
- PyDict_SetItemString(dict, "version", tmp_obj);
- Py_DECREF(tmp_obj);
- if (!(tmp_obj = PyUnicode_FromString(sqlite3_libversion()))) {
+ if (PyModule_AddStringConstant(module, "sqlite_version", sqlite3_libversion())) {
goto error;
}
- PyDict_SetItemString(dict, "sqlite_version", tmp_obj);
- Py_DECREF(tmp_obj);
/* initialize microprotocols layer */
- pysqlite_microprotocols_init(dict);
+ if (pysqlite_microprotocols_init(module) < 0) {
+ goto error;
+ }
/* initialize the default converters */
- converters_init(dict);
+ converters_init(module);
error:
if (PyErr_Occurred())
diff --git a/Modules/_sqlite/prepare_protocol.c b/Modules/_sqlite/prepare_protocol.c
index 05a2ca5a65..089d66b981 100644
--- a/Modules/_sqlite/prepare_protocol.c
+++ b/Modules/_sqlite/prepare_protocol.c
@@ -30,54 +30,33 @@ int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* arg
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self)
{
- Py_TYPE(self)->tp_free((PyObject*)self);
+ PyTypeObject *tp = Py_TYPE(self);
+
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
-PyTypeObject pysqlite_PrepareProtocolType= {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".PrepareProtocol", /* tp_name */
- sizeof(pysqlite_PrepareProtocol), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_prepare_protocol_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 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 */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)pysqlite_prepare_protocol_init, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Slot type_slots[] = {
+ {Py_tp_dealloc, pysqlite_prepare_protocol_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {Py_tp_init, pysqlite_prepare_protocol_init},
+ {0, NULL},
+};
+
+static PyType_Spec type_spec = {
+ .name = MODULE_NAME ".PrepareProtocol",
+ .basicsize = sizeof(pysqlite_PrepareProtocol),
+ .flags = Py_TPFLAGS_DEFAULT,
+ .slots = type_slots,
};
-extern int pysqlite_prepare_protocol_setup_types(void)
+PyTypeObject *pysqlite_PrepareProtocolType = NULL;
+
+extern int pysqlite_prepare_protocol_setup_types(PyObject *module)
{
- pysqlite_PrepareProtocolType.tp_new = PyType_GenericNew;
- Py_SET_TYPE(&pysqlite_PrepareProtocolType, &PyType_Type);
- return PyType_Ready(&pysqlite_PrepareProtocolType);
+ pysqlite_PrepareProtocolType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &type_spec, NULL);
+ if (pysqlite_PrepareProtocolType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h
index 3998a55e51..d0f717c754 100644
--- a/Modules/_sqlite/prepare_protocol.h
+++ b/Modules/_sqlite/prepare_protocol.h
@@ -31,12 +31,12 @@ typedef struct
PyObject_HEAD
} pysqlite_PrepareProtocol;
-extern PyTypeObject pysqlite_PrepareProtocolType;
+extern PyTypeObject *pysqlite_PrepareProtocolType;
int pysqlite_prepare_protocol_init(pysqlite_PrepareProtocol* self, PyObject* args, PyObject* kwargs);
void pysqlite_prepare_protocol_dealloc(pysqlite_PrepareProtocol* self);
-int pysqlite_prepare_protocol_setup_types(void);
+int pysqlite_prepare_protocol_setup_types(PyObject *module);
#define UNKNOWN (-1)
#endif
diff --git a/Modules/_sqlite/row.c b/Modules/_sqlite/row.c
index 4b47108278..76b6f04f0c 100644
--- a/Modules/_sqlite/row.c
+++ b/Modules/_sqlite/row.c
@@ -26,10 +26,13 @@
void pysqlite_row_dealloc(pysqlite_Row* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
Py_XDECREF(self->data);
Py_XDECREF(self->description);
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
static PyObject *
@@ -46,7 +49,7 @@ pysqlite_row_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
if (!PyArg_ParseTuple(args, "OO", &cursor, &data))
return NULL;
- if (!PyObject_TypeCheck((PyObject*)cursor, &pysqlite_CursorType)) {
+ if (!PyObject_TypeCheck((PyObject*)cursor, pysqlite_CursorType)) {
PyErr_SetString(PyExc_TypeError, "instance of cursor required for first argument");
return NULL;
}
@@ -192,7 +195,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
if (opid != Py_EQ && opid != Py_NE)
Py_RETURN_NOTIMPLEMENTED;
- if (PyObject_TypeCheck(_other, &pysqlite_RowType)) {
+ if (PyObject_TypeCheck(_other, pysqlite_RowType)) {
pysqlite_Row *other = (pysqlite_Row *)_other;
int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);
if (eq < 0) {
@@ -206,73 +209,40 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
Py_RETURN_NOTIMPLEMENTED;
}
-PyMappingMethods pysqlite_row_as_mapping = {
- /* mp_length */ (lenfunc)pysqlite_row_length,
- /* mp_subscript */ (binaryfunc)pysqlite_row_subscript,
- /* mp_ass_subscript */ (objobjargproc)0,
-};
-
-static PySequenceMethods pysqlite_row_as_sequence = {
- /* sq_length */ (lenfunc)pysqlite_row_length,
- /* sq_concat */ 0,
- /* sq_repeat */ 0,
- /* sq_item */ (ssizeargfunc)pysqlite_row_item,
-};
-
-
-static PyMethodDef pysqlite_row_methods[] = {
+static PyMethodDef row_methods[] = {
{"keys", (PyCFunction)pysqlite_row_keys, METH_NOARGS,
PyDoc_STR("Returns the keys of the row.")},
{NULL, NULL}
};
+static PyType_Slot row_slots[] = {
+ {Py_tp_dealloc, pysqlite_row_dealloc},
+ {Py_tp_hash, pysqlite_row_hash},
+ {Py_tp_methods, row_methods},
+ {Py_tp_richcompare, pysqlite_row_richcompare},
+ {Py_tp_iter, pysqlite_iter},
+ {Py_mp_length, pysqlite_row_length},
+ {Py_mp_subscript, pysqlite_row_subscript},
+ {Py_sq_length, pysqlite_row_length},
+ {Py_sq_item, pysqlite_row_item},
+ {Py_tp_new, pysqlite_row_new},
+ {0, NULL},
+};
-PyTypeObject pysqlite_RowType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Row", /* tp_name */
- sizeof(pysqlite_Row), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_row_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)pysqlite_row_hash, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
- 0, /* tp_doc */
- (traverseproc)0, /* tp_traverse */
- 0, /* tp_clear */
- (richcmpfunc)pysqlite_row_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)pysqlite_iter, /* tp_iter */
- 0, /* tp_iternext */
- pysqlite_row_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyType_Spec row_spec = {
+ .name = MODULE_NAME ".Row",
+ .basicsize = sizeof(pysqlite_Row),
+ .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+ .slots = row_slots,
};
-extern int pysqlite_row_setup_types(void)
+PyTypeObject *pysqlite_RowType = NULL;
+
+extern int pysqlite_row_setup_types(PyObject *module)
{
- pysqlite_RowType.tp_new = pysqlite_row_new;
- pysqlite_RowType.tp_as_mapping = &pysqlite_row_as_mapping;
- pysqlite_RowType.tp_as_sequence = &pysqlite_row_as_sequence;
- return PyType_Ready(&pysqlite_RowType);
+ pysqlite_RowType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &row_spec, NULL);
+ if (pysqlite_RowType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h
index 4ad506f8dd..2dac41e89e 100644
--- a/Modules/_sqlite/row.h
+++ b/Modules/_sqlite/row.h
@@ -33,8 +33,8 @@ typedef struct _Row
PyObject* description;
} pysqlite_Row;
-extern PyTypeObject pysqlite_RowType;
+extern PyTypeObject *pysqlite_RowType;
-int pysqlite_row_setup_types(void);
+int pysqlite_row_setup_types(PyObject *module);
#endif
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index 02e47a02b7..4682d286c5 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -255,7 +255,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
if (!_need_adapt(current_param)) {
adapted = current_param;
} else {
- adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param);
+ adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param);
Py_DECREF(current_param);
if (!adapted) {
return;
@@ -306,7 +306,7 @@ void pysqlite_statement_bind_parameters(pysqlite_Statement* self, PyObject* para
if (!_need_adapt(current_param)) {
adapted = current_param;
} else {
- adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)&pysqlite_PrepareProtocolType, current_param);
+ adapted = pysqlite_microprotocols_adapt(current_param, (PyObject*)pysqlite_PrepareProtocolType, current_param);
Py_DECREF(current_param);
if (!adapted) {
return;
@@ -371,6 +371,8 @@ void pysqlite_statement_mark_dirty(pysqlite_Statement* self)
void pysqlite_statement_dealloc(pysqlite_Statement* self)
{
+ PyTypeObject *tp = Py_TYPE(self);
+
if (self->st) {
Py_BEGIN_ALLOW_THREADS
sqlite3_finalize(self->st);
@@ -385,7 +387,8 @@ void pysqlite_statement_dealloc(pysqlite_Statement* self)
PyObject_ClearWeakRefs((PyObject*)self);
}
- Py_TYPE(self)->tp_free((PyObject*)self);
+ tp->tp_free(self);
+ Py_DECREF(tp);
}
/*
@@ -458,50 +461,30 @@ static int pysqlite_check_remaining_sql(const char* tail)
return 0;
}
-PyTypeObject pysqlite_StatementType = {
- PyVarObject_HEAD_INIT(NULL, 0)
- MODULE_NAME ".Statement", /* tp_name */
- sizeof(pysqlite_Statement), /* tp_basicsize */
- 0, /* tp_itemsize */
- (destructor)pysqlite_statement_dealloc, /* tp_dealloc */
- 0, /* tp_vectorcall_offset */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_as_async */
- 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 */
- offsetof(pysqlite_Statement, in_weakreflist), /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0 /* tp_free */
+static PyMemberDef stmt_members[] = {
+ {"__weaklistoffset__", T_PYSSIZET, offsetof(pysqlite_Statement, in_weakreflist), READONLY},
+ {NULL},
+};
+static PyType_Slot stmt_slots[] = {
+ {Py_tp_members, stmt_members},
+ {Py_tp_dealloc, pysqlite_statement_dealloc},
+ {Py_tp_new, PyType_GenericNew},
+ {0, NULL},
+};
+
+static PyType_Spec stmt_spec = {
+ .name = MODULE_NAME ".Statement",
+ .basicsize = sizeof(pysqlite_Statement),
+ .flags = Py_TPFLAGS_DEFAULT,
+ .slots = stmt_slots,
};
+PyTypeObject *pysqlite_StatementType = NULL;
-extern int pysqlite_statement_setup_types(void)
+extern int pysqlite_statement_setup_types(PyObject *module)
{
- pysqlite_StatementType.tp_new = PyType_GenericNew;
- return PyType_Ready(&pysqlite_StatementType);
+ pysqlite_StatementType = (PyTypeObject *)PyType_FromModuleAndSpec(module, &stmt_spec, NULL);
+ if (pysqlite_StatementType == NULL) {
+ return -1;
+ }
+ return 0;
}
diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h
index 5002f02dc5..b426036002 100644
--- a/Modules/_sqlite/statement.h
+++ b/Modules/_sqlite/statement.h
@@ -43,7 +43,7 @@ typedef struct
PyObject* in_weakreflist; /* List of weak references */
} pysqlite_Statement;
-extern PyTypeObject pysqlite_StatementType;
+extern PyTypeObject *pysqlite_StatementType;
int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* connection, PyObject* sql);
void pysqlite_statement_dealloc(pysqlite_Statement* self);
@@ -55,6 +55,6 @@ int pysqlite_statement_finalize(pysqlite_Statement* self);
int pysqlite_statement_reset(pysqlite_Statement* self);
void pysqlite_statement_mark_dirty(pysqlite_Statement* self);
-int pysqlite_statement_setup_types(void);
+int pysqlite_statement_setup_types(PyObject *module);
#endif
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 0e09877969..28d2c124d5 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -3888,6 +3888,25 @@ with_tp_del(PyObject *self, PyObject *args)
return obj;
}
+static PyObject *
+without_gc(PyObject *Py_UNUSED(self), PyObject *obj)
+{
+ PyTypeObject *tp = (PyTypeObject*)obj;
+ if (!PyType_Check(obj) || !PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE)) {
+ return PyErr_Format(PyExc_TypeError, "heap type expected, got %R", obj);
+ }
+ if (PyType_IS_GC(tp)) {
+ // Don't try this at home, kids:
+ tp->tp_flags -= Py_TPFLAGS_HAVE_GC;
+ tp->tp_free = PyObject_Del;
+ tp->tp_traverse = NULL;
+ tp->tp_clear = NULL;
+ }
+ assert(!PyType_IS_GC(tp));
+ Py_INCREF(obj);
+ return obj;
+}
+
static PyMethodDef ml;
static PyObject *
@@ -5028,6 +5047,7 @@ dict_get_version(PyObject *self, PyObject *args)
static PyObject *
raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
{
+ _Py_IDENTIFIER(send);
PyGenObject *gen;
if (!PyArg_ParseTuple(args, "O!", &PyGen_Type, &gen))
@@ -5044,7 +5064,7 @@ raise_SIGINT_then_send_None(PyObject *self, PyObject *args)
because we check for signals before every bytecode operation.
*/
raise(SIGINT);
- return _PyGen_Send(gen, Py_None);
+ return _PyObject_CallMethodIdOneArg((PyObject *)gen, &PyId_send, Py_None);
}
@@ -5804,6 +5824,7 @@ static PyMethodDef TestMethods[] = {
{"meth_fastcall", (PyCFunction)(void(*)(void))meth_fastcall, METH_FASTCALL},
{"meth_fastcall_keywords", (PyCFunction)(void(*)(void))meth_fastcall_keywords, METH_FASTCALL|METH_KEYWORDS},
{"pynumber_tobase", pynumber_tobase, METH_VARARGS},
+ {"without_gc", without_gc, METH_O},
{NULL, NULL} /* sentinel */
};
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index fc91622d39..04f6c243b5 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -1199,7 +1199,7 @@ tracemalloc_copy_trace(_Py_hashtable_t *traces,
trace_t *trace = (trace_t *)value;
trace_t *trace2 = raw_malloc(sizeof(trace_t));
- if (traces2 == NULL) {
+ if (trace2 == NULL) {
return -1;
}
*trace2 = *trace;
diff --git a/Modules/clinic/_codecsmodule.c.h b/Modules/clinic/_codecsmodule.c.h
index 249065c9fd..43378f94f9 100644
--- a/Modules/clinic/_codecsmodule.c.h
+++ b/Modules/clinic/_codecsmodule.c.h
@@ -15,6 +15,17 @@ PyDoc_STRVAR(_codecs_register__doc__,
#define _CODECS_REGISTER_METHODDEF \
{"register", (PyCFunction)_codecs_register, METH_O, _codecs_register__doc__},
+PyDoc_STRVAR(_codecs_unregister__doc__,
+"unregister($module, search_function, /)\n"
+"--\n"
+"\n"
+"Unregister a codec search function and clear the registry\'s cache.\n"
+"\n"
+"If the search function is not registered, do nothing.");
+
+#define _CODECS_UNREGISTER_METHODDEF \
+ {"unregister", (PyCFunction)_codecs_unregister, METH_O, _codecs_unregister__doc__},
+
PyDoc_STRVAR(_codecs_lookup__doc__,
"lookup($module, encoding, /)\n"
"--\n"
@@ -206,43 +217,6 @@ exit:
return return_value;
}
-PyDoc_STRVAR(_codecs__forget_codec__doc__,
-"_forget_codec($module, encoding, /)\n"
-"--\n"
-"\n"
-"Purge the named codec from the internal codec lookup cache");
-
-#define _CODECS__FORGET_CODEC_METHODDEF \
- {"_forget_codec", (PyCFunction)_codecs__forget_codec, METH_O, _codecs__forget_codec__doc__},
-
-static PyObject *
-_codecs__forget_codec_impl(PyObject *module, const char *encoding);
-
-static PyObject *
-_codecs__forget_codec(PyObject *module, PyObject *arg)
-{
- PyObject *return_value = NULL;
- const char *encoding;
-
- if (!PyUnicode_Check(arg)) {
- _PyArg_BadArgument("_forget_codec", "argument", "str", arg);
- goto exit;
- }
- Py_ssize_t encoding_length;
- encoding = PyUnicode_AsUTF8AndSize(arg, &encoding_length);
- if (encoding == NULL) {
- goto exit;
- }
- if (strlen(encoding) != (size_t)encoding_length) {
- PyErr_SetString(PyExc_ValueError, "embedded null character");
- goto exit;
- }
- return_value = _codecs__forget_codec_impl(module, encoding);
-
-exit:
- return return_value;
-}
-
PyDoc_STRVAR(_codecs_escape_decode__doc__,
"escape_decode($module, data, errors=None, /)\n"
"--\n"
@@ -2827,4 +2801,4 @@ exit:
#ifndef _CODECS_CODE_PAGE_ENCODE_METHODDEF
#define _CODECS_CODE_PAGE_ENCODE_METHODDEF
#endif /* !defined(_CODECS_CODE_PAGE_ENCODE_METHODDEF) */
-/*[clinic end generated code: output=eeead01414be6e42 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=557c3b37e4c492ac input=a9049054013a1b77]*/
diff --git a/Modules/clinic/fcntlmodule.c.h b/Modules/clinic/fcntlmodule.c.h
index c6bf45fa49..adf527fd44 100644
--- a/Modules/clinic/fcntlmodule.c.h
+++ b/Modules/clinic/fcntlmodule.c.h
@@ -35,7 +35,7 @@ fcntl_fcntl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("fcntl", nargs, 2, 3)) {
goto exit;
}
- if (!conv_descriptor(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
code = _PyLong_AsInt(args[1]);
@@ -105,7 +105,7 @@ fcntl_ioctl(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("ioctl", nargs, 2, 4)) {
goto exit;
}
- if (!conv_descriptor(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
code = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
@@ -155,7 +155,7 @@ fcntl_flock(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("flock", nargs, 2, 2)) {
goto exit;
}
- if (!conv_descriptor(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
code = _PyLong_AsInt(args[1]);
@@ -215,7 +215,7 @@ fcntl_lockf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("lockf", nargs, 2, 5)) {
goto exit;
}
- if (!conv_descriptor(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
code = _PyLong_AsInt(args[1]);
@@ -243,4 +243,4 @@ skip_optional:
exit:
return return_value;
}
-/*[clinic end generated code: output=91c2295402509595 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=8ea34bd0f7cf25ec input=a9049054013a1b77]*/
diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h
index c15def0a0f..df680d5738 100644
--- a/Modules/clinic/posixmodule.c.h
+++ b/Modules/clinic/posixmodule.c.h
@@ -357,7 +357,7 @@ os_fchdir(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *k
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
return_value = os_fchdir_impl(module, fd);
@@ -727,7 +727,7 @@ os_fsync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kw
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
return_value = os_fsync_impl(module, fd);
@@ -787,7 +787,7 @@ os_fdatasync(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
return_value = os_fdatasync_impl(module, fd);
@@ -6821,7 +6821,7 @@ os_fpathconf(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("fpathconf", nargs, 2, 2)) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (!conv_path_confname(args[1], &name)) {
@@ -8919,4 +8919,4 @@ exit:
#ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF
#define OS_WAITSTATUS_TO_EXITCODE_METHODDEF
#endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */
-/*[clinic end generated code: output=a0fbdea47249ee0c input=a9049054013a1b77]*/
+/*[clinic end generated code: output=936f33448cd66ccb input=a9049054013a1b77]*/
diff --git a/Modules/clinic/selectmodule.c.h b/Modules/clinic/selectmodule.c.h
index 3a06d6d0ec..00a78c4847 100644
--- a/Modules/clinic/selectmodule.c.h
+++ b/Modules/clinic/selectmodule.c.h
@@ -92,7 +92,7 @@ select_poll_register(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("register", nargs, 1, 2)) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (nargs < 2) {
@@ -140,7 +140,7 @@ select_poll_modify(pollObject *self, PyObject *const *args, Py_ssize_t nargs)
if (!_PyArg_CheckPositional("modify", nargs, 2, 2)) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (!_PyLong_UnsignedShort_Converter(args[1], &eventmask)) {
@@ -174,7 +174,7 @@ select_poll_unregister(pollObject *self, PyObject *arg)
PyObject *return_value = NULL;
int fd;
- if (!fildes_converter(arg, &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
goto exit;
}
return_value = select_poll_unregister_impl(self, fd);
@@ -256,7 +256,7 @@ select_devpoll_register(devpollObject *self, PyObject *const *args, Py_ssize_t n
if (!_PyArg_CheckPositional("register", nargs, 1, 2)) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (nargs < 2) {
@@ -306,7 +306,7 @@ select_devpoll_modify(devpollObject *self, PyObject *const *args, Py_ssize_t nar
if (!_PyArg_CheckPositional("modify", nargs, 1, 2)) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (nargs < 2) {
@@ -344,7 +344,7 @@ select_devpoll_unregister(devpollObject *self, PyObject *arg)
PyObject *return_value = NULL;
int fd;
- if (!fildes_converter(arg, &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
goto exit;
}
return_value = select_devpoll_unregister_impl(self, fd);
@@ -668,7 +668,7 @@ select_epoll_register(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t na
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
if (!noptargs) {
@@ -721,7 +721,7 @@ select_epoll_modify(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t narg
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
eventmask = (unsigned int)PyLong_AsUnsignedLongMask(args[1]);
@@ -766,7 +766,7 @@ select_epoll_unregister(pyEpoll_Object *self, PyObject *const *args, Py_ssize_t
if (!args) {
goto exit;
}
- if (!fildes_converter(args[0], &fd)) {
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
goto exit;
}
return_value = select_epoll_unregister_impl(self, fd);
@@ -1179,4 +1179,4 @@ exit:
#ifndef SELECT_KQUEUE_CONTROL_METHODDEF
#define SELECT_KQUEUE_CONTROL_METHODDEF
#endif /* !defined(SELECT_KQUEUE_CONTROL_METHODDEF) */
-/*[clinic end generated code: output=7144233c42e18279 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=162f4f4efa850416 input=a9049054013a1b77]*/
diff --git a/Modules/clinic/termios.c.h b/Modules/clinic/termios.c.h
new file mode 100644
index 0000000000..a45c1f6426
--- /dev/null
+++ b/Modules/clinic/termios.c.h
@@ -0,0 +1,225 @@
+/*[clinic input]
+preserve
+[clinic start generated code]*/
+
+PyDoc_STRVAR(termios_tcgetattr__doc__,
+"tcgetattr($module, fd, /)\n"
+"--\n"
+"\n"
+"Get the tty attributes for file descriptor fd.\n"
+"\n"
+"Returns a list [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]\n"
+"where cc is a list of the tty special characters (each a string of\n"
+"length 1, except the items with indices VMIN and VTIME, which are\n"
+"integers when these fields are defined). The interpretation of the\n"
+"flags and the speeds as well as the indexing in the cc array must be\n"
+"done using the symbolic constants defined in this module.");
+
+#define TERMIOS_TCGETATTR_METHODDEF \
+ {"tcgetattr", (PyCFunction)termios_tcgetattr, METH_O, termios_tcgetattr__doc__},
+
+static PyObject *
+termios_tcgetattr_impl(PyObject *module, int fd);
+
+static PyObject *
+termios_tcgetattr(PyObject *module, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ int fd;
+
+ if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
+ goto exit;
+ }
+ return_value = termios_tcgetattr_impl(module, fd);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(termios_tcsetattr__doc__,
+"tcsetattr($module, fd, when, attributes, /)\n"
+"--\n"
+"\n"
+"Set the tty attributes for file descriptor fd.\n"
+"\n"
+"The attributes to be set are taken from the attributes argument, which\n"
+"is a list like the one returned by tcgetattr(). The when argument\n"
+"determines when the attributes are changed: termios.TCSANOW to\n"
+"change immediately, termios.TCSADRAIN to change after transmitting all\n"
+"queued output, or termios.TCSAFLUSH to change after transmitting all\n"
+"queued output and discarding all queued input.");
+
+#define TERMIOS_TCSETATTR_METHODDEF \
+ {"tcsetattr", (PyCFunction)(void(*)(void))termios_tcsetattr, METH_FASTCALL, termios_tcsetattr__doc__},
+
+static PyObject *
+termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term);
+
+static PyObject *
+termios_tcsetattr(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int fd;
+ int when;
+ PyObject *term;
+
+ if (!_PyArg_CheckPositional("tcsetattr", nargs, 3, 3)) {
+ goto exit;
+ }
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
+ goto exit;
+ }
+ when = _PyLong_AsInt(args[1]);
+ if (when == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ term = args[2];
+ return_value = termios_tcsetattr_impl(module, fd, when, term);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(termios_tcsendbreak__doc__,
+"tcsendbreak($module, fd, duration, /)\n"
+"--\n"
+"\n"
+"Send a break on file descriptor fd.\n"
+"\n"
+"A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n"
+"has a system dependent meaning.");
+
+#define TERMIOS_TCSENDBREAK_METHODDEF \
+ {"tcsendbreak", (PyCFunction)(void(*)(void))termios_tcsendbreak, METH_FASTCALL, termios_tcsendbreak__doc__},
+
+static PyObject *
+termios_tcsendbreak_impl(PyObject *module, int fd, int duration);
+
+static PyObject *
+termios_tcsendbreak(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int fd;
+ int duration;
+
+ if (!_PyArg_CheckPositional("tcsendbreak", nargs, 2, 2)) {
+ goto exit;
+ }
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
+ goto exit;
+ }
+ duration = _PyLong_AsInt(args[1]);
+ if (duration == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = termios_tcsendbreak_impl(module, fd, duration);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(termios_tcdrain__doc__,
+"tcdrain($module, fd, /)\n"
+"--\n"
+"\n"
+"Wait until all output written to file descriptor fd has been transmitted.");
+
+#define TERMIOS_TCDRAIN_METHODDEF \
+ {"tcdrain", (PyCFunction)termios_tcdrain, METH_O, termios_tcdrain__doc__},
+
+static PyObject *
+termios_tcdrain_impl(PyObject *module, int fd);
+
+static PyObject *
+termios_tcdrain(PyObject *module, PyObject *arg)
+{
+ PyObject *return_value = NULL;
+ int fd;
+
+ if (!_PyLong_FileDescriptor_Converter(arg, &fd)) {
+ goto exit;
+ }
+ return_value = termios_tcdrain_impl(module, fd);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(termios_tcflush__doc__,
+"tcflush($module, fd, queue, /)\n"
+"--\n"
+"\n"
+"Discard queued data on file descriptor fd.\n"
+"\n"
+"The queue selector specifies which queue: termios.TCIFLUSH for the input\n"
+"queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n"
+"both queues.");
+
+#define TERMIOS_TCFLUSH_METHODDEF \
+ {"tcflush", (PyCFunction)(void(*)(void))termios_tcflush, METH_FASTCALL, termios_tcflush__doc__},
+
+static PyObject *
+termios_tcflush_impl(PyObject *module, int fd, int queue);
+
+static PyObject *
+termios_tcflush(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int fd;
+ int queue;
+
+ if (!_PyArg_CheckPositional("tcflush", nargs, 2, 2)) {
+ goto exit;
+ }
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
+ goto exit;
+ }
+ queue = _PyLong_AsInt(args[1]);
+ if (queue == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = termios_tcflush_impl(module, fd, queue);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(termios_tcflow__doc__,
+"tcflow($module, fd, action, /)\n"
+"--\n"
+"\n"
+"Suspend or resume input or output on file descriptor fd.\n"
+"\n"
+"The action argument can be termios.TCOOFF to suspend output,\n"
+"termios.TCOON to restart output, termios.TCIOFF to suspend input,\n"
+"or termios.TCION to restart input.");
+
+#define TERMIOS_TCFLOW_METHODDEF \
+ {"tcflow", (PyCFunction)(void(*)(void))termios_tcflow, METH_FASTCALL, termios_tcflow__doc__},
+
+static PyObject *
+termios_tcflow_impl(PyObject *module, int fd, int action);
+
+static PyObject *
+termios_tcflow(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int fd;
+ int action;
+
+ if (!_PyArg_CheckPositional("tcflow", nargs, 2, 2)) {
+ goto exit;
+ }
+ if (!_PyLong_FileDescriptor_Converter(args[0], &fd)) {
+ goto exit;
+ }
+ action = _PyLong_AsInt(args[1]);
+ if (action == -1 && PyErr_Occurred()) {
+ goto exit;
+ }
+ return_value = termios_tcflow_impl(module, fd, action);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=a129179f1e2545cc input=a9049054013a1b77]*/
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 39baea01ec..afd28106fa 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -20,24 +20,12 @@ module fcntl
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=124b58387c158179]*/
-static int
-conv_descriptor(PyObject *object, int *target)
-{
- int fd = PyObject_AsFileDescriptor(object);
-
- if (fd < 0)
- return 0;
- *target = fd;
- return 1;
-}
-
-/* Must come after conv_descriptor definition. */
#include "clinic/fcntlmodule.c.h"
/*[clinic input]
fcntl.fcntl
- fd: object(type='int', converter='conv_descriptor')
+ fd: fildes
cmd as code: int
arg: object(c_default='NULL') = 0
/
@@ -57,7 +45,7 @@ corresponding to the return value of the fcntl call in the C code.
static PyObject *
fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg)
-/*[clinic end generated code: output=888fc93b51c295bd input=8cefbe59b29efbe2]*/
+/*[clinic end generated code: output=888fc93b51c295bd input=7955340198e5f334]*/
{
unsigned int int_arg = 0;
int ret;
@@ -116,7 +104,7 @@ fcntl_fcntl_impl(PyObject *module, int fd, int code, PyObject *arg)
/*[clinic input]
fcntl.ioctl
- fd: object(type='int', converter='conv_descriptor')
+ fd: fildes
request as code: unsigned_int(bitwise=True)
arg as ob_arg: object(c_default='NULL') = 0
mutate_flag as mutate_arg: bool = True
@@ -155,7 +143,7 @@ code.
static PyObject *
fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
PyObject *ob_arg, int mutate_arg)
-/*[clinic end generated code: output=7f7f5840c65991be input=ede70c433cccbbb2]*/
+/*[clinic end generated code: output=7f7f5840c65991be input=967b4a4cbeceb0a8]*/
{
#define IOCTL_BUFSZ 1024
/* We use the unsigned non-checked 'I' format for the 'code' parameter
@@ -280,7 +268,7 @@ fcntl_ioctl_impl(PyObject *module, int fd, unsigned int code,
/*[clinic input]
fcntl.flock
- fd: object(type='int', converter='conv_descriptor')
+ fd: fildes
operation as code: int
/
@@ -292,7 +280,7 @@ function is emulated using fcntl()).
static PyObject *
fcntl_flock_impl(PyObject *module, int fd, int code)
-/*[clinic end generated code: output=84059e2b37d2fc64 input=b70a0a41ca22a8a0]*/
+/*[clinic end generated code: output=84059e2b37d2fc64 input=0bfc00f795953452]*/
{
int ret;
int async_err = 0;
@@ -346,7 +334,7 @@ fcntl_flock_impl(PyObject *module, int fd, int code)
/*[clinic input]
fcntl.lockf
- fd: object(type='int', converter='conv_descriptor')
+ fd: fildes
cmd as code: int
len as lenobj: object(c_default='NULL') = 0
start as startobj: object(c_default='NULL') = 0
@@ -380,7 +368,7 @@ starts. `whence` is as with fileobj.seek(), specifically:
static PyObject *
fcntl_lockf_impl(PyObject *module, int fd, int code, PyObject *lenobj,
PyObject *startobj, int whence)
-/*[clinic end generated code: output=4985e7a172e7461a input=3a5dc01b04371f1a]*/
+/*[clinic end generated code: output=4985e7a172e7461a input=5480479fc63a04b8]*/
{
int ret;
int async_err = 0;
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 5cd31b7dd4..45b0302875 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -2494,7 +2494,7 @@ References:
3. Square root differential correction: https://arxiv.org/pdf/1904.09481.pdf
4. Data dependency graph: https://bugs.python.org/file49439/hypot.png
5. https://www.wolframalpha.com/input/?i=Maclaurin+series+sqrt%28h**2+%2B+x%29+at+x%3D0
-6. Analysis of internal accuracy: https://bugs.python.org/file49435/best_frac.py
+6. Analysis of internal accuracy: https://bugs.python.org/file49484/best_frac.py
7. Commutativity test: https://bugs.python.org/file49448/test_hypot_commutativity.py
*/
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 7c496938ed..6ce0bcb9fe 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -22,6 +22,7 @@
#define PY_SSIZE_T_CLEAN
#include "Python.h"
+#include "pycore_fileutils.h"
#ifdef MS_WINDOWS
/* include <windows.h> early to avoid conflict with pycore_condvar.h:
@@ -1634,18 +1635,6 @@ path_error2(path_t *path, path_t *path2)
/* POSIX generic methods */
-static int
-fildes_converter(PyObject *o, void *p)
-{
- int fd;
- int *pointer = (int *)p;
- fd = PyObject_AsFileDescriptor(o);
- if (fd < 0)
- return 0;
- *pointer = fd;
- return 1;
-}
-
static PyObject *
posix_fildes_fd(int fd, int (*func)(int))
{
@@ -2642,10 +2631,6 @@ class dir_fd_converter(CConverter):
else:
self.converter = 'dir_fd_converter'
-class fildes_converter(CConverter):
- type = 'int'
- converter = 'fildes_converter'
-
class uid_t_converter(CConverter):
type = "uid_t"
converter = '_Py_Uid_Converter'
@@ -2708,7 +2693,7 @@ class sysconf_confname_converter(path_confname_converter):
converter="conv_sysconf_confname"
[python start generated code]*/
-/*[python end generated code: output=da39a3ee5e6b4b0d input=f1c8ae8d744f6c8b]*/
+/*[python end generated code: output=da39a3ee5e6b4b0d input=3338733161aa7879]*/
/*[clinic input]
@@ -8756,25 +8741,6 @@ os_close_impl(PyObject *module, int fd)
Py_RETURN_NONE;
}
-
-#ifdef HAVE_FDWALK
-static int
-_fdwalk_close_func(void *lohi, int fd)
-{
- int lo = ((int *)lohi)[0];
- int hi = ((int *)lohi)[1];
-
- if (fd >= hi) {
- return 1;
- }
- else if (fd >= lo) {
- /* Ignore errors */
- (void)close(fd);
- }
- return 0;
-}
-#endif /* HAVE_FDWALK */
-
/*[clinic input]
os.closerange
@@ -8789,32 +8755,8 @@ static PyObject *
os_closerange_impl(PyObject *module, int fd_low, int fd_high)
/*[clinic end generated code: output=0ce5c20fcda681c2 input=5855a3d053ebd4ec]*/
{
-#ifdef HAVE_FDWALK
- int lohi[2];
-#endif
Py_BEGIN_ALLOW_THREADS
- _Py_BEGIN_SUPPRESS_IPH
-#ifdef HAVE_FDWALK
- lohi[0] = Py_MAX(fd_low, 0);
- lohi[1] = fd_high;
- fdwalk(_fdwalk_close_func, lohi);
-#else
- fd_low = Py_MAX(fd_low, 0);
-#ifdef __FreeBSD__
- if (fd_high >= sysconf(_SC_OPEN_MAX)) {
- /* Any errors encountered while closing file descriptors are ignored */
- closefrom(fd_low);
- }
- else
-#endif
- {
- for (int i = fd_low; i < fd_high; i++) {
- /* Ignore errors */
- (void)close(i);
- }
- }
-#endif
- _Py_END_SUPPRESS_IPH
+ _Py_closerange(fd_low, fd_high - 1);
Py_END_ALLOW_THREADS
Py_RETURN_NONE;
}
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 13ffe09c6d..fe852f93c3 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -88,25 +88,6 @@ class select.kqueue "kqueue_queue_Object *" "_selectstate_global->kqueue_queue_T
[clinic start generated code]*/
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=41071028e0ede093]*/
-static int
-fildes_converter(PyObject *o, void *p)
-{
- int fd;
- int *pointer = (int *)p;
- fd = PyObject_AsFileDescriptor(o);
- if (fd == -1)
- return 0;
- *pointer = fd;
- return 1;
-}
-
-/*[python input]
-class fildes_converter(CConverter):
- type = 'int'
- converter = 'fildes_converter'
-[python start generated code]*/
-/*[python end generated code: output=da39a3ee5e6b4b0d input=ca54eb5aa476e20a]*/
-
/* list of Python objects and their file descriptor */
typedef struct {
PyObject *obj; /* owned reference */
diff --git a/Modules/termios.c b/Modules/termios.c
index cc0d5853f8..a6649598ec 100644
--- a/Modules/termios.c
+++ b/Modules/termios.c
@@ -29,6 +29,13 @@
#include <sys/bsdtty.h>
#endif
+/*[clinic input]
+module termios
+[clinic start generated code]*/
+/*[clinic end generated code: output=da39a3ee5e6b4b0d input=01105c85d0ca7252]*/
+
+#include "clinic/termios.c.h"
+
PyDoc_STRVAR(termios__doc__,
"This module provides an interface to the Posix calls for tty I/O control.\n\
For a complete description of these calls, see the Posix or Unix manual\n\
@@ -51,40 +58,28 @@ get_termios_state(PyObject *module)
return (termiosmodulestate *)state;
}
-static int fdconv(PyObject* obj, void* p)
-{
- int fd;
+static struct PyModuleDef termiosmodule;
- fd = PyObject_AsFileDescriptor(obj);
- if (fd >= 0) {
- *(int*)p = fd;
- return 1;
- }
- return 0;
-}
+/*[clinic input]
+termios.tcgetattr
-static struct PyModuleDef termiosmodule;
+ fd: fildes
+ /
-PyDoc_STRVAR(termios_tcgetattr__doc__,
-"tcgetattr(fd) -> list_of_attrs\n\
-\n\
-Get the tty attributes for file descriptor fd, as follows:\n\
-[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
-of the tty special characters (each a string of length 1, except the items\n\
-with indices VMIN and VTIME, which are integers when these fields are\n\
-defined). The interpretation of the flags and the speeds as well as the\n\
-indexing in the cc array must be done using the symbolic constants defined\n\
-in this module.");
+Get the tty attributes for file descriptor fd.
+
+Returns a list [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]
+where cc is a list of the tty special characters (each a string of
+length 1, except the items with indices VMIN and VTIME, which are
+integers when these fields are defined). The interpretation of the
+flags and the speeds as well as the indexing in the cc array must be
+done using the symbolic constants defined in this module.
+[clinic start generated code]*/
static PyObject *
-termios_tcgetattr(PyObject *module, PyObject *args)
+termios_tcgetattr_impl(PyObject *module, int fd)
+/*[clinic end generated code: output=2b3da39db870e629 input=54dad9779ebe74b1]*/
{
- int fd;
- if (!PyArg_ParseTuple(args, "O&:tcgetattr",
- fdconv, (void*)&fd)) {
- return NULL;
- }
-
termiosmodulestate *state = PyModule_GetState(module);
struct termios mode;
if (tcgetattr(fd, &mode) == -1) {
@@ -143,27 +138,28 @@ termios_tcgetattr(PyObject *module, PyObject *args)
return NULL;
}
-PyDoc_STRVAR(termios_tcsetattr__doc__,
-"tcsetattr(fd, when, attributes) -> None\n\
-\n\
-Set the tty attributes for file descriptor fd.\n\
-The attributes to be set are taken from the attributes argument, which\n\
-is a list like the one returned by tcgetattr(). The when argument\n\
-determines when the attributes are changed: termios.TCSANOW to\n\
-change immediately, termios.TCSADRAIN to change after transmitting all\n\
-queued output, or termios.TCSAFLUSH to change after transmitting all\n\
-queued output and discarding all queued input. ");
+/*[clinic input]
+termios.tcsetattr
+
+ fd: fildes
+ when: int
+ attributes as term: object
+ /
+
+Set the tty attributes for file descriptor fd.
+
+The attributes to be set are taken from the attributes argument, which
+is a list like the one returned by tcgetattr(). The when argument
+determines when the attributes are changed: termios.TCSANOW to
+change immediately, termios.TCSADRAIN to change after transmitting all
+queued output, or termios.TCSAFLUSH to change after transmitting all
+queued output and discarding all queued input.
+[clinic start generated code]*/
static PyObject *
-termios_tcsetattr(PyObject *module, PyObject *args)
+termios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term)
+/*[clinic end generated code: output=bcd2b0a7b98a4bf5 input=5dafabdd5a08f018]*/
{
- int fd, when;
- PyObject *term;
- if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
- fdconv, &fd, &when, &term)) {
- return NULL;
- }
-
if (!PyList_Check(term) || PyList_Size(term) != 7) {
PyErr_SetString(PyExc_TypeError,
"tcsetattr, arg 3: must be 7 element list");
@@ -221,22 +217,23 @@ termios_tcsetattr(PyObject *module, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(termios_tcsendbreak__doc__,
-"tcsendbreak(fd, duration) -> None\n\
-\n\
-Send a break on file descriptor fd.\n\
-A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
-has a system dependent meaning.");
+/*[clinic input]
+termios.tcsendbreak
+
+ fd: fildes
+ duration: int
+ /
+
+Send a break on file descriptor fd.
+
+A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration
+has a system dependent meaning.
+[clinic start generated code]*/
static PyObject *
-termios_tcsendbreak(PyObject *module, PyObject *args)
+termios_tcsendbreak_impl(PyObject *module, int fd, int duration)
+/*[clinic end generated code: output=5945f589b5d3ac66 input=dc2f32417691f8ed]*/
{
- int fd, duration;
- if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
- fdconv, &fd, &duration)) {
- return NULL;
- }
-
termiosmodulestate *state = PyModule_GetState(module);
if (tcsendbreak(fd, duration) == -1) {
return PyErr_SetFromErrno(state->TermiosError);
@@ -245,20 +242,19 @@ termios_tcsendbreak(PyObject *module, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(termios_tcdrain__doc__,
-"tcdrain(fd) -> None\n\
-\n\
-Wait until all output written to file descriptor fd has been transmitted.");
+/*[clinic input]
+termios.tcdrain
+
+ fd: fildes
+ /
+
+Wait until all output written to file descriptor fd has been transmitted.
+[clinic start generated code]*/
static PyObject *
-termios_tcdrain(PyObject *module, PyObject *args)
+termios_tcdrain_impl(PyObject *module, int fd)
+/*[clinic end generated code: output=5fd86944c6255955 input=c99241b140b32447]*/
{
- int fd;
- if (!PyArg_ParseTuple(args, "O&:tcdrain",
- fdconv, &fd)) {
- return NULL;
- }
-
termiosmodulestate *state = PyModule_GetState(module);
if (tcdrain(fd) == -1) {
return PyErr_SetFromErrno(state->TermiosError);
@@ -267,23 +263,24 @@ termios_tcdrain(PyObject *module, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(termios_tcflush__doc__,
-"tcflush(fd, queue) -> None\n\
-\n\
-Discard queued data on file descriptor fd.\n\
-The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
-queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
-both queues. ");
+/*[clinic input]
+termios.tcflush
+
+ fd: fildes
+ queue: int
+ /
+
+Discard queued data on file descriptor fd.
+
+The queue selector specifies which queue: termios.TCIFLUSH for the input
+queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for
+both queues.
+[clinic start generated code]*/
static PyObject *
-termios_tcflush(PyObject *module, PyObject *args)
+termios_tcflush_impl(PyObject *module, int fd, int queue)
+/*[clinic end generated code: output=2424f80312ec2f21 input=0f7d08122ddc07b5]*/
{
- int fd, queue;
- if (!PyArg_ParseTuple(args, "O&i:tcflush",
- fdconv, &fd, &queue)) {
- return NULL;
- }
-
termiosmodulestate *state = PyModule_GetState(module);
if (tcflush(fd, queue) == -1) {
return PyErr_SetFromErrno(state->TermiosError);
@@ -292,23 +289,24 @@ termios_tcflush(PyObject *module, PyObject *args)
Py_RETURN_NONE;
}
-PyDoc_STRVAR(termios_tcflow__doc__,
-"tcflow(fd, action) -> None\n\
-\n\
-Suspend or resume input or output on file descriptor fd.\n\
-The action argument can be termios.TCOOFF to suspend output,\n\
-termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
-or termios.TCION to restart input.");
+/*[clinic input]
+termios.tcflow
+
+ fd: fildes
+ action: int
+ /
+
+Suspend or resume input or output on file descriptor fd.
+
+The action argument can be termios.TCOOFF to suspend output,
+termios.TCOON to restart output, termios.TCIOFF to suspend input,
+or termios.TCION to restart input.
+[clinic start generated code]*/
static PyObject *
-termios_tcflow(PyObject *module, PyObject *args)
+termios_tcflow_impl(PyObject *module, int fd, int action)
+/*[clinic end generated code: output=afd10928e6ea66eb input=c6aff0640b6efd9c]*/
{
- int fd, action;
- if (!PyArg_ParseTuple(args, "O&i:tcflow",
- fdconv, &fd, &action)) {
- return NULL;
- }
-
termiosmodulestate *state = PyModule_GetState(module);
if (tcflow(fd, action) == -1) {
return PyErr_SetFromErrno(state->TermiosError);
@@ -319,18 +317,12 @@ termios_tcflow(PyObject *module, PyObject *args)
static PyMethodDef termios_methods[] =
{
- {"tcgetattr", termios_tcgetattr,
- METH_VARARGS, termios_tcgetattr__doc__},
- {"tcsetattr", termios_tcsetattr,
- METH_VARARGS, termios_tcsetattr__doc__},
- {"tcsendbreak", termios_tcsendbreak,
- METH_VARARGS, termios_tcsendbreak__doc__},
- {"tcdrain", termios_tcdrain,
- METH_VARARGS, termios_tcdrain__doc__},
- {"tcflush", termios_tcflush,
- METH_VARARGS, termios_tcflush__doc__},
- {"tcflow", termios_tcflow,
- METH_VARARGS, termios_tcflow__doc__},
+ TERMIOS_TCGETATTR_METHODDEF
+ TERMIOS_TCSETATTR_METHODDEF
+ TERMIOS_TCSENDBREAK_METHODDEF
+ TERMIOS_TCDRAIN_METHODDEF
+ TERMIOS_TCFLUSH_METHODDEF
+ TERMIOS_TCFLOW_METHODDEF
{NULL, NULL}
};
diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c
index 8e11cfc4da..941fd2faa7 100644
--- a/Modules/unicodedata.c
+++ b/Modules/unicodedata.c
@@ -93,22 +93,33 @@ static PyMemberDef DB_members[] = {
/* forward declaration */
static PyTypeObject UCD_Type;
-// Check if self is an instance of UCD_Type.
+typedef struct {
+ // Borrowed reference to &UCD_Type. It is used to prepare the code
+ // to convert the UCD_Type static type to a heap type.
+ PyTypeObject *ucd_type;
+} unicodedata_module_state;
+
+// bpo-1635741: Temporary global state until the unicodedata module
+// gets a real module state.
+static unicodedata_module_state global_module_state;
+
+// Check if self is an instance of ucd_type.
// Return 0 if self is NULL (when the PyCapsule C API is used).
#define UCD_Check(self, ucd_type) (self != NULL && Py_IS_TYPE(self, ucd_type))
static PyObject*
-new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4),
+new_previous_version(unicodedata_module_state *state,
+ const char*name, const change_record* (*getrecord)(Py_UCS4),
Py_UCS4 (*normalization)(Py_UCS4))
{
- PreviousDBVersion *self;
- self = PyObject_New(PreviousDBVersion, &UCD_Type);
- if (self == NULL)
- return NULL;
- self->name = name;
- self->getrecord = getrecord;
- self->normalization = normalization;
- return (PyObject*)self;
+ PreviousDBVersion *self;
+ self = PyObject_New(PreviousDBVersion, state->ucd_type);
+ if (self == NULL)
+ return NULL;
+ self->name = name;
+ self->getrecord = getrecord;
+ self->normalization = normalization;
+ return (PyObject*)self;
}
@@ -134,11 +145,12 @@ unicodedata_UCD_decimal_impl(PyObject *self, int chr,
PyObject *default_value)
/*[clinic end generated code: output=be23376e1a185231 input=933f8107993f23d0]*/
{
+ unicodedata_module_state *state = &global_module_state;
int have_old = 0;
long rc;
Py_UCS4 c = (Py_UCS4)chr;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0) {
/* unassigned */
@@ -222,11 +234,12 @@ unicodedata_UCD_numeric_impl(PyObject *self, int chr,
PyObject *default_value)
/*[clinic end generated code: output=53ce281fe85b10c4 input=fdf5871a5542893c]*/
{
+ unicodedata_module_state *state = &global_module_state;
int have_old = 0;
double rc;
Py_UCS4 c = (Py_UCS4)chr;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0) {
/* unassigned */
@@ -268,10 +281,11 @@ static PyObject *
unicodedata_UCD_category_impl(PyObject *self, int chr)
/*[clinic end generated code: output=8571539ee2e6783a input=27d6f3d85050bc06]*/
{
+ unicodedata_module_state *state = &global_module_state;
int index;
Py_UCS4 c = (Py_UCS4)chr;
index = (int) _getrecord_ex(c)->category;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed != 0xFF)
index = old->category_changed;
@@ -295,10 +309,11 @@ static PyObject *
unicodedata_UCD_bidirectional_impl(PyObject *self, int chr)
/*[clinic end generated code: output=d36310ce2039bb92 input=b3d8f42cebfcf475]*/
{
+ unicodedata_module_state *state = &global_module_state;
int index;
Py_UCS4 c = (Py_UCS4)chr;
index = (int) _getrecord_ex(c)->bidirectional;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0)
index = 0; /* unassigned */
@@ -324,10 +339,11 @@ static int
unicodedata_UCD_combining_impl(PyObject *self, int chr)
/*[clinic end generated code: output=cad056d0cb6a5920 input=9f2d6b2a95d0a22a]*/
{
+ unicodedata_module_state *state = &global_module_state;
int index;
Py_UCS4 c = (Py_UCS4)chr;
index = (int) _getrecord_ex(c)->combining;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0)
index = 0; /* unassigned */
@@ -352,10 +368,11 @@ static int
unicodedata_UCD_mirrored_impl(PyObject *self, int chr)
/*[clinic end generated code: output=2532dbf8121b50e6 input=5dd400d351ae6f3b]*/
{
+ unicodedata_module_state *state = &global_module_state;
int index;
Py_UCS4 c = (Py_UCS4)chr;
index = (int) _getrecord_ex(c)->mirrored;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0)
index = 0; /* unassigned */
@@ -379,10 +396,11 @@ static PyObject *
unicodedata_UCD_east_asian_width_impl(PyObject *self, int chr)
/*[clinic end generated code: output=484e8537d9ee8197 input=c4854798aab026e0]*/
{
+ unicodedata_module_state *state = &global_module_state;
int index;
Py_UCS4 c = (Py_UCS4)chr;
index = (int) _getrecord_ex(c)->east_asian_width;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0)
index = 0; /* unassigned */
@@ -408,6 +426,7 @@ static PyObject *
unicodedata_UCD_decomposition_impl(PyObject *self, int chr)
/*[clinic end generated code: output=7d699f3ec7565d27 input=e4c12459ad68507b]*/
{
+ unicodedata_module_state *state = &global_module_state;
char decomp[256];
int code, index, count;
size_t i;
@@ -416,7 +435,7 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr)
code = (int)c;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
const change_record *old = get_old_record(self, c);
if (old->category_changed == 0)
return PyUnicode_FromString(""); /* unassigned */
@@ -459,11 +478,12 @@ unicodedata_UCD_decomposition_impl(PyObject *self, int chr)
}
static void
-get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *count)
+get_decomp_record(unicodedata_module_state *state, PyObject *self,
+ Py_UCS4 code, int *index, int *prefix, int *count)
{
if (code >= 0x110000) {
*index = 0;
- } else if (UCD_Check(self, &UCD_Type) &&
+ } else if (UCD_Check(self, state->ucd_type) &&
get_old_record(self, code)->category_changed==0) {
/* unassigned in old version */
*index = 0;
@@ -493,7 +513,8 @@ get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *co
#define SCount (LCount*NCount)
static PyObject*
-nfd_nfkd(PyObject *self, PyObject *input, int k)
+nfd_nfkd(unicodedata_module_state *state, PyObject *self,
+ PyObject *input, int k)
{
PyObject *result;
Py_UCS4 *output;
@@ -561,7 +582,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
continue;
}
/* normalization changes */
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code);
if (value != 0) {
stack[stackptr++] = value;
@@ -570,7 +591,7 @@ nfd_nfkd(PyObject *self, PyObject *input, int k)
}
/* Other decompositions. */
- get_decomp_record(self, code, &index, &prefix, &count);
+ get_decomp_record(state, self, code, &index, &prefix, &count);
/* Copy character if it is not decomposable, or has a
compatibility decomposition, but we do NFD. */
@@ -642,7 +663,7 @@ find_nfc_index(const struct reindex* nfc, Py_UCS4 code)
}
static PyObject*
-nfc_nfkc(PyObject *self, PyObject *input, int k)
+nfc_nfkc(unicodedata_module_state *state, PyObject *self, PyObject *input, int k)
{
PyObject *result;
int kind;
@@ -654,7 +675,7 @@ nfc_nfkc(PyObject *self, PyObject *input, int k)
Py_ssize_t skipped[20];
int cskipped = 0;
- result = nfd_nfkd(self, input, k);
+ result = nfd_nfkd(state, self, input, k);
if (!result)
return NULL;
/* result will be "ready". */
@@ -797,12 +818,12 @@ typedef enum {YES = 0, MAYBE = 1, NO = 2} QuickcheckResult;
* https://www.unicode.org/reports/tr15/#Detecting_Normalization_Forms
*/
static QuickcheckResult
-is_normalized_quickcheck(PyObject *self, PyObject *input,
- bool nfc, bool k, bool yes_only)
+is_normalized_quickcheck(unicodedata_module_state *state, PyObject *self,
+ PyObject *input, bool nfc, bool k, bool yes_only)
{
/* An older version of the database is requested, quickchecks must be
disabled. */
- if (UCD_Check(self, &UCD_Type))
+ if (UCD_Check(self, state->ucd_type))
return NO;
Py_ssize_t i, len;
@@ -862,6 +883,7 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form,
PyObject *input)
/*[clinic end generated code: output=11e5a3694e723ca5 input=a544f14cea79e508]*/
{
+ unicodedata_module_state *state = &global_module_state;
if (PyUnicode_READY(input) == -1) {
return NULL;
}
@@ -897,10 +919,10 @@ unicodedata_UCD_is_normalized_impl(PyObject *self, PyObject *form,
return NULL;
}
- m = is_normalized_quickcheck(self, input, nfc, k, false);
+ m = is_normalized_quickcheck(state, self, input, nfc, k, false);
if (m == MAYBE) {
- cmp = (nfc ? nfc_nfkc : nfd_nfkd)(self, input, k);
+ cmp = (nfc ? nfc_nfkc : nfd_nfkd)(state, self, input, k);
if (cmp == NULL) {
return NULL;
}
@@ -935,6 +957,7 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form,
PyObject *input)
/*[clinic end generated code: output=05ca4385a2ad6983 input=3a5206c0ad2833fb]*/
{
+ unicodedata_module_state *state = &global_module_state;
if (PyUnicode_GET_LENGTH(input) == 0) {
/* Special case empty input strings, since resizing
them later would cause internal errors. */
@@ -943,32 +966,36 @@ unicodedata_UCD_normalize_impl(PyObject *self, PyObject *form,
}
if (_PyUnicode_EqualToASCIIId(form, &PyId_NFC)) {
- if (is_normalized_quickcheck(self, input, true, false, true) == YES) {
+ if (is_normalized_quickcheck(state, self, input,
+ true, false, true) == YES) {
Py_INCREF(input);
return input;
}
- return nfc_nfkc(self, input, 0);
+ return nfc_nfkc(state, self, input, 0);
}
if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKC)) {
- if (is_normalized_quickcheck(self, input, true, true, true) == YES) {
+ if (is_normalized_quickcheck(state, self, input,
+ true, true, true) == YES) {
Py_INCREF(input);
return input;
}
- return nfc_nfkc(self, input, 1);
+ return nfc_nfkc(state, self, input, 1);
}
if (_PyUnicode_EqualToASCIIId(form, &PyId_NFD)) {
- if (is_normalized_quickcheck(self, input, false, false, true) == YES) {
+ if (is_normalized_quickcheck(state, self, input,
+ false, false, true) == YES) {
Py_INCREF(input);
return input;
}
- return nfd_nfkd(self, input, 0);
+ return nfd_nfkd(state, self, input, 0);
}
if (_PyUnicode_EqualToASCIIId(form, &PyId_NFKD)) {
- if (is_normalized_quickcheck(self, input, false, true, true) == YES) {
+ if (is_normalized_quickcheck(state, self, input,
+ false, true, true) == YES) {
Py_INCREF(input);
return input;
}
- return nfd_nfkd(self, input, 1);
+ return nfd_nfkd(state, self, input, 1);
}
PyErr_SetString(PyExc_ValueError, "invalid normalization form");
return NULL;
@@ -1051,8 +1078,8 @@ is_unified_ideograph(Py_UCS4 code)
(cp < named_sequences_end))
static int
-_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
- int with_alias_and_seq)
+_getucname(unicodedata_module_state *state, PyObject *self,
+ Py_UCS4 code, char* buffer, int buflen, int with_alias_and_seq)
{
/* Find the name associated with the given code point.
* If with_alias_and_seq is 1, check for names in the Private Use Area 15
@@ -1069,7 +1096,7 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code)))
return 0;
- if (UCD_Check(self, &UCD_Type)) {
+ if (UCD_Check(self, state->ucd_type)) {
/* in 3.2.0 there are no aliases and named sequences */
const change_record *old;
if (IS_ALIAS(code) || IS_NAMED_SEQ(code))
@@ -1153,12 +1180,22 @@ _getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
}
static int
-_cmpname(PyObject *self, int code, const char* name, int namelen)
+capi_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen,
+ int with_alias_and_seq)
+{
+ unicodedata_module_state *state = &global_module_state;
+ return _getucname(state, self, code, buffer, buflen, with_alias_and_seq);
+
+}
+
+static int
+_cmpname(unicodedata_module_state *state, PyObject *self,
+ int code, const char* name, int namelen)
{
/* check if code corresponds to the given name */
int i;
char buffer[NAME_MAXLEN+1];
- if (!_getucname(self, code, buffer, NAME_MAXLEN, 1))
+ if (!_getucname(state, self, code, buffer, NAME_MAXLEN, 1))
return 0;
for (i = 0; i < namelen; i++) {
if (Py_TOUPPER(name[i]) != buffer[i])
@@ -1203,8 +1240,8 @@ _check_alias_and_seq(unsigned int cp, Py_UCS4* code, int with_named_seq)
}
static int
-_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code,
- int with_named_seq)
+_getcode(unicodedata_module_state *state, PyObject* self,
+ const char* name, int namelen, Py_UCS4* code, int with_named_seq)
{
/* Return the code point associated with the given name.
* Named aliases are resolved too (unless self != NULL (i.e. we are using
@@ -1265,8 +1302,9 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code,
v = code_hash[i];
if (!v)
return 0;
- if (_cmpname(self, v, name, namelen))
+ if (_cmpname(state, self, v, name, namelen)) {
return _check_alias_and_seq(v, code, with_named_seq);
+ }
incr = (h ^ (h >> 3)) & mask;
if (!incr)
incr = mask;
@@ -1275,19 +1313,29 @@ _getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code,
v = code_hash[i];
if (!v)
return 0;
- if (_cmpname(self, v, name, namelen))
+ if (_cmpname(state, self, v, name, namelen)) {
return _check_alias_and_seq(v, code, with_named_seq);
+ }
incr = incr << 1;
if (incr > mask)
incr = incr ^ code_poly;
}
}
+static int
+capi_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code,
+ int with_named_seq)
+{
+ unicodedata_module_state *state = &global_module_state;
+ return _getcode(state, self, name, namelen, code, with_named_seq);
+
+}
+
static const _PyUnicode_Name_CAPI hashAPI =
{
sizeof(_PyUnicode_Name_CAPI),
- _getucname,
- _getcode
+ capi_getucname,
+ capi_getcode
};
/* -------------------------------------------------------------------- */
@@ -1311,10 +1359,11 @@ static PyObject *
unicodedata_UCD_name_impl(PyObject *self, int chr, PyObject *default_value)
/*[clinic end generated code: output=6bbb37a326407707 input=3e0367f534de56d9]*/
{
+ unicodedata_module_state *state = &global_module_state;
char name[NAME_MAXLEN+1];
Py_UCS4 c = (Py_UCS4)chr;
- if (!_getucname(self, c, name, NAME_MAXLEN, 0)) {
+ if (!_getucname(state, self, c, name, NAME_MAXLEN, 0)) {
if (default_value == NULL) {
PyErr_SetString(PyExc_ValueError, "no such name");
return NULL;
@@ -1346,6 +1395,7 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name,
Py_ssize_clean_t name_length)
/*[clinic end generated code: output=765cb8186788e6be input=a557be0f8607a0d6]*/
{
+ unicodedata_module_state *state = &global_module_state;
Py_UCS4 code;
unsigned int index;
if (name_length > NAME_MAXLEN) {
@@ -1353,7 +1403,7 @@ unicodedata_UCD_lookup_impl(PyObject *self, const char *name,
return NULL;
}
- if (!_getcode(self, name, (int)name_length, &code, 1)) {
+ if (!_getcode(state, self, name, (int)name_length, &code, 1)) {
PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name);
return NULL;
}
@@ -1458,19 +1508,22 @@ PyMODINIT_FUNC
PyInit_unicodedata(void)
{
PyObject *m, *v;
+ unicodedata_module_state *state = &global_module_state;
Py_SET_TYPE(&UCD_Type, &PyType_Type);
+ state->ucd_type = &UCD_Type;
m = PyModule_Create(&unicodedatamodule);
if (!m)
return NULL;
PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION);
- Py_INCREF(&UCD_Type);
- PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type);
+ Py_INCREF(state->ucd_type);
+ PyModule_AddObject(m, "UCD", (PyObject*)state->ucd_type);
/* Previous versions */
- v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0);
+ v = new_previous_version(state, "3.2.0",
+ get_change_3_2_0, normalization_3_2_0);
if (v != NULL)
PyModule_AddObject(m, "ucd_3_2_0", v);