[pypy-commit] pypy remember-tracing-counts: a hackish fix

fijal noreply at buildbot.pypy.org
Mon Sep 14 12:05:03 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: remember-tracing-counts
Changeset: r79618:70f760f9ce29
Date: 2015-09-14 12:05 +0200
http://bitbucket.org/pypy/pypy/changeset/70f760f9ce29/

Log:	a hackish fix

diff --git a/rpython/jit/metainterp/test/test_jitiface.py b/rpython/jit/metainterp/test/test_jitiface.py
--- a/rpython/jit/metainterp/test/test_jitiface.py
+++ b/rpython/jit/metainterp/test/test_jitiface.py
@@ -5,7 +5,7 @@
 from rpython.jit.metainterp.test.support import LLJitMixin
 from rpython.jit.codewriter.policy import JitPolicy
 from rpython.jit.metainterp.resoperation import rop
-from rpython.rtyper.annlowlevel import hlstr
+from rpython.rtyper.annlowlevel import hlstr, cast_instance_to_gcref
 from rpython.jit.metainterp.jitprof import Profiler, EmptyProfiler
 
 
@@ -175,6 +175,32 @@
         self.meta_interp(main, [5])
         self.check_jitcell_token_count(2)
 
+    def test_get_jitcell_at_key_ptr(self):
+        driver = JitDriver(greens = ['s'], reds = ['i'], name='jit')
+
+        class Green(object):
+            pass
+
+        def loop(i, s):
+            while i > 0:
+                driver.jit_merge_point(i=i, s=s)
+                i -= 1
+
+        def main(s):
+            g1 = Green()
+            g2 = Green()
+            g1_ptr = cast_instance_to_gcref(g1)
+            g2_ptr = cast_instance_to_gcref(g2)
+            loop(10, g1)
+            assert jit_hooks.get_jitcell_at_key("jit", g1_ptr)
+            assert not jit_hooks.get_jitcell_at_key("jit", g2_ptr)
+            jit_hooks.trace_next_iteration("jit", g2_ptr)
+            loop(2, g2)
+            assert jit_hooks.get_jitcell_at_key("jit", g2_ptr)
+
+        self.meta_interp(main, [5])
+        self.check_jitcell_token_count(2)
+
     def test_dont_trace_here(self):
         driver = JitDriver(greens = ['s'], reds = ['i', 'k'], name='jit')
 
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -621,24 +621,33 @@
                                'dont_trace_here'))
         accessors = {}
 
-        def get_accessor(name, jitdriver_name, function, ARGS):
+        def get_accessor(name, jitdriver_name, function, ARGS, green_arg_spec):
             a = accessors.get((name, jitdriver_name))
             if a:
                 return a
             d = {'function': function,
-                 'cast_instance_to_gcref': cast_instance_to_gcref}
+                 'cast_instance_to_gcref': cast_instance_to_gcref,
+                 'lltype': lltype}
             arg_spec = ", ".join([("arg%d" % i) for i in range(len(ARGS))])
+            arg_converters = []
+            for i, spec in enumerate(green_arg_spec):
+                if isinstance(spec, lltype.Ptr):
+                    arg_converters.append("arg%d = lltype.cast_opaque_ptr(type%d, arg%d)" % (i, i, i))
+                    d['type%d' % i] = spec
+            convert = ";".join(arg_converters)
             if name == 'get_jitcell_at_key':
                 exec py.code.Source("""
                 def accessor(%s):
+                    %s
                     return cast_instance_to_gcref(function(%s))
-                """ % (arg_spec, arg_spec)).compile() in d
+                """ % (arg_spec, convert, arg_spec)).compile() in d
                 FUNC = lltype.Ptr(lltype.FuncType(ARGS, llmemory.GCREF))
             else:
                 exec py.code.Source("""
                 def accessor(%s):
+                    %s
                     function(%s)
-                """ % (arg_spec, arg_spec)).compile() in d
+                """ % (arg_spec, convert, arg_spec)).compile() in d
                 FUNC = lltype.Ptr(lltype.FuncType(ARGS, lltype.Void))
             func = d['accessor']
             ll_ptr = self.helper_func(FUNC, func)
@@ -656,9 +665,10 @@
                 func = JitCell.dont_trace_here
             else:
                 func = JitCell._trace_next_iteration
+            argspec = jitdrivers_by_name[jitdriver_name]._green_args_spec
             accessor = get_accessor(op.args[0].value,
                                     jitdriver_name, func,
-                                    ARGS)
+                                    ARGS, argspec)
             v_result = op.result
             c_accessor = Constant(accessor, concretetype=lltype.Void)
             newop = SpaceOperation('direct_call', [c_accessor] + op.args[2:],


More information about the pypy-commit mailing list