| Crates.io | deno-libffi |
| lib.rs | deno-libffi |
| version | 0.0.7 |
| created_at | 2021-07-09 16:29:31.338552+00 |
| updated_at | 2021-08-09 10:39:49.075566+00 |
| description | Rust bindings for libffi |
| homepage | |
| repository | https://github.com/tov/libffi-rs |
| max_upload_size | |
| id | 420796 |
| size | 94,682 |
The C libffi library provides two main facilities: assembling calls
to functions dynamically, and creating closures that can be called
as ordinary C functions. In Rust, the latter means that we can turn
a Rust lambda (or any object implementing Fn/FnMut) into an
ordinary C function pointer that we can pass as a callback to C.
Building libffi will build lifbffi-sys, which will in turn build the
libffi C library from github, which
requires that you have a working make, C compiler, automake, and
autoconf first. It’s on crates.io, so
you can add
[dependencies]
libffi = "1.0.1"
to your Cargo.toml.
This crate depends on the libffi-sys crate, which by default
attempts to build its own version of the C libffi library. In order to
use your system’s C libffi instead, enable this crate’s system
feature in your Cargo.toml:
[features]
libffi = { version = "1.0.1", features = ["system"] }
See the libffi-sys documentation for more information about how it
finds C libffi.
This crate supports Rust version 1.36 and later.
In this example, we convert a Rust lambda containing a free variable
into an ordinary C code pointer. The type of fun below is
extern "C" fn(u64, u64) -> u64.
use libffi::high::Closure2;
let x = 5u64;
let f = |y: u64, z: u64| x + y + z;
let closure = Closure2::new(&f);
let fun = closure.code_ptr();
assert_eq!(18, fun(6, 7));