[pypy-commit] pypy default: add a jitdriver to tuple.__contains__

fijal noreply at buildbot.pypy.org
Thu Jan 16 12:19:54 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: 
Changeset: r68696:198338979947
Date: 2014-01-16 12:09 +0100
http://bitbucket.org/pypy/pypy/changeset/198338979947/

Log:	add a jitdriver to tuple.__contains__

diff --git a/pypy/objspace/std/tupleobject.py b/pypy/objspace/std/tupleobject.py
--- a/pypy/objspace/std/tupleobject.py
+++ b/pypy/objspace/std/tupleobject.py
@@ -27,6 +27,9 @@
             jit.loop_unrolling_heuristic(other, other.length(), UNROLL_CUTOFF))
 
 
+contains_jmp = jit.JitDriver(greens = [], reds = 'auto',
+                             name = 'tuple.contains')
+
 class W_AbstractTupleObject(W_Root):
     __slots__ = ()
 
@@ -119,13 +122,26 @@
     descr_gt = _make_tuple_comparison('gt')
     descr_ge = _make_tuple_comparison('ge')
 
-    @jit.look_inside_iff(lambda self, _1, _2: _unroll_condition(self))
     def descr_contains(self, space, w_obj):
+        if _unroll_condition(self):
+            return self._descr_contains_unroll_safe(space, w_obj)
+        else:
+            return self._descr_contains_jmp(space, w_obj)
+
+    @jit.unroll_safe
+    def _descr_contains_unroll_safe(self, space, w_obj):
         for w_item in self.tolist():
             if space.eq_w(w_item, w_obj):
                 return space.w_True
         return space.w_False
 
+    def _descr_contains_jmp(self, space, w_obj):
+        for w_item in self.tolist():
+            contains_jmp.jit_merge_point()
+            if space.eq_w(w_item, w_obj):
+                return space.w_True
+        return space.w_False
+
     def descr_add(self, space, w_other):
         if not isinstance(w_other, W_AbstractTupleObject):
             return space.w_NotImplemented


More information about the pypy-commit mailing list