From a7b0976c3e183397a648598d96a7e1fa965cbd90 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 15 Oct 2011 13:43:21 -0400 Subject: [PATCH] PyEval_CallObject requires a tuple of args (closes #13186) --- Lib/test/test_class.py | 13 +++++++++++++ Misc/NEWS | 3 +++ Modules/_testcapimodule.c | 14 ++++++++++++++ Objects/classobject.c | 2 +- 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py index 0f25101827..db75b93479 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() diff --git a/Misc/NEWS b/Misc/NEWS index 03c4569aca..6fdcc6f6ca 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 23a5691304..9c45274a70 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 0832531422..161906ae5d 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) { -- 2.40.0