[pypy-svn] r11544 - in pypy/dist/pypy: interpreter objspace objspace/flow objspace/std objspace/std/test objspace/test

arigo at codespeak.net arigo at codespeak.net
Wed Apr 27 20:21:40 CEST 2005


Author: arigo
Date: Wed Apr 27 20:21:40 2005
New Revision: 11544

Modified:
   pypy/dist/pypy/interpreter/baseobjspace.py
   pypy/dist/pypy/interpreter/pyopcode.py
   pypy/dist/pypy/objspace/descroperation.py
   pypy/dist/pypy/objspace/flow/objspace.py
   pypy/dist/pypy/objspace/std/objspace.py
   pypy/dist/pypy/objspace/std/sliceobject.py
   pypy/dist/pypy/objspace/std/test/test_stringobject.py
   pypy/dist/pypy/objspace/test/test_descroperation.py
Log:
Clean up of space.newslice().  Now it always takes wrapped Nones.

Moved the logic of __getslice__&co into a space.getslice() operation, which by
default does just the sane thing, i.e. space.getitem(space.newslice(...)). The
standard object space overrides it to look for the deprecated __getslice__
family of methods.



Modified: pypy/dist/pypy/interpreter/baseobjspace.py
==============================================================================
--- pypy/dist/pypy/interpreter/baseobjspace.py	(original)
+++ pypy/dist/pypy/interpreter/baseobjspace.py	Wed Apr 27 20:21:40 2005
@@ -146,6 +146,17 @@
         else:
             return self.w_False
 
