Commit b722d04f authored by Stefan Behnel's avatar Stefan Behnel

simplify common type sharing code and fix ref-count inconsistency

parent 6ebb4a99
...@@ -6,44 +6,25 @@ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); ...@@ -6,44 +6,25 @@ static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
static PyObject* fake_module = NULL; static PyObject* fake_module = NULL;
PyObject* args = NULL;
PyTypeObject* cached_type = NULL; PyTypeObject* cached_type = NULL;
const char* cython_module = "_cython_" CYTHON_ABI; const char* cython_module = "_cython_" CYTHON_ABI;
if (fake_module == NULL) { if (!fake_module) {
PyObject* sys_modules = PyImport_GetModuleDict(); // borrowed fake_module = PyImport_AddModule(cython_module);
fake_module = PyDict_GetItemString(sys_modules, cython_module); // borrowed if (!fake_module) goto bad;
if (fake_module != NULL) {
Py_INCREF(fake_module);
} else {
PyObject* py_cython_module;
args = PyTuple_New(1); if (args == NULL) goto bad;
#if PY_MAJOR_VERSION >= 3
py_cython_module = PyUnicode_DecodeUTF8(cython_module, strlen(cython_module), NULL);
#else
py_cython_module = PyBytes_FromString(cython_module);
#endif
if (py_cython_module == NULL) goto bad;
PyTuple_SET_ITEM(args, 0, py_cython_module);
fake_module = PyObject_Call((PyObject*) &PyModule_Type, args, NULL);
if (PyDict_SetItemString(sys_modules, cython_module, fake_module) < 0)
goto bad;
}
} }
if (PyObject_HasAttrString(fake_module, type->tp_name)) { cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name); if (!cached_type) {
} else { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
PyErr_Clear();
if (PyType_Ready(type) < 0) goto bad; if (PyType_Ready(type) < 0) goto bad;
if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
goto bad; goto bad;
Py_INCREF(type);
cached_type = type; cached_type = type;
} }
cleanup:
Py_XDECREF(args);
return cached_type;
bad: bad:
cached_type = NULL; // NOTE: always returns owned reference, or NULL on error
goto cleanup; return cached_type;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment