[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