diff --git a/crates/c-api/src/vec.rs b/crates/c-api/src/vec.rs index 1b45aeff22..77835b4150 100644 --- a/crates/c-api/src/vec.rs +++ b/crates/c-api/src/vec.rs @@ -29,7 +29,6 @@ macro_rules! declare_vecs { ))* ) => {$( #[repr(C)] - #[derive(Clone)] pub struct $name { size: usize, data: *mut $elem_ty, @@ -80,6 +79,12 @@ macro_rules! declare_vecs { } } + impl Clone for $name { + fn clone(&self) -> Self { + self.as_slice().to_vec().into() + } + } + impl From> for $name { fn from(vec: Vec<$elem_ty>) -> Self { let mut vec = vec.into_boxed_slice(); @@ -115,8 +120,8 @@ macro_rules! declare_vecs { size: usize, ptr: *const $elem_ty, ) { - let slice = slice::from_raw_parts(ptr, size); - out.set_buffer(slice.to_vec()); + let vec = (0..size).map(|i| ptr.add(i).read()).collect(); + out.set_buffer(vec); } #[no_mangle]