161 lines
4.7 KiB
C
161 lines
4.7 KiB
C
/*
|
|
* Copyright (c) 2013-2014, Kevin Greenan (kmgreen2@gmail.com)
|
|
* Copyright (c) 2014, Tushar Gohad (tusharsg@gmail.com)
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* Redistributions in binary form must reproduce the above copyright notice, this
|
|
* list of conditions and the following disclaimer in the documentation and/or
|
|
* other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY
|
|
* THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
* EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
|
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#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 */
|