[pypy-svn] rev 682 - in pypy/trunk/src/pypy/objspace/std: . test

mwh at codespeak.net mwh at codespeak.net
Thu May 29 16:31:53 CEST 2003


Author: mwh
Date: Thu May 29 16:31:53 2003
New Revision: 682

Modified:
   pypy/trunk/src/pypy/objspace/std/sliceobject.py
   pypy/trunk/src/pypy/objspace/std/stringobject.py
   pypy/trunk/src/pypy/objspace/std/stringobject_app.py
   pypy/trunk/src/pypy/objspace/std/test/test_stringobject.py
Log:
make str[slice] work this involved implementing it in interpreter space
also exposed a variant of slice.indices to Python, cleanup needed in this
area
make the app-space version of str[slice] more likely to work, but it still 
doesn't
added tests for simple slicing, tests for extended slicing to follow


Modified: pypy/trunk/src/pypy/objspace/std/sliceobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/sliceobject.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/sliceobject.py	Thu May 29 16:31:53 2003
@@ -1,6 +1,7 @@
 from pypy.objspace.std.objspace import *
 from pypy.interpreter.appfile import AppFile
-
+from pypy.interpreter.extmodule import make_builtin_func
+from pypy.objspace.std.instmethobject import W_InstMethObject
 
 appfile = AppFile(__name__, ["objspace.std"])
 
@@ -15,6 +16,10 @@
         w_ret = space.gethelper(appfile).call("sliceindices", [w_self, w_length])
         w_start, w_stop, w_step, w_slicelength = space.unpackiterable(w_ret, 4)
         return w_start, w_stop, w_step, w_slicelength
+    def indices2(w_self, w_length):
+        w_ret = w_self.space.gethelper(appfile).call("sliceindices", [w_self, w_length])
+        w_start, w_stop, w_step, w_slicelength = w_self.space.unpackiterable(w_ret, 4)
+        return w_self.space.newtuple([w_start, w_stop, w_step, w_slicelength])
 
 
 def getattr_slice_any(space, w_slice, w_attr):
@@ -33,6 +38,10 @@
             return space.w_None
         else:
             return w_slice.w_step
+    if space.is_true(space.eq(w_attr, space.wrap('indices'))):
+        w_builtinfn = make_builtin_func(space, W_SliceObject.indices2)
+        return W_InstMethObject(space, w_slice, w_builtinfn)
+    
     raise FailedToImplement(space.w_AttributeError)
 
 StdObjSpace.getattr.register(getattr_slice_any, W_SliceObject, W_ANY)

Modified: pypy/trunk/src/pypy/objspace/std/stringobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/stringobject.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/stringobject.py	Thu May 29 16:31:53 2003
@@ -229,10 +229,24 @@
                              W_StringObject, W_IntObject)
 
 def getitem_str_slice(space, w_str, w_slice):
-    return applicationfile.call(space, "getitem_string_slice", [w_str, w_slice])
+    w = space.wrap
+    u = space.unwrap
+    w_start, w_stop, w_step, w_sl = w_slice.indices(space, w(w_str._value.len))
+    start = u(w_start)
+    stop = u(w_stop)
+    step = u(w_step)
+    sl = u(w_sl)
+    r = [None] * sl
+    for i in range(sl):
+        r[i] = space.getitem(w_str, w(start + i*step))
+    w_r = space.newlist(r)
+    w_empty = space.newstring([])
+    return w_empty.join(w_r)
+    return space.gethelper(applicationfile).call(
+        "getitem_string_slice", [w_str, w_slice])
 
 StdObjSpace.getitem.register(getitem_str_slice, 
-                                W_StringObject, W_SliceObject)
+                             W_StringObject, W_SliceObject)
 
 def add_str_str(space, w_left, w_right):
     return W_StringObject(space, w_left._value.value() + w_right._value.value())

Modified: pypy/trunk/src/pypy/objspace/std/stringobject_app.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/stringobject_app.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/stringobject_app.py	Thu May 29 16:31:53 2003
@@ -1,6 +1,6 @@
 def getitem_string_slice(str, sliceob):
      r = []
-     for i in xrange(*sliceob.indices(len(str))):
+     for i in range(*sliceob.indices(len(str))):
          r.append(str[i])
      return ''.join(r)
 

Modified: pypy/trunk/src/pypy/objspace/std/test/test_stringobject.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/std/test/test_stringobject.py	(original)
+++ pypy/trunk/src/pypy/objspace/std/test/test_stringobject.py	Thu May 29 16:31:53 2003
@@ -46,7 +46,28 @@
                             space.getitem,
                             w_str,
                             w(3))
-        
+
+    def test_slice(self):
+        space = self.space
+        w = space.wrap
+        w_str = w('abc')
+        w_slice = space.newslice(w(0), w(0), None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w(''))
+        w_slice = space.newslice(w(0), w(1), None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w('a'))
+        w_slice = space.newslice(w(0), w(10), None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w('abc'))
+        w_slice = space.newslice(space.w_None, space.w_None, None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w('abc'))
+        w_slice = space.newslice(space.w_None, w(-1), None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w('ab'))
+        w_slice = space.newslice(w(-1), space.w_None, None)
+        self.assertEqual_w(space.getitem(w_str, w_slice), w('c'))
+
+    def test_extended_slice(self):
+        space = self.space
+        w = space.wrap
+        w_str = w('abc')
 
 if __name__ == '__main__':
     testsupport.main()


More information about the Pypy-commit mailing list