gh-94393: Remove unneeded module state from _json (#94394)

This commit is contained in:
Erlend Egeberg Aasland 2022-07-02 08:24:19 +02:00 committed by GitHub
parent 1bc8a38d8b
commit 3a2e61524f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 58 deletions

View File

@ -14,19 +14,6 @@
#include "structmember.h" // PyMemberDef
#include "pycore_accu.h"
typedef struct {
PyObject *PyScannerType;
PyObject *PyEncoderType;
} _jsonmodulestate;
static inline _jsonmodulestate*
get_json_state(PyObject *module)
{
void *state = PyModule_GetState(module);
assert(state != NULL);
return (_jsonmodulestate *)state;
}
typedef struct _PyScannerObject {
PyObject_HEAD
@ -1815,70 +1802,40 @@ PyDoc_STRVAR(module_doc,
static int
_json_exec(PyObject *module)
{
_jsonmodulestate *state = get_json_state(module);
state->PyScannerType = PyType_FromSpec(&PyScannerType_spec);
if (state->PyScannerType == NULL) {
PyObject *PyScannerType = PyType_FromSpec(&PyScannerType_spec);
if (PyScannerType == NULL) {
return -1;
}
Py_INCREF(state->PyScannerType);
if (PyModule_AddObject(module, "make_scanner", state->PyScannerType) < 0) {
Py_DECREF(state->PyScannerType);
int rc = PyModule_AddObjectRef(module, "make_scanner", PyScannerType);
Py_DECREF(PyScannerType);
if (rc < 0) {
return -1;
}
state->PyEncoderType = PyType_FromSpec(&PyEncoderType_spec);
if (state->PyEncoderType == NULL) {
PyObject *PyEncoderType = PyType_FromSpec(&PyEncoderType_spec);
if (PyEncoderType == NULL) {
return -1;
}
Py_INCREF(state->PyEncoderType);
if (PyModule_AddObject(module, "make_encoder", state->PyEncoderType) < 0) {
Py_DECREF(state->PyEncoderType);
rc = PyModule_AddObjectRef(module, "make_encoder", PyEncoderType);
Py_DECREF(PyEncoderType);
if (rc < 0) {
return -1;
}
return 0;
}
static int
_jsonmodule_traverse(PyObject *module, visitproc visit, void *arg)
{
_jsonmodulestate *state = get_json_state(module);
Py_VISIT(state->PyScannerType);
Py_VISIT(state->PyEncoderType);
return 0;
}
static int
_jsonmodule_clear(PyObject *module)
{
_jsonmodulestate *state = get_json_state(module);
Py_CLEAR(state->PyScannerType);
Py_CLEAR(state->PyEncoderType);
return 0;
}
static void
_jsonmodule_free(void *module)
{
_jsonmodule_clear((PyObject *)module);
}
static PyModuleDef_Slot _json_slots[] = {
{Py_mod_exec, _json_exec},
{0, NULL}
};
static struct PyModuleDef jsonmodule = {
PyModuleDef_HEAD_INIT,
"_json",
module_doc,
sizeof(_jsonmodulestate),
speedups_methods,
_json_slots,
_jsonmodule_traverse,
_jsonmodule_clear,
_jsonmodule_free,
.m_base = PyModuleDef_HEAD_INIT,
.m_name = "_json",
.m_doc = module_doc,
.m_methods = speedups_methods,
.m_slots = _json_slots,
};
PyMODINIT_FUNC