Patch #1674228: when assigning a slice (old-style), check for the

sq_ass_slice instead of the sq_slice slot.
This commit is contained in:
Georg Brandl 2007-03-05 22:28:08 +00:00
parent ca90ca81a4
commit 0fca97a5fb
3 changed files with 18 additions and 1 deletions

View file

@ -4206,6 +4206,19 @@ def notimplemented():
check(iexpr, c, N1) check(iexpr, c, N1)
check(iexpr, c, N2) check(iexpr, c, N2)
def test_assign_slice():
# ceval.c's assign_slice used to check for
# tp->tp_as_sequence->sq_slice instead of
# tp->tp_as_sequence->sq_ass_slice
class C(object):
def __setslice__(self, start, stop, value):
self.value = value
c = C()
c[1:2] = 3
vereq(c.value, 3)
def test_main(): def test_main():
weakref_segfault() # Must be first, somehow weakref_segfault() # Must be first, somehow
wrapper_segfault() wrapper_segfault()
@ -4301,6 +4314,7 @@ def test_main():
test_init() test_init()
methodwrapper() methodwrapper()
notimplemented() notimplemented()
test_assign_slice()
from test import test_descr from test import test_descr
run_doctest(test_descr, verbosity=True) run_doctest(test_descr, verbosity=True)

View file

@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 1?
Core and builtins Core and builtins
----------------- -----------------
- Patch #1674228: when assigning a slice (old-style), check for the
sq_ass_slice instead of the sq_slice slot.
- When printing an unraisable error, don't print exceptions. before the name. - When printing an unraisable error, don't print exceptions. before the name.
This duplicates the behavior whening normally printing exceptions. This duplicates the behavior whening normally printing exceptions.

View file

@ -3927,7 +3927,7 @@ assign_slice(PyObject *u, PyObject *v, PyObject *w, PyObject *x)
PyTypeObject *tp = u->ob_type; PyTypeObject *tp = u->ob_type;
PySequenceMethods *sq = tp->tp_as_sequence; PySequenceMethods *sq = tp->tp_as_sequence;
if (sq && sq->sq_slice && ISINDEX(v) && ISINDEX(w)) { if (sq && sq->sq_ass_slice && ISINDEX(v) && ISINDEX(w)) {
Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX; Py_ssize_t ilow = 0, ihigh = PY_SSIZE_T_MAX;
if (!_PyEval_SliceIndex(v, &ilow)) if (!_PyEval_SliceIndex(v, &ilow))
return -1; return -1;