Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: guard-compatible Changeset: r86080:9e5474cdc047 Date: 2016-06-30 19:48 +0200 http://bitbucket.org/pypy/pypy/changeset/9e5474cdc047/
Log: since b116f09c4e9d we can no longer clear the last_quasi_immut_field_op in the GuardCompatibleDescr diff --git a/rpython/jit/metainterp/compatible.py b/rpython/jit/metainterp/compatible.py --- a/rpython/jit/metainterp/compatible.py +++ b/rpython/jit/metainterp/compatible.py @@ -138,7 +138,6 @@ if not qmutdescr.is_still_valid_for(self.known_valid): return None, None copied_op.setarg(2, qmutdescr.constantfieldbox) - self.last_quasi_immut_field_op = None return copied_op, QuasiimmutGetfieldAndPureCallCondition( op, qmutdescr, optimizer) diff --git a/rpython/jit/metainterp/test/test_compatible.py b/rpython/jit/metainterp/test/test_compatible.py --- a/rpython/jit/metainterp/test/test_compatible.py +++ b/rpython/jit/metainterp/test/test_compatible.py @@ -538,7 +538,6 @@ assert x < 30 self.check_trace_count(7) - def test_quasi_immutable_merge_short_preamble(self): from rpython.rlib.objectmodel import we_are_translated class C(object): @@ -614,3 +613,64 @@ self.check_resops(call_i=0) + def test_like_objects(self): + from rpython.rlib.objectmodel import we_are_translated + class Map(object): + _immutable_fields_ = ['version?'] + + def __init__(self): + self.version = Version() + self.dct = {} + + def instantiate(self): + return Obj(self) + + @jit.elidable_compatible(quasi_immut_field_name_for_second_arg='version') + def lookup_version(self, version, name): + return self.dct.get(name, -1) + + class Version(object): + pass + + class Obj(object): + def __init__(self, map): + self.map = map + + def lookup(self, name): + map = self.map + assert isinstance(map, Map) + map = jit.hint(map, promote_compatible=True) + return map.lookup_version(name) + + m1 = Map() + m1.dct['a'] = 1 + m1.dct['b'] = 2 + m2 = Map() + m2.dct['a'] = 1 + m2.dct['b'] = 2 + m2.dct['c'] = 5 + + p1 = m1.instantiate() + p2 = m2.instantiate() + + driver = jit.JitDriver(greens = [], reds = ['n', 'res', 'p']) + + def f(n, p): + res = 0 + while n > 0: + driver.jit_merge_point(n=n, p=p, res=res) + res += p.lookup('a') + res += p.lookup('c') + res += p.lookup('b') + n -= 1 + return res + + def main(x): + res = f(100, p1) + res = f(100, p2) + main(True) + main(False) + + self.meta_interp(main, [True], backendopt=True) + self.check_trace_count(2) + self.check_resops(call_i=0) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit