@@ -125,9 +125,13 @@ PyObject *_ctypes_ptrtype_cache = NULL;
125
125
126
126
static PyTypeObject Simple_Type ;
127
127
128
- /* a callable object used for unpickling */
128
+ /* a callable object used for unpickling:
129
+ strong reference to _ctypes._unpickle() function */
129
130
static PyObject * _unpickle ;
130
131
132
+ #ifdef MS_WIN32
133
+ PyObject * ComError ; // Borrowed reference to: &PyComError_Type
134
+ #endif
131
135
132
136
133
137
/****************************************************************/
@@ -4307,7 +4311,7 @@ static PyNumberMethods PyCFuncPtr_as_number = {
4307
4311
4308
4312
PyTypeObject PyCFuncPtr_Type = {
4309
4313
PyVarObject_HEAD_INIT (NULL , 0 )
4310
- "_ctypes.PyCFuncPtr " ,
4314
+ "_ctypes.CFuncPtr " ,
4311
4315
sizeof (PyCFuncPtrObject ), /* tp_basicsize */
4312
4316
0 , /* tp_itemsize */
4313
4317
(destructor )PyCFuncPtr_dealloc , /* tp_dealloc */
@@ -5555,20 +5559,7 @@ static PyTypeObject PyComError_Type = {
5555
5559
0 , /* tp_alloc */
5556
5560
0 , /* tp_new */
5557
5561
};
5558
-
5559
-
5560
- static int
5561
- create_comerror (void )
5562
- {
5563
- PyComError_Type .tp_base = (PyTypeObject * )PyExc_Exception ;
5564
- if (PyType_Ready (& PyComError_Type ) < 0 )
5565
- return -1 ;
5566
- Py_INCREF (& PyComError_Type );
5567
- ComError = (PyObject * )& PyComError_Type ;
5568
- return 0 ;
5569
- }
5570
-
5571
- #endif
5562
+ #endif // MS_WIN32
5572
5563
5573
5564
static PyObject *
5574
5565
string_at (const char * ptr , int size )
@@ -5679,194 +5670,199 @@ wstring_at(const wchar_t *ptr, int size)
5679
5670
5680
5671
static struct PyModuleDef _ctypesmodule = {
5681
5672
PyModuleDef_HEAD_INIT ,
5682
- "_ctypes" ,
5683
- module_docs ,
5684
- -1 ,
5685
- _ctypes_module_methods ,
5686
- NULL ,
5687
- NULL ,
5688
- NULL ,
5689
- NULL
5673
+ .m_name = "_ctypes" ,
5674
+ .m_doc = module_docs ,
5675
+ .m_size = -1 ,
5676
+ .m_methods = _ctypes_module_methods ,
5690
5677
};
5691
5678
5692
- PyMODINIT_FUNC
5693
- PyInit__ctypes (void )
5694
- {
5695
- PyObject * m ;
5696
-
5697
- /* Note:
5698
- ob_type is the metatype (the 'type'), defaults to PyType_Type,
5699
- tp_base is the base type, defaults to 'object' aka PyBaseObject_Type.
5700
- */
5701
- m = PyModule_Create (& _ctypesmodule );
5702
- if (!m )
5703
- return NULL ;
5704
-
5705
- _ctypes_ptrtype_cache = PyDict_New ();
5706
- if (_ctypes_ptrtype_cache == NULL )
5707
- return NULL ;
5708
-
5709
- PyModule_AddObject (m , "_pointer_type_cache" , (PyObject * )_ctypes_ptrtype_cache );
5710
-
5711
- _unpickle = PyObject_GetAttrString (m , "_unpickle" );
5712
- if (_unpickle == NULL )
5713
- return NULL ;
5714
-
5715
- if (PyType_Ready (& PyCArg_Type ) < 0 )
5716
- return NULL ;
5717
-
5718
- if (PyType_Ready (& PyCThunk_Type ) < 0 )
5719
- return NULL ;
5720
5679
5680
+ static int
5681
+ _ctypes_add_types (PyObject * mod )
5682
+ {
5683
+ #define TYPE_READY (TYPE ) \
5684
+ if (PyType_Ready(TYPE) < 0) { \
5685
+ return -1; \
5686
+ }
5687
+
5688
+ #define TYPE_READY_BASE (TYPE_EXPR , TP_BASE ) \
5689
+ do { \
5690
+ PyTypeObject *type = (TYPE_EXPR); \
5691
+ type->tp_base = (TP_BASE); \
5692
+ TYPE_READY(type); \
5693
+ } while (0)
5694
+
5695
+ #define MOD_ADD_TYPE (TYPE_EXPR , TP_TYPE , TP_BASE ) \
5696
+ do { \
5697
+ PyTypeObject *type = (TYPE_EXPR); \
5698
+ Py_SET_TYPE(type, TP_TYPE); \
5699
+ type->tp_base = TP_BASE; \
5700
+ if (PyModule_AddType(mod, type) < 0) { \
5701
+ return -1; \
5702
+ } \
5703
+ } while (0)
5704
+
5705
+ /* Note:
5706
+ ob_type is the metatype (the 'type'), defaults to PyType_Type,
5707
+ tp_base is the base type, defaults to 'object' aka PyBaseObject_Type.
5708
+ */
5709
+ TYPE_READY (& PyCArg_Type );
5710
+ TYPE_READY (& PyCThunk_Type );
5711
+ TYPE_READY (& PyCData_Type );
5721
5712
/* StgDict is derived from PyDict_Type */
5722
- PyCStgDict_Type .tp_base = & PyDict_Type ;
5723
- if (PyType_Ready (& PyCStgDict_Type ) < 0 )
5724
- return NULL ;
5713
+ TYPE_READY_BASE (& PyCStgDict_Type , & PyDict_Type );
5725
5714
5726
5715
/*************************************************
5727
5716
*
5728
5717
* Metaclasses
5729
5718
*/
5730
-
5731
- PyCStructType_Type .tp_base = & PyType_Type ;
5732
- if (PyType_Ready (& PyCStructType_Type ) < 0 )
5733
- return NULL ;
5734
-
5735
- UnionType_Type .tp_base = & PyType_Type ;
5736
- if (PyType_Ready (& UnionType_Type ) < 0 )
5737
- return NULL ;
5738
-
5739
- PyCPointerType_Type .tp_base = & PyType_Type ;
5740
- if (PyType_Ready (& PyCPointerType_Type ) < 0 )
5741
- return NULL ;
5742
-
5743
- PyCArrayType_Type .tp_base = & PyType_Type ;
5744
- if (PyType_Ready (& PyCArrayType_Type ) < 0 )
5745
- return NULL ;
5746
-
5747
- PyCSimpleType_Type .tp_base = & PyType_Type ;
5748
- if (PyType_Ready (& PyCSimpleType_Type ) < 0 )
5749
- return NULL ;
5750
-
5751
- PyCFuncPtrType_Type .tp_base = & PyType_Type ;
5752
- if (PyType_Ready (& PyCFuncPtrType_Type ) < 0 )
5753
- return NULL ;
5719
+ TYPE_READY_BASE (& PyCStructType_Type , & PyType_Type );
5720
+ TYPE_READY_BASE (& UnionType_Type , & PyType_Type );
5721
+ TYPE_READY_BASE (& PyCPointerType_Type , & PyType_Type );
5722
+ TYPE_READY_BASE (& PyCArrayType_Type , & PyType_Type );
5723
+ TYPE_READY_BASE (& PyCSimpleType_Type , & PyType_Type );
5724
+ TYPE_READY_BASE (& PyCFuncPtrType_Type , & PyType_Type );
5754
5725
5755
5726
/*************************************************
5756
5727
*
5757
5728
* Classes using a custom metaclass
5758
5729
*/
5759
5730
5760
- if (PyType_Ready (& PyCData_Type ) < 0 )
5761
- return NULL ;
5762
-
5763
- Py_SET_TYPE (& Struct_Type , & PyCStructType_Type );
5764
- Struct_Type .tp_base = & PyCData_Type ;
5765
- if (PyType_Ready (& Struct_Type ) < 0 )
5766
- return NULL ;
5767
- Py_INCREF (& Struct_Type );
5768
- PyModule_AddObject (m , "Structure" , (PyObject * )& Struct_Type );
5769
-
5770
- Py_SET_TYPE (& Union_Type , & UnionType_Type );
5771
- Union_Type .tp_base = & PyCData_Type ;
5772
- if (PyType_Ready (& Union_Type ) < 0 )
5773
- return NULL ;
5774
- Py_INCREF (& Union_Type );
5775
- PyModule_AddObject (m , "Union" , (PyObject * )& Union_Type );
5776
-
5777
- Py_SET_TYPE (& PyCPointer_Type , & PyCPointerType_Type );
5778
- PyCPointer_Type .tp_base = & PyCData_Type ;
5779
- if (PyType_Ready (& PyCPointer_Type ) < 0 )
5780
- return NULL ;
5781
- Py_INCREF (& PyCPointer_Type );
5782
- PyModule_AddObject (m , "_Pointer" , (PyObject * )& PyCPointer_Type );
5783
-
5784
- Py_SET_TYPE (& PyCArray_Type , & PyCArrayType_Type );
5785
- PyCArray_Type .tp_base = & PyCData_Type ;
5786
- if (PyType_Ready (& PyCArray_Type ) < 0 )
5787
- return NULL ;
5788
- Py_INCREF (& PyCArray_Type );
5789
- PyModule_AddObject (m , "Array" , (PyObject * )& PyCArray_Type );
5790
-
5791
- Py_SET_TYPE (& Simple_Type , & PyCSimpleType_Type );
5792
- Simple_Type .tp_base = & PyCData_Type ;
5793
- if (PyType_Ready (& Simple_Type ) < 0 )
5794
- return NULL ;
5795
- Py_INCREF (& Simple_Type );
5796
- PyModule_AddObject (m , "_SimpleCData" , (PyObject * )& Simple_Type );
5797
-
5798
- Py_SET_TYPE (& PyCFuncPtr_Type , & PyCFuncPtrType_Type );
5799
- PyCFuncPtr_Type .tp_base = & PyCData_Type ;
5800
- if (PyType_Ready (& PyCFuncPtr_Type ) < 0 )
5801
- return NULL ;
5802
- Py_INCREF (& PyCFuncPtr_Type );
5803
- PyModule_AddObject (m , "CFuncPtr" , (PyObject * )& PyCFuncPtr_Type );
5731
+ MOD_ADD_TYPE (& Struct_Type , & PyCStructType_Type , & PyCData_Type );
5732
+ MOD_ADD_TYPE (& Union_Type , & UnionType_Type , & PyCData_Type );
5733
+ MOD_ADD_TYPE (& PyCPointer_Type , & PyCPointerType_Type , & PyCData_Type );
5734
+ MOD_ADD_TYPE (& PyCArray_Type , & PyCArrayType_Type , & PyCData_Type );
5735
+ MOD_ADD_TYPE (& Simple_Type , & PyCSimpleType_Type , & PyCData_Type );
5736
+ MOD_ADD_TYPE (& PyCFuncPtr_Type , & PyCFuncPtrType_Type , & PyCData_Type );
5804
5737
5805
5738
/*************************************************
5806
5739
*
5807
5740
* Simple classes
5808
5741
*/
5809
5742
5810
5743
/* PyCField_Type is derived from PyBaseObject_Type */
5811
- if (PyType_Ready (& PyCField_Type ) < 0 )
5812
- return NULL ;
5744
+ TYPE_READY (& PyCField_Type );
5813
5745
5814
5746
/*************************************************
5815
5747
*
5816
5748
* Other stuff
5817
5749
*/
5818
5750
5819
5751
DictRemover_Type .tp_new = PyType_GenericNew ;
5820
- if (PyType_Ready (& DictRemover_Type ) < 0 )
5821
- return NULL ;
5822
-
5823
- if (PyType_Ready (& StructParam_Type ) < 0 ) {
5824
- return NULL ;
5825
- }
5752
+ TYPE_READY (& DictRemover_Type );
5753
+ TYPE_READY (& StructParam_Type );
5826
5754
5827
5755
#ifdef MS_WIN32
5828
- if (create_comerror () < 0 )
5829
- return NULL ;
5830
- PyModule_AddObject (m , "COMError" , ComError );
5756
+ TYPE_READY_BASE (& PyComError_Type , PyExc_Exception );
5757
+ #endif
5831
5758
5832
- PyModule_AddObject (m , "FUNCFLAG_HRESULT" , PyLong_FromLong (FUNCFLAG_HRESULT ));
5833
- PyModule_AddObject (m , "FUNCFLAG_STDCALL" , PyLong_FromLong (FUNCFLAG_STDCALL ));
5759
+ #undef TYPE_READY
5760
+ #undef TYPE_READY_BASE
5761
+ #undef MOD_ADD_TYPE
5762
+ return 0 ;
5763
+ }
5764
+
5765
+
5766
+ static int
5767
+ _ctypes_add_objects (PyObject * mod )
5768
+ {
5769
+ #define MOD_ADD (name , expr ) \
5770
+ do { \
5771
+ PyObject *obj = (expr); \
5772
+ if (obj == NULL) { \
5773
+ return -1; \
5774
+ } \
5775
+ if (PyModule_AddObjectRef(mod, name, obj) < 0) { \
5776
+ Py_DECREF(obj); \
5777
+ return -1; \
5778
+ } \
5779
+ Py_DECREF(obj); \
5780
+ } while (0)
5781
+
5782
+ MOD_ADD ("_pointer_type_cache" , Py_NewRef (_ctypes_ptrtype_cache ));
5783
+
5784
+ #ifdef MS_WIN32
5785
+ MOD_ADD ("COMError" , Py_NewRef (ComError ));
5786
+ MOD_ADD ("FUNCFLAG_HRESULT" , PyLong_FromLong (FUNCFLAG_HRESULT ));
5787
+ MOD_ADD ("FUNCFLAG_STDCALL" , PyLong_FromLong (FUNCFLAG_STDCALL ));
5834
5788
#endif
5835
- PyModule_AddObject ( m , "FUNCFLAG_CDECL" , PyLong_FromLong (FUNCFLAG_CDECL ));
5836
- PyModule_AddObject ( m , "FUNCFLAG_USE_ERRNO" , PyLong_FromLong (FUNCFLAG_USE_ERRNO ));
5837
- PyModule_AddObject ( m , "FUNCFLAG_USE_LASTERROR" , PyLong_FromLong (FUNCFLAG_USE_LASTERROR ));
5838
- PyModule_AddObject ( m , "FUNCFLAG_PYTHONAPI" , PyLong_FromLong (FUNCFLAG_PYTHONAPI ));
5839
- PyModule_AddStringConstant ( m , "__version__" , "1.1.0" );
5840
-
5841
- PyModule_AddObject ( m , "_memmove_addr" , PyLong_FromVoidPtr (memmove ));
5842
- PyModule_AddObject ( m , "_memset_addr" , PyLong_FromVoidPtr (memset ));
5843
- PyModule_AddObject ( m , "_string_at_addr" , PyLong_FromVoidPtr (string_at ));
5844
- PyModule_AddObject ( m , "_cast_addr" , PyLong_FromVoidPtr (cast ));
5789
+ MOD_ADD ( "FUNCFLAG_CDECL" , PyLong_FromLong (FUNCFLAG_CDECL ));
5790
+ MOD_ADD ( "FUNCFLAG_USE_ERRNO" , PyLong_FromLong (FUNCFLAG_USE_ERRNO ));
5791
+ MOD_ADD ( "FUNCFLAG_USE_LASTERROR" , PyLong_FromLong (FUNCFLAG_USE_LASTERROR ));
5792
+ MOD_ADD ( "FUNCFLAG_PYTHONAPI" , PyLong_FromLong (FUNCFLAG_PYTHONAPI ));
5793
+ MOD_ADD ( "__version__" , PyUnicode_FromString ( "1.1.0" ) );
5794
+
5795
+ MOD_ADD ( "_memmove_addr" , PyLong_FromVoidPtr (memmove ));
5796
+ MOD_ADD ( "_memset_addr" , PyLong_FromVoidPtr (memset ));
5797
+ MOD_ADD ( "_string_at_addr" , PyLong_FromVoidPtr (string_at ));
5798
+ MOD_ADD ( "_cast_addr" , PyLong_FromVoidPtr (cast ));
5845
5799
#ifdef CTYPES_UNICODE
5846
- PyModule_AddObject ( m , "_wstring_at_addr" , PyLong_FromVoidPtr (wstring_at ));
5800
+ MOD_ADD ( "_wstring_at_addr" , PyLong_FromVoidPtr (wstring_at ));
5847
5801
#endif
5848
5802
5849
5803
/* If RTLD_LOCAL is not defined (Windows!), set it to zero. */
5850
5804
#if !HAVE_DECL_RTLD_LOCAL
5851
- #define RTLD_LOCAL 0
5805
+ # define RTLD_LOCAL 0
5852
5806
#endif
5853
5807
5854
5808
/* If RTLD_GLOBAL is not defined (cygwin), set it to the same value as
5855
- RTLD_LOCAL.
5856
- */
5809
+ RTLD_LOCAL. */
5857
5810
#if !HAVE_DECL_RTLD_GLOBAL
5858
- #define RTLD_GLOBAL RTLD_LOCAL
5811
+ # define RTLD_GLOBAL RTLD_LOCAL
5859
5812
#endif
5813
+ MOD_ADD ("RTLD_LOCAL" , PyLong_FromLong (RTLD_LOCAL ));
5814
+ MOD_ADD ("RTLD_GLOBAL" , PyLong_FromLong (RTLD_GLOBAL ));
5815
+ MOD_ADD ("ArgumentError" , Py_NewRef (PyExc_ArgError ));
5816
+ return 0 ;
5817
+ #undef MOD_ADD
5818
+ }
5819
+
5820
+
5821
+ static int
5822
+ _ctypes_mod_exec (PyObject * mod )
5823
+ {
5824
+ _unpickle = PyObject_GetAttrString (mod , "_unpickle" );
5825
+ if (_unpickle == NULL ) {
5826
+ return -1 ;
5827
+ }
5860
5828
5861
- PyModule_AddObject (m , "RTLD_LOCAL" , PyLong_FromLong (RTLD_LOCAL ));
5862
- PyModule_AddObject (m , "RTLD_GLOBAL" , PyLong_FromLong (RTLD_GLOBAL ));
5829
+ _ctypes_ptrtype_cache = PyDict_New ();
5830
+ if (_ctypes_ptrtype_cache == NULL ) {
5831
+ return -1 ;
5832
+ }
5863
5833
5864
5834
PyExc_ArgError = PyErr_NewException ("ctypes.ArgumentError" , NULL , NULL );
5865
- if (PyExc_ArgError ) {
5866
- Py_INCREF (PyExc_ArgError );
5867
- PyModule_AddObject (m , "ArgumentError" , PyExc_ArgError );
5835
+ if (!PyExc_ArgError ) {
5836
+ return -1 ;
5837
+ }
5838
+
5839
+ if (_ctypes_add_types (mod ) < 0 ) {
5840
+ return -1 ;
5841
+ }
5842
+ #ifdef MS_WIN32
5843
+ ComError = (PyObject * )& PyComError_Type ;
5844
+ #endif
5845
+
5846
+ if (_ctypes_add_objects (mod ) < 0 ) {
5847
+ return -1 ;
5848
+ }
5849
+ return 0 ;
5850
+ }
5851
+
5852
+
5853
+ PyMODINIT_FUNC
5854
+ PyInit__ctypes (void )
5855
+ {
5856
+ PyObject * mod = PyModule_Create (& _ctypesmodule );
5857
+ if (!mod ) {
5858
+ return NULL ;
5859
+ }
5860
+
5861
+ if (_ctypes_mod_exec (mod ) < 0 ) {
5862
+ Py_DECREF (mod );
5863
+ return NULL ;
5868
5864
}
5869
- return m ;
5865
+ return mod ;
5870
5866
}
5871
5867
5872
5868
/*
0 commit comments