[pypy-svn] r77159 - in pypy/branch/jitffi/pypy: jit/codewriter rlib rlib/test

antocuni at codespeak.net antocuni at codespeak.net
Fri Sep 17 17:49:53 CEST 2010


Author: antocuni
Date: Fri Sep 17 17:49:51 2010
New Revision: 77159

Modified:
   pypy/branch/jitffi/pypy/jit/codewriter/support.py
   pypy/branch/jitffi/pypy/rlib/libffi.py
   pypy/branch/jitffi/pypy/rlib/test/test_libffi.py
Log:
add an oopspec to FuncPtr.{push_arg,call}, so that the jit can recognize it


Modified: pypy/branch/jitffi/pypy/jit/codewriter/support.py
==============================================================================
--- pypy/branch/jitffi/pypy/jit/codewriter/support.py	(original)
+++ pypy/branch/jitffi/pypy/jit/codewriter/support.py	Fri Sep 17 17:49:51 2010
@@ -8,6 +8,7 @@
 from pypy.rpython.ootypesystem import rdict as oo_rdict
 from pypy.rpython.llinterp import LLInterpreter
 from pypy.rpython.extregistry import ExtRegistryEntry
+from pypy.rpython.annlowlevel import cast_base_ptr_to_instance
 from pypy.translator.simplify import get_funcobj
 from pypy.translator.unsimplify import split_block
 from pypy.objspace.flow.model import Constant
@@ -217,6 +218,21 @@
     else:
         return x
 
+
+# libffi support
+# --------------
+
+def _ll_2_libffi_push_arg(llfunc, value):
+    from pypy.rlib.libffi import FuncPtr
+    func = cast_base_ptr_to_instance(FuncPtr, llfunc)
+    return func.push_arg(value)
+
+def _ll_2_libffi_call(llfunc, RES_TP):
+    from pypy.rlib.libffi import FuncPtr
+    func = cast_base_ptr_to_instance(FuncPtr, llfunc)
+    return func.call(lltype.Float) # XXX: should be RES_TP, but it doesn't work
+
+
 # in the following calls to builtins, the JIT is allowed to look inside:
 inline_calls_to = [
     ('int_floordiv_ovf_zer', [lltype.Signed, lltype.Signed], lltype.Signed),

Modified: pypy/branch/jitffi/pypy/rlib/libffi.py
==============================================================================
--- pypy/branch/jitffi/pypy/rlib/libffi.py	(original)
+++ pypy/branch/jitffi/pypy/rlib/libffi.py	Fri Sep 17 17:49:51 2010
@@ -511,6 +511,7 @@
                            self.ll_args[self.pushed_args])
         self.pushed_args += 1
     push_arg._annspecialcase_ = 'specialize:argtype(1)'
+    push_arg.oopspec = 'libffi_push_arg(self, value)'
 
     def _check_args(self):
         if self.pushed_args < self.argnum:
@@ -533,6 +534,7 @@
         check_fficall_result(ffires, self.flags)
         return res
     call._annspecialcase_ = 'specialize:arg(1)'
+    call.oopspec = 'libffi_call(self, RES_TP)'
 
     def __del__(self):
         if self.ll_args:

Modified: pypy/branch/jitffi/pypy/rlib/test/test_libffi.py
==============================================================================
--- pypy/branch/jitffi/pypy/rlib/test/test_libffi.py	(original)
+++ pypy/branch/jitffi/pypy/rlib/test/test_libffi.py	Fri Sep 17 17:49:51 2010
@@ -18,6 +18,15 @@
         ffistruct = globals()[name]
         rffi.cast(rffi.VOIDP, ffistruct)
 
+def get_libm_name(platform):
+    if platform == 'win32':
+        return 'msvcrt.dll'
+    elif platform == "darwin":
+        return 'libm.dylib'
+    else:
+        return 'libm.so'
+
+
 class TestLibffi:
     def setup_method(self, meth):
         ALLOCATED.clear()
@@ -26,12 +35,7 @@
         return CDLL(get_libc_name())
     
     def get_libm(self):
-        if sys.platform == 'win32':
-            return CDLL('msvcrt.dll')
-        elif sys.platform == "darwin":
-            return CDLL('libm.dylib')
-        else:
-            return CDLL('libm.so')
+        return CDLL(get_libm_name(sys.platform))
     
     def test_library_open(self):
         lib = self.get_libc()



More information about the Pypy-commit mailing list