GH-81057: Remove static state from arraymodule (#99409)

This commit is contained in:
Kumar Aditya 2022-11-12 14:41:32 +05:30 committed by GitHub
parent aa874326d8
commit 504e12272b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 5 deletions

View File

@ -58,6 +58,8 @@ typedef struct {
PyTypeObject *ArrayType; PyTypeObject *ArrayType;
PyTypeObject *ArrayIterType; PyTypeObject *ArrayIterType;
PyObject *array_reconstructor;
PyObject *str_read; PyObject *str_read;
PyObject *str_write; PyObject *str_write;
PyObject *str___dict__; PyObject *str___dict__;
@ -2191,18 +2193,18 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
PyObject *array_str; PyObject *array_str;
int typecode = self->ob_descr->typecode; int typecode = self->ob_descr->typecode;
int mformat_code; int mformat_code;
static PyObject *array_reconstructor = NULL;
long protocol; long protocol;
array_state *state = get_array_state_by_class(cls); array_state *state = get_array_state_by_class(cls);
assert(state != NULL); assert(state != NULL);
if (array_reconstructor == NULL) { if (state->array_reconstructor == NULL) {
array_reconstructor = _PyImport_GetModuleAttrString( state->array_reconstructor = _PyImport_GetModuleAttrString(
"array", "_array_reconstructor"); "array", "_array_reconstructor");
if (array_reconstructor == NULL) if (state->array_reconstructor == NULL) {
return NULL; return NULL;
} }
}
if (!PyLong_Check(value)) { if (!PyLong_Check(value)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
@ -2252,8 +2254,10 @@ array_array___reduce_ex___impl(arrayobject *self, PyTypeObject *cls,
Py_DECREF(dict); Py_DECREF(dict);
return NULL; return NULL;
} }
assert(state->array_reconstructor != NULL);
result = Py_BuildValue( result = Py_BuildValue(
"O(OCiN)O", array_reconstructor, Py_TYPE(self), typecode, "O(OCiN)O", state->array_reconstructor, Py_TYPE(self), typecode,
mformat_code, array_str, dict); mformat_code, array_str, dict);
Py_DECREF(dict); Py_DECREF(dict);
return result; return result;
@ -3013,6 +3017,7 @@ array_traverse(PyObject *module, visitproc visit, void *arg)
array_state *state = get_array_state(module); array_state *state = get_array_state(module);
Py_VISIT(state->ArrayType); Py_VISIT(state->ArrayType);
Py_VISIT(state->ArrayIterType); Py_VISIT(state->ArrayIterType);
Py_VISIT(state->array_reconstructor);
return 0; return 0;
} }
@ -3022,6 +3027,7 @@ array_clear(PyObject *module)
array_state *state = get_array_state(module); array_state *state = get_array_state(module);
Py_CLEAR(state->ArrayType); Py_CLEAR(state->ArrayType);
Py_CLEAR(state->ArrayIterType); Py_CLEAR(state->ArrayIterType);
Py_CLEAR(state->array_reconstructor);
Py_CLEAR(state->str_read); Py_CLEAR(state->str_read);
Py_CLEAR(state->str_write); Py_CLEAR(state->str_write);
Py_CLEAR(state->str___dict__); Py_CLEAR(state->str___dict__);
@ -3066,6 +3072,7 @@ array_modexec(PyObject *m)
PyObject *typecodes; PyObject *typecodes;
const struct arraydescr *descr; const struct arraydescr *descr;
state->array_reconstructor = NULL;
/* Add interned strings */ /* Add interned strings */
ADD_INTERNED(state, read); ADD_INTERNED(state, read);
ADD_INTERNED(state, write); ADD_INTERNED(state, write);