pub struct BytecodeSpan {
    /// The location of this span in the assembled bytecode.
    pub location: BytecodeLocation,
    /// The bytes which this span represents.
    pub bytes: Vec<u8>,
}


impl Default for BytecodeSpan {
    fn default() -> Self {
        Self {
            location: BytecodeLocation {
                address: 0,
                length: 0,
            },
            bytes: Vec::new(),
        }
    }
}


#[derive(Clone, Copy)]
pub struct BytecodeLocation {
    // Address of the first byte.
    pub address: usize,
    // Length as a number of bytes.
    pub length: usize,
}


impl std::fmt::Display for BytecodeLocation {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
        write!(f, "0x{:>04x}", self.address)?;
        if self.length > 0 {
            write!(f, "-0x{:>04x}", self.address + self.length)?;
        }
        Ok(())
    }
}