Author: Squeaky <squeaky...@gmx.com> Branch: simple-range-strategy Changeset: r69670:0fe74ad8f602 Date: 2014-03-03 20:51 +0100 http://bitbucket.org/pypy/pypy/changeset/0fe74ad8f602/
Log: finish spliting strategy methods 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 @@ -1041,6 +1041,52 @@ # tuple/int is immutable return w_list.lstorage + @jit.dont_look_inside + def getitems_fixedsize(self, w_list): + return self._getitems_range_unroll(w_list, True) + + def getitems_unroll(self, w_list): + return self._getitems_range_unroll(w_list, True) + + def getslice(self, w_list, start, stop, step, length): + self.switch_to_integer_strategy(w_list) + return w_list.getslice(start, stop, step, length) + + def append(self, w_list, w_item): + if type(w_item) is W_IntObject: + self.switch_to_integer_strategy(w_list) + else: + w_list.switch_to_object_strategy() + w_list.append(w_item) + + def inplace_mul(self, w_list, times): + self.switch_to_integer_strategy(w_list) + w_list.inplace_mul(times) + + def deleteslice(self, w_list, start, step, slicelength): + self.switch_to_integer_strategy(w_list) + w_list.deleteslice(start, step, slicelength) + + def setitem(self, w_list, index, w_item): + self.switch_to_integer_strategy(w_list) + w_list.setitem(index, w_item) + + def setslice(self, w_list, start, step, slicelength, sequence_w): + self.switch_to_integer_strategy(w_list) + w_list.setslice(start, step, slicelength, sequence_w) + + def insert(self, w_list, index, w_item): + self.switch_to_integer_strategy(w_list) + w_list.insert(index, w_item) + + def extend(self, w_list, w_any): + self.switch_to_integer_strategy(w_list) + w_list.extend(w_any) + + def reverse(self, w_list): + self.switch_to_integer_strategy(w_list) + w_list.reverse() + class SimpleRangeListStrategy(BaseRangeListStrategy): """SimpleRangeListStrategy is used when a list is created using the range @@ -1073,6 +1119,42 @@ else: raise IndexError + @specialize.arg(2) + def _getitems_range(self, w_list, wrap_items): + length = self.unerase(w_list.lstorage) + if wrap_items: + r = [None] * length + else: + r = [0] * length + i = 0 + while i < length: + if wrap_items: + r[n] = self.wrap(i) + else: + r[n] = i + i += 1 + + return r + + _getitems_range_unroll = jit.unroll_safe( + func_with_new_name(_getitems_range, "_getitems_range_unroll")) + + def pop_end(self, w_list): + length_m1 = self.unerase(w_list.lstorage) - 1 + w_result = self.wrap(length_m1) + w_list.lstorage = self.erase(length_m1) + return w_result + + def pop(self, w_list, index): + # XXX could be promoted to RangeListStrategy + self.switch_to_integer_strategy(w_list) + return w_list.pop(index) + + def sort(self, w_list, reverse): + if reverse: + self.switch_to_integer_strategy(w_list) + w_list.sort(reverse) + class RangeListStrategy(BaseRangeListStrategy): """RangeListStrategy is used when a list is created using the range method. @@ -1141,34 +1223,9 @@ return r - @jit.dont_look_inside - def getitems_fixedsize(self, w_list): - return self._getitems_range_unroll(w_list, True) - - def getitems_unroll(self, w_list): - return self._getitems_range_unroll(w_list, True) _getitems_range_unroll = jit.unroll_safe( func_with_new_name(_getitems_range, "_getitems_range_unroll")) - def getslice(self, w_list, start, stop, step, length): - self.switch_to_integer_strategy(w_list) - return w_list.getslice(start, stop, step, length) - - def append(self, w_list, w_item): - if type(w_item) is W_IntObject: - self.switch_to_integer_strategy(w_list) - else: - w_list.switch_to_object_strategy() - w_list.append(w_item) - - def inplace_mul(self, w_list, times): - self.switch_to_integer_strategy(w_list) - w_list.inplace_mul(times) - - def deleteslice(self, w_list, start, step, slicelength): - self.switch_to_integer_strategy(w_list) - w_list.deleteslice(start, step, slicelength) - def pop_end(self, w_list): start, step, length = self.unerase(w_list.lstorage) w_result = self.wrap(start + (length - 1) * step) @@ -1192,32 +1249,12 @@ self.switch_to_integer_strategy(w_list) return w_list.pop(index) - def setitem(self, w_list, index, w_item): - self.switch_to_integer_strategy(w_list) - w_list.setitem(index, w_item) - - def setslice(self, w_list, start, step, slicelength, sequence_w): - self.switch_to_integer_strategy(w_list) - w_list.setslice(start, step, slicelength, sequence_w) - def sort(self, w_list, reverse): step = self.unerase(w_list.lstorage)[1] if step > 0 and reverse or step < 0 and not reverse: self.switch_to_integer_strategy(w_list) w_list.sort(reverse) - def insert(self, w_list, index, w_item): - self.switch_to_integer_strategy(w_list) - w_list.insert(index, w_item) - - def extend(self, w_list, w_any): - self.switch_to_integer_strategy(w_list) - w_list.extend(w_any) - - def reverse(self, w_list): - self.switch_to_integer_strategy(w_list) - w_list.reverse() - class AbstractUnwrappedStrategy(object): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit