• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #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 
52 static int
PyCapsule_SetName(PyObject * capsule,const char * unused)53 PyCapsule_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 
70 static void *
PyCapsule_Import(const char * name,int no_block)71 PyCapsule_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 
124 EXIT:
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 */
135