workaround for old libffi
authorMichael Wallner <mike@php.net>
Mon, 4 Jan 2016 20:57:03 +0000 (21:57 +0100)
committerMichael Wallner <mike@php.net>
Mon, 4 Jan 2016 20:57:03 +0000 (21:57 +0100)
m4/psi.m4
src/libffi.c

index 4f09851..eecfa61 100644 (file)
--- a/m4/psi.m4
+++ b/m4/psi.m4
@@ -130,6 +130,10 @@ AC_DEFUN(PSI_CHECK_LIBFFI, [
                ], [
                ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
        ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
+       PHP_CHECK_LIBRARY(ffi, ffi_prep_cif_var, [
+               AC_DEFINE(PSI_HAVE_FFI_PREP_CIF_VAR, 1, [ ])
+       ], [
+       ], -L$psi_cv_libffi_dir/$PHP_LIBDIR)
 ])
 
 dnl PSI_COMPUTE_STR(variable, string or expression)
index f776fb7..8d41b7a 100644 (file)
@@ -283,10 +283,15 @@ static void psi_ffi_call(PSI_Context *C, decl_callinfo *decl_call, impl_vararg *
                        params[nfixedargs + i] = psi_ffi_impl_type(va->types[i]);
                        params[nfixedargs + i + ntotalargs + 1] = &va->values[i];
                }
-
+#ifdef PSI_HAVE_FFI_PREP_CIF_VAR
                rc = ffi_prep_cif_var(&signature, call->signature.abi,
                                nfixedargs, ntotalargs,
                                call->signature.rtype, (ffi_type **) params);
+#else
+               /* FIXME: test in config.m4; assume we can just call anyway */
+               rc = ffi_prep_cif(&signature, call->signature.abi, ntotalargs,
+                               call->signature.rtype, (ffi_type **) params);
+#endif
                ZEND_ASSERT(FFI_OK == rc);
                ffi_call(&signature, FFI_FN(decl_call->sym), decl_call->rval, &params[ntotalargs + 1]);
                free(params);