Skip to content

Commit d70ba69

Browse files
committed
port _ctypes.UnionType to heap type
1 parent 7e8b115 commit d70ba69

File tree

1 file changed

+26
-43
lines changed

1 file changed

+26
-43
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ PyObject *ComError; // Borrowed reference to: &PyComError_Type
146146

147147
typedef struct {
148148
PyTypeObject *Union_Type;
149+
PyTypeObject *UnionType_Type;
149150
} _ctypes_state;
150151

151152
typedef struct {
@@ -964,48 +965,24 @@ PyTypeObject PyCStructType_Type = {
964965
0, /* tp_free */
965966
};
966967

967-
static PyTypeObject UnionType_Type = {
968-
PyVarObject_HEAD_INIT(NULL, 0)
969-
"_ctypes.UnionType", /* tp_name */
970-
0, /* tp_basicsize */
971-
0, /* tp_itemsize */
972-
0, /* tp_dealloc */
973-
0, /* tp_vectorcall_offset */
974-
0, /* tp_getattr */
975-
0, /* tp_setattr */
976-
0, /* tp_as_async */
977-
0, /* tp_repr */
978-
0, /* tp_as_number */
979-
&CDataType_as_sequence, /* tp_as_sequence */
980-
0, /* tp_as_mapping */
981-
0, /* tp_hash */
982-
0, /* tp_call */
983-
0, /* tp_str */
984-
0, /* tp_getattro */
985-
UnionType_setattro, /* tp_setattro */
986-
0, /* tp_as_buffer */
987-
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
988-
PyDoc_STR("metatype for the CData Objects"), /* tp_doc */
989-
(traverseproc)CDataType_traverse, /* tp_traverse */
990-
(inquiry)CDataType_clear, /* tp_clear */
991-
0, /* tp_richcompare */
992-
0, /* tp_weaklistoffset */
993-
0, /* tp_iter */
994-
0, /* tp_iternext */
995-
CDataType_methods, /* tp_methods */
996-
0, /* tp_members */
997-
0, /* tp_getset */
998-
0, /* tp_base */
999-
0, /* tp_dict */
1000-
0, /* tp_descr_get */
1001-
0, /* tp_descr_set */
1002-
0, /* tp_dictoffset */
1003-
0, /* tp_init */
1004-
0, /* tp_alloc */
1005-
UnionType_new, /* tp_new */
1006-
0, /* tp_free */
968+
static PyType_Slot union_type_type_slots[] = {
969+
{Py_sq_repeat, CDataType_repeat},
970+
{Py_tp_setattro, UnionType_setattro},
971+
{Py_tp_doc, PyDoc_STR("metatype for the CData Objects")},
972+
{Py_tp_traverse, CDataType_traverse},
973+
{Py_tp_clear, CDataType_clear},
974+
{Py_tp_methods, CDataType_methods},
975+
{Py_tp_new, UnionType_new},
976+
{Py_tp_base, &PyType_Type},
977+
{0, NULL},
1007978
};
1008979

980+
static PyType_Spec union_type_type_spec = {
981+
.name = "_ctypes.UnionType",
982+
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |
983+
Py_TPFLAGS_TYPE_SUBCLASS | Py_TPFLAGS_IMMUTABLETYPE),
984+
.slots = union_type_type_slots,
985+
};
1009986

1010987
/******************************************************************/
1011988

@@ -5621,19 +5598,24 @@ _ctypes_add_types(PyObject *mod)
56215598
* Metaclasses
56225599
*/
56235600
TYPE_READY_BASE(&PyCStructType_Type, &PyType_Type);
5624-
TYPE_READY_BASE(&UnionType_Type, &PyType_Type);
56255601
TYPE_READY_BASE(&PyCPointerType_Type, &PyType_Type);
56265602
TYPE_READY_BASE(&PyCArrayType_Type, &PyType_Type);
56275603
TYPE_READY_BASE(&PyCSimpleType_Type, &PyType_Type);
56285604
TYPE_READY_BASE(&PyCFuncPtrType_Type, &PyType_Type);
56295605

5606+
st->UnionType_Type = (PyTypeObject *)
5607+
PyType_FromModuleAndSpec(mod, &union_type_type_spec,
5608+
NULL);
5609+
if (st->UnionType_Type == NULL) {
5610+
return -1;
5611+
}
5612+
56305613
/*************************************************
56315614
*
56325615
* Classes using a custom metaclass
56335616
*/
56345617

56355618
MOD_ADD_TYPE(&Struct_Type, &PyCStructType_Type, &PyCData_Type);
5636-
// MOD_ADD_TYPE(&Union_Type, &UnionType_Type, &PyCData_Type);
56375619
MOD_ADD_TYPE(&PyCPointer_Type, &PyCPointerType_Type, &PyCData_Type);
56385620
MOD_ADD_TYPE(&PyCArray_Type, &PyCArrayType_Type, &PyCData_Type);
56395621
MOD_ADD_TYPE(&Simple_Type, &PyCSimpleType_Type, &PyCData_Type);
@@ -5645,7 +5627,8 @@ _ctypes_add_types(PyObject *mod)
56455627
if (st->Union_Type == NULL) {
56465628
return -1;
56475629
}
5648-
Py_SET_TYPE(st->Union_Type, &UnionType_Type);
5630+
Py_SET_TYPE(st->Union_Type, st->UnionType_Type);
5631+
56495632
if (PyModule_AddType(mod, st->Union_Type) < 0) {
56505633
return -1;
56515634
}

0 commit comments

Comments
 (0)