gh-114314: Move types to ctypes_state by vstinner · Pull Request #114316 · python/cpython · GitHub
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 58 additions & 38 deletions Modules/_ctypes/_ctypes.c
7 changes: 4 additions & 3 deletions Modules/_ctypes/callbacks.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,8 @@ static void _CallPythonObject(void *mem,
Py_ssize_t i = 0, j = 0, nargs = 0;
PyObject *error_object = NULL;
int *space;
PyGILState_STATE state = PyGILState_Ensure();
PyGILState_STATE gil_state = PyGILState_Ensure();
ctypes_state *state = GLOBAL_STATE();

assert(PyTuple_Check(converters));
nargs = PyTuple_GET_SIZE(converters);
Expand Down Expand Up @@ -175,7 +176,7 @@ static void _CallPythonObject(void *mem,
PrintError("create argument %zd:\n", i);
goto Done;
}
if (!CDataObject_Check(obj)) {
if (!CDataObject_Check(state, obj)) {
Py_DECREF(obj);
PrintError("unexpected result of create argument %zd:\n", i);
goto Done;
Expand Down Expand Up @@ -285,7 +286,7 @@ static void _CallPythonObject(void *mem,
for (j = 0; j < i; j++) {
Py_DECREF(args[j]);
}
PyGILState_Release(state);
PyGILState_Release(gil_state);
}

static void closure_fcn(ffi_cif *cif,
Expand Down
20 changes: 13 additions & 7 deletions Modules/_ctypes/callproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1689,8 +1689,10 @@ sizeof_func(PyObject *self, PyObject *obj)
if (dict)
return PyLong_FromSsize_t(dict->size);

if (CDataObject_Check(obj))
ctypes_state *state = GLOBAL_STATE();
if (CDataObject_Check(state, obj)) {
return PyLong_FromSsize_t(((CDataObject *)obj)->b_size);
}
PyErr_SetString(PyExc_TypeError,
"this type has no size");
return NULL;
Expand Down Expand Up @@ -1744,7 +1746,8 @@ byref(PyObject *self, PyObject *args)
if (offset == -1 && PyErr_Occurred())
return NULL;
}
if (!CDataObject_Check(obj)) {
ctypes_state *state = GLOBAL_STATE();
if (!CDataObject_Check(state, obj)) {
PyErr_Format(PyExc_TypeError,
"byref() argument must be a ctypes instance, not '%s'",
Py_TYPE(obj)->tp_name);
Expand All @@ -1769,7 +1772,8 @@ PyDoc_STRVAR(addressof_doc,
static PyObject *
addressof(PyObject *self, PyObject *obj)
{
if (!CDataObject_Check(obj)) {
ctypes_state *state = GLOBAL_STATE();
if (!CDataObject_Check(state, obj)) {
PyErr_SetString(PyExc_TypeError,
"invalid type");
return NULL;
Expand Down Expand Up @@ -1925,13 +1929,15 @@ create_pointer_type(PyObject *module, PyObject *cls)
// found or error
return result;
}

// not found
ctypes_state *state = GLOBAL_STATE();
if (PyUnicode_CheckExact(cls)) {
PyObject *name = PyUnicode_FromFormat("LP_%U", cls);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
result = PyObject_CallFunction((PyObject *)Py_TYPE(state->PyCPointer_Type),
"N(O){}",
name,
&PyCPointer_Type);
state->PyCPointer_Type);
if (result == NULL)
return result;
key = PyLong_FromVoidPtr(result);
Expand All @@ -1942,10 +1948,10 @@ create_pointer_type(PyObject *module, PyObject *cls)
} else if (PyType_Check(cls)) {
typ = (PyTypeObject *)cls;
PyObject *name = PyUnicode_FromFormat("LP_%s", typ->tp_name);
result = PyObject_CallFunction((PyObject *)Py_TYPE(&PyCPointer_Type),
result = PyObject_CallFunction((PyObject *)Py_TYPE(state->PyCPointer_Type),
"N(O){sO}",
name,
&PyCPointer_Type,
state->PyCPointer_Type,
"_type_", cls);
if (result == NULL)
return result;
Expand Down
6 changes: 4 additions & 2 deletions Modules/_ctypes/cfield.c
Loading