| #ifndef __CAPSULETHUNK_H | |
| #define __CAPSULETHUNK_H | |
| #if ( (PY_VERSION_HEX < 0x02070000) \ | |
| || ((PY_VERSION_HEX >= 0x03000000) \ | |
| && (PY_VERSION_HEX < 0x03010000)) ) | |
| #define __PyCapsule_GetField(capsule, field, default_value) \ | |
| ( PyCapsule_CheckExact(capsule) \ | |
| ? (((PyCObject *)capsule)->field) \ | |
| : (default_value) \ | |
| ) \ | |
| #define __PyCapsule_SetField(capsule, field, value) \ | |
| ( PyCapsule_CheckExact(capsule) \ | |
| ? (((PyCObject *)capsule)->field = value), 1 \ | |
| : 0 \ | |
| ) \ | |
| #define PyCapsule_Type PyCObject_Type | |
| #define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) | |
| #define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule)) | |
| #define PyCapsule_New(pointer, name, destructor) \ | |
| (PyCObject_FromVoidPtr(pointer, destructor)) | |
| #define PyCapsule_GetPointer(capsule, name) \ | |
| (PyCObject_AsVoidPtr(capsule)) | |
| /* Don't call PyCObject_SetPointer here, it fails if there's a destructor */ | |
| #define PyCapsule_SetPointer(capsule, pointer) \ | |
| __PyCapsule_SetField(capsule, cobject, pointer) | |
| #define PyCapsule_GetDestructor(capsule) \ | |
| __PyCapsule_GetField(capsule, destructor) | |
| #define PyCapsule_SetDestructor(capsule, dtor) \ | |
| __PyCapsule_SetField(capsule, destructor, dtor) | |
| /* | |
| * Sorry, there's simply no place | |
| * to store a Capsule "name" in a CObject. | |
| */ | |
| #define PyCapsule_GetName(capsule) NULL | |
| static int | |
| PyCapsule_SetName(PyObject *capsule, const char *unused) | |
| { | |
| unused = unused; | |
| PyErr_SetString(PyExc_NotImplementedError, | |
| "can't use PyCapsule_SetName with CObjects"); | |
| return 1; | |
| } | |
| #define PyCapsule_GetContext(capsule) \ | |
| __PyCapsule_GetField(capsule, descr) | |
| #define PyCapsule_SetContext(capsule, context) \ | |
| __PyCapsule_SetField(capsule, descr, context) | |
| static void * | |
| PyCapsule_Import(const char *name, int no_block) | |
| { | |
| PyObject *object = NULL; | |
| void *return_value = NULL; | |
| char *trace; | |
| size_t name_length = (strlen(name) + 1) * sizeof(char); | |
| char *name_dup = (char *)PyMem_MALLOC(name_length); | |
| if (!name_dup) { | |
| return NULL; | |
| } | |
| memcpy(name_dup, name, name_length); | |
| trace = name_dup; | |
| while (trace) { | |
| char *dot = strchr(trace, '.'); | |
| if (dot) { | |
| *dot++ = '\0'; | |
| } | |
| if (object == NULL) { | |
| if (no_block) { | |
| object = PyImport_ImportModuleNoBlock(trace); | |
| } else { | |
| object = PyImport_ImportModule(trace); | |
| if (!object) { | |
| PyErr_Format(PyExc_ImportError, | |
| "PyCapsule_Import could not " | |
| "import module \"%s\"", trace); | |
| } | |
| } | |
| } else { | |
| PyObject *object2 = PyObject_GetAttrString(object, trace); | |
| Py_DECREF(object); | |
| object = object2; | |
| } | |
| if (!object) { | |
| goto EXIT; | |
| } | |
| trace = dot; | |
| } | |
| if (PyCObject_Check(object)) { | |
| PyCObject *cobject = (PyCObject *)object; | |
| return_value = cobject->cobject; | |
| } else { | |
| PyErr_Format(PyExc_AttributeError, | |
| "PyCapsule_Import \"%s\" is not valid", | |
| name); | |
| } | |
| EXIT: | |
| Py_XDECREF(object); | |
| if (name_dup) { | |
| PyMem_FREE(name_dup); | |
| } | |
| return return_value; | |
| } | |
| #endif /* #if PY_VERSION_HEX < 0x02070000 */ | |
| #endif /* __CAPSULETHUNK_H */ |