Skip to content

Commit 4b4f8f9

Browse files
erlend-aaslandkumaraditya303
authored andcommitted
gh-103092: Isolate _ctypes, part 2
Port PyCStgDict_Type to heap type.
1 parent 186bf39 commit 4b4f8f9

File tree

4 files changed

+53
-55
lines changed

4 files changed

+53
-55
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,9 @@ StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isSt
530530
return NULL;
531531
}
532532

533-
dict = (StgDictObject *)_PyObject_CallNoArgs((PyObject *)&PyCStgDict_Type);
533+
ctypes_state *st = GLOBAL_STATE();
534+
dict = (StgDictObject *)
535+
_PyObject_CallNoArgs((PyObject *)st->PyCStgDict_Type);
534536
if (!dict) {
535537
Py_DECREF(result);
536538
return NULL;
@@ -1088,8 +1090,9 @@ PyCPointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
10881090
stgdict items size, align, length contain info about pointers itself,
10891091
stgdict->proto has info about the pointed to type!
10901092
*/
1093+
ctypes_state *st = GLOBAL_STATE();
10911094
stgdict = (StgDictObject *)_PyObject_CallNoArgs(
1092-
(PyObject *)&PyCStgDict_Type);
1095+
(PyObject *)st->PyCStgDict_Type);
10931096
if (!stgdict)
10941097
return NULL;
10951098
stgdict->size = sizeof(void *);
@@ -1529,8 +1532,9 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
15291532
goto error;
15301533
}
15311534

1535+
ctypes_state *st = GLOBAL_STATE();
15321536
stgdict = (StgDictObject *)_PyObject_CallNoArgs(
1533-
(PyObject *)&PyCStgDict_Type);
1537+
(PyObject *)st->PyCStgDict_Type);
15341538
if (!stgdict)
15351539
goto error;
15361540

@@ -1975,8 +1979,9 @@ static PyObject *CreateSwappedType(PyTypeObject *type, PyObject *args, PyObject
19751979
if (result == NULL)
19761980
return NULL;
19771981

1982+
ctypes_state *st = GLOBAL_STATE();
19781983
stgdict = (StgDictObject *)_PyObject_CallNoArgs(
1979-
(PyObject *)&PyCStgDict_Type);
1984+
(PyObject *)st->PyCStgDict_Type);
19801985
if (!stgdict) {
19811986
Py_DECREF(result);
19821987
return NULL;
@@ -2086,8 +2091,9 @@ PyCSimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
20862091
goto error;
20872092
}
20882093

2094+
ctypes_state *st = GLOBAL_STATE();
20892095
stgdict = (StgDictObject *)_PyObject_CallNoArgs(
2090-
(PyObject *)&PyCStgDict_Type);
2096+
(PyObject *)st->PyCStgDict_Type);
20912097
if (!stgdict)
20922098
goto error;
20932099

@@ -2529,8 +2535,9 @@ PyCFuncPtrType_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
25292535
PyTypeObject *result;
25302536
StgDictObject *stgdict;
25312537

2538+
ctypes_state *st = GLOBAL_STATE();
25322539
stgdict = (StgDictObject *)_PyObject_CallNoArgs(
2533-
(PyObject *)&PyCStgDict_Type);
2540+
(PyObject *)st->PyCStgDict_Type);
25342541
if (!stgdict)
25352542
return NULL;
25362543

@@ -5676,7 +5683,7 @@ _ctypes_add_types(PyObject *mod)
56765683
CREATE_TYPE(mod, st->PyCThunk_Type, &cthunk_spec, NULL);
56775684
TYPE_READY(&PyCData_Type);
56785685
/* StgDict is derived from PyDict_Type */
5679-
TYPE_READY_BASE(&PyCStgDict_Type, &PyDict_Type);
5686+
CREATE_TYPE(mod, st->PyCStgDict_Type, &cstgdict_spec, &PyDict_Type);
56805687

