15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// FetchCommonType.proto ///////////////
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// FetchCommonType ///////////////
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* fake_module;
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyTypeObject* cached_type = NULL;
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!fake_module) return NULL;
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_INCREF(fake_module);
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (cached_type) {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!PyType_Check((PyObject*)cached_type)) {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_Format(PyExc_TypeError,
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "Shared Cython type %.200s is not a type object",
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                type->tp_name);
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (cached_type->tp_basicsize != type->tp_basicsize) {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_Format(PyExc_TypeError,
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "Shared Cython type %.200s has the wrong size, try recompiling",
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                type->tp_name);
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_Clear();
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (PyType_Ready(type) < 0) goto bad;
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(type);
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        cached_type = type;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)done:
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_DECREF(fake_module);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // NOTE: always returns owned reference, or NULL on error
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return cached_type;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(cached_type);
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    cached_type = NULL;
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    goto done;
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
49