mirror of
https://github.com/psycopg/psycopg2.git
synced 2025-03-03 07:45:45 +03:00
Guard from failed keys creation during adaptation
This commit is contained in:
parent
18085201c8
commit
dc4c3d3143
|
@ -78,9 +78,9 @@ exit:
|
|||
|
||||
/* Check if one of `obj` superclasses has an adapter for `proto`.
|
||||
*
|
||||
* If it does, return a *borrowed reference* to the adapter, else NULL.
|
||||
* If it does, return a *borrowed reference* to the adapter, else to None.
|
||||
*/
|
||||
static PyObject *
|
||||
BORROWED static PyObject *
|
||||
_get_superclass_adapter(PyObject *obj, PyObject *proto)
|
||||
{
|
||||
PyTypeObject *type;
|
||||
|
@ -95,14 +95,14 @@ _get_superclass_adapter(PyObject *obj, PyObject *proto)
|
|||
#endif
|
||||
type->tp_mro)) {
|
||||
/* has no mro */
|
||||
return NULL;
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
/* Walk the mro from the most specific subclass. */
|
||||
mro = type->tp_mro;
|
||||
for (i = 1, ii = PyTuple_GET_SIZE(mro); i < ii; ++i) {
|
||||
st = PyTuple_GET_ITEM(mro, i);
|
||||
key = PyTuple_Pack(2, st, proto);
|
||||
if (!(key = PyTuple_Pack(2, st, proto))) { return NULL; }
|
||||
adapter = PyDict_GetItem(psyco_adapters, key);
|
||||
Py_DECREF(key);
|
||||
|
||||
|
@ -125,7 +125,7 @@ _get_superclass_adapter(PyObject *obj, PyObject *proto)
|
|||
return adapter;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return Py_None;
|
||||
}
|
||||
|
||||
|
||||
|
@ -145,7 +145,7 @@ microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
|
|||
Py_TYPE(obj)->tp_name);
|
||||
|
||||
/* look for an adapter in the registry */
|
||||
key = PyTuple_Pack(2, Py_TYPE(obj), proto);
|
||||
if (!(key = PyTuple_Pack(2, Py_TYPE(obj), proto))) { return NULL; }
|
||||
adapter = PyDict_GetItem(psyco_adapters, key);
|
||||
Py_DECREF(key);
|
||||
if (adapter) {
|
||||
|
@ -154,7 +154,10 @@ microprotocols_adapt(PyObject *obj, PyObject *proto, PyObject *alt)
|
|||
}
|
||||
|
||||
/* Check if a superclass can be adapted and use the same adapter. */
|
||||
if (NULL != (adapter = _get_superclass_adapter(obj, proto))) {
|
||||
if (!(adapter = _get_superclass_adapter(obj, proto))) {
|
||||
return NULL;
|
||||
}
|
||||
if (Py_None != adapter) {
|
||||
adapted = PyObject_CallFunctionObjArgs(adapter, obj, NULL);
|
||||
return adapted;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user