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