+    # support for the deprecated __getslice__, __setslice__, __delslice__
+    def getslice(self, w_obj, w_start, w_stop):
+        w_slice = self.newslice(w_start, w_stop, self.w_None)
+        return self.getitem(w_obj, w_slice)
+    def setslice(self, w_obj, w_start, w_stop, w_sequence):
+        w_slice = self.newslice(w_start, w_stop, self.w_None)
+        self.setitem(w_obj, w_slice, w_sequence)
+    def delslice(self, w_obj, w_start, w_stop):
+        w_slice = self.newslice(w_start, w_stop, self.w_None)
+        self.delitem(w_obj, w_slice)
+
     def interpclass_w(space, w_obj):
         """
          If w_obj is a wrapped internal interpreter class instance unwrap to it,
@@ -465,7 +476,7 @@
 #                   newlist([w_1, w_2,...]) -> w_list
 #                 newstring([w_1, w_2,...]) -> w_string from ascii numbers (bytes)
 #            newdict([(w_key,w_value),...]) -> w_dict
-#           newslice(w_start,w_stop,w_step) -> w_slice (any argument may be a real None)
+#           newslice(w_start,w_stop,w_step) -> w_slice
 #              call_args(w_obj,Arguments()) -> w_result
 
 ObjSpace.IrregularOpTable = [

Modified: pypy/dist/pypy/interpreter/pyopcode.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyopcode.py	(original)
+++ pypy/dist/pypy/interpreter/pyopcode.py	Wed Apr 27 20:21:40 2005
@@ -201,21 +201,20 @@
     INPLACE_OR  = binaryoperation("inplace_or")
 
     def slice(f, w_start, w_end):
-        w_slice = f.space.newslice(w_start, w_end, None)
         w_obj = f.valuestack.pop()
-        w_result = f.space.getitem(w_obj, w_slice)
+        w_result = f.space.getslice(w_obj, w_start, w_end)
         f.valuestack.push(w_result)
 
     def SLICE_0(f):
-        f.slice(None, None)
+        f.slice(f.space.w_None, f.space.w_None)
 
     def SLICE_1(f):
         w_start = f.valuestack.pop()
-        f.slice(w_start, None)
+        f.slice(w_start, f.space.w_None)
 
     def SLICE_2(f):
         w_end = f.valuestack.pop()
-        f.slice(None, w_end)
+        f.slice(f.space.w_None, w_end)
 
     def SLICE_3(f):
         w_end = f.valuestack.pop()
@@ -223,21 +222,20 @@
         f.slice(w_start, w_end)
 
     def storeslice(f, w_start, w_end):
-        w_slice = f.space.newslice(w_start, w_end, None)
         w_obj = f.valuestack.pop()
         w_newvalue = f.valuestack.pop()
-        f.space.setitem(w_obj, w_slice, w_newvalue)
+        f.space.setslice(w_obj, w_start, w_end, w_newvalue)
 
     def STORE_SLICE_0(f):
-        f.storeslice(None, None)
+        f.storeslice(f.space.w_None, f.space.w_None)
 
     def STORE_SLICE_1(f):
         w_start = f.valuestack.pop()
-        f.storeslice(w_start, None)
+        f.storeslice(w_start, f.space.w_None)
 
     def STORE_SLICE_2(f):
         w_end = f.valuestack.pop()
-        f.storeslice(None, w_end)
+        f.storeslice(f.space.w_None, w_end)
 
     def STORE_SLICE_3(f):
         w_end = f.valuestack.pop()
@@ -245,20 +243,19 @@
         f.storeslice(w_start, w_end)
 
     def deleteslice(f, w_start, w_end):
-        w_slice = f.space.newslice(w_start, w_end, None)
         w_obj = f.valuestack.pop()
-        f.space.delitem(w_obj, w_slice)
+        f.space.delslice(w_obj, w_start, w_end)
 
     def DELETE_SLICE_0(f):
-        f.deleteslice(None, None)
+        f.deleteslice(f.space.w_None, f.space.w_None)
 
     def DELETE_SLICE_1(f):
         w_start = f.valuestack.pop()
-        f.deleteslice(w_start, None)
+        f.deleteslice(w_start, f.space.w_None)
 
     def DELETE_SLICE_2(f):
         w_end = f.valuestack.pop()
-        f.deleteslice(None, w_end)
+        f.deleteslice(f.space.w_None, w_end)
 
     def DELETE_SLICE_3(f):
         w_end = f.valuestack.pop()
@@ -668,7 +665,7 @@
         if numargs == 3:
             w_step = f.valuestack.pop()
         elif numargs == 2:
-            w_step = None
+            w_step = f.space.w_None
         else:
             raise pyframe.BytecodeCorruption
         w_end   = f.valuestack.pop()

Modified: pypy/dist/pypy/objspace/descroperation.py
==============================================================================
--- pypy/dist/pypy/objspace/descroperation.py	(original)
+++ pypy/dist/pypy/objspace/descroperation.py	Wed Apr 27 20:21:40 2005
@@ -1,4 +1,4 @@
-import operator, sys
+import operator
 from pypy.interpreter.error import OperationError
 from pypy.interpreter.baseobjspace import ObjSpace, W_Root, BaseWrappable
 from pypy.interpreter.function import Function
@@ -180,30 +180,7 @@
                    space.wrap("iterator has no next() method"))
         return space.get_and_call_function(w_descr, w_obj)
 
-    def _oldstyle_slice_range(space, w_obj, w_key):
-        w_start = space.getattr(w_key, space.wrap('start'))
-        w_stop  = space.getattr(w_key, space.wrap('stop'))
-        if space.is_w(w_start, space.w_None):
-            w_start = space.wrap(0)
-        elif space.is_true(space.lt(w_start, space.wrap(0))):
-            w_start = space.add(w_start, space.len(w_obj))
-            # NB. the language ref is inconsistent with the new-style class
-            # behavior when w_obj doesn't implement __len__(), so we just
-            # ignore this case.
-        if space.is_w(w_stop, space.w_None):
-            w_stop = space.wrap(sys.maxint)
-        elif space.is_true(space.lt(w_stop, space.wrap(0))):
-            w_stop = space.add(w_stop, space.len(w_obj))
-        return w_start, w_stop
-
     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:
-                    w_start, w_stop = space._oldstyle_slice_range(w_obj, w_key)
-                    return space.get_and_call_function(w_descr, w_obj,
-                                                       w_start, w_stop)
         w_descr = space.lookup(w_obj, '__getitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,
@@ -211,14 +188,6 @@
         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:
-                    w_start, w_stop = space._oldstyle_slice_range(w_obj, w_key)
-                    return space.get_and_call_function(w_descr, w_obj,
-                                                       w_start, w_stop,
-                                                       w_val)                    
         w_descr = space.lookup(w_obj, '__setitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,
@@ -226,13 +195,6 @@
         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:
-                    w_start, w_stop = space._oldstyle_slice_range(w_obj, w_key)
-                    return space.get_and_call_function(w_descr, w_obj,
-                                                       w_start, w_stop)
         w_descr = space.lookup(w_obj, '__delitem__')
         if w_descr is None:
             raise OperationError(space.w_TypeError,

Modified: pypy/dist/pypy/objspace/flow/objspace.py
==============================================================================
--- pypy/dist/pypy/objspace/flow/objspace.py	(original)
+++ pypy/dist/pypy/objspace/flow/objspace.py	Wed Apr 27 20:21:40 2005
@@ -103,10 +103,7 @@
             return Constant(content)
         return self.do_operation('newlist', *args_w)
 
-    def newslice(self, w_start=None, w_stop=None, w_step=None):
-        if w_start is None: w_start = self.w_None
-        if w_stop  is None: w_stop  = self.w_None
-        if w_step  is None: w_step  = self.w_None
+    def newslice(self, w_start, w_stop, w_step):
         if self.concrete_mode:
             return Constant(slice(self.unwrap(w_start),
                                   self.unwrap(w_stop),

Modified: pypy/dist/pypy/objspace/std/objspace.py
==============================================================================
--- pypy/dist/pypy/objspace/std/objspace.py	(original)
+++ pypy/dist/pypy/objspace/std/objspace.py	Wed Apr 27 20:21:40 2005
@@ -10,6 +10,7 @@
 from pypy.objspace.descroperation import DescrOperation
 from pypy.objspace.std import stdtypedef
 import types
+import sys
 
 
 def registerimplementation(implcls):
@@ -260,9 +261,6 @@
         return W_DictObject(self, list_pairs_w)
 
     def newslice(self, w_start, w_end, w_step):
-        # w_step may be a real None
-        if w_step is None:
-            w_step = self.w_None
         return W_SliceObject(self, w_start, w_end, w_step)
 
     def newstring(self, chars_w):
@@ -320,6 +318,32 @@
         else:
             return DescrOperation.is_true(self, w_obj)
 
+    # support for the deprecated __getslice__, __setslice__, __delslice__
+
+    def getslice(self, w_obj, w_start, w_stop):
+        w_descr = self.lookup(w_obj, '__getslice__')
+        if w_descr is not None:
+            w_start, w_stop = old_slice_range(self, w_obj, w_start, w_stop)
+            return self.get_and_call_function(w_descr, w_obj, w_start, w_stop)
+        else:
+            return ObjSpace.getslice(self, w_obj, w_start, w_stop)
+
+    def setslice(self, w_obj, w_start, w_stop, w_sequence):
+        w_descr = self.lookup(w_obj, '__setslice__')
+        if w_descr is not None:
+            w_start, w_stop = old_slice_range(self, w_obj, w_start, w_stop)
+            self.get_and_call_function(w_descr, w_obj, w_start, w_stop,
+                                       w_sequence)
+        else:
+            ObjSpace.setslice(self, w_obj, w_start, w_stop, w_sequence)
+
+    def delslice(self, w_obj, w_start, w_stop):
+        w_descr = self.lookup(w_obj, '__delslice__')
+        if w_descr is not None:
+            w_start, w_stop = old_slice_range(self, w_obj, w_start, w_stop)
+            self.get_and_call_function(w_descr, w_obj, w_start, w_stop)
+        else:
+            ObjSpace.delslice(self, w_obj, w_start, w_stop)
 
     class MM:
         "Container for multimethods."
@@ -340,3 +364,20 @@
                 del mm
 
         pow.extras['defaults'] = (None,)
+
+
+
+def old_slice_range(space, w_obj, w_start, w_stop):
+    """Only for backward compatibility for __getslice__()&co methods."""
+    if space.is_w(w_start, space.w_None):
+        w_start = space.wrap(0)
+    elif space.is_true(space.lt(w_start, space.wrap(0))):
+        w_start = space.add(w_start, space.len(w_obj))
+        # NB. the language ref is inconsistent with the new-style class
+        # behavior when w_obj doesn't implement __len__(), so we just
+        # ignore this case.
+    if space.is_w(w_stop, space.w_None):
+        w_stop = space.wrap(sys.maxint)
+    elif space.is_true(space.lt(w_stop, space.wrap(0))):
+        w_stop = space.add(w_stop, space.len(w_obj))
+    return w_start, w_stop

Modified: pypy/dist/pypy/objspace/std/sliceobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/sliceobject.py	(original)
+++ pypy/dist/pypy/objspace/std/sliceobject.py	Wed Apr 27 20:21:40 2005
@@ -14,6 +14,9 @@
     
     def __init__(w_self, space, w_start, w_stop, w_step):
         W_Object.__init__(w_self, space)
+        assert w_start is not None
+        assert w_stop is not None
+        assert w_step is not None
         w_self.w_start = w_start
         w_self.w_stop = w_stop
         w_self.w_step = w_step

Modified: pypy/dist/pypy/objspace/std/test/test_stringobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_stringobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_stringobject.py	Wed Apr 27 20:21:40 2005
@@ -75,22 +75,22 @@
         w = space.wrap
         w_str = w('abc')
 
-        w_slice = space.newslice(w(0), w(0), None)
+        w_slice = space.newslice(w(0), w(0), space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w(''))
 
-        w_slice = space.newslice(w(0), w(1), None)
+        w_slice = space.newslice(w(0), w(1), space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w('a'))
 
-        w_slice = space.newslice(w(0), w(10), None)
+        w_slice = space.newslice(w(0), w(10), space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w('abc'))
 
-        w_slice = space.newslice(space.w_None, space.w_None, None)
+        w_slice = space.newslice(space.w_None, space.w_None, space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w('abc'))
 
-        w_slice = space.newslice(space.w_None, w(-1), None)
+        w_slice = space.newslice(space.w_None, w(-1), space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w('ab'))
 
-        w_slice = space.newslice(w(-1), space.w_None, None)
+        w_slice = space.newslice(w(-1), space.w_None, space.w_None)
         assert self.space.eq_w(space.getitem(w_str, w_slice), w('c'))
 
     def test_extended_slice(self):

Modified: pypy/dist/pypy/objspace/test/test_descroperation.py
==============================================================================
--- pypy/dist/pypy/objspace/test/test_descroperation.py	(original)
+++ pypy/dist/pypy/objspace/test/test_descroperation.py	Wed Apr 27 20:21:40 2005
@@ -22,6 +22,8 @@
         assert sq[-1:3] == (99, 3)
         assert sq[1:-3] == (1, 97)
         assert sq[-1:-3] == (99, 97)
+        # extended slice syntax always uses __getitem__()
+        assert sq[::] == "booh"
 
     def test_setslice(self):
         class Sq(object):



More information about the Pypy-commit mailing list