[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