blob: 6b20564f1397b4d34498e1d3d54967f87c5bba5a [file] [log] [blame]
Larry Hastings62417a02012-02-28 16:21:47 -08001#ifndef __CAPSULETHUNK_H
2#define __CAPSULETHUNK_H
3
4#if ( (PY_VERSION_HEX < 0x02070000) \
5 || ((PY_VERSION_HEX >= 0x03000000) \
6 && (PY_VERSION_HEX < 0x03010000)) )
7
8#define __PyCapsule_GetField(capsule, field, default_value) \
9 ( PyCapsule_CheckExact(capsule) \
10 ? (((PyCObject *)capsule)->field) \
11 : (default_value) \
12 ) \
13
14#define __PyCapsule_SetField(capsule, field, value) \
15 ( PyCapsule_CheckExact(capsule) \
16 ? (((PyCObject *)capsule)->field = value), 1 \
17 : 0 \
18 ) \
19
20
21#define PyCapsule_Type PyCObject_Type
22
23#define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule))
24#define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule))
25
26
27#define PyCapsule_New(pointer, name, destructor) \
28 (PyCObject_FromVoidPtr(pointer, destructor))
29
30
31#define PyCapsule_GetPointer(capsule, name) \
32 (PyCObject_AsVoidPtr(capsule))
33
34/* Don't call PyCObject_SetPointer here, it fails if there's a destructor */
35#define PyCapsule_SetPointer(capsule, pointer) \
36 __PyCapsule_SetField(capsule, cobject, pointer)
37
38
39#define PyCapsule_GetDestructor(capsule) \
40 __PyCapsule_GetField(capsule, destructor)
41
42#define PyCapsule_SetDestructor(capsule, dtor) \
43 __PyCapsule_SetField(capsule, destructor, dtor)
44
45
46/*
47 * Sorry, there's simply no place
48 * to store a Capsule "name" in a CObject.
49 */
50#define PyCapsule_GetName(capsule) NULL
51
52static int
53PyCapsule_SetName(PyObject *capsule, const char *unused)
54{
55 unused = unused;
56 PyErr_SetString(PyExc_NotImplementedError,
57 "can't use PyCapsule_SetName with CObjects");
58 return 1;
59}
60
61
62
63#define PyCapsule_GetContext(capsule) \
64 __PyCapsule_GetField(capsule, descr)
65
66#define PyCapsule_SetContext(capsule, context) \
67 __PyCapsule_SetField(capsule, descr, context)
68
69
70static void *
71PyCapsule_Import(const char *name, int no_block)
72{
73 PyObject *object = NULL;
74 void *return_value = NULL;
75 char *trace;
76 size_t name_length = (strlen(name) + 1) * sizeof(char);
77 char *name_dup = (char *)PyMem_MALLOC(name_length);
78
79 if (!name_dup) {
80 return NULL;
81 }
82
83 memcpy(name_dup, name, name_length);
84
85 trace = name_dup;
86 while (trace) {
87 char *dot = strchr(trace, '.');
88 if (dot) {
89 *dot++ = '\0';
90 }
91
92 if (object == NULL) {
93 if (no_block) {
94 object = PyImport_ImportModuleNoBlock(trace);
95 } else {
96 object = PyImport_ImportModule(trace);
97 if (!object) {
98 PyErr_Format(PyExc_ImportError,
99 "PyCapsule_Import could not "
100 "import module \"%s\"", trace);
101 }
102 }
103 } else {
104 PyObject *object2 = PyObject_GetAttrString(object, trace);
105 Py_DECREF(object);
106 object = object2;
107 }
108 if (!object) {
109 goto EXIT;
110 }
111
112 trace = dot;
113 }
114
115 if (PyCObject_Check(object)) {
116 PyCObject *cobject = (PyCObject *)object;
117 return_value = cobject->cobject;
118 } else {
119 PyErr_Format(PyExc_AttributeError,
120 "PyCapsule_Import \"%s\" is not valid",
121 name);
122 }
123
124EXIT:
125 Py_XDECREF(object);
126 if (name_dup) {
127 PyMem_FREE(name_dup);
128 }
129 return return_value;
130}
131
132#endif /* #if PY_VERSION_HEX < 0x02070000 */
133
134#endif /* __CAPSULETHUNK_H */