URI:
       tentrypoint.rs - wasm-runtime - A wasm runtime
  HTML git clone https://git.parazyd.org/wasm-runtime
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tentrypoint.rs (1768B)
       ---
            1 use std::{mem::size_of, slice::from_raw_parts};
            2 
            3 /// Success exit code for contract
            4 pub const SUCCESS: u64 = 0;
            5 
            6 /// This macro is used to flag the contract entrypoint function.
            7 /// All contracts must provide such a function and accept a payload.
            8 ///
            9 /// The payload is a slice of u8 prepended with a little-endian u64
           10 /// that tells the slice's length.
           11 #[macro_export]
           12 macro_rules! entrypoint {
           13     ($process_instruction:ident) => {
           14         /// # Safety
           15         #[no_mangle]
           16         pub unsafe extern "C" fn entrypoint(input: *mut u8) -> u64 {
           17             let instruction_data = $crate::entrypoint::deserialize(input);
           18 
           19             match $process_instruction(&instruction_data) {
           20                 Ok(()) => $crate::entrypoint::SUCCESS,
           21                 Err(e) => e.into(),
           22             }
           23         }
           24     };
           25 }
           26 
           27 /// Deserialize a given payload in `entrypoint`
           28 /// # Safety
           29 pub unsafe fn deserialize<'a>(input: *mut u8) -> &'a [u8] {
           30     let mut offset: usize = 0;
           31 
           32     let instruction_data_len = *(input.add(offset) as *const u64) as usize;
           33     offset += size_of::<u64>();
           34 
           35     let instruction_data = { from_raw_parts(input.add(offset), instruction_data_len) };
           36 
           37     instruction_data
           38 }
           39 
           40 /// Allocate a piece of memory in the wasm VM
           41 #[no_mangle]
           42 #[cfg(target_arch = "wasm32")]
           43 extern "C" fn __drkruntime_mem_alloc(size: usize) -> *mut u8 {
           44     let align = std::mem::align_of::<usize>();
           45 
           46     if let Ok(layout) = std::alloc::Layout::from_size_align(size, align) {
           47         unsafe {
           48             if layout.size() > 0 {
           49                 let ptr = std::alloc::alloc(layout);
           50                 if !ptr.is_null() {
           51                     return ptr
           52                 }
           53             } else {
           54                 return align as *mut u8
           55             }
           56         }
           57     }
           58 
           59     std::process::abort();
           60 }