summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2011-10-15 17:43:21 (GMT)
committerBenjamin Peterson <benjamin@python.org>2011-10-15 17:43:21 (GMT)
commita7b0976c3e183397a648598d96a7e1fa965cbd90 (patch)
tree893cfaada76ad21f2d3f9798cf98c60e5df32e84
parent5baef6d23b766121d92e8f562557ff9c3f3ef2db (diff)
downloadcpython-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.py13
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_testcapimodule.c14
-rw-r--r--Objects/classobject.c2
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()
diff --git a/Misc/NEWS b/Misc/NEWS
index 03c4569..6fdcc6f 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 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) {