@@ -146,6 +146,7 @@ PyObject *ComError; // Borrowed reference to: &PyComError_Type
146
146
147
147
typedef struct {
148
148
PyTypeObject * Union_Type ;
149
+ PyTypeObject * UnionType_Type ;
149
150
} _ctypes_state ;
150
151
151
152
typedef struct {
@@ -964,48 +965,24 @@ PyTypeObject PyCStructType_Type = {
964
965
0 , /* tp_free */
965
966
};
966
967
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 },
1007
978
};
1008
979
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
+ };
1009
986
1010
987
/******************************************************************/
1011
988
@@ -5621,19 +5598,24 @@ _ctypes_add_types(PyObject *mod)
5621
5598
* Metaclasses
5622
5599
*/
5623
5600
TYPE_READY_BASE (& PyCStructType_Type , & PyType_Type );
5624
- TYPE_READY_BASE (& UnionType_Type , & PyType_Type );
5625
5601
TYPE_READY_BASE (& PyCPointerType_Type , & PyType_Type );
5626
5602
TYPE_READY_BASE (& PyCArrayType_Type , & PyType_Type );
5627
5603
TYPE_READY_BASE (& PyCSimpleType_Type , & PyType_Type );
5628
5604
TYPE_READY_BASE (& PyCFuncPtrType_Type , & PyType_Type );
5629
5605
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
+
5630
5613
/*************************************************
5631
5614
*
5632
5615
* Classes using a custom metaclass
5633
5616
*/
5634
5617
5635
5618
MOD_ADD_TYPE (& Struct_Type , & PyCStructType_Type , & PyCData_Type );
5636
- // MOD_ADD_TYPE(&Union_Type, &UnionType_Type, &PyCData_Type);
5637
5619
MOD_ADD_TYPE (& PyCPointer_Type , & PyCPointerType_Type , & PyCData_Type );
5638
5620
MOD_ADD_TYPE (& PyCArray_Type , & PyCArrayType_Type , & PyCData_Type );
5639
5621
MOD_ADD_TYPE (& Simple_Type , & PyCSimpleType_Type , & PyCData_Type );
@@ -5645,7 +5627,8 @@ _ctypes_add_types(PyObject *mod)
5645
5627
if (st -> Union_Type == NULL ) {
5646
5628
return -1 ;
5647
5629
}
5648
- Py_SET_TYPE (st -> Union_Type , & UnionType_Type );
5630
+ Py_SET_TYPE (st -> Union_Type , st -> UnionType_Type );
5631
+
5649
5632
if (PyModule_AddType (mod , st -> Union_Type ) < 0 ) {
5650
5633
return -1 ;
5651
5634
}
0 commit comments