Home | History | Annotate | Download | only in includes
      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
     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 *
     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