MCPcopy Index your code
hub / github.com/RustPython/RustPython / serialize_value

Function serialize_value

crates/compiler-core/src/marshal.rs:777–892  ·  view source on GitHub ↗
(
    buf: &mut W,
    constant: DumpableValue<'_, D>,
)

Source from the content-addressed store, hash-verified

775}
776
777pub 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 }

Callers 1

serialize_codeFunction · 0.85

Calls 15

newFunction · 0.85
write_vecFunction · 0.85
serialize_codeFunction · 0.85
write_lenFunction · 0.85
write_u8Method · 0.80
write_u32Method · 0.80
write_u16Method · 0.80
pushMethod · 0.45
is_emptyMethod · 0.45
lenMethod · 0.45
unwrapMethod · 0.45
lastMethod · 0.45

Tested by

no test coverage detected