[pypy-commit] pypy regalloc-playground: - implement __contains__ support in rpython

cfbolz pypy.commits at gmail.com
Tue Aug 22 11:05:47 EDT 2017


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: regalloc-playground
Changeset: r92203:d8e2a043e8eb
Date: 2017-08-22 12:43 +0200
http://bitbucket.org/pypy/pypy/changeset/d8e2a043e8eb/

Log:	- implement __contains__ support in rpython
	- wrap a class around the Lifetime dict

diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -729,6 +729,10 @@
     return [get_setitem,
             op.simple_call(get_setitem.result, v_idx, v_value)]
 
+ at op.contains.register_transform(SomeInstance)
+def contains_SomeInstance(annotator, v_ins, v_idx):
+    get_contains = op.getattr(v_ins, const('__contains__'))
+    return [get_contains, op.simple_call(get_contains.result, v_idx)]
 
 class __extend__(pairtype(SomeIterator, SomeIterator)):
 
diff --git a/rpython/annotator/test/test_annrpython.py b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -4077,6 +4077,20 @@
         assert len(a.translator.graphs) == 2 # fn, __setitem__
         assert isinstance(s, annmodel.SomeInteger)
 
+    def test_instance_contains(self):
+        class A(object):
+            def __contains__(self, i):
+                return i & 1 == 0
+
+        def fn(i):
+            a = A()
+            return 0 in a and 1 not in a
+
+        a = self.RPythonAnnotator()
+        s = a.build_types(fn, [int])
+        assert len(a.translator.graphs) == 2 # fn, __contains__
+        assert isinstance(s, annmodel.SomeBool)
+
     def test_instance_getslice(self):
         class A(object):
             def __getslice__(self, stop, start):
diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -856,6 +856,22 @@
     def __repr__(self):
         return "%s:%s(%s)" % (self.definition_pos, self.real_usages, self.last_usage)
 
+class LifetimeManager(object):
+    def __init__(self, longevity):
+        self.longevity = longevity
+
+    def register_hint(self, opindex, var, register):
+        raise NotImplementedError
+
+    def __contains__(self, var):
+        return var in self.longevity
+
+    def __getitem__(self, var):
+        return self.longevity[var]
+
+    def __setitem__(self, var, val):
+        self.longevity[var] = val
+
 def compute_vars_longevity(inputargs, operations):
     # compute a dictionary that maps variables to Lifetime information
     # if a variable is not in the dictionary, it's operation is dead because
@@ -912,7 +928,7 @@
         if not we_are_translated():
             lifetime._check_invariants()
 
-    return longevity
+    return LifetimeManager(longevity)
 
 def is_comparison_or_ovf_op(opnum):
     return rop.is_comparison(opnum) or rop.is_ovf(opnum)


More information about the pypy-commit mailing list