Struct libffi::middle::Builder

source ·
pub struct Builder { /* private fields */ }
Expand description

Provides a builder-style API for constructing CIFs and closures.

To use a builder, first construct it using Builder::new. The default calling convention is ffi_abi_FFI_DEFAULT_ABI, and the default function type is extern "C" fn() (or in C, void(*)()). Add argument types to the function type with the Builder::arg and args methods. Set the result type with Builder::res. Change the calling convention, if necessary, with Builder::abi.

Once the builder is configured, construct a Cif with Builder::into_cif or a closure with Builder::into_closure, into_closure_mut, or into_closure_once.

Examples

use std::mem;
use std::os::raw::c_void;

use libffi::middle::*;
use libffi::low;

unsafe extern "C" fn lambda_callback<F: Fn(u64, u64) -> u64>(
    _cif: &low::ffi_cif,
    result: &mut u64,
    args: *const *const c_void,
    userdata: &F)
{
    let args: *const &u64 = mem::transmute(args);
    let arg1 = **args.offset(0);
    let arg2 = **args.offset(1);

    *result = userdata(arg1, arg2);
}

let lambda = |x: u64, y: u64| x + y;

let closure = Builder::new()
    .arg(Type::u64())
    .arg(Type::u64())
    .res(Type::u64())
    .into_closure(lambda_callback, &lambda);

unsafe {
    let fun: &unsafe extern "C" fn(u64, u64) -> u64
        = mem::transmute(closure.code_ptr());

    assert_eq!(11, fun(5, 6));
    assert_eq!(12, fun(5, 7));
}

Implementations§

source§

impl Builder

source

pub fn new() -> Self

Constructs a Builder.

source

pub fn arg(self, type_: Type) -> Self

Adds a type to the argument type list.

source

pub fn args<I>(self, types: I) -> Selfwhere I: IntoIterator<Item = Type>,

Adds several types to the argument type list.

source

pub fn res(self, type_: Type) -> Self

Sets the result type.

source

pub fn abi(self, abi: FfiAbi) -> Self

Sets the calling convention.

source

pub fn into_cif(self) -> Cif

Builds a CIF.

source

pub fn into_closure<U, R>( self, callback: Callback<U, R>, userdata: &U ) -> Closure<'_>

Builds an immutable closure.

Arguments
  • callback — the function to call when the closure is invoked
  • userdata — the pointer to pass to callback along with the arguments when the closure is called
Result

The new closure.

source

pub fn into_closure_mut<U, R>( self, callback: CallbackMut<U, R>, userdata: &mut U ) -> Closure<'_>

Builds a mutable closure.

Arguments
  • callback — the function to call when the closure is invoked
  • userdata — the pointer to pass to callback along with the arguments when the closure is called
Result

The new closure.

source

pub fn into_closure_once<U: Any, R>( self, callback: CallbackOnce<U, R>, userdata: U ) -> ClosureOnce

Builds a one-shot closure.

Arguments
  • callback — the function to call when the closure is invoked
  • userdata — the object to pass to callback along with the arguments when the closure is called
Result

The new closure.

Trait Implementations§

source§

impl Clone for Builder

source§

fn clone(&self) -> Builder

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Builder

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for Builder

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.