Author: Manuel Jacob
Branch: remove-list-smm-2
Changeset: r64189:10e0cdd4ff06
Date: 2013-05-15 18:20 +0200
http://bitbucket.org/pypy/pypy/changeset/10e0cdd4ff06/
Log: Remove list comparison multi-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
@@ -126,6 +126,10 @@
from pypy.objspace.std.floatobject import W_FloatObject
return type(w_object) is W_FloatObject
+def list_unroll_condition(space, w_list1, w_list2):
+ return jit.loop_unrolling_heuristic(w_list1, w_list1.length(),
UNROLL_CUTOFF) or \
+ jit.loop_unrolling_heuristic(w_list2, w_list2.length(),
UNROLL_CUTOFF)
+
class W_ListObject(W_AbstractListObject):
def __init__(w_self, space, wrappeditems, sizehint=-1):
assert isinstance(wrappeditems, list)
@@ -338,6 +342,49 @@
if w_iterable is not None:
self.extend(w_iterable)
+ @jit.look_inside_iff(list_unroll_condition)
+ def descr_eq(self, space, w_other):
+ if not isinstance(w_other, W_ListObject):
+ return space.w_NotImplemented
+
+ # needs to be safe against eq_w() mutating the w_lists behind our back
+ if self.length() != w_other.length():
+ return space.w_False
+
+ # XXX in theory, this can be implemented more efficiently as well.
let's
+ # not care for now
+ i = 0
+ while i < self.length() and i < w_other.length():
+ if not space.eq_w(self.getitem(i), w_other.getitem(i)):
+ return space.w_False
+ i += 1
+ return space.w_True
+
+ def descr_ne(self, space, w_other):
+ return space.not_(self.descr_eq(space, w_other))
+
+ @staticmethod
+ def _make_list_comparison(name):
+ import operator
+ op = getattr(operator, name)
+
+ @jit.look_inside_iff(list_unroll_condition)
+ def compare_unwrappeditems(space, w_list1, w_list2):
+ # needs to be safe against eq_w() mutating the w_lists behind our
back
+ # Search for the first index where items are different
+ i = 0
+ # XXX in theory, this can be implemented more efficiently as well.
+ # let's not care for now
+ while i < w_list1.length() and i < w_list2.length():
+ w_item1 = w_list1.getitem(i)
+ w_item2 = w_list2.getitem(i)
+ if not space.eq_w(w_item1, w_item2):
+ return getattr(space, name)(w_item1, w_item2)
+ i += 1
+ # No more items to compare -- compare sizes
+ return space.newbool(op(w_list1.length(), w_list2.length()))
+ return func_with_new_name(compare_unwrappeditems, name + '__List_List')
+
def descr_len(self, space):
result = self.length()
return wrapint(space, result)
@@ -1514,51 +1561,6 @@
init_signature = Signature(['sequence'], None, None)
init_defaults = [None]
-def list_unroll_condition(space, w_list1, w_list2):
- return jit.loop_unrolling_heuristic(w_list1, w_list1.length(),
UNROLL_CUTOFF) or \
- jit.loop_unrolling_heuristic(w_list2, w_list2.length(),
UNROLL_CUTOFF)
-
[email protected]_inside_iff(list_unroll_condition)
-def eq__List_List(space, w_list1, w_list2):
- # needs to be safe against eq_w() mutating the w_lists behind our back
- if w_list1.length() != w_list2.length():
- return space.w_False
-
- # XXX in theory, this can be implemented more efficiently as well. let's
- # not care for now
- i = 0
- while i < w_list1.length() and i < w_list2.length():
- if not space.eq_w(w_list1.getitem(i), w_list2.getitem(i)):
- return space.w_False
- i += 1
- return space.w_True
-
-def _make_list_comparison(name):
- import operator
- op = getattr(operator, name)
-
- @jit.look_inside_iff(list_unroll_condition)
- def compare_unwrappeditems(space, w_list1, w_list2):
- # needs to be safe against eq_w() mutating the w_lists behind our back
- # Search for the first index where items are different
- i = 0
- # XXX in theory, this can be implemented more efficiently as well.
- # let's not care for now
- while i < w_list1.length() and i < w_list2.length():
- w_item1 = w_list1.getitem(i)
- w_item2 = w_list2.getitem(i)
- if not space.eq_w(w_item1, w_item2):
- return getattr(space, name)(w_item1, w_item2)
- i += 1
- # No more items to compare -- compare sizes
- return space.newbool(op(w_list1.length(), w_list2.length()))
- return func_with_new_name(compare_unwrappeditems, name + '__List_List')
-
-lt__List_List = _make_list_comparison('lt')
-le__List_List = _make_list_comparison('le')
-gt__List_List = _make_list_comparison('gt')
-ge__List_List = _make_list_comparison('ge')
-
app = applevel("""
def listrepr(currently_in_repr, l):
'The app-level part of repr().'
@@ -1688,6 +1690,13 @@
__init__ = interp2app(W_ListObject.descr_init),
__hash__ = None,
+ __eq__ = interp2app(W_ListObject.descr_eq),
+ __ne__ = interp2app(W_ListObject.descr_ne),
+ __lt__ = interp2app(W_ListObject._make_list_comparison('lt')),
+ __le__ = interp2app(W_ListObject._make_list_comparison('le')),
+ __gt__ = interp2app(W_ListObject._make_list_comparison('gt')),
+ __ge__ = interp2app(W_ListObject._make_list_comparison('ge')),
+
__len__ = interp2app(W_ListObject.descr_len),
__iter__ = interp2app(W_ListObject.descr_iter),
__contains__ = interp2app(W_ListObject.descr_contains),
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit