[pypy-svn] r77186 - pypy/branch/jitffi/pypy/jit/metainterp/test

fijal at codespeak.net fijal at codespeak.net
Mon Sep 20 09:57:20 CEST 2010


Author: fijal
Date: Mon Sep 20 09:57:18 2010
New Revision: 77186

Added:
   pypy/branch/jitffi/pypy/jit/metainterp/test/test_direct_call.py
Log:
A functional test about optimizing ffi access.


Added: pypy/branch/jitffi/pypy/jit/metainterp/test/test_direct_call.py
==============================================================================
--- (empty file)
+++ pypy/branch/jitffi/pypy/jit/metainterp/test/test_direct_call.py	Mon Sep 20 09:57:18 2010
@@ -0,0 +1,40 @@
+
+import py
+from pypy.rlib.jit import JitDriver
+from pypy.jit.metainterp.test.test_basic import LLJitMixin
+from pypy.rlib.libffi import FuncPtr, CDLL, ffi_type_sint
+from pypy.tool.udir import udir
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+from pypy.translator.platform import platform
+from pypy.rpython.lltypesystem import lltype, rffi
+
+class TestDirectCall(LLJitMixin):
+    def setup_class(cls):
+        # prepare C code as an example, so we can load it and call
+        # it via rlib.libffi
+        c_file = udir.ensure("test_jit_direct_call", dir=1).join("xlib.c")
+        c_file.write(py.code.Source('''
+        int sum_xy(int x, int y)
+        {
+           return (x + y);
+        }
+        '''))
+        eci = ExternalCompilationInfo(export_symbols=['sum_xy'])
+        cls.lib_name = str(platform.compile([c_file], eci, 'x',
+                                            standalone=False))
+
+    def test_one(self):
+        driver = JitDriver(reds = ['n', 'fn'], greens = [])        
+
+        def f(n):
+            cdll = CDLL(self.lib_name)
+            fn = cdll.getpointer('sum_xy', [ffi_type_sint, ffi_type_sint],
+                                 ffi_type_sint)
+            while n < 10:
+                driver.jit_merge_point(n=n, fn=fn)
+                driver.can_enter_jit(n=n, fn=fn)
+                fn.push_arg(n)
+                fn.push_arg(1)
+                n = fn.call(lltype.Signed)
+            
+        self.meta_interp(f, [0])



More information about the Pypy-commit mailing list