Module deno_libffi::high[][src]

Expand description

High layer providing automatic marshalling of Rust closures as C function pointers.

The main facility here is given by the structs ClosureN, ClosureMutN, and ClosureOnceN, for natural numbers N from 0 to 12 (as of now). These represent C closures of N arguments, which can be used to turn Rust lambdas (or in generally, anything that implements Fn or FnMut) into ordinary C function pointers. For example, a Rust value of type Fn(u32, u32) -> u64 can be turned into a closure of type Closure2<u32, u32, u64> using Closure2::new. Then a C function pointer of type extern "C" fn(u32, u32) -> u64 can be borrowed from the closure and passed to C.

The above usage case eliminates much of the boilerplate involved in creating a closure as compared to the middle and low layers, but at the price of flexibility. Some flexibility can be recovered by manually constructing and configuring a CIF (e.g., a Cif2) and then creating the closure with Closure2::new_with_cif.

See the call submodule for a simple interface to dynamic calls to C functions.

Examples

Here we use ClosureMut1, which is the type for creating mutable closures of one argument. We use it to turn a Rust lambda into a C function pointer.

use deno_libffi::high::ClosureMut1;

let mut x = 0u64;
let mut f = |y: u32| { x += y as u64; x };

let closure = ClosureMut1::new(&mut f);
let counter = closure.code_ptr();

assert_eq!(5, counter(5));
assert_eq!(6, counter(1));
assert_eq!(8, counter(2));

Note that in the above example, counter is an ordinary C function pointer of type extern "C" fn(u64) -> u64.

Here’s an example using ClosureOnce3 to create a closure that owns a vector:

use deno_libffi::high::ClosureOnce3;

let v = vec![1, 2, 3, 4, 5];
let mut f = move |x: usize, y: usize, z: usize| {
    v[x] + v[y] + v[z]
};

let closure = ClosureOnce3::new(f);
let call = closure.code_ptr();

assert_eq!(12, call(2, 3, 4));

Invoking the closure a second time will panic.

Re-exports

pub use types::CType;
pub use types::Type;
pub use call::*;
pub use arity0::*;
pub use arity1::*;
pub use arity2::*;
pub use arity3::*;
pub use arity4::*;
pub use arity5::*;
pub use arity6::*;
pub use arity7::*;
pub use arity8::*;
pub use arity9::*;
pub use arity10::*;
pub use arity11::*;
pub use arity12::*;

Modules

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

CIF and closure types organized by function arity.

Simple dynamic calls.

Representations of C types for the high layer.

Constants

Type Definitions