mirror of https://github.com/python/cpython
slot_sq_contains(): This leaked a reference to the result of calling
__contains__(). Bugfix candidate.
This commit is contained in:
parent
36eb4dfb81
commit
bf9b24464e
|
@ -4016,10 +4016,11 @@ static int
|
||||||
slot_sq_contains(PyObject *self, PyObject *value)
|
slot_sq_contains(PyObject *self, PyObject *value)
|
||||||
{
|
{
|
||||||
PyObject *func, *res, *args;
|
PyObject *func, *res, *args;
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
static PyObject *contains_str;
|
static PyObject *contains_str;
|
||||||
|
|
||||||
func = lookup_maybe(self, "__contains__", &contains_str);
|
func = lookup_maybe(self, "__contains__", &contains_str);
|
||||||
|
|
||||||
if (func != NULL) {
|
if (func != NULL) {
|
||||||
args = Py_BuildValue("(O)", value);
|
args = Py_BuildValue("(O)", value);
|
||||||
if (args == NULL)
|
if (args == NULL)
|
||||||
|
@ -4029,16 +4030,16 @@ slot_sq_contains(PyObject *self, PyObject *value)
|
||||||
Py_DECREF(args);
|
Py_DECREF(args);
|
||||||
}
|
}
|
||||||
Py_DECREF(func);
|
Py_DECREF(func);
|
||||||
if (res == NULL)
|
if (res != NULL) {
|
||||||
return -1;
|
result = PyObject_IsTrue(res);
|
||||||
return PyObject_IsTrue(res);
|
Py_DECREF(res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (PyErr_Occurred())
|
else if (! PyErr_Occurred()) {
|
||||||
return -1;
|
result = _PySequence_IterSearch(self, value,
|
||||||
else {
|
PY_ITERSEARCH_CONTAINS);
|
||||||
return _PySequence_IterSearch(self, value,
|
|
||||||
PY_ITERSEARCH_CONTAINS);
|
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
|
SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
|
||||||
|
@ -4685,7 +4686,7 @@ slot_tp_del(PyObject *self)
|
||||||
|
|
||||||
|
|
||||||
/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
|
/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
|
||||||
functions. The offsets here are relative to the 'PyHeapTypeObject'
|
functions. The offsets here are relative to the 'PyHeapTypeObject'
|
||||||
structure, which incorporates the additional structures used for numbers,
|
structure, which incorporates the additional structures used for numbers,
|
||||||
sequences and mappings.
|
sequences and mappings.
|
||||||
Note that multiple names may map to the same slot (e.g. __eq__,
|
Note that multiple names may map to the same slot (e.g. __eq__,
|
||||||
|
@ -5216,7 +5217,7 @@ update_all_slots(PyTypeObject* type)
|
||||||
mp_subscript generate a __getitem__ descriptor).
|
mp_subscript generate a __getitem__ descriptor).
|
||||||
|
|
||||||
In the latter case, the first slotdef entry encoutered wins. Since
|
In the latter case, the first slotdef entry encoutered wins. Since
|
||||||
slotdef entries are sorted by the offset of the slot in the
|
slotdef entries are sorted by the offset of the slot in the
|
||||||
PyHeapTypeObject, this gives us some control over disambiguating
|
PyHeapTypeObject, this gives us some control over disambiguating
|
||||||
between competing slots: the members of PyHeapTypeObject are listed from most
|
between competing slots: the members of PyHeapTypeObject are listed from most
|
||||||
general to least general, so the most general slot is preferred. In
|
general to least general, so the most general slot is preferred. In
|
||||||
|
|
Loading…
Reference in New Issue