slot_sq_contains(): This leaked a reference to the result of calling

__contains__().

Bugfix candidate.
This commit is contained in:
Tim Peters 2003-03-23 05:35:36 +00:00
parent 36eb4dfb81
commit bf9b24464e
1 changed files with 12 additions and 11 deletions

View File

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