[pypy-svn] rev 2452 - in pypy/trunk/src/pypy/objspace/std: . test
pmaupin at codespeak.net
pmaupin at codespeak.net
Wed Dec 17 16:59:37 CET 2003
Author: pmaupin
Date: Wed Dec 17 16:59:36 2003
New Revision: 2452
Modified:
pypy/trunk/src/pypy/objspace/std/listobject.py
pypy/trunk/src/pypy/objspace/std/test/test_listobject.py
Log:
Added stride 1 slice assignments
Modified: pypy/trunk/src/pypy/objspace/std/listobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/listobject.py (original)
+++ pypy/trunk/src/pypy/objspace/std/listobject.py Wed Dec 17 16:59:36 2003
@@ -177,24 +177,34 @@
items[idx] = w_any
return space.w_None
-# XXX not trivial!
def setitem__List_Slice_List(space, w_list, w_slice, w_list2):
- raise Exception, "not done!"
-## items = w_list.ob_item
-## w_length = space.wrap(w_list.ob_size)
-## w_start, w_stop, w_step, w_slicelength = w_slice.indices(w_length)
-## start = space.unwrap(w_start)
-## step = space.unwrap(w_step)
-## slicelength = space.unwrap(w_slicelength)
-## assert slicelength >= 0
-## w_res = W_ListObject(space, [])
-## _list_resize(w_res, slicelength)
-## subitems = w_res.ob_item
-## for i in range(slicelength):
-## subitems[i] = items[start]
-## start += step
-## w_res.ob_size = slicelength
-## return w_res
+ w_length = space.wrap(w_list.ob_size)
+ start, stop, step, slicelength = slicetype.indices4(space,w_slice,w_list.ob_size)
+ assert slicelength >= 0
+ if step != 1:
+ raise OperationError(space.w_NotImplementedError,
+ space.wrap("Assignment to extended slices not implemented yet."))
+ len2 = w_list2.ob_size
+ delta = len2 - slicelength
+ oldsize = w_list.ob_size
+ newsize = oldsize + delta
+ _list_resize(w_list, newsize)
+ items = w_list.ob_item
+ w_list.ob_size = newsize
+ if delta > 0:
+ r = range(newsize-1,stop+delta-1,-1)
+ elif delta < 0:
+ r = range(stop+delta,newsize)
+ else:
+ r = ()
+
+ for i in r:
+ items[i] = items[i-delta]
+
+ for i in range(len2):
+ # items[start+i] = space.getitem(w_list2,space.wrap(i))
+ items[start+i] = w_list2.ob_item[i]
+ return space.w_None
def repr__List(space, w_list):
w = space.wrap
Modified: pypy/trunk/src/pypy/objspace/std/test/test_listobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/test/test_listobject.py (original)
+++ pypy/trunk/src/pypy/objspace/std/test/test_listobject.py Wed Dec 17 16:59:36 2003
@@ -76,9 +76,9 @@
w_result = self.space.getitem(w_list, w_slice)
self.assertEqual(self.space.unwrap(w_result), expected)
- for testlist in [[], [5,3,99], list(range(5,555,10))]:
- for start in [-2, -1, 0, 1, 10]:
- for end in [-1, 0, 2, 999]:
+ for testlist in [[], [5,3,99]]:
+ for start in [-2, 0, 1, 10]:
+ for end in [-1, 2, 999]:
test1(testlist, start, end, 1, testlist[start:end])
test1([5,7,1,4], 3, 1, -2, [4,])
@@ -88,6 +88,24 @@
test1([5,7,1,4], -3, 11, 2, [7, 4])
test1([5,7,1,4], -5, 11, 2, [5, 1])
+ def test_setslice(self):
+ w = self.space.wrap
+
+ def test1(lhslist, start, stop, rhslist, expected):
+ w_slice = self.space.newslice(w(start), w(stop), w(1))
+ w_lhslist = W_ListObject(self.space, [w(i) for i in lhslist])
+ w_rhslist = W_ListObject(self.space, [w(i) for i in rhslist])
+ self.space.setitem(w_lhslist, w_slice, w_rhslist)
+ self.assertEqual(self.space.unwrap(w_lhslist), expected)
+
+
+ test1([5,7,1,4], 1, 3, [9,8], [5,9,8,4])
+ test1([5,7,1,4], 1, 3, [9], [5,9,4])
+ test1([5,7,1,4], 1, 3, [9,8,6],[5,9,8,6,4])
+ test1([5,7,1,4], 1, 3, [], [5,4])
+ test1([5,7,1,4], 2, 2, [9], [5,7,9,1,4])
+ test1([5,7,1,4], 0, 99,[9,8], [9,8])
+
def test_add(self):
w = self.space.wrap
w_list0 = W_ListObject(self.space, [])
@@ -115,28 +133,6 @@
w_res = self.space.mul(w(n), w_lis)
self.assertEqual_w(w_lis3, w_res)
- def test_getslice(self):
- # this takes aaagggeeesss!!!
- w = self.space.wrap
-
- def test1(testlist, start, stop, step, expected):
- w_slice = self.space.newslice(w(start), w(stop), w(step))
- w_list = W_ListObject(self.space, [w(i) for i in testlist])
- w_result = self.space.getitem(w_list, w_slice)
- self.assertEqual(self.space.unwrap(w_result), expected)
-
- for testlist in [[], [5,3,99], list(range(5,555,10))]:
- for start in [-2, -1, 0, 1, 10]:
- for end in [-1, 0, 2, 999]:
- test1(testlist, start, end, 1, testlist[start:end])
-
- test1([5,7,1,4], 3, 1, -2, [4,])
- test1([5,7,1,4], 3, 0, -2, [4, 7])
- test1([5,7,1,4], 3, -1, -2, [])
- test1([5,7,1,4], -2, 11, 2, [1])
- test1([5,7,1,4], -3, 11, 2, [7, 4])
- test1([5,7,1,4], -5, 11, 2, [5, 1])
-
def test_setitem(self):
w = self.space.wrap
w_list = W_ListObject(self.space, [w(5), w(3)])
More information about the Pypy-commit
mailing list