From 3d400c8c5ded4dade76d2b524774b767fc470d65 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 19 Apr 2022 18:32:46 +0900 Subject: [PATCH 1/4] gh-90699: Use module state to access insert str object. --- Modules/_bisectmodule.c | 63 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index c54dc4979d00b5..51d683940bd70c 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -13,6 +13,18 @@ module _bisect #include "clinic/_bisectmodule.c.h" +typedef struct { + PyObject *str_insert; +} bisect_state; + +static inline bisect_state* +get_bisect_state(PyObject *module) +{ + void *state = PyModule_GetState(module); + assert(state != NULL); + return (bisect_state *)state; +} + static inline Py_ssize_t internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi, PyObject* key) @@ -129,7 +141,8 @@ _bisect_insort_right_impl(PyObject *module, PyObject *a, PyObject *x, return NULL; } else { - result = PyObject_CallMethod(a, "insert", "nO", index, x); + bisect_state *state = get_bisect_state(module); + result = _PyObject_CallMethod(a, state->str_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -255,7 +268,8 @@ _bisect_insort_left_impl(PyObject *module, PyObject *a, PyObject *x, if (PyList_Insert(a, index, x) < 0) return NULL; } else { - result = PyObject_CallMethod(a, "insert", "nO", index, x); + bisect_state *state = get_bisect_state(module); + result = _PyObject_CallMethod(a, state->str_insert, "nO", index, x); if (result == NULL) return NULL; Py_DECREF(result); @@ -281,12 +295,55 @@ expensive comparison operations, this can be an improvement over the more\n\ common approach.\n"); +static int +bisect_traverse(PyObject *module, visitproc visit, void *arg) +{ + bisect_state *state = get_bisect_state(module); + Py_VISIT(state->str_insert); + return 0; +} + +static int +bisect_clear(PyObject *module) +{ + bisect_state *state = get_bisect_state(module); + Py_CLEAR(state->str_insert); + return 0; +} + +static void +bisect_free(void *module) +{ + bisect_clear((PyObject *)module); +} + + +static int +bisect_modexec(PyObject *m) +{ + bisect_state *state = get_bisect_state(m); + state->str_insert = PyUnicode_InternFromString("insert"); + if (state->str_insert == NULL) { + return -1; + } + return 0; +} + +static PyModuleDef_Slot bisect_slots[] = { + {Py_mod_exec, bisect_modexec}, + {0, NULL} +}; + static struct PyModuleDef _bisectmodule = { PyModuleDef_HEAD_INIT, .m_name = "_bisect", + .m_size = sizeof(bisect_state), .m_doc = module_doc, .m_methods = bisect_methods, - .m_size = 0 + .m_slots = bisect_slots, + .m_traverse = bisect_traverse, + .m_clear = bisect_clear, + .m_free = bisect_free, }; PyMODINIT_FUNC From a31c57117019d6f5aad638a9037c116ffa969dbc Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 19 Apr 2022 18:34:08 +0900 Subject: [PATCH 2/4] nit --- Modules/_bisectmodule.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 51d683940bd70c..7046c88fc6c571 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -317,7 +317,6 @@ bisect_free(void *module) bisect_clear((PyObject *)module); } - static int bisect_modexec(PyObject *m) { @@ -343,7 +342,7 @@ static struct PyModuleDef _bisectmodule = { .m_slots = bisect_slots, .m_traverse = bisect_traverse, .m_clear = bisect_clear, - .m_free = bisect_free, + .m_free = bisect_free, }; PyMODINIT_FUNC From 2f21b9e1300c113dbfdaad77e9141ab53d86f43d Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 19 Apr 2022 21:20:47 +0900 Subject: [PATCH 3/4] Remove unnecessary Py_VISIT --- Modules/_bisectmodule.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 7046c88fc6c571..49e588a7b865ee 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -298,8 +298,6 @@ common approach.\n"); static int bisect_traverse(PyObject *module, visitproc visit, void *arg) { - bisect_state *state = get_bisect_state(module); - Py_VISIT(state->str_insert); return 0; } From 4473c3b0a62c761088f52ccd20482b07ec724096 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Tue, 19 Apr 2022 21:42:33 +0900 Subject: [PATCH 4/4] Remove traverse method --- Modules/_bisectmodule.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c index 49e588a7b865ee..19e9cd2d46f109 100644 --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -294,13 +294,6 @@ having to sort the list after each insertion. For long lists of items with\n\ expensive comparison operations, this can be an improvement over the more\n\ common approach.\n"); - -static int -bisect_traverse(PyObject *module, visitproc visit, void *arg) -{ - return 0; -} - static int bisect_clear(PyObject *module) { @@ -338,7 +331,6 @@ static struct PyModuleDef _bisectmodule = { .m_doc = module_doc, .m_methods = bisect_methods, .m_slots = bisect_slots, - .m_traverse = bisect_traverse, .m_clear = bisect_clear, .m_free = bisect_free, };