@@ -9,11 +9,9 @@ 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 ( ) ;
1312 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.
13+ let arg_ptrs: Vec < _ > = args. iter ( ) . map ( |arg| ArgPtr :: new ( & * arg. bytes ) ) . collect ( ) ;
14+ // SAFETY: Caller upholds that the function is safe to call.
1715 unsafe { cif. call ( fun, & arg_ptrs) }
1816}
1917
@@ -31,16 +29,4 @@ impl OwnedArg {
3129 pub fn new ( ty : FfiType , bytes : Box < [ u8 ] > ) -> Self {
3230 Self { ty : Some ( ty) , bytes }
3331 }
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- }
4632}
0 commit comments