From fd99a888c12f2d345577e35f64905bce4f29b484 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Thu, 26 Feb 2009 11:41:15 +0100 Subject: [PATCH] function type casting patch for c-imported/exported functions and ISO C (by Lisandro) --- Cython/Compiler/ModuleNode.py | 36 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index d24dc489..fa1695eb 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -201,7 +201,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): for entry in api_funcs: sig = entry.type.signature_string() h_code.putln( - 'if (__Pyx_ImportFunction(module, "%s", (void**)&%s, "%s") < 0) goto bad;' % ( + 'if (__Pyx_ImportFunction(module, "%s", (void (**)(void))&%s, "%s") < 0) goto bad;' % ( entry.name, entry.cname, sig)) @@ -1800,7 +1800,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): if entry.api or entry.defined_in_pxd: env.use_utility_code(function_export_utility_code) signature = entry.type.signature_string() - code.putln('if (__Pyx_ExportFunction("%s", (void*)%s, "%s") < 0) %s' % ( + code.putln('if (__Pyx_ExportFunction("%s", (void (*)(void))%s, "%s") < 0) %s' % ( entry.name, entry.cname, signature, @@ -1832,7 +1832,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): code.error_goto(self.pos))) for entry in entries: code.putln( - 'if (__Pyx_ImportFunction(%s, "%s", (void**)&%s, "%s") < 0) %s' % ( + 'if (__Pyx_ImportFunction(%s, "%s", (void (**)(void))&%s, "%s") < 0) %s' % ( temp, entry.name, entry.cname, @@ -2101,17 +2101,18 @@ bad: function_export_utility_code = UtilityCode( proto = """ -static int __Pyx_ExportFunction(const char *name, void *f, const char *sig); /*proto*/ +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/ """, impl = r""" -static int __Pyx_ExportFunction(const char *name, void *f, const char *sig) { +static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { #if PY_VERSION_HEX < 0x02050000 char *api = (char *)"%(API)s"; #else const char *api = "%(API)s"; #endif PyObject *d = 0; - PyObject *p = 0; + PyObject *cobj = 0; + void *p = 0; d = PyObject_GetAttrString(%(MODULE)s, api); if (!d) { @@ -2123,16 +2124,17 @@ static int __Pyx_ExportFunction(const char *name, void *f, const char *sig) { if (PyModule_AddObject(%(MODULE)s, api, d) < 0) goto bad; } - p = PyCObject_FromVoidPtrAndDesc(f, (void *)sig, 0); - if (!p) + p = *(void **)&f; + cobj = PyCObject_FromVoidPtrAndDesc(p, (void *)sig, 0); + if (!cobj) goto bad; - if (PyDict_SetItemString(d, name, p) < 0) + if (PyDict_SetItemString(d, name, cobj) < 0) goto bad; - Py_DECREF(p); + Py_DECREF(cobj); Py_DECREF(d); return 0; bad: - Py_XDECREF(p); + Py_XDECREF(cobj); Py_XDECREF(d); return -1; } @@ -2143,12 +2145,12 @@ bad: function_import_utility_code = UtilityCode( proto = """ -static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void **f, const char *sig); /*proto*/ +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig); /*proto*/ """, impl = """ #ifndef __PYX_HAVE_RT_ImportFunction #define __PYX_HAVE_RT_ImportFunction -static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void **f, const char *sig) { +static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) { #if PY_VERSION_HEX < 0x02050000 char *api = (char *)"%(API)s"; #else @@ -2156,7 +2158,8 @@ static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void **f #endif PyObject *d = 0; PyObject *cobj = 0; - char *desc; + void *p = 0; + const char *desc = 0; d = PyObject_GetAttrString(module, api); if (!d) @@ -2168,7 +2171,7 @@ static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void **f PyModule_GetName(module), funcname); goto bad; } - desc = (char *)PyCObject_GetDesc(cobj); + desc = (const char *)PyCObject_GetDesc(cobj); if (!desc) goto bad; if (strcmp(desc, sig) != 0) { @@ -2177,7 +2180,8 @@ static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void **f PyModule_GetName(module), funcname, sig, desc); goto bad; } - *f = PyCObject_AsVoidPtr(cobj); + p = PyCObject_AsVoidPtr(cobj); + *f = *(void (**)(void))&p; Py_DECREF(d); return 0; bad: -- 2.26.2