From 3564134777b77d7cd959a59cca50ada207778217 Mon Sep 17 00:00:00 2001 From: Edsko de Vries Date: Wed, 29 Mar 2023 13:03:02 +0200 Subject: [PATCH] Improve external buffer API --- haskell-ffi/src/to_haskell.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/haskell-ffi/src/to_haskell.rs b/haskell-ffi/src/to_haskell.rs index f6bda64..3741806 100644 --- a/haskell-ffi/src/to_haskell.rs +++ b/haskell-ffi/src/to_haskell.rs @@ -157,19 +157,35 @@ where } } +/// Get pointer to the data held by the vector +/// +/// User code should not normally need to call this directly +/// (it is called by the Haskell function @fromExternalBorsh@). #[no_mangle] pub extern "C" fn haskell_ffi_external_ptr(vec: *mut Vec) -> *const u8 { let vec: &Vec = unsafe { &*vec }; vec.as_ptr() } +/// Get length of the data held by the vector +/// +/// User code should not normally need to call this directly +/// (it is called by the Haskell function @fromExternalBorsh@). #[no_mangle] pub extern "C" fn haskell_ffi_external_len(vec: *mut Vec) -> usize { let vec: &Vec = unsafe { &*vec }; vec.len() } +/// Free the vector +/// +/// The second argument is a pointer to the data held by the vector (see +/// `haskell_ffi_external_ptr`). It is not actually used by this function; it is +/// an argument only to match the Haskell @FinalizerEnvPtr@ type. +/// +/// User code should not normally need to call this directly +/// (it is called by the Haskell function @fromExternalBorsh@). #[no_mangle] -pub extern "C" fn haskell_ffi_external_free(vec: *mut Vec) { +pub extern "C" fn haskell_ffi_external_free(vec: *mut Vec, _ptr: *const u8) { let _vec = unsafe { Box::from_raw(vec) }; }