[pypy-svn] r68037 - in pypy/trunk/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Wed Sep 30 16:35:36 CEST 2009
Author: arigo
Date: Wed Sep 30 16:35:33 2009
New Revision: 68037
Added:
pypy/trunk/pypy/jit/metainterp/test/test_blackhole.py (contents, props changed)
Modified:
pypy/trunk/pypy/jit/metainterp/pyjitpl.py
Log:
Argh, indirect calls where not falling back to perform_call(), and so
even a blackholing interpreter would always follow the call itself
instead of just calling the function.
Modified: pypy/trunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/trunk/pypy/jit/metainterp/pyjitpl.py Wed Sep 30 16:35:33 2009
@@ -661,9 +661,7 @@
cpu = self.metainterp.cpu
key = cpu.ts.getaddr_for_box(cpu, box)
jitcode = self.metainterp.staticdata.bytecode_for_address(key)
- f = self.metainterp.newframe(jitcode)
- f.setup_call(varargs)
- return True
+ return self.perform_call(jitcode, varargs)
@arguments("orgpc", "methdescr", "varargs")
def opimpl_oosend(self, pc, methdescr, varargs):
Added: pypy/trunk/pypy/jit/metainterp/test/test_blackhole.py
==============================================================================
--- (empty file)
+++ pypy/trunk/pypy/jit/metainterp/test/test_blackhole.py Wed Sep 30 16:35:33 2009
@@ -0,0 +1,87 @@
+from pypy.rlib.jit import JitDriver
+from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
+from pypy.jit.metainterp import pyjitpl
+
+
+class BlackholeTests(object):
+
+ def meta_interp(self, *args):
+ def counting_init(frame, metainterp, jitcode):
+ previnit(frame, metainterp, jitcode)
+ self.seen_frames.append(jitcode.name)
+ #
+ previnit = pyjitpl.MIFrame.__init__.im_func
+ try:
+ self.seen_frames = []
+ pyjitpl.MIFrame.__init__ = counting_init
+ return super(BlackholeTests, self).meta_interp(*args)
+ finally:
+ pyjitpl.MIFrame.__init__ = previnit
+
+ def test_calls_not_followed(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n'])
+ def h():
+ return 42
+ def g():
+ return h()
+ def f(n):
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n)
+ myjitdriver.jit_merge_point(n=n)
+ n -= 1
+ return g()
+ res = self.meta_interp(f, [7])
+ assert res == 42
+ assert self.seen_frames == ['f', 'f']
+
+ def test_indirect_calls_not_followed(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n'])
+ def h():
+ return 42
+ def g():
+ return h()
+ def f(n):
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n)
+ myjitdriver.jit_merge_point(n=n)
+ n -= 1
+ if n < 0:
+ call = h
+ else:
+ call = g
+ return call()
+ res = self.meta_interp(f, [7])
+ assert res == 42
+ assert self.seen_frames == ['f', 'f']
+
+ def test_oosends_not_followed(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n'])
+ class A:
+ def meth(self):
+ return 42
+ class B(A):
+ def meth(self):
+ return 45
+ class C(A):
+ def meth(self):
+ return 64
+ def f(n):
+ while n > 0:
+ myjitdriver.can_enter_jit(n=n)
+ myjitdriver.jit_merge_point(n=n)
+ n -= 1
+ if n < 0:
+ x = B()
+ else:
+ x = C()
+ return x.meth()
+ res = self.meta_interp(f, [7])
+ assert res == 64
+ assert self.seen_frames == ['f', 'f']
+
+
+class TestLLtype(BlackholeTests, LLJitMixin):
+ pass
+
+class TestOOtype(BlackholeTests, OOJitMixin):
+ pass
More information about the Pypy-commit
mailing list