]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42064: Convert `sqlite3` global state to module state (GH-29073)
authorErlend Egeberg Aasland <erlend.aasland@innova.no>
Wed, 27 Oct 2021 11:12:21 +0000 (13:12 +0200)
committerGitHub <noreply@github.com>
Wed, 27 Oct 2021 11:12:21 +0000 (13:12 +0200)
Modules/_sqlite/clinic/cursor.c.h
Modules/_sqlite/connection.c
Modules/_sqlite/cursor.c
Modules/_sqlite/microprotocols.c
Modules/_sqlite/microprotocols.h
Modules/_sqlite/module.c
Modules/_sqlite/module.h
Modules/_sqlite/row.c

index eb3e7ce31ada30554eac0f366bfd5e282102126f..d8a36ac38aaf0550c674c08265511f555e4e31b3 100644 (file)
@@ -279,25 +279,14 @@ PyDoc_STRVAR(pysqlite_cursor_close__doc__,
 "Closes the cursor.");
 
 #define PYSQLITE_CURSOR_CLOSE_METHODDEF    \
-    {"close", (PyCFunction)(void(*)(void))pysqlite_cursor_close, METH_METHOD|METH_FASTCALL|METH_KEYWORDS, pysqlite_cursor_close__doc__},
+    {"close", (PyCFunction)pysqlite_cursor_close, METH_NOARGS, pysqlite_cursor_close__doc__},
 
 static PyObject *
-pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls);
+pysqlite_cursor_close_impl(pysqlite_Cursor *self);
 
 static PyObject *
-pysqlite_cursor_close(pysqlite_Cursor *self, PyTypeObject *cls, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+pysqlite_cursor_close(pysqlite_Cursor *self, PyObject *Py_UNUSED(ignored))
 {
-    PyObject *return_value = NULL;
-    static const char * const _keywords[] = { NULL};
-    static _PyArg_Parser _parser = {":close", _keywords, 0};
-
-    if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser
-        )) {
-        goto exit;
-    }
-    return_value = pysqlite_cursor_close_impl(self, cls);
-
-exit:
-    return return_value;
+    return pysqlite_cursor_close_impl(self);
 }
-/*[clinic end generated code: output=3b5328c1619b7626 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=514f6eb4e4974671 input=a9049054013a1b77]*/
index e94c4cbb4e8c3adc5020b91e317e9e721f2f2773..da2f12e8f99c2a04fec9994c599acd5fdea024cf 100644 (file)
@@ -59,7 +59,7 @@ error:
     return 0;
 }
 
-#define clinic_state() (pysqlite_get_state(NULL))
+#define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self)))
 #include "clinic/connection.c.h"
 #undef clinic_state
 
