wasmtime_environ/
bytes.rs1use alloc::vec::Vec;
5
6pub fn write_uleb(data: &mut Vec<u8>, mut value: u64) {
8 while value >= 0x80 {
9 data.push(0x80 | (value as u8 & 0x7f));
10 value >>= 7;
11 }
12 data.push(value as u8);
13}
14
15pub fn write_sleb(data: &mut Vec<u8>, mut value: i64) {
17 loop {
18 let byte = value.cast_unsigned() as u8 & 0x7f;
19 value >>= 7;
20 let done = (value == 0 && byte & 0x40 == 0) || (value == -1 && byte & 0x40 != 0);
24 if done {
25 data.push(byte);
26 return;
27 }
28 data.push(byte | 0x80);
29 }
30}
31
32pub fn read_uleb(data: &mut &[u8]) -> Option<u64> {
35 let mut result = 0;
36 let mut shift = 0;
37 while shift < 64 {
38 let byte = pop(data)?;
39 result |= u64::from(byte & 0x7f) << shift;
40 if byte & 0x80 == 0 {
41 return Some(result);
42 }
43 shift += 7;
44 }
45 None
46}
47
48pub fn read_sleb(data: &mut &[u8]) -> Option<i64> {
51 let mut result = 0;
52 let mut shift = 0;
53 while shift < 64 {
54 let byte = pop(data)?;
55 result |= i64::from(byte & 0x7f) << shift;
56 shift += 7;
57 if byte & 0x80 == 0 {
58 if shift < 64 && byte & 0x40 != 0 {
60 result |= -1 << shift;
61 }
62 return Some(result);
63 }
64 }
65 None
66}
67
68pub fn pop(data: &mut &[u8]) -> Option<u8> {
71 let (&byte, rest) = data.split_first()?;
72 *data = rest;
73 Some(byte)
74}