[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