gear
gear copied to clipboard
Provide proc-macro to make the signatures of the host functions human readable
Problem to Solve
now we're declaring host functions like
pub fn send(ctx: &mut Runtime<E>, args: &[Value]) -> SyscallOutput {
let mut args = args.iter();
let program_id_ptr = pop_i32(&mut args)?;
let payload_ptr = pop_i32(&mut args)?;
let payload_len = pop_i32(&mut args)?;
let value_ptr = pop_i32(&mut args)?;
let message_id_ptr = pop_i32(&mut args)?;
// ...
let dest: ProgramId = funcs::get_bytes32(memory, program_id_ptr)?.into();
let payload = funcs::get_vec(memory, payload_ptr, payload_len)?;
let value = funcs::get_u128(memory, value_ptr)?;
// ...
}
https://github.com/gear-tech/gear/blob/master/core-backend/sandbox/src/funcs.rs
Possible Solution
could be like
#[host_func]
pub fn send(program_id: ProgramId, payload: Vec<u8>, gas_limit: i64, value: u128, message_id: i32) {
...
}
Notes
token stream mapping
| type | ptr | len | parsing |
|---|---|---|---|
i32 |
name_i32 |
None |
None |
i64 |
name_i64 |
None |
None |
u128 |
name_ptr_i32 |
None |
Some(#funcs::get_u128(name_ptr_i32, name)) |
[u8] |
name_ptr_i32 |
Some(name_len_i32) |
Some(#funcs::get_vec(name_ptr_i32, name_len_i32)) |
struct |
name_ptr_i32 |
Some(name_len_i32) |
Some(#funcs::decode::<#type>(name_ptr_i32, name_len_i32)) |
references
https://webassembly.github.io/spec/core/syntax/types.html#number-types