From 004d092b5a27618154fe08c3c9367442696f3ecb Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Thu, 3 Feb 2022 23:20:48 +0100 Subject: [PATCH 1/8] Use _Py_ID in sqlite3 --- Include/internal/pycore_global_strings.h | 2 ++ Include/internal/pycore_runtime_init.h | 2 ++ Modules/_sqlite/connection.c | 29 ++++++++---------------- Modules/_sqlite/cursor.c | 5 +--- Modules/_sqlite/microprotocols.c | 8 ++----- Modules/_sqlite/module.c | 5 +--- Modules/_sqlite/module.h | 7 ++++++ 7 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index aa597bc8281a5a..265d3261bc9cdd 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -52,6 +52,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(__abc_tpflags__) STRUCT_FOR_ID(__abs__) STRUCT_FOR_ID(__abstractmethods__) + STRUCT_FOR_ID(__adapt__) STRUCT_FOR_ID(__add__) STRUCT_FOR_ID(__aenter__) STRUCT_FOR_ID(__aexit__) @@ -73,6 +74,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(__class_getitem__) STRUCT_FOR_ID(__classcell__) STRUCT_FOR_ID(__complex__) + STRUCT_FOR_ID(__conform__) STRUCT_FOR_ID(__contains__) STRUCT_FOR_ID(__copy__) STRUCT_FOR_ID(__del__) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index 04c1e671235eae..eb99456c947a05 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -667,6 +667,7 @@ extern "C" { INIT_ID(__abc_tpflags__), \ INIT_ID(__abs__), \ INIT_ID(__abstractmethods__), \ + INIT_ID(__adapt__), \ INIT_ID(__add__), \ INIT_ID(__aenter__), \ INIT_ID(__aexit__), \ @@ -688,6 +689,7 @@ extern "C" { INIT_ID(__class_getitem__), \ INIT_ID(__classcell__), \ INIT_ID(__complex__), \ + INIT_ID(__conform__), \ INIT_ID(__contains__), \ INIT_ID(__copy__), \ INIT_ID(__del__), \ diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index cb8cd2a3d1807c..62f3535e80becb 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -21,8 +21,6 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#define NEEDS_PY_IDENTIFIER - #include "module.h" #include "structmember.h" // PyMemberDef #include "connection.h" @@ -125,8 +123,6 @@ class _sqlite3.Connection "pysqlite_Connection *" "clinic_state()->ConnectionTyp [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=67369db2faf80891]*/ -_Py_IDENTIFIER(cursor); - static void _pysqlite_drop_unused_cursor_references(pysqlite_Connection* self); static void free_callback_context(callback_context *ctx); static void set_callback_context(callback_context **ctx_pp, @@ -782,7 +778,6 @@ final_callback(sqlite3_context *context) PyObject* function_result; PyObject** aggregate_instance; - _Py_IDENTIFIER(finalize); int ok; PyObject *exception, *value, *tb; @@ -801,7 +796,7 @@ final_callback(sqlite3_context *context) /* Keep the exception (if any) of the last call to step() */ PyErr_Fetch(&exception, &value, &tb); - function_result = _PyObject_CallMethodIdNoArgs(*aggregate_instance, &PyId_finalize); + function_result = PyObject_CallMethodNoArgs(*aggregate_instance, &_Py_ID(finalize)); Py_DECREF(*aggregate_instance); @@ -1432,16 +1427,15 @@ pysqlite_connection_execute_impl(pysqlite_Connection *self, PyObject *sql, PyObject *parameters) /*[clinic end generated code: output=5be05ae01ee17ee4 input=fbd17c75c7140271]*/ { - _Py_IDENTIFIER(execute); PyObject* cursor = 0; PyObject* result = 0; - cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); + cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); if (!cursor) { goto error; } - result = _PyObject_CallMethodIdObjArgs(cursor, &PyId_execute, sql, parameters, NULL); + result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(execute), sql, parameters, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1467,17 +1461,16 @@ pysqlite_connection_executemany_impl(pysqlite_Connection *self, PyObject *sql, PyObject *parameters) /*[clinic end generated code: output=776cd2fd20bfe71f input=4feab80659ffc82b]*/ { - _Py_IDENTIFIER(executemany); PyObject* cursor = 0; PyObject* result = 0; - cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); + cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); if (!cursor) { goto error; } - result = _PyObject_CallMethodIdObjArgs(cursor, &PyId_executemany, sql, - parameters, NULL); + result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(executemany), sql, + parameters, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1502,17 +1495,16 @@ pysqlite_connection_executescript(pysqlite_Connection *self, PyObject *script_obj) /*[clinic end generated code: output=4c4f9d77aa0ae37d input=b27ae5c24ffb8b43]*/ { - _Py_IDENTIFIER(executescript); PyObject* cursor = 0; PyObject* result = 0; - cursor = _PyObject_CallMethodIdNoArgs((PyObject*)self, &PyId_cursor); + cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); if (!cursor) { goto error; } - result = _PyObject_CallMethodIdObjArgs(cursor, &PyId_executescript, - script_obj, NULL); + result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(executescript), + script_obj, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1620,7 +1612,6 @@ static PyObject * pysqlite_connection_iterdump_impl(pysqlite_Connection *self) /*[clinic end generated code: output=586997aaf9808768 input=53bc907cb5eedb85]*/ { - _Py_IDENTIFIER(_iterdump); PyObject* retval = NULL; PyObject* module = NULL; PyObject* module_dict; @@ -1640,7 +1631,7 @@ pysqlite_connection_iterdump_impl(pysqlite_Connection *self) goto finally; } - pyfn_iterdump = _PyDict_GetItemIdWithError(module_dict, &PyId__iterdump); + pyfn_iterdump = PyDict_GetItemWithError(module_dict, &_Py_ID(_iterdump)); if (!pyfn_iterdump) { if (!PyErr_Occurred()) { PyErr_SetString(self->OperationalError, diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 395b10f33ff3a5..6b57bf2fe2ffa0 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -21,8 +21,6 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#define NEEDS_PY_IDENTIFIER - #include "cursor.h" #include "module.h" #include "util.h" @@ -131,13 +129,12 @@ _pysqlite_get_converter(pysqlite_state *state, const char *keystr, PyObject *key; PyObject *upcase_key; PyObject *retval; - _Py_IDENTIFIER(upper); key = PyUnicode_FromStringAndSize(keystr, keylen); if (!key) { return NULL; } - upcase_key = _PyObject_CallMethodIdNoArgs(key, &PyId_upper); + upcase_key = PyObject_CallMethodNoArgs(key, &_Py_ID(upper)); Py_DECREF(key); if (!upcase_key) { return NULL; diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 697d1a788a3b01..772966220660ec 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -23,8 +23,6 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#define NEEDS_PY_IDENTIFIER - #include #include "cursor.h" @@ -76,8 +74,6 @@ PyObject * pysqlite_microprotocols_adapt(pysqlite_state *state, PyObject *obj, PyObject *proto, PyObject *alt) { - _Py_IDENTIFIER(__adapt__); - _Py_IDENTIFIER(__conform__); PyObject *adapter, *key, *adapted; /* we don't check for exact type conformance as specified in PEP 246 @@ -102,7 +98,7 @@ pysqlite_microprotocols_adapt(pysqlite_state *state, PyObject *obj, } /* try to have the protocol adapt this object */ - if (_PyObject_LookupAttrId(proto, &PyId___adapt__, &adapter) < 0) { + if (_PyObject_LookupAttr(proto, &_Py_ID(__adapt__), &adapter) < 0) { return NULL; } if (adapter) { @@ -121,7 +117,7 @@ pysqlite_microprotocols_adapt(pysqlite_state *state, PyObject *obj, } /* and finally try to have the object adapt itself */ - if (_PyObject_LookupAttrId(obj, &PyId___conform__, &adapter) < 0) { + if (_PyObject_LookupAttr(obj, &_Py_ID(__conform__), &adapter) < 0) { return NULL; } if (adapter) { diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index cfa4b970e73206..056acf90482d0d 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -21,8 +21,6 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#define NEEDS_PY_IDENTIFIER - #include "connection.h" #include "statement.h" #include "cursor.h" @@ -185,10 +183,9 @@ pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name, { PyObject* name = NULL; PyObject* retval = NULL; - _Py_IDENTIFIER(upper); /* convert the name to upper case */ - name = _PyObject_CallMethodIdNoArgs(orig_name, &PyId_upper); + name = PyObject_CallMethodNoArgs(orig_name, &_Py_ID(upper)); if (!name) { goto error; } diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h index a248d044af8fdc..26392306ffde3e 100644 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -23,9 +23,16 @@ #ifndef PYSQLITE_MODULE_H #define PYSQLITE_MODULE_H + +#ifndef Py_BUILD_CORE_BUILTIN +# define Py_BUILD_CORE_MODULE 1 +#endif + #define PY_SSIZE_T_CLEAN #include "Python.h" +#include "pycore_runtime.h" // _Py_ID() + #define PYSQLITE_VERSION "2.6.0" #define MODULE_NAME "sqlite3" From 841a72aceea92fa83f3a5f4163a28493b4d12ca0 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Feb 2022 10:28:13 +0100 Subject: [PATCH 2/8] Only include Python.h in module.h --- Modules/_sqlite/connection.h | 7 +++---- Modules/_sqlite/cursor.c | 1 - Modules/_sqlite/cursor.h | 4 +--- Modules/_sqlite/microprotocols.c | 4 +--- Modules/_sqlite/microprotocols.h | 3 +-- Modules/_sqlite/module.c | 1 + Modules/_sqlite/prepare_protocol.h | 1 + Modules/_sqlite/row.h | 4 ++-- Modules/_sqlite/statement.h | 3 +-- Modules/_sqlite/util.c | 2 +- Modules/_sqlite/util.h | 4 ++-- 11 files changed, 14 insertions(+), 20 deletions(-) diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index 84f1f095cb3867..35093c47772c38 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -23,13 +23,12 @@ #ifndef PYSQLITE_CONNECTION_H #define PYSQLITE_CONNECTION_H -#define PY_SSIZE_T_CLEAN -#include "Python.h" -#include "pythread.h" -#include "structmember.h" #include "module.h" +#include "pythread.h" +#include "structmember.h" + #include "sqlite3.h" typedef struct _callback_context diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 6b57bf2fe2ffa0..91478beeedb7c1 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -22,7 +22,6 @@ */ #include "cursor.h" -#include "module.h" #include "util.h" #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self))) diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index 0bcdddc3e29595..0f0def86de3971 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -23,12 +23,10 @@ #ifndef PYSQLITE_CURSOR_H #define PYSQLITE_CURSOR_H -#define PY_SSIZE_T_CLEAN -#include "Python.h" +#include "module.h" #include "statement.h" #include "connection.h" -#include "module.h" typedef struct { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 772966220660ec..f754a56453d92e 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -23,10 +23,8 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include - -#include "cursor.h" #include "microprotocols.h" +#include "cursor.h" #include "prepare_protocol.h" diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h index 6bde9d01f45299..e95ea78ac10bfd 100644 --- a/Modules/_sqlite/microprotocols.h +++ b/Modules/_sqlite/microprotocols.h @@ -26,8 +26,7 @@ #ifndef PSYCOPG_MICROPROTOCOLS_H #define PSYCOPG_MICROPROTOCOLS_H 1 -#define PY_SSIZE_T_CLEAN -#include +#include "module.h" /** exported functions **/ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 056acf90482d0d..40d139ada68a6f 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -21,6 +21,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ +#include "module.h" #include "connection.h" #include "statement.h" #include "cursor.h" diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h index afc55a8c1c4eb1..7f8695bcd1a8fe 100644 --- a/Modules/_sqlite/prepare_protocol.h +++ b/Modules/_sqlite/prepare_protocol.h @@ -23,6 +23,7 @@ #ifndef PYSQLITE_PREPARE_PROTOCOL_H #define PYSQLITE_PREPARE_PROTOCOL_H + #include "module.h" typedef struct diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h index b51909817584ba..8b63d6c03459c9 100644 --- a/Modules/_sqlite/row.h +++ b/Modules/_sqlite/row.h @@ -23,8 +23,8 @@ #ifndef PYSQLITE_ROW_H #define PYSQLITE_ROW_H -#define PY_SSIZE_T_CLEAN -#include "Python.h" + +#include "module.h" typedef struct _Row { diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index b901c43c479ae2..60cdaeb9b403c8 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -23,9 +23,8 @@ #ifndef PYSQLITE_STATEMENT_H #define PYSQLITE_STATEMENT_H -#define PY_SSIZE_T_CLEAN -#include "Python.h" +#include "module.h" #include "connection.h" #include "sqlite3.h" diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 113b581bfac735..32d99224488587 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -21,7 +21,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "module.h" +#include "util.h" #include "connection.h" int diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index 5eee3fac6f114e..c1fb7ab726595c 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -23,8 +23,8 @@ #ifndef PYSQLITE_UTIL_H #define PYSQLITE_UTIL_H -#define PY_SSIZE_T_CLEAN -#include "Python.h" + +#include "module.h" #include "pythread.h" #include "sqlite3.h" #include "connection.h" From 339d1f7594afae82ba5a97f4c317745b7767e101 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Feb 2022 10:34:51 +0100 Subject: [PATCH 3/8] Regen global objects --- Include/internal/pycore_global_strings.h | 7 +++++++ Include/internal/pycore_runtime_init.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 265d3261bc9cdd..36e01917fa476f 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -205,6 +205,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(_handle_fromlist) STRUCT_FOR_ID(_initializing) STRUCT_FOR_ID(_is_text_encoding) + STRUCT_FOR_ID(_iterdump) STRUCT_FOR_ID(_lock_unlock_module) STRUCT_FOR_ID(_showwarnmsg) STRUCT_FOR_ID(_shutdown) @@ -223,6 +224,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(code) STRUCT_FOR_ID(copy) STRUCT_FOR_ID(copyreg) + STRUCT_FOR_ID(cursor) STRUCT_FOR_ID(decode) STRUCT_FOR_ID(default) STRUCT_FOR_ID(defaultaction) @@ -235,11 +237,15 @@ struct _Py_global_strings { STRUCT_FOR_ID(end_offset) STRUCT_FOR_ID(errors) STRUCT_FOR_ID(excepthook) + STRUCT_FOR_ID(execute) + STRUCT_FOR_ID(executemany) + STRUCT_FOR_ID(executescript) STRUCT_FOR_ID(extend) STRUCT_FOR_ID(filename) STRUCT_FOR_ID(fileno) STRUCT_FOR_ID(fillvalue) STRUCT_FOR_ID(filters) + STRUCT_FOR_ID(finalize) STRUCT_FOR_ID(find_class) STRUCT_FOR_ID(flush) STRUCT_FOR_ID(get) @@ -310,6 +316,7 @@ struct _Py_global_strings { STRUCT_FOR_ID(threading) STRUCT_FOR_ID(throw) STRUCT_FOR_ID(unraisablehook) + STRUCT_FOR_ID(upper) STRUCT_FOR_ID(values) STRUCT_FOR_ID(version) STRUCT_FOR_ID(warnings) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index eb99456c947a05..f7635cf47a3840 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -820,6 +820,7 @@ extern "C" { INIT_ID(_handle_fromlist), \ INIT_ID(_initializing), \ INIT_ID(_is_text_encoding), \ + INIT_ID(_iterdump), \ INIT_ID(_lock_unlock_module), \ INIT_ID(_showwarnmsg), \ INIT_ID(_shutdown), \ @@ -838,6 +839,7 @@ extern "C" { INIT_ID(code), \ INIT_ID(copy), \ INIT_ID(copyreg), \ + INIT_ID(cursor), \ INIT_ID(decode), \ INIT_ID(default), \ INIT_ID(defaultaction), \ @@ -850,11 +852,15 @@ extern "C" { INIT_ID(end_offset), \ INIT_ID(errors), \ INIT_ID(excepthook), \ + INIT_ID(execute), \ + INIT_ID(executemany), \ + INIT_ID(executescript), \ INIT_ID(extend), \ INIT_ID(filename), \ INIT_ID(fileno), \ INIT_ID(fillvalue), \ INIT_ID(filters), \ + INIT_ID(finalize), \ INIT_ID(find_class), \ INIT_ID(flush), \ INIT_ID(get), \ @@ -925,6 +931,7 @@ extern "C" { INIT_ID(threading), \ INIT_ID(throw), \ INIT_ID(unraisablehook), \ + INIT_ID(upper), \ INIT_ID(values), \ INIT_ID(version), \ INIT_ID(warnings), \ From dddc95a8d384c79603f21a040f3f5877f1640857 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Feb 2022 10:44:34 +0100 Subject: [PATCH 4/8] Revert unneeded changes --- Modules/_sqlite/prepare_protocol.h | 1 - Modules/_sqlite/util.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/_sqlite/prepare_protocol.h b/Modules/_sqlite/prepare_protocol.h index 7f8695bcd1a8fe..afc55a8c1c4eb1 100644 --- a/Modules/_sqlite/prepare_protocol.h +++ b/Modules/_sqlite/prepare_protocol.h @@ -23,7 +23,6 @@ #ifndef PYSQLITE_PREPARE_PROTOCOL_H #define PYSQLITE_PREPARE_PROTOCOL_H - #include "module.h" typedef struct diff --git a/Modules/_sqlite/util.c b/Modules/_sqlite/util.c index 32d99224488587..113b581bfac735 100644 --- a/Modules/_sqlite/util.c +++ b/Modules/_sqlite/util.c @@ -21,7 +21,7 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "util.h" +#include "module.h" #include "connection.h" int From fd321550122057c4cd57fec6961fec24d82e7cdc Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Feb 2022 20:55:22 +0100 Subject: [PATCH 5/8] Revert "Only include Python.h in module.h" This reverts commit 841a72aceea92fa83f3a5f4163a28493b4d12ca0. --- Modules/_sqlite/connection.h | 7 ++++--- Modules/_sqlite/cursor.c | 1 + Modules/_sqlite/cursor.h | 4 +++- Modules/_sqlite/microprotocols.c | 4 +++- Modules/_sqlite/microprotocols.h | 3 ++- Modules/_sqlite/module.c | 1 - Modules/_sqlite/row.h | 4 ++-- Modules/_sqlite/statement.h | 3 ++- Modules/_sqlite/util.h | 4 ++-- 9 files changed, 19 insertions(+), 12 deletions(-) diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h index 35093c47772c38..84f1f095cb3867 100644 --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -23,12 +23,13 @@ #ifndef PYSQLITE_CONNECTION_H #define PYSQLITE_CONNECTION_H - -#include "module.h" - +#define PY_SSIZE_T_CLEAN +#include "Python.h" #include "pythread.h" #include "structmember.h" +#include "module.h" + #include "sqlite3.h" typedef struct _callback_context diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 91478beeedb7c1..6b57bf2fe2ffa0 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -22,6 +22,7 @@ */ #include "cursor.h" +#include "module.h" #include "util.h" #define clinic_state() (pysqlite_get_state_by_type(Py_TYPE(self))) diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h index 0f0def86de3971..0bcdddc3e29595 100644 --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -23,10 +23,12 @@ #ifndef PYSQLITE_CURSOR_H #define PYSQLITE_CURSOR_H +#define PY_SSIZE_T_CLEAN +#include "Python.h" -#include "module.h" #include "statement.h" #include "connection.h" +#include "module.h" typedef struct { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index f754a56453d92e..772966220660ec 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -23,8 +23,10 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "microprotocols.h" +#include + #include "cursor.h" +#include "microprotocols.h" #include "prepare_protocol.h" diff --git a/Modules/_sqlite/microprotocols.h b/Modules/_sqlite/microprotocols.h index e95ea78ac10bfd..6bde9d01f45299 100644 --- a/Modules/_sqlite/microprotocols.h +++ b/Modules/_sqlite/microprotocols.h @@ -26,7 +26,8 @@ #ifndef PSYCOPG_MICROPROTOCOLS_H #define PSYCOPG_MICROPROTOCOLS_H 1 -#include "module.h" +#define PY_SSIZE_T_CLEAN +#include /** exported functions **/ diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 40d139ada68a6f..056acf90482d0d 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -21,7 +21,6 @@ * 3. This notice may not be removed or altered from any source distribution. */ -#include "module.h" #include "connection.h" #include "statement.h" #include "cursor.h" diff --git a/Modules/_sqlite/row.h b/Modules/_sqlite/row.h index 8b63d6c03459c9..b51909817584ba 100644 --- a/Modules/_sqlite/row.h +++ b/Modules/_sqlite/row.h @@ -23,8 +23,8 @@ #ifndef PYSQLITE_ROW_H #define PYSQLITE_ROW_H - -#include "module.h" +#define PY_SSIZE_T_CLEAN +#include "Python.h" typedef struct _Row { diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 60cdaeb9b403c8..b901c43c479ae2 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -23,8 +23,9 @@ #ifndef PYSQLITE_STATEMENT_H #define PYSQLITE_STATEMENT_H +#define PY_SSIZE_T_CLEAN +#include "Python.h" -#include "module.h" #include "connection.h" #include "sqlite3.h" diff --git a/Modules/_sqlite/util.h b/Modules/_sqlite/util.h index c1fb7ab726595c..5eee3fac6f114e 100644 --- a/Modules/_sqlite/util.h +++ b/Modules/_sqlite/util.h @@ -23,8 +23,8 @@ #ifndef PYSQLITE_UTIL_H #define PYSQLITE_UTIL_H - -#include "module.h" +#define PY_SSIZE_T_CLEAN +#include "Python.h" #include "pythread.h" #include "sqlite3.h" #include "connection.h" From ac8c3db3fc81a25238799e4c4d6ccf8664ea1f5c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Tue, 15 Feb 2022 20:55:34 +0100 Subject: [PATCH 6/8] Revert "Regen global objects" This reverts commit 339d1f7594afae82ba5a97f4c317745b7767e101. --- Include/internal/pycore_global_strings.h | 9 --------- Include/internal/pycore_runtime_init.h | 9 --------- 2 files changed, 18 deletions(-) diff --git a/Include/internal/pycore_global_strings.h b/Include/internal/pycore_global_strings.h index 36e01917fa476f..aa597bc8281a5a 100644 --- a/Include/internal/pycore_global_strings.h +++ b/Include/internal/pycore_global_strings.h @@ -52,7 +52,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(__abc_tpflags__) STRUCT_FOR_ID(__abs__) STRUCT_FOR_ID(__abstractmethods__) - STRUCT_FOR_ID(__adapt__) STRUCT_FOR_ID(__add__) STRUCT_FOR_ID(__aenter__) STRUCT_FOR_ID(__aexit__) @@ -74,7 +73,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(__class_getitem__) STRUCT_FOR_ID(__classcell__) STRUCT_FOR_ID(__complex__) - STRUCT_FOR_ID(__conform__) STRUCT_FOR_ID(__contains__) STRUCT_FOR_ID(__copy__) STRUCT_FOR_ID(__del__) @@ -205,7 +203,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(_handle_fromlist) STRUCT_FOR_ID(_initializing) STRUCT_FOR_ID(_is_text_encoding) - STRUCT_FOR_ID(_iterdump) STRUCT_FOR_ID(_lock_unlock_module) STRUCT_FOR_ID(_showwarnmsg) STRUCT_FOR_ID(_shutdown) @@ -224,7 +221,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(code) STRUCT_FOR_ID(copy) STRUCT_FOR_ID(copyreg) - STRUCT_FOR_ID(cursor) STRUCT_FOR_ID(decode) STRUCT_FOR_ID(default) STRUCT_FOR_ID(defaultaction) @@ -237,15 +233,11 @@ struct _Py_global_strings { STRUCT_FOR_ID(end_offset) STRUCT_FOR_ID(errors) STRUCT_FOR_ID(excepthook) - STRUCT_FOR_ID(execute) - STRUCT_FOR_ID(executemany) - STRUCT_FOR_ID(executescript) STRUCT_FOR_ID(extend) STRUCT_FOR_ID(filename) STRUCT_FOR_ID(fileno) STRUCT_FOR_ID(fillvalue) STRUCT_FOR_ID(filters) - STRUCT_FOR_ID(finalize) STRUCT_FOR_ID(find_class) STRUCT_FOR_ID(flush) STRUCT_FOR_ID(get) @@ -316,7 +308,6 @@ struct _Py_global_strings { STRUCT_FOR_ID(threading) STRUCT_FOR_ID(throw) STRUCT_FOR_ID(unraisablehook) - STRUCT_FOR_ID(upper) STRUCT_FOR_ID(values) STRUCT_FOR_ID(version) STRUCT_FOR_ID(warnings) diff --git a/Include/internal/pycore_runtime_init.h b/Include/internal/pycore_runtime_init.h index f7635cf47a3840..04c1e671235eae 100644 --- a/Include/internal/pycore_runtime_init.h +++ b/Include/internal/pycore_runtime_init.h @@ -667,7 +667,6 @@ extern "C" { INIT_ID(__abc_tpflags__), \ INIT_ID(__abs__), \ INIT_ID(__abstractmethods__), \ - INIT_ID(__adapt__), \ INIT_ID(__add__), \ INIT_ID(__aenter__), \ INIT_ID(__aexit__), \ @@ -689,7 +688,6 @@ extern "C" { INIT_ID(__class_getitem__), \ INIT_ID(__classcell__), \ INIT_ID(__complex__), \ - INIT_ID(__conform__), \ INIT_ID(__contains__), \ INIT_ID(__copy__), \ INIT_ID(__del__), \ @@ -820,7 +818,6 @@ extern "C" { INIT_ID(_handle_fromlist), \ INIT_ID(_initializing), \ INIT_ID(_is_text_encoding), \ - INIT_ID(_iterdump), \ INIT_ID(_lock_unlock_module), \ INIT_ID(_showwarnmsg), \ INIT_ID(_shutdown), \ @@ -839,7 +836,6 @@ extern "C" { INIT_ID(code), \ INIT_ID(copy), \ INIT_ID(copyreg), \ - INIT_ID(cursor), \ INIT_ID(decode), \ INIT_ID(default), \ INIT_ID(defaultaction), \ @@ -852,15 +848,11 @@ extern "C" { INIT_ID(end_offset), \ INIT_ID(errors), \ INIT_ID(excepthook), \ - INIT_ID(execute), \ - INIT_ID(executemany), \ - INIT_ID(executescript), \ INIT_ID(extend), \ INIT_ID(filename), \ INIT_ID(fileno), \ INIT_ID(fillvalue), \ INIT_ID(filters), \ - INIT_ID(finalize), \ INIT_ID(find_class), \ INIT_ID(flush), \ INIT_ID(get), \ @@ -931,7 +923,6 @@ extern "C" { INIT_ID(threading), \ INIT_ID(throw), \ INIT_ID(unraisablehook), \ - INIT_ID(upper), \ INIT_ID(values), \ INIT_ID(version), \ INIT_ID(warnings), \ From 843d19a32210a8cefdc052e405ca454b28f3bdc4 Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 16 Feb 2022 01:26:38 +0100 Subject: [PATCH 7/8] Use interned strings --- Modules/_sqlite/connection.c | 33 +++++++++++++++----------- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/microprotocols.c | 4 ++-- Modules/_sqlite/module.c | 40 ++++++++++++++++++++++++++++++-- Modules/_sqlite/module.h | 16 +++++++------ 5 files changed, 69 insertions(+), 26 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 62f3535e80becb..1fe5aa0fec52b2 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -796,8 +796,10 @@ final_callback(sqlite3_context *context) /* Keep the exception (if any) of the last call to step() */ PyErr_Fetch(&exception, &value, &tb); - function_result = PyObject_CallMethodNoArgs(*aggregate_instance, &_Py_ID(finalize)); - + callback_context *ctx = (callback_context *)sqlite3_user_data(context); + assert(ctx != NULL); + function_result = PyObject_CallMethodNoArgs(*aggregate_instance, + ctx->state->str_finalize); Py_DECREF(*aggregate_instance); ok = 0; @@ -1427,15 +1429,15 @@ pysqlite_connection_execute_impl(pysqlite_Connection *self, PyObject *sql, PyObject *parameters) /*[clinic end generated code: output=5be05ae01ee17ee4 input=fbd17c75c7140271]*/ { - PyObject* cursor = 0; PyObject* result = 0; - cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); + PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL); if (!cursor) { goto error; } - result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(execute), sql, parameters, NULL); + PyObject *meth = self->state->str_execute; // borrowed ref. + result = PyObject_CallMethodObjArgs(cursor, meth, sql, parameters, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1461,16 +1463,15 @@ pysqlite_connection_executemany_impl(pysqlite_Connection *self, PyObject *sql, PyObject *parameters) /*[clinic end generated code: output=776cd2fd20bfe71f input=4feab80659ffc82b]*/ { - PyObject* cursor = 0; PyObject* result = 0; - cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); + PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL); if (!cursor) { goto error; } - result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(executemany), sql, - parameters, NULL); + PyObject *meth = self->state->str_executemany; // borrowed ref. + result = PyObject_CallMethodObjArgs(cursor, meth, sql, parameters, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1495,16 +1496,15 @@ pysqlite_connection_executescript(pysqlite_Connection *self, PyObject *script_obj) /*[clinic end generated code: output=4c4f9d77aa0ae37d input=b27ae5c24ffb8b43]*/ { - PyObject* cursor = 0; PyObject* result = 0; - cursor = PyObject_CallMethodNoArgs((PyObject*)self, &_Py_ID(cursor)); + PyObject *cursor = pysqlite_connection_cursor_impl(self, NULL); if (!cursor) { goto error; } - result = PyObject_CallMethodObjArgs(cursor, &_Py_ID(executescript), - script_obj, NULL); + PyObject *meth = self->state->str_executescript; // borrowed ref. + result = PyObject_CallMethodObjArgs(cursor, meth, script_obj, NULL); if (!result) { Py_CLEAR(cursor); } @@ -1631,7 +1631,12 @@ pysqlite_connection_iterdump_impl(pysqlite_Connection *self) goto finally; } - pyfn_iterdump = PyDict_GetItemWithError(module_dict, &_Py_ID(_iterdump)); + PyObject *meth = PyUnicode_InternFromString("_iterdump"); + if (meth == NULL) { + goto finally; + } + pyfn_iterdump = PyDict_GetItemWithError(module_dict, meth); + Py_DECREF(meth); if (!pyfn_iterdump) { if (!PyErr_Occurred()) { PyErr_SetString(self->OperationalError, diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 6b57bf2fe2ffa0..df1af53b4ee404 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -134,7 +134,7 @@ _pysqlite_get_converter(pysqlite_state *state, const char *keystr, if (!key) { return NULL; } - upcase_key = PyObject_CallMethodNoArgs(key, &_Py_ID(upper)); + upcase_key = PyObject_CallMethodNoArgs(key, state->str_upper); Py_DECREF(key); if (!upcase_key) { return NULL; diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c index 772966220660ec..a79f0067b17e8c 100644 --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -98,7 +98,7 @@ pysqlite_microprotocols_adapt(pysqlite_state *state, PyObject *obj, } /* try to have the protocol adapt this object */ - if (_PyObject_LookupAttr(proto, &_Py_ID(__adapt__), &adapter) < 0) { + if (_PyObject_LookupAttr(proto, state->str___adapt__, &adapter) < 0) { return NULL; } if (adapter) { @@ -117,7 +117,7 @@ pysqlite_microprotocols_adapt(pysqlite_state *state, PyObject *obj, } /* and finally try to have the object adapt itself */ - if (_PyObject_LookupAttr(obj, &_Py_ID(__conform__), &adapter) < 0) { + if (_PyObject_LookupAttr(obj, state->str___conform__, &adapter) < 0) { return NULL; } if (adapter) { diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 056acf90482d0d..1d20c242dc9a6c 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -185,12 +185,12 @@ pysqlite_register_converter_impl(PyObject *module, PyObject *orig_name, PyObject* retval = NULL; /* convert the name to upper case */ - name = PyObject_CallMethodNoArgs(orig_name, &_Py_ID(upper)); + pysqlite_state *state = pysqlite_get_state(module); + name = PyObject_CallMethodNoArgs(orig_name, state->str_upper); if (!name) { goto error; } - pysqlite_state *state = pysqlite_get_state(module); if (PyDict_SetItem(state->converters, name, callable) != 0) { goto error; } @@ -590,6 +590,15 @@ module_traverse(PyObject *module, visitproc visit, void *arg) Py_VISIT(state->lru_cache); Py_VISIT(state->psyco_adapters); + // Interned strings + Py_VISIT(state->str___adapt__); + Py_VISIT(state->str___conform__); + Py_VISIT(state->str_execute); + Py_VISIT(state->str_executemany); + Py_VISIT(state->str_executescript); + Py_VISIT(state->str_finalize); + Py_VISIT(state->str_upper); + return 0; } @@ -622,6 +631,15 @@ module_clear(PyObject *module) Py_CLEAR(state->lru_cache); Py_CLEAR(state->psyco_adapters); + // Interned strings + Py_CLEAR(state->str___adapt__); + Py_CLEAR(state->str___conform__); + Py_CLEAR(state->str_execute); + Py_CLEAR(state->str_executemany); + Py_CLEAR(state->str_executescript); + Py_CLEAR(state->str_finalize); + Py_CLEAR(state->str_upper); + return 0; } @@ -647,6 +665,15 @@ do { \ ADD_TYPE(module, (PyTypeObject *)state->exc); \ } while (0) +#define ADD_INTERNED(state, string) \ +do { \ + PyObject *tmp = PyUnicode_InternFromString(#string); \ + if (tmp == NULL) { \ + goto error; \ + } \ + state->str_ ## string = tmp; \ +} while (0) + static int module_exec(PyObject *module) { @@ -692,6 +719,15 @@ module_exec(PyObject *module) ADD_EXCEPTION(module, state, DataError, state->DatabaseError); ADD_EXCEPTION(module, state, NotSupportedError, state->DatabaseError); + /* Add interned strings */ + ADD_INTERNED(state, __adapt__); + ADD_INTERNED(state, __conform__); + ADD_INTERNED(state, execute); + ADD_INTERNED(state, executemany); + ADD_INTERNED(state, executescript); + ADD_INTERNED(state, finalize); + ADD_INTERNED(state, upper); + /* Set error constants */ if (add_error_constants(module) < 0) { goto error; diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h index 26392306ffde3e..5dcc7456f22bdc 100644 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -23,16 +23,9 @@ #ifndef PYSQLITE_MODULE_H #define PYSQLITE_MODULE_H - -#ifndef Py_BUILD_CORE_BUILTIN -# define Py_BUILD_CORE_MODULE 1 -#endif - #define PY_SSIZE_T_CLEAN #include "Python.h" -#include "pycore_runtime.h" // _Py_ID() - #define PYSQLITE_VERSION "2.6.0" #define MODULE_NAME "sqlite3" @@ -65,6 +58,15 @@ typedef struct { PyTypeObject *PrepareProtocolType; PyTypeObject *RowType; PyTypeObject *StatementType; + + /* Pointers to interned strings */ + PyObject *str___adapt__; + PyObject *str___conform__; + PyObject *str_execute; + PyObject *str_executemany; + PyObject *str_executescript; + PyObject *str_finalize; + PyObject *str_upper; } pysqlite_state; extern pysqlite_state pysqlite_global_state; From b2d945ab7c4750e1627742f7b0dbac15a32ecacd Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Wed, 16 Feb 2022 10:56:44 +0100 Subject: [PATCH 8/8] Call execute/executemany directly --- Modules/_sqlite/connection.c | 7 +++---- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/module.c | 6 ------ Modules/_sqlite/module.h | 2 -- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c index 1fe5aa0fec52b2..0efb5ae35a7f55 100644 --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -128,6 +128,7 @@ static void free_callback_context(callback_context *ctx); static void set_callback_context(callback_context **ctx_pp, callback_context *ctx); static void connection_close(pysqlite_Connection *self); +PyObject *_pysqlite_query_execute(pysqlite_Cursor *, int, PyObject *, PyObject *); static PyObject * new_statement_cache(pysqlite_Connection *self, pysqlite_state *state, @@ -1436,8 +1437,7 @@ pysqlite_connection_execute_impl(pysqlite_Connection *self, PyObject *sql, goto error; } - PyObject *meth = self->state->str_execute; // borrowed ref. - result = PyObject_CallMethodObjArgs(cursor, meth, sql, parameters, NULL); + result = _pysqlite_query_execute((pysqlite_Cursor *)cursor, 0, sql, parameters); if (!result) { Py_CLEAR(cursor); } @@ -1470,8 +1470,7 @@ pysqlite_connection_executemany_impl(pysqlite_Connection *self, goto error; } - PyObject *meth = self->state->str_executemany; // borrowed ref. - result = PyObject_CallMethodObjArgs(cursor, meth, sql, parameters, NULL); + result = _pysqlite_query_execute((pysqlite_Cursor *)cursor, 1, sql, parameters); if (!result) { Py_CLEAR(cursor); } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index df1af53b4ee404..b0dd9dd39c8eed 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -454,7 +454,7 @@ get_statement_from_cache(pysqlite_Cursor *self, PyObject *operation) return PyObject_Vectorcall(cache, args + 1, nargsf, NULL); } -static PyObject * +PyObject * _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument) { PyObject* parameters_list = NULL; diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c index 1d20c242dc9a6c..35cdcbe0a5c38e 100644 --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -593,8 +593,6 @@ module_traverse(PyObject *module, visitproc visit, void *arg) // Interned strings Py_VISIT(state->str___adapt__); Py_VISIT(state->str___conform__); - Py_VISIT(state->str_execute); - Py_VISIT(state->str_executemany); Py_VISIT(state->str_executescript); Py_VISIT(state->str_finalize); Py_VISIT(state->str_upper); @@ -634,8 +632,6 @@ module_clear(PyObject *module) // Interned strings Py_CLEAR(state->str___adapt__); Py_CLEAR(state->str___conform__); - Py_CLEAR(state->str_execute); - Py_CLEAR(state->str_executemany); Py_CLEAR(state->str_executescript); Py_CLEAR(state->str_finalize); Py_CLEAR(state->str_upper); @@ -722,8 +718,6 @@ module_exec(PyObject *module) /* Add interned strings */ ADD_INTERNED(state, __adapt__); ADD_INTERNED(state, __conform__); - ADD_INTERNED(state, execute); - ADD_INTERNED(state, executemany); ADD_INTERNED(state, executescript); ADD_INTERNED(state, finalize); ADD_INTERNED(state, upper); diff --git a/Modules/_sqlite/module.h b/Modules/_sqlite/module.h index 5dcc7456f22bdc..35c6f385526064 100644 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -62,8 +62,6 @@ typedef struct { /* Pointers to interned strings */ PyObject *str___adapt__; PyObject *str___conform__; - PyObject *str_execute; - PyObject *str_executemany; PyObject *str_executescript; PyObject *str_finalize; PyObject *str_upper;