99// Declares functions usded from the Python C API
1010#ifndef CLASSDESC_PYTHON_CAPI_H
1111#define CLASSDESC_PYTHON_CAPI_H
12+ #include < cstddef>
13+ #include < stdio.h>
1214
1315// TODO - is this field used on Windows?
1416// #define _PyObject_HEAD_EXTRA
1517
1618#define PYTHON_API_VERSION 1013
19+
20+ // Windows uses stable API, so the *Struct symbols are not available
21+ #ifdef _WIN32
22+ #define Py_False Py_GetConstantBorrowed (1 )
23+ #define Py_True Py_GetConstantBorrowed (2 )
24+ #define Py_None Py_GetConstantBorrowed (0 )
25+ #else
1726#define Py_False ((PyObject *) &_Py_FalseStruct)
1827#define Py_True ((PyObject *) &_Py_TrueStruct)
1928#define Py_None ((PyObject *) &_Py_NoneStruct)
29+ #endif
2030#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
2131#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False
2232#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
33+
2334#define METH_VARARGS 0x0001
2435#define METH_NOARGS 0x0004
2536#define METH_O 0x0008
2940#define Py_TYPE (ob ) (((PyObject*)(ob))->ob_type)
3041#define PyObject_TypeCheck (ob, tp ) \
3142 (Py_TYPE(ob) == (tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
32- #define PyBool_Check (x ) (Py_TYPE(x) == &PyBool_Type)
43+ #define PyBool_Check (x ) (Py_TYPE(x) == PyBool_Type)
44+ #define PyFloat_Check (op ) PyObject_TypeCheck(op, PyFloat_Type)
3345#define PyLong_Check (op ) PyType_FastSubclass(Py_TYPE(op), 1UL << 24 )
34- #define PyFloat_Check (op ) PyObject_TypeCheck(op, &PyFloat_Type)
35- #define PyUnicode_Check (op ) PyType_FastSubclass(Py_TYPE(op), 1UL << 28)
3646#define PyList_Check (op ) PyType_FastSubclass(Py_TYPE(op), 1UL << 25 )
47+ #define PyUnicode_Check (op ) PyType_FastSubclass(Py_TYPE(op), 1UL << 28 )
3748
3849#define Py_REFCNT (ob ) (((PyObject*)(ob))->ob_refcnt)
3950#define Py_INCREF (op ) (((PyObject *)(op))->ob_refcnt++)
7788#define PyModule_Create (module ) \
7889 PyModule_Create2 (module , PYTHON_API_VERSION)
7990
91+ // Windows in particular doesn't define ssize_t
92+ using Py_ssize_t=std::ptrdiff_t;
93+
8094struct PyTypeObject ;
8195
8296struct PyObject
8397{
8498 // _PyObject_HEAD_EXTRA
85- ssize_t ob_refcnt ;
99+ Py_ssize_t ob_refcnt;
86100 PyTypeObject *ob_type;
87101};
88102
89103struct PyVarObject
90104{
91105 PyObject ob_base;
92- ssize_t ob_size ; /* Number of items in variable part */
106+ Py_ssize_t ob_size; /* Number of items in variable part */
93107};
94108
95109typedef PyObject * (*binaryfunc)(PyObject *, PyObject *);
96110typedef PyObject * (*ternaryfunc)(PyObject *, PyObject *, PyObject *);
97- typedef ssize_t (* lenfunc )(PyObject * );
111+ typedef Py_ssize_t (*lenfunc)(PyObject *);
98112typedef int (*objobjargproc)(PyObject *, PyObject *, PyObject *);
99113typedef void (*freefunc)(void *);
100114typedef void (*destructor)(PyObject *);
@@ -104,15 +118,15 @@ typedef PyObject *(*getattrofunc)(PyObject *, PyObject *);
104118typedef int (*setattrfunc)(PyObject *, char *, PyObject *);
105119typedef int (*setattrofunc)(PyObject *, PyObject *, PyObject *);
106120typedef PyObject *(*reprfunc)(PyObject *);
107- typedef ssize_t (* hashfunc )(PyObject * );
121+ typedef Py_ssize_t (*hashfunc)(PyObject *);
108122typedef PyObject *(*richcmpfunc) (PyObject *, PyObject *, int );
109123typedef PyObject *(*getiterfunc) (PyObject *);
110124typedef PyObject *(*iternextfunc) (PyObject *);
111125typedef PyObject *(*descrgetfunc) (PyObject *, PyObject *, PyObject *);
112126typedef int (*descrsetfunc) (PyObject *, PyObject *, PyObject *);
113127typedef int (*initproc)(PyObject *, PyObject *, PyObject *);
114128typedef PyObject *(*newfunc)(struct _typeobject *, PyObject *, PyObject *);
115- typedef PyObject * (* allocfunc )(struct _typeobject * , ssize_t );
129+ typedef PyObject *(*allocfunc)(struct _typeobject *, Py_ssize_t );
116130typedef int (*visitproc)(PyObject *, void *);
117131typedef int (*traverseproc)(PyObject *, visitproc, void *);
118132typedef int (*inquiry)(PyObject *);
@@ -129,7 +143,7 @@ struct PyTypeObject
129143{
130144 PyVarObject ob_base;
131145 const char *tp_name; /* For printing, in format "<module>.<name>" */
132- ssize_t tp_basicsize , tp_itemsize ; /* For allocation */
146+ Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
133147
134148 /* Methods to implement standard operations */
135149
@@ -175,7 +189,7 @@ struct PyTypeObject
175189 richcmpfunc tp_richcompare;
176190
177191 /* weak reference enabler */
178- ssize_t tp_weaklistoffset ;
192+ Py_ssize_t tp_weaklistoffset;
179193
180194 /* Iterators */
181195 getiterfunc tp_iter;
@@ -189,7 +203,7 @@ struct PyTypeObject
189203 PyObject *tp_dict;
190204 descrgetfunc tp_descr_get;
191205 descrsetfunc tp_descr_set;
192- ssize_t tp_dictoffset ;
206+ Py_ssize_t tp_dictoffset;
193207 initproc tp_init;
194208 allocfunc tp_alloc;
195209 newfunc tp_new;
@@ -226,36 +240,40 @@ struct PyMappingMethods {
226240struct PyModuleDef_Base {
227241 PyObject ob_base;
228242 PyObject* (*m_init)(void );
229- ssize_t m_index ;
243+ Py_ssize_t m_index;
230244 PyObject* m_copy;
231245};
232246
233247struct PyModuleDef {
234248 PyModuleDef_Base m_base;
235249 const char * m_name;
236250 const char * m_doc;
237- ssize_t m_size ;
251+ Py_ssize_t m_size;
238252 PyMethodDef *m_methods;
239253 struct PyModuleDef_Slot * m_slots;
240254 traverseproc m_traverse;
241255 inquiry m_clear;
242256 freefunc m_free;
243257};
244258
259+ #ifndef _WIN32
245260extern PyObject _Py_FalseStruct, _Py_TrueStruct, _Py_NoneStruct;
246- extern PyTypeObject PyBool_Type , PyFloat_Type ;
247- extern PyObject * PyExc_RuntimeError ;
248-
249- using Py_ssize_t = ssize_t ;
261+ #endif
250262
251263extern " C" {
252264 void _Py_Dealloc (PyObject*);
253265 PyObject* PyErr_Occurred ();
254266 void PyErr_Print ();
255267 void PyErr_SetString (PyObject*,const char *);
268+
269+
270+ extern PyTypeObject* PyBool_Type;
271+ extern PyTypeObject* PyFloat_Type;
272+ extern PyObject* PyExc_RuntimeError;
256273
257274 int PyType_IsSubtype (PyTypeObject*, PyTypeObject*);
258275 unsigned long PyType_GetFlags (PyTypeObject*);
276+ PyObject* Py_GetConstantBorrowed (unsigned );
259277 PyObject* PyLong_FromLong (long );
260278 PyObject* PyFloat_FromDouble (double );
261279 long long PyLong_AsLongLong (PyObject*);
@@ -276,7 +294,7 @@ extern "C" {
276294 PyObject* PySequence_GetItem (PyObject*, ssize_t i);
277295
278296 PyObject* PyUnicode_FromString (const char *);
279- char * PyUnicode_AsUTF8 (PyObject * );
297+ char * PyUnicode_AsUTF8AndSize (PyObject*,Py_ssize_t *);
280298
281299 PyObject* PyDict_New ();
282300 int PyDict_SetItemString (PyObject* dp, const char * key, PyObject* item);
0 commit comments