[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