@@ -416,7 +416,8 @@ pysqlite_connection_close_impl(pysqlite_Connection *self)
     }
 
     if (!self->initialized) {
-        pysqlite_state *state = pysqlite_get_state(NULL);
+        PyTypeObject *tp = Py_TYPE(self);
+        pysqlite_state *state = pysqlite_get_state_by_type(tp);
         PyErr_SetString(state->ProgrammingError,
                         "Base Connection.__init__ not called.");
         return NULL;
index ca74a68de4dba79e89c1b80cb48b9324f52be5fd..1d7c0b46a616d449ce9b679cd31df251abb07beb 100644 (file)
@@ -25,7 +25,7 @@
 #include "module.h"
 #include "util.h"
 
-#define clinic_state() (pysqlite_get_state(NULL))
+#define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self)))
 #include "clinic/cursor.c.h"
 #undef clinic_state
 
@@ -966,17 +966,16 @@ pysqlite_cursor_setoutputsize_impl(pysqlite_Cursor *self, PyObject *size,
 /*[clinic input]
 _sqlite3.Cursor.close as pysqlite_cursor_close
 
-    cls: defining_class
-
 Closes the cursor.
 [clinic start generated code]*/
 
 static PyObject *
-pysqlite_cursor_close_impl(pysqlite_Cursor *self, PyTypeObject *cls)
-/*[clinic end generated code: output=a08ab3d772f45438 input=28ba9b532ab46ba0]*/
+pysqlite_cursor_close_impl(pysqlite_Cursor *self)
+/*[clinic end generated code: output=b6055e4ec6fe63b6 input=08b36552dbb9a986]*/
 {
     if (!self->connection) {
-        pysqlite_state *state = pysqlite_get_state_by_cls(cls);
+        PyTypeObject *tp = Py_TYPE(self);
+        pysqlite_state *state = pysqlite_get_state_by_type(tp);
         PyErr_SetString(state->ProgrammingError,
                         "Base Cursor.__init__ not called.");
         return NULL;
index 68e4f7fb166db709fd482dfd9ec5a74ddd36ce16..95c799d306f308ab4d2a1ccd2baf28f828f4ba7e 100644 (file)
@@ -49,7 +49,8 @@ pysqlite_microprotocols_init(PyObject *module)
 /* pysqlite_microprotocols_add - add a reverse type-caster to the dictionary */
 
 int
-pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
+pysqlite_microprotocols_add(pysqlite_state *state, PyTypeObject *type,
+                            PyObject *proto, PyObject *cast)
 {
     PyObject* key;
     int rc;
@@ -61,7 +62,6 @@ pysqlite_microprotocols_add(PyTypeObject *type, PyObject *proto, PyObject *cast)
         return -1;
     }
 
-    pysqlite_state *state = pysqlite_get_state(NULL);
     rc = PyDict_SetItem(state->psyco_adapters, key, cast);
     Py_DECREF(key);
 
index d12bc448596c4b61e19e97307b4aa7b622bb73c4..6bde9d01f45299fe1c989e0b3cb1d4465d807dc8 100644 (file)
@@ -33,8 +33,9 @@
 
 /* used by module.c to init the microprotocols system */
 extern int pysqlite_microprotocols_init(PyObject *module);
-extern int pysqlite_microprotocols_add(
-    PyTypeObject *type, PyObject *proto, PyObject *cast);
+extern int pysqlite_microprotocols_add(pysqlite_state *state,
+                                       PyTypeObject *type, PyObject *proto,
+                                       PyObject *cast);
 extern PyObject *pysqlite_microprotocols_adapt(pysqlite_state *state,
                                                PyObject *obj, PyObject *proto,
                                                PyObject *alt);
index 47b1f7a9d0720cdc3a58db6c5210346a06e99efd..e41ac0fc1ab733a0e51781d4ac6faeb1bb06a37a 100644 (file)
@@ -32,7 +32,7 @@
 #error "SQLite 3.7.15 or higher required"
 #endif
 
-#define clinic_state() (pysqlite_get_state(NULL))
+#define clinic_state() (pysqlite_get_state(module))
 #include "clinic/module.c.h"
 #undef clinic_state
 
@@ -41,8 +41,6 @@ module _sqlite3
 [clinic start generated code]*/
 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=81e330492d57488e]*/
 
-pysqlite_state pysqlite_global_state;
-
 // NOTE: This must equal sqlite3.Connection.__init__ argument spec!
 /*[clinic input]
 _sqlite3.connect as pysqlite_connect
@@ -160,7 +158,7 @@ pysqlite_register_adapter_impl(PyObject *module, PyTypeObject *type,
 
     pysqlite_state *state = pysqlite_get_state(module);
     PyObject *protocol = (PyObject *)state->PrepareProtocolType;
-    rc = pysqlite_microprotocols_add(type, protocol, caster);
+    rc = pysqlite_microprotocols_add(state, type, protocol, caster);
     if (rc == -1) {
         return NULL;
     }
@@ -395,16 +393,11 @@ static int add_integer_constants(PyObject *module) {
     return ret;
 }
 
-static struct PyModuleDef _sqlite3module = {
-        PyModuleDef_HEAD_INIT,
-        "_sqlite3",
-        NULL,
-        -1,
-        module_methods,
-        NULL,
-        NULL,
-        NULL,
-        NULL
+struct PyModuleDef _sqlite3module = {
+    .m_base = PyModuleDef_HEAD_INIT,
+    .m_name = "_sqlite3",
+    .m_size = sizeof(pysqlite_state),
+    .m_methods = module_methods,
 };
 
 #define ADD_TYPE(module, type)                 \
index c273c1f9ed9f292321a01e097d293361b3a0b182..1d319f1ed5541ebbc4ca5bcaf1789e72ac45c2c4 100644 (file)
@@ -63,22 +63,20 @@ typedef struct {
 extern pysqlite_state pysqlite_global_state;
 
 static inline pysqlite_state *
-pysqlite_get_state(PyObject *Py_UNUSED(module))
+pysqlite_get_state(PyObject *module)
 {
-    return &pysqlite_global_state;  // Replace with PyModule_GetState
+    pysqlite_state *state = (pysqlite_state *)PyModule_GetState(module);
+    assert(state != NULL);
+    return state;
 }
 
+extern struct PyModuleDef _sqlite3module;
 static inline pysqlite_state *
-pysqlite_get_state_by_cls(PyTypeObject *Py_UNUSED(cls))
+pysqlite_get_state_by_type(PyTypeObject *tp)
 {
-    return &pysqlite_global_state;  // Replace with PyType_GetModuleState
-}
-
-static inline pysqlite_state *
-pysqlite_get_state_by_type(PyTypeObject *Py_UNUSED(tp))
-{
-    // Replace with _PyType_GetModuleByDef & PyModule_GetState
-    return &pysqlite_global_state;
+    PyObject *module = _PyType_GetModuleByDef(tp, &_sqlite3module);
+    assert(module != NULL);
+    return pysqlite_get_state(module);
 }
 
 extern const char *pysqlite_error_name(int rc);
index b146c9dc5e3bd1db262222206170d9ba55e8be8c..1a1943285ce008fc7eda286af5819fdcf8a94065 100644 (file)
@@ -24,7 +24,7 @@
 #include "row.h"
 #include "cursor.h"
 
-#define clinic_state() (pysqlite_get_state(NULL))
+#define clinic_state() (pysqlite_get_state_by_type(type))
 #include "clinic/row.c.h"
 #undef clinic_state
 
@@ -219,7 +219,7 @@ static PyObject* pysqlite_row_richcompare(pysqlite_Row *self, PyObject *_other,
     if (opid != Py_EQ && opid != Py_NE)
         Py_RETURN_NOTIMPLEMENTED;
 
-    pysqlite_state *state = pysqlite_get_state_by_cls(Py_TYPE(self));
+    pysqlite_state *state = pysqlite_get_state_by_type(Py_TYPE(self));
     if (PyObject_TypeCheck(_other, state->RowType)) {
         pysqlite_Row *other = (pysqlite_Row *)_other;
         int eq = PyObject_RichCompareBool(self->description, other->description, Py_EQ);