[pypy-commit] pypy ffi-backend: More tests
arigo
noreply at buildbot.pypy.org
Fri Aug 3 12:51:18 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r56553:214a768c6103
Date: 2012-08-03 12:46 +0200
http://bitbucket.org/pypy/pypy/changeset/214a768c6103/
Log: More tests
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -63,7 +63,8 @@
FLOAT_ARRAY_TP = lltype.Ptr(lltype.Array(lltype.Float, hints={"nolength": True}))
def maybe_uncast(TP, array):
- if array._TYPE.TO._hints.get("uncast_on_llgraph"):
+ if array._TYPE.TO.OF != lltype.Float:
+ # array._TYPE.TO._hints.get("uncast_on_llgraph"):
array = rffi.cast(TP, array)
return array
diff --git a/pypy/jit/metainterp/test/test_fficall.py b/pypy/jit/metainterp/test/test_fficall.py
--- a/pypy/jit/metainterp/test/test_fficall.py
+++ b/pypy/jit/metainterp/test/test_fficall.py
@@ -3,6 +3,7 @@
from pypy.jit.metainterp.test.support import LLJitMixin
from pypy.rlib import jit
from pypy.rlib.jit_libffi import types, CIF_DESCRIPTION, FFI_TYPE_PP
+from pypy.rlib.unroll import unrolling_iterable
def get_description(atypes, rtype):
@@ -17,48 +18,79 @@
p.atypes[i] = atypes[i]
return p
- at jit.oopspec("libffi_call(cif_description, func_addr, exchange_buffer)")
-def fake_call(cif_description, func_addr, exchange_buffer):
- assert rffi.cast(rffi.SIGNEDP, exchange_buffer)[0] == 456
- assert rffi.cast(rffi.SIGNEDP, exchange_buffer)[1] == 789
- rffi.cast(rffi.SIGNEDP, exchange_buffer)[2] = -42
-
class FfiCallTests(object):
- def test_call_simple(self):
- cif_description = get_description([types.signed]*2, types.signed)
+ def _run(self, atypes, rtype, avalues, rvalue):
+ cif_description = get_description(atypes, rtype)
- def verify(x, y):
- assert x == 456
- assert y == 789
- return -42
- FUNC = lltype.FuncType([lltype.Signed]*2, lltype.Signed)
+ def verify(*args):
+ assert args == tuple(avalues)
+ return rvalue
+ FUNC = lltype.FuncType([lltype.typeOf(avalue) for avalue in avalues],
+ lltype.typeOf(rvalue))
func = lltype.functionptr(FUNC, 'verify', _callable=verify)
func_addr = rffi.cast(rffi.VOIDP, func)
- SIZE_SIGNED = rffi.sizeof(rffi.SIGNED)
- cif_description.exchange_args[1] = SIZE_SIGNED
- cif_description.exchange_result = 2 * SIZE_SIGNED
+ for i in range(len(avalues)):
+ cif_description.exchange_args[i] = (i+1) * 16
+ cif_description.exchange_result = (len(avalues)+1) * 16
- def f(n, m):
- exbuf = lltype.malloc(rffi.CCHARP.TO, 24, flavor='raw', zero=True)
- rffi.cast(rffi.SIGNEDP, exbuf)[0] = n
- data = rffi.ptradd(exbuf, SIZE_SIGNED)
- rffi.cast(rffi.SIGNEDP, data)[0] = m
+ unroll_avalues = unrolling_iterable(avalues)
+
+ @jit.oopspec("libffi_call(cif_description,func_addr,exchange_buffer)")
+ def fake_call(cif_description, func_addr, exchange_buffer):
+ ofs = 16
+ for avalue in unroll_avalues:
+ TYPE = rffi.CArray(lltype.typeOf(avalue))
+ data = rffi.ptradd(exchange_buffer, ofs)
+ assert rffi.cast(lltype.Ptr(TYPE), data)[0] == avalue
+ ofs += 16
+ if rvalue is not None:
+ TYPE = rffi.CArray(lltype.typeOf(rvalue))
+ data = rffi.ptradd(exchange_buffer, ofs)
+ rffi.cast(lltype.Ptr(TYPE), data)[0] = rvalue
+
+ def f():
+ exbuf = lltype.malloc(rffi.CCHARP.TO, (len(avalues)+2) * 16,
+ flavor='raw', zero=True)
+ ofs = 16
+ for avalue in unroll_avalues:
+ TYPE = rffi.CArray(lltype.typeOf(avalue))
+ data = rffi.ptradd(exbuf, ofs)
+ rffi.cast(lltype.Ptr(TYPE), data)[0] = avalue
+ ofs += 16
+
fake_call(cif_description, func_addr, exbuf)
- data = rffi.ptradd(exbuf, 2 * SIZE_SIGNED)
- res = rffi.cast(rffi.SIGNEDP, data)[0]
+
+ if rvalue is None:
+ res = None
+ else:
+ TYPE = rffi.CArray(lltype.typeOf(rvalue))
+ data = rffi.ptradd(exbuf, ofs)
+ res = rffi.cast(lltype.Ptr(TYPE), data)[0]
lltype.free(exbuf, flavor='raw')
return res
- res = f(456, 789)
- assert res == -42
- res = self.interp_operations(f, [456, 789])
- assert res == -42
+ res = f()
+ assert res == rvalue
+ res = self.interp_operations(f, [])
+ assert res == rvalue
self.check_operations_history(call_may_force=0,
call_release_gil=1)
+ def test_simple_call(self):
+ self._run([types.signed] * 2, types.signed, [456, 789], -42)
+
+ def test_many_arguments(self):
+ for i in [0, 6, 20]:
+ self._run([types.signed] * i, types.signed,
+ [-123456*j for j in range(i)],
+ -42434445)
+
+ def test_simple_call_float(self):
+ self._run([types.double] * 2, types.double, [45.6, 78.9], -4.2)
+
class TestFfiCall(FfiCallTests, LLJitMixin):
pass
More information about the pypy-commit
mailing list