main.rs

 1use core::slice;
 2
 3#[repr(C)]
 4pub struct Buffer {
 5    ptr: *const u8,
 6    len: usize,
 7}
 8
 9/// Allocates a buffer with an exact size.
10/// We don't return the size because it has to be passed in anyway.
11#[no_mangle]
12pub extern "C" fn __alloc_buffer(len: usize) -> *const u8 {
13    let vec = vec![0; len];
14    let buffer = unsafe { Buffer::from_vec(vec) };
15    return buffer.ptr;
16}
17
18/// Frees a given buffer, requires the size.
19#[no_mangle]
20pub extern "C" fn __free_buffer(ptr: *const u8, len: usize) {
21    let buffer = Buffer { ptr, len };
22    let vec = unsafe { buffer.to_vec() };
23    std::mem::drop(vec);
24}
25
26impl Buffer {
27    pub unsafe fn to_vec(&self) -> Vec<u8> {
28        slice::from_raw_parts(self.ptr, self.len).to_vec()
29    }
30
31    pub unsafe fn from_vec(mut vec: Vec<u8>) -> Buffer {
32        vec.shrink_to(0);
33        let ptr = vec.as_ptr();
34        let len = vec.len();
35        std::mem::forget(vec);
36        Buffer { ptr, len }
37    }
38
39    pub fn leak_to_heap(self) -> *const Buffer {
40        let boxed = Box::new(self);
41        let ptr = Box::<Buffer>::into_raw(boxed) as *const Buffer;
42        return ptr;
43    }
44}
45
46#[no_mangle]
47pub extern "C" fn banana(ptr: *const u8, len: usize) -> *const Buffer {
48    // setup
49    let buffer = Buffer { ptr, len };
50    let data = unsafe { buffer.to_vec() };
51    // operation
52    // let reversed: Vec<u8> = data.into_iter().rev().collect();
53    let number: f64 = bincode::deserialize(&data).unwrap();
54    let new_number = number * 2.0;
55    let new_data = bincode::serialize(&new_number).unwrap();
56    // teardown
57    let new_buffer = unsafe { Buffer::from_vec(new_data) };
58    return new_buffer.leak_to_heap();
59}
60
61pub fn main() -> () {
62    ()
63}