summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWayne Meissner <wmeissner@gmail.com>2012-08-05 09:04:52 +1000
committerWayne Meissner <wmeissner@gmail.com>2012-08-05 09:04:52 +1000
commit118dafa64d8cf36b6bdf3490607aded10ab73257 (patch)
tree3690b1fc7282f8be881472df205fce663cbe8aba
parent25984ef41634359213869f2757dcd85712bc580d (diff)
downloadffi-118dafa64d8cf36b6bdf3490607aded10ab73257.tar.gz
Only use ffi_prep_cif_var if it is available
-rw-r--r--ext/ffi_c/Variadic.c4
-rw-r--r--ext/ffi_c/extconf.rb1
2 files changed, 5 insertions, 0 deletions
diff --git a/ext/ffi_c/Variadic.c b/ext/ffi_c/Variadic.c
index 65b4dd6..8b18a65 100644
--- a/ext/ffi_c/Variadic.c
+++ b/ext/ffi_c/Variadic.c
@@ -219,7 +219,11 @@ variadic_invoke(VALUE self, VALUE parameterTypes, VALUE parameterValues)
if (ffiReturnType == NULL) {
rb_raise(rb_eArgError, "Invalid return type");
}
+#ifdef HAVE_FFI_PREP_CIF_VAR
ffiStatus = ffi_prep_cif_var(&cif, invoker->abi, paramCount, paramCount, ffiReturnType, ffiParamTypes);
+#else
+ ffiStatus = ffi_prep_cif(&cif, invoker->abi, paramCount, ffiReturnType, ffiParamTypes);
+#endif
switch (ffiStatus) {
case FFI_BAD_ABI:
rb_raise(rb_eArgError, "Invalid ABI specified");
diff --git a/ext/ffi_c/extconf.rb b/ext/ffi_c/extconf.rb
index 5b76074..170f81d 100644
--- a/ext/ffi_c/extconf.rb
+++ b/ext/ffi_c/extconf.rb
@@ -21,6 +21,7 @@ if !defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby"
have_func('rb_thread_blocking_region')
have_func('ruby_native_thread_p')
have_func('rb_thread_call_with_gvl')
+ have_func('ffi_prep_cif_var')
$defs << "-DHAVE_EXTCONF_H" if $defs.empty? # needed so create_header works
$defs << "-DUSE_INTERNAL_LIBFFI" unless libffi_ok