Author: Lukas Diekmann <lukas.diekm...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit