[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