1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
extern crate codegen;
pub use codegen::entrypoint;

#[link(wasm_import_module = "_ipcs")]
extern "C" {
    pub fn _ipcs_arg_count() -> u32;
    pub fn _ipcs_arg_len(i: u32) -> u32;
    pub fn _ipcs_arg_read(i: u32, ptr: u32, offset: u32, len: u32) -> u32;
    pub fn _ipcs_ret(ptr: u32, len: u32);
}

pub fn arg_count() -> u32 {
    unsafe { _ipcs_arg_count() }
}

pub fn arg_buf(i: u32) -> Box<[u8]> {
    unsafe {
        let len = _ipcs_arg_len(i);
        let mut vec: Vec<u8> = Vec::with_capacity(len as usize);
        vec.resize(len as usize, 0);
        let read = _ipcs_arg_read(i, vec.as_ptr() as _, 0, len);
        assert!(read <= len, "Read invalid length");
        vec.into_boxed_slice()
    }
}

pub fn ret(data: &[u8]) {
    unsafe { _ipcs_ret(data.as_ptr() as u32, data.len() as u32); }
}