[pypy-svn] r8873 - in pypy/dist/pypy/objspace: . test

pedronis at codespeak.net pedronis at codespeak.net
Fri Feb 4 16:44:48 CET 2005


Author: pedronis
Date: Fri Feb  4 16:44:48 2005
New Revision: 8873

Added:
   pypy/dist/pypy/objspace/test/test_descroperation.py   (contents, props changed)
Modified:
   pypy/dist/pypy/objspace/descroperation.py
Log:
support for __getslice__, __setslice__ and __delslice__ for new-style classes too



Modified: pypy/dist/pypy/objspace/descroperation.py
==============================================================================
--- pypy/dist/pypy/objspace/descroperation.py	(original)
+++ pypy/dist/pypy/objspace/descroperation.py	Fri Feb  4 16:44:48 2005
@@ -168,6 +168,13 @@
         return space.get_and_call_function(w_descr, w_obj)
 
     def getitem(space, w_obj, w_key):
+        if space.is_true(space.isinstance(w_key, space.w_slice)):
+            if space.is_w(space.getattr(w_key, space.wrap('step')), space.w_None):
+                w_descr = space.lookup(w_obj, '__getslice__')
+                if w_descr is not None:
+                    return space.get_and_call_function(w_descr, w_obj,
+                                                       space.getattr(w_key, space.wrap('start')),
+                                                       space.getattr(w_key, space.wrap('stop')))
         w_descr = space.lookup(w_obj, '__getitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,
@@ -175,6 +182,14 @@
         return space.get_and_call_function(w_descr, w_obj, w_key)
 
     def setitem(space, w_obj, w_key, w_val):
+        if space.is_true(space.isinstance(w_key, space.w_slice)):
+            if space.is_w(space.getattr(w_key, space.wrap('step')), space.w_None):
+                w_descr = space.lookup(w_obj, '__setslice__')
+                if w_descr is not None:
+                    return space.get_and_call_function(w_descr, w_obj,
+                                                       space.getattr(w_key, space.wrap('start')),
+                                                       space.getattr(w_key, space.wrap('stop')),
+                                                       w_val)                    
         w_descr = space.lookup(w_obj, '__setitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,
@@ -182,6 +197,13 @@
         return space.get_and_call_function(w_descr, w_obj, w_key, w_val)
 
     def delitem(space, w_obj, w_key):
+        if space.is_true(space.isinstance(w_key, space.w_slice)):
+            if space.is_w(space.getattr(w_key, space.wrap('step')), space.w_None):
+                w_descr = space.lookup(w_obj, '__delslice__')
+                if w_descr is not None:
+                    return space.get_and_call_function(w_descr, w_obj,
+                                                       space.getattr(w_key, space.wrap('start')),
+                                                       space.getattr(w_key, space.wrap('stop')))
         w_descr = space.lookup(w_obj, '__delitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,

Added: pypy/dist/pypy/objspace/test/test_descroperation.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/objspace/test/test_descroperation.py	Fri Feb  4 16:44:48 2005
@@ -0,0 +1,15 @@
+
+
+class AppTest_Descroperation:
+
+    def test_getslice(self):
+        class Sq(object):
+            def __getslice__(self, start, stop):
+                return (start, stop)
+
+            def __getitem__(self, key):
+                return "booh"
+
+        sq = Sq()
+
+        assert sq[1:3] == (1,3)



More information about the Pypy-commit mailing list