From 38fa7c526624eb941f45b0c5b1543c004c3b354e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 15 Feb 2022 22:10:01 +0900 Subject: [PATCH 1/3] bpo-46541: Remove usage of _Py_IDENTIFIER from dbms modules --- Modules/_dbmmodule.c | 16 ++++++++++++---- Modules/_gdbmmodule.c | 14 +++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 65778fa77bfec5..591d72e8613988 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -1,9 +1,7 @@ /* DBM module using dictionary interface */ - #define PY_SSIZE_T_CLEAN -#define NEEDS_PY_IDENTIFIER #include "Python.h" #include @@ -38,6 +36,7 @@ typedef struct { PyTypeObject *dbm_type; PyObject *dbm_error; + PyObject *str_close; } _dbm_state; static inline _dbm_state* @@ -396,8 +395,9 @@ dbm__enter__(PyObject *self, PyObject *args) static PyObject * dbm__exit__(PyObject *self, PyObject *args) { - _Py_IDENTIFIER(close); - return _PyObject_CallMethodIdNoArgs(self, &PyId_close); + _dbm_state *state = PyType_GetModuleState(Py_TYPE(self)); + assert(state != NULL); + return PyObject_CallMethodNoArgs(self, state->str_close); } static PyMethodDef dbm_methods[] = { @@ -526,6 +526,12 @@ _dbm_exec(PyObject *module) if (PyModule_AddType(module, (PyTypeObject *)state->dbm_error) < 0) { return -1; } + + PyObject *str_close = PyUnicode_InternFromString("close"); + if (str_close == NULL) { + return -1; + } + state->str_close = str_close; return 0; } @@ -535,6 +541,7 @@ _dbm_module_traverse(PyObject *module, visitproc visit, void *arg) _dbm_state *state = get_dbm_state(module); Py_VISIT(state->dbm_error); Py_VISIT(state->dbm_type); + Py_VISIT(state->str_close); return 0; } @@ -544,6 +551,7 @@ _dbm_module_clear(PyObject *module) _dbm_state *state = get_dbm_state(module); Py_CLEAR(state->dbm_error); Py_CLEAR(state->dbm_type); + Py_CLEAR(state->str_close); return 0; } diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 2d690c0abfd088..752cadea5ae263 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -4,7 +4,6 @@ /* Doc strings: Mitch Chapman */ #define PY_SSIZE_T_CLEAN -#define NEEDS_PY_IDENTIFIER #include "Python.h" #include "gdbm.h" @@ -21,6 +20,7 @@ extern const char * gdbm_strerror(gdbm_error); typedef struct { PyTypeObject *gdbm_type; PyObject *gdbm_error; + PyObject *str_close; } _gdbm_state; static inline _gdbm_state* @@ -545,8 +545,9 @@ gdbm__enter__(PyObject *self, PyObject *args) static PyObject * gdbm__exit__(PyObject *self, PyObject *args) { - _Py_IDENTIFIER(close); - return _PyObject_CallMethodIdNoArgs(self, &PyId_close); + _gdbm_state *state = PyType_GetModuleState(Py_TYPE(self)); + assert(state != NULL); + return PyObject_CallMethodNoArgs(self, state->str_close); } static PyMethodDef gdbm_methods[] = { @@ -740,6 +741,11 @@ _gdbm_exec(PyObject *module) return -1; } #endif + PyObject *str_close = PyUnicode_InternFromString("close"); + if (str_close == NULL) { + return -1; + } + state->str_close = str_close; return 0; } @@ -749,6 +755,7 @@ _gdbm_module_traverse(PyObject *module, visitproc visit, void *arg) _gdbm_state *state = get_gdbm_state(module); Py_VISIT(state->gdbm_error); Py_VISIT(state->gdbm_type); + Py_VISIT(state->str_close); return 0; } @@ -758,6 +765,7 @@ _gdbm_module_clear(PyObject *module) _gdbm_state *state = get_gdbm_state(module); Py_CLEAR(state->gdbm_error); Py_CLEAR(state->gdbm_type); + Py_CLEAR(state->str_close); return 0; } From c9139d77a2a1f471ac2099c87dfa01848c1f226e Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 16 Feb 2022 11:49:52 +0900 Subject: [PATCH 2/3] bpo-46541: nit --- Modules/_dbmmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 591d72e8613988..5399acbc8321ff 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -1,6 +1,7 @@ /* DBM module using dictionary interface */ + #define PY_SSIZE_T_CLEAN #include "Python.h" From 44b83ad52756b5eebc20919f242ed31d7a3a4d53 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Wed, 16 Feb 2022 18:35:54 +0900 Subject: [PATCH 3/3] bpo-46541: Address code review --- Modules/_dbmmodule.c | 13 +------------ Modules/_gdbmmodule.c | 12 +----------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 5399acbc8321ff..de8b2304ed8f14 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -37,7 +37,6 @@ typedef struct { PyTypeObject *dbm_type; PyObject *dbm_error; - PyObject *str_close; } _dbm_state; static inline _dbm_state* @@ -396,9 +395,7 @@ dbm__enter__(PyObject *self, PyObject *args) static PyObject * dbm__exit__(PyObject *self, PyObject *args) { - _dbm_state *state = PyType_GetModuleState(Py_TYPE(self)); - assert(state != NULL); - return PyObject_CallMethodNoArgs(self, state->str_close); + return _dbm_dbm_close_impl((dbmobject *)self); } static PyMethodDef dbm_methods[] = { @@ -527,12 +524,6 @@ _dbm_exec(PyObject *module) if (PyModule_AddType(module, (PyTypeObject *)state->dbm_error) < 0) { return -1; } - - PyObject *str_close = PyUnicode_InternFromString("close"); - if (str_close == NULL) { - return -1; - } - state->str_close = str_close; return 0; } @@ -542,7 +533,6 @@ _dbm_module_traverse(PyObject *module, visitproc visit, void *arg) _dbm_state *state = get_dbm_state(module); Py_VISIT(state->dbm_error); Py_VISIT(state->dbm_type); - Py_VISIT(state->str_close); return 0; } @@ -552,7 +542,6 @@ _dbm_module_clear(PyObject *module) _dbm_state *state = get_dbm_state(module); Py_CLEAR(state->dbm_error); Py_CLEAR(state->dbm_type); - Py_CLEAR(state->str_close); return 0; } diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index 752cadea5ae263..e6440fa9cd364d 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -20,7 +20,6 @@ extern const char * gdbm_strerror(gdbm_error); typedef struct { PyTypeObject *gdbm_type; PyObject *gdbm_error; - PyObject *str_close; } _gdbm_state; static inline _gdbm_state* @@ -545,9 +544,7 @@ gdbm__enter__(PyObject *self, PyObject *args) static PyObject * gdbm__exit__(PyObject *self, PyObject *args) { - _gdbm_state *state = PyType_GetModuleState(Py_TYPE(self)); - assert(state != NULL); - return PyObject_CallMethodNoArgs(self, state->str_close); + return _gdbm_gdbm_close_impl((gdbmobject *)self); } static PyMethodDef gdbm_methods[] = { @@ -741,11 +738,6 @@ _gdbm_exec(PyObject *module) return -1; } #endif - PyObject *str_close = PyUnicode_InternFromString("close"); - if (str_close == NULL) { - return -1; - } - state->str_close = str_close; return 0; } @@ -755,7 +747,6 @@ _gdbm_module_traverse(PyObject *module, visitproc visit, void *arg) _gdbm_state *state = get_gdbm_state(module); Py_VISIT(state->gdbm_error); Py_VISIT(state->gdbm_type); - Py_VISIT(state->str_close); return 0; } @@ -765,7 +756,6 @@ _gdbm_module_clear(PyObject *module) _gdbm_state *state = get_gdbm_state(module); Py_CLEAR(state->gdbm_error); Py_CLEAR(state->gdbm_type); - Py_CLEAR(state->str_close); return 0; }