56815688
/*************************************************
56825689
*

Modules/_ctypes/ctypes.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ typedef struct {
4141
PyTypeObject *PyComError_Type;
4242
#endif
4343
PyTypeObject *StructParam_Type;
44+
PyTypeObject *PyCStgDict_Type;
4445
} ctypes_state;
4546

4647
extern ctypes_state global_state;
@@ -49,6 +50,7 @@ extern ctypes_state global_state;
4950

5051
extern PyType_Spec carg_spec;
5152
extern PyType_Spec cfield_spec;
53+
extern PyType_Spec cstgdict_spec;
5254
extern PyType_Spec cthunk_spec;
5355

5456
typedef struct tagPyCArgObject PyCArgObject;
@@ -140,9 +142,8 @@ typedef struct {
140142
PyObject *paramflags;
141143
} PyCFuncPtrObject;
142144

143-
extern PyTypeObject PyCStgDict_Type;
144-
#define PyCStgDict_CheckExact(v) Py_IS_TYPE(v, &PyCStgDict_Type)
145-
#define PyCStgDict_Check(v) PyObject_TypeCheck(v, &PyCStgDict_Type)
145+
#define PyCStgDict_CheckExact(st, v) Py_IS_TYPE((v), (st)->PyCStgDict_Type)
146+
#define PyCStgDict_Check(st, v) PyObject_TypeCheck((v), (st)->PyCStgDict_Type)
146147

147148
extern int PyCStructUnionType_update_stgdict(PyObject *fields, PyObject *type, int isStruct);
148149
extern int PyType_stginfo(PyTypeObject *self, Py_ssize_t *psize, Py_ssize_t *palign, Py_ssize_t *plength);

Modules/_ctypes/stgdict.c

Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ PyCStgDict_init(StgDictObject *self, PyObject *args, PyObject *kwds)
3636
return 0;
3737
}
3838

39+
static int
40+
PyCStgDict_traverse(StgDictObject *self, visitproc visit, void *arg)
41+
{
42+
Py_VISIT(Py_TYPE(self));
43+
Py_VISIT(self->proto);
44+
Py_VISIT(self->argtypes);
45+
Py_VISIT(self->converters);
46+
Py_VISIT(self->restype);
47+
Py_VISIT(self->checker);
48+
return PyDict_Type.tp_traverse((PyObject *)self, visit, arg);
49+
}
50+
3951
static int
4052
PyCStgDict_clear(StgDictObject *self)
4153
{
@@ -44,17 +56,20 @@ PyCStgDict_clear(StgDictObject *self)
4456
Py_CLEAR(self->converters);
4557
Py_CLEAR(self->restype);
4658
Py_CLEAR(self->checker);
47-
return 0;
59+
return PyDict_Type.tp_clear((PyObject *)self);
4860
}
4961

5062
static void
5163
PyCStgDict_dealloc(StgDictObject *self)
5264
{
65+
PyTypeObject *tp = Py_TYPE(self);
66+
PyObject_GC_UnTrack(self);
5367
PyCStgDict_clear(self);
5468
PyMem_Free(self->format);
5569
PyMem_Free(self->shape);
5670
PyMem_Free(self->ffi_type_pointer.elements);
5771
PyDict_Type.tp_dealloc((PyObject *)self);
72+
Py_DECREF(tp);
5873
}
5974

6075
static PyObject *
@@ -135,46 +150,21 @@ static struct PyMethodDef PyCStgDict_methods[] = {
135150
{NULL, NULL} /* sentinel */
136151
};
137152

