diff options
author | Benjamin Peterson <benjamin@python.org> | 2011-10-15 17:43:21 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2011-10-15 17:43:21 (GMT) |
commit | a7b0976c3e183397a648598d96a7e1fa965cbd90 (patch) | |
tree | 893cfaada76ad21f2d3f9798cf98c60e5df32e84 | |
parent | 5baef6d23b766121d92e8f562557ff9c3f3ef2db (diff) | |
download | cpython-a7b0976c3e183397a648598d96a7e1fa965cbd90.zip cpython-a7b0976c3e183397a648598d96a7e1fa965cbd90.tar.gz cpython-a7b0976c3e183397a648598d96a7e1fa965cbd90.tar.bz2 |
PyEval_CallObject requires a tuple of args (closes #13186)
-rw-r--r-- | Lib/test/test_class.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_testcapimodule.c | 14 | ||||
-rw-r--r-- | Objects/classobject.c | 2 |
4 files changed, 31 insertions, 1 deletions
diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 0f25101..db75b93 100644 --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -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() @@ -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. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 23a5691..9c45274 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -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 */ }; diff --git a/Objects/classobject.c b/Objects/classobject.c index 0832531..161906a 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -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) { |