[pypy-commit] creflect default: Can't call a "..." function right now

arigo noreply at buildbot.pypy.org
Thu Dec 11 15:15:17 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r197:d0a4621d2df2
Date: 2014-12-11 14:15 +0000
http://bitbucket.org/cffi/creflect/changeset/d0a4621d2df2/

Log:	Can't call a "..." function right now

diff --git a/zeffir/builder.c b/zeffir/builder.c
--- a/zeffir/builder.c
+++ b/zeffir/builder.c
@@ -805,6 +805,10 @@
     if (PyErr_Occurred())
         return;
 
+    if (type->ct_flags & CT_FUNCTION) {
+        type = zef_get_pointer_type(cb, type, quals);
+    }
+
     PyObject *l_dict = ((zeffir_builder_t *)cb)->l_dict;
 
     PyObject *x = make_global_var(type, addr);
diff --git a/zeffir/cfunc.c b/zeffir/cfunc.c
--- a/zeffir/cfunc.c
+++ b/zeffir/cfunc.c
@@ -205,8 +205,11 @@
 
     zfs = (ZefFuncSupportObject *)ct->ct_stuff;
     if (zfs->zfs_trampl == NULL) {
-        PyErr_SetString(ZefError, "cdata '%s' cannot be called, because no "
-                        "wrapper was generated for functions of this type ");
+        const char *extra = (zfs->zfs_dotdotdot ?
+                             " (because signature ends in '...')" : "");
+        PyErr_Format(ZefError, "cdata '%s' cannot be called, because no "
+                     "wrapper was generated for functions of this type%s",
+                     ct->ct_name, extra);
         return NULL;
     }
 
diff --git a/zeffir/test/function.crx b/zeffir/test/function.crx
--- a/zeffir/test/function.crx
+++ b/zeffir/test/function.crx
@@ -18,11 +18,16 @@
     *p++ = 0;
 }
 
+void cant_call_dotdotdot(int x, ...)
+{
+}
+
 
 // CREFLECT: start
 
 int simple_function(int);
 int add_from_array(int array[], int count);
 void returning_nothing(char *);
+void cant_call_dotdotdot(int x, ...);
 
 // 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
@@ -40,3 +40,12 @@
     assert str(e.value) == ("typeof(lib.func) not supported: the "
                             "exact type of functions is unknown (declare that "
                             "function as a function pointer instead)")
+
+def test_cant_call_dotdotdot():
+    ffi, lib = support.compile_and_open('function')
+    p = lib.cant_call_dotdotdot
+    assert ffi.typeof(p) == ffi.typeof("void(*)(int, ...)")
+    e = py.test.raises(ffi.error, p, 5)
+    assert str(e.value) == ("cdata 'void(int, ...)' cannot be called, because "
+                            "no wrapper was generated for functions of this "
+                            "type (because signature ends in '...')")


More information about the pypy-commit mailing list