PyEval_CallObject requires a tuple of args (closes #13186)

This commit is contained in:
Benjamin Peterson 2011-10-15 13:43:21 -04:00
parent 5baef6d23b
commit a7b0976c3e
4 changed files with 31 additions and 1 deletions

View File

@ -350,6 +350,19 @@ class ClassTests(unittest.TestCase):
AllTests.__delslice__ = delslice
@test_support.cpython_only
def testDelItem(self):
class A:
ok = False
def __delitem__(self, key):
self.ok = True
a = A()
# Subtle: we need to call PySequence_SetItem, not PyMapping_SetItem.
from _testcapi import sequence_delitem
sequence_delitem(a, 2)
self.assertTrue(a.ok)
def testUnaryOps(self):
testme = AllTests()

View File

@ -9,6 +9,9 @@ What's New in Python 2.7.3?
Core and Builtins
-----------------
- Issue #13186: Fix __delitem__ on old-style instances when invoked through
PySequence_DelItem.
- Issue #13156: Revert the patch for issue #10517 (reset TLS upon fork()),
which was only relevant for the native pthread TLS implementation.

View File

@ -1639,6 +1639,19 @@ make_exception_with_doc(PyObject *self, PyObject *args, PyObject *kwargs)
return PyErr_NewExceptionWithDoc(name, doc, base, dict);
}
static PyObject *
sequence_delitem(PyObject *self, PyObject *args)
{
PyObject *seq;
Py_ssize_t i;
if (!PyArg_ParseTuple(args, "On", &seq, &i))
return NULL;
if (PySequence_DelItem(seq, i) < 0)
return NULL;
Py_RETURN_NONE;
}
static PyMethodDef TestMethods[] = {
{"raise_exception", raise_exception, METH_VARARGS},
{"test_config", (PyCFunction)test_config, METH_NOARGS},
@ -1695,6 +1708,7 @@ static PyMethodDef TestMethods[] = {
{"code_newempty", code_newempty, METH_VARARGS},
{"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
METH_VARARGS | METH_KEYWORDS},
{"sequence_delitem", (PyCFunction)sequence_delitem, METH_VARARGS},
{NULL, NULL} /* sentinel */
};

View File

@ -1221,7 +1221,7 @@ instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
if (func == NULL)
return -1;
if (item == NULL)
arg = PyInt_FromSsize_t(i);
arg = Py_BuildValue("(n)", i);
else
arg = Py_BuildValue("(nO)", i, item);
if (arg == NULL) {