[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