in src/serialize/per_type/int.rs [29:76]
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
unsafe {
if crate::ffi::pylong_is_zero(self.ptr) {
return serializer.serialize_bytes(b"0");
}
let is_signed = !crate::ffi::pylong_is_unsigned(self.ptr) as i32;
if crate::ffi::pylong_fits_in_i32(self.ptr) {
if is_signed == 0 {
serializer.serialize_u64(crate::ffi::pylong_get_inline_value(self.ptr) as u64)
} else {
serializer.serialize_i64(crate::ffi::pylong_get_inline_value(self.ptr))
}
} else {
let mut buffer: [u8; 8] = [0; 8];
let ret = pyo3_ffi::_PyLong_AsByteArray(
self.ptr as *mut pyo3_ffi::PyLongObject,
buffer.as_mut_ptr() as *mut core::ffi::c_uchar,
8,
1,
is_signed,
);
if unlikely!(ret == -1) {
ffi!(PyErr_Clear());
err!(SerializeError::Integer64Bits)
}
if is_signed == 0 {
let val = core::mem::transmute::<[u8; 8], u64>(buffer);
if unlikely!(opt_enabled!(self.opts, STRICT_INTEGER))
&& val > STRICT_INT_MAX as u64
{
err!(SerializeError::Integer53Bits)
}
serializer.serialize_u64(val)
} else {
let val = core::mem::transmute::<[u8; 8], i64>(buffer);
if unlikely!(opt_enabled!(self.opts, STRICT_INTEGER))
&& !(STRICT_INT_MIN..=STRICT_INT_MAX).contains(&val)
{
err!(SerializeError::Integer53Bits)
}
serializer.serialize_i64(val)
}
}
}
}