Next Generation WASM Microkernel Operating System
at trap_handler 96 lines 2.1 kB view raw
1use alloc::boxed::Box; 2use alloc::vec::Vec; 3 4pub(crate) trait Encode { 5 fn encode(&self, e: &mut Vec<u8>); 6} 7 8impl<T: Encode + ?Sized> Encode for &'_ T { 9 fn encode(&self, e: &mut Vec<u8>) { 10 T::encode(self, e) 11 } 12} 13 14impl<T: Encode + ?Sized> Encode for Box<T> { 15 fn encode(&self, e: &mut Vec<u8>) { 16 T::encode(self, e) 17 } 18} 19 20impl<T: Encode> Encode for [T] { 21 fn encode(&self, e: &mut Vec<u8>) { 22 self.len().encode(e); 23 for item in self { 24 item.encode(e); 25 } 26 } 27} 28 29impl<T: Encode> Encode for Vec<T> { 30 fn encode(&self, e: &mut Vec<u8>) { 31 <[T]>::encode(self, e) 32 } 33} 34 35impl Encode for str { 36 fn encode(&self, e: &mut Vec<u8>) { 37 self.len().encode(e); 38 e.extend_from_slice(self.as_bytes()); 39 } 40} 41 42impl Encode for usize { 43 fn encode(&self, e: &mut Vec<u8>) { 44 assert!(*self <= u32::MAX as usize); 45 (*self as u32).encode(e) 46 } 47} 48 49impl Encode for u8 { 50 fn encode(&self, e: &mut Vec<u8>) { 51 e.push(*self); 52 } 53} 54 55impl Encode for u32 { 56 fn encode(&self, e: &mut Vec<u8>) { 57 let (value, pos) = leb128fmt::encode_u32(*self).unwrap(); 58 e.extend_from_slice(&value[..pos]); 59 } 60} 61 62impl Encode for i32 { 63 fn encode(&self, e: &mut Vec<u8>) { 64 let (value, pos) = leb128fmt::encode_s32(*self).unwrap(); 65 e.extend_from_slice(&value[..pos]); 66 } 67} 68 69impl Encode for u64 { 70 fn encode(&self, e: &mut Vec<u8>) { 71 let (value, pos) = leb128fmt::encode_u64(*self).unwrap(); 72 e.extend_from_slice(&value[..pos]); 73 } 74} 75 76impl Encode for i64 { 77 fn encode(&self, e: &mut Vec<u8>) { 78 let (value, pos) = leb128fmt::encode_s64(*self).unwrap(); 79 e.extend_from_slice(&value[..pos]); 80 } 81} 82 83impl<T: Encode, U: Encode> Encode for (T, U) { 84 fn encode(&self, e: &mut Vec<u8>) { 85 self.0.encode(e); 86 self.1.encode(e); 87 } 88} 89 90impl<T: Encode, U: Encode, V: Encode> Encode for (T, U, V) { 91 fn encode(&self, e: &mut Vec<u8>) { 92 self.0.encode(e); 93 self.1.encode(e); 94 self.2.encode(e); 95 } 96}