#[derive(Debug, Default)]
pub(crate) struct BytecodeWriter {
data: Vec<u8>,
}
impl BytecodeWriter {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn into_bytes(self) -> Vec<u8> {
self.data
}
pub(crate) fn write_u8(&mut self, value: u8) {
self.data.push(value);
}
pub(crate) fn write_u32(&mut self, value: u32) {
self.data.extend_from_slice(&value.to_le_bytes());
}
pub(crate) fn write_i32(&mut self, value: i32) {
self.data.extend_from_slice(&value.to_le_bytes());
}
pub(crate) fn write_f32(&mut self, value: f32) {
self.data.extend_from_slice(&value.to_le_bytes());
}
pub(crate) fn write_f64(&mut self, value: f64) {
self.data.extend_from_slice(&value.to_le_bytes());
}
pub(crate) fn write_varint(&mut self, value: u32) {
self.write_varint64(u64::from(value));
}
pub(crate) fn write_varint64(&mut self, mut value: u64) {
loop {
let byte = (value & 0x7f) as u8;
value >>= 7;
if value == 0 {
self.write_u8(byte);
break;
}
self.write_u8(byte | 0x80);
}
}
pub(crate) fn write_integer_constant(&mut self, value: i64) {
self.write_u8(u8::from(value < 0));
if value < 0 {
self.write_varint64((!(value as u64)).wrapping_add(1));
} else {
self.write_varint64(value as u64);
}
}
pub(crate) fn write_bytes(&mut self, bytes: &[u8]) {
self.data.extend_from_slice(bytes);
}
}