Browse Source
Propagate changes for issues #13053 and #13086 from 2.7 to 3.2. (Doc only.)
pull/2332/head
Propagate changes for issues #13053 and #13086 from 2.7 to 3.2. (Doc only.)
pull/2332/head
2 changed files with 219 additions and 26 deletions
@ -0,0 +1,134 @@ |
|||
#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 */ |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue