pub struct Cif { /* private fields */ }
Expand description
Describes the calling convention and types for calling a function.
This is the middle layer’s wrapping of the low
and
raw
layers’ low::ffi_cif
. An initialized CIF
contains references to an array of argument types and a result type,
each of which may be allocated on the heap. Cif
manages the memory
of those referenced objects.
Construct with Cif::new
.
Examples
extern "C" fn add(x: f64, y: &f64) -> f64 {
return x + y;
}
use libffi::middle::*;
let args = vec![Type::f64(), Type::pointer()];
let cif = Cif::new(args.into_iter(), Type::f64());
let n = unsafe { cif.call(CodePtr(add as *mut _), &[arg(&5f64), arg(&&6f64)]) };
assert_eq!(11f64, n);
Implementations§
source§impl Cif
impl Cif
sourcepub fn new<I>(args: I, result: Type) -> Selfwhere
I: IntoIterator<Item = Type>,
I::IntoIter: ExactSizeIterator<Item = Type>,
pub fn new<I>(args: I, result: Type) -> Selfwhere I: IntoIterator<Item = Type>, I::IntoIter: ExactSizeIterator<Item = Type>,
Creates a new CIF for the given argument and result types.
Takes ownership of the argument and result Type
s, because
the resulting Cif
retains references to them. Defaults to
the platform’s default calling convention; this can be adjusted
using Cif::set_abi
.
sourcepub unsafe fn call<R>(&self, fun: CodePtr, args: &[Arg]) -> R
pub unsafe fn call<R>(&self, fun: CodePtr, args: &[Arg]) -> R
Calls a function with the given arguments.
In particular, this method invokes function fun
passing it
arguments args
, and returns the result.
Safety
There is no checking that the calling convention and types
in the Cif
match the actual calling convention and types of
fun
, nor that they match the types of args
.
sourcepub fn as_raw_ptr(&self) -> *mut ffi_cif
pub fn as_raw_ptr(&self) -> *mut ffi_cif
Gets a raw pointer to the underlying low::ffi_cif
.
This can be used for passing a middle::Cif
to functions from the
low
and raw
modules.