fix sleb serializer

This commit is contained in:
Jean-Marie 'Histausse' Mineau 2024-02-06 19:37:12 +01:00
parent e4532f9e3c
commit fcfe2dc6e9
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
5 changed files with 70 additions and 21 deletions

View file

@ -23,12 +23,10 @@ impl Sleb128 {
let mut bytes = vec![];
loop {
let byte = val as u8 & 0b0111_1111;
val /= 64;
if val == 0 || val == -1 {
val >>= 7;
if (val == 0 && (byte & 0b0100_0000) == 0) || (val == -1 && (byte & 0b0100_0000) != 0) {
bytes.push(byte);
return bytes;
} else {
val /= 2;
}
bytes.push(byte | 0b1000_0000);
}
@ -202,6 +200,7 @@ mod test {
assert_eq!(Sleb128(0).serialize_to_vec().unwrap(), vec![0x00u8]);
assert_eq!(Sleb128(1).serialize_to_vec().unwrap(), vec![0x01u8]);
assert_eq!(Sleb128(-1).serialize_to_vec().unwrap(), vec![0x7Fu8]);
assert_eq!(Sleb128(-1551).serialize_to_vec().unwrap(), vec![0xf1, 0x73]);
assert_eq!(
Sleb128(-128).serialize_to_vec().unwrap(),
vec![0x80u8, 0x7F]
@ -222,6 +221,10 @@ mod test {
Sleb128::deserialize_from_slice(&[0x7Fu8]).unwrap(),
Sleb128(-1)
);
assert_eq!(
Sleb128::deserialize_from_slice(&[0xf1, 0x73]).unwrap(),
Sleb128(-1551)
);
assert_eq!(
Sleb128::deserialize_from_slice(&[0x80u8, 0x7Fu8]).unwrap(),
Sleb128(-128)

View file

@ -44,9 +44,7 @@ impl Ord for StringDataItem {
impl PartialOrd for StringDataItem {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.data
.partial_cmp(&other.data)
.map(|ord| ord.then(self.utf16_size.cmp(&other.utf16_size)))
Some(self.cmp(other))
}
}

View file

@ -92,3 +92,42 @@ impl Serializable for DebugInfoItem {
+ self.bytecode.size(DbgBytecode::EndSequence)
}
}
#[cfg(test)]
mod test {
use super::DbgBytecode::*;
use super::*;
#[test]
fn test_debug_reserialize() {
let debug = DebugInfoItem {
line_start: Uleb128(2902),
parameter_names: vec![],
bytecode: vec![
SpecialOpcode(14),
AdvanceLine {
line_diff: Sleb128(-1551),
},
AdvancePC {
addr_diff: Uleb128(51),
},
SpecialOpcode(14),
],
};
assert_eq!(
debug,
DebugInfoItem::deserialize_from_slice(&debug.serialize_to_vec().unwrap()).unwrap()
);
}
#[test]
fn test_advance_line_reserialize() {
let advance_line = AdvanceLine {
line_diff: Sleb128(-1551),
};
assert_eq!(
advance_line,
DbgBytecode::deserialize_from_slice(&advance_line.serialize_to_vec().unwrap()).unwrap()
);
}
}