From 9283a4deb3609d23f3d1f18397637e2762ac7157 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 1 Aug 2014 09:40:54 -0700 Subject: [PATCH 1/2] Inline into dict lookup sometimes --- tests/utils/test_ordereddict.py | 21 +++++++++++++++++++++ topaz/utils/ordereddict.py | 3 +++ 2 files changed, 24 insertions(+) diff --git a/tests/utils/test_ordereddict.py b/tests/utils/test_ordereddict.py index 965e5c2c7..fc54abbf3 100644 --- a/tests/utils/test_ordereddict.py +++ b/tests/utils/test_ordereddict.py @@ -1,3 +1,5 @@ +from rpython.jit.metainterp.test.support import LLJitMixin +from rpython.rlib.jit import JitDriver from rpython.rtyper.test.test_llinterp import interpret from topaz.utils.ordereddict import OrderedDict @@ -328,3 +330,22 @@ def inner(arg0=-1, arg1=-1): else: raise NotImplementedError(args) setattr(cls, func.__name__, make_caller(i)) + + +class TestOrderedDictJIT(LLJitMixin): + def test_dict_virtual(self): + jd = JitDriver(greens=[], reds='auto') + + def f(n): + d = OrderedDict() + while n > 0: + jd.jit_merge_point() + if n % 10 == 0: + n -= len(d) + d = OrderedDict() + d["a"] = n + n -= 1 + return len(d) + + self.meta_interp(f, [100]) + self.check_simple_loop(call_may_force=0, call=0, new=0) diff --git a/topaz/utils/ordereddict.py b/topaz/utils/ordereddict.py index 66a30b67e..1db086e6c 100644 --- a/topaz/utils/ordereddict.py +++ b/topaz/utils/ordereddict.py @@ -3,6 +3,7 @@ from rpython.annotator import model from rpython.annotator.bookkeeper import getbookkeeper +from rpython.rlib import jit from rpython.rlib.objectmodel import hlinvoke from rpython.rlib.rarithmetic import r_uint, intmask, LONG_BIT from rpython.rtyper.extregistry import ExtRegistryEntry @@ -480,6 +481,8 @@ def ll_len(d): return d.num_items @staticmethod + @jit.look_inside_iff(lambda d, key, hash: + jit.isvirtual(d) and jit.isconstant(key)) def ll_lookup(d, key, hash): entries = d.entries mask = len(entries) - 1 From 7d965b42018182a10f95210bfce0649f4705d5a4 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 1 Aug 2014 09:42:07 -0700 Subject: [PATCH 2/2] Rename test function --- tests/utils/test_ordereddict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/test_ordereddict.py b/tests/utils/test_ordereddict.py index fc54abbf3..430f626d8 100644 --- a/tests/utils/test_ordereddict.py +++ b/tests/utils/test_ordereddict.py @@ -333,7 +333,7 @@ def inner(arg0=-1, arg1=-1): class TestOrderedDictJIT(LLJitMixin): - def test_dict_virtual(self): + def test_setitem_on_virtual(self): jd = JitDriver(greens=[], reds='auto') def f(n):