Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r168:c56076ff1eb2
Date: 2014-12-05 17:06 +0100
http://bitbucket.org/cffi/creflect/changeset/c56076ff1eb2/

Log:    functions returning void

diff --git a/zeffir/cfunc.c b/zeffir/cfunc.c
--- a/zeffir/cfunc.c
+++ b/zeffir/cfunc.c
@@ -115,6 +115,7 @@
     void *llargs[nargs];
     char *llbuffer;
     size_t lloffset;
+    int returns_void;
 
     actualnargs = PyTuple_Size(args);
     if (actualnargs != nargs) {
@@ -126,7 +127,8 @@
     }
 
     llbuffer = alloca(zfs->zfs_size_args);
-    lloffset = zfs->zfs_ret->ct_size;
+    returns_void = (zfs->zfs_ret->ct_flags & CT_VOID);
+    lloffset = returns_void ? 0 : zfs->zfs_ret->ct_size;
 
     for (i = 0; i < nargs; i++) {
         CTypeDescrObject *ct = zfs->zfs_args[i];
@@ -163,6 +165,10 @@
 
     zfs->zfs_trampl(llargs, llbuffer);
 
+    if (returns_void) {
+        Py_INCREF(Py_None);
+        return Py_None;
+    }
     return convert_to_object(llbuffer, zfs->zfs_ret);
 }
 
@@ -186,8 +192,8 @@
     zfs->zfs_ret = ret;
     Py_INCREF(ret);
 
-    assert(ret->ct_size >= 0);
-    size = ret->ct_size;
+    size = (ret->ct_flags & CT_VOID) ? 0 : ret->ct_size;
+    assert(size >= 0);
 
     for (i = 0; i < nargs; i++) {
         CTypeDescrObject *ct = args[i].type;
diff --git a/zeffir/test/function.crx b/zeffir/test/function.crx
--- a/zeffir/test/function.crx
+++ b/zeffir/test/function.crx
@@ -11,10 +11,18 @@
     return result;
 }
 
+void returning_nothing(char *p)
+{
+    *p++ = 'O';
+    *p++ = 'K';
+    *p++ = 0;
+}
+
 
 // CREFLECT: start
 
 int simple_function(int);
 int add_from_array(int array[], int count);
+void returning_nothing(char *);
 
 // CREFLECT: end
diff --git a/zeffir/test/test_function.py b/zeffir/test/test_function.py
--- a/zeffir/test/test_function.py
+++ b/zeffir/test/test_function.py
@@ -20,3 +20,9 @@
     res = lib.add_from_array([30, 2, 10], 3)
     assert type(res) is int
     assert res == 42
+
+def test_function_returning_nothing():
+    ffi, lib = support.compile_and_open('function')
+    p = ffi.new("char[]", 10)
+    lib.returning_nothing(p)
+    assert ffi.string(p) == "OK"
diff --git a/zeffir/test/test_global.py b/zeffir/test/test_global.py
--- a/zeffir/test/test_global.py
+++ b/zeffir/test/test_global.py
@@ -30,3 +30,5 @@
     assert lib.myglobptr is not lib.myglobptr
     assert lib.myglobptr == lib.myglobptr
     assert hash(lib.myglobptr) == hash(lib.myglobptr)
+    lib.myglobptr = ffi.NULL
+    assert lib.myglobptr == ffi.NULL
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to