[pypy-svn] r77685 - in pypy/branch/jitffi/pypy: jit/backend/llgraph jit/codewriter rlib rlib/test
antocuni at codespeak.net
antocuni at codespeak.net
Thu Oct 7 17:00:26 CEST 2010
Author: antocuni
Date: Thu Oct 7 17:00:24 2010
New Revision: 77685
Modified:
pypy/branch/jitffi/pypy/jit/backend/llgraph/llimpl.py
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 support for void return value (at interp-level)
Modified: pypy/branch/jitffi/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/jitffi/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/jitffi/pypy/jit/backend/llgraph/llimpl.py Thu Oct 7 17:00:24 2010
@@ -1403,7 +1403,7 @@
kind2TYPE = {
'i': lltype.Signed,
'f': lltype.Float,
- 'r': rffi.VOIDP, # XXX this is probably wrong
+ 'v': lltype.Void,
}
def _do_call_common(f, args_in_order=None, calldescr=None):
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 Thu Oct 7 17:00:24 2010
@@ -241,6 +241,8 @@
def _ll_3_libffi_call_float(llfunc, funcsym, ll_args):
return func(llfunc)._do_call(funcsym, ll_args, rffi.DOUBLE)
+def _ll_3_libffi_call_void(llfunc, funcsym, ll_args):
+ return func(llfunc)._do_call(funcsym, ll_args, lltype.Void)
# in the following calls to builtins, the JIT is allowed to look inside:
Modified: pypy/branch/jitffi/pypy/rlib/libffi.py
==============================================================================
--- pypy/branch/jitffi/pypy/rlib/libffi.py (original)
+++ pypy/branch/jitffi/pypy/rlib/libffi.py Thu Oct 7 17:00:24 2010
@@ -162,6 +162,8 @@
res = self._do_call_int(self.funcsym, ll_args)
elif RESULT is rffi.DOUBLE:
return self._do_call_float(self.funcsym, ll_args)
+ elif RESULT is lltype.Void:
+ return self._do_call_void(self.funcsym, ll_args)
else:
raise TypeError, 'Unsupported result type: %s' % RESULT
#
@@ -201,6 +203,10 @@
def _do_call_float(self, funcsym, ll_args):
return self._do_call(funcsym, ll_args, rffi.DOUBLE)
+ @jit.oopspec('libffi_call_void(self, funcsym, ll_args)')
+ def _do_call_void(self, funcsym, ll_args):
+ return self._do_call(funcsym, ll_args, lltype.Void)
+
# ------------------------------------------------------------------------
# private methods
@@ -235,7 +241,8 @@
return res
def _free_buffers(self, ll_result, ll_args):
- lltype.free(ll_result, flavor='raw')
+ if ll_result:
+ lltype.free(ll_result, flavor='raw')
for i in range(len(self.argtypes)):
lltype.free(ll_args[i], flavor='raw')
lltype.free(ll_args, flavor='raw')
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 Thu Oct 7 17:00:24 2010
@@ -231,3 +231,21 @@
res = self.call(func, [], LONGP, init_result=null)
assert res[0] == 20
+ def test_void_result(self):
+ """
+ int dummy = 0;
+ void set_dummy(int val) { dummy = val; }
+ int get_dummy() { return dummy; }
+ """
+ libfoo = self.get_libfoo()
+ set_dummy = (libfoo, 'set_dummy', [types.sint], types.void)
+ get_dummy = (libfoo, 'get_dummy', [], types.sint)
+ #
+ res = self.call(get_dummy, [], rffi.LONG)
+ assert res == 0
+ #
+ res = self.call(set_dummy, [42], lltype.Void, init_result=None)
+ assert res is None
+ #
+ res = self.call(get_dummy, [], rffi.LONG)
+ assert res == 42
More information about the Pypy-commit
mailing list