(
buf: &mut W,
constant: DumpableValue<'_, D>,
)
| 775 | } |
| 776 | |
| 777 | pub fn serialize_value<W: Write, D: Dumpable>( |
| 778 | buf: &mut W, |
| 779 | constant: DumpableValue<'_, D>, |
| 780 | ) -> Result<(), D::Error> { |
| 781 | match constant { |
| 782 | DumpableValue::Integer(int) => { |
| 783 | if let Ok(val) = i32::try_from(int) { |
| 784 | buf.write_u8(Type::Int as u8); // TYPE_INT: 4-byte LE i32 |
| 785 | buf.write_u32(val as u32); |
| 786 | } else { |
| 787 | buf.write_u8(Type::Long as u8); |
| 788 | let (sign, raw) = int.to_bytes_le(); |
| 789 | let mut digits = alloc::vec::Vec::new(); |
| 790 | let mut accum: u32 = 0; |
| 791 | let mut bits = 0u32; |
| 792 | for &byte in &raw { |
| 793 | accum |= (byte as u32) << bits; |
| 794 | bits += 8; |
| 795 | while bits >= 15 { |
| 796 | digits.push((accum & 0x7fff) as u16); |
| 797 | accum >>= 15; |
| 798 | bits -= 15; |
| 799 | } |
| 800 | } |
| 801 | if accum > 0 || digits.is_empty() { |
| 802 | digits.push(accum as u16); |
| 803 | } |
| 804 | while digits.len() > 1 && *digits.last().unwrap() == 0 { |
| 805 | digits.pop(); |
| 806 | } |
| 807 | let n = digits.len() as i32; |
| 808 | let n = if sign == Sign::Minus { -n } else { n }; |
| 809 | buf.write_u32(n as u32); |
| 810 | for d in &digits { |
| 811 | buf.write_u16(*d); |
| 812 | } |
| 813 | } |
| 814 | } |
| 815 | DumpableValue::Float(f) => { |
| 816 | buf.write_u8(Type::Float as u8); |
| 817 | buf.write_u64(f.to_bits()); |
| 818 | } |
| 819 | DumpableValue::Complex(c) => { |
| 820 | buf.write_u8(Type::Complex as u8); |
| 821 | buf.write_u64(c.re.to_bits()); |
| 822 | buf.write_u64(c.im.to_bits()); |
| 823 | } |
| 824 | DumpableValue::Boolean(b) => { |
| 825 | buf.write_u8(if b { Type::True } else { Type::False } as u8); |
| 826 | } |
| 827 | DumpableValue::Str(s) => { |
| 828 | buf.write_u8(Type::Unicode as u8); |
| 829 | write_vec(buf, s.as_bytes()); |
| 830 | } |
| 831 | DumpableValue::Bytes(b) => { |
| 832 | buf.write_u8(Type::Bytes as u8); |
| 833 | write_vec(buf, b); |
| 834 | } |
no test coverage detected