@@ -9,11 +9,14 @@ use libffi::middle::{Arg as ArgPtr, Cif, Type as FfiType};
99///
1010/// The safety invariants of the foreign function being called must be upheld (if any).
1111pub unsafe fn call < R : libffi:: high:: CType > ( fun : CodePtr , args : & mut [ OwnedArg ] ) -> R {
12- let arg_ptrs: Vec < _ > = args. iter ( ) . map ( |arg| arg. ptr ( ) ) . collect ( ) ;
13- let cif = Cif :: new ( args. iter_mut ( ) . map ( |arg| arg. ty . take ( ) . unwrap ( ) ) , R :: reify ( ) . into_middle ( ) ) ;
14- // SAFETY: Caller upholds that the function is safe to call, and since we
15- // were passed a slice reference we know the `OwnedArg`s won't have been
16- // dropped by this point.
12+ let mut cif_args = vec ! [ ] ;
13+ let mut arg_ptrs = vec ! [ ] ;
14+ for a in args {
15+ cif_args. push ( a. ty . take ( ) . unwrap ( ) ) ;
16+ arg_ptrs. push ( ArgPtr :: new ( & * a. bytes ) ) ;
17+ }
18+ let cif = Cif :: new ( cif_args, R :: reify ( ) . into_middle ( ) ) ;
19+ // SAFETY: Caller upholds that the function is safe to call.
1720 unsafe { cif. call ( fun, & arg_ptrs) }
1821}
1922
@@ -31,16 +34,4 @@ impl OwnedArg {
3134 pub fn new ( ty : FfiType , bytes : Box < [ u8 ] > ) -> Self {
3235 Self { ty : Some ( ty) , bytes }
3336 }
34-
35- /// Creates a libffi argument pointer pointing to this argument's bytes.
36- /// NB: Since `libffi::middle::Arg` ignores the lifetime of the reference
37- /// it's derived from, it is up to the caller to ensure the `OwnedArg` is
38- /// not dropped before unsafely calling `libffi::middle::Cif::call()`!
39- fn ptr ( & self ) -> ArgPtr {
40- // FIXME: Using `&self.bytes[0]` to reference the whole array is
41- // definitely unsound under SB, but we're waiting on
42- // https://github.com/libffi-rs/libffi-rs/commit/112a37b3b6ffb35bd75241fbcc580de40ba74a73
43- // to land in a release so that we don't need to do this.
44- ArgPtr :: new ( & self . bytes [ 0 ] )
45- }
4637}
0 commit comments