[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