xref: /petsc/src/binding/petsc4py/src/pyapicompat.h (revision 151049cff2cabe4e48e374d9aa8bed3a928ad4d4)
1 /* Author:  Lisandro Dalcin   */
2 /* Contact: dalcinl@gmail.com */
3 
4 /* -------------------------------------------------------------------------- */
5 
6 #if defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030B0000
7 
8 #define Py_bf_getbuffer 1
9 #define Py_bf_releasebuffer 2
10 
11 typedef struct {
12   void *buf;
13   PyObject *obj;
14   Py_ssize_t len;
15   Py_ssize_t itemsize;
16   int readonly;
17   int ndim;
18   char *format;
19   Py_ssize_t *shape;
20   Py_ssize_t *strides;
21   Py_ssize_t *suboffsets;
22   void *internal;
23 } Py_buffer;
24 
25 #define PyBUF_SIMPLE 0
26 #define PyBUF_WRITABLE 0x0001
27 
28 #define PyBUF_FORMAT 0x0004
29 #define PyBUF_ND 0x0008
30 #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
31 #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
32 #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
33 #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
34 #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
35 
36 #define PyBUF_CONTIG (PyBUF_ND | PyBUF_WRITABLE)
37 #define PyBUF_CONTIG_RO (PyBUF_ND)
38 
39 #define PyBUF_STRIDED (PyBUF_STRIDES | PyBUF_WRITABLE)
40 #define PyBUF_STRIDED_RO (PyBUF_STRIDES)
41 
42 #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_WRITABLE | PyBUF_FORMAT)
43 #define PyBUF_RECORDS_RO (PyBUF_STRIDES | PyBUF_FORMAT)
44 
45 #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_WRITABLE | PyBUF_FORMAT)
46 #define PyBUF_FULL_RO (PyBUF_INDIRECT | PyBUF_FORMAT)
47 
48 #define PyBUF_READ  0x100
49 #define PyBUF_WRITE 0x200
50 
51 PyAPI_FUNC(int)  PyObject_CheckBuffer(PyObject *);
52 PyAPI_FUNC(int)  PyObject_GetBuffer(PyObject *, Py_buffer *, int);
53 PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *);
54 PyAPI_FUNC(int)  PyBuffer_FillInfo(Py_buffer *, PyObject *,
55                                    void *, Py_ssize_t, int, int);
56 
57 #endif
58 
59 /* -------------------------------------------------------------------------- */
60 
61 #if (defined(Py_LIMITED_API) && Py_LIMITED_API+0 < 0x030C0000) || PY_VERSION_HEX < 0X30C0000
62 
63 #define PyErr_GetRaisedException PyErr_GetRaisedException_312
PyErr_GetRaisedException(void)64 static PyObject *PyErr_GetRaisedException(void)
65 {
66     PyObject *t, *v, *tb;
67     PyErr_Fetch(&t, &v, &tb);
68     PyErr_NormalizeException(&t, &v, &tb);
69     if (tb != NULL) PyException_SetTraceback(v, tb);
70     Py_XDECREF(t);
71     Py_XDECREF(tb);
72     return v;
73 }
74 
75 #define PyErr_SetRaisedException PyErr_SetRaisedException_312
PyErr_SetRaisedException_312(PyObject * v)76 static void PyErr_SetRaisedException_312(PyObject *v)
77 {
78     PyObject *t = (PyObject *)Py_TYPE(v);
79     PyObject *tb = PyException_GetTraceback(v);
80     Py_XINCREF(t);
81     Py_XINCREF(tb);
82     PyErr_Restore(t, v, tb);
83 }
84 
85 #endif
86 
87 /* -------------------------------------------------------------------------- */
88