|
|
|
|
|
|
|
|
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); |
|
|
|
|
|
|
|
|
|
|
|
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { |
|
|
PyObject* fake_module; |
|
|
PyTypeObject* cached_type = NULL; |
|
|
|
|
|
fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); |
|
|
if (!fake_module) return NULL; |
|
|
Py_INCREF(fake_module); |
|
|
|
|
|
cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name); |
|
|
if (cached_type) { |
|
|
if (!PyType_Check((PyObject*)cached_type)) { |
|
|
PyErr_Format(PyExc_TypeError, |
|
|
"Shared Cython type %.200s is not a type object", |
|
|
type->tp_name); |
|
|
goto bad; |
|
|
} |
|
|
if (cached_type->tp_basicsize != type->tp_basicsize) { |
|
|
PyErr_Format(PyExc_TypeError, |
|
|
"Shared Cython type %.200s has the wrong size, try recompiling", |
|
|
type->tp_name); |
|
|
goto bad; |
|
|
} |
|
|
} else { |
|
|
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; |
|
|
PyErr_Clear(); |
|
|
if (PyType_Ready(type) < 0) goto bad; |
|
|
if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) |
|
|
goto bad; |
|
|
Py_INCREF(type); |
|
|
cached_type = type; |
|
|
} |
|
|
|
|
|
done: |
|
|
Py_DECREF(fake_module); |
|
|
|
|
|
return cached_type; |
|
|
|
|
|
bad: |
|
|
Py_XDECREF(cached_type); |
|
|
cached_type = NULL; |
|
|
goto done; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void* __Pyx_FetchCommonPointer(void* pointer, const char* name); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void* __Pyx_FetchCommonPointer(void* pointer, const char* name) { |
|
|
#if PY_VERSION_HEX >= 0x02070000 |
|
|
PyObject* fake_module = NULL; |
|
|
PyObject* capsule = NULL; |
|
|
void* value = NULL; |
|
|
|
|
|
fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI); |
|
|
if (!fake_module) return NULL; |
|
|
Py_INCREF(fake_module); |
|
|
|
|
|
capsule = PyObject_GetAttrString(fake_module, name); |
|
|
if (!capsule) { |
|
|
if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; |
|
|
PyErr_Clear(); |
|
|
capsule = PyCapsule_New(pointer, name, NULL); |
|
|
if (!capsule) goto bad; |
|
|
if (PyObject_SetAttrString(fake_module, name, capsule) < 0) |
|
|
goto bad; |
|
|
} |
|
|
value = PyCapsule_GetPointer(capsule, name); |
|
|
|
|
|
bad: |
|
|
Py_XDECREF(capsule); |
|
|
Py_DECREF(fake_module); |
|
|
return value; |
|
|
#else |
|
|
return pointer; |
|
|
#endif |
|
|
} |
|
|
|