diff --git a/Modules/_struct.c b/Modules/_struct.c index 3db7b991ac..ee04e353e3 100644 --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -2239,15 +2239,9 @@ cache_struct_converter(PyObject *module, PyObject *fmt, PyStructObject **ptr) return 1; } - if (state->cache == NULL) { - state->cache = PyDict_New(); - if (state->cache == NULL) - return 0; - } - - s_object = PyDict_GetItemWithError(state->cache, fmt); + s_object = PyDict_FetchItemWithError(state->cache, fmt); if (s_object != NULL) { - *ptr = (PyStructObject *)Py_NewRef(s_object); + *ptr = (PyStructObject *)s_object; return Py_CLEANUP_SUPPORTED; } else if (PyErr_Occurred()) { @@ -2277,7 +2271,7 @@ static PyObject * _clearcache_impl(PyObject *module) /*[clinic end generated code: output=ce4fb8a7bf7cb523 input=463eaae04bab3211]*/ { - Py_CLEAR(get_struct_state(module)->cache); + PyDict_Clear(get_struct_state(module)->cache); Py_RETURN_NONE; } @@ -2506,6 +2500,12 @@ _structmodule_exec(PyObject *m) if (state->PyStructType == NULL) { return -1; } + + state->cache = PyDict_New(); + if (state->cache == NULL) { + return -1; + } + if (PyModule_AddType(m, (PyTypeObject *)state->PyStructType) < 0) { return -1; }