138-
PyTypeObject PyCStgDict_Type = {
139-
PyVarObject_HEAD_INIT(NULL, 0)
140-
"StgDict",
141-
sizeof(StgDictObject),
142-
0,
143-
(destructor)PyCStgDict_dealloc, /* tp_dealloc */
144-
0, /* tp_vectorcall_offset */
145-
0, /* tp_getattr */
146-
0, /* tp_setattr */
147-
0, /* tp_as_async */
148-
0, /* tp_repr */
149-
0, /* tp_as_number */
150-
0, /* tp_as_sequence */
151-
0, /* tp_as_mapping */
152-
0, /* tp_hash */
153-
0, /* tp_call */
154-
0, /* tp_str */
155-
0, /* tp_getattro */
156-
0, /* tp_setattro */
157-
0, /* tp_as_buffer */
158-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
159-
0, /* tp_doc */
160-
0, /* tp_traverse */
161-
0, /* tp_clear */
162-
0, /* tp_richcompare */
163-
0, /* tp_weaklistoffset */
164-
0, /* tp_iter */
165-
0, /* tp_iternext */
166-
PyCStgDict_methods, /* tp_methods */
167-
0, /* tp_members */
168-
0, /* tp_getset */
169-
0, /* tp_base */
170-
0, /* tp_dict */
171-
0, /* tp_descr_get */
172-
0, /* tp_descr_set */
173-
0, /* tp_dictoffset */
174-
(initproc)PyCStgDict_init, /* tp_init */
175-
0, /* tp_alloc */
176-
0, /* tp_new */
177-
0, /* tp_free */
153+
static PyType_Slot cstgdict_slots[] = {
154+
{Py_tp_dealloc, PyCStgDict_dealloc},
155+
{Py_tp_traverse, PyCStgDict_traverse},
156+
{Py_tp_clear, PyCStgDict_clear},
157+
{Py_tp_methods, PyCStgDict_methods},
158+
{Py_tp_init, PyCStgDict_init},
159+
{0, NULL},
160+
};
161+
162+
PyType_Spec cstgdict_spec = {
163+
.name = "_ctypes.StgDict",
164+
.basicsize = sizeof(StgDictObject),
165+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
166+
Py_TPFLAGS_IMMUTABLETYPE),
167+
.slots = cstgdict_slots,
178168
};
179169

180170
/* May return NULL, but does not set an exception! */
@@ -186,7 +176,8 @@ PyType_stgdict(PyObject *obj)
186176
if (!PyType_Check(obj))
187177
return NULL;
188178
type = (PyTypeObject *)obj;
189-
if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict))
179+
ctypes_state *st = GLOBAL_STATE();
180+
if (!type->tp_dict || !PyCStgDict_CheckExact(st, type->tp_dict))
190181
return NULL;
191182
return (StgDictObject *)type->tp_dict;
192183
}
@@ -200,7 +191,8 @@ StgDictObject *
200191
PyObject_stgdict(PyObject *self)
201192
{
202193
PyTypeObject *type = Py_TYPE(self);
203-
if (!type->tp_dict || !PyCStgDict_CheckExact(type->tp_dict))
194+
ctypes_state *st = GLOBAL_STATE();
195+
if (!type->tp_dict || !PyCStgDict_CheckExact(st, type->tp_dict))
204196
return NULL;
205197
return (StgDictObject *)type->tp_dict;
206198
}

Tools/c-analyzer/cpython/globals-to-fix.tsv

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,14 +358,12 @@ Modules/_ctypes/ctypes.h - PyCFuncPtr_Type -
358358
Modules/_ctypes/ctypes.h - PyCPointerType_Type -
359359
Modules/_ctypes/ctypes.h - PyCPointer_Type -
360360
Modules/_ctypes/ctypes.h - PyCSimpleType_Type -
361-
Modules/_ctypes/ctypes.h - PyCStgDict_Type -
362361
Modules/_ctypes/ctypes.h - PyCStructType_Type -
363362
Modules/_ctypes/ctypes.h - PyExc_ArgError -
364363
Modules/_ctypes/ctypes.h - _ctypes_conversion_encoding -
365364
Modules/_ctypes/ctypes.h - _ctypes_conversion_errors -
366365
Modules/_ctypes/ctypes.h - _ctypes_ptrtype_cache -
367366
Modules/_ctypes/ctypes.h - basespec_string -
368-
Modules/_ctypes/stgdict.c - PyCStgDict_Type -
369367
Modules/_cursesmodule.c - PyCursesWindow_Type -
370368
Modules/_datetimemodule.c - PyDateTime_DateTimeType -
371369
Modules/_datetimemodule.c - PyDateTime_DateType -

0 commit comments

Comments
 (0)