luau-bytecode 0.732.0

Luau bytecode model, builder, serializer, and dumper
Documentation
#[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);
    }
}