[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