Author: Armin Rigo <ar...@tunes.org> Branch: int-float-list-strategy Changeset: r78392:a46ca0349945 Date: 2015-07-01 23:37 +0200 http://bitbucket.org/pypy/pypy/changeset/a46ca0349945/
Log: int-or-float sort() 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 @@ -1613,6 +1613,9 @@ def getitems(self, w_list): return self.unerase(w_list.lstorage) + # no sort() method here: W_ListObject.descr_sort() handles this + # case explicitly + class IntegerListStrategy(ListStrategy): import_from_mixin(AbstractUnwrappedStrategy) @@ -1800,6 +1803,17 @@ def list_is_correct_type(self, w_list): return w_list.strategy is self.space.fromcache(IntOrFloatListStrategy) + def sort(self, w_list, reverse): + l = self.unerase(w_list.lstorage) + sorter = IntOrFloatSort(l, len(l)) + # Reverse sort stability achieved by initially reversing the list, + # applying a stable forward sort, then reversing the final result. + if reverse: + l.reverse() + sorter.sort() + if reverse: + l.reverse() + class BytesListStrategy(ListStrategy): import_from_mixin(AbstractUnwrappedStrategy) @@ -1896,6 +1910,7 @@ TimSort = make_timsort_class() IntBaseTimSort = make_timsort_class() FloatBaseTimSort = make_timsort_class() +IntOrFloatBaseTimSort = make_timsort_class() StringBaseTimSort = make_timsort_class() UnicodeBaseTimSort = make_timsort_class() @@ -1926,6 +1941,19 @@ return a < b +class IntOrFloatSort(IntOrFloatBaseTimSort): + def lt(self, a, b): + if longlong2float.is_int32_from_longlong_nan(a): + fa = float(longlong2float.decode_int32_from_longlong_nan(a)) + else: + fa = longlong2float.longlong2float(a) + if longlong2float.is_int32_from_longlong_nan(b): + fb = float(longlong2float.decode_int32_from_longlong_nan(b)) + else: + fb = longlong2float.longlong2float(b) + return fa < fb + + class StringSort(StringBaseTimSort): def lt(self, a, b): return a < b diff --git a/pypy/objspace/std/test/test_liststrategies.py b/pypy/objspace/std/test/test_liststrategies.py --- a/pypy/objspace/std/test/test_liststrategies.py +++ b/pypy/objspace/std/test/test_liststrategies.py @@ -894,6 +894,17 @@ # lst = [0, 1.2]; lst[:] = [3] # lst = [0, 1.2]; lst[:] = [3.4] + def test_int_or_float_sort(self): + space = self.space + w_l = W_ListObject(space, [space.wrap(1.2), space.wrap(1), + space.wrap(1.0), space.wrap(5)]) + w_l.sort(False) + assert [(type(x), x) for x in space.unwrap(w_l)] == [ + (int, 1), (float, 1.0), (float, 1.2), (int, 5)] + w_l.sort(True) + assert [(type(x), x) for x in space.unwrap(w_l)] == [ + (int, 5), (float, 1.2), (int, 1), (float, 1.0)] + class TestW_ListStrategiesDisabled: spaceconfig = {"objspace.std.withliststrategies": False} _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit