| | |
| |
|
| | 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 |
| | } |
| |
|