[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