diff options
-rw-r--r-- | c/_cffi_backend.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c index d2dc76c..5e1ebe9 100644 --- a/c/_cffi_backend.c +++ b/c/_cffi_backend.c @@ -60,6 +60,13 @@ # endif #endif +/* Convert from closure pointer to function pointer. */ +#if defined(__hppa__) && !defined(__LP64__) +#define CFFI_FN(f) ((void (*)(void))((unsigned int)(f) | 2)) +#else +#define CFFI_FN(f) ((void (*)(void))f) +#endif + /* Define the following macro ONLY if you trust libffi's version of * ffi_closure_alloc() more than the code in malloc_closure.h. @@ -3191,7 +3198,7 @@ cdata_call(CDataObject *cd, PyObject *args, PyObject *kwds) Py_BEGIN_ALLOW_THREADS restore_errno(); - ffi_call(&cif_descr->cif, (void (*)(void))(cd->c_data), + ffi_call(&cif_descr->cif, (void (*)(void)) CFFI_FN(cd->c_data), resultdata, buffer_array); save_errno(); Py_END_ALLOW_THREADS @@ -6394,7 +6401,7 @@ static PyObject *b_callback(PyObject *self, PyObject *args) goto error; Py_INCREF(ct); cd->head.c_type = ct; - cd->head.c_data = (char *)closure_exec; + cd->head.c_data = (char *)CFFI_FN(closure_exec); cd->head.c_weakreflist = NULL; closure->user_data = NULL; cd->closure = closure; |