[pypy-commit] pypy list-strategies: Removed old rangelist implementation

l.diekmann noreply at buildbot.pypy.org
Fri Sep 23 13:12:44 CEST 2011


Author: Lukas Diekmann <lukas.diekmann at uni-duesseldorf.de>
Branch: list-strategies
Changeset: r47478:4fe6b0555b56
Date: 2011-03-17 11:47 +0100
http://bitbucket.org/pypy/pypy/changeset/4fe6b0555b56/

Log:	Removed old rangelist implementation

diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -349,7 +349,7 @@
         config.objspace.opcodes.suggest(CALL_LIKELY_BUILTIN=True)
     if level in ['2', '3', 'jit']:
         config.objspace.opcodes.suggest(CALL_METHOD=True)
-        config.objspace.std.suggest(withrangelist=False)
+        config.objspace.std.suggest(withrangelist=True)
         config.objspace.std.suggest(withmethodcache=True)
         config.objspace.std.suggest(withprebuiltchar=True)
         config.objspace.std.suggest(builtinshortcut=True)
@@ -368,7 +368,7 @@
     # memory-saving optimizations
     if level == 'mem':
         config.objspace.std.suggest(withprebuiltint=True)
-        config.objspace.std.suggest(withrangelist=False)
+        config.objspace.std.suggest(withrangelist=True)
         config.objspace.std.suggest(withprebuiltchar=True)
         config.objspace.std.suggest(withmapdict=True)
         config.objspace.std.suggest(withstrslice=True)
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -69,7 +69,7 @@
 
     def __repr__(w_self):
         """ representation for debugging purposes """
-        return "%s(%s, %s)" % (w_self.__class__.__name__, w_self.strategy, w_self.storage._content)
+        return "%s(%s, %s)" % (w_self.__class__.__name__, w_self.strategy, w_self.storage._x)
 
     def unwrap(w_list, space):
         # for tests only!
diff --git a/pypy/objspace/std/model.py b/pypy/objspace/std/model.py
--- a/pypy/objspace/std/model.py
+++ b/pypy/objspace/std/model.py
@@ -25,8 +25,6 @@
                         "ropeobject.W_RopeIterObject"],
     "withropeunicode": ["ropeunicodeobject.W_RopeUnicodeObject",
                         "ropeunicodeobject.W_RopeUnicodeIterObject"],
-    "withrangelist"  : ["rangeobject.W_RangeListObject",
-                        "rangeobject.W_RangeIterObject"],
     "withtproxy" : ["proxyobject.W_TransparentList",
                     "proxyobject.W_TransparentDict"],
 }
@@ -90,7 +88,6 @@
         from pypy.objspace.std import iterobject
         from pypy.objspace.std import unicodeobject
         from pypy.objspace.std import dictproxyobject
-        from pypy.objspace.std import rangeobject
         from pypy.objspace.std import proxyobject
         from pypy.objspace.std import fake
         import pypy.objspace.std.default # register a few catch-all multimethods
@@ -252,11 +249,6 @@
                 (unicodeobject.W_UnicodeObject,
                                        strbufobject.delegate_buf2unicode)
                 ]
-        if config.objspace.std.withrangelist:
-            self.typeorder[rangeobject.W_RangeListObject] += [
-                (listobject.W_ListObject,
-                                       rangeobject.delegate_range2list),
-                ]
         if config.objspace.std.withsmalltuple:
             self.typeorder[smalltupleobject.W_SmallTupleObject] += [
                 (tupleobject.W_TupleObject, smalltupleobject.delegate_SmallTuple2Tuple)]
diff --git a/pypy/objspace/std/rangeobject.py b/pypy/objspace/std/rangeobject.py
deleted file mode 100644
--- a/pypy/objspace/std/rangeobject.py
+++ /dev/null
@@ -1,233 +0,0 @@
-from pypy.interpreter.error import OperationError
-from pypy.objspace.std.model import registerimplementation, W_Object
-from pypy.objspace.std.register_all import register_all
-from pypy.objspace.std.multimethod import FailedToImplement
-from pypy.objspace.std.noneobject import W_NoneObject
-from pypy.objspace.std.inttype import wrapint
-from pypy.objspace.std.sliceobject import W_SliceObject, normalize_simple_slice
-from pypy.objspace.std.listobject import W_ListObject
-from pypy.objspace.std import listtype, iterobject, slicetype
-from pypy.interpreter import gateway, baseobjspace
-
-def length(start, stop, step):
-    if step > 0:
-        if stop <= start:
-            return 0
-        return (stop - start + step - 1)/step
-
-    else:  # step must be < 0
-        if stop >= start:
-            return 0
-        return (start - stop - step  - 1)/-step
-
-
-class W_RangeListObject(W_Object):
-    typedef = listtype.list_typedef
-    
-    def __init__(w_self, start, step, length):
-        assert step != 0
-        w_self.start = start
-        w_self.step = step
-        w_self.length = length
-        w_self.w_list = None
-
-    def force(w_self, space):
-        if w_self.w_list is not None:
-            return w_self.w_list
-        start = w_self.start
-        step = w_self.step
-        length = w_self.length
-        if not length:
-            w_self.w_list = space.newlist([])
-            return w_self.w_list
-        
-        arr = [None] * length  # this is to avoid using append.
-
-        i = start
-        n = 0
-        while n < length:
-            arr[n] = wrapint(space, i)
-            i += step
-            n += 1
-
-        w_self.w_list = space.newlist(arr)
-        return w_self.w_list
-
-    def getitem(w_self, i):
-        if i < 0:
-            i += w_self.length
-            if i < 0:
-                raise IndexError
-        elif i >= w_self.length:
-            raise IndexError
-        return w_self.start + i * w_self.step
-
-    def getitem_unchecked(w_self, i):
-        # bounds not checked, on purpose
-        return w_self.start + i * w_self.step
-
-    def __repr__(w_self):
-        if w_self.w_list is None:
-            return "W_RangeListObject(%s, %s, %s)" % (
-                w_self.start, w_self.step, w_self.length)
-        else:
-            return "W_RangeListObject(%r)" % (w_self.w_list, )
-
-def delegate_range2list(space, w_rangelist):
-    return w_rangelist.force(space)
-
-def len__RangeList(space, w_rangelist):
-    if w_rangelist.w_list is not None:
-        return space.len(w_rangelist.w_list)
-    return wrapint(space, w_rangelist.length)
-
-
-def getitem__RangeList_ANY(space, w_rangelist, w_index):
-    if w_rangelist.w_list is not None:
-        return space.getitem(w_rangelist.w_list, w_index)
-    idx = space.getindex_w(w_index, space.w_IndexError, "list index")
-    try:
-        return wrapint(space, w_rangelist.getitem(idx))
-    except IndexError:
-        raise OperationError(space.w_IndexError,
-                             space.wrap("list index out of range"))
-
-def getitem__RangeList_Slice(space, w_rangelist, w_slice):
-    if w_rangelist.w_list is not None:
-        return space.getitem(w_rangelist.w_list, w_slice)
-    length = w_rangelist.length
-    start, stop, step, slicelength = w_slice.indices4(space, length)
-    assert slicelength >= 0
-    rangestart = w_rangelist.getitem_unchecked(start)
-    rangestep = w_rangelist.step * step
-    return W_RangeListObject(rangestart, rangestep, slicelength)
-
-def getslice__RangeList_ANY_ANY(space, w_rangelist, w_start, w_stop):
-    if w_rangelist.w_list is not None:
-        return space.getslice(w_rangelist.w_list, w_start, w_stop)
-    length = w_rangelist.length
-    start, stop = normalize_simple_slice(space, length, w_start, w_stop)
-    slicelength = stop - start
-    assert slicelength >= 0
-    rangestart = w_rangelist.getitem_unchecked(start)
-    rangestep = w_rangelist.step
-    return W_RangeListObject(rangestart, rangestep, slicelength)
-
-def iter__RangeList(space, w_rangelist):
-    return W_RangeIterObject(w_rangelist)
-
-def repr__RangeList(space, w_rangelist):
-    if w_rangelist.w_list is not None:
-        return space.repr(w_rangelist.w_list)
-    if w_rangelist.length == 0:
-        return space.wrap('[]')
-    result = [''] * w_rangelist.length
-    i = w_rangelist.start
-    n = 0
-    while n < w_rangelist.length:
-        result[n] = str(i)
-        i += w_rangelist.step
-        n += 1
-    return space.wrap("[" + ", ".join(result) + "]")
-
-def inplace_add__RangeList_ANY(space, w_rangelist, w_iterable2):
-    space.inplace_add(w_rangelist.force(space), w_iterable2)
-    return w_rangelist
-
-def inplace_mul__RangeList_ANY(space, w_rangelist, w_number):
-    space.inplace_mul(w_rangelist.force(space), w_number)
-    return w_rangelist
-
-
-def list_pop__RangeList_ANY(space, w_rangelist, w_idx=-1):
-    if w_rangelist.w_list is not None:
-        raise FailedToImplement
-    length = w_rangelist.length
-    if length == 0:
-        raise OperationError(space.w_IndexError,
-                             space.wrap("pop from empty list"))
-    idx = space.int_w(w_idx)
-    if idx == 0:
-        result = w_rangelist.start
-        w_rangelist.start += w_rangelist.step
-        w_rangelist.length -= 1
-        return wrapint(space, result)
-    if idx == -1 or idx == length - 1:
-        w_rangelist.length -= 1
-        return wrapint(
-            space, w_rangelist.start + (length - 1) * w_rangelist.step)
-    if idx >= w_rangelist.length:
-        raise OperationError(space.w_IndexError,
-                             space.wrap("pop index out of range"))
-    raise FailedToImplement
-
-def list_reverse__RangeList(space, w_rangelist):
-    # probably somewhat useless, but well...
-    if w_rangelist.w_list is not None:
-        raise FailedToImplement
-    w_rangelist.start = w_rangelist.getitem_unchecked(w_rangelist.length-1)
-    w_rangelist.step = -w_rangelist.step
-
-def list_sort__RangeList_None_None_ANY(space, w_rangelist, w_cmp,
-                                       w_keyfunc, w_reverse):
-    # even more useless but fun
-    has_reverse = space.is_true(w_reverse)
-    if w_rangelist.w_list is not None:
-        raise FailedToImplement
-    if has_reverse:
-        factor = -1
-    else:
-        factor = 1
-    reverse = w_rangelist.step * factor < 0
-    if reverse:
-        w_rangelist.start = w_rangelist.getitem_unchecked(w_rangelist.length-1)
-        w_rangelist.step = -w_rangelist.step
-    return space.w_None
-
-
-class W_RangeIterObject(iterobject.W_AbstractSeqIterObject):
-    pass
-
-def iter__RangeIter(space, w_rangeiter):
-    return w_rangeiter
-
-def next__RangeIter(space, w_rangeiter):
-    w_rangelist = w_rangeiter.w_seq
-    if w_rangelist is None:
-        raise OperationError(space.w_StopIteration, space.w_None)
-    assert isinstance(w_rangelist, W_RangeListObject)
-    index = w_rangeiter.index
-    if w_rangelist.w_list is not None:
-        try:
-            w_item = space.getitem(w_rangelist.w_list,
-                                   wrapint(space, index))
-        except OperationError, e:
-            w_rangeiter.w_seq = None
-            if not e.match(space, space.w_IndexError):
-                raise
-            raise OperationError(space.w_StopIteration, space.w_None)
-    else:
-        if index >= w_rangelist.length:
-            w_rangeiter.w_seq = None
-            raise OperationError(space.w_StopIteration, space.w_None)
-        w_item = wrapint(
-            space,
-            w_rangelist.getitem_unchecked(index))
-    w_rangeiter.index = index + 1
-    return w_item
-
-# XXX __length_hint__()
-##def len__RangeIter(space,  w_rangeiter):
-##    if w_rangeiter.w_seq is None:
-##        return wrapint(space, 0)
-##    index = w_rangeiter.index
-##    w_length = space.len(w_rangeiter.w_seq)
-##    w_len = space.sub(w_length, wrapint(space, index))
-##    if space.is_true(space.lt(w_len, wrapint(space, 0))):
-##        w_len = wrapint(space, 0)
-##    return w_len
-
-registerimplementation(W_RangeListObject)
-registerimplementation(W_RangeIterObject)
-
-register_all(vars(), listtype)


More information about the pypy-commit